ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCA1NzU2MDNmLi45NDU1MjkwIDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMiwyNSArMTIsNTggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiLAorICAgIGphdmFfbGliczogWyJ1cGRhdGFibGUtbWVkaWEiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgZmlyc3Q6IHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwcm9jZXNzIHJ1bnMgb25seSB3aXRoIHRoZSBwcmltYXJ5IEFCSS4KKyAgICAgICAgICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwbHVnaW5zCisgICAgICAgICAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmZsYWNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXBlZzJleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgYm90aDogeworICAgICAgICAgICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgLy8gTWVkaWFQbGF5ZXIyCisgICAgICAgICAgICAgICAgImxpYm1lZGlhMl9qbmkiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuY2VydGlmaWNhdGUiLAorfQorCiBhcGV4IHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKK30KKworYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiLAogICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWwotICAgICAgICAvLyBFeHRyYWN0b3IgcGx1Z2lucwotICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCi0gICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1pZGlleHRyYWN0b3IiLAotICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAotICAgICAgICAibGlibXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCi0gICAgICAgIC8vIE1lZGlhUGxheWVyMgotICAgICAgICAibGlibWVkaWEyX2puaSIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICBdLAotICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogIm1hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKIH0KIAogYXBleF9rZXkgewpAQCAtMzgsMyArNzEsMTkgQEAKICAgICBwdWJsaWNfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEuYXZicHVia2V5IiwKICAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnBlbSIsCiB9CisKK2FwZXhfa2V5IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5rZXkiLAorICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSIsCisgICAgcHJpdmF0ZV9rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuY2VydGlmaWNhdGUiLAorICAgIGNlcnRpZmljYXRlOiAiY29tLmFuZHJvaWQubWVkaWEiLAorfQorCithbmRyb2lkX2FwcF9jZXJ0aWZpY2F0ZSB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuY2VydGlmaWNhdGUiLAorICAgIGNlcnRpZmljYXRlOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCit9CmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjc0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpAQCAtMCwwICsxLDUxIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlKS2dJQkFBS0NBZ0VBdkI2bE9FRU9SNThLTWNGbGF5RVpqc1h1UGdjZkhpL09QeGN2ZnBpR0xDcE9jSzNsCitPUENoV1V2RFJjSUhNQjdCTytDc2Z4czBIZ3NIdnZaZk55b05JbTk5V2NqRmJib2lPN1dyQkJBcklzelByMTRYCitjZlkyTnh6VDlMQmorRXFBbmJkTCs0T1FXMS9ucExITkUwcXREY3hMNzFpcGJqU3VLTmI1OEU5cUdMMEt3dmtTCitmd3d1ZVdqKytiZy9pejdkcTBtejdpS3BueFlzY05tNFJoSmpxY0cyVXNtZzRFamhyOGg1VW1PVW1USmJPYkMvCit2ekNsWFFxZWV1elM4TlR0R1ZnUS9DSTlnQzJXTjl1cHEycC8yVDdQNFUzbzNDV3ZCeXRVb0xLUjBVeUM4M2V5CitTOFhKZ09hNDJ1V1IzVC9lSk9JMVpTNEg2U3JnMW8yWEM4WWI4RXByRkkvTk02LysvNURYL0ZnRGltc3NsQVA2CitRcTQrcFN0ZTl2L0ZqV0dxeTdRQlFhZWZGUkdSdVM2M3hIY1NaaFhDOUoyQ0ZkbnhvOCs2NVFUOHI0eWZRRWVpCitBeC8wUTk0eUI3VklMMXBJSnhIRW9uS2p0ZDNpS2RGRUtRekFESjNlZHNtdEh5YkVSZEpLQ3hjbTlRSXJEQ3NDCis0WVZUOW5YME9vQzlSRDVkNUVWRDdXNUk2ZUVuUnU2aWdyS0lLZ1VWcHBlWUZRTlpEK28rZWlOSmE0eW9nZ1JsCitoOHNUMC94TEtqTVJ4QVE3ZmFmaTFqK0xCMk83VWdKbUlEREFuaWRxOEFvejdoM3BOaTEzOXJOV3JqTmZ3aHVzCituTWNadkw5ZFRWdjI2SldlRVNIUC96QWZBWDdqMXJma0R3UjAyb2NSTHF1d0VVczErVUhBMjdXaTFiTUNBd0VBCitBUUtDQWdBTzNQVDgzdGI3L2FyV2g0czF6YVd4VEI0b3RITlc5VHY4YkI2S2lBNkJ5czNyeFRHSk1DbnZYamNOCitlZWtMZWtLV01vZ3VlcjNCYWVtd3d0Si9EMGwrWVFTc1pWcUQ4dUxsaU5MOFBUTExTeGRWcWI5OGQ1R05CVEFSCis4eVhTNWtBSE5nWkExd0krMWZMOVpqYm53VXl1L0djN2YrdlRFMEozWTVUWDBjNTJLZW1Cd2lBZC9aNW1aVTlQCis5Nmk5bmJmeDRwN2V2OHBiRVd0dGR5WkNFdzNneWJkWUR5b3d6bEZXakNaWnhoaGxpajcrN2VJWWZ3Vnh0bmNUCitDMGNYVkJ0dmx5K3dYQnd6MW1ZNS81Y0dQaUhmemtDcWNuZGxmV3k0eWttamNMaG9xdnpsczUxWXMwWGFjMkJECittMFBORVZEQjVVV0d1djVSQTl4RDEyZ0p2QnRVM0Q3Z2dNdzZDNVJjWEpUK2pTWW1TRnREMmtsV2krSXQ4QS9OCitIdjQyc29Lc2t0NkpxWUFXRTFjdkozUEVxSDlBU0VKTnEyUjBaL1BtdU0wMDBVSnl6VTlLSWQzU053alhBMVhjCitLbjloUmdhNHVmOWVsSFRqa1REdDc5LzgrWHY3aGplcjlzRi9TL25wN2cwNHJVaklXa3VGa0MvN05LMnRRU2gxCittbGpWMXNEOVNGNERQZlZLNzVMd0pKYVFVbEk3VHRHZDVLSjdGelp3dmIrdzhPRHJwVzNoa3Q2RmNJNkt3RS9hCitRVDFUMlo5RGtuWEpTWU5kV0dyajZ2TUhzWU1peXo4SWRBSFNDck9CNmVYQ1F4cGl0Ym42VzcxUmF3N2Y5VWFaCitWREs1QWhUVTQ5M2hrR2oxbm80Y0p3ZWNYSW5NaWdnL2M0eXdrMkliaDZJVjhPMG5rUUtDQVFFQTIrZFFRMElGCit2dlZnbVEyV3hIQkQ3TTJtYk95ZjQzWUJZNkthNm9QQk5HUFZwWkU4WDhMb1RhdlFMVitTZ0NrSDhUNmdZN1hTCis1TDRaZTBKRnhmdWEwbzFybTYrTDJYck94NUYvQTJZNDBZY1BjbEVpazVoMXdvU3dIL0oxaUhHaUVoWThOcWV1Cis5R0N2alFvamtnWHgvUm4zTnorbHB2WjMyOU8zSDg1UldXR0YwbDYwUndMT2tpZzBad1ViNjE5dDhhZmZtR0lsCitzeGREdjJuZnk3T3RKWDhpR0R1YTdLZjY0ZHZWV1FLS3RBQ1drQVJybGtjV1gzdW9FU3hrcFNEeHVlK3o3bmRICitvN3VITGZNOFR4K1JuK1F2WVd1Ulc1VFBMYkVETWJJWXJYNjVJU3Qyci9UN3YvMDRYZEFDOFlwQ1FSeXRscVBJCitmcERtMTVodHlIQml6UUtDQVFFQTJ2KzVvdFJvWTU2SmR1SVNhVkdsc0ovSWJ2S3pEQUl5V21NMTRFcFJDUjVFCitsdStNcFRjUkFpRlFBYkhHWHIxdE1sVEZkVkZEMDkwV0F6SUthS3RBREZWTFhvYklIZUdzcG5SQ3E1T3BWcDlXCitSdkx0VndMeGZsSEFjMnlOOS9MTnRuQnFIVWd0K1MwMUxCUEVseWJkR0hRUlR0cUFLWGhrcDMxc00yMU8zNEdvCitQcmkvSXhndXBXeHlrTWFXNDRLaWcxQ3I1REt2Yzhjd1VzR3V5RGRKbThvQlFlTlBUTVdxU25YdHFvVFdTYVlnCisya3hpTVRGb2tya1NYZ3VmYjh3bmc2T1h0L1FlbHl3cmhHM2hBc2xkUE8zR2RLaWREU3hoV1pTZ3BVWFhGZEFYCit5NEdPMEljUkpCRi9XSnRZVFl0UitsODRuUUEyLzFZZTR1akZsVDBhZndLQ0FRRUFtWHJYcFNtMmN2STJDbnpXCitocUpJZGtXT2E2VzNibjFWT09JcnQ1UmZ5NTRHWm5sNHB1bVZVMmlnY3BxcTJISkt6ZERGQnZMSGo4a3laYm42CitrdFVwMk56Rmh6SzlxL3V2eU5BKzB2T01vb2plZWc0dzBNenZHK1dhTzZIdzhGdEhIOUtQRWlKMDFMR0t0U2luCitiT3BqWENDOFQ3NUhjc0hCSkJlZlR6Nmp2bnQzZUQyTEc2alUzbVBiTnkvMHJaRzhYWmFxVTJQbEpoc051TkkvCitWYUJCTDlPTXkxY0dxVGdRdllTK1lsS0kxbHMydXF1ckg0YmNFYVp2eGhTeTVpR1pOUW9kRGtvSUlUbm9mbVN1Cis2aGFCZ0JRMkVZdVBOMWtrUktLd05RWTFmUm5lUWsxZ21DeW5iUGRpV08rdXJrQ3VQMTJ4dGxyM3U0YU01MXJHCisvTWViM1FLQ0FRRUExMlN4Wm05WGhMT0hMSUJKNzRBNFlMR201MGlaeFhQYnBuN3huSG83bmFaQmU5cDhFSHRLCitwVGV5Z3hnZ3JVbk9QclNWeVQ5MllNaVFQL0JWd0lDK2ErTHdVRFpzV01kL2tlL0RLeEgrZVk0Wnc0cG0yUyt4Cis2YlhxZlJ3RnZocjNMVHIvZzNGY2xqbGFsTkdVaDczWHM1ZGs5cE45Zmt4RlkxNitydzRSaDA3MDlVdXI0bzZFCitRbnVaYXIrSDVKaTEwa1hqNm52WGlSNGVieWJFQzNRbFY2Nms4ZkxxS2U0NEFTaGY2MWpma214czM0aEZBM0UvCitFeUFuNm91djhydHZHZEFyQnVoNXRlSGhvMHlYQkxDY25iS1hnR0hlcGZoQ2YyTHBaZVI5R1owajZpcXhGblBoCis3Z0d2cUt5UmV5Tk9LOXkveDl0UVBHNnR6aXQzT2NOeGJRS0NBUUVBdURoZURPU2tYUG9wWE12TEFLT0hCSWRaCityYlE3b0ZUREh0NTlnYnVjTTdVOC9sMll0YXh1S09RRkJMbnpRYS9hbUlra3J0a2xZd09zejhFMjRkN05tMzl3Cit5a0xId1gwWHJtakFtNk00WEttRHY2NmEra1NuU1Y2TEViS1pkanZYUDAyRFYrdEdlWjVWc25OdkpEcXV4TXNECitmdlJUc3BCOGo4Q3BVOTZzemVreGwvdENSaHFiZHcvNGtWVFNqNUJGKytPYVJSY0pyQXlqMUIycWYxeW5BWkUxCitnVXZWUGtFWWE5MTR6Y3J4ZzlYSVhUNE03eXFCN2k4S0plZ090T3RjV2pKN3VUaVArNjM4QXZ5Z0pMTUpuU3JWCisrSGpGWldHNlA5YnRabUxIU0VCUnZ3R09BaWxwMHFlalhvODY2bDBmbW5sR3k3ZWhLejh1M1B6dm5sUFlqUT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNDIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjliNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMueDUwOS5wZW0KQEAgLTAsMCArMSwzNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGM2pDQ0E4YWdBd0lCQWdJSkFJTTcySnBENHY2WE1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFaU1DQUdBMVVFCitBd3daWTI5dExtRnVaSEp2YVdRdWJXVmthV0V1YzNkamIyUmxZekFnRncweE9UQXlNVEV3TWpFeE1URmFHQTgwCitOelUzTURFd056QXlNVEV4TVZvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5CitibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCV2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3CitEZ1lEVlFRTERBZEJibVJ5YjJsa01TSXdJQVlEVlFRRERCbGpiMjB1WVc1a2NtOXBaQzV0WldScFlTNXpkMk52CitaR1ZqTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFzcVhFMEFJV3BMVzlUZ3EyCituUUdwaDdLWjZMMlE5b3h2aXFDVkh4SWFQcWZoTTJTd1RieWNBRElRZXFycmxSeGhkZFZrakx1TVVrSmE3bWV2CitmRVJtZ3BpT2ZuUElsR0s2UFRzMmdsakNrc2taaEYzYmdmZXl1SHQwdHNZTytVYU44TVZvWkQ3L1FkaUU0NncyCitPTURDbEcxVXFnaXFPQmhMVEVOL2NIWE9iblVpaVZYVVlxTjhhWVpmNkw2RnMzeVFpMlpaZ2ZieFRWRmV3cWR2CithTExPcUNZblZZWFpIK1p4YlhFU0EwTStXWEtnUktzWVRqMkdZczNla28xckZpNFk2dUhWTHg0NXlhb1Q1dS9pCitTeFBFa29jeU1DS3ZHSld1NFhsU09kM0VqU09NYXFDT1lWeUdMeGRsblFXUVU3UFpEcUJTSjBTeXNXZ3BGSHBCCitJMTVjMmpoUmRYT0NmUTladERmUFprRTBhMkE4a0pEQW9GMW16VHA2SXZCQVdVc2w1bkhQdzVDV2tGcE5hZC9oCit0cXFHQ1NjV2JpS1p1dnJRNC9SUU5tM2YxSytteFg5VHJqRmlncHFOTzZkNHBHQW8xZmE2c0hSM3hXUHcvbXlxCitoNVpKalZuWFU1WXE2NFM0eFdPc3NmanBPZzdSZk51dnp1azNvazNNWXMxbWJ4M3ZoWk9qNWttMWYzcXJnWDljCittWGpZbnlYRDBqSkJtNHVBSldYTGRLOVBsWnZsWGJ6dE1DellqODMySW80cEZMQ3RTeGt6WDc1dDFlbTM2TnYwCittTnA2TnRTU3k2U0ZTcThsN0lzWFYyRk55VWl5SFd4Uy9VUW04cFlnNVE1ZFdIdkVFRjc4UDZsVjB3UmE2RlFsCitCQlNncHFUQUkwOTJLSWpERHRCN0dRQ2dWNUVDQXdFQUFhTlRNRkV3SFFZRFZSME9CQllFRkFGSWRGVERFRGZ0Citld1NTQVM3RmEzT1o1VFh6TUI4R0ExVWRJd1FZTUJhQUZBRklkRlRERURmdGV3U1NBUzdGYTNPWjVUWHpNQThHCitBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFDNWUzelh5dGhKQ0dtejFGbUFWCis4WS9VSStHbGc2RzB4L2swNFdhUkcwRFBMTGpsSjFGMExNMS9JUmVCU2dYY1lBTDBDQWdQeWNmL3JHUE9nTUZtCit0UXhZeWpCVXhLZGpwSXFVNURKb1YxZmVhbkd2ZUlScHRvMVlSS05nSHV6RzlyWkdSNEFnUG50Nlg0WXhscTA0CitsSTdRcFdhZFhlMW15QVJKaGozbmlTTlk5KzJ3RUlua3g0WnVDTzFMdElHcW5iZGM4alE4WW9WcUlFNU40a3VNCitjY3lQWWdzZEFCdG9wYmpOOTJydWV1OHNmRjhSNlJPeSt0TmdiNk9qcEFBZXZ0bkJmWjJMWHFmT2JLaXJIQ0srCitrNnc0V1NCMVVVb1ozWGd6OHNKdFhnb2t2WWVJbmtOOHRIdVRhZ0hZVTJWUVRjQTByZEJHTU4vMU9sakpwV2xOCiswVVVxNGZBWVU2Y040bEh4cjJMTTlJZjRXdkF6ZExBV3ZhSVpyRHFhVTRpL3pZVDlsNnJSNGxDMktXM0VIV292CituUFhmZ0VKSjhBUDFpUkdpYnZldzNpM1NCNlhUV0ZRWVRVSUJlSmZEei9LRFhRYWJQK3l6WFdJU2RaQ1VNVXB4CitmK1JhcXNiNU1vS2FKZFZnblNMMG1CdW5qQ3lKRHp6ZzM0SjdvR3g2L0Jud29pT3J3TE40UWF6NVU4amJyUFN4CitwOUxmbGVDY083WmRlRThHS3F4MFgxVDRkN3RyYWR0bXhPUzhJd3I0bmlza2tIR1Jrem96dlZ2dXlHS21vTjJrCisxNjJWZmpxK2RkajdxRXBTaDNCUzZoSFUrdmxNYkM5TDB0ckd4UHhGRUFIRHJ3dTBLd0dOZHVUa2l1LzNqdmZCCitKVGdIOFA5bUQxbG9ZeFJkbyt2ZXQ4ZVEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEueDUwOS5wZW0gYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCkBAIC0wLDAgKzEsMzMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRnpEQ0NBN1NnQXdJQkFnSUpBTzA1REJCdXNhYUxNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ib3hDekFKQmdOVgorQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCVworYVdWM01SQXdEZ1lEVlFRS0RBZEJibVJ5YjJsa01SQXdEZ1lEVlFRTERBZEJibVJ5YjJsa01Sb3dHQVlEVlFRRAorREJGamIyMHVZVzVrY205cFpDNXRaV1JwWVRBZ0Z3MHhPVEF4TWpVeE56RTNNVGRhR0E4ME56VTJNVEl5TVRFMworTVRjeE4xb3dlakVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGakFVQmdOVgorQkFjTURVMXZkVzUwWVdsdUlGWnBaWGN4RURBT0JnTlZCQW9NQjBGdVpISnZhV1F4RURBT0JnTlZCQXNNQjBGdQorWkhKdmFXUXhHakFZQmdOVkJBTU1FV052YlM1aGJtUnliMmxrTG0xbFpHbGhNSUlDSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBbU5rVnhVYnAvYkxiZUdidktxWVh6d0J5Y1NEcG1PaGgvLy9sTkdZUQorL0FNVUQwcTZFYVp6VTJiZDRhTDByT0dxZm9ZbGhLZDBrTVZtTVVtZmRFOU9EQWZLeGxlRWVFYVJsMkdKUzhhOQorQUJpNzcwbDNHSGJCMnhNSTJzRVdlT0Q5eHNQRkY2K0J5UFptb1V1TmhNcjRwVWJYc0RwRTNoOGxqcmdYSHRJZworYmg3b2ZidmRkcnV3QlYwbFMxazlPWjlqUFZHaEVLa0puaGdRYTY3Y3dnZGppekFNYkkwRGN6OWd0TU1hd3NEagorWjJhUWQxcit2eGdoMS9Ya0kvTk1tWENuRzJFUnl0WGNKZUM1UzRnRXRIZlRUUG9QMEZ1VmdTQjZ5NmRhbE11WgorRjBOQlp3OE12Z2R5M1FKaXAwdU5hMzZKNjNDTVpLVEpXYlRkbEZwUEwyaGswUGdhWXZqZThDNVh0azUyODJ3VAorZE1vY2M4bjJ6SVhiemJuU1hHdmpjTlppYjNQZnU1NVlVblg2ZVRxWjFCeGxKMEZIWkFzQzRxdUZGV1h4WUJZRAorTENSb05ORkV0SURRcHV2dUhGMkR1SE5EVUxwQVFqeTJ5Nis3ZW90MEtFc1ZvRG1aNEg4QnB1QVZWdTJTeFlOYgorZ1lmbFI5U21NMHRtWWVBY1JUNDhxM3hyb2NHeUVITXF2Z1FSVXBQZnZjdC84bDh4VmNEek9JL3NKVkRxbVl6TQordTBDajNma1N5cEdESk9NRi9lc0ZTbVZ2b0kwMXRTN2thTlM1dnZ0S1lpYi8veHFLUkM5ZjBkQ3NHZkZMbnVVSworbzRLWWJZV1l3TXlKcUVkLzUvWnZYeUtJUEFFZUpMMTc0TDkrd1RrYzNjUXBvQndKTjR0KzJFNU1uaE9FcTZkbworNUwwQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIak5LL0daa28xUmRacCs4aWF2V1hMNXh6OXdNQjhHQTFVZAorSXdRWU1CYUFGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVMQlFBRGdnSUJBQ21QUU1rc3VMck5WMXZiSTQ0UzFmNzBJMEZIZEJ4Y2hGR0IzOXp1TGJjbgorU3NZb20vTFB0WUppRDBEbDRiQjRlYitabnhrUVAyWGVQNnB5Y21VSDJqMUVXZXhGd3ZkVXZsZmU4UXord0FlYworYXA0QXhpWDRaMktlMml2WW90SVpGVUhkWk9Ma1gyMGpzOFdleDFtelk0M01MUW41QVBsOWdLMVZaVHhEZ2dlUgorRU9iSDFTK0pWakd3UXFZWmoyZTZnTlpIMzRRMjVOUTY5OFJMODVHRGtZdFNJU0FpZkp0YUpzVS9CM3ZLbTgySQorazl4TWlDb29DSDZiUmRHSEcxanplNFNScGlkanhFbThjeGtpYVFhZ2ZjdVhlQ0x6aVhKcjNxQU1LWWlFWTZicAorMCtiQXFDdDNTOE9yck4zUlFaZlFybmx3aXRzTTFqSkovK0MrV29EZzRlWTVBRnJYREx2TmVLaDFxTy9mOHh2KworZkNYa1FQY1ZWcGhMZlJIOW94TnJTZ09XQlA1L3FJREg0czFZVUw5bHVHVDZIKzA4ZGx1ZTNSa2J6RGJCcXNRdQorN2ZRL0JicklHL0d1VktneUVNK2E3Qzlndjd6Yzg2WWx1ZVZZSkV5eEtpZG5uN1J4T3F5REJxeXlmWEEzenZtZQorUnJvN3hJck1IUEw3TnUzQVdqd2pYemJwL3cweit0RUZQc2ZWQitPT0hLc1dQY1VHMEhVVEpHa3llTy91SFJqTgorcVBFa2tmN0JISFVPNFYyZ2pPSWRDc0VMeEt3SGY3dnNaVE9rNDBFVjc1MWZaN0ZESE1yMWVkZFFrZ0g0ZXFBYgorREI3OXVQK1NMZlVvKzQybjRxNmVNbW9xdzhkNzZiQlhSb1VoSW8vTXM0c2ViaFYwc1J0QVM2N09RaW9jOVVVZworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmNlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDEKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwIGIvYXBleC90ZXN0aW5nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxY2VkNwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBtYW5pZmVzdDogInRlc3RfbWFuaWZlc3QuanNvbiIsCisgICAgZmlsZV9jb250ZXh0czogImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworYXBleCB7CisgICAgbmFtZTogInRlc3RfY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIl0sCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQpkaWZmIC0tZ2l0IGEvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3QuanNvbiBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgInZlcnNpb24iOiAyCit9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU2NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMgorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCAyNGIzOTE4Li4yMTU4OGQ0IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtNDMsNiArNDMsNyBAQAogICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIiwKICAgICAgICAgImNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAiLAorICAgICAgICAiY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAiLAogICAgICAgICAiY2FtZXJhMi9TdWJtaXRJbmZvLmNwcCIsCiAgICAgICAgICJDYW1lcmFCYXNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFVdGlscy5jcHAiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZTE0M2UwNS4uOTJmZTg0YiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MDksNiArNDA4LDc5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdGFnc1JlbW92ZWQpIHsKKyAgICB1aW50MzJfdCB0YWdDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3NUb1JlbW92ZTsKKworICAgIGlmICh0YWdzUmVtb3ZlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdlRhZ3MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgaWYgKChudWxscHRyID09IHZUYWdzLmdldCgpKSB8fCAoMCA+PSB2VGFncy0+Z2V0VGFnQ291bnQoKSkpIHsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBjYWNoZSA9CisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZS5nZXQoKSkgeworICAgICAgICAgICAgY2FjaGUtPmdldFZlbmRvclRhZ0Rlc2NyaXB0b3IodmVuZG9ySWQsICZ2VGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG51bGxwdHIgIT0gdlRhZ3MuZ2V0KCkpICYmICh2VGFncy0+Z2V0VGFnQ291bnQoKSA+IDApKSB7CisgICAgICAgIHRhZ0NvdW50ID0gdlRhZ3MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHVpbnQzMl90ICp2ZW5kb3JUYWdzID0gbmV3IHVpbnQzMl90W3RhZ0NvdW50XTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gdmVuZG9yVGFncykgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICB2VGFncy0+Z2V0VGFnQXJyYXkodmVuZG9yVGFncyk7CisKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnQ291bnQpOworICAgICAgICB0YWdzVG9SZW1vdmUuaW5zZXJ0KHRhZ3NUb1JlbW92ZS5iZWdpbigpLCB2ZW5kb3JUYWdzLCB2ZW5kb3JUYWdzICsgdGFnQ291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSB2ZW5kb3JUYWdzOworICAgICAgICB0YWdDb3VudCA9IDA7CisgICAgfQorCisgICAgYXV0byB0YWdzTmVlZGluZ1Blcm1pc3Npb24gPSBnZXRfY2FtZXJhX21ldGFkYXRhX3Blcm1pc3Npb25fbmVlZGVkKCZ0YWdDb3VudCk7CisgICAgaWYgKHRhZ0NvdW50ID4gMCkgeworICAgICAgICB0YWdzVG9SZW1vdmUucmVzZXJ2ZSh0YWdzVG9SZW1vdmUuY2FwYWNpdHkoKSArIHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuZW5kKCksIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICB0YWdzTmVlZGluZ1Blcm1pc3Npb24gKyB0YWdDb3VudCk7CisgICAgfQorCisgICAgdGFnc1JlbW92ZWQtPnJlc2VydmUodGFnc1RvUmVtb3ZlLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICBpZiAoZXhpc3RzKGl0KSkgeworICAgICAgICAgICAgYXV0byByYyA9IGVyYXNlKGl0KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGVyYXNlIHRhZzogJXgiLCBfX2Z1bmNfXywgaXQpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5wdXNoX2JhY2soaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBhdmFpbGFibGUgY2hhcmFjdGVyc3RpY3MgYWNjb3JkaW5nbHkKKyAgICBpZiAoZXhpc3RzKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjdXJyZW50S2V5czsKKworICAgICAgICBzdGQ6OnNvcnQodGFnc1JlbW92ZWQtPmJlZ2luKCksIHRhZ3NSZW1vdmVkLT5lbmQoKSk7CisgICAgICAgIGF1dG8ga2V5cyA9IGZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIGN1cnJlbnRLZXlzLnJlc2VydmUoa2V5cy5jb3VudCk7CisgICAgICAgIGN1cnJlbnRLZXlzLmluc2VydChjdXJyZW50S2V5cy5lbmQoKSwga2V5cy5kYXRhLmkzMiwga2V5cy5kYXRhLmkzMiArIGtleXMuY291bnQpOworICAgICAgICBzdGQ6OnNvcnQoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld0tleXMoa2V5cy5jb3VudCk7CisgICAgICAgIGF1dG8gZW5kID0gc3RkOjpzZXRfZGlmZmVyZW5jZShjdXJyZW50S2V5cy5iZWdpbigpLCBjdXJyZW50S2V5cy5lbmQoKSwgdGFnc1JlbW92ZWQtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgdGFnc1JlbW92ZWQtPmVuZCgpLCBuZXdLZXlzLmJlZ2luKCkpOworICAgICAgICBuZXdLZXlzLnJlc2l6ZShlbmQgLSBuZXdLZXlzLmJlZ2luKCkpOworCisgICAgICAgIHVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBuZXdLZXlzLmRhdGEoKSwgbmV3S2V5cy5zaXplKCkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogdm9pZCBDYW1lcmFNZXRhZGF0YTo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKG1CdWZmZXIsIGZkLCB2ZXJib3NpdHksIGluZGVudGF0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCBhODZjYzg3Li5kNzEzZDJkIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC0zMTUsNiArMzE1LDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFNlY3Rpb25JbmRleCh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworfQorCiB2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKIAogICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CkBAIC00MDcsNiArNDExLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpIHsKKyAgICByZXR1cm4gbVZlbmRvck1hcDsKK30KKwogaW50IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VGFnQ291bnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgaWQpIGNvbnN0IHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBhdXRvIGRlc2MgPSBtVmVuZG9yTWFwLmZpbmQoaWQpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCmluZGV4IDljMGYyOGIuLjBlOTY5YzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApAQCAtMTYwLDYgKzE2MiwyOCBAQAogICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7Ci0gICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOworICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBzZXQgb2YgbmV3IGZvcmVncm91bmQgdXNlciBJRHMuCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgorICAgICAqCisgICAgICogbmV3U3RhdGUgaXMgYSBiaXRmaWVsZCBjb25zaXN0aW5nIG9mIERFVklDRV9TVEFURV8qIHZhbHVlcyBjb21iaW5lZCB0b2dldGhlci4gVmFsaWQgc3RhdGUKKyAgICAgKiBjb21iaW5hdGlvbnMgYXJlIGRldmljZS1zcGVjaWZpYy4gQXQgZGV2aWNlIHN0YXJ0dXAsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGV2aWNlCisgICAgICogc3RhdGUgaXMgTk9STUFMIHVudGlsIG90aGVyd2lzZSBub3RpZmllZC4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShsb25nIG5ld1N0YXRlKTsKKworICAgIC8vIEJpdGZpZWxkIGNvbnN0YW50cyBmb3Igbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UKKyAgICAvLyBBbGwgYml0cyA+PSAzMiBhcmUgZm9yIGN1c3RvbSB2ZW5kb3Igc3RhdGVzCisgICAgLy8gV3JpdHRlbiBhcyBpbnRzIHNpbmNlIEFJREwgZG9lcyBub3Qgc3VwcG9ydCBsb25nIGNvbnN0YW50cy4KKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX05PUk1BTCA9IDA7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQgPSAxOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCA9IDI7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9GT0xERUQgPSA0OworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfTEFTVF9GUkFNRVdPUktfQklUID0gMHg4MDAwMDAwMDsgLy8gMSA8PCAzMTsKKwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCA0Y2VkMDhjLi40OWRmZGU4IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFNZXRhZGF0YU5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TZXNzaW9uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIudXRpbHMuU3VibWl0SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIApAQCAtODMsNiArODQsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKKyAgICAvKioKKyAgICAgICogQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhcyBjYW1lcmEgZGV2aWNlCisgICAgICAqIHN1cHBvcnQuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzZXNzaW9uQ29uZmlndXJhdGlvbiBTcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gdG8gYmUgdmVyaWZpZWQuCisgICAgICAqIEByZXR1cm4gdHJ1ZSAgLSBpbiBjYXNlIHRoZSBzdHJlYW0gY29tYmluYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAgKiAgICAgICAgIGZhbHNlIC0gaW4gY2FzZSB0aGVyZSBpcyBubyBkZXZpY2Ugc3VwcG9ydC4KKyAgICAgICovCisgICAgYm9vbGVhbiBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGluIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXM7CisKKy8qKiBAaGlkZSAqLworcGFyY2VsYWJsZSBTZXNzaW9uQ29uZmlndXJhdGlvbiBjcHBfaGVhZGVyICJjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggZmViMDRjMi4uNGU5YjI3ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTE2NywxNCArMTY3LDI0IEBACiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwgaW50IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxJZCwKICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCwgYm9vbCBpc1NoYXJlZCkgewogICAgIG1HYnBzLnB1c2hfYmFjayhnYnApOwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzdXJmYWNlU2V0SUQ7CiAgICAgbUlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZDsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsSWQ7CiB9CiAKK091dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgZ2JwcywKKyAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKKyAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAorICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsgfQorCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXNzaW9uQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludCBvcGVyYXRpbmdNb2RlID0gMDsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm9wZXJhdGluZ01vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG9wZXJhdGluZyBtb2RlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRXaWR0aCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRXaWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgd2lkdGggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEhlaWdodCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRIZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGhlaWdodCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0Rm9ybWF0ID0gLTE7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRGb3JtYXQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGZvcm1hdCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0U3RyZWFtczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm91dHB1dFN0cmVhbXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG91dHB1dCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbU9wZXJhdGluZ01vZGUgPSBvcGVyYXRpbmdNb2RlOworICAgIG1JbnB1dFdpZHRoID0gaW5wdXRXaWR0aDsKKyAgICBtSW5wdXRIZWlnaHQgPSBpbnB1dEhlaWdodDsKKyAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IG91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1PcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dFdpZHRoKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEhlaWdodCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRGb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtT3V0cHV0U3RyZWFtcyk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0VxdWFsKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5zaXplKCkgPCBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zW2ldIDwgb3RoZXJPdXRwdXRTdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjA2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjk1YzRmMzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY1LDggKzY1LDE1IEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCk7CiAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLmQ5NmY0MDMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyNSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5tayBiL2NhbWVyYS9uZGsvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZGRmMS4uMDAwMDAwMAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNYW5hZ2VyLmNwcCAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYU1ldGFkYXRhLmNwcCAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhRGV2aWNlLmNwcCAgICAgICAgICAgIFwKLSAgICBOZGtDYXB0dXJlUmVxdWVzdC5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYURldmljZS5jcHAgICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYTJuZGsKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLUQgRVhQT1JUPSdfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpJwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoTE9DQUxfUEFUSCkvbGliY2FtZXJhMm5kay5tYXAudHh0Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJndWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJtZWRpYW5kawotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGZkOTUyOTYuLmFiNzk2ZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEVYUE9SVApAQCAtNzgsMTEgKzgwLDM3IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKworICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAorICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CiAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTEwNyw2ICsxMzUsMjggQEAKIH0KIAogRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjk4NjA4ZGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC05Niw3ICsxMDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzExNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjEsOCArMTI5LDIyIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgcGh5c2ljYWxJZCAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgcGh5c2ljYWxJZCwgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UsIHBoeXNpY2FsSWQpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEzNCw3ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBhZGQgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpAQCAtMTQ3LDcgKzE2OSw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoKHdpbmRvdyA9PSBudWxscHRyKSB8fCAob3V0ID09IG51bGxwdHIpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTU5LDcgKzE4MSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChvdXQtPm1XaW5kb3cgPT0gd2luZG93KSB7CisgICAgaWYgKGFyZVdpbmRvd1R5cGVzRXF1YWwob3V0LT5tV2luZG93LCB3aW5kb3cpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0aGUgc2FtZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA2MGI0NzYzLi44NzQyZDljIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyLDkgKzIyLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+Ci0jaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZWxzZQorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphY2FtOwogCiBFWFBPUlQKIEFDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKSB7CkBAIC0xMDcsNyArMTEzLDE0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZ3IsIGNhbWVyYUlkLCBjaGFycyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gbWdyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsIGNoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHNwQ2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmc3BDaGFycyk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNwQ2hhcnMtPmluY1N0cm9uZygodm9pZCopIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisgICAgKmNoYXJzID0gc3BDaGFycy5nZXQoKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KIAogRVhQT1JUCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDY1ZGU4MWYuLjlhMzllZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC01NywxMyArNTcsMzIgQEAKICAgICAgICAgQUxPR0UoIiVzOiBzcmMgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgQUNhbWVyYU1ldGFkYXRhKiBjb3B5ID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqc3JjKTsKKyAgICBjb3B5LT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfY29weSk7CisgICAgcmV0dXJuIGNvcHk7CiB9CiAKIEVYUE9SVAogdm9pZCBBQ2FtZXJhTWV0YWRhdGFfZnJlZShBQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBkZWxldGUgbWV0YWRhdGE7CisgICAgICAgIG1ldGFkYXRhLT5kZWNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfZnJlZSk7CiAgICAgfQogfQorCitFWFBPUlQKK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG51bVBoeXNpY2FsQ2FtZXJhcyA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBudW1QaHlzaWNhbENhbWVyYXMgJXAsIHBoeXNpY2FsQ2FtZXJhSWRzICVwIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1QaHlzaWNhbENhbWVyYXMsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RhdGljTWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IHN0YXRpY01ldGFkYXRhIGlzIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YS0+aXNMb2dpY2FsTXVsdGlDYW1lcmEobnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IGFjMTg1NmIuLmM2NGRlM2UgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGlucHV0IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxdWVzdC0+c2V0dGluZ3M7CisgICAgcmVxdWVzdC0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxdWVzdC0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGY2MGU1ZmQuLmQ2ZjE0MTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6fkFDYW1lcmFDYXB0dXJlU2Vzc2lvbigpIHsKICAgICBBTE9HVigifkFDYW1lcmFDYXB0dXJlU2Vzc2lvbjogJXAgbm90aWZ5IGRldmljZSBlbmQgb2YgbGlmZSIsIHRoaXMpOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiAhPSBudWxscHRyICYmICFkZXYtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgICAgICB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIG1DbG9zZWRCeUFwcCA9IHRydWU7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgIH0KQEAgLTczLDcgKzczLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnN0b3BSZXBlYXRpbmcoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTkxLDcgKzkxLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmFib3J0Q2FwdHVyZXMoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTEwNyw0OSArMTA3LDggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1jYW1lcmFfc3RhdHVzX3QKLUFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldDsKLSAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICAgICAgcmV0ID0gZGV2LT5jYXB0dXJlTG9ja2VkKHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CkBAIC0xNjgsNyArMTI3LDcgQEAKIEFDYW1lcmFEZXZpY2UqCiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTgyLDkgKzE0MSw5IEBACiAgICAgbUlzQ2xvc2VkID0gdHJ1ZTsKIH0KIAotc3A8Q2FtZXJhRGV2aWNlPgorc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2VTcCgpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IGRldmljZS0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HVygiRGV2aWNlIGlzIGNsb3NlZCBidXQgc2Vzc2lvbiAlZCBpcyBub3Qgbm90aWZpZWQiLCBtSWQpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBhMjA2OGU3Li4wOGE5MjI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0xNywxNSArMTcsMjIgQEAKICNkZWZpbmUgX0FDQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKIAogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCIKKyNlbHNlCiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7Ci0gICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKSA6Ci0gICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCkge307CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDExICs0NywxMyBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjksNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtODIsMTMgKzkxLDE1IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgYWJvcnRDYXB0dXJlcygpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlKAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIApAQCAtOTcsMTggKzEwOCwxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJmOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMiCisjZWxzZQorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaW5jIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT5zZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgICAgICB0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICB9CisgICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGZmYWJmN2IuLmQ4YTU3NjUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKICNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCiAvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7CkBAIC0zOSw2ICs0MCw3IEBACiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOwpAQCAtNTAsMTEgKzUyLDExIEBACiBDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKICAgICAgICAgY29uc3QgY2hhciogaWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgogICAgICAgICBtQ2FtZXJhSWQoaWQpLAogICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCi0gICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbUNoYXJzKGNoYXJzKSwKICAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKQEAgLTE5MCwxMDYgKzE5Miw2IEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgewotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKLSAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7Ci0gICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKLSAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgewotICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOwotICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOwotICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKLSAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOwotICAgIH0KLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOwotICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOwotCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKLSAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgewotICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKLSAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgaWYgKG1JZGxlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwotICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7Ci0gICAgfQotICAgIG1JZGxlID0gZmFsc2U7Ci0gICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLSAgICByZXR1cm4gQUNBTUVSQV9PSzsKLX0KLQogY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKQEAgLTMyNSw4ICsyMjcsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTQzNiw3ICszMzksNyBAQAogICAgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXEtPnNldHRpbmdzOworICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxLT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXE7CiB9CkBAIC02NDAsOCArNTQzLDkgQEAKICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CisgICAgICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sCisgICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sIHBoeXNpY2FsSWQxNiwKICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELCBvdXRDb25maWcubUlzU2hhcmVkKSkpOwogICAgIH0KICAgICBhdXRvIGFkZFNldCA9IG91dHB1dFNldDsKQEAgLTgyOSw3ICs3MzMsNyBAQAogICAgIGlmIChlcnJvckNvZGUgPT0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIpIHsKICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICAgICAgICAgIGNiaC5tT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgYXV0byBvdXRwdXRQYWlySXQgPSBtQ29uZmlndXJlZE91dHB1dHMuZmluZChzdHJlYW1JZCk7CiAgICAgICAgIGlmIChvdXRwdXRQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBzdHJlYW0gaWQgJWQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKQEAgLTg0Niw3ICs3NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg1OCw3ICs3NjIsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKICAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOwogICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CiAgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCkBAIC04NjgsNyArNzcyLDcgQEAKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCk7CiAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg5MCw2ICs3OTQsNyBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CkBAIC05NjAsNiArODY1LDcgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgpAQCAtOTc3LDYgKzg4Myw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKQEAgLTEwNDgsNiArOTU1LDY0IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKQEAgLTExNTgsMTIgKzExMjMsMzQgQEAKIH0KIAogQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCi0gICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAotICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCi0gICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwgbUNhbGxiYWNrcyhmaWxsQ2IoY2JzKSkge30KKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CiAKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKApAQCAtMTE4MCw5ICsxMTY3LDkgQEAKICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgIC8vIHNlbmQgc2VxIGFib3J0ZWQgY2FsbGJhY2sKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFBYm9ydCwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOwogICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMzAsOSArMTIxNyw5IEBACiAgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKICAgICAgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKIApAQCAtMTM4OSw3ICsxMzc2LDcgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTEzOTgsNyArMTM4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwpAQCAtMTQxMyw3ICsxNDAwLDYgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7Ci0gICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTQ0OSw5ICsxNDM1LDYgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPwotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNDYxLDEzICsxNDQ0LDI3IEBACiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhwaHlzaWNhbFJlc3VsdEluZm9zLCBmcmFtZU51bWJlcikpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlUmVzdWx0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KIApAQCAtMTUxMyw1ICsxNTEwLDUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0KK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDEzNjkxNDguLmQwZjM2M2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDEsMTQgKzQyLDI1IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTEwOCwxOSArMTIwLDIyIEBACiAgICAgY2FtZXJhX3N0YXR1c190IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKIAogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKICAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOwpAQCAtMTU2LDcgKzE3MSw3IEBACiAgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKICAgICBjb25zdCBTdHJpbmc4IG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAogICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCiAgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOwogICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOwogCkBAIC0xOTEsNiArMjA2LDcgQEAKICAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKICAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZApAQCAtMjA2LDYgKzIyMiw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKQEAgLTI0NCwxOSArMjYxLDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOwogCi0gICAgICAgIHN0YXRpYyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBmaWxsQ2IoCi0gICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmNiczsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geyBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyIH07CiAgICAgICAgIH0KLQogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CiAgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiBtUmVxdWVzdHM7CiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYWxsYmFja3M7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgfTsKICAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCiAgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CkBAIC0yODYsNiArMzMwLDcgQEAKIAogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMjk0LDggKzMzOSw4IEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKICAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6Ci0gICAgICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIGNoYXJzLCB0aGlzKSkge30KIAogICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CiAKQEAgLTMzMSw3ICszNzYsNyBAQAogICAgIH0KIAogICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYURldmljZT4gbURldmljZTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM1MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKKyAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOworICAgIH0KKworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOworICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKKyAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgfQorCisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gZmFsc2U7CisgICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYzU5ZDBlNy4uN2Q2ZWNhYyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNiw5ICsyNiwxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYW1lcmFJZEtleSAgID0gIkNhbWVyYUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYWxsYmFja0ZwS2V5ID0gIkNhbGxiYWNrRnAiOwpAQCAtMzQ1LDYgKzM0Niw3IEBACiAgICAgfQogfQogCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8qKgpAQCAtNDAyLDcgKzQwNCw3IEBACiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFN0ciwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwpAQCAtNDM3LDE4ICs0MzksMTYgQEAKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgewotICAgIEFDYW1lcmFNZXRhZGF0YSogcmF3Q2hhcnM7Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZjaGFycyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSAlcy4gZXJyICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCByZXQpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMocmF3Q2hhcnMpOwotICAgIHJhd0NoYXJzID0gbnVsbHB0cjsKIAotICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKGNoYXJzKSk7CisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBjaGFycyk7CiAKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgaWYgKGNzID09IG51bGxwdHIpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggY2M0MmY3Ny4uNTViZmE3ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLyoqCiAgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCkBAIC0xNzIsNiArMTczLDcgQEAKICAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOwogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMTgwLDEzICsxODIsMTMgQEAKICAqLwogc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKICAgICBBQ2FtZXJhTWFuYWdlcigpIDoKLSAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQogICAgIH5BQ2FtZXJhTWFuYWdlcigpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOwogCiAgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBBQ2FtZXJhTWV0YWRhdGEgKipjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CiAgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOwpAQCAtMTk2LDcgKzE5OCw3IEBACiAgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKICAgICB9OwogICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CiB9OwogCiAjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZmMwMGEyZC4uZGU0MDk5MCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTMyLDYgKzMyLDEyIEBACiAgICAgaWYgKG1UeXBlID09IEFDTV9DSEFSQUNURVJJU1RJQ1MpIHsKICAgICAgICAgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOwogICAgICAgICBmaWx0ZXJTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TKTsKICAgICB9CiAgICAgLy8gVE9ETzogZmlsdGVyIHJlcXVlc3QvcmVzdWx0IGtleXMKIH0KQEAgLTQ2LDYgKzUyLDcgQEAKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19SRUFEX1NFTlNPUl9TRVRUSU5HUzoKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CVVJTVF9DQVBUVVJFOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RFUFRIX09VVFBVVDoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQToKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1lVVl9SRVBST0NFU1NJTkc6CiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUFJJVkFURV9SRVBST0NFU1NJTkc6CkBAIC03NSwxMSArODIsMTE4IEBACiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CiAgICAgICAgIGlmIChpc05ka1N1cHBvcnRlZENhcGFiaWxpdHkoY2FwYWJpbGl0eSkpIHsKICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpOworCisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIGRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbURhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpOwogfQogCit2b2lkCitBQ2FtZXJhTWV0YWRhdGE6OmRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICBhdXRvIHJldCA9IGdldENvbnN0RW50cnkoQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMsICZlbnRyeSk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogR2V0IEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTIGtleSBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnkuZGF0YS51ODsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXMucHVzaF9iYWNrKFN0cmluZzgoKGNvbnN0IGNoYXIgKilpZHMrc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkVmFsdWVzLmJhY2soKS5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGkrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpIDwgMikgeworICAgICAgICBBTE9HVygiJXM6IExvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZSBvbmx5IGhhcyAlenUgcGh5c2ljYWwgY2FtZXJhcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK0FDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZykgeworICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUID0gMzsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtRGF0YS5maW5kKHRhZyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDAgfHwgZW50cnkuY291bnQgJSA0IHx8IGVudHJ5LnR5cGUgIT0gVFlQRV9JTlQ2NCkgeworICAgICAgICBBTE9HRSgiJXM6IG1hbGZvcm1lZCBkdXJhdGlvbiBrZXkgJWQhIGNvdW50ICV6dSwgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0YWcsIGVudHJ5LmNvdW50LCBlbnRyeS50eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWZWN0b3I8aW50NjRfdD4gZmlsdGVyZWREdXJhdGlvbnM7CisgICAgZmlsdGVyZWREdXJhdGlvbnMuc2V0Q2FwYWNpdHkoZW50cnkuY291bnQgKiAyKTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50NjRfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IHdpZHRoID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0RVUkFUSU9OX09GRlNFVF07CisKKyAgICAgICAgLy8gTGVhdmUgdGhlIHVuZmlsdGVyZWQgZm9ybWF0IGluIHNvIGFwcHMgZGVwZW5kaW5nIG9uIHByZXZpb3VzIHdyb25nCisgICAgICAgIC8vIGZpbHRlciBiZWhhdmlvciBjb250aW51ZSB0byB3b3JrCisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKworICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0pQRUc7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0hFSUM7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rb3duIHRhZyAweCV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGEudXBkYXRlKHRhZywgZmlsdGVyZWREdXJhdGlvbnMpOworfQogCiB2b2lkCiBBQ2FtZXJhTWV0YWRhdGE6OmZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCkgewpAQCAtMTQ1LDYgKzI1OSwzMSBAQAogICAgICAgICBmaWx0ZXJlZERlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaXNJbnB1dCk7CiAgICAgfQogICAgIG1EYXRhLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsIGZpbHRlcmVkRGVwdGhTdHJlYW1Db25maWdzKTsKKworICAgIGVudHJ5ID0gbURhdGEuZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlnczsKKyAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgLy8gSGlkZSBpbnB1dCBzdHJlYW1zCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKKyAgICB9CisgICAgbURhdGEudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMsIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MpOwogfQogCiBib29sCkBAIC0yMzksNiArMzc4LDI3IEBACiAgICAgcmV0dXJuIG1EYXRhOwogfQogCitib29sCitBQ2FtZXJhTWV0YWRhdGE6OmlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3QgeworICAgIGlmIChtVHlwZSAhPSBBQ01fQ0hBUkFDVEVSSVNUSUNTKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGJlIGNhbGxlZCBmb3IgYSBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dCBjb3VudDogJXAsIHBoeXNpY2FsQ2FtZXJhSWRzOiAlcCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjb3VudCwgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPj0gMikgeworICAgICAgICAqY291bnQgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpOworICAgICAgICAqcGh5c2ljYWxDYW1lcmFJZHMgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuZGF0YSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIFRPRE86IHNvbWUgb2Yga2V5IGJlbG93IHNob3VsZCBiZSBoaWRkZW4gZnJvbSB1c2VyCiAvLyBleDogQUNBTUVSQV9SRVFVRVNUX0lEIGFuZCBBQ0FNRVJBX1JFUFJPQ0VTU19FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SCiAvKkBPfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpAQCAtMzYwLDcgKzUyMCwxMCBAQAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9ISVNUT0dSQU1fQ09VTlQsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX1NIQVJQTkVTU19NQVBfVkFMVUUsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fU0hBUlBORVNTX01BUF9TSVpFLAorICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTiwKICAgICBBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTLAorICAgIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCwKKyAgICBBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQsCiB9KTsKIAogLyp+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDBmZDdlZmEuLjNkODk1Y2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTE3LDEyICsxNywxOSBAQAogI2RlZmluZSBfQUNBTUVSQV9NRVRBREFUQV9ICiAKICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+Cit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKKyNlbHNlCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oPgogCkBAIC01OCwxMyArNjUsMTggQEAKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0VGFncygvKm91dCovaW50MzJfdCogbnVtVGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKSBjb25zdDsKIAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICBib29sIGlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIGNvbnN0OworCisgIHByaXZhdGU6CisKICAgICBib29sIGlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShjb25zdCBpbnQzMl90IGNhcGFiaWxpdHkpOwogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZlbmRvclRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHN0YXRpYyBib29sIGlzQ2FwdHVyZVJlcXVlc3RUYWcoY29uc3QgdWludDMyX3QgdGFnKTsKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKLQotICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICB2b2lkIGZpbHRlckR1cmF0aW9ucyh1aW50MzJfdCB0YWcpOyAvLyB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cworICAgIHZvaWQgZGVyaXZlUGh5c2ljYWxDYW1lcmFJZHMoKTsgLy8gRGVyaXZlIGFycmF5IG9mIHBoeXNpY2FsIGlkcy4KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIElOVEVSTkFMX1QsIHR5cGVuYW1lIE5ES19UPgogICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IE5ES19UKiBkYXRhKSB7CkBAIC05Niw3ICsxMDgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gIHByaXZhdGU6CiAgICAgLy8gZ3VhcmQgYWNjZXNzIG9mIHB1YmxpYyBBUElzOiBnZXQvdXBkYXRlL2dldFRhZ3MKICAgICBtdXRhYmxlIE11dGV4ICAgIG1Mb2NrOwogICAgIENhbWVyYU1ldGFkYXRhICAgbURhdGE7CkBAIC0xMDQsNiArMTE1LDkgQEAKICAgICBjb25zdCBBQ0FNRVJBX01FVEFEQVRBX1RZUEUgbVR5cGU7CiAKICAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzU3lzdGVtVGFnczsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXM7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCmluZGV4IDA2YjJjYzMuLjVjODJhYjcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKQEAgLTIxLDggKzIxLDExIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaCIKKyNlbHNlCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7Ci0gICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBTmF0aXZlV2luZG93KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CiAKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtMzcsOCArNDAsOSBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKKyAgICBBQ2FtZXJhV2luZG93VHlwZSogbVdpbmRvdzsKIH07CisjZW5kaWYKIAogc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXRzIHsKICAgICBzdGQ6OnNldDxBQ2FtZXJhT3V0cHV0VGFyZ2V0PiBtT3V0cHV0czsKQEAgLTU1LDcgKzU5LDcgQEAKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiAgICAgfQogCi0gICAgQUNhbWVyYU1ldGFkYXRhKiAgICAgIHNldHRpbmdzOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gICBzZXR0aW5nczsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0cyogdGFyZ2V0czsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgY29udGV4dDsKIH07CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKaW5kZXggNWUwZGI2MC4uZDEzYTgxOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaApAQCAtMzUsMTAgKzM1LDEwIEBACiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICkBAIC0yNDYsNyArMjQ2LDcgQEAKICAqLwogdHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0KSgKICAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CiAKIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIHsKICAgICAvLy8gb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dC4KQEAgLTY0Myw2ICs2NDMsMTAzIEBACiAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGZpbmFsIGNhcHR1cmUgcmVzdWx0IGNhbGxiYWNrIHdpdGggbG9naWNhbCBtdWx0aS1jYW1lcmEgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGZpbmFsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0LCB3aXRoCisgKiBhZGRlZCBhYmlsaXR5IHRvIHJldHVybiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIHdpdGhpbiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICoKKyAqIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElkIGFuZCByZXN1bHQgbWV0YWRhdGEKKyAqIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMsIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUgcmVxdWVzdCBjb250YWlucyB0YXJnZXRzIGZvci4KKyAqIElmIHRoZSBjYXB0dXJlIHJlcXVlc3QgZG9lc24ndCBjb250YWluIHRhcmdldHMgc3BlY2lmaWMgdG8gYW55IHBoeXNpY2FsIGNhbWVyYSwgb3IgdGhlIGN1cnJlbnQKKyAqIGNhbWVyYSBkZXZpY2UgaXNuJ3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgcGh5c2ljYWxSZXN1bHRDb3VudCB3aWxsIGJlIDAuCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzfS4KKyAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIG9mIGludGVyZXN0LgorICogQHBhcmFtIHJlcXVlc3QgVGhlIGNhcHR1cmUgcmVxdWVzdCBvZiBpbnRlcmVzdC4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHJlc3VsdCBUaGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcmVwb3J0ZWQgYnkgY2FtZXJhIGRldmljZS4gVGhlIG1lbW9yeSBpcyBtYW5hZ2VkIGJ5CisgKiAgICAgICAgICAgICAgICBjYW1lcmEgZnJhbWV3b3JrLiBEbyBub3QgYWNjZXNzIHRoaXMgcG9pbnRlciBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRDb3VudCBUaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEKKyAqIEBwYXJhbSBwaHlzaWNhbENhbWVyYUlkcyBUaGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElEcyBvbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIHJlc3VsdCBtZXRhZGF0YSBhcmUgcmVwb3J0ZWQuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRzIFRoZSBhcnJheSBvZiBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSByZXBvcnRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2VzLgorICovCit0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0KSgKKyAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogcmVzdWx0LAorICAgICAgICBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MsCisgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBhbiBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkIGNhbGxiYWNrIGlzCisgKiB1c2VkLCBpbnN0ZWFkIG9mIG9uQ2FwdHVyZUNvbXBsZXRlZCwgdG8gc3VwcG9ydCBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyB7CisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVQcm9ncmVzc2VkOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiBhbiBpbWFnZSBjYXB0dXJlIGhhcyBmdWxseSBjb21wbGV0ZWQgYW5kIGFsbCB0aGUKKyAgICAgKiByZXN1bHQgbWV0YWRhdGEgaXMgYXZhaWxhYmxlLiBGb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhpcyBjYWxsYmFjaworICAgICAqIGFsc28gcmV0dXJucyB0aGUgcmVzdWx0IG1ldGFkYXRhIGZvciBhbGwgcGh5c2ljYWwgY2FtZXJhcyBiZWluZworICAgICAqIGV4cGxpY2l0bHkgcmVxdWVzdGVkIG9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBjYWxsYmFjayB3aWxsIGFsd2F5cyBmaXJlIGFmdGVyIHRoZSBsYXN0IHtAbGluayBvbkNhcHR1cmVQcm9ncmVzc2VkfTsKKyAgICAgKiBpbiBvdGhlciB3b3Jkcywgbm8gbW9yZSBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBkZWxpdmVyZWQgb25jZSB0aGUgY29tcGxldGVkIHJlc3VsdAorICAgICAqIGlzIGF2YWlsYWJsZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgcGVyZm9ybWFuY2UtaW50ZW5zaXZlIHVzZS1jYXNlcyB3aGVyZSBsYXRlbmN5IGlzIGEgZmFjdG9yLCBjb25zaWRlcgorICAgICAqIHVzaW5nIHtAbGluayBvbkNhcHR1cmVQcm9ncmVzc2VkfSBpbnN0ZWFkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG1hdGNoIHdoYXQgYXBwbGljYXRpb24gaGFzCisgICAgICogc3VibWl0dGVkLCBidXQgdGhlIGNvbnRlbnRzIHRoZSBBQ2FwdHVyZVJlcXVlc3Qgd2lsbCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIHN1Ym1pdHRlZC48L3A+CisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkICAgICAgICBvbkNhcHR1cmVGYWlsZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7Cit9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3M7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZSwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgbG9naWNhbCBtdWx0aS1jYW1lcmEgd2hlcmUgdGhlIGNhcHR1cmUgY2FsbGJhY2tzIHN1cHBvcnRzIHJlc3VsdCBtZXRhZGF0YSBmb3IKKyAqIHBoeXNpY2FsIGNhbWVyYXMuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciBsb2dpY2FsIG11bHRpLWNhbWVyYSB3aGVyZSB0aGUgY2FwdHVyZSBjYWxsYmFja3Mgc3VwcG9ydHMgcmVzdWx0IG1ldGFkYXRhIGZvcgorICogcGh5c2ljYWwgY2FtZXJhcy4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggN2MxM2IzNC4uMjZhZjRmOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC0zNCwxMCArMzQsMTAgQEAKICAqLwogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0RFVklDRV9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0RFVklDRV9ICkBAIC0zNDUsNyArMzQ1LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEZyZWUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0LgpAQCAtNjk0LDcgKzY5NCw3IEBACiAgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBBZGQgYSBuYXRpdmUgd2luZG93IHRvIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCkBAIC03MTIsNyArNzEyLDcgQEAKICAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAotICAgICAgICBBTmF0aXZlV2luZG93ICphbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlICphbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmVtb3ZlIGEgbmF0aXZlIHdpbmRvdyBmcm9tIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCkBAIC03MjgsNyArNzI4LDcgQEAKICAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQ3JlYXRlIGEgbmV3IGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gc2ltaWxhciB0byB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uIFRoaXMKQEAgLTc2NSw2ICs3NjUsMzYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ3JlYXRlIGEgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG9iamVjdCB1c2VkIGZvciBzdHJlYW1pbmcgZnJvbSBhIHBoeXNpY2FsCisgKiBjYW1lcmEgYXMgcGFydCBvZiBhIGxvZ2ljYWwgY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5UaGUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IGlzIHVzZWQgaW4ge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGR9IG1ldGhvZCB0byBhZGQKKyAqIGFuIG91dHB1dCB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyLiBVc2UKKyAqIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZX0gdG8gZnJlZSB0aGUgb2JqZWN0IGFuZCBpdHMgbWVtb3J5IGFmdGVyIGFwcGxpY2F0aW9uIG5vIGxvbmdlcgorICogbmVlZHMgdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9LjwvcD4KKyAqCisgKiBAcGFyYW0gYW53IHRoZSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fQorICogQHBhcmFtIHBoeXNpY2FsSWQgdGhlIElkIG9mIHRoZSBwaHlzaWNhbCBjYW1lcmEgdGhpcyBvdXRwdXQgaXMgYXNzb2NpYXRlZAorICogICAgICAgICAgICAgICAgICB3aXRoLgorICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlCisgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY29udGFpbmVyIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gdGhlIG91dHB1dCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudywgcGh5c2ljYWxJZCBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CisgKgorICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUoCisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKaW5kZXggNjExZTI3MC4uOWJiZmI4MyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaApAQCAtMjMzLDYgKzIzMywyOCBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBjYW1lcmEgaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKgorICogPHA+IENoZWNrIHdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgYmFzZWQgb24gaXRzCisgKiBzdGF0aWMgbWV0YWRhdGEuIElmIGl0IGlzLCBhbHNvIHJldHVybnMgaXRzIHBoeXNpY2FsIHN1YiBjYW1lcmEgSWRzLjwvcD4KKyAqCisgKiBAcGFyYW0gc3RhdGljTWV0YWRhdGEgdGhlIHN0YXRpYyBtZXRhZGF0YSBvZiB0aGUgY2FtZXJhIGJlaW5nIGNoZWNrZWQuCisgKiBAcGFyYW0gbnVtUGh5c2ljYWxDYW1lcmFzIHJldHVybnMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmFzLgorICogQHBhcmFtIHBoeXNpY2FsQ2FtZXJhSWRzIHJldHVybnMgdGhlIGFycmF5IG9mIHBoeXNpY2FsIGNhbWVyYSBJZHMgYmFja2luZyB0aGlzIGxvZ2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdGF0aWNNZXRhZGF0YSBvYmplY3QuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKiBjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NRVRBREFUQV9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAppbmRleCBhOWFmNzdlLi44YzE5ZTFkIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKQEAgLTcxLDYgKzcxLDggQEAKICAgICBBQ0FNRVJBX0RFUFRILAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkEsCiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04sCisgICAgQUNBTUVSQV9IRUlDLAorICAgIEFDQU1FUkFfSEVJQ19JTkZPLAogICAgIEFDQU1FUkFfU0VDVElPTl9DT1VOVCwKIAogICAgIEFDQU1FUkFfVkVORE9SID0gMHg4MDAwCkBAIC0xMTIsNiArMTE0LDggQEAKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9IRUlDX1NUQVJUICAgICAgICAgICAgID0gQUNBTUVSQV9IRUlDICAgICAgICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0hFSUNfSU5GT19TVEFSVCAgICAgICAgPSBBQ0FNRVJBX0hFSUNfSU5GTyAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTE5MTIsNiArMTkxNiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX0NPT1JESU5BVEVTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGVbM10KICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCwKQEAgLTE5MjcsNiArMTkzMiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAxLApAQCAtMTk0Miw2ICsxOTQ4LDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIGZvciBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19HUFNfVElNRVNUQU1QID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDY0CiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAyLApAQCAtMTk4Niw2ICsxOTkzLDEwIEBACiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkZvciBFWFRFUk5BTCBjYW1lcmFzIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gd2lsbCBhbHdheXMgYmUgc2V0IHRvIDAgYW5kIHRoZSBmYWNpbmcgd2lsbAogICAgICAqIGFsc28gYmUgc2V0IHRvIEVYVEVSTkFMLiBUaGUgYWJvdmUgY29kZSBpcyBub3QgcmVsZXZhbnQgaW4gc3VjaCBjYXNlLjwvcD4KKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUsIGluIHdoaWNoCisgICAgICogY2FzZSB0aGUgcm90YXRpb24gaXMgcmVmbGVjdGVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPiwgYW5kIG5vdCBieQorICAgICAqIHJvdGF0aW5nIHRoZSBpbWFnZSBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0yMDAzLDcgKzIwMTQsOCBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLjwvcD4KKyAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLiBUaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHF1YWxpdHkKKyAgICAgKiBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyA0LApAQCAtMjAxOSw2ICsyMDMxLDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBxdWFsaXR5IG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19USFVNQk5BSUxfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDUsCkBAIC0yMDU1LDYgKzIwNjgsMTAgQEAKICAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbAogICAgICAqICAgc2l6ZS48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhlIHRhZyBpcyBhbHNvIHVzZWQgYXMgdGh1bWJuYWlsIHNpemUgZm9yIEhFSUMgaW1hZ2UgZm9ybWF0IGNhcHR1cmUsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICogdGhlIHRodW1ibmFpbCByb3RhdGlvbiBpcyByZWZsZWN0ZWQgYnkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LCBhbmQgbm90IGJ5CisgICAgICogcm90YXRpbmcgdGhlIHRodW1ibmFpbCBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfSlBFR19PUklFTlRBVElPTgogICAgICAqLwpAQCAtMjA4OCw2ICsyMTA1LDcgQEAKICAgICAgKiBhbmQgdmljZSB2ZXJzYS48L2xpPgogICAgICAqIDxsaT5BbGwgbm9uLTxjb2RlPigwLCAwKTwvY29kZT4gc2l6ZXMgd2lsbCBoYXZlIG5vbi16ZXJvIHdpZHRocyBhbmQgaGVpZ2h0cy48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhpcyBsaXN0IGlzIGFsc28gdXNlZCBhcyBzdXBwb3J0ZWQgdGh1bWJuYWlsIHNpemVzIGZvciBIRUlDIGltYWdlIGZvcm1hdCBjYXB0dXJlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwogICAgICAqLwpAQCAtMjc4Myw3ICsyODAxLDcgQEAKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LCBvciB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMzI1MSw2ICszMjY5LDcgQEAKICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH08L2xpPgogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI4OCw2ICszMzA3LDgxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfQ1JPUFBJTkdfVFlQRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdCBjb250YWlucworICAgICAqIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1XSwgd2hpY2ggbWFwcyB0bworICAgICAqICh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4gVGhlIGFycmF5IGNhbiBiZQorICAgICAqIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIHBzZXVkbyBjb2RlOjwvcD4KKyAgICAgKiA8cD5zdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICogaW50MzJfdCBmb3JtYXQ7CisgICAgICogaW50MzJfdCB3aWR0aDsKKyAgICAgKiBpbnQzMl90IGhlaWdodDsKKyAgICAgKiBpbnQzMl90IGlzSW5wdXQ7IH07PC9wPgorICAgICAqIDxwPnZvaWQgZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICogICAgIGludDMyX3QgKmFycmF5LCBzaXplX3QgY291bnQsIGludDMyX3QgdXNlY2FzZUlkLAorICAgICAqICAgICBWZWN0b3IgJmx0OyBTdHJlYW1Db25maWd1cmF0aW9uICZndDsgKiBzY3MpIHsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OzwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPmZvciAoc2l6ZV90IGkgPSAwOyBpICZsdDsgY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICogICAgIGludDMyX3Qgd2lkdGggPSBhcnJheVtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaGVpZ2h0ID0gYXJyYXlbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBmb3JtYXQgPSBhcnJheVtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGlzSW5wdXQgPSBhcnJheVtpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPSBhcnJheVtpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICogICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmYW1wOyAoMSAmbHQ7Jmx0OyB1c2VjYXNlSWQpKSB7CisgICAgICogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICogICAgICAgICBzY3MtJmd0O2FkZChzYyk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIDxwPn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgbWFwcGluZ3Mgb2YgaW1hZ2UgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIGNhbWVyYSBkZXZpY2UgZm9yIGlucHV0IHN0cmVhbXMsIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHJlY29tbWVuZGVkIHN1YnNldCBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBtYXBwaW5ncyBmb3VuZCBpbgorICAgICAqIGFuZHJvaWQuc2NhbGVyLmF2YWlsYWJsZUlucHV0T3V0cHV0Rm9ybWF0c01hcC4gVGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFwcGx5IGhlcmUgYXMgd2VsbC4KKyAgICAgKiBUaGUgbGlzdCBob3dldmVyIGRvZXNuJ3QgbmVlZCB0byBjb250YWluIGFsbCBhdmFpbGFibGUgYW5kIHN1cHBvcnRlZCBtYXBwaW5ncy4gSW5zdGVhZCBvZgorICAgICAqIHRoaXMgZGV2ZWxvcGVycyBtdXN0IGxpc3Qgb25seSByZWNvbW1lbmRlZCBhbmQgZWZmaWNpZW50IGVudHJpZXMuCisgICAgICogSWYgc2V0LCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFpFUk9fU0hVVFRFUl9MQUcgcmVjb21tZW5kZWQgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbiBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTM0NDgsNiArMzU0Miw4IEBACiAgICAgICogPHA+U29tZSBkZXZpY2VzIG1heSBjaG9vc2UgdG8gcHJvdmlkZSBhIHNlY29uZCBzZXQgb2YgY2FsaWJyYXRpb24KICAgICAgKiBpbmZvcm1hdGlvbiBmb3IgaW1wcm92ZWQgcXVhbGl0eSwgaW5jbHVkaW5nCiAgICAgICogQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBtYXRyaWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCkBAIC0zNDc3LDYgKzM1NzMsOCBAQAogICAgICAqIDxwPklmIHRoaXMga2V5IGlzIHByZXNlbnQsIHRoZW4gQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLCBhbmQKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIgd2lsbCBhbHNvIGJlIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgpAQCAtMzUwNCw2ICszNjAyLDggQEAKICAgICAgKiBjb2xvcnNwYWNlKSBpbnRvIHRoaXMgY2FtZXJhIGRldmljZSdzIG5hdGl2ZSBzZW5zb3IgY29sb3IKICAgICAgKiBzcGFjZSB1bmRlciB0aGUgZmlyc3QgcmVmZXJlbmNlIGlsbHVtaW5hbnQKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1MzEsNiArMzYzMSw4IEBACiAgICAgICogKEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMikuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzU1OSw2ICszNjYxLDggQEAKICAgICAgKiBhbmQgdGhlIENJRSBYWVogY29sb3JzcGFjZSB3aGVuIGNhbGN1bGF0aW5nIHRoaXMgdHJhbnNmb3JtIHdpbGwKICAgICAgKiBtYXRjaCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNTg5LDYgKzM2OTMsOCBAQAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzYxNSw2ICszNzIxLDggQEAKICAgICAgKiB0aGlzIG1hdHJpeCBpcyBjaG9zZW4gc28gdGhhdCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoaXMgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpbiB0aGUgcmVmZXJlbmNlIHNlbnNvciBjb2xvcnNwYWNlIGlzIG1hcHBlZCB0byBENTAgaW4gdGhlCiAgICAgICogQ0lFIFhZWiBjb2xvcnNwYWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzY0Myw2ICszNzUxLDggQEAKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzY3NSw2ICszNzg1LDcgQEAKICAgICAgKiBsZXZlbCB2YWx1ZXMuIEZvciByYXcgY2FwdHVyZSBpbiBwYXJ0aWN1bGFyLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgKiBwaXhlbHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgdG8gY2FsY3VsYXRlIGJsYWNrCiAgICAgICogbGV2ZWwgdmFsdWVzIGZvciBlYWNoIGZyYW1lLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSBkZXZpY2UsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVApAQCAtMzc2OSw2ICszODgwLDggQEAKICAgICAgKiB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHByb3ZpZGVkIGNvbG9yIHRyYW5zZm9ybXMgd2hlbgogICAgICAqIHByb2Nlc3NpbmcgcmF3IHNlbnNvciBkYXRhLjwvcD4KICAgICAgKiA8cD5UaGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpcyBSLCBHLCBCOyB3aGVyZSBSIGlzIGluIHRoZSBsb3dlc3QgaW5kZXguPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5UID0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRpb25hbFszXQogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxOCwKQEAgLTM3OTksNiArMzkxMiw4IEBACiAgICAgICogdGhhdCBjaGFubmVsLjwvcD4KICAgICAgKiA8cD5BIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5vaXNlIG1vZGVsIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICAgKiBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIE5vaXNlUHJvZmlsZSB0YWcuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCB0aGVyZSBpcyBvbmx5IG9uZSBjb2xvciBjaGFubmVsLiBTbyB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzCisgICAgICogd2lsbCBvbmx5IGNvbnRhaW4gb25lIFMgYW5kIG9uZSBPLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKICAgICAgKi8KQEAgLTM4NDQsNiArMzk1OSw4IEBACiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCiAgICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfR1JFRU5fU1BMSVQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMjIsCkBAIC0zOTk2LDYgKzQxMTMsNyBAQAogICAgICAqIGxheW91dCBrZXkgKHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCksIGkuZS4gdGhlCiAgICAgICogbnRoIHZhbHVlIGdpdmVuIGNvcnJlc3BvbmRzIHRvIHRoZSBibGFjayBsZXZlbCBvZmZzZXQgZm9yIHRoZSBudGgKICAgICAgKiBjb2xvciBjaGFubmVsIGxpc3RlZCBpbiB0aGUgQ0ZBLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzIGF2YWlsYWJsZSBvciB0aGUKICAgICAgKiBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uPC9wPgogICAgICAqCkBAIC00MDk4LDcgKzQyMTYsOCBAQAogICAgIC8qKgogICAgICAqIDxwPlRoZSBhcnJhbmdlbWVudCBvZiBjb2xvciBmaWx0ZXJzIG9uIHNlbnNvcjsKICAgICAgKiByZXByZXNlbnRzIHRoZSBjb2xvcnMgaW4gdGhlIHRvcC1sZWZ0IDJ4MiBzZWN0aW9uIG9mCi0gICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlci48L3A+CisgICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlciwgZm9yIGEgQmF5ZXIgY2FtZXJhLCBvciB0aGUKKyAgICAgKiBsaWdodCBzcGVjdHJ1bSBpdCBjYXB0dXJlcyBmb3IgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QpPC9wPgogICAgICAqCkBAIC00NTY3LDEzICs0Njg2LDEzIEBACiAgICAgICogKHgseSkgz7UgKDAgLi4uIE4tMSwgMCAuLi4gTS0xKSBpcyB0aGUgdmFsdWUgb2YgdGhlIHNoYWRpbmcgbWFwIGF0CiAgICAgICogcGl4ZWwgKCAoKFctMSkvKE4tMSkpICogeCwgKChILTEpLyhNLTEpKSAqIHkpIGZvciB0aGUgZm91ciBjb2xvciBjaGFubmVscy4KICAgICAgKiBUaGUgbWFwIGlzIGFzc3VtZWQgdG8gYmUgYmlsaW5lYXJseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiB0aGUgc2FtcGxlIHBvaW50cy48L3A+Ci0gICAgICogPHA+VGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMgdGhlIGdyZWVuCi0gICAgICogY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KKyAgICAgKiA8cD5Gb3IgYSBCYXllciBjYW1lcmEsIHRoZSBjaGFubmVsIG9yZGVyIGlzIFtSLCBHZXZlbiwgR29kZCwgQl0sIHdoZXJlIEdldmVuIGlzCisgICAgICogdGhlIGdyZWVuIGNoYW5uZWwgZm9yIHRoZSBldmVuIHJvd3Mgb2YgYSBCYXllciBwYXR0ZXJuLCBhbmQgR29kZCBpcyB0aGUgb2RkIHJvd3MuCiAgICAgICogVGhlIHNoYWRpbmcgbWFwIGlzIHN0b3JlZCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIGZvcm1hdCwgYW5kIGl0cyBzaXplCiAgICAgICogaXMgcHJvdmlkZWQgaW4gdGhlIGNhbWVyYSBzdGF0aWMgbWV0YWRhdGEgYnkgQUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHNoYWRpbmcgbWFwIHdpbGwgZ2VuZXJhbGx5IGhhdmUgb24gdGhlIG9yZGVyIG9mIDMwLTQwIHJvd3MgYW5kIGNvbHVtbnMsCiAgICAgICogYW5kIHdpbGwgYmUgc21hbGxlciB0aGFuIDY0eDY0LjwvcD4KLSAgICAgKiA8cD5BcyBhbiBleGFtcGxlLCBnaXZlbiBhIHZlcnkgc21hbGwgbWFwIGRlZmluZWQgYXM6PC9wPgorICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZm9yIGEgQmF5ZXIgY2FtZXJhIGRlZmluZWQgYXM6PC9wPgogICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSA9IFsgNCwgMyBdCiAgICAgICogQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAgPQogICAgICAqIFsgMS4zLCAxLjIsIDEuMTUsIDEuMiwgIDEuMiwgMS4yLCAxLjE1LCAxLjIsCkBAIC00NTkzLDYgKzQ3MTIsMTcgQEAKICAgICAgKiBpbWFnZSBvZiBhIGdyYXkgd2FsbCAodXNpbmcgYmljdWJpYyBpbnRlcnBvbGF0aW9uIGZvciB2aXN1YWwgcXVhbGl0eSkKICAgICAgKiBhcyBjYXB0dXJlZCBieSB0aGUgc2Vuc29yIGdpdmVzOjwvcD4KICAgICAgKiA8cD48aW1nIGFsdD0iSW1hZ2Ugb2YgYSB1bmlmb3JtIHdoaXRlIHdhbGwgKGludmVyc2Ugc2hhZGluZyBtYXApIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcC9pbnZfc2hhZGluZy5wbmciIC8+PC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLiBBbiBleGFtcGxlCisgICAgICogc2hhZGluZyBtYXAgZm9yIHN1Y2ggYSBjYW1lcmEgaXMgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CisgICAgICogWyAxLjMsIDEuMywgMS4zLCAxLjMsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAgIDEuMSwgMS4xLCAxLjEsIDEuMSwgIDEuMywgMS4zLCAxLjMsIDEuMywKKyAgICAgKiAgIDEuMiwgMS4yLCAxLjIsIDEuMiwgIDEuMSwgMS4xLCAxLjEsIDEuMSwKKyAgICAgKiAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgMS4zLCAxLjMsIDEuMywgMS4zLCAgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4zLCAxLjMsIDEuMywgMS4zIF0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBSQVcgaW1hZ2UgZGF0YSBtaWdodCBiZSBzdWJqZWN0IHRvIGxlbnMgc2hhZGluZwogICAgICAqIGNvcnJlY3Rpb24gbm90IHJlcG9ydGVkIG9uIHRoaXMgbWFwLiBRdWVyeQogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQgdG8gc2VlIGlmIFJBVyBpbWFnZSBkYXRhIGhhcyBzdWJqZWN0CkBAIC00OTM2LDggKzUwNjYsOCBAQAogICAgICAqIG9mIHBvaW50cyBjYW4gYmUgbGVzcyB0aGFuIG1heCAodGhhdCBpcywgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYWx3YXlzIHByb3ZpZGUgYSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBwb2ludHMgZXF1aXZhbGVudCB0bwogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTKS48L3A+Ci0gICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIG9ubHkgcmVkIGNoYW5uZWwgaXMgdXNlZC4gR3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMKLSAgICAgKiBhcmUgaWdub3JlZC48L3A+CisgICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIGFsbCB0aHJlZSBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mCisgICAgICogY29udHJvbCBwb2ludHMuPC9wPgogICAgICAqIDxwPkEgZmV3IGV4YW1wbGVzLCBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBncmFwaGljYWwgbWFwcGluZ3M7IHRoZXNlCiAgICAgICogb25seSBzcGVjaWZ5IHRoZSByZWQgY2hhbm5lbCBhbmQgdGhlIHByZWNpc2lvbiBpcyBsaW1pdGVkIHRvIDQKICAgICAgKiBkaWdpdHMsIGZvciBjb25jaXNlbmVzcy48L3A+CkBAIC01NDExLDkgKzU1NDEsMTIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+T3B0aW9uYWwgc3Vic2V0IG9mIHRoZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdAorICAgICAqIGNvbnRhaW5zIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPkZvciBkYXRhIHJlcHJlc2VudGF0aW9uIHBsZWFzZSByZWZlciB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlM8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNV0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA1LAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhdmFpbGFibGUgZHluYW1pYyBkZXB0aCBkYXRhc3BhY2Ugc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG91dHB1dC9pbnB1dCBzdHJlYW0pLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGVzZSBhcmUgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgdXNlIHdpdGgKKyAgICAgKiBkYXRhU3BhY2UgRFlOQU1JQ19ERVBUSC4gVGhlIGNvbmZpZ3VyYXRpb25zIGFyZQorICAgICAqIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPk9ubHkgZGV2aWNlcyB0aGF0IHN1cHBvcnQgZGVwdGggb3V0cHV0IGZvciBhdCBsZWFzdAorICAgICAqIHRoZSBIQUxfUElYRUxfRk9STUFUX1kxNiBkZW5zZSBkZXB0aCBtYXAgYWxvbmcgd2l0aAorICAgICAqIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiB3aXRoIHRoZSBzYW1lIHNpemUgb3Igc2l6ZSB3aXRoCisgICAgICogdGhlIHNhbWUgYXNwZWN0IHJhdGlvIGNhbiBoYXZlIGR5bmFtaWMgZGVwdGggZGF0YXNwYWNlCisgICAgICogc3RyZWFtIGNvbmZpZ3VyYXRpb24uIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGFsc28KKyAgICAgKiBuZWVkcyB0byBiZSBzZXQgdG8gRkFMU0UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRQorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNiwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5UaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBvZiBhIHN0cmVhbSAob2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCwgc2l6ZSkKKyAgICAgKiBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBpbnB1dCBvciBvdXRwdXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9IC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA3LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPkFsbCBkeW5hbWljIGRlcHRoIG91dHB1dCBzdHJlYW1zIG1heSBoYXZlIGEgbm9uemVybyBzdGFsbAorICAgICAqIGR1cmF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgOCwKICAgICBBQ0FNRVJBX0RFUFRIX0VORCwKIAogICAgIC8qKgorICAgICAqIDxwPlN0cmluZyBjb250YWluaW5nIHRoZSBpZHMgb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBhIGxvZ2ljYWwgY2FtZXJhLCB0aGlzIGlzIGNvbmNhdGVuYXRpb24gb2YgYWxsIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgKiBUaGUgbnVsbCB0ZXJtaW5hdG9yIGZvciBwaHlzaWNhbCBjYW1lcmEgSUQgbXVzdCBiZSBwcmVzZXJ2ZWQgc28gdGhhdCB0aGUgd2hvbGUgc3RyaW5nCisgICAgICogY2FuIGJlIHRva2VuaXplZCB1c2luZyAnXDAnIHRvIGdlbmVyYXRlIGxpc3Qgb2YgcGh5c2ljYWwgY2FtZXJhIElEcy48L3A+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIG9mIHRoZSBsb2dpY2FsIGNhbWVyYSBhcmUgIjIiIGFuZCAiMyIsIHRoZQorICAgICAqIHZhbHVlIG9mIHRoaXMgdGFnIHdpbGwgYmUgWycyJywgJ1wwJywgJzMnLCAnXDAnXS48L3A+CisgICAgICogPHA+VGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmEgSURzIG11c3QgYmUgbm8gbGVzcyB0aGFuIDIuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTID0gICAgICAgICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQsCisgICAgLyoqCiAgICAgICogPHA+VGhlIGFjY3VyYWN5IG9mIGZyYW1lIHRpbWVzdGFtcCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBwaHlzaWNhbCBjYW1lcmFzPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KTwvcD4KQEAgLTU0MzQsNiArNTY3NiwyOCBAQAogICAgICAqLwogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRSA9ICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xvZ2ljYWxfbXVsdGlfY2FtZXJhX3NlbnNvcl9zeW5jX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQgKyAxLAorICAgIC8qKgorICAgICAqIDxwPlN0cmluZyBjb250YWluaW5nIHRoZSBJRCBvZiB0aGUgdW5kZXJseWluZyBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGU8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIElEIG9mIHRoZSBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIHRoYXQncyBiYWNraW5nIHRoZSBsb2dpY2FsIGNhbWVyYS4gQWxsIGNhbWVyYQorICAgICAqIHN0cmVhbXMgYW5kIG1ldGFkYXRhIHRoYXQgYXJlIG5vdCBwaHlzaWNhbCBjYW1lcmEgc3BlY2lmaWMgd2lsbCBiZSBvcmlnaW5hdGluZyBmcm9tIHRoaXMKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdmFsaWQgcGh5c2ljYWwgSURzIGFkdmVydGlzZWQgaW4gdGhlIHBoeXNpY2FsSWRzCisgICAgICogc3RhdGljIHRhZy48L3A+CisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEgbWFkZSB1cCBvZiBwaHlzaWNhbCBjYW1lcmFzIHdoZXJlIGVhY2ggY2FtZXJhJ3MgbGVuc2VzIGhhdmUKKyAgICAgKiBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgY2hvb3NlIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMgd2hlbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIEZPQ0FMX0xFTkdUSCBvciBTQ0FMRVJfQ1JPUF9SRUdJT04uCisgICAgICogQXQgdGhlIHRpbWUgb2YgbGVucyBzd2l0Y2gsIHRoaXMgcmVzdWx0IG1ldGFkYXRhIHJlZmxlY3RzIHRoZSBuZXcgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYQorICAgICAqIElELjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCA9ICAgICAgICAgICAvLyBieXRlCisgICAgICAgICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NUQVJUICsgMiwKICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0VORCwKIAogICAgIC8qKgpAQCAtNTQ1Nyw4ICs1NzIxLDggQEAKICAgICAgKiB3aWxsIG5vdCBzbG93IGRvd24gY2FwdHVyZSByYXRlIHdoZW4gYXBwbHlpbmcgY29ycmVjdGlvbi4gRkFTVCBtYXkgYmUgdGhlIHNhbWUgYXMgT0ZGIGlmCiAgICAgICogYW55IGNvcnJlY3Rpb24gYXQgYWxsIHdvdWxkIHNsb3cgZG93biBjYXB0dXJlIHJhdGUuICBFdmVyeSBvdXRwdXQgc3RyZWFtIHdpbGwgaGF2ZSBhCiAgICAgICogc2ltaWxhciBhbW91bnQgb2YgZW5oYW5jZW1lbnQgYXBwbGllZC48L3A+Ci0gICAgICogPHA+VGhlIGNvcnJlY3Rpb24gb25seSBhcHBsaWVzIHRvIHByb2Nlc3NlZCBvdXRwdXRzIHN1Y2ggYXMgWVVWLCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcyBub3QKLSAgICAgKiBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KKyAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIFk4LCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcworICAgICAqIG5vdCBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgd2lsbCBiZSBvbiBieSBkZWZhdWx0IG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoaXMgY29udHJvbC4gQXBwbGljYXRpb25zCiAgICAgICogZGlzYWJsaW5nIGRpc3RvcnRpb24gY29ycmVjdGlvbiBuZWVkIHRvIHBheSBleHRyYSBhdHRlbnRpb24gd2l0aCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YKICAgICAgKiBtZXRlcmluZyByZWdpb25zLCBjcm9wIHJlZ2lvbiwgYW5kIGZhY2UgcmVjdGFuZ2xlcy4gV2hlbiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgT0ZGLApAQCAtNTUxMSw2ICs1Nzc1LDgwIEBACiAgICAgICAgICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVCArIDEsCiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fRU5ELAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBIRUlDIChJU08vSUVDIDIzMDA4LTEyKSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cworICAgICAqIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGNvbmZpZ3VyYXRpb25zIGFyZSBsaXN0ZWQgYXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gdHVwbGVzLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBIRUlDIGltYWdlIGZvcm1hdCwgaXQgd2lsbCBzdXBwb3J0IGlkZW50aWNhbCBzZXQgb2Ygc3RyZWFtCisgICAgICogY29tYmluYXRpb25zIGludm9sdmluZyBIRUlDIGltYWdlIGZvcm1hdCwgY29tcGFyZWQgdG8gdGhlIGNvbWJpbmF0aW9ucyBpbnZvbHZpbmcgSlBFRworICAgICAqIGltYWdlIGZvcm1hdCBhcyByZXF1aXJlZCBieSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgbGV2ZWwgYW5kIGNhcGFiaWxpdGllcy48L3A+CisgICAgICogPHA+QWxsIHRoZSBzdGF0aWMsIGNvbnRyb2wsIGFuZCBkeW5hbWljIG1ldGFkYXRhIHRhZ3MgcmVsYXRlZCB0byBKUEVHIGFwcGx5IHRvIEhFSUMgZm9ybWF0cy4KKyAgICAgKiBDb25maWd1cmluZyBKUEVHIGFuZCBIRUlDIHN0cmVhbXMgYXQgdGhlIHNhbWUgdGltZSBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIGNvbmZpZ3VyYXRpb24gdHVwbGVzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHdpbGwgY29udGFpbgorICAgICAqIEFJTUFHRV9GT1JNQVRfSEVJQyBmb3JtYXQgYXMgT1VUUFVUIG9ubHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAgICAgICAgIC8vIGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2hlaWNfYXZhaWxhYmxlX2hlaWNfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBIRUlDIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgZnJhbWUgZHVyYXRpb24gd2hlbiBvbmx5IHRoYXQKKyAgICAgKiBzdHJlYW0gaXMgYWN0aXZlLCB3aXRoIGFsbCBwcm9jZXNzaW5nICh0eXBpY2FsbHkgaW4gYW5kcm9pZC4qLm1vZGUpCisgICAgICogc2V0IHRvIGVpdGhlciBPRkYgb3IgRkFTVC48L3A+CisgICAgICogPHA+V2hlbiBtdWx0aXBsZSBzdHJlYW1zIGFyZSB1c2VkIGluIGEgcmVxdWVzdCwgdGhlIG1pbmltdW0gZnJhbWUKKyAgICAgKiBkdXJhdGlvbiB3aWxsIGJlIG1heChpbmRpdmlkdWFsIHN0cmVhbSBtaW4gZHVyYXRpb25zKS48L3A+CisgICAgICogPHA+U2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMgZm9yIG1vcmUgZGV0YWlscyBhYm91dAorICAgICAqIGNhbGN1bGF0aW5nIHRoZSBtYXggZnJhbWUgcmF0ZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMgPSAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgMSwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtYXhpbXVtIHN0YWxsIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogb3V0cHV0IGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBIRUlDIHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BIHN0YWxsIGR1cmF0aW9uIGlzIGhvdyBtdWNoIGV4dHJhIHRpbWUgd291bGQgZ2V0IGFkZGVkCisgICAgICogdG8gdGhlIG5vcm1hbCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIHJlcGVhdGluZyByZXF1ZXN0CisgICAgICogdGhhdCBoYXMgc3RyZWFtcyB3aXRoIG5vbi16ZXJvIHN0YWxsLjwvcD4KKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9ucyBzaW1pbGFybHkgdG8KKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TIGZvciBIRUlDCisgICAgICogc3RyZWFtcy48L3A+CisgICAgICogPHA+QWxsIEhFSUMgb3V0cHV0IHN0cmVhbSBmb3JtYXRzIG1heSBoYXZlIGEgbm9uemVybyBzdGFsbAorICAgICAqIGR1cmF0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMgPSAgICAgICAgICAgICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCArIDIsCisgICAgQUNBTUVSQV9IRUlDX0VORCwKKwogfSBhY2FtZXJhX21ldGFkYXRhX3RhZ190OwogCiAvKioKQEAgLTcwMDUsNiArNzM0MywxMCBAQAogICAgICAqIDxwPklmIHRoaXMgaXMgc3VwcG9ydGVkLCBhbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwIHdpbGwKICAgICAgKiBhZGRpdGlvbmFsbHkgcmV0dXJuIGEgbWluIGZyYW1lIGR1cmF0aW9uIHRoYXQgaXMgZ3JlYXRlciB0aGFuCiAgICAgICogemVybyBmb3IgZWFjaCBzdXBwb3J0ZWQgc2l6ZS1mb3JtYXQgY29tYmluYXRpb24uPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdGhlIHVuZGVybHlpbmcgYWN0aXZlCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHN3aXRjaGVzLCBleHBvc3VyZVRpbWUsIHNlbnNpdGl2aXR5LCBhbmQgbGVucyBwcm9wZXJ0aWVzIG1heSBjaGFuZ2UKKyAgICAgKiBldmVuIGlmIEFFL0FGIGlzIGxvY2tlZC4gSG93ZXZlciwgdGhlIG92ZXJhbGwgYXV0byBleHBvc3VyZSBhbmQgYXV0byBmb2N1cyBleHBlcmllbmNlCisgICAgICogZm9yIHVzZXJzIHdpbGwgYmUgY29uc2lzdGVudC4gUmVmZXIgdG8gTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSBmb3IgZGV0YWlscy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQkxBQ0tfTEVWRUxfTE9DSwogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX0xPQ0sKQEAgLTcwNjAsNiArNzQwMiwxMCBAQAogICAgICAqIHdpbGwgYWNjdXJhdGVseSByZXBvcnQgdGhlIHZhbHVlcyBhcHBsaWVkIGJ5IEFXQiBpbiB0aGUgcmVzdWx0LjwvcD4KICAgICAgKiA8cD5BIGdpdmVuIGNhbWVyYSBkZXZpY2UgbWF5IGFsc28gc3VwcG9ydCBhZGRpdGlvbmFsIHBvc3QtcHJvY2Vzc2luZwogICAgICAqIGNvbnRyb2xzLCBidXQgdGhpcyBjYXBhYmlsaXR5IG9ubHkgY292ZXJzIHRoZSBhYm92ZSBsaXN0IG9mIGNvbnRyb2xzLjwvcD4KKyAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5LCB3aGVuIHVuZGVybHlpbmcgYWN0aXZlCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHN3aXRjaGVzLCB0b25lbWFwLCB3aGl0ZSBiYWxhbmNlLCBhbmQgc2hhZGluZyBtYXAgbWF5IGNoYW5nZSBldmVuIGlmCisgICAgICogYXdiIGlzIGxvY2tlZC4gSG93ZXZlciwgdGhlIG92ZXJhbGwgcG9zdC1wcm9jZXNzaW5nIGV4cGVyaWVuY2UgZm9yIHVzZXJzIHdpbGwgYmUKKyAgICAgKiBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9BQkVSUkFUSU9OX01PREVTCkBAIC03MTQzLDcgKzc0ODksNyBAQAogICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZC4gIEFsc28gdGhlCiAgICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlIHdoZXJlCiAgICAgICogdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQorICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+CiAgICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKQEAgLTcxNzcsOCArNzUyMyw4IEBACiAgICAgICogPGxpPlRoZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QXMgb2YgQW5kcm9pZCBQLCB0aGUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BIExJTUlURUQgY2FtZXJhIHdpdGggb25seSB0aGUgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0Ci0gICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZSBERVBUSDE2Ci0gICAgICogICBmb3JtYXQuPC9saT4KKyAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgWTgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZQorICAgICAqICAgREVQVEgxNiBmb3JtYXQuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkdlbmVyYWxseSwgZGVwdGggb3V0cHV0IG9wZXJhdGVzIGF0IGEgc2xvd2VyIGZyYW1lIHJhdGUgdGhhbiBzdGFuZGFyZCBjb2xvciBjYXB0dXJlLAogICAgICAqIHNvIHRoZSBERVBUSDE2IGFuZCBERVBUSF9QT0lOVF9DTE9VRCBmb3JtYXRzIHdpbGwgY29tbW9ubHkgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uIHRoYXQKQEAgLTcyMDksOCArNzU1NSwxNCBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgPSAxMCwKIAogICAgIC8qKgotICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMgdGhhdCBhcmUKLSAgICAgKiBhbHNvIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzLiBJbgorICAgICAqIEFQSSBsZXZlbCAyOCwgdGhlIHBoeXNpY2FsIGNhbWVyYXMgbXVzdCBhbHNvIGJlIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBTdGFydGluZyBmcm9tIEFQSQorICAgICAqIGxldmVsIDI5LCBzb21lIG9yIGFsbCBwaHlzaWNhbCBjYW1lcmFzIG1heSBub3QgYmUgaW5kZXBlbmRlbnRseSBleHBvc2VkIHRvIHRoZQorICAgICAqIGFwcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBCdXQgdGhlIGFwcGxpY2F0aW9uCisgICAgICogY2FuIHN0aWxsIHF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmFzJyBjaGFyYWN0ZXJpc3RpY3MgYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2E+LjwvcD4KICAgICAgKiA8cD5DYW1lcmEgYXBwbGljYXRpb24gc2hvdWxkbid0IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBhdCBtb3N0IDEgcmVhciBjYW1lcmEgYW5kIDEgZnJvbnQKICAgICAgKiBjYW1lcmEgaW4gdGhlIHN5c3RlbS4gRm9yIGFuIGFwcGxpY2F0aW9uIHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBmcm9udCBhbmQgYmFjayBjYW1lcmFzLAogICAgICAqIHRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgZmlyc3QgcmVhciBjYW1lcmEgYW5kIHRoZSBmaXJzdCBmcm9udApAQCAtNzIzMyw3ICs3NTg1LDcgQEAKICAgICAgKiA8L2xpPgogICAgICAqIDxsaT5UaGUgU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSBvZiB0aGUgbG9naWNhbCBkZXZpY2UgYW5kIHBoeXNpY2FsIGRldmljZXMgbXVzdCBiZQogICAgICAqICAgdGhlIHNhbWUuPC9saT4KLSAgICAgKiA8bGk+VGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIGRldmljZS48L2xpPgorICAgICAqIDxsaT5UaGUgbG9naWNhbCBjYW1lcmEgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciBkZXZpY2UuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkJvdGggdGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBhbmQgaXRzIHVuZGVybHlpbmcgcGh5c2ljYWwgZGV2aWNlcyBzdXBwb3J0IHRoZQogICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIHJlcXVpcmVkIGZvciB0aGVpciBkZXZpY2UgbGV2ZWxzLjwvcD4KQEAgLTcyNTMsMjIgKzc2MDUsMTA4IEBACiAgICAgICogPHA+VXNpbmcgcGh5c2ljYWwgc3RyZWFtcyBpbiBwbGFjZSBvZiBhIGxvZ2ljYWwgc3RyZWFtIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCB3aWxsCiAgICAgICogbm90IHNsb3cgZG93biB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgY2FwdHVyZSwgYXMgbG9uZyBhcyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbgogICAgICAqIG9mIHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBzdHJlYW1zIGFyZSB0aGUgc2FtZS48L3A+CisgICAgICogPHA+QSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UncyBkeW5hbWljIG1ldGFkYXRhIG1heSBjb250YWluCisgICAgICogQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgY3VycmVudAorICAgICAqIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgSWQuIEFuIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaXMgdGhlIHBoeXNpY2FsIGNhbWVyYSBmcm9tIHdoaWNoCisgICAgICogdGhlIGxvZ2ljYWwgY2FtZXJhJ3MgbWFpbiBpbWFnZSBkYXRhIG91dHB1dHMgKFlVViBvciBSQVcpIGFuZCBtZXRhZGF0YSBjb21lIGZyb20uCisgICAgICogSW4gYWRkaXRpb24sIHRoaXMgc2VydmVzIGFzIGFuIGluZGljYXRpb24gd2hpY2ggcGh5c2ljYWwgY2FtZXJhIGlzIHVzZWQgdG8gb3V0cHV0IHRvCisgICAgICogYSBSQVcgc3RyZWFtLCBvciBpbiBjYXNlIG9ubHkgcGh5c2ljYWwgY2FtZXJhcyBzdXBwb3J0IFJBVywgd2hpY2ggcGh5c2ljYWwgUkFXIHN0cmVhbQorICAgICAqIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVxdWVzdC48L3A+CisgICAgICogPHA+TG9naWNhbCBjYW1lcmEncyBzdGF0aWMgbWV0YWRhdGEgdGFncyBiZWxvdyBkZXNjcmliZSB0aGUgZGVmYXVsdCBhY3RpdmUgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmEuIEFuIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaXMgZGVmYXVsdCBpZiBpdCdzIHVzZWQgd2hlbiBhcHBsaWNhdGlvbiBkaXJlY3RseQorICAgICAqIHVzZXMgcmVxdWVzdHMgYnVpbHQgZnJvbSBhIHRlbXBsYXRlLiBBbGwgdGVtcGxhdGVzIHdpbGwgZGVmYXVsdCB0byB0aGUgc2FtZSBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19TRU5TSVRJVklUWV9SQU5HRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19NQVhfRlJBTUVfRFVSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkU8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfTUFYX0FOQUxPR19TRU5TSVRJVklUWTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUzwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfRElTVE9SVElPTjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5UbyBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgY2FwdHVyZSByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgdGFncworICAgICAqIHJlcXVpcmVkIGZvciBiYXNpYyBjYW1lcmEgZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZQorICAgICAqIGxvZ2ljYWwgY2FtZXJhIGNhcGFiaWx0aXR5LiBPdGhlciByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgdGFncywgb24gdGhlIG90aGVyCisgICAgICogaGFuZCwgd2lsbCBiZSBiYXNlZCBvbiBjdXJyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEuIEZvciBleGFtcGxlLCB0aGUgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmFzJyBzZW5zb3Igc2Vuc2l0aXZpdHkgYW5kIGxlbnMgY2FwYWJpbGl0eSBjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyLgorICAgICAqIFNvIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG1hbnVhbGx5IGNvbnRyb2xzIHNlbnNvciBleHBvc3VyZSB0aW1lL2dhaW4sIG9yIGRvZXMgbWFudWFsCisgICAgICogZm9jdXMgY29udHJvbCwgaXQgbXVzdCBjaGVja3MgdGhlIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSdzIGV4cG9zdXJlLCBnYWluLAorICAgICAqIGFuZCBmb2N1cyBkaXN0YW5jZSByYW5nZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lECiAgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVECisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEgICAgICA9IDExLAogCiAgICAgLyoqCiAgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKLSAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogYW5kIGZvciBZVVZfNDIwXzg4OCBzdHJlYW0sIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIDxwPkEgTU9OT0NIUk9NRSBjYW1lcmEgbXVzdCBzdXBwb3J0IHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yCisgICAgICogaXRzIGRldmljZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLiBBZGRpdGlvbmFsbHksIGlmIHRoZSBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBzdXBwb3J0cyBZOCBmb3JtYXQsIGFsbCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyByZWxhdGVkIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSBhcHBseQorICAgICAqIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBhcyB3ZWxsLiBUaGVyZSBhcmUgbm8KKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyB3aXRoIHJlZ2FyZCB0bworICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBmb3IgQmF5ZXIgY2FtZXJhIGRldmljZXMuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGUgU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UIG9mIGEgTU9OT0NIUk9NRQorICAgICAqIGNhbWVyYSB3aWxsIGJlIGVpdGhlciBNT05PIG9yIE5JUi48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGltYWdlIGRhdGEgaW50byBhIHJlZ2lvbiBvZiBtZW1vcnkKKyAgICAgKiBpbmFjY2Vzc2libGUgdG8gQW5kcm9pZCB1c2Vyc3BhY2Ugb3IgdGhlIEFuZHJvaWQga2VybmVsLCBhbmQgb25seSBhY2Nlc3NpYmxlIHRvCisgICAgICogdHJ1c3RlZCBleGVjdXRpb24gZW52aXJvbm1lbnRzIChURUUpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQSAgICAgICAgID0gMTMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKIApAQCAtNzI5NCw2ICs3NzMyLDY3IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdDsKIAorLy8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IG11c3Qgb25seSBpbmNsdWRlIG5vbi1zdGFsbGluZyBwcm9jZXNzZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaWtlIFlVVl80MjBfODg4LCBJTVBMRU1FTlRBVElPTl9ERUZJTkVELCBldGMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gcmVjb3JkIG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgdGhhdCBtYXRjaCB0aGUgYWR2ZXJ0aXNlZAorICAgICAqIHN1cHBvcnRlZCBtZWRpYSBwcm9maWxlcyA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwiPkNhbWNvcmRlclByb2ZpbGU8L2E+IHdpdGgKKyAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGZvcm1hdC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPlZpZGVvIHNuYXBzaG90IG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXQgbGVhc3QgYXMgYmlnIGFzCisgICAgICogdGhlIG1heGltdW0gUkVDT1JEIHJlc29sdXRpb25zIGFuZCBvbmx5IHdpdGggZm9ybWF0IEJMT0IgKyBEQVRBU1BBQ0VfSkZJRgorICAgICAqIGZvcm1hdC9kYXRhc3BhY2UgY29tYmluYXRpb24gKEpQRUcpLiBBZGRpdGlvbmFsbHkgdGhlIGNvbmZpZ3VyYXRpb25zIHNob3VsZG4ndCBjYXVzZQorICAgICAqIHByZXZpZXcgZ2xpdGNoZXMgYW5kIGFsc28gYmUgYWJsZSB0byBydW4gYXQgMzAgZnBzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZJREVPX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzbmFwc2hvdCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSB3aXRoCisgICAgICogc2l6ZSBjbG9zZSB0byBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIHdpdGggQkxPQiArIERBVEFTUEFDRV9KRklGCisgICAgICogZm9ybWF0L2RhdGFzcGFjZSBjb21iaW5hdGlvbiAoSlBFRykuIFRha2luZyBpbnRvIGFjY291bnQgcmVzdHJpY3Rpb25zIG9uIGFzcGVjdAorICAgICAqIHJhdGlvLCBhbGlnbm1lbnQgZXRjLiB0aGUgYXJlYSBvZiB0aGUgbWF4aW11bSBzdWdnZXN0ZWQgc2l6ZSBzaG91bGRu4oCZdCBiZSBsZXNzIHRoYW4KKyAgICAgKiA5NyUgb2YgdGhlIHNlbnNvciBhcnJheSBzaXplIGFyZWEuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzLAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCByZWNvbW1lbmRlZCBpbnB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGJlIGFkdmVydGlzZWQgd2l0aAorICAgICAqIFpTTCBhbG9uZyB3aXRoIG90aGVyIHByb2Nlc3NlZCBhbmQvb3Igc3RhbGxpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfWlNMICAgPSAweDQsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIHJhdyBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGluY2x1ZGUgUkFXIGJhc2VkCisgICAgICogb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkFXICAgPSAweDUsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BVQkxJQ19FTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NiwKKworICAgIC8qKgorICAgICAqIDxwPlZlbmRvciBkZWZpbmVkIHVzZSBjYXNlcy4gVGhlc2UgZGVwZW5kIG9uIHRoZSB2ZW5kb3IgaW1wbGVtZW50YXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVkVORE9SX1NUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE4LAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3JlZmVyZW5jZV9pbGx1bWluYW50MSB7CkBAIC03NDcwLDYgKzc5NjksMjEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9SR0IgICAgICAgICAgICAgICAgID0gNCwKIAorICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBkb2Vzbid0IGhhdmUgYW55IEJheWVyIGNvbG9yIGZpbHRlci4KKyAgICAgKiBTdWNoIHNlbnNvciBjYXB0dXJlcyB2aXNpYmxlIGxpZ2h0IGluIG1vbm9jaHJvbWUuIFRoZSBleGFjdCB3ZWlnaHRpbmcgYW5kCisgICAgICogd2F2ZWxlbmd0aHMgY2FwdHVyZWQgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBvbmx5IGluY2x1ZGVzIHRoZSB2aXNpYmxlCisgICAgICogZnJlcXVlbmNpZXMuIFRoaXMgdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9NT05PICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBoYXMgYSBuZWFyIGluZnJhcmVkIGZpbHRlciBjYXB0dXJpbmcgbGlnaHQgd2l0aCB3YXZlbGVuZ3RoIGJldHdlZW4KKyAgICAgKiByb3VnaGx5IDc1MG5tIGFuZCAxNDAwbm0sIGFuZCB0aGUgc2FtZSBmaWx0ZXIgY292ZXJzIHRoZSB3aG9sZSBzZW5zb3IgYXJyYXkuIFRoaXMKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX05JUiAgICAgICAgICAgICAgICAgPSA2LAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9pbmZvX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90OwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UKQEAgLTc4OTgsNiArODQxMiwxNiBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90OwogCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZSB7CkBAIC03OTQxLDYgKzg0NjUsMTYgQEAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGlzdG9ydGlvbl9jb3JyZWN0aW9uX21vZGVfdDsKIAogCisvLyBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKworCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKKyNkZWZpbmUgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorCisvKioKKyAqIEBhZGR0b2dyb3VwIENhbWVyYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka0NhbWVyYVdpbmRvd1R5cGUuaAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93IHR5cGUgdXNlZCBieSBOREsgYW5kIHRoZSBWTkRLIHZhcmlhbnRzIG9mIHRoZQorICogY2FtZXJhMiBOREsuIFRoaXMgZW5hYmxlcyB1cyB0byBzaGFyZSB0aGUgYXBpIGRlZmluaXRpb24gaGVhZGVycyBhbmQgYXZvaWQKKyAqIGNvZGUgZHVwbGljYXRpb24gKHNpbmNlIHRoZSBWTkRLIHZhcmlhbnQgZG9lc24ndCB1c2UgQU5hdGl2ZVdpbmRvdyB1bmxpa2UgdGhlCisgKiBOREsgdmFyaWFudCkuCisgKi8KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KK3R5cGVkZWYgbmF0aXZlX2hhbmRsZV90IEFDYW1lcmFXaW5kb3dUeXBlOworI2Vsc2UKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KK3R5cGVkZWYgQU5hdGl2ZVdpbmRvdyBBQ2FtZXJhV2luZG93VHlwZTsKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNTM0MGU3Ni4uMTM2OTg5YSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtMzUsOSArMzUsOSBAQAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0gKICNkZWZpbmUgX05ES19DQVBUVVJFX1JFUVVFU1RfSApAQCAtMTAxLDcgKzEwMSw3IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0CiAgKi8KLWNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBTmF0aXZlV2luZG93KiB3aW5kb3csCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywKICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dCBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CmluZGV4IGEyOWU5NmQuLjVhMDAwMjIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CisrKyBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CkBAIC0yLDkgKzIsMTEgQEAKICAgZ2xvYmFsOgogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9hYm9ydENhcHR1cmVzOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fZ2V0RGV2aWNlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3Q7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CkBAIC0yNCw2ICsyNiw3IEBACiAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWU7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldEFsbFRhZ3M7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnk7CisgICAgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZTsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldDsKQEAgLTQ4LDYgKzUxLDcgQEAKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobVdpbmRvdyA9PSBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8YW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI+IG1TaGFyZWRXaW5kb3dzOworICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKKyAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOworfTsKKworCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYWZjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMCwwICsxLDE1OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFEZXZpY2VWZW5kb3IiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRXJyb3JDb2RlS2V5ICAgICAgPSAiRXJyb3JDb2RlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhbGxiYWNrRnBLZXkgICAgID0gIkNhbGxiYWNrIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1Nlc3Npb25TcEtleSAgICAgID0gIlNlc3Npb25TcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQW53S2V5ICAgICAgICAgICAgPSAiQW53IjsKKworLyoqCisgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KKyAqLworQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgorICAgICAgICBtQ2FtZXJhSWQoaWQpLAorICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCisgICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKKyAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCisgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKKyAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAorICAgICAgICBtSWRsZSh0cnVlKSwKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uKG51bGxwdHIpIHsKKyAgICBtQ2xvc2luZyA9IGZhbHNlOworICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBkZXZpY2UgY2FsbGJhY2tzIHRvIGFwcAorICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLWRldi1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMSkgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHBhcnRpYWwgcmVzdWx0IGNvdW50IiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBzaGFkaW5nIG1hcCBzaXplIiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IDA7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IGVudHJ5LmRhdGEuaTMyWzFdOworICAgIH0KK30KKworLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCitDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgICAgIGlmICghaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgZGlzY29ubmVjdExvY2tlZChzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtc2cuY2xlYXIoKTsKKyAgICBzcDxBTWVzc2FnZT4gY2xlYW51cE1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsZWFuVXBTZXNzaW9ucywgbUhhbmRsZXIpOworICAgIGNsZWFudXBNc2ctPnBvc3QoKTsKK30KKworLy8gVE9ETzogY2FjaGVkIGNyZWF0ZWQgcmVxdWVzdD8KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdSZXF1ZXN0OworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICBbJnN0YXR1cywgJnJhd1JlcXVlc3RdKGF1dG8gcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SICYmIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdSZXF1ZXN0KSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRlZmF1bHQgcmVxdWVzdCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG91dFJlcSA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBvdXRSZXEtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShyYXdSZXF1ZXN0LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgb3V0UmVxLT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgICpyZXF1ZXN0ID0gb3V0UmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBjdXJyZW50U2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgY3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBuZXcgc2Vzc2lvbgorICAgIHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiRmFpbCB0byBjcmVhdGUgbmV3IHNlc3Npb24uIGNhbm5vdCBjb25maWd1cmUgc3RyZWFtcyIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbmV3U2Vzc2lvbiA9IG5ldyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBtTmV4dFNlc3Npb25JZCsrLCBvdXRwdXRzLCBjYWxsYmFja3MsIHRoaXMpOworCisgICAgLy8gc2V0IG5ldyBzZXNzaW9uIGFzIGN1cnJlbnQgc2Vzc2lvbgorICAgIG5ld1Nlc3Npb24tPmluY1N0cm9uZygodm9pZCAqKSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uKTsKKyAgICBtQ3VycmVudFNlc3Npb24gPSBuZXdTZXNzaW9uOworICAgIG1GbHVzaGluZyA9IGZhbHNlOworICAgICpzZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OmFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LAorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSkgeworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IGFDYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFfbWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhX21ldGFkYXRhLCAmaENhbWVyYU1ldGFkYXRhKTsKKyAgICBtZXRhZGF0YUNvcHkudW5sb2NrKGNhbWVyYV9tZXRhZGF0YSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUoMSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YShzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghb3V0cHV0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIG91dHB1dCBjb25maWd1cmF0aW9uIGlzIG5vdCBzaGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChrdlBhaXIuc2Vjb25kLmZpcnN0LCBvdXRwdXQtPm1XaW5kb3cpKSB7CisgICAgICAgICAgICBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBJbnZhbGlkIG91dHB1dCBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ1c7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnID0gb3V0Q29uZmlnVy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICBvdXRDb25maWcucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQtPm1Sb3RhdGlvbik7CisgICAgb3V0Q29uZmlnLndpbmRvd0dyb3VwSWQgPSAtMTsgLy8gbmRrIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlciBPdXRwdXRDb25maWd1cmF0aW9uIGJ1ZmZlciBzaGFyaW5nLgorICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIG91dENvbmZpZy5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBpbnQgaSA9IDE7CisgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzW2krK10gPSBhbnc7CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRDb25maWcpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIHVwZGF0aW5nIE91dHB1dENvbmZpZ3VyYXRpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbW90ZVJldCkgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgb3BlcmF0aW9uIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgb3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGFkZCBzaGFyZWQgb3V0cHV0IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6YWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+ICZvdXRSZXEpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLmlkID0gbUNhbWVyYUlkOworICAgIC8vIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIGNvcHkgdGhlIG1ldGFkYXRhIGhlcmUgPworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhTWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhTWV0YWRhdGEsICZoQ2FtZXJhTWV0YWRhdGEpOworICAgIG1ldGFkYXRhQ29weS51bmxvY2soY2FtZXJhTWV0YWRhdGEpOworICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5zaXplKCkpKSB7CisgICAgICAgICAgICAvLyBUaGUgbWV0YWRhdGEgZmllbGQgb2YgdGhlIHVuaW9uIHdvdWxkJ3ZlIGJlZW4gZGVzdHJ1Y3R1ZWQsIHNvIG5vIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIHJlLXNpemUgaXQuCisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGbXEgd3JpdGUgY2FwdHVyZSByZXN1bHQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiKTsKKyAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN0cmVhbUlkeExpc3Q7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN1cmZhY2VJZHhMaXN0OworICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dHB1dFRhcmdldC5tV2luZG93OworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHJlcS0+bVN1cmZhY2VMaXN0LnB1c2hfYmFjayhhbncpOworICAgICAgICAvLyBsb29rdXAgc3RyZWFtL3N1cmZhY2UgSUQKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyJiBvdXRDb25maWcgPSBrdlBhaXIuc2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRDb25maWcubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgICAgIGZvciAoaW50IHN1cmZhY2VJZCA9IDA7IHN1cmZhY2VJZCA8IChpbnQpIHdpbmRvd0hhbmRsZXMuc2l6ZSgpOyBzdXJmYWNlSWQrKykgeworICAgICAgICAgICAgICAgIC8vIElmIHR3byBuYXRpdmUgaGFuZGxlcyBhcmUgZXF1aXZhbGVudCwgc28gYXJlIHRoZWlyIHN1cmZhY2VzLgorICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3N1cmZhY2VJZF0uZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbncpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5jb25maWd1cmVkIG91dHB1dCB0YXJnZXQgJXAgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIGFudyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMucmVzaXplKHJlcXVlc3RTdHJlYW1JZHhMaXN0LnNpemUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHNbaV0uc3RyZWFtSWQgPSByZXF1ZXN0U3RyZWFtSWR4TGlzdFtpXTsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLndpbmRvd0lkID0gcmVxdWVzdFN1cmZhY2VJZHhMaXN0W2ldOworICAgIH0KKyAgICBvdXRSZXEgPSByZXE7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0FDYXB0dXJlUmVxdWVzdCoKK0NhbWVyYURldmljZTo6YWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpIHsKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIHBSZXF1ZXN0ID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOworICAgIENhbWVyYU1ldGFkYXRhIGNsb25lOworICAgIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YSgpLCAmY2xvbmUpOworICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gcmVxLT5tU3VyZmFjZUxpc3RbaV07CisgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQgb3V0cHV0VGFyZ2V0KGFudyk7CisgICAgICAgIHBSZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cy5pbnNlcnQob3V0cHV0VGFyZ2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHBSZXF1ZXN0OworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0KiByZXEpIHsKKyAgICBpZiAocmVxID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKKyAgICBkZWxldGUgcmVxOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6Om5vdGlmeVNlc3Npb25FbmRPZkxpZmVMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CisgICAgaWYgKGlzQ2xvc2VkKCkpIHsKKyAgICAgICAgLy8gRGV2aWNlIGlzIGNsb3NpbmcgYWxyZWFkeS4gZG8gbm90aGluZworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgb3RoZXIgc2Vlc2lvbiBvciBkZXZpY2UgaXMgY2xvc2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKworICAgIC8vIFNob3VsZCBub3QgaGFwcGVuCisgICAgaWYgKCFzZXNzaW9uLT5tSXNDbG9zZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiB1bmNsb3NlZCBzZXNzaW9uICVwIHJlYWNoZXMgZW5kIG9mIGxpZmUhIiwgc2Vzc2lvbik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBObyBuZXcgc2Vzc2lvbiwgdW5jb25maWd1cmUgbm93CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZSBzdHJlYW0gZmFpbGVkLiBEZXZpY2UgbWlnaHQgc3RpbGwgYmUgY29uZmlndXJlZCEgcmV0ICVkIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZGlzY29ubmVjdExvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgaWYgKG1DbG9zaW5nLmV4Y2hhbmdlKHRydWUpKSB7CisgICAgICAgIC8vIEFscmVhZHkgY2xvc2luZywganVzdCByZXR1cm4KKyAgICAgICAgQUxPR1coIkNhbWVyYSBkZXZpY2UgJXMgaXMgYWxyZWFkeSBjbG9zaW5nLiIsIGdldElkKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SZW1vdGUgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoaWxlIGRpc2Nvbm5lY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVJlbW90ZSA9IG51bGxwdHI7CisKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzdG9wUmVwZWF0aW5nTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBtUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZsYXN0RnJhbWVOdW1iZXJdKFN0YXR1cyBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNhbmNlbCBhY3RpdmUgcmVwZWF0aW5nIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgYWJvcnQgY2FwdHVyZXMgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQorICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KKyAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgorICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmcpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBpcyBhbHJlYWR5IGFib3J0aW5nIGNhcHR1cmVzIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIG1GbHVzaGluZyA9IHRydWU7CisKKyAgICAvLyBTZW5kIG9uQWN0aXZlIGNhbGxiYWNrIHRvIGd1YXJhbnRlZSB0aGVyZSBpcyBhbHdheXMgYWN0aXZlLT5yZWFkeSB0cmFuc2l0aW9uCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgLy8gSWYgZGV2aWNlIGlzIGFscmVhZHkgaWRsaW5nLCBzZW5kIGNhbGxiYWNrIGFuZCBleGl0IGVhcmx5CisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5mbHVzaChbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oYXV0byBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IEFib3J0IGNhcHR1cmVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKG1SZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OndhaXRVbnRpbElkbGVMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiV2FpdCB1bnRpbCBjYW1lcmEgJXMgaWRsZSBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3b24ndCBnbyB0byBpZGxlIHdoZW4gdGhlcmUgaXMgcmVwZWF0aW5nIHJlcXVlc3QhIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+d2FpdFVudGlsSWRsZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIHdhaXRVbnRpbElkbGUgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycykgeworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciBlbXB0eU91dHB1dDsKKyAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyKSB7CisgICAgICAgIG91dHB1dHMgPSAmZW1wdHlPdXRwdXQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG91dHB1dFNldDsKKyAgICBmb3IgKGF1dG8gb3V0Q29uZmlnIDogb3V0cHV0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRDb25maWcubVdpbmRvdzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgb3V0Q29uZmlnSW5zZXJ0VzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnSW5zZXJ0ID0gb3V0Q29uZmlnSW5zZXJ0Vy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0Q29uZmlnLm1Sb3RhdGlvbik7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dHcm91cElkID0gLTE7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRDb25maWcubVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzWzBdID0gYW53OworICAgICAgICBvdXRDb25maWdJbnNlcnQucGh5c2ljYWxDYW1lcmFJZCA9IG91dENvbmZpZy5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB3cmFwKGFudyk7CisgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYW53LCBvdXRDb25maWdJbnNlcnRXKSk7CisgICAgfQorICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IGFkZFNldCA9IG91dHB1dFNldDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkZWxldGVMaXN0OworCisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHN0cmVhbXMgbmVlZCB0byBiZSBjcmVhdGVkLCB3aGljaCB0byBiZSBkZWxldGVkCisgICAgZm9yIChhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgYXV0byYgb3V0cHV0UGFpciA9IGt2UGFpci5zZWNvbmQ7CisgICAgICAgIGlmIChvdXRwdXRTZXQuY291bnQob3V0cHV0UGFpcikpIHsKKyAgICAgICAgICAgIGRlbGV0ZUxpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsgLy8gTmVlZCB0byBkZWxldGUgYSBubyBsb25nZXIgbmVlZGVkIHN0cmVhbQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkU2V0LmVyYXNlKG91dHB1dFBhaXIpOyAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgYWxyZWFkeSBleGlzdGluZyBzdHJlYW0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd2FpdCB1bnRpbCBpZGxlIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBTZW5kIG9uUmVhZHkgdG8gcHJldmlvdXMgc2Vzc2lvbgorICAgIC8vIEN1cnJlbnRTZXNzaW9uIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBjb25maWd1cmVTdHJlYW1Mb2NrZWQsIHNvIGhlcmUKKyAgICAvLyBtQ3VycmVudFNlc3Npb24gaXMgdGhlIHNlc3Npb24gdG8gYmUgcmVwbGFjZWQgYnkgYSBuZXcgc2Vzc2lvbgorICAgIGlmICghbUlkbGUgJiYgbUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1CdXN5U2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICAgICAgICAgIEFMT0dFKCJDdXJyZW50IHNlc3Npb24gIT0gYnVzeSBzZXNzaW9uIik7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBtQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgbUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IHRydWU7CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmJlZ2luQ29uZmlndXJlKCk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgYmVnaW4gY29uZmlndXJlIGZhaWxlZCIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgIH0KKworICAgIC8vIGRlbGV0ZSB0by1iZS1kZWxldGVkIHN0cmVhbXMKKyAgICBmb3IgKGF1dG8gc3RyZWFtSWQgOiBkZWxldGVMaXN0KSB7CisgICAgICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCByZW1vdGVSZXQgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIHJlbW92ZSBzdHJlYW0gJWQiLCBnZXRJZCgpLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5lcmFzZShzdHJlYW1JZCk7CisgICAgfQorCisgICAgLy8gYWRkIG5ldyBzdHJlYW1zCisgICAgZm9yIChhdXRvIG91dHB1dFBhaXIgOiBhZGRTZXQpIHsKKyAgICAgICAgaW50IHN0cmVhbUlkOworICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRQYWlyLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzdHJlYW1JZF0oU3RhdHVzIHMsIGF1dG8gc3RyZWFtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW1faWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBjcmVhdGUgc3RyZWFtIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIG91dHB1dFBhaXIpKTsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBwYXJhbXM7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxQYXJhbXM7CisgICAgaWYgKChzZXNzaW9uUGFyYW1ldGVycyAhPSBudWxscHRyKSAmJiAoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzICE9IG51bGxwdHIpKSB7CisgICAgICAgIHBhcmFtcy5hcHBlbmQoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSk7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpwYXJhbXNfbWV0YWRhdGEgPSBwYXJhbXMuZ2V0QW5kTG9jaygpOworICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbChwYXJhbXNfbWV0YWRhdGEsICZoaWRsUGFyYW1zKTsKKyAgICAgICAgcGFyYW1zLnVubG9jayhwYXJhbXNfbWV0YWRhdGEpOworICAgIH0KKyAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFLCBoaWRsUGFyYW1zKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yOiBlbmRDb25maWd1cmUgZmFpbGVkICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgbVJlbW90ZSA9IHJlbW90ZTsKK30KKworYm9vbAorQ2FtZXJhRGV2aWNlOjpzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpIHsKKyAgICAgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgIEFMT0dFKCJtUmVtb3RlIG11c3Qgbm90IGJlIG51bGwgd2hpbGUgdHJ5aW5nIHRvIGZldGNoIG1ldGFkYXRhIHF1ZXVlcyIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+ICZyZXFRdWV1ZSA9IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU7CisgICAgICAgIGF1dG8gcmV0ID0KKyAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgICAgICBbJnJlcVF1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihtcURlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcVF1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVxUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmcmVzUXVldWUgPSBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgbVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVzdWx0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVtcHR5IGZtcSBmcm9tIGNhbWVyYXNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKSBjb25zdCB7CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBpZiAobUluRXJyb3IpIHsvLyB0cmlnZ2VyZWQgYnkgb25EZXZpY2VFcnJvcgorICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBtRXJyb3I7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcikgeworICAgIG1JbkVycm9yID0gdHJ1ZTsKKyAgICBtRXJyb3IgPSBlcnJvcjsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcikgeworICAgIEFMT0dWKCJ1cGRhdGVUcmFja2VyIGZyYW1lICUiIFBSSWQ2NCAiIGlzRXJyb3IgJWQiLCBmcmFtZU51bWJlciwgaXNFcnJvcik7CisgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgICAgbUZ1dHVyZUVycm9yU2V0Lmluc2VydChmcmFtZU51bWJlcik7CisgICAgfSBlbHNlIGlmIChmcmFtZU51bWJlciA8PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lIG51bWJlciAlIiBQUklkNjQgIiBkZWNyZWFzZWQhIGN1cnJlbnQgZm4gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtQ29tcGxldGVkRnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgb3V0IG9mIG9yZGVyLiBFeHBlY3QgJSIgUFJJZDY0ICIgYnV0IGdldCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhc3NlcnQgYXMgaW4gamF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAgICB9CisgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIH0KKyAgICB1cGRhdGUoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpGcmFtZU51bWJlclRyYWNrZXI6OnVwZGF0ZSgpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlRXJyb3JTZXQuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZUVycm9yU2V0LmVuZCgpOykgeworICAgICAgICBpbnQ2NF90IGVycm9yRnJhbWVOdW1iZXIgPSAqaXQ7CisgICAgICAgIGlmIChlcnJvckZyYW1lTnVtYmVyID09IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlcisrOworICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgaWYgKGVycm9yRnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZGVhbCB3aXRoIGl0IGFueXdheQorICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRkIGZyYW1lIG51bWJlciBwYXNzZWQgdGhyb3VnaCBjdXJyZW50IGZyYW1lIG51bWJlciEiKTsKKyAgICAgICAgICAgIC8vIGVyYXNlIHRoZSBvbGQgZXJyb3Igc2luY2UgaXQncyBubyBsb25nZXIgdXNlZnVsCisgICAgICAgICAgICBpdCA9IG1GdXR1cmVFcnJvclNldC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3JtYWwgcmVxdWVzdHMgaGFzbid0IGNhdGNoZWQgdXAgZXJyb3IgZnJhbWVzLCBqdXN0IGJyZWFrCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiVXBkYXRlIGNvbXBsZXRlIGZyYW1lICUiIFBSSWQ2NCwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpvbkNhcHR1cmVFcnJvckxvY2tlZCgKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgaW50IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYXV0byBpdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ID09IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGNhcHR1cmUgc2VxdWVuY2UgaW5kZXggJWQgbm90IGZvdW5kISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisKKyAgICAvLyBIYW5kbGUgYnVmZmVyIGVycm9yCisgICAgaWYgKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVIpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKSBhbncpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBIYW5kbGUgb3RoZXIgY2FwdHVyZSBmYWlsdXJlcworICAgICAgICAvLyBGaXJlIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUgcmVnaXN0ZXJlZAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkVycm9yID0gY2JoLm1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlKG5ldyBDYW1lcmFDYXB0dXJlRmFpbHVyZSgpKTsKKyAgICAgICAgZmFpbHVyZS0+ZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgLy8gVE9ETzogcmVmaW5lIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgZmx1c2gKKyAgICAgICAgZmFpbHVyZS0+cmVhc29uICAgICAgPSBDQVBUVVJFX0ZBSUxVUkVfUkVBU09OX0VSUk9SOworICAgICAgICBmYWlsdXJlLT5zZXF1ZW5jZUlkICA9IHNlcXVlbmNlSWQ7CisgICAgICAgIGZhaWx1cmUtPndhc0ltYWdlQ2FwdHVyZWQgPSAoZXJyb3JDb2RlID09IEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCBmYWlsdXJlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKKyAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBDaGVjayB0aGUgY29tbW9uIHBhcnQgb2YgYWxsIG1lc3NhZ2UKKyAgICB2b2lkKiBjb250ZXh0OworICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2sgb25EaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkRpc2Nvbm5lY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbkRpc2Nvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkRpc2Nvbm5lY3RlZCkoY29udGV4dCwgZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXY7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKikgJmRldik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IGRldiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBkZXZpY2UgcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrIG9uRXJyb3I7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkVycm9yKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG9uRXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrRXJyb3JDb2RlS2V5LCAmZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGVycm9yIGNvZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25FcnJvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkVycm9yKShjb250ZXh0LCBkZXYsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Nlc3Npb25TcEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXNzaW9uIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24oc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVTZXNzaW9uKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMucHVzaChzZXNzaW9uKTsKKyAgICAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0U3AgPSBudWxscHRyOworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwID0gc3RhdGljX2Nhc3Q8Q2FwdHVyZVJlcXVlc3QqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrIG9uU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHN0YXRlIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TdGF0ZSkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtUaW1lU3RhbXBLZXksICZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBwaHlzaWNhbFJlc3VsdEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0LT5tUGh5c2ljYWxSZXN1bHRJbmZvOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QUNhbWVyYU1ldGFkYXRhPj4gcGh5c2ljYWxNZXRhZGF0YUNvcHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbFJlc3VsdC0+bUZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHkucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVGYWlsdXJlKj4oZmFpbHVyZVNwLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG9uU2VxRW5kOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUVuZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxRW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUVuZCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25TZXFBYm9ydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFBYm9ydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxQWJvcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxQWJvcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBvbkJ1ZmZlckxvc3Q7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgYnVmZmVyIGxvc3QgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25CdWZmZXJMb3N0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKikgJmFudyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbmF0aXZlX2hhbmRsZV90ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhsY2JzKTsKKworICAgIGlmIChsY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIsCisgICAgICAgICAgICBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVzdWx0RXh0cmFzLmJ1cnN0SWQpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW1lcmEgaXMgZGlzY29ubmVjdGVkLCBjbG9zZSB0aGUgc2Vzc2lvbiBhbmQgZXhwZWN0IG5vIG1vcmUgY2FsbGJhY2tzCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRGlzY29ubmVjdGVkLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBlcnJvciBmcm9tIGNhbWVyYSBkZXZpY2U6ICVkIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhpcyBzd2l0Y2ggc2luY2UgdGhpcyBibG9jayBtaWdodCBiZSBlbmNvdW50ZXJlZCB3aXRoCisgICAgICAgICAgICAvLyBtb3JlIHRoYW4ganVzdCAyIHN0YXRlcy4gVGhlIGRlZmF1bHQgZmFsbHRocm91Z2ggY291bGQgaGF2ZSB1cworICAgICAgICAgICAgLy8gaGFuZGxpbmcgbW9yZSB1bm1hdGNoZWQgZXJyb3IgY2FzZXMuCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRXJyb3IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRXJyb3IpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrRXJyb3JDb2RlS2V5LCBlcnJvclZhbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgZGV2LT5vbkNhcHR1cmVFcnJvckxvY2tlZChlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBBTE9HVigiQ2FtZXJhIGlzIG5vdyBpZGxlIik7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUlkbGUpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBpbiBpZGxlIHN0YXRlLiBQb3NzaWJseSBvdGhlciB0aHJlYWQgZGlkIHdhaXRVbnRpbElkbGUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgib25EZXZpY2VJZGxlIHNlbmRpbmcgc3RhdGUgY2IiKTsKKyAgICAgICAgaWYgKGRldi0+bUJ1c3lTZXNzaW9uICE9IGRldi0+bUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgc3AgZmlyc3Qgc28gdGhlIHNlc3Npb24gZGVzdHJ1Y3RvciBjYW4KKyAgICAgICAgLy8gb25seSBoYXBwZW4gb24gaGFuZGxlciB0aHJlYWQgKHdoZXJlIHdlIGRvbid0IGhvbGQgZGV2aWNlL3Nlc3Npb24gbG9jaykKKyAgICAgICAgZGV2LT5tQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgZGV2LT5tSWRsZSA9IHRydWU7CisgICAgZGV2LT5tRmx1c2hpbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYm9vbCAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IGRldi0+bVBhcnRpYWxSZXN1bHRDb3VudCk7CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBBTE9HVigiU2VxSWQgJWQgZnJhbWUgJSIgUFJJZDY0ICIgcmVzdWx0IGFycml2ZS4iLCBzZXF1ZW5jZUlkLCBmcmFtZU51bWJlcik7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgfQorCisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSkgeworICAgICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIGVhcmx5IHJldHVybiB0byBhdm9pZCBjYWxsYmFjayBzZW50IHRvIGNsb3NlZCBkZXZpY2VzCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5OworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocmVzdWx0TWV0YWRhdGEsCisgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwgJm1ldGFkYXRhQ29weSk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLCBkZXYtPm1TaGFkaW5nTWFwU2l6ZSwgLypkYXRhX2NvdW50Ki8yKTsKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsICZmcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IGxvY2FsUGh5c2ljYWxSZXN1bHQ7CisgICAgICAgIGxvY2FsUGh5c2ljYWxSZXN1bHQucmVzaXplKHBoeXNpY2FsUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsQ2FtZXJhSWQgPSBwaHlzaWNhbFJlc3VsdEluZm9zW2ldLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgJmxvY2FsUGh5c2ljYWxSZXN1bHRbaV0ucGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEgY291bGRuJ3QgYmUgY29udmVydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8obG9jYWxQaHlzaWNhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKAorICAgICAgICAgICAgICAgIGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sgPyBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0IDoga1doYXRDYXB0dXJlUmVzdWx0LAorICAgICAgICAgICAgICAgIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgcmVzdWx0KTsKKyAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlUHJvZ3Jlc3NlZCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCBwaHlzaWNhbFJlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICB9CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICBkZXYtPmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgIHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKworICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICBpZiAoc3RvcHBlZFNlcXVlbmNlSWQgPT0gcmVwZWF0aW5nU2VxdWVuY2VJZCkgeworICAgICAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIH0KKworICAgIGRldi0+Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6OnJlYWRPbmVSZXN1bHRNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIGZtcVNpemVPck1ldGFkYXRhLCBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIHsKKyAgICBpZiAobWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyIHx8IG1ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGJvb2wgY29udmVydGVkOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKGZtcVNpemVPck1ldGFkYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5yZXNpemUoZm1xU2l6ZU9yTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBib29sIHJlYWQgPSBtZXRhZGF0YVF1ZXVlLT5yZWFkKAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5kYXRhKCksIGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2xvbmUgaGVyZSA/CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoaENhbWVyYU1ldGFkYXRhLCBtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChmbXFTaXplT3JNZXRhZGF0YS5tZXRhZGF0YSgpLCBtZXRhZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1VOS05PV047Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTcxNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0FDQU1FUkFfREVWSUNFX0gKKyNkZWZpbmUgX0FDQU1FUkFfREVWSUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEZtcVNpemVPck1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKK3VzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIHV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyOwordXNpbmcgdXRpbHM6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgdXRpbHM6Ok91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyOworCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHsgfTsKKworLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsIHsKKyAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsTWV0YWRhdGE7Cit9OworCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBpbmZvLAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcikgOgorICAgICAgICBtUGh5c2ljYWxSZXN1bHRJbmZvKGluZm8pLCBtRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIpIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCitjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpOworICAgIH5DYW1lcmFEZXZpY2UoKTsKKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFJZC5jX3N0cigpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0OworCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOworCisgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKKyAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgSUNhbWVyYURldmljZUNhbGxiYWNrIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgU2VydmljZUNhbGxiYWNrKENhbWVyYURldmljZSogZGV2aWNlKSA6IG1EZXZpY2UoZGV2aWNlKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlRXJyb3IoRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcih1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgb3ZlcnJpZGU7CisgICAgICBwcml2YXRlOgorICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmVhZE9uZVJlc3VsdE1ldGFkYXRhKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLCBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpOworICAgICAgICBjb25zdCB3cDxDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CisgICAgfTsKKyAgICBpbmxpbmUgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBnZXRTZXJ2aWNlQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtU2VydmljZUNhbGxiYWNrOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgdm9pZCBzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSk7CisKKyAgICBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgaW5saW5lIEFDYW1lcmFEZXZpY2UqIGdldFdyYXBwZXIoKSBjb25zdCB7IHJldHVybiBtV3JhcHBlcjsgfTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CisKKyAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKKyAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbik7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorCisgICAgY2FtZXJhX3N0YXR1c190IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CisKKyAgICB2b2lkIGFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICAvLyBTaW5jZSB0aGlzIHdyaXRlcyB0byBJQ2FtZXJhRGV2aWNlVXNlcidzIGZtcSwgY2xpZW50cyBtdXN0IHRha2UgY2FyZSB0aGF0OgorICAgIC8vICAgYSkgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc2VyaWFsbHkuCisgICAgLy8gICBiKSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhY2NvcmRhbmNlIHdpdGggSUNhbWVyYURldmljZVVzZXIuc3VibWl0UmVxdWVzdExpc3QsCisgICAgLy8gICAgICBvdGhlcndpc2UsIHRoZSB3cm9uZyBjYXB0dXJlIHJlcXVlc3QgbWlnaHQgaGF2ZSB0aGUgd3Jvbmcgc2V0dGluZ3MKKyAgICAvLyAgICAgIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOworCisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOworICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CisKKyAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKKyAgICAvLyBBbHdheXMgZ3JhYiBkZXZpY2UgbG9jayBiZWZvcmUgZ3JhYmJpbmcgc2Vzc2lvbiBsb2NrCisgICAgdm9pZCBsb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpIGNvbnN0IHsgbURldmljZUxvY2subG9jaygpOyB9OworICAgIHZvaWQgdW5sb2NrRGV2aWNlKCkgY29uc3QgeyBtRGV2aWNlTG9jay51bmxvY2soKTsgfTsKKworICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQorICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKworICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCisgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKKyAgICBjb25zdCBoaWRsX3N0cmluZyBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKKyAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAorICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOworICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOworCisgICAgLy8gc3RyZWFtIGlkIC0+IHBhaXIgb2YgKEFDYW1lcmFXaW5kb3dUeXBlKiBmcm9tIGFwcGxpY2F0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uIHVzZWQgZm9yCisgICAgLy8gY2FtZXJhIHNlcnZpY2UpCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBtQ29uZmlndXJlZE91dHB1dHM7CisKKyAgICAvLyBUT0RPOiBtYXliZSBhIGJvb2wgd2lsbCBzdWZmaWNlIGZvciBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICBzdGQ6OmF0b21pY19ib29sIG1DbG9zaW5nOworICAgIGlubGluZSBib29sIGlzQ2xvc2VkKCkgeyByZXR1cm4gbUNsb3Npbmc7IH0KKworICAgIGJvb2wgbUluRXJyb3IgPSBmYWxzZTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgbUVycm9yID0gQUNBTUVSQV9PSzsKKyAgICB2b2lkIG9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICBib29sIG1JZGxlID0gdHJ1ZTsKKyAgICAvLyBUaGlzIHdpbGwgYXZvaWQgYSBidXN5IHNlc3Npb24gYmVpbmcgZGVsZXRlZCBiZWZvcmUgaXQncyBiYWNrIHRvIGlkbGUgc3RhdGUKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1CdXN5U2Vzc2lvbjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBtUmVtb3RlOworCisgICAgLy8gTG9vcGVyIHRocmVhZCB0byBoYW5kbGUgY2FsbGJhY2sgdG8gYXBwCisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyOworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICAvLyBEZXZpY2Ugc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0T25EaXNjb25uZWN0ZWQsICAgLy8gb25EaXNjb25uZWN0ZWQKKyAgICAgICAga1doYXRPbkVycm9yLCAgICAgICAgICAvLyBvbkVycm9yCisgICAgICAgIC8vIFNlc3Npb24gc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKKyAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Vycm9yQ29kZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXNzaW9uU3BLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKKyAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICB9OworICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKKyAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5PX0ZSQU1FU19DQVBUVVJFRCA9IC0xOworICAgIGNsYXNzIEZyYW1lTnVtYmVyVHJhY2tlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIC8vIFRPRE86IENhbGxlZCBpbiBvblJlc3VsdFJlY2VpdmVkIGFuZCBvbkNhcHR1cmVFcnJvckxvY2tlZAorICAgICAgICB2b2lkIHVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKTsKKyAgICAgICAgaW5saW5lIGludDY0X3QgZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKSB7IHJldHVybiBtQ29tcGxldGVkRnJhbWVOdW1iZXI7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlKCk7CisgICAgICAgIHZvaWQgdXBkYXRlQ29tcGxldGVkRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgaW50NjRfdCBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBOT19GUkFNRVNfQ0FQVFVSRUQ7CisgICAgICAgIExpc3Q8aW50NjRfdD4gbVNraXBwZWRGcmFtZU51bWJlcnM7CisgICAgICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1GdXR1cmVFcnJvclNldDsKKyAgICB9OworICAgIEZyYW1lTnVtYmVyVHJhY2tlciBtRnJhbWVOdW1iZXJUcmFja2VyOworCisgICAgdm9pZCBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKworICAgIC8vIE1pc2MgdmFyaWFibGVzCisgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFEZXZpY2Ugb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKKyAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorCisgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykKK3sKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKKyAgICBzdGQ6OnZlY3RvcjxmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiByZXF1ZXN0c1Y7CisgICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIGFmdGVyIHN1Ym1pdFJlcXVlc3RMaXN0IGlzIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUgbWlnaHQgaGF2ZSByZW1vdmVkIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgLy8gbWV0YWRhdGEuIFRoZXJlZm9yZSB3ZSBzaW1wbHkgYWRkIHRoZSBtZXRhZGF0YSB0byBpdHMgd3JhcHBlciBjbGFzcywKKyAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyLgorICAgICAgICBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBjYXB0dXJlIHJlcXVlc3QgdG8gaW50ZXJuYWwgZm9ybWF0IGZhaWx1cmUhIHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2sodXRpbHM6OmNvbnZlcnRUb0hpZGwocmVxLmdldCgpKSk7CisgICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKyAgICB9CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdWJtaXRJbmZvIGluZm87CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5mb10oYXV0byBzLCBhdXRvICZzdWJtaXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc3VibWl0SW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGZvciBzdWJtaXRSZXF1ZXN0TGlzdCBjYWxsOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSBpbmZvLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGluZm8ubGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKKy8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIHZlbmRvciBhdmFpbGFibGUgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZCBieQorICogZGVmYXVsdCBIQUwgaW1wbGVtZW50YXRpb24gY29kZSBhcyB3ZWxsLgorICovCitjbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKTsKK307CisKK3N0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gJnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpIHsKKyAgICBpbnQgdGFnQ291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgdGFnQ291bnQgKz0gdnRzW3NdLnRhZ3Muc2l6ZSgpOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3IgdGFnIHNlY3Rpb25zIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiB0YWdBcnJheTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhZ0FycmF5LnJlc2l6ZSh0YWdDb3VudCkgIT0gdGFnQ291bnQsCisgICAgICAgICAgICAiJXM6IHRvbyBtYW55ICgldSkgdmVuZG9yIHRhZ3MgZGVmaW5lZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKworICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1TZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKyAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKKyAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuZW1wbGFjZSh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVzYy0+bVNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOworICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworCisgICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKKyAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7CisgICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOworICAgIH0KKworICAgICpkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbCYKK0NhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCogaW5zdGFuY2UgPSBzSW5zdGFuY2U7CisgICAgaWYgKGluc3RhbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FtZXJhTWFuYWdlckdsb2JhbCgpOworICAgICAgICBzSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuICppbnN0YW5jZTsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbDo6fkNhbWVyYU1hbmFnZXJHbG9iYWwoKSB7CisgICAgLy8gY2xlYXIgc0luc3RhbmNlIHNvIG5leHQgZ2V0SW5zdGFuY2UgY2FsbCBrbm93cyB0byBjcmVhdGUgYSBuZXcgb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzTG9jayk7CisgICAgc0luc3RhbmNlID0gbnVsbHB0cjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIpOworICAgIH0KKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c2V0dXBWZW5kb3JUYWdzKCkgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBwcm92aWRlcklkc0FuZFZ0czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhbJnN0YXR1cywgJnByb3ZpZGVySWRzQW5kVnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZJZHNBbmRWdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkc0FuZFZ0cyA9IElkc0FuZFZ0czsgfSk7CisKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBWZW5kb3JUYWdTZWN0aW9ucyAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENvbnZlcnQgZWFjaCBwcm92aWRlcnMgVmVuZG9yVGFnU2VjdGlvbnMgaW50byBhIFZlbmRvclRhZ0Rlc2NyaXB0b3IgYW5kCisgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZQorICAgIGZvciAoYXV0byAmcHJvdmlkZXJJZEFuZFZ0cyA6IHByb3ZpZGVySWRzQW5kVnRzKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGlmIChIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHByb3ZpZGVySWRBbmRWdHMudmVuZG9yVGFnU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZW5kb3JUYWdEZXNjcmlwdG9yKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IGZyb20gSGlkbDogVmVuZG9yVGFnRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVySWRBbmRWdHMucHJvdmlkZXJJZCwgdmVuZG9yVGFnRGVzY3JpcHRvcik7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncworICAgICAgICBpZiAoIXNldHVwVmVuZG9yVGFncygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGMgOiBjYW1lcmFTdGF0dXNlcykgeworICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKSB7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICAodm9pZCkgd2hvOworICAgIEFMT0dFKCJDYW1lcmEgc2VydmljZSBiaW5kZXJEaWVkISIpOworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKGNtLT5tTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgICAgICAgIH0KKyAgICAgICAgY20tPm1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyByZS1jb25uZWN0IGNhbGwgaGVyZT8KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6cmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIGF1dG8gcGFpciA9IG1DYWxsYmFja3MuaW5zZXJ0KGNiKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgY2FsbGJhY2tzIGlmIGNhbGxiYWNrIGlzIG5ld2x5IHJlZ2lzdGVyZWQKKyAgICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2IgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlIDogY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2FsbGJhY2stPmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4qIGNhbWVyYUlkcykgeworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgZm9yKGF1dG8mIGRldmljZVN0YXR1cyA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgaWYgKGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQgfHwKKyAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFJZHMtPnB1c2hfYmFjayhkZXZpY2VTdGF0dXMuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6aXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoa0NhbWVyYUlkS2V5LCAmY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIElEISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1c0FuZElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgc3RhdHVzIGNoYW5nZS4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKHN0YXR1c0FuZElkKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWRMb2NrZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIGhpZGxfc3RyaW5nIGNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQ7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0FuZElkLmRldmljZVN0YXR1czsKKyAgICBpZiAoIXZhbGlkU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG9sZFN0YXR1cyA9IGZpcnN0U3RhdHVzID8KKyAgICAgICAgICAgIHN0YXR1cyA6IC8vIGZpcnN0IHN0YXR1cworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF07CisKKyAgICBpZiAoIWZpcnN0U3RhdHVzICYmCisgICAgICAgICAgICBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID09IGlzU3RhdHVzQXZhaWxhYmxlKG9sZFN0YXR1cykpIHsKKyAgICAgICAgLy8gTm8gc3RhdHVzIHVwZGF0ZS4gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBzdGF0dXM7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiRnAgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICBjYi5tQXZhaWxhYmxlIDogY2IubVVuYXZhaWxhYmxlOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8qKgorICogQUNhbWVyYU1hbmdlciBJbXBsZW1lbnRhdGlvbgorICovCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gaWRMaXN0OworICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhSWRMaXN0KCZpZExpc3QpOworCisgICAgaW50IG51bUNhbWVyYXMgPSBpZExpc3Quc2l6ZSgpOworICAgIEFDYW1lcmFJZExpc3QgKm91dCA9IG5ldyBBQ2FtZXJhSWRMaXN0OworICAgIGlmICghb3V0KSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgb3V0LT5udW1DYW1lcmFzID0gbnVtQ2FtZXJhczsKKyAgICBvdXQtPmNhbWVyYUlkcyA9IG5ldyBjb25zdCBjaGFyKltudW1DYW1lcmFzXTsKKyAgICBpZiAoIW91dC0+Y2FtZXJhSWRzKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlkTGlzdFtpXS5jX3N0cigpOworICAgICAgICBzaXplX3QgZHN0U2l6ZSA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciogZHN0ID0gbmV3IGNoYXJbZHN0U2l6ZV07CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgc3RybGNweShkc3QsIHNyYywgZHN0U2l6ZSk7CisgICAgICAgIG91dC0+Y2FtZXJhSWRzW2ldID0gZHN0OworICAgIH0KKyAgICAqY2FtZXJhSWRMaXN0ID0gb3V0OworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitBQ2FtZXJhTWFuYWdlcjo6ZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgeworICAgIGlmIChjYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkczsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgY2FtZXJhSWRMaXN0OworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+ICpjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3TWV0YWRhdGE7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0KKyAgICAgICAgY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJhd01ldGFkYXRhXSAoYXV0byBzICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgIHJhd01ldGFkYXRhLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fQ0hBUkFDVEVSSVNUSUNTKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6b3BlbkNhbWVyYSgKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKHJhd0NoYXJzKSk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworCisgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCisgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFRPRE86IENvbnZlcnQgc2VydmljZVJldCB0byBjYW1lcmFfc3RhdHVzX3QKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGRldmljZVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCEgcmVtb3RlIGRldmljZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgZGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UoZGV2aWNlUmVtb3RlKTsKKyAgICBkZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgKm91dERldmljZSA9IGRldmljZTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworQUNhbWVyYU1hbmFnZXI6On5BQ2FtZXJhTWFuYWdlcigpIHsKKworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxMzY1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BQ0FNRVJBX01BTkFHRVJfSAorI2RlZmluZSBfQUNBTUVSQV9NQU5BR0VSX0gKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIElCYXNlID0gYW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLyoqCisgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCisgKiBpbnN0YW5jZXMuIENyZWF0ZWQgd2hlbiBmaXJzdCBBQ2FtZXJhTWFuYWdlciBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2hlbgorICogYWxsIEFDYW1lcmFNYW5hZ2VyIGluc3RhbmNlcyBhcmUgZGVsZXRlZC4KKyAqCisgKiBUT0RPOiBtYXliZSBDYW1lcmFNYW5hZ2VyR2xvYmFsIGlzIGJldHRlciBzdWl0ZWQgaW4gbGliY2FtZXJhY2xpZW50PworICovCitjbGFzcyBDYW1lcmFNYW5hZ2VyR2xvYmFsIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYU1hbmFnZXJHbG9iYWwmIGdldEluc3RhbmNlKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGdldENhbWVyYVNlcnZpY2UoKTsKKworICAgIHZvaWQgcmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY2FtZXJhIElEcyB0aGF0IHN1cHBvcnQgY2FtZXJhMgorICAgICAqLworICAgIHZvaWQgZ2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiAqY2FtZXJhSWRzKTsKKworICBwcml2YXRlOgorICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAga0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBNdXRleCAgICAgICAgICAgICAgbUxvY2s7CisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBEZWF0aE5vdGlmaWVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobyk7CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOworCisgICAgY2xhc3MgQ2FtZXJhU2VydmljZUxpc3RlbmVyIGZpbmFsIDogcHVibGljIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKKyAgICAvLyBXcmFwcGVyIG9mIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyBzbyB3ZSBjYW4gc3RvcmUgaXQgaW4gc3RkOjpzZXQKKyAgICBzdHJ1Y3QgQ2FsbGJhY2sgeworICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CisgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCisgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUNvbnRleHQoY2FsbGJhY2stPmNvbnRleHQpIHt9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0ID09IG90aGVyLm1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOworICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtQXZhaWxhYmxlOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtVW5hdmFpbGFibGU7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgIH07CisgICAgc3RkOjpzZXQ8Q2FsbGJhY2s+IG1DYWxsYmFja3M7CisKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2sKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QUxvb3Blcj4gICAgICAgICBtQ2JMb29wZXI7IC8vIExvb3BlciB0aHJlYWQgd2hlcmUgY2FsbGJhY2tzIGFjdHVhbGx5IGhhcHBlbiBvbgorCisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIGJvb2wgc2V0dXBWZW5kb3JUYWdzKCk7CisKKyAgICAvLyBVdGlscyBmb3Igc3RhdHVzCisgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgorICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCisgICAgc3RydWN0IENhbWVyYUlkQ29tcGFyYXRvciB7CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBoaWRsX3N0cmluZyYgYSwgY29uc3QgaGlkbF9zdHJpbmcmIGIpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgYm9vbCBhSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGEuY19zdHIoKSwgJmFVaW50KTsKKyAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLmNfc3RyKCksICZiVWludCk7CisKKyAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhVWludCA8IGJVaW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW1wbGUgc3RyaW5nIGNvbXBhcmUgaWYgYm90aCBpZCBhcmUgbm90IHVpbnQKKyAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXAgY2FtZXJhX2lkIC0+IHN0YXR1cworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBDYW1lcmFEZXZpY2VTdGF0dXMsIENhbWVyYUlkQ29tcGFyYXRvcj4gbURldmljZVN0YXR1c01hcDsKKworICAgIC8vIEZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisgICAgc3RhdGljIE11dGV4IHNMb2NrOworICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBzSW5zdGFuY2U7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCgpIHt9OworICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhTWFuYWdlciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKKyAgICBBQ2FtZXJhTWFuYWdlcigpIDoKKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQorICAgIH07CisgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKK307CisKKyNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKK307CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZDQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYVZlbmRvclV0aWxzIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0Citjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCkgeworICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgaENhcHR1cmVSZXF1ZXN0OworICAgIGhDYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgIGhDYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkczsKKyAgICByZXR1cm4gaENhcHR1cmVSZXF1ZXN0OworfQorCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pIHsKKyAgICBIUm90YXRpb24gaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMDsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhSb3RhdGlvbjsKK30KKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpidWZmZXIgPSAoY2FtZXJhX21ldGFkYXRhX3QqKShtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICpyYXdNZXRhZGF0YSA9IGJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBjYWxsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlJFQ09SRDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6Ok1BTlVBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpQUkVWSUVXOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDQU1FUkFfT0s7CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9NQVhfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0FCTEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9QRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChuaDEtPm51bUZkcyAhPTAgfHwgbmgyLT5udW1GZHMgIT0wKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHdpbmRvdyBuYXRpdmUgaGFuZGxlcyBiZWluZyBjb21wYXJlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPnZlcnNpb24gIT0gbmgyLT52ZXJzaW9uIHx8IG5oMS0+bnVtRmRzICE9IG5oMi0+bnVtRmRzIHx8CisgICAgICAgIG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBuaDEtPm51bUludHMgPCBuaDItPm51bUludHM7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZiAobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIG5oMS0+ZGF0YVtpXSA8IG5oMi0+ZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obmgxLCBuaDIpICYmICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZXMxW2ldLCBoYW5kbGVzMltpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVzMS5zaXplKCkgPCBoYW5kbGVzMi5zaXplKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUxID0gaGFuZGxlczFbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMiA9IGhhbmRsZXMyW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlMSwgaGFuZGxlMikpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGhhbmRsZTEsIGhhbmRsZTIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTAwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisKKyNpZm5kZWYgQ0FNRVJBX05ES19WRU5ET1JfSAorI2RlZmluZSBDQU1FUkFfTkRLX1ZFTkRPUl9ICisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFJvdGF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhhdCBDYXB0dXJlUmVxdWVzdCBjYW4gYmUgc3RvcmVkIGJ5IHNwPD4KK3N0cnVjdCBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBtQ2FwdHVyZVJlcXVlc3Q7CisgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CisgIC8vUGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlLCBzaW5jZSB0aGUgY2FwdHVyZSByZXF1ZXN0CisgIC8vbWlnaHQgbm90IGNvbnRhaW4gaXQuIFRoYXQncyBzaW5jZSwgZm1xIG1pZ2h0IGhhdmUgY29uc3VtZWQgaXQuCisgIGhpZGxfdmVjPFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzOworfTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuIGFuZCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGUgbmF0aXZlX2hhbmRsZV90IGNhbiBiZSBjb21wYXJlZCB3aXRoICBpdHMgY29udGVudHMgaW5zdGVhZAorLy8gb2YganVzdCByYXcgcG9pbnRlciBjb21wYXJpc29ucy4KK3N0cnVjdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1XaW5kb3cgPSBudWxscHRyOworCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcihuYXRpdmVfaGFuZGxlX3QgKm5oKSA6IG1XaW5kb3cobmgpIHsgfQorCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworfTsKKworLy8gV3JhcHBlciBhcm91bmQgT3V0cHV0Q29uZmlndXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgc2luY2UgSElETAorLy8gT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBhbmQgbWFya2VkIGZpbmFsLiBUaGVyZWZvcmUsIG9wZXJhdG9yCisvLyBvdmVybG9hZHMgb3V0c2lkZSB0aGUgY2xhc3MsIHdpbGwgbm90IGdldCBwaWNrZWQgYnkgY2xhbmcgd2hpbGUgdHJ5aW5nIHRvCisvLyBzdG9yZSBPdXRwdXRDb25maWd1cmF0aW9uIGluIG1hcHMvc2V0cy4KK3N0cnVjdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKworICAgIG9wZXJhdG9yIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIDogbU91dHB1dENvbmZpZ3VyYXRpb24oKG91dHB1dENvbmZpZ3VyYXRpb24pKSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gc2VsZi5yb3RhdGlvbiA9PSBvdGhlci5yb3RhdGlvbiAmJiBzZWxmLndpbmRvd0dyb3VwSWQgPT0gb3RoZXIud2luZG93R3JvdXBJZCAmJgorICAgICAgICAgICAgICAgIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5waHlzaWNhbENhbWVyYUlkICYmIHNlbGYud2lkdGggPT0gb3RoZXIud2lkdGggJiYKKyAgICAgICAgICAgICAgICBzZWxmLmhlaWdodCA9PSBvdGhlci5oZWlnaHQgJiYgc2VsZi5pc0RlZmVycmVkID09IG90aGVyLmlzRGVmZXJyZWQgJiYKKyAgICAgICAgICAgICAgICBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgaWYgKHNlbGYud2luZG93R3JvdXBJZCAhPSBvdGhlci53aW5kb3dHcm91cElkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aW5kb3dHcm91cElkIDwgb3RoZXIud2luZG93R3JvdXBJZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLndpZHRoICE9IG90aGVyLndpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aWR0aCA8IG90aGVyLndpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaGVpZ2h0ICE9IG90aGVyLmhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVpZ2h0IDwgb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucm90YXRpb24gIT0gb3RoZXIucm90YXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VsZi5yb3RhdGlvbikgPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3RoZXIucm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaXNEZWZlcnJlZCAhPSBvdGhlci5pc0RlZmVycmVkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pc0RlZmVycmVkIDwgb3RoZXIuaXNEZWZlcnJlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgIT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA8IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIpICYmICEoKnRoaXMgPCBvdGhlcik7CisgICAgfQorfTsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCk7CisKK0hSb3RhdGlvbiBjb252ZXJ0VG9IaWRsKGludCByb3RhdGlvbik7CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSk7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCk7CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cyk7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDQU1FUkFfTkRLX1ZFTkRPUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMDhiMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUltYWdlUmVhZGVyVmVuZG9yVGVzdCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUVycm9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGludCBrRHVtbXlGZW5jZUZkID0gLTE7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRVcyA9IDEwMCAqIDEwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRSZXRyeSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihjb25zdCBjaGFyKiBpZCwgQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIG1JbWdSZWFkZXJBbncobnVsbHB0ciksIG1DYW1lcmFJZChpZCksIG1DYW1lcmFNYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgIH07CisgICAgaW50IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMpIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGluaXRpYWxpemUgY2FtZXJhIGJlZm9yZSBpbWFnZSByZWFkZXIgZ2V0IGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSXNDYW1lcmFSZWFkeSkgeworICAgICAgICAgICAgQUxPR0UoImluaXRDYW1lcmEgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmV0OworICAgICAgICBtSW1nUmVhZGVyQW53ID0gaW1nUmVhZGVyQW53OworCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmEobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1EZXZpY2VDYiwgJm1EZXZpY2UpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBjYW1lcmEsIHJldD0lZCwgbURldmljZT0lcC4iLCByZXQsIG1EZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlKCZtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIHNlc3Npb25PdXRwdXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uUGh5c2ljYWxPdXRwdXRfY3JlYXRlKHBoeXNpY2FsU3RyZWFtLmFudywKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTdHJlYW0ucGh5c2ljYWxDYW1lcmFJZCwgJnNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQobU91dHB1dHMsIHNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHRyYU91dHB1dHMucHVzaF9iYWNrKHNlc3Npb25PdXRwdXQpOworICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgYXQgbW9zdCBvbmUgcGh5c2ljYWwgc3RyZWFtIHBlciBwaHlzaWNhbCBjYW1lcmEuCisgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KG1EZXZpY2UsIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXRUYXJnZXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LCAmb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXFFeHRyYU91dHB1dHMucHVzaF9iYWNrKG91dHB1dFRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IHRydWU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIG91dHB1dFRhcmdldCA6IG1SZXFFeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIG1SZXFFeHRyYU91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBleHRyYU91dHB1dCA6IG1FeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKGV4dHJhT3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtT3V0cHV0cykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUobU91dHB1dHMpOworICAgICAgICAgICAgbU91dHB1dHMgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIGRldmljZQorICAgICAgICBpZiAobURldmljZSkgeworICAgICAgICAgICAgQUNhbWVyYURldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgICAgIG1EZXZpY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaW50IHRha2VQaWN0dXJlKCkgeworICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CisgICAgfQorCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZShtU2Vzc2lvbiwgJm1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAxLCAmbVN0aWxsUmVxdWVzdCwgJnNlcUlkKTsKKyAgICB9CisKKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzKGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZWQgY2FwdHVyZSBjYWxsYWJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZXZpY2VFcnJvcn07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7CisgICAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgICAgLy8gQ2FtZXJhIGRldmljZQorICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2UgPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgc2Vzc2lvbgorICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogbU91dHB1dHMgPSBudWxscHRyOworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhcHR1cmVTZXNzaW9uT3V0cHV0Kj4gbUV4dHJhT3V0cHV0czsKKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhbWVyYU91dHB1dFRhcmdldCo+IG1SZXFFeHRyYU91dHB1dHM7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlcjsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhICopIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYUlkczsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIG1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqLCBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cykgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocGh5c2ljYWxSZXN1bHRDb3VudCwgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbENhbWVyYUlkc1tpXSAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbFJlc3VsdHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZChjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBmcmFtZU51bWJlciBhbmQgc2Vuc29yVGltZXN0YW1wIGV4aXN0IGluIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbnRyeS5jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdHNbaV0sIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUCwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworfTsKKworY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzeW5jKQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVXNhZ2UodXNhZ2UpLAorICAgICAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSwKKyAgICAgICAgICBtQXN5bmMoYXN5bmMpIHt9CisKKyAgICB+SW1hZ2VSZWFkZXJUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbmF0aXZlX2hhbmRsZV90X3JlbGVhc2Ugb24gaW1hZ2VSZWFkZXJBbncKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBpbml0SW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyICE9IG51bGxwdHIgfHwgbUltZ1JlYWRlckFudyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlLWluaXRhbGl6ZSBpbWFnZSByZWFkZXIsIG1JbWdSZWFkZXI9JXAsIG1JbWdSZWFkZXJBbnc9JXAiLCBtSW1nUmVhZGVyLAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbVVzYWdlLCBtTWF4SW1hZ2VzLCAmbUltZ1JlYWRlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LCBtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW1hZ2UgYXZhaWxhYmxlIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyRGV0YWNoZWRDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBidWZmZXIgZGV0YWNoaW5nIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKG1JbWdSZWFkZXIsICZtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBuYXRpdmVfaGFuZGxlX3QgZnJvbSBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlckFudz0lcC4iLCByZXQsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorCisgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlZEltYWdlQ291bnQ7CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgICAgIEFJbWFnZSogb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIEFJbWFnZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGdvZXMgb3V0IG9mCisgICAgICAgIC8vIHNjb3BlLgorICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFt0aGlzXShBSW1hZ2UqIGltZykgeworICAgICAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGVBc3luYyhpbWcsIGtEdW1teUZlbmNlRmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlKGltZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgIGludCBvdXRGZW5jZUZkID0gMDsKKyAgICAgICAgICAgIC8vIFZlcml0eSB0aGF0IG91dEZlbmNlRmQncyB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgYnkKKyAgICAgICAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMuCisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKHJlYWRlciwgJm91dEltYWdlLCAmb3V0RmVuY2VGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShyZWFkZXIsICZvdXRJbWFnZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIG91dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZvdXRCdWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxkIHRvIGdldCBoYXJkd2FyZSBidWZmZXIsIHJldD0lZCwgb3V0QnVmZmVyPSVwLiIsIHJldCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVsZWFzZSBBSGFyZHdhcmVCdWZmZXIsIHNpbmNlIHdlIGRvbid0IGFjcXVpcmUgYWRkaXRpb25hbAorICAgICAgICAvLyByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIG91dERlc2M7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShvdXRCdWZmZXIsICZvdXREZXNjKTsKKyAgICAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgICAgIGludDMyX3QgYnVmZmVyV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBidWZmZXJIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLmhlaWdodCk7CisKKyAgICAgICAgQUltYWdlX2dldFdpZHRoKG91dEltYWdlLCAmaW1hZ2VXaWR0aCk7CisgICAgICAgIEFJbWFnZV9nZXRIZWlnaHQob3V0SW1hZ2UsICZpbWFnZUhlaWdodCk7CisgICAgICAgIGlmIChpbWFnZVdpZHRoICE9IG1XaWR0aCB8fCBpbWFnZUhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzU2NSB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNiB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWTgpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIG91dHB1dCBidWZmZXIgZGltZW5zaW9uIGZvciBjZXJ0YWluIGZvcm1hdHMuIERvbid0IGRvIHRoaXMgZm9yIGJsb2IgYmFzZWQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMuCisgICAgICAgICAgICBpZiAoYnVmZmVyV2lkdGggIT0gbVdpZHRoIHx8IGJ1ZmZlckhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvdXREZXNjLnVzYWdlICYgbVVzYWdlKSAhPSBtVXNhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgdXNhZ2U6IGFjdHVhbCAoJSIgUFJJdTY0ICIpLCBleHBlY3RlZCAoJSIgUFJJdTY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG91dERlc2MudXNhZ2UsIG1Vc2FnZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltZy5nZXQoKSwgMCwgJmRhdGEsICZkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTikgeworICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIENQVV9SRUFEX09GVEVOIHVzYWdlIGJpdHMsIHdlIGNhbiBsb2NrIHRoZSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9MT0NLX0lNQUdFIHx8IGRhdGEgIT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgaW5jcmVhc2UgbUFjcXVpcmVkSW1hZ2VDb3VudCBpZiBhbGwgY2hlY2tzIHBhc3MuCisgICAgICAgIG1BY3F1aXJlZEltYWdlQ291bnQrKzsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+KG9iaik7CisgICAgICAgIHRoaXotPkhhbmRsZUltYWdlQXZhaWxhYmxlKHJlYWRlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBvbkJ1ZmZlclJlbW92ZWQodm9pZCogLypvYmoqLywgQUltYWdlUmVhZGVyKiAvKnJlYWRlciovLCBBSGFyZHdhcmVCdWZmZXIqIC8qYnVmZmVyKi8pIHsKKyAgICAgICAgLy8gTm8tb3AsIGp1c3QgdG8gY2hlY2sgdGhlIGxpc3RlbmVyIGNhbiBiZSBzZXQgcHJvcGVybHkuCisgICAgfQorCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Gb3JtYXQ7CisgICAgdWludDY0X3QgbVVzYWdlOworICAgIGludDMyX3QgbU1heEltYWdlczsKKyAgICBib29sIG1Bc3luYzsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIGludCBtQWNxdWlyZWRJbWFnZUNvdW50ezB9OworCisgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOworCisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbVJlYWRlckF2YWlsYWJsZUNie3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbVJlYWRlckRldGFjaGVkQ2J7dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKK307CisKKworY2xhc3MgQUltYWdlUmVhZGVyVmVuZG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSByaWdvcm91cyB0ZXN0cyBmb3IgdmVuZG9yIHRhZ3MKKyAgICAgICAgQVNTRVJUX05FKFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKSwgbnVsbHB0cik7CisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzIDwgMSkgeworICAgICAgICAgICAgQUxPR1coIkRldmljZSBoYXMgbm8gY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdGFrZVBpY3R1cmVzKGNvbnN0IGNoYXIqIGlkLCB1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5pbml0SW1hZ2VSZWFkZXIoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihpZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZS5nZXROYXRpdmVXaW5kb3coKSwge30pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBoZWxwZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlKCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdGFrZSBwaWN0dXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQgJiYKKyAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKKyAgICB9CisKKyAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKKyAgICAgICAgZm9yIChhdXRvJiByZWFkZXJVc2FnZSA6CisgICAgICAgICAgICAge0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn0pIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyTWF4SW1hZ2VzIDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJBc3luYyA6IHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwaWN0dXJlQ291bnQgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFrZVBpY3R1cmVzKGlkLCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUZXN0IHRha2VQaWN0dXJlcyBmYWlsZWQgZm9yIHRlc3QgY2FzZSB1c2FnZT0lIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYW1lcmEgbWFuYWdlcgorICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisKKyAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLCBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IGNhcCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gZm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krM10gPT0gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsxXSA9PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzJdID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKGNvbnN0IGNoYXIgKipjYW1lcmFJZCwKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSoqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KiBjYW5kaWRhdGVQaHlzaWNhbElkcykgeworICAgICAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSBsb2dpY2FsIGNhbWVyYQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSwgc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICBBU1NFUlRfTkUoKnN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgaWYgKCFpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoKnN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkpIHsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZSgqc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICpzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHJldHVybmVkIHBoeXNpY2FsIGNhbWVyYSBJZHMgYXJlIHZhbGlkCisgICAgICAgICAgICBzaXplX3QgcGh5c2ljYWxDYW1lcmFJZENudCA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiBwaHlzaWNhbENhbWVyYUlkcyA9IG51bGxwdHI7CisgICAgICAgICAgICBib29sIGlzTG9naWNhbENhbWVyYSA9IEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYSgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYUlkQ250LCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNMb2dpY2FsQ2FtZXJhKTsKKyAgICAgICAgICAgIEFTU0VSVF9HRShwaHlzaWNhbENhbWVyYUlkQ250LCAyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGh5c2ljYWxDYW1lcmFJZENudCAmJiBjYW5kaWRhdGVQaHlzaWNhbElkcy0+c2l6ZSgpIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0dUKHN0cmxlbihwaHlzaWNhbENhbWVyYUlkc1tqXSksIDApOworICAgICAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBwaHlzaWNhbENhbWVyYUlkc1tqXSwgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1NpemVTdXBwb3J0ZWRGb3JGb3JtYXQocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwga1Rlc3RJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICpjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqY2FtZXJhSWQgPSBudWxscHRyOworICAgICAgICByZXR1cm47CisgICAgfQorfTsKKworVEVTVF9GKEFJbWFnZVJlYWRlclZlbmRvclRlc3QsIENyZWF0ZVdpbmRvd05hdGl2ZUhhbmRsZSkgeworICAgIC8vIFdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGNhbWVyYS4KKyAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1swXTsKKyAgICBBU1NFUlRfVFJVRShjYW1lcmFJZCAhPSBudWxscHRyKTsKKworICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgY2FtZXJhSWQsICZzdGF0aWNNZXRhZGF0YSk7CisgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgQVNTRVJUX05FKHN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgIGJvb2wgaXNCQyA9IGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JBQ0tXQVJEX0NPTVBBVElCTEUpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworCisgICAgaWYgKCFpc0JDKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBCQUNLV0FSRF9DT01QQVRJQkxFLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUodGVzdFRha2VQaWN0dXJlc05hdGl2ZShjYW1lcmFJZCkpOworfQorCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7CisgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOworICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKCZjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGlmIChjYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIENvdWxkbid0IGZpbmQgbG9naWNhbCBjYW1lcmEgdG8gdGVzdAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGVzdCBzdHJlYW1pbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhCisgICAgdWludDY0X3QgcmVhZGVyVXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU47CisgICAgaW50MzJfdCByZWFkZXJNYXhJbWFnZXMgPSA4OworICAgIGJvb2wgcmVhZGVyQXN5bmMgPSBmYWxzZTsKKyAgICBjb25zdCBpbnQgcGljdHVyZUNvdW50ID0gNjsKKyAgICBzdGQ6OnZlY3RvcjxJbWFnZVJlYWRlclRlc3RDYXNlKj4gdGVzdENhc2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRlc3RDYXNlID0gbmV3IEltYWdlUmVhZGVyVGVzdENhc2UoCisgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jKTsKKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlLT5pbml0SW1hZ2VSZWFkZXIoKSwgMCk7CisgICAgICAgIHRlc3RDYXNlcy5wdXNoX2JhY2sodGVzdENhc2UpOworICAgIH0KKworICAgIENhbWVyYUhlbHBlciBjYW1lcmFIZWxwZXIoY2FtZXJhSWQsIG1DYW1lcmFNYW5hZ2VyKTsKKyAgICBzdGQ6OnZlY3RvcjxDYW1lcmFIZWxwZXI6OlBoeXNpY2FsSW1nUmVhZGVySW5mbz4gcGh5c2ljYWxJbWdSZWFkZXJJbmZvOworICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzBdLCB0ZXN0Q2FzZXNbMV0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLnB1c2hfYmFjayh7cGh5c2ljYWxDYW1lcmFJZHNbMV0sIHRlc3RDYXNlc1syXS0+Z2V0TmF0aXZlV2luZG93KCl9KTsKKworICAgIGludCByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZXNbMF0tPmdldE5hdGl2ZVdpbmRvdygpLCBwaHlzaWNhbEltZ1JlYWRlckluZm8pOworICAgIEFTU0VSVF9FUShyZXQsIDApOworCisgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgaXMgbm90IHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24uIEl0J3MgZWl0aGVyIGR1ZSB0byBjYW1lcmEgb24gIgorICAgICAgICAgICAgICAiYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgY2FtZXJhIG9uICIKKyAgICAgICAgICAgICAgImJvYXJkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZUxvZ2ljYWxDYW1lcmFQaWN0dXJlKCk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworICAgIH0KKworICAgIC8vIFNsZWVwIHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgIGlmICh0ZXN0Q2FzZXNbMF0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMF0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMV0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMl0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpKTsKKworICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDY1OTQ4NGYuLmU1YzE2MzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw4IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCiAJQ2FtZXJhQmluZGVyVGVzdHMuY3BwIFwKLQlDYW1lcmFaU0xUZXN0cy5jcHAKKwlDYW1lcmFaU0xUZXN0cy5jcHAgXAorCUNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmxvZyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCAxZGU3MDEzLi44NTM0YjI4IDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDYgKzU3LDggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VEZWZhdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7CiAKICNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKICAgICBBU1NFUlRfVFJVRSgoeCkgIT0gbnVsbHB0cikKQEAgLTQ3Niw3ICs0ODAsOCBAQAogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoZ2JQcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL2ZhbHNlKSk7CiAKLSAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCk7CisgICAgICAgIFN0cmluZzE2IG5vUGh5c2ljYWxJZDsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCwgbm9QaHlzaWNhbElkKTsKIAogICAgICAgICAvLyBDYW4gd2UgY29uZmlndXJlPwogICAgICAgICByZXMgPSBkZXZpY2UtPmJlZ2luQ29uZmlndXJlKCk7CkBAIC00OTAsNiArNDk1LDE5IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKKyAgICAgICAgLy8gU2Vzc2lvbiBjb25maWd1cmF0aW9uIG11c3QgYWxzbyBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBjYXNlCisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uID0geyAvKmlucHV0V2lkdGgqLyAwLCAvKmlucHV0SGVpZ2h0Ki8wLAorICAgICAgICAgICAgICAgIC8qaW5wdXRGb3JtYXQqLyAtMSwgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERX07CisgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmFkZE91dHB1dENvbmZpZ3VyYXRpb24ob3V0cHV0KTsKKyAgICAgICAgYm9vbCBxdWVyeVN0YXR1czsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25Db25maWd1cmF0aW9uLCAmcXVlcnlTdGF0dXMpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgKHJlcy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PSBJQ2FtZXJhU2VydmljZURlZmF1bHQ6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSkKKyAgICAgICAgICAgICAgICA8PCByZXM7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShxdWVyeVN0YXR1cyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBDYW4gd2UgbWFrZSByZXF1ZXN0cz8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVxdWVzdFRlbXBsYXRlOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KC8qcHJldmlldyB0ZW1wbGF0ZSovMSwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKKworY2xhc3MgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorCisgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbigpIDogbnVtQ2FtZXJhcygwKXt9CisgICAgLy9HdGVzdCBpbnRlcmZhY2UKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgaW50MzJfdCBudW1DYW1lcmFzOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKK307CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6U2V0VXAoKSB7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyByYzsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgbUNhbWVyYVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZT4oYmluZGVyKTsKKyAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkNBTUVSQV9UWVBFX0FMTCwgJm51bUNhbWVyYXMpOworICAgIEVYUEVDVF9UUlVFKHJjLmlzT2soKSk7Cit9CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6VGVhckRvd24oKSB7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworLy8gUmV2b2tpbmcgYW5kIGFjcXVpcmluZyBwZXJtaXNzaW9ucyBhdXRvbWF0aWNhbGx5IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4KKy8vIFRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHJlbW92YWwgb2YgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nCisvLyBhIGNhbWVyYSBwZXJtaXNzaW9uLgorVEVTVF9GKENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24sIFRlc3RDYW1lcmFQZXJtaXNzaW9uKSB7CisgICAgZm9yIChpbnQzMl90IGNhbWVyYUlkID0gMDsgY2FtZXJhSWQgPCBudW1DYW1lcmFzOyBjYW1lcmFJZCsrKSB7CisKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWRTdHIgPSBTdHJpbmcxNihTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpKTsKKyAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBhdXRvIHJjID0gbUNhbWVyYVNlcnZpY2UtPnN1cHBvcnRzQ2FtZXJhQXBpKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMiwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdGFnc05lZWRpbmdQZXJtaXNzaW9uOworICAgICAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsICZtZXRhZGF0YSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHJjLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtZXRhZGF0YS5pc0VtcHR5KCkpOworICAgICAgICBFWFBFQ1RfRVEobWV0YWRhdGEucmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lELAorICAgICAgICAgICAgICAgICAgICAmdGFnc05lZWRpbmdQZXJtaXNzaW9uKSwgTk9fRVJST1IpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIEVYUEVDVF9UUlVFKDAgPCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBhdmFpbGFibGVLZXlzOworICAgICAgICBhdmFpbGFibGVLZXlzLnJlc2VydmUoYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKyAgICAgICAgYXZhaWxhYmxlS2V5cy5pbnNlcnQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmRhdGEuaTMyICsgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IHRhZ3NOZWVkaW5nUGVybWlzc2lvbikgeworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG1ldGFkYXRhLmV4aXN0cyhrZXkpKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVLZXlzLmVuZCgpLCBrZXkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXQgPT0gYXZhaWxhYmxlS2V5cy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBiNzM5NTFmLi5jMzYxNjkwIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTg2LDYgKzg2LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OklORk9fRk9STUFUX0NIQU5HRUQ7CiB1c2luZyBhbmRyb2lkOjpJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ7CiB1c2luZyBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTjsKK3VzaW5nIGFuZHJvaWQ6Ok5BTUVfTk9UX0ZPVU5EOwogdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpVTktOT1dOX0VSUk9SOwogCkBAIC0xMDIsNyArMTAzLDcgQEAKIHN0YXRpYyBib29sIGdNb25vdG9uaWNUaW1lID0gZmFsc2U7ICAgICAvLyB1c2Ugc3lzdGVtIG1vbm90b25pYyB0aW1lIGZvciB0aW1lc3RhbXBzCiBzdGF0aWMgYm9vbCBnUGVyc2lzdGVudFN1cmZhY2UgPSBmYWxzZTsgLy8gdXNlIHBlcnNpc3RlbnQgc3VyZmFjZQogc3RhdGljIGVudW0gewotICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUworICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfV0VCTSwgRk9STUFUXzNHUFAsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCiB9IGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OyAgICAgICAgICAgLy8gZGF0YSBmb3JtYXQgZm9yIG91dHB1dAogc3RhdGljIEFTdHJpbmcgZ0NvZGVjTmFtZSA9ICIiOyAgICAgICAgIC8vIGNvZGVjIG5hbWUgb3ZlcnJpZGUKIHN0YXRpYyBib29sIGdTaXplU3BlY2lmaWVkID0gZmFsc2U7ICAgICAvLyB3YXMgc2l6ZSBleHBsaWNpdGx5IHJlcXVlc3RlZD8KQEAgLTE5MSw3ICsxOTIsNyBAQAogICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBkaXNwbGF5RnBzKTsKICAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zZXROYW1lKCJzY3JlZW5yZWNvcmRfbG9vcGVyIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogICAgIEFMT0dWKCJDcmVhdGluZyBjb2RlYyIpOwpAQCAtMjY0LDEwICsyNjUsMTAgQEAKIAogICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKICAgICAvLyBjYXNlIGlzICJhbGwgb2YgaXQiLgotICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCk7CisgICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGRpc3BsYXkuCi0gICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8uaCAvIChmbG9hdCkgbWFpbkRweUluZm8udzsKKyAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydEggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0VzsKIAogCiAgICAgLy8gU2V0IHRoZSB3YXkgd2UgbWFwIHRoZSBvdXRwdXQgb250byB0aGUgZGlzcGxheSBzdXJmYWNlICh3aGljaCB3aWxsCkBAIC0zNDQsMjIgKzM0NSw2IEBACiB9CiAKIC8qCi0gKiBTZXQgdGhlIG1haW4gZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSBhY3R1YWwgd2lkdGggYW5kIGhlaWdodAotICovCi1zdGF0aWMgc3RhdHVzX3QgZ2V0QWN0dWFsRGlzcGxheVNpemUoY29uc3Qgc3A8SUJpbmRlcj4mIG1haW5EcHksIERpc3BsYXlJbmZvKiBtYWluRHB5SW5mbykgewotICAgIFJlY3Qgdmlld3BvcnQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5Vmlld3BvcnQobWFpbkRweSwgJnZpZXdwb3J0KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBnZXQgZGlzcGxheSB2aWV3cG9ydFxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1haW5EcHlJbmZvLT53ID0gdmlld3BvcnQud2lkdGgoKTsKLSAgICBtYWluRHB5SW5mby0+aCA9IHZpZXdwb3J0LmhlaWdodCgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKgogICogUnVucyB0aGUgTWVkaWFDb2RlYyBlbmNvZGVyLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIE1lZGlhTXV4ZXIuICBUaGUKICAqIGlucHV0IGZyYW1lcyBhcmUgY29taW5nIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhcyBmYXN0IGFzIFN1cmZhY2VGbGluZ2VyCiAgKiB3YW50cyB0byBzZW5kIHRoZW0uCkBAIC00MjksMjIgKzQxNCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2VmdWwgc3R1ZmYgaXMgaGFyZCB0byBnZXQgYXQgd2l0aG91dCBhIERhbHZpayBWTS4KICAgICAgICAgICAgICAgICAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5SW5mbyhtYWluKSBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTYwOSw4ICs1ODYsMTIgQEAKICAgICBzZWxmLT5zdGFydFRocmVhZFBvb2woKTsKIAogICAgIC8vIEdldCBtYWluIGRpc3BsYXkgcGFyYW1ldGVycy4KLSAgICBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKTsKKyAgICBjb25zdCBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgIGlmIChtYWluRHB5ID09IG51bGxwdHIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogbm8gZGlzcGxheVxuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKICAgICBEaXNwbGF5SW5mbyBtYWluRHB5SW5mbzsKICAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKG1haW5EcHksICZtYWluRHB5SW5mbyk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtNjE4LDI1ICs1OTksMTkgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgcHJpbnRmKCJNYWluIGRpc3BsYXkgaXMgJWR4JWQgQCUuMmZmcHMgKG9yaWVudGF0aW9uPSV1KVxuIiwKLSAgICAgICAgICAgICAgICBtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oLCBtYWluRHB5SW5mby5mcHMsCisgICAgICAgICAgICAgICAgbWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgsIG1haW5EcHlJbmZvLmZwcywKICAgICAgICAgICAgICAgICBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIC8vIEVuY29kZXIgY2FuJ3QgdGFrZSBvZGQgbnVtYmVyIGFzIGNvbmZpZwogICAgIGlmIChnVmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udyk7CisgICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRXKTsKICAgICB9CiAgICAgaWYgKGdWaWRlb0hlaWdodCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLmgpOworICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydEgpOwogICAgIH0KIAogICAgIC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIGVuY29kZXIuCkBAIC03MTQsNyArNjg5LDkgQEAKICAgICBzcDxNZWRpYU11eGVyPiBtdXhlciA9IE5VTEw7CiAgICAgRklMRSogcmF3RnAgPSBOVUxMOwogICAgIHN3aXRjaCAoZ091dHB1dEZvcm1hdCkgewotICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6IHsKKyAgICAgICAgY2FzZSBGT1JNQVRfTVA0OgorICAgICAgICBjYXNlIEZPUk1BVF9XRUJNOgorICAgICAgICBjYXNlIEZPUk1BVF8zR1BQOiB7CiAgICAgICAgICAgICAvLyBDb25maWd1cmUgbXV4ZXIuICBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBDU0QgYmxvYiBmcm9tIHRoZSBlbmNvZGVyCiAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgY2FuIHN0YXJ0IGl0LgogICAgICAgICAgICAgZXJyID0gdW5saW5rKGZpbGVOYW1lKTsKQEAgLTcyNyw3ICs3MDQsMTMgQEAKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBjb3VsZG4ndCBvcGVuIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfTVA0KSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgaWYgKGdSb3RhdGUpIHsKICAgICAgICAgICAgICAgICBtdXhlci0+c2V0T3JpZW50YXRpb25IaW50KDkwKTsgIC8vIFRPRE86IGRvZXMgdGhpcyBkbyBhbnl0aGluZz8KQEAgLTEwNDcsNiArMTAzMCwxMCBAQAogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiaDI2NCIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0gyNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJ3ZWJtIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfV0VCTTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIjNncHAiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF8zR1BQOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZnJhbWVzIikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfRlJBTUVTOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAicmF3LWZyYW1lcyIpID09IDApIHsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA3YTEwMzAyLi42ZWIyZTlmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNyBAQAogICAgICAgICBTaW5lU291cmNlLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYm1lZGlhZXh0cmFjdG9yIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgXAogICAgICAgICBsaWJoaWRsYmFzZSBcCiAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHJlY29yZC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICByZWNvcmR2aWRlby5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtODcsNyArODcsNyBAQAogICAgICAgICBhdWRpb2xvb3AuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJ1aSBsaWJndWkgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscyBsaWJtZWRpYWV4dHJhY3RvcgorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliY3V0aWxzIGxpYmMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGliY3V0aWxzIGxpYmMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IDk4MGQxZDIuLmU1YTQzMzcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogICAgIENIRUNLKCFzdGF0ZUJ5VHJhY2suaXNFbXB0eSgpKTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNDExLDEwICs0MTEsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAppbmRleCA2MzBkZTI1Li4yY2Y2OTU1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcApAQCAtMzEwLDcgKzMxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgYm9vbCByZW5kZXJTdXJmYWNlLApAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgZmlsdGVyU3RhdGUtPm1TaWduYWxsZWRJbnB1dEVPUyA9IGZhbHNlOwogICAgIGZpbHRlclN0YXRlLT5tU2F3T3V0cHV0RU9TID0gZmFsc2U7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTY0Myw3ICs2NDMsNyBAQAogICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCwgJnN0YXJ0VGltZVJlbmRlcik7CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTczNyw3ICs3MzcsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgYW5kcm9pZDo6c3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgYW5kcm9pZDo6c3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKQEAgLTc0OCwxMCArNzQ4LDEyIEBACiAgICAgICAgIGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCkpOwogCi0gICAgICAgIGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgICAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgICAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCA0NGIwMDE1Li45NWExNmYzIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yOCw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IDAzMTE2NzcuLmJmMzZiZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtNDcsOSArNDYsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KQEAgLTc4LDYgKzc5LDcgQEAKIHN0YXRpYyBib29sIGdQbGF5YmFja0F1ZGlvOwogc3RhdGljIGJvb2wgZ1dyaXRlTVA0Owogc3RhdGljIGJvb2wgZ0Rpc3BsYXlIaXN0b2dyYW07CitzdGF0aWMgYm9vbCBnVmVyYm9zZSA9IGZhbHNlOwogc3RhdGljIGJvb2wgc2hvd1Byb2dyZXNzID0gdHJ1ZTsKIHN0YXRpYyBTdHJpbmc4IGdXcml0ZU1QNEZpbGVuYW1lOwogc3RhdGljIFN0cmluZzggZ0NvbXBvbmVudE5hbWVPdmVycmlkZTsKQEAgLTE1OSw2ICsxNjEsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAic2FtcGxlIGZvcm1hdDogJXNcbiIsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCiAgICAgICAgIENIRUNLX0VRKAogICAgICAgICAgICAgICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKW1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAxLApAQCAtMjE4LDExICsyMjUsMTUgQEAKICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UocmF3U291cmNlKTsKICAgICAgICAgcmF3U291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKKyAgICAgICAgZXJyID0gcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKIAotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisgICAgICAgICAgICB3aGlsZSAoIXBsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHN0YXJ0IHBsYXliYWNrIGVycj0lZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOwogICAgICAgICB9CiAKICAgICAgICAgZGVsZXRlIHBsYXllcjsKQEAgLTM0OCw3ICszNTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZXNVcy5wdXNoKGRlbGF5RGVjb2RlVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWxkIHNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBudW1GcmFtZXMsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CiAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3OSwxMiArNTkzLDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKKwogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICB9CkBAIC02MTUsNyArNjI5LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbChpc3QpIGNvbXBvbmVudHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1tIG1heC1udW1iZXItb2YtZnJhbWVzLXRvLWRlY29kZSBpbiBlYWNoIHBhc3NcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1iIGJ1ZyB0byByZXByb2R1Y2VcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1wKHJvZmlsZXMpIGR1bXAgZGVjb2RlciBwcm9maWxlcyBzdXBwb3J0ZWRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1pKG5mbykgZHVtcCBjb2RlYyBpbmZvIChwcm9maWxlcyBhbmQgY29sb3IgZm9ybWF0cyBzdXBwb3J0ZWQsIGRldGFpbHMpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdChodW1ibmFpbCkgZXh0cmFjdCB2aWRlbyB0aHVtYm5haWwgb3IgYWxidW0gYXJ0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwpAQCAtNjMwLDU1ICs2NDQsMTM0IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLVQgYWxsb2NhdGUgYnVmZmVycyBmcm9tIGEgc3VyZmFjZSB0ZXh0dXJlXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtZCh1bXApIG91dHB1dF9maWxlbmFtZSAocmF3IHN0cmVhbSBkYXRhIHRvIGEgZmlsZSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1EKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChkZWNvZGVkIFBDTSBkYXRhIHRvIGEgZmlsZSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC12IGJlIG1vcmUgdmVyYm9zZVxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBDb2RlY1Byb2ZpbGVzKGJvb2wgcXVlcnlEZWNvZGVycykgewotICAgIGNvbnN0IGNoYXIgKmtNaW1lVHlwZXNbXSA9IHsKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQwotICAgIH07Ci0KLSAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiZGVjb2RlciIgOiAiZW5jb2RlciI7Ci0gICAgcHJpbnRmKCIlcyBwcm9maWxlczpcbiIsIGNvZGVjVHlwZSk7CitzdGF0aWMgdm9pZCBkdW1wQ29kZWNEZXRhaWxzKGJvb2wgcXVlcnlEZWNvZGVycykgeworICAgIGNvbnN0IGNoYXIgKmNvZGVjVHlwZSA9IHF1ZXJ5RGVjb2RlcnM/ICJEZWNvZGVyIiA6ICJFbmNvZGVyIjsKKyAgICBwcmludGYoIlxuJXMgaW5mb3MgYnkgbWVkaWEgdHlwZXM6XG4iCisgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgY29kZWNUeXBlKTsKIAogICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIHNpemVfdCBudW1Db2RlY3MgPSBsaXN0LT5jb3VudENvZGVjcygpOwogCi0gICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7ICsraykgewotICAgICAgICBwcmludGYoInR5cGUgJyVzJzpcbiIsIGtNaW1lVHlwZXNba10pOworICAgIC8vIGdhdGhlciBhbGwgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGJ5IGNvZGVjIGNsYXNzLCBhbmQgbGluayB0byBjb2RlY3MgdGhhdCBzdXBwb3J0IHRoZW0KKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+Pj4gYWxsTWVkaWFUeXBlczsKKyAgICBmb3IgKHNpemVfdCBjb2RlY19peCA9IDA7IGNvZGVjX2l4IDwgbnVtQ29kZWNzOyArK2NvZGVjX2l4KSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGNvZGVjX2l4KTsKKyAgICAgICAgaWYgKGluZm8tPmlzRW5jb2RlcigpID09ICFxdWVyeURlY29kZXJzKSB7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gc3VwcG9ydGVkTWVkaWFUeXBlczsKKyAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJnN1cHBvcnRlZE1lZGlhVHlwZXMpOworICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWRNZWRpYVR5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHByaW50Zigid2FybmluZzogJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbWVkaWEgdHlwZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlIDogc3VwcG9ydGVkTWVkaWFUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsTWVkaWFUeXBlcy5pbmRleE9mS2V5KG1lZGlhVHlwZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxNZWRpYVR5cGVzLmFkZChtZWRpYVR5cGUsIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFsbE1lZGlhVHlwZXMuZWRpdFZhbHVlRm9yKG1lZGlhVHlwZSkuYWRkKGluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbnVtQ29kZWNzOyArK2luZGV4KSB7Ci0gICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7Ci0gICAgICAgICAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPmlzRW5jb2RlcigpICE9ICFxdWVyeURlY29kZXJzKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKGtNaW1lVHlwZXNba10pOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIGJvb2w+IHZpc2l0ZWRDb2RlY3M7CisgICAgZm9yIChzaXplX3QgdHlwZV9peCA9IDA7IHR5cGVfaXggPCBhbGxNZWRpYVR5cGVzLnNpemUoKTsgKyt0eXBlX2l4KSB7CisgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSA9IGFsbE1lZGlhVHlwZXMua2V5QXQodHlwZV9peCk7CisgICAgICAgIHByaW50ZigiXG5NZWRpYSB0eXBlICclcyc6XG4iLCBtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8gOiBhbGxNZWRpYVR5cGVzLnZhbHVlQXQodHlwZV9peCkpIHsKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWVkaWFUeXBlLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50Zigid2FybmluZzogJXMgZG9lcyBub3QgaGF2ZSBjYXBhYmlsaXRpZXMgZm9yIHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSwgbWVkaWFUeXBlLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIgICVzICclcycgc3VwcG9ydHMgIiwKKyAgICAgICAgICAgIHByaW50ZigiICAlcyBcIiVzXCIgc3VwcG9ydHNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZSwgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOwogCi0gICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKLSAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIk5PVEhJTkcuXG4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF1dG8gcHJpbnRMaXN0ID0gW10oY29uc3QgY2hhciAqdHlwZSwgY29uc3QgVmVjdG9yPEFTdHJpbmc+ICZ2YWx1ZXMpeworICAgICAgICAgICAgICAgIHByaW50ZigiICAgICVzOiBbIiwgdHlwZSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB2YWx1ZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAgICVzJXMiLCB2YWx1ZXNbal0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID09IHZhbHVlcy5zaXplKCkgLSAxID8gIiAiIDogIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCJdXG4iKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmICh2aXNpdGVkQ29kZWNzLmluZGV4T2ZLZXkoaW5mby0+Z2V0Q29kZWNOYW1lKCkpIDwgMCkgeworICAgICAgICAgICAgICAgIHZpc2l0ZWRDb2RlY3MuYWRkKGluZm8tPmdldENvZGVjTmFtZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBhbGlhc2VzOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRBbGlhc2VzKCZhbGlhc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcXVvdGUgYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLmluc2VydCgiXCIiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLmFwcGVuZCgnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50TGlzdCgiYWxpYXNlcyIsIGFsaWFzZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dHJzID0gaW5mby0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiZW5jb2RlcjogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigidmVuZG9yOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3IpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoInNvZnR3YXJlLW9ubHk6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiaHctYWNjZWxlcmF0ZWQ6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQpKSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50TGlzdChBU3RyaW5nUHJpbnRmKCJhdHRyaWJ1dGVzOiAlI3giLCBhdHRycykuY19zdHIoKSwgbGlzdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgb3duZXI6IFwiJXNcIlxuIiwgaW5mby0+Z2V0T3duZXJOYW1lKCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIHJhbms6ICV1XG4iLCBpbmZvLT5nZXRSYW5rKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICBhbGlhc2VzLCBhdHRyaWJ1dGVzLCBvd25lciwgcmFuazogc2VlIGFib3ZlXG4iKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0gcHJvZmlsZUxldmVsc1tqXTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnBsIDogcHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuaWNlUHJvZmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9BVURJT19BQUMpICAgPyBhc1N0cmluZ19BQUNPYmplY3QocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUcyKSA/IGFzU3RyaW5nX01QRUcyUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSDI2MykgID8gYXNTdHJpbmdfSDI2M1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUc0KSA/IGFzU3RyaW5nX01QRUc0UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVZDKSAgID8gYXNTdHJpbmdfQVZDUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAgID8gYXNTdHJpbmdfVlA4UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSEVWQykgID8gYXNTdHJpbmdfSEVWQ1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOSkgICA/IGFzU3RyaW5nX1ZQOVByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWMSkgICA/IGFzU3RyaW5nX0FWMVByb2ZpbGUocGwubVByb2ZpbGUpIDoiPz8iOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuaWNlTGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzIpID8gYXNTdHJpbmdfTVBFRzJMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0gyNjMpICA/IGFzU3RyaW5nX0gyNjNMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUc0KSA/IGFzU3RyaW5nX01QRUc0TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVkMpICAgPyBhc1N0cmluZ19BVkNMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgICA/IGFzU3RyaW5nX1ZQOExldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSEVWQykgID8gYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOSkgICA/IGFzU3RyaW5nX1ZQOUxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVYxKSAgID8gYXNTdHJpbmdfQVYxTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAiPz8iOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyV1LyV1IiwgaiA+IDAgPyAiLCAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUsIHByb2ZpbGVMZXZlbC5tTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCIlIDV1LyUgNXUgKCVzLyVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwubVByb2ZpbGUsIHBsLm1MZXZlbCwgbmljZVByb2ZpbGUsIG5pY2VMZXZlbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludExpc3QoInByb2ZpbGUvbGV2ZWxzIiwgbGlzdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbGlzdDsKKyAgICAgICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNvbG9yczsKKyAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9ycyk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2xvciA6IGNvbG9ycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCIlI3ggKCVzKSIsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nX0NvbG9yRm9ybWF0KChpbnQzMl90KWNvbG9yKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludExpc3QoImNvbG9ycyIsIGxpc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGYoIiAgICBkZXRhaWxzOiAlc1xuIiwgY2Fwcy0+Z2V0RGV0YWlscygpLT5kZWJ1Z1N0cmluZyg2KS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTY4OCw3ICs3ODEsNyBAQAogCiAgICAgYm9vbCBhdWRpb09ubHkgPSBmYWxzZTsKICAgICBib29sIGxpc3RDb21wb25lbnRzID0gZmFsc2U7Ci0gICAgYm9vbCBkdW1wUHJvZmlsZXMgPSBmYWxzZTsKKyAgICBib29sIGR1bXBDb2RlY0luZm8gPSBmYWxzZTsKICAgICBib29sIGV4dHJhY3RUaHVtYm5haWwgPSBmYWxzZTsKICAgICBib29sIHNlZWtUZXN0ID0gZmFsc2U7CiAgICAgYm9vbCB1c2VTdXJmYWNlQWxsb2MgPSBmYWxzZTsKQEAgLTcwNSwxMCArNzk4LDEwIEBACiAgICAgZ1dyaXRlTVA0ID0gZmFsc2U7CiAgICAgZ0Rpc3BsYXlIaXN0b2dyYW0gPSBmYWxzZTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXI7CiAKICAgICBpbnQgcmVzOwotICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoYXFuOmxtOmI6cHRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2aGFxbjpsbTpiOml0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKICAgICAgICAgc3dpdGNoIChyZXMpIHsKICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgewpAQCAtNzc4LDkgKzg3MSw5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVtcFByb2ZpbGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkdW1wQ29kZWNJbmZvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtODMyLDYgKzkyNSwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnVmVyYm9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTE1LDkgKzEwMTQsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoZHVtcFByb2ZpbGVzKSB7Ci0gICAgICAgIGR1bXBDb2RlY1Byb2ZpbGVzKHRydWUgLyogcXVlcnlEZWNvZGVycyAqLyk7Ci0gICAgICAgIGR1bXBDb2RlY1Byb2ZpbGVzKGZhbHNlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOworICAgIGlmIChkdW1wQ29kZWNJbmZvKSB7CisgICAgICAgIGR1bXBDb2RlY0RldGFpbHModHJ1ZSAvKiBxdWVyeURlY29kZXJzICovKTsKKyAgICAgICAgZHVtcENvZGVjRGV0YWlscyhmYWxzZSAvKiBxdWVyeURlY29kZXJzICovKTsKICAgICB9CiAKICAgICBpZiAobGlzdENvbXBvbmVudHMpIHsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiMDE5OWQ4Li4zNWJkYmMwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTMxOCwxMCArMzE4LDEyIEBACiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pKTsKKyAgICBjb25zdCBzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICBEaXNwbGF5SW5mbyBpbmZvOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCmluZGV4IGY3MzQ5MDUuLmFlYzU5NTkgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApAQCAtNzksMTIgKzc5LDEyIEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICByZXR1cm4gb25Db25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHJldHVybiBvblNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogfQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKICAgICAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmkpOwpAQCAtMTM5LDMzICsxMzksMzMgQEAKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSwgbWltZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWYsIG1pbWVUeXBlKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHJldHVybiBvbkNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHJldHVybiBvbkluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmRlY3J5cHQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgcmV0dXJuIG9uRGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICByZXR1cm4gb25GaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAogc3NpemVfdCBEcm1FbmdpbmVCYXNlOjpwcmVhZCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIG9uUHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA0NGY5OGRkLi5hNmQzM2IwIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zOSw3ICszOSw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKAotICAgICAgICBjb25zdCBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgeworICAgICAgICBjb25zdCBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgaWYgKDAgPT0gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTksNyArOTksNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKERlY3J5cHRIYW5kbGUqIGhhbmRsZSkgeworc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUpIHsKICAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQxNCw3ICs0MTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJjb25zdW1lUmlnaHRzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC00MzEsNyArNDMxLDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02MDMsNyArNjAzLDcgQEAKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjIxLDcgKzYyMSw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbWltZT0lcyIsIG1pbWU/IG1pbWU6ICJOVUxMIik7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02NzMsNyArNjczLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GT1JfU1RSRUFNSU5HLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJkZWNyeXB0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC03NzAsNyArNzcwLDcgQEAKIH0KIAogc3NpemVfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTExMjgsMTYgKzExMjgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGFjdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGJvb2wgcmVzZXJ2ZSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMTQ4LDE2ICsxMTQ4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBwbGF5YmFja1N0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTEzMjksMTMgKzEzMjksMTMgQEAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZQogICAgICAgICAgICAgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xMzQ5LDEzICsxMzQ5LDEzIEBACiAgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogCiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM3MywxMyArMTM3MywxMiBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlKGRhdGEucmVhZFN0cmluZzgoKSk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKIAogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM5Myw3ICsxMzkyLDcgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBjbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUpOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCkBAIC0xNDE3LDE3ICsxNDE2LDE3IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgRHJtQnVmZmVyKiBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgaGVhZGVySW5mbyA9IG5ldyBEcm1CdWZmZXIoKGNoYXIgKilkYXRhLnJlYWRJbnBsYWNlKGJ1ZmZlclNpemUpLCBidWZmZXJTaXplKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBoZWFkZXJJbmZvOyBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xNDM5LDggKzE0MzgsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0NTAsNyArMTQ0OSw3IEBACiAgICAgICAgICAgICBkZWNCdWZmZXJTaXplID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTQ3MCw3ICsxNDY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKyAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCkBAIC0xNDgwLDcgKzE0NzksNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlKGRlY0J1ZmZlci0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOwpAQCAtMTQ5NSwxMyArMTQ5NCwxMyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAotICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTUxMiw4ICsxNTExLDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAobnVtQnl0ZXMgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKQEAgLTE1MjQsMTMgKzE1MjMsMTMgQEAKIAogICAgICAgICBjb25zdCBvZmY2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CiAKLSAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgJmhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICBpZiAoMCA8IHJlc3VsdCkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNDE3MTA3Zi4uNzNmMTFhNCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC01OSwxMCArNTksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC04MCwyNyArODEsMjggQEAKICAgICBEcm1TdXBwb3J0SW5mbyogZ2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogcHJvdGVjdGVkOgpAQCAtMjY1LDcgKzI2Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCkBAIC0yODAsNyArMjgyLDggQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzQwMSw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBmZCAqLywgb2ZmNjRfdCAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgLyogbGVuZ3RoICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCkBAIC00MTUsNyArNDE4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSA9IDA7CiAKICAgICAvKioKQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB1cmkgKi8sIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIAogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NDcsNyArNDUwLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiAvKiBidWYgKi8sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKiBtaW1lVHlwZSAqLykgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NjEsNyArNDY0LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC00NzMsNyArNDc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtNDkzLDcgKzQ5Niw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC01MDYsNyArNTA5LDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNTE5LDcgKzUyMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggYWNjOGVkOS4uMTgzN2ExMSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAogICAgIC8qKgpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCAwMzc2YjQ5Li44MzZhZTBhIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCkBAIC0xMTUsMTAgKzExNSwxMSBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCkBAIC0xMzgsMjggKzEzOSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcyxvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApAQCAtMjAzLDEwICsyMDQsMTAgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMjI1LDI4ICsyMjYsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKaW5kZXggYmYwNGE4OS4uYWZiY2IzOSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC0yNjcsNyArMjY3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yNzgsNyArMjc4LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMzk2LDE1ICszOTYsMTUgQEAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQyMCwxOSArNDIwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NDgsMjAgKzQ0OCwyMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ3NywyMCArNDc3LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0ICYmIE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw3ICs0OTcsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MzIsNyArNTMyLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJlc3VsdCA9IERFQ1JZUFRfRklMRV9FUlJPUjsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAppbmRleCBlN2NkZDM2Li4yNjIyMmJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaApAQCAtODksMTAgKzg5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTA5LDI1ICsxMTAsMjYgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2b2lkIG9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KTsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggZGFkNTk5Yi4uMjYwMGEyYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTU4LDIyICs1OCwyNiBAQAogICAgIHJldHVybiBkcm1fcGVybV9sYWJlbHNbaW5kZXhdOwogfQogCi1ib29sIERybU1hbmFnZXJTZXJ2aWNlOjpzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBkcm1fcGVybV90IHBlcm0pIHsKK2Jvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGNvbnN0IGNoYXIqIHNzaWQsIGRybV9wZXJtX3QgcGVybSkgewogICAgIGlmIChzZWxpbnV4X2VuYWJsZWQgPD0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBjaGFyICpzY3R4OworICAgIGNoYXIgKnNjdHggPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNlbGludXhfY2xhc3MgPSAiZHJtc2VydmljZSI7CiAgICAgY29uc3QgY2hhciAqc3RyX3Blcm0gPSBnZXRfcGVybV9sYWJlbChwZXJtKTsKIAotICAgIGlmIChnZXRwaWRjb24oc3BpZCwgJnNjdHgpICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlNFTGludXg6IGdldHBpZGNvbihwaWQ9JWQpIGZhaWxlZC5cbiIsIHNwaWQpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNzaWQgPT0gTlVMTCkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMTAzNTA0MiIpOworCisgICAgICAgIGlmIChnZXRwaWRjb24oc3BpZCwgJnNjdHgpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJTRUxpbnV4OiBnZXRwaWRjb24ocGlkPSVkKSBmYWlsZWQuXG4iLCBzcGlkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGJvb2wgYWxsb3dlZCA9IChzZWxpbnV4X2NoZWNrX2FjY2VzcyhzY3R4LCBkcm1zZXJ2ZXJfY29udGV4dCwgc2VsaW51eF9jbGFzcywKLSAgICAgICAgICAgIHN0cl9wZXJtLCBOVUxMKSA9PSAwKTsKKyAgICBib29sIGFsbG93ZWQgPSAoc2VsaW51eF9jaGVja19hY2Nlc3Moc3NpZCA/IHNzaWQgOiBzY3R4LCBkcm1zZXJ2ZXJfY29udGV4dCwKKyAgICAgICAgICAgIHNlbGludXhfY2xhc3MsIHN0cl9wZXJtLCBOVUxMKSA9PSAwKTsKICAgICBmcmVlY29uKHNjdHgpOwogCiAgICAgcmV0dXJuIGFsbG93ZWQ7CkBAIC04NiwxMCArOTAsMTEgQEAKICAgICBJUENUaHJlYWRTdGF0ZSogaXBjU3RhdGUgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwogICAgIHVpZF90IHVpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgcGlkX3Qgc3BpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgY2hhciogc3NpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nU2lkKCk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHRydXN0ZWRVaWRzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmICh0cnVzdGVkVWlkc1tpXSA9PSB1aWQpIHsKLSAgICAgICAgICAgIHJldHVybiBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChzcGlkLCBwZXJtKTsKKyAgICAgICAgICAgIHJldHVybiBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChzcGlkLCBzc2lkLCBwZXJtKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC05Nyw3ICsxMDIsOSBAQAogCiB2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKICAgICBBTE9HVigiaW5zdGFudGlhdGUiKTsKLSAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSwgbmV3IERybU1hbmFnZXJTZXJ2aWNlKCkpOworICAgIHNwPERybU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gbmV3IERybU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgc2VydmljZS0+c2V0UmVxdWVzdGluZ1NpZCh0cnVlKTsKKyAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSwgc2VydmljZSk7CiAKICAgICBpZiAoMCA+PSB0cnVzdGVkVWlkcy5zaXplKCkpIHsKICAgICAgICAgLy8gVE9ETwpAQCAtMjA2LDcgKzIxMyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjb25zdW1lUmlnaHRzIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENPTlNVTUVfUklHSFRTKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0yMTUsNyArMjIyLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIEFMT0dWKCJFbnRlcmluZyBzZXRQbGF5YmFja1N0YXR1cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChTRVRfUExBWUJBQ0tfU1RBVFVTKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0yNjIsNyArMjY5LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjcyLDcgKzI3OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiB3aXRoIHVyaSIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjgyLDcgKzI4OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiBmb3Igc3RyZWFtaW5nIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yOTIsNyArMjk5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNsb3NlRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoQ0xPU0VfREVDUllQVF9TRVNTSU9OKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0zMDAsNyArMzA3LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKElOSVRJQUxJWkVfREVDUllQVF9VTklUKSkgewpAQCAtMzEwLDcgKzMxNyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJFbnRlcmluZyBkZWNyeXB0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKERFQ1JZUFQpKSB7CkBAIC0zMjAsNyArMzI3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKEZJTkFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzI4LDcgKzMzNSw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgcHJlYWQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoUFJFQUQpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggNDVjZWUyZS4uMmUyN2EzYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wZXJtX2xhYmVsKGRybV9wZXJtX3QgcGVybSk7CiAKLSAgICBzdGF0aWMgYm9vbCBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBkcm1fcGVybV90IHBlcm0pOworICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGNvbnN0IGNoYXIqIHNzaWQsIGRybV9wZXJtX3QgcGVybSk7CiAKICAgICBzdGF0aWMgYm9vbCBpc1Byb3RlY3RlZENhbGxBbGxvd2VkKGRybV9wZXJtX3QgcGVybSk7CiAKQEAgLTk1LDEwICs5NSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCxpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMTUsMjYgKzExNiwyNyBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IGMwNDdlYjEuLmIwYTQ0MWIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjY3LDcgKzI2Nyw3IEBACiBzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLCBtaW1lKTsKICAgICB9CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCiAgICAgICAgICYmIChOVUxMICE9IGRlY0J1ZmZlcikgJiYgKE5VTEwgIT0gKmRlY0J1ZmZlcikpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZGVjcnlwdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMyOSw3ICszMjksNyBAQAogICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKICAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBhNTcxYjNhLi5iNjJkZGI5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbik7CiAjZWxzZQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CiAjZW5kaWYKQEAgLTMzMCwxMSArMzMwLDExIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogI2Vsc2UKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAjZW5kaWYKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpOwogCiAvKioKQEAgLTM2MCw3ICszNjAsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KQEAgLTM3Myw3ICszNzMsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwogc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CkBAIC00MTYsNyArNDE2LDcgQEAKICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwotc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCkBAIC00MzAsNyArNDMwLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKIC8qKgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCiAgKi8KIHNzaXplX3Qgb25SZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOwogCkBAIC00NjMsMTIgKzQ2MywxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIG9mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbHNlCiBvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZW5kaWYKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKICNlbHNlCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDczZWVhODkuLjc2OWRlMGMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ29uc3VtZVJpZ2h0cyhpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYWN0aW9uICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogcmVzZXJ2ZSAqLykgewogICAgIC8vIE5vIHJpZ2h0cyBjb25zdW1wdGlvbgpAQCAtMzcyLDExICszNzIsMTMgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywKKyAgICAgICAgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgewogI2Vsc2UKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwpAQCAtNDcwLDEzICs0NzIsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgLyogbGVuZ3RoICovKSB7CiAjZWxzZQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsZW5ndGggKi8pIHsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgotICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoIWRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSB7CiAgICAgICAgIGZpbGVEZXNjID0gZHVwKGZkKTsKICAgICB9IGVsc2UgewpAQCAtNTMzLDEyICs1MzUsMTIgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKICAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CiAgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CiAKQEAgLTU2MiwxMSArNTY0LDExIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKHNlc3Npb24tPmZpbGVEZXNjKTsKQEAgLTU3Niw3ICs1NzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKQEAgLTU4NCw5ICs1ODYsNyBAQAogCiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmV4dGVuZGVkRGF0YS5jbGVhcigpOwotCi0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOwotICAgICAgICBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBoZWFkZXJJbmZvICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCgKICAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8sCkBAIC02MTMsNyArNjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLykgewpAQCAtNjIyLDE5ICs2MjIsMTkgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25SZWFkKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgewogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYKICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CkBAIC02NTQsMTUgKzY1NCwxNSBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLW9mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2Vsc2UKLW9mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbmRpZgogICAgIG9mZl90IG9mZnZhbCA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKQEAgLTY3NSwxMyArNjc1LDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CiAjZWxzZQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgewpAQCAtNjkwLDcgKzY5MCw3IEBACiAKICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVyU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKE5VTEwgIT0gKGRlY29kZXJTZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgJiYKICAgICAgICAgKE5VTEwgIT0gYnVmZmVyKSAmJgogICAgICAgICAobnVtQnl0ZXMgPiAtMSkgJiYKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCmluZGV4IDdiNjZkYzcuLjRhYjUyNzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaApAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgb25WYWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTc0LDI2ICs3NSwyNSBAQAogICAgIERybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKIAotICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKLQotcHJpdmF0ZToKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb25JbXBsKCk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCBkN2YyZDI4Li4wZmEzNDc4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTgzLDEzICsxODMsMTMgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpAQCAtMjM2LDcgKzIzNiw4IEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgIG9mZjY0X3QgLypsZW5ndGgqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KQEAgLTI0NiwzNiArMjQ3LDM4IEBACiAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAjZWxzZQotICAgICh2b2lkKShkZWNyeXB0SGFuZGxlKTsgLy8gdW51c2VkCisgICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUuZ2V0KCkpOyAvLyB1bnVzZWQKICNlbmRpZgogCiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgeworICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIC8qSVYqLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLAorICAgICAgICBEcm1CdWZmZXIqIC8qSVYqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KQEAgLTI5NiwxMiArMjk5LDEyIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAorc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA5MWQxZjdlLi4wMWVmYjIyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMjcsMTEgKzI3LDExIEBACiAgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKQEAgLTU5LDEzICs1OSwxMSBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKaW5kZXggMzAzNWM1YS4uNGRkYTVkNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKQEAgLTMwLDE2ICszMCwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwpAQCAtNTAsNiArNTAsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc2LDYgKzc3LDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUXzFfMihTdGF0dXNfVjFfMiBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOzsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQogCiBzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7CiAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwpAQCAtMTk2LDYgKzIwOSw5IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewogICAgICAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklDcnlwdG9QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTYsNiArMjMyLDcgQEAKICAgICB9CiAKICAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM4OSwyMSArNDA2LDMzIEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwKLSAgICAgICAgICAgIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+ZGVjcnlwdF8xXzIoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksCisgICAgICAgICAgICAgICAgaE1vZGUsIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAorICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CiAgICAgfQogCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBjZjA4NjEwLi41ODg4YWYwIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KQEAgLTQxLDE0ICs0MSwxNiBAQAogCiB1c2luZyBkcm06OlYxXzA6OktleWVkVmVjdG9yOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTksNiArNjEsMTAgQEAKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogbmFtZXNwYWNlIHsKIAogLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudApAQCAtMTM5LDI2ICsxNDUsNTUgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWwgbGV2ZWwpIHsKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CiAgICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9ORToKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQ3J5cHRvOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREU7CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoCisgICAgICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlKSB7CisgICAgc3dpdGNoKGxpY2Vuc2VTdGF0ZSkgeworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVzYWJsZTsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWxfVjFfMiBsZXZlbCkgeworICAgIHN3aXRjaChsZXZlbCkgeworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YxOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMjoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8xOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8yOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgIH0KIH0KLQotCiBzdGF0aWMgOjpLZXllZFZlY3RvciB0b0hpZGxLZXllZFZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYKICAgICAgICAga2V5ZWRWZWN0b3IpIHsKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CkBAIC0xOTksNiArMjM0LDE1IEBACiAgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgorICAgICAgICBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKIHN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIHN0YXR1cykgewogICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMjE3LDcgKzI2MSw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0YXR1czo6QkFEX1ZBTFVFOgogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjM4LDYgKzI4MiwxOSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CisKIAogTXV0ZXggRHJtSGFsOjptTG9jazsKIApAQCAtMjk3LDM5ICszNTQsNTEgQEAKIAogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKICAgICAgICAgfQogICAgIH0KICAgICBtUGx1Z2luLmNsZWFyKCk7CiAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogfQogCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CiAgICAgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzOwogCi0gICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKIAogICAgIGlmIChtYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjEgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTAxLDMyICs1NzAsODAgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCi1ib29sIERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBQYXJjZWwgb2JqOworICAgICAgICB3cml0ZUJ5dGVBcnJheShvYmosIHNlc3Npb25JZCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25Mb3N0U3RhdGUsIDAsICZvYmopOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKKyAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAorICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIGlmIChtaW1lVHlwZSAhPSAiIikgewotICAgICAgICAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKG1GYWN0b3JpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIHV1aWQsIG1pbWVUeXBlLCBsZXZlbCwgaXNTdXBwb3J0ZWQpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwogICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MzQsMTMgKzY1MSwyMiBAQAogICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogCisKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIApAQCAtNTU0LDMwICs2ODAsMTUgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIElOSVRfQ0hFQ0soKTsKIAotICAgIFNlY3VyaXR5TGV2ZWwgaFNlY3VyaXR5TGV2ZWw7CisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOwogICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CiAKLSAgICBzd2l0Y2gobGV2ZWwpIHsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg6CisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXgpIHsKICAgICAgICAgc2V0U2VjdXJpdHlMZXZlbCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0YXR1c190ICBlcnIgPSBVTktOT1dOX0VSUk9SOwpAQCAtNjU3LDYgKzc2OCwzOSBAQAogICAgIHJldHVybiBERUFEX09CSkVDVDsKIH0KIAorc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZSgKKyAgICAgICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCisgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0S2V5UmVxdWVzdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsCiAgICAgICAgIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLCBLZXllZFZlY3RvcjxTdHJpbmc4LApAQCAtNjgzLDczICs4MjcsNTEgQEAKICAgICA6OktleWVkVmVjdG9yIGhPcHRpb25hbFBhcmFtZXRlcnMgPSB0b0hpZGxLZXllZFZlY3RvcihvcHRpb25hbFBhcmFtZXRlcnMpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7Ci0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KLSAgICAgICAgICAgIG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKICAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6Ok5PTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6VVBEQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVXBkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KIAogICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOwpAQCAtODMxLDE4ICs5NTMsMzMgQEAKICAgICBJTklUX0NIRUNLKCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKQEAgLTk4OCwyMiArMTEyNSwzMSBAQAogICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQogICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaENvbm5lY3RlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoTWF4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KIAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQpAQCAtMTA2NSw2ICsxMjExLDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CkBAIC0xMzQzLDIyICsxNTU2LDIyIEBACiAKIHZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKLSAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgibWVkaWFkcm0iKSk7CisgICAgaXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpdGVtLT5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJ2ZW5kb3IiLCB2ZW5kb3IuY19zdHIoKSk7CiAgICAgfQogICAgIHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRpb24gZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwpAQCAtMTM2OSw5ICsxNTgyLDkgQEAKICAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwogICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsIGI2NEVuY29kZWRNZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgIGlmICghaXRlbS0+c2VsZnJlY29yZCgpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VsZiByZWNvcmQgZnJhbWV3b3JrIG1ldHJpY3MiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggNTA5OTYxZi4uNTEyNzRkMSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtNjEsNyArNjEsMTAgQEAKICAgICBHRVRfTlVNQkVSX09GX1NFU1NJT05TLAogICAgIEdFVF9TRUNVUklUWV9MRVZFTCwKICAgICBSRU1PVkVfU0VDVVJFX1NUT1AsCi0gICAgR0VUX1NFQ1VSRV9TVE9QX0lEUworICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLAorICAgIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTgwLDE4ICs4MywyMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSh1dWlkLCAxNik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG1pbWVUeXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKKwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfQ1JZUFRPX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoImlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkOiBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgKmlzU3VwcG9ydGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpOwogCi0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKQEAgLTEyMCwxMSArMTI3LDExIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlY3VyaXR5TGV2ZWwpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobGV2ZWwpOwogCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTM3Niw2ICszODMsNTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNldElkcy5jbGVhcigpOworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKKyAgICAgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfT0ZGTElORV9MSUNFTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGljZW5zZVN0YXRlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC03MTksNyArNzcyLDEyIEBACiAgICAgICAgICAgICB1aW50OF90IHV1aWRbMTZdOwogICAgICAgICAgICAgZGF0YS5yZWFkKHV1aWQsIHNpemVvZih1dWlkKSk7CiAgICAgICAgICAgICBTdHJpbmc4IG1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsICZpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKQEAgLTk4MCw2ICsxMDM4LDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4ga2V5U2V0SWRzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGtleVNldElkcy5zaXplKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdGVyID0ga2V5U2V0SWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IGtleVNldElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaXRlci0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShpdGVyLT5hcnJheSgpLCBpdGVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGl0ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoa2V5U2V0SWQsICZzdGF0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHN0YXRlKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfUFJPUEVSVFlfU1RSSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCmluZGV4IDVjYjQ4YmYuLjhjZDZmOTYgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTM0LDE3ICszNCwxNyBAQAogc3RhdHVzX3QgcmVwb3J0VmVuZG9yTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShuYW1lLmNfc3RyKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBhbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKG5hbWUuY19zdHIoKSkpOworICAgIGFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAKICAgICBzdGQ6OnN0cmluZyBhcHBfcGFja2FnZV9uYW1lKGFwcFBhY2thZ2VOYW1lLmNfc3RyKCksIGFwcFBhY2thZ2VOYW1lLnNpemUoKSk7Ci0gICAgYW5hbHl0aWNzSXRlbS5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOworICAgIGFuYWx5dGljc0l0ZW0tPnNldFBrZ05hbWUoYXBwX3BhY2thZ2VfbmFtZSk7CiAgICAgaWYgKG1ldHJpY3Muc2l6ZSgpID4gMCkgewotICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CisgICAgICAgIGFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CiAgICAgfQogCi0gICAgaWYgKCFhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKSkgewotICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLmdldFNlc3Npb25JRCgpKTsKKyAgICBpZiAoIWFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKSkgeworICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLT5nZXRTZXNzaW9uSUQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA3NjI4OTY4Li45ZTAxMTVlIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAibGliYmluZGVyIiwKICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCAxNTU4ZThiLi5iZjM1MjI0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC02NSw3ICs2NSwyMCBAQAogICAgICpwbHVnaW4gPSBuZXcgQ2xlYXJLZXlDYXNQbHVnaW4oYXBwRGF0YSwgY2FsbGJhY2spOwogICAgIHJldHVybiBPSzsKIH0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdHVzX3QgQ2xlYXJLZXlDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogYm9vbCBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeTo6aXNTeXN0ZW1JZFN1cHBvcnRlZCgKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKICAgICByZXR1cm4gQ0Ffc3lzdGVtX2lkID09IHNDbGVhcktleVN5c3RlbUlkOwpAQCAtODQsNyArOTcsMTMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKICAgICAgICAgdm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQ2FsbGJhY2tFeHQoTlVMTCksIG1BcHBEYXRhKGFwcERhdGEpIHsKKyAgICBBTE9HVigiQ1RPUiIpOworfQorCitDbGVhcktleUNhc1BsdWdpbjo6Q2xlYXJLZXlDYXNQbHVnaW4oCisgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrKQorICAgIDogbUNhbGxiYWNrKE5VTEwpLCBtQ2FsbGJhY2tFeHQoY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CiAgICAgQUxPR1YoIkNUT1IiKTsKIH0KIApAQCAtMTY3LDExICsxODYsMzAgQEAKICAgICAvLyBFY2hvIHRoZSByZWNlaXZlZCBldmVudCB0byB0aGUgY2FsbGJhY2suCiAgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBhbnkgZXZlbnQsIGVjaG8naW5nIGZvciB0ZXN0aW5nIG9ubHkuCiAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLCBldmVudERhdGEuc2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSB7CisgICAgQUxPR1YoInNlbmRTZXNzaW9uRXZlbnQ6IHNlc3Npb25JZD0lcywgZXZlbnQ9JWQsIGFyZz0lZCIsCisgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSwgZXZlbnQsIGFyZyk7CisgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgorICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgorICAgIGlmIChtQ2FsbGJhY2tFeHQgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tFeHQoKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSwgJnNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgewogICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIHN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IDM4OWUxNzIuLmY0OGQ1YjEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDcsNiArNDcsMTEgQEAKICAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtNjMsNiArNjgsNyBAQAogY2xhc3MgQ2xlYXJLZXlDYXNQbHVnaW4gOiBwdWJsaWMgQ2FzUGx1Z2luIHsKIHB1YmxpYzoKICAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjayk7CisgICAgQ2xlYXJLZXlDYXNQbHVnaW4odm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2spOwogICAgIHZpcnR1YWwgfkNsZWFyS2V5Q2FzUGx1Z2luKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByaXZhdGVEYXRhKApAQCAtODUsNiArOTEsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCkBAIC05NCw2ICsxMDQsNyBAQAogICAgIE11dGV4IG1LZXlGZXRjaGVyTG9jazsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8S2V5RmV0Y2hlcj4gbUtleUZldGNoZXI7CiAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IG1DYWxsYmFja0V4dDsKICAgICB2b2lkKiBtQXBwRGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCmluZGV4IDg0MDRhODMuLjI5NjQ3OTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcApAQCAtNjAsNiArNjAsMTkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkKiAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgLypjYWxsYmFjayovLAorICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKKyAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgTW9ja0Nhc1BsdWdpbigpOworICAgIHJldHVybiBPSzsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIE1vY2tEZXNjcmFtYmxlckZhY3Rvcnk6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKQEAgLTE3MCw2ICsxODMsMTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBpbnQzMl90IGV2ZW50LAorICAgICAgICBpbnQgLyphcmcqLywgY29uc3QgQ2FzRGF0YSYgLypldmVudERhdGEqLykgeworICAgIEFMT0dWKCJzZW5kU2Vzc2lvbkV2ZW50OiBzZXNzaW9uSWQ9JXMsIGV2ZW50PSVkIiwKKyAgICAgICAgICBhcnJheVRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGV2ZW50KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIHsKICAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBzdHIuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKaW5kZXggODEwNjk5MC4uNzRiNTQwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKQEAgLTQyLDYgKzQyLDExIEBACiAgICAgICAgICAgICB2b2lkICphcHBEYXRhLAogICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTW9ja0Rlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtODAsNyArODUsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCiAgICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAppbmRleCA5M2M2NDNiLi5kNDhiMGE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKQEAgLTI3LDQgKzI3LDE4IEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhDaGFyc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgLy8gRWFjaCBpbnB1dCBieXRlIGNyZWF0ZXMgdHdvIG91dHB1dCBoZXggY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXRfYnVmZmVyKGxlbmd0aCAqIDIsICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBjaGFyIGJ5dGUgPSBpbl9idWZmZXJbaV07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKV0gPSBrSGV4Q2hhcnNbKGJ5dGUgPj4gNCkgJiAweGZdOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMikgKyAxXSA9IGtIZXhDaGFyc1tieXRlICYgMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9idWZmZXI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCmluZGV4IDI1NDMxMjQuLmFhNTcxYzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApAQCAtMTcsMTQgKzE3LDE2IEBACiAjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCiAjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCiAvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCmluZGV4IDJmY2UwNzkwLi4wYWM4NzljIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCAzNDFkNGY2Li5lOTFlOTE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC0xNCw4ICsxNCw4IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAogCiAgICAgc3JjczogWwpAQCAtMjUsMjMgKzI1LDI0IEBACiAgICAgICAgICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIiwKICAgICAgICAgIkNyeXB0b0ZhY3RvcnkuY3BwIiwKICAgICAgICAgIkNyeXB0b1BsdWdpbi5jcHAiLAorICAgICAgICAiRGV2aWNlRmlsZXMuY3BwIiwKICAgICAgICAgIkRybUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRybVBsdWdpbi5jcHAiLAogICAgICAgICAiSW5pdERhdGFQYXJzZXIuY3BwIiwKICAgICAgICAgIkpzb25XZWJLZXkuY3BwIiwKKyAgICAgICAgIk1lbW9yeUZpbGVTeXN0ZW0uY3BwIiwKICAgICAgICAgIlNlc3Npb24uY3BwIiwKICAgICAgICAgIlNlc3Npb25MaWJyYXJ5LmNwcCIsCi0gICAgICAgICJzZXJ2aWNlLmNwcCIsCiAgICAgXSwKIAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKIAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCkBAIC00OSwxMSArNTAsMTMgQEAKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAogICAgICAgICAibGlianNtbiIsCiAgICAgXSwKIApAQCAtNjUsNCArNjgsMjYgQEAKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICB9LAogfQorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCisgICAgdmVuZG9yOiB0cnVlLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCit9CitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSIsCisgICAgZGVmYXVsdHM6IFsiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic2VydmljZS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCit9CitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5IiwKKyAgICBvdmVycmlkZXM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiXSwKKyAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJzZXJ2aWNlTGF6eS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAppbmRleCBjMmVkNzUxLi42NTdhNDJmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcykgewpAQCAtMTY5LDcgKzE2OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKaW5kZXggZTU4ZjU4YS4uNzVmODM5NSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcApAQCAtMjEsNyArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogQnVmZmVyOjpCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQpAQCAtNDcsNyArNDcsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCmluZGV4IDFiYTVjNmEuLjE0MTBkNzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIGV4dGVybiAiQyIgewpAQCAtMzgsNyArMzgsNyBAQAogfSAvLyBleHRlcm4gIkMiCiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcAppbmRleCAwODQ4Y2VmLi4yYTQ4ZGI2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIFJldHVybjxib29sPiBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTYwLDcgKzYwLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAppbmRleCBmMzNmOTRlLi5mYzBjY2ViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7CkBAIC00MiwxMCArNDIsNDIgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KAorICAgIGJvb2wgc2VjdXJlLAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiBrZXlJZCwKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgaXYsCisgICAgTW9kZSBtb2RlLAorICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgY29uc3QgaGlkbF92ZWM8U3ViU2FtcGxlPiYgc3ViU2FtcGxlcywKKyAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKworICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKKworICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IGRlY3J5cHRfMV8yKAorICAgICAgc2VjdXJlLCBrZXlJZCwgaXYsIG1vZGUsIHBhdHRlcm4sIHN1YlNhbXBsZXMsIHNvdXJjZSwgb2Zmc2V0LCBkZXN0aW5hdGlvbiwKKyAgICAgIFsmXShTdGF0dXNfVjFfMiBoU3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICBzdGF0dXMgPSB0b1N0YXR1c18xXzAoaFN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IGhEZXRhaWxlZEVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgKTsKKworICBzdGF0dXMgPSBoUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgIF9oaWRsX2NiKHN0YXR1cywgYnl0ZXNXcml0dGVuLCBkZXRhaWxlZEVycm9yKTsKKyAgcmV0dXJuIFZvaWQoKTsKK30KKwogLy8gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9yIGNvZGUgYW5kIHBvc2l0aXZlIHZhbHVlcyBmb3IgdGhlIHNpemUgb2YKIC8vIGRlY3J5cHRlZCBkYXRhLiAgSW4gdGhlb3J5LCB0aGUgb3V0cHV0IHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBpbnB1dAogLy8gc2l6ZSwgYnV0IGluIHByYWN0aWNlIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIEFFUy1DVFIuCi1SZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KAorUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdF8xXzIoCiAgICAgICAgIGJvb2wgc2VjdXJlLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JRF9TSVpFPiYga2V5SWQsCiAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKQEAgLTU1LDE3ICs4NywxNyBAQAogICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAogICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCi0gICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgZGVjcnlwdF8xXzJfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQocGF0dGVybik7CiAKICAgICBpZiAoc2VjdXJlKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKICAgICAgICAgICAgICJTZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQ2xlYXJLZXkuIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgaWYgKG1TaGFyZWRCdWZmZXJNYXAuZmluZChzb3VyY2UuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAic291cmNlIGRlY3J5cHQgYnVmZmVyIGJhc2Ugbm90IHNldCIpOwogICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CkBAIC03Myw3ICsxMDUsNyBAQAogICAgIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGVzdCA9IGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeTsKICAgICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoZGVzdC5idWZmZXJJZCkgPT0gbVNoYXJlZEJ1ZmZlck1hcC5lbmQoKSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgIH0KQEAgLTgxLDEyICsxMTMsMTIgQEAKIAogICAgIHNwPElNZW1vcnk+IHNvdXJjZUJhc2UgPSBtU2hhcmVkQnVmZmVyTWFwW3NvdXJjZS5idWZmZXJJZF07CiAgICAgaWYgKHNvdXJjZUJhc2UgPT0gbnVsbHB0cikgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAic291cmNlIGlzIGEgbnVsbHB0ciIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJzb3VyY2UgaXMgYSBudWxscHRyIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgaWYgKHNvdXJjZS5vZmZzZXQgKyBvZmZzZXQgKyBzb3VyY2Uuc2l6ZSA+IHNvdXJjZUJhc2UtPmdldFNpemUoKSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCkBAIC05OCwxMiArMTMwLDEyIEBACiAgICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGVzdEJ1ZmZlciA9IGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeTsKICAgICAgICAgc3A8SU1lbW9yeT4gZGVzdEJhc2UgPSBtU2hhcmVkQnVmZmVyTWFwW2Rlc3RCdWZmZXIuYnVmZmVySWRdOwogICAgICAgICBpZiAoZGVzdEJhc2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlc3RCdWZmZXIub2Zmc2V0ICsgZGVzdEJ1ZmZlci5zaXplID4gZGVzdEJhc2UtPmdldFNpemUoKSkgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOwpAQCAtMTI4LDcgKzE2MCw3IEBACiAKICAgICBpZiAobW9kZSA9PSBNb2RlOjpVTkVOQ1JZUFRFRCkgewogICAgICAgICBpZiAoaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWQgc3Vic2FtcGxlcyBmb3VuZCBpbiBhbGxlZ2VkbHkgdW5lbmNyeXB0ZWQgZGF0YS4iKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KQEAgLTE0NCwyMiArMTc2LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNb2RlOjpBRVNfQ1RSKSB7CiAgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZDsKLSAgICAgICAgU3RhdHVzIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCisgICAgICAgIFN0YXR1c19WMV8yIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpLCB0b1ZlY3RvcihzdWJTYW1wbGVzKSwgJmJ5dGVzRGVjcnlwdGVkKTsKLSAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCksICIiKTsKKyAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVCwgc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzKSwKLSAgICAgICAgICAgICAgICAgICAgIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKHJlcywgMCwgIkRlY3J5cHRpb24gRXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBDbGVhcktleSBEUk0gUGx1Z2luLiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTE3OSw3ICsyMTAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKy8vIFByb3RvYnVmIGdlbmVyYXRlZCBjbGFzc2VzLgordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Ok9mZmxpbmVGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Okhhc2hlZEZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrTGljZW5zZUZpbGVOYW1lRXh0W10gPSAiLmxpYyI7CisKK2Jvb2wgSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc3RkOjpzdHJpbmcqIGhhc2gpIHsKKyAgICBpZiAoIWhhc2gpIHJldHVybiBmYWxzZTsKKworICAgIGhhc2gtPnJlc2l6ZShTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEuZGF0YSgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmKCpoYXNoKVswXSk7CisgICAgU0hBMjU2KGlucHV0LCBkYXRhLnNpemUoKSwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlTGljZW5zZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goc2VyaWFsaXplZEZpbGUsICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlV2l0aEhhc2g6IEZhaWxlZCB0byBjb21wdXRlIGhhc2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaGFzaEZpbGUuc2V0X2ZpbGUoc2VyaWFsaXplZEZpbGUpOworICAgIGhhc2hGaWxlLnNldF9oYXNoKGhhc2gpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIGhhc2hGaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVJhdyhmaWxlTmFtZSwgc2VyaWFsaXplZEhhc2hGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRIYXNoRmlsZSkgeworICAgIE1lbW9yeUZpbGVTeXN0ZW06Ok1lbW9yeUZpbGUgbWVtRmlsZTsKKyAgICBtZW1GaWxlLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKyAgICBtZW1GaWxlLnNldENvbnRlbnQoc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICBtZW1GaWxlLnNldEZpbGVTaXplKHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpOworICAgIHNpemVfdCBsZW4gPSBtRmlsZUhhbmRsZS5Xcml0ZShmaWxlTmFtZSwgbWVtRmlsZSk7CisKKyAgICBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVJhdzogRmFpbGVkIHRvIHdyaXRlICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IGV4cGVjdGVkPSV6ZCwgYWN0dWFsPSV6dSIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiB3cm90ZSAlenUgYnl0ZXMgdG8gJXMiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVMaWNlbnNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGlmICghUmV0cmlldmVIYXNoZWRGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS50eXBlKCkgIT0gT2ZmbGluZUZpbGU6OkxJQ0VOU0UpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnZlcnNpb24oKSAhPSBPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWZpbGUuaGFzX2xpY2Vuc2UoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBMaWNlbnNlIG5vdCBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMaWNlbnNlIGxpY2Vuc2UgPSBmaWxlLmxpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKGxpY2Vuc2Uuc3RhdGUoKSkgeworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRToKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVBY3RpdmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiUmV0cmlldmVMaWNlbnNlOiBVbnJlY29nbml6ZWQgbGljZW5zZSBzdGF0ZTogJXUiLAorICAgICAgICAgICAgICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93bik7CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqb2ZmbGluZUxpY2Vuc2UgPSBsaWNlbnNlLmxpY2Vuc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVBbGxMaWNlbnNlcygpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlQWxsRmlsZXMoKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6TGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGV2aWNlRmlsZXM6Okxpc3RMaWNlbnNlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZXMgPSBtRmlsZUhhbmRsZS5MaXN0RmlsZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpY2Vuc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBsaWNlbnNlID0gbGljZW5zZXNbaV07CisgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlLnN1YnN0cigwLCBsaWNlbnNlLnNpemUoKSAtIHN0cmxlbihrTGljZW5zZUZpbGVOYW1lRXh0KSk7CisgICAgfQorICAgIHJldHVybiBsaWNlbnNlczsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFGaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlcyA9IEdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgc2l6ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBzZXJpYWxpemVkSGFzaEZpbGUucmVzaXplKGJ5dGVzKTsKKyAgICBieXRlcyA9IG1GaWxlSGFuZGxlLlJlYWQoZmlsZU5hbWUsICZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgaWYgKGJ5dGVzICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogZXhwZWN0ZWQ6ICV6ZCwgYWN0dWFsOiAlemQiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBieXRlcyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiByZWFkICV6ZCBmcm9tICVzIiwgYnl0ZXMsIGZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBpZiAoIWhhc2hGaWxlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkSGFzaEZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBoYXNoIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChoYXNoRmlsZS5maWxlKCksICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhhc2ggIT0gaGFzaEZpbGUuaGFzaCgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggbWlzbWF0Y2giKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUtPlBhcnNlRnJvbVN0cmluZyhoYXNoRmlsZS5maWxlKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoZmlsZU5hbWUpOworfQorCitib29sIERldmljZUZpbGVzOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGZpbGVOYW1lKTsKK30KKworc3NpemVfdCBEZXZpY2VGaWxlczo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkdldEZpbGVTaXplKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDc3NTU3ZjkuLjlmYjViYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzAsMTAgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTQxLDYgKzQyLDEzIEBACiAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCh1dWlkLmRhdGEoKSk7CiB9CiAKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHJldHVybiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSAmJiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlKSAmJgorICAgICAgICAgICAgbGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKK30KKwogUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CiAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCiAgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fApAQCAtNzEsNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IDNiNjEwODUuLmJhZGI5OWUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIkNsZWFyS2V5RHJtUHJvcGVydGllcy5oIgogI2luY2x1ZGUgIlNlc3Npb24uaCIKICNpbmNsdWRlICJUeXBlQ29udmVydC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5U2V0SWRQcmVmaXgoImNraWQiKTsKK2NvbnN0IGludCBrS2V5U2V0SWRMZW5ndGggPSAxNjsKIGNvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrT2ZmbGluZUxpY2Vuc2UoIlwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCIiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOwotY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOwogCiBjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKQEAgLTU0LDE4ICs1OCwzMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAorS2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV9WMV8wKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgIHJldHVybiBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSk7CisgIH0KK30KKwogRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQogICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSksCiAgICAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQoMCksCi0gICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSB7CisgICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgICAgICBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykgewogICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CiAgICAgaW5pdFByb3BlcnRpZXMoKTsKICAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7CiB9CiAKIHZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKQEAgLTc1LDYgKzkyLDcgQEAKICAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKICAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0RybUVycm9yVGVzdFZhbHVlOwogCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CiAgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKQEAgLTEwMyw2ICsxMjEsNyBAQAogCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKQEAgLTExNCw2ICsxMzMsNyBAQAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKICAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHByb2Nlc3NNb2NrRXJyb3Ioc2Vzc2lvbik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CiAKICAgICBTdGF0dXMgc3RhdHVzID0gc2V0U2VjdXJpdHlMZXZlbChzZXNzaW9uSWQsIHNlY3VyaXR5TGV2ZWwpOwpAQCAtMTI5LDYgKzE0OSwxMCBAQAogCiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CiAgICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgc2VuZFNlc3Npb25Mb3N0U3RhdGUoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CiAgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CiAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwpAQCAtMTM3LDM1ICsxNjEsNzUgQEAKICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwogfQogCi1TdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKK1N0YXR1c19WMV8yIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAogICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmVxdWVzdCwKLSAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlLAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICprZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpIHsKICAgICAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKKyAgICAvLyBHZXRLZXlSZXF1ZXN0T2ZmbGluZUtleVR5cGVOb3RTdXBwb3J0ZWQoKSBpbiB2dHMgMS4wIGFuZCAxLjEgZXhwZWN0cworICAgIC8vIEtleVR5cGU6Ok9GRkxJTkUgdG8gcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFIGluIGNsZWFya2V5IHBsdWdpbi4KKyAgICAvLyBUaG9zZSB0ZXN0cyBwYXNzIGluIGFuIGVtcHR5IGluaXREYXRhLCB3ZSB1c2UgdGhlIGVtcHR5IGluaXREYXRhIHRvCisgICAgLy8gc2lnbmFsIHN1Y2ggc3BlY2lmaWMgdXNlIGNhc2UuCisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSAmJiAwID09IGluaXREYXRhLnNpemUoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKwogICAgICpkZWZhdWx0VXJsID0gIiI7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKLSAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpTVFJFQU1JTkcgfHwga2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OklOSVRJQUw7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKLSAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICB9CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KAorICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIHJlcXVlc3QpKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QtPmJlZ2luKCksIHJlcXVlc3QtPmVuZCgpKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eVJlc3BvbnNlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5U2V0SWRTdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ibGVtIHJlbGVhc2luZyBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZWxlYXNlS2V5c01hcC5maW5kKGtleVNldElkU3RyaW5nKSA9PSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgbVJlbGVhc2VLZXlzTWFwW2tleVNldElkU3RyaW5nXSA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgia2V5IGlzIGluIHVzZSwgaWdub3JlIHJlbGVhc2UgcmVxdWVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk9mZmxpbmUgbGljZW5zZSBub3QgZm91bmQsIG5vdGhpbmcgdG8gcmVsZWFzZSIpOworICAgICAgICB9CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlJFTEVBU0U7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3OCwxNSArMjQyLDE1IEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAotICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKLSAgICBTdGF0dXMgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKHN0YXR1cyksIHRvSGlkbFZlYyhyZXF1ZXN0KSwKKyAgICAgICAgICAgIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChrZXlSZXF1ZXN0VHlwZSksCiAgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KQEAgLTIwMCwxMCArMjY0LDMxIEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKKworICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBrZXlSZXF1ZXN0VHlwZSwgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCkBAIC0yMjcsNiArMzEyLDMwIEBACiAgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CiB9CiAKK2Jvb2wgRHJtUGx1Z2luOjptYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKSB7CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICBBTE9HRSgia2V5U2V0SWQgZGVzdGluYXRpb24gbm90IHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga3NpZChrS2V5U2V0SWRQcmVmaXguYmVnaW4oKSwga0tleVNldElkUHJlZml4LmVuZCgpKTsKKyAgICBrc2lkLnJlc2l6ZShrS2V5U2V0SWRMZW5ndGgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJhbmRvbURhdGEoKGtLZXlTZXRJZExlbmd0aCAtIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpIC8gMiwgMCk7CisKKyAgICB3aGlsZSAoa2V5U2V0SWQtPmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ciA9IHJhbmRvbURhdGEuYmVnaW4oKTsgaXRyICE9IHJhbmRvbURhdGEuZW5kKCk7ICsraXRyKSB7CisgICAgICAgICAgICAqaXRyID0gc3RkOjpyYW5kKCkgJSAweGZmOworICAgICAgICB9CisgICAgICAgICprZXlTZXRJZCA9IGtLZXlTZXRJZFByZWZpeCArIEJ5dGVBcnJheVRvSGV4U3RyaW5nKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhbmRvbURhdGEuZGF0YSgpKSwgcmFuZG9tRGF0YS5zaXplKCkpOworICAgICAgICBpZiAobUZpbGVIYW5kbGUuTGljZW5zZUV4aXN0cygqa2V5U2V0SWQpKSB7CisgICAgICAgICAgICAvLyBjb2xsaXNpb24sIHJlZ2VuZXJhdGUKKyAgICAgICAgICAgIEFMT0dWKCJSZXRyeSBnZW5lcmF0aW5nIEtleVNldElkIik7CisgICAgICAgICAgICBrZXlTZXRJZC0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTIzNywyMiArMzQ2LDYwIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IHRvVmVjdG9yKHNjb3BlKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgYm9vbCBpc1JlbGVhc2UgPSAobWVtY21wKHNjb3BlSWQuZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSA9PSAwKTsKKyAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgIGtleVNldElkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworCisgICAgICAgIGF1dG8gaXRlciA9IG1SZWxlYXNlS2V5c01hcC5maW5kKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSk7CisgICAgICAgIGlmIChpdGVyICE9IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihpdGVyLT5zZWNvbmQuYmVnaW4oKSwgaXRlci0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgLy8gbm9uIG9mZmxpbmUgbGljZW5zZSByZXR1cm5zIGVtcHR5IGtleVNldElkCisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVELCBoaWRsX3ZlYzx1aW50OF90PigpKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0KICAgICBzZXRQbGF5UG9saWN5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7Ci0gICAga2V5U2V0SWQuY2xlYXIoKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIC8vIFRlc3QgY2FsbGluZyBBTWVkaWFEcm0gbGlzdGVuZXJzLgotICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgdG9WZWN0b3Ioc2NvcGUpLCB0b1ZlY3RvcihzY29wZSkpOworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ha2VLZXlTZXRJZCgma2V5U2V0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04sIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZSh0b1ZlY3RvcihzY29wZSksIDEwMCk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IG1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZXNwb25zZS5iZWdpbigpLCByZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzOwogICAgICAgICBLZXlTdGF0dXMga2V5U3RhdHVzOwpAQCAtMjY3LDE2ICs0MTQsNTEgQEAKICAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOwogICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOwogCi0gICAgICAgIHNlbmRLZXlzQ2hhbmdlKHRvVmVjdG9yKHNjb3BlKSwga2V5c1N0YXR1cywgdHJ1ZSk7CisgICAgICAgIHNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5c1N0YXR1cywgdHJ1ZSk7CisKKyAgICAgICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2Vzc2lvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJvdmlkZUtleVJlc3BvbnNlIHJldHVybnMgZXJyb3I9JWQiLCBzdGF0dXMpOwogICAgIH0KIAotICAgIGluc3RhbGxTZWN1cmVTdG9wKHNjb3BlKTsKLQotICAgIC8vIFJldHVybnMgc3RhdHVzIGFuZCBlbXB0eSBrZXlTZXRJZAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWRWZWMoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkVmVjKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZXN0b3JlS2V5cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOworICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKKyAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd24gPT0gbGljZW5zZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBsaWNlbnNlIHN0YXRlPSVkIiwgbGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4ob2ZmbGluZUxpY2Vuc2UuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBvZmZsaW5lTGljZW5zZS5lbmQoKSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBrZXlzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZShwcm9wZXJ0eU5hbWUuY19zdHIoKSk7CkBAIC0yOTIsNiArNDc0LDggQEAKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWxnb3JpdGhtc0tleV07CiAgICAgfSBlbHNlIGlmIChuYW1lID09IGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KSB7CiAgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0RybUVycm9yVGVzdEtleV07CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAiIik7CkBAIC0zMzYsNiArNTIwLDE2IEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ZyYW1lVG9vTGFyZ2VWYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgICAgICB9CisgICAgfQorCiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKHZhbHVlLmNfc3RyKCkpOwogICAgIHJldHVybiBTdGF0dXM6Ok9LOwogfQpAQCAtMzQ2LDYgKzU0MCw5IEBACiAgICBpZiAobmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKICAgICAgIEFMT0dEKCJDYW5ub3Qgc2V0IGltbXV0YWJsZSBwcm9wZXJ0eTogJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgfSBlbHNlIGlmIChuYW1lID09IGtDbGllbnRJZEtleSkgeworICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSB0b1ZlY3Rvcih2YWx1ZSk7CisgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiAgICB9CiAKICAgIC8vIFNldHRpbmcgb2YgdW5kZWZpbmVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZApAQCAtNDgzLDYgKzY4MCw1MSBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VOYW1lcyA9IG1GaWxlSGFuZGxlLkxpc3RMaWNlbnNlcygpOworICAgIHN0ZDo6dmVjdG9yPEtleVNldElkPiBrZXlTZXRJZHM7CisgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogbGljZW5zZU5hbWVzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSk7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgIH0KKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBrZXlTZXRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQpIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgaWYgKG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2UobGljZW5zZU5hbWUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQmIGtleVNldElkLAorICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKKyAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGU7CisgICAgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVVbmtub3duOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBoTGljZW5zZVN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4gc3RvcHM7CiAgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgewpAQCAtNTg1LDcgKzgyNyw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCmluZGV4IGUyYmI2NTEuLjhlYmI0MmIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgewpAQCAtNDUsMjEgKzQ1LDIyIEBACiB9CiAKIFN0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgewogICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CiAKLSAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgaWYgKG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgewogICAgICAgICBTdGF0dXMgcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQpIHsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgewogICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECiAgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgewogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CkBAIC02OSw4ICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICB9CiAKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgIC8vIHJlc3RvcmUga2V5CisgICAgfQorCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKLSAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlJZHMpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CiAKICAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKQEAgLTEzMSw5ICsxMzYsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KIAotc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5U2Vzc2lvbigiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50U2Vzc2lvbigiXSxcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwifSIpOwogCiAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CiAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOwpAQCAtMTQ3LDcgKzE1NCwxMiBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZChlbmNvZGVkSWQpOwogICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKICAgICB9Ci0gICAgcmVxdWVzdC5hcHBlbmQoa1JlcXVlc3RTdWZmaXgpOworICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrVGVtcG9yYXJ5U2Vzc2lvbik7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6Ok9GRkxJTkUgfHwKKyAgICAgICAgICAgICAgICAgICBrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtQZXJzaXN0ZW50U2Vzc2lvbik7CisgICAgfQogCiAgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCiAgICAgY29uc3QgY2hhciBrQmFzZTY0UGFkZGluZyA9ICc9JzsKQEAgLTE1Nyw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKaW5kZXggY2NjYjQxZS4uZDkzNzc3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0yMiwxOCArMjIsMjEgQEAKICNpbmNsdWRlICJCYXNlNjQuaCIKIAogbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOwotY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUYWcoImsiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlJZFRhZygia2lkIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOworY29uc3Qgc3RkOjpzdHJpbmcga01lZGlhU2Vzc2lvblR5cGUoInR5cGUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50TGljZW5zZVNlc3Npb24oInBlcnNpc3RlbnQtbGljZW5zZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlU2Vzc2lvbigidGVtcG9yYXJ5Iik7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEpzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7CkBAIC0yNjgsNyArMjcxLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2QwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKTsKK30KKworc3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlc3VsdC0+c2Vjb25kLmdldEZpbGVTaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHNpemUgZm9yICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNZW1vcnlGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3Q7CisgICAgZm9yIChjb25zdCBhdXRvJiBmaWxlbmFtZSA6IG1NZW1vcnlGaWxlU3lzdGVtKSB7CisgICAgICAgIGxpc3QucHVzaF9iYWNrKGZpbGVuYW1lLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogYnVmZmVyKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGUgPSByZXN1bHQtPnNlY29uZC5nZXRDb250ZW50KCk7CisgICAgICAgIGJ1ZmZlci0+YXNzaWduKHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgICAgIHJldHVybiBidWZmZXItPnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZnJvbSAlcyIsIHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2Uoa2V5KTsKKyAgICB9CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4oa2V5LCBtZW1vcnlGaWxlKSk7CisgICAgcmV0dXJuIG1lbW9yeUZpbGUuZ2V0RmlsZVNpemUoKTsKK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgbGljZW5zZSB0byByZW1vdmU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uY2xlYXIoKTsKKyAgICByZXR1cm4gbU1lbW9yeUZpbGVTeXN0ZW0uZW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCmluZGV4IDA3YzkyNjkuLmE5ZDcwMTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcApAQCAtMjgsNyArMjgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTQyLDkgKzQyLDEwIEBACiBTdGF0dXMgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7Ci0gICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVJlcXVlc3QpOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBrZXlSZXF1ZXN0KTsKIH0KIAogU3RhdHVzIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKQEAgLTY3LDI5ICs2OCwzNCBAQAogICAgIH0KIH0KIAotU3RhdHVzIFNlc3Npb246OmRlY3J5cHQoCitTdGF0dXNfVjFfMiBTZXNzaW9uOjpkZWNyeXB0KAogICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKICAgICAgICAgdWludDhfdCogZGVzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAogICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwogCisgICAgaWYgKGdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICByZXR1cm4gZ2V0TW9ja0Vycm9yKCk7CisgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CiAgICAga2V5SWRWZWN0b3IuY2xlYXIoKTsKICAgICBrZXlJZFZlY3Rvci5pbnNlcnQoa2V5SWRWZWN0b3IuZW5kKCksIGtleUlkLCBrZXlJZCArIGtCbG9ja1NpemUpOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdHI7CiAgICAgaXRyID0gbUtleU1hcC5maW5kKGtleUlkVmVjdG9yKTsKICAgICBpZiAoaXRyID09IG1LZXlNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKLSAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgU3RhdHVzIHN0YXR1cyA9IGRlY3J5cHRvci5kZWNyeXB0KAogICAgICAgICAgICAgaXRyLT5zZWNvbmQgLyprZXkqLywgaXYsIHNyY1B0ciwgZGVzdFB0ciwgc3ViU2FtcGxlcywKICAgICAgICAgICAgIHN1YlNhbXBsZXMuc2l6ZSgpLCBieXRlc0RlY3J5cHRlZE91dCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPihzdGF0dXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAppbmRleCBiNDMxOWU2Li45OWZiMzBmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw3ICs1OSw4IEBACiAKICAgICBtU2Vzc2lvbnMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKICAgICAgICAgICAgIHNwPFNlc3Npb24+ID4oc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKSk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtNzAsNyArNzEsOCBAQAogc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtODQsNyArODYsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTg1NmEuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTEgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIG1lZGlhCi0gICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZkM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTQgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBkaXNhYmxlZAorICAgIG9uZXNob3QKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTIgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKaW5kZXggMGM3ZWYyMC4uNzIxZjRjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC00Miw3ICs0Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCmluZGV4IDRhMzg1YmQuLmVjMzBjYzEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC0zOCw3ICszOCw3IEBACiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKaW5kZXggNWJiYjI4YS4uYzQ5N2UzNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKaW5kZXggZDY1YjI1Yy4uMWJiYzgyMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMjIsMzAgKzIyLDM5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0S2V5KCJkcm1FcnJvclRlc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0VmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSgicmVzb3VyY2VDb250ZW50aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRnJhbWVUb29MYXJnZVZhbHVlKCJmcmFtZVRvb0xhcmdlIik7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KICAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAogICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCiAvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAppbmRleCA0NmNiNWU0Li4wM2M0MzRlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKQEAgLTE3LDE3ICsxNywxOCBAQAogI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCA5OTUyMDI3Li42MzY4ZjNkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggMTc1YWI3Ni4uMjAzYmIyZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCA2YTczODA2Li44NjgwZjBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTMyLDE2ICszMiwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUxLDcgKzUyLDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBJQ3J5cHRvUGx1Z2luIHsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK3N0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luIHsKICAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgICAgICBtSW5pdFN0YXR1cyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KQEAgLTgwLDYgKzgzLDE4IEBACiAgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCiAgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKIAorICAgIFJldHVybjx2b2lkPiBkZWNyeXB0XzFfMigKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSVZfU0laRT4mIGl2LAorICAgICAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICAgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKTsKKwogICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOwogCkBAIC05Niw3ICsxMTEsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm90b3MvRGV2aWNlRmlsZXMucGIuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitjbGFzcyBEZXZpY2VGaWxlcyB7CisgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKSB7fTsKKyAgICB2aXJ0dWFsIH5EZXZpY2VGaWxlcygpIHt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zZXRfaWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKaW5kZXggNmY1ODE5NS4uNGNhODU2ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTM5LDYgKzM5LDEwIEBACiAgICAgUmV0dXJuPGJvb2w+IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48Ym9vbD4gaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUpCiAgICAgICAgICAgICBvdmVycmlkZTsKIApAQCAtNTIsNyArNTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBmYjA2OTVhLi5iYTVmYTY1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0xNywzMiArMTcsNDIgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKICNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlc3Npb25JZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKK3VzaW5nIGRybTo6VjFfMDo6U2Vzc2lvbklkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTUwLDEwICs2MCwxNSBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCiBzdHJ1Y3QgRHJtUGx1Z2luIDogcHVibGljIElEcm1QbHVnaW4gewogICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpOwogCi0gICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KIAogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCkBAIC03Nyw2ICs5MiwxNCBAQAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gcHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTkxLDEzICsxMTQsNyBAQAogCiAgICAgUmV0dXJuPFN0YXR1cz4gcmVzdG9yZUtleXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotCi0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9CisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgb3ZlcnJpZGU7CiAKICAgICBSZXR1cm48dm9pZD4gcXVlcnlLZXlTdGF0dXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xMTUsNiArMTMyLDE4IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIGdldFByb3Zpc2lvblJlcXVlc3RfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZVR5cGUpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVBdXRob3JpdHkpOworCisgICAgICAgIGhpZGxfc3RyaW5nIGRlZmF1bHRVcmw7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgaGlkbF92ZWM8dWludDhfdD4oKSwgZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLAogICAgICAgICBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VfY2IgX2hpZGxfY2IpIHsKQEAgLTEzNCw2ICsxNjMsMTMgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0SGRjcExldmVsc18xXzIoZ2V0SGRjcExldmVsc18xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgY29ubmVjdGVkTGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOworICAgICAgICBIZGNwTGV2ZWxfVjFfMiBtYXhMZXZlbCA9IEhkY3BMZXZlbF9WMV8yOjpIRENQX05PX09VVFBVVDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6Ok9LLCBjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBnZXROdW1iZXJPZlNlc3Npb25zKGdldE51bWJlck9mU2Vzc2lvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKQEAgLTE0MSw2ICsxNzcsMTMgQEAKIAogICAgIFJldHVybjx2b2lkPiBnZXRNZXRyaWNzKGdldE1ldHJpY3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkICZrZXlTZXRJZCkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQsCisgICAgICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKwogICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCiAgICAgICAgIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKQEAgLTI0OCwxMiArMjkxLDE3IEBACiAKICAgICBSZXR1cm48dm9pZD4gc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybVBsdWdpbkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lclYxXzIgPSBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjo6Y2FzdEZyb20obGlzdGVuZXIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH07CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudCgKKyAgICAgICAgICAgIEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBkYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjYxLDggKzMwOSwxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yNzAsOSArMzIyLDEyIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yODAsNiArMzM1LDE0IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCkBAIC0zMDAsMTggKzM2MywxOSBAQAogcHJpdmF0ZToKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBpbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIG1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpOwogICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CiAKLSAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgU3RhdHVzX1YxXzIgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCiAgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAotICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqZ2V0S2V5UmVxdWVzdFR5cGUsCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZGVmYXVsdFVybCk7CiAKICAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKQEAgLTMyMywxOSArMzg3LDMxIEBACiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbVJlbGVhc2VLZXlzTWFwOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPiBtU2VjdXJpdHlMZXZlbDsKICAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMj4gbUxpc3RlbmVyVjFfMjsKICAgICBTZXNzaW9uTGlicmFyeSAqbVNlc3Npb25MaWJyYXJ5OwogICAgIGludDY0X3QgbU9wZW5TZXNzaW9uT2tDb3VudDsKICAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Pa0NvdW50OwogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OwogICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOwogCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3IobU1vY2tFcnJvcik7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKaW5kZXggMzE4OWM0YS4uODg5ZjUxMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtMzQsNyArMzQsOCBAQAogICAgIEluaXREYXRhUGFyc2VyKCkge30KIAogICAgIFN0YXR1cyBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CiAKIHByaXZhdGU6CkBAIC00MywxMiArNDQsMTIgQEAKICAgICBTdGF0dXMgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKIAotICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdCgKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCmluZGV4IDRhYjAzNGMuLmU1NzQ3MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogY2xhc3MgSnNvbldlYktleSB7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICAvLyBMaWNlbnNlIGZpbGUgbmFtZSBpcyBtYWRlIHVwIG9mIGEgdW5pcXVlIGtleVNldElkLCB0aGVyZWZvcmUsCisgICAgLy8gdGhlIGZpbGVuYW1lIGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGxpY2Vuc2VzIGluIHRoZQorICAgIC8vIG1lbW9yeSBmaWxlIHN5c3RlbS4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CisKKyAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVtb3J5RmlsZVN5c3RlbSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggY2RkZmNhNS4uYTE1OWU1YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw0MyArMjcsNTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKKwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCi0gICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHt9CiAgICAgdmlydHVhbCB+U2Vzc2lvbigpIHt9CiAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgU3RhdHVzIGdldEtleVJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWltZVR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKIAogICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOwogCi0gICAgU3RhdHVzIGRlY3J5cHQoCisgICAgU3RhdHVzX1YxXzIgZGVjcnlwdCgKICAgICAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICAgICAgdWludDhfdCogZHN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKIAorICAgIHZvaWQgc2V0TW9ja0Vycm9yKFN0YXR1c19WMV8yIGVycm9yKSB7bU1vY2tFcnJvciA9IGVycm9yO30KKyAgICBTdGF0dXNfVjFfMiBnZXRNb2NrRXJyb3IoKSBjb25zdCB7cmV0dXJuIG1Nb2NrRXJyb3I7fQorCiBwcml2YXRlOgogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CiAgICAgS2V5TWFwIG1LZXlNYXA7CiAgICAgTXV0ZXggbU1hcExvY2s7CisKKyAgICAvLyBGb3IgbW9ja2luZyBlcnJvciByZXR1cm4gc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCmluZGV4IDMyNmEwYzEuLjFlNTY3YjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTgsNyArNTgsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKaW5kZXggY2MwNjMyOS4uYjBmODYwNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC02OCw4ICs2OCwxOSBAQAogICAgIHJldHVybiB2ZWM7CiB9CiAKK2lubGluZSBTdGF0dXMgdG9TdGF0dXNfMV8wKFN0YXR1c19WMV8yIHN0YXR1cykgeworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRldmljZV9maWxlcy5wcm90bworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgIEZvcm1hdCBvZiB2YXJpb3VzIGZpbGVzIHN0b3JlZCBhdCB0aGUgZGV2aWNlLgorLy8KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuZHJtLlYxXzIuY2xlYXJrZXk7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgTGljZW5zZSB7CisgIGVudW0gTGljZW5zZVN0YXRlIHsKKyAgICBBQ1RJVkUgPSAxOworICAgIFJFTEVBU0lORyA9IDI7CisgIH0KKworICBvcHRpb25hbCBMaWNlbnNlU3RhdGUgc3RhdGUgPSAxOworICBvcHRpb25hbCBieXRlcyBsaWNlbnNlID0gMjsKK30KKworbWVzc2FnZSBPZmZsaW5lRmlsZSB7CisgIGVudW0gRmlsZVR5cGUgeworICAgIExJQ0VOU0UgPSAxOworICB9CisKKyAgZW51bSBGaWxlVmVyc2lvbiB7CisgICAgVkVSU0lPTl8xID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIEZpbGVUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBGaWxlVmVyc2lvbiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IFZFUlNJT05fMV07CisgIG9wdGlvbmFsIExpY2Vuc2UgbGljZW5zZSA9IDM7CisKK30KKworbWVzc2FnZSBIYXNoZWRGaWxlIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZmlsZSA9IDE7CisgIC8vIEEgcmF3IChub3QgaGV4LWVuY29kZWQpIFNIQTI1NiwgdGFrZW4gb3ZlciB0aGUgYnl0ZXMgb2YgJ2ZpbGUnLgorICBvcHRpb25hbCBieXRlcyBoYXNoID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCmluZGV4IDZhOTdiNzIuLmIzOWVhMDEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcApAQCAtMTMsMzIgKzEzLDI0IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIKLQogI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwotCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7Ci0KLSAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCi0gICAgLy8gL2Rldi92bmRiaW5kZXIKLSAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOwotCiAgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKICAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmQ4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OkxhenlTZXJ2aWNlUmVnaXN0cmFyOworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OworICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CisKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIExhenlTZXJ2aWNlUmVnaXN0cmFyIHNlcnZpY2VSZWdpc3RyYXI7CisKKyAgICAvLyBTZXR1cCBod2JpbmRlciBzZXJ2aWNlCisgICAgQ0hFQ0tfRVEoc2VydmljZVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2UoZHJtRmFjdG9yeSwgImNsZWFya2V5IiksIGFuZHJvaWQ6Ok5PX0VSUk9SKQorICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIENsZWFya2V5IEZhY3RvcnkgSEFMIjsKKyAgICBDSEVDS19FUShzZXJ2aWNlUmVnaXN0cmFyLnJlZ2lzdGVyU2VydmljZShjcnlwdG9GYWN0b3J5LCAiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgQ3J5cHRvICBIQUwiOworCisgICAgam9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI3YmE0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFlN2M5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNTU4NjU3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxYTk5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KLSNkZWZpbmUgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSBtYXN0ZXJpbmdfaW5kaWNhdGlvbiB7Ci0gICAgTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQsCi0gICAgTUFTVEVSRURfRk9SX1NURVJFTywKLSAgICBNQVNURVJFRF9GT1JfU1VSUk9VTkQsCi0gICAgTUFTVEVSRURfRk9SXzNELAotICAgIE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkUsCi19OwotCi1zdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQ7Ci0gICAgaW50MzJfdCBtUHJvZ3JhbUlkOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYWJlbHM7Ci0gICAgU3RyaW5nOCBtTGFuZ3VhZ2U7Ci0gICAgaW50MzJfdCBtTWFzdGVyaW5nSW5kaWNhdGlvbjsKLSAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlOwotICAgIGJvb2wgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZTsKLSAgICBib29sIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlOwotCi0gICAgQXVkaW9QcmVzZW50YXRpb24oKSB7Ci0gICAgICAgIG1QcmVzZW50YXRpb25JZCA9IC0xOwotICAgICAgICBtUHJvZ3JhbUlkID0gLTE7Ci0gICAgICAgIG1MYW5ndWFnZSA9ICIiOwotICAgICAgICBtTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUklOR19OT1RfSU5ESUNBVEVEOwotICAgICAgICBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgfQotfTsKLQotdHlwZWRlZiBWZWN0b3I8c3A8QXVkaW9QcmVzZW50YXRpb24+PiBBdWRpb1ByZXNlbnRhdGlvbnM7Ci0KLWNsYXNzIEF1ZGlvUHJlc2VudGF0aW9uSW5mbyA6IHB1YmxpYyBSZWZCYXNlIHsKLSBwdWJsaWM6Ci0gICAgQXVkaW9QcmVzZW50YXRpb25JbmZvKCk7Ci0KLSAgICB+QXVkaW9QcmVzZW50YXRpb25JbmZvKCk7Ci0KLSAgICB2b2lkIGFkZFByZXNlbnRhdGlvbihzcDxBdWRpb1ByZXNlbnRhdGlvbj4gcHJlc2VudGF0aW9uKTsKLQotICAgIHNpemVfdCBjb3VudFByZXNlbnRhdGlvbnMoKSBjb25zdDsKLQotICAgIGNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gICAgQXVkaW9QcmVzZW50YXRpb25zIG1QcmVzZW50YXRpb25zOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjZiZmFmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAppbmRleCA5MDViZWMxLi4xOThiMjdlIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitzdGFnZWZyaWdodC9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKaW5kZXggNTRjODA0Ny4uZDJhYjJmMSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaCBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YjJjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlMmRkMDgyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNGIzNWZlMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NDcyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVRyYWNrOworY2xhc3MgTWV0YURhdGFCYXNlOworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitleHRlcm4gIkMiIHsKKworc3RydWN0IENEYXRhU291cmNlIHsKKyAgICBzc2l6ZV90ICgqcmVhZEF0KSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgKCpnZXRTaXplKSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmhhbmRsZSApOworICAgIGJvb2wgKCpnZXRVcmkpKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisgICAgdm9pZCAqaGFuZGxlOworfTsKKworZW51bSBDTWVkaWFUcmFja1JlYWRPcHRpb25zIDogdWludDMyX3QgeworICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IDAsCisgICAgU0VFS19ORVhUX1NZTkMgPSAxLAorICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gMiwKKyAgICBTRUVLX0NMT1NFU1QgPSAzLAorICAgIFNFRUtfRlJBTUVfSU5ERVggPSA0LAorICAgIFNFRUsgPSA4LAorICAgIE5PTkJMT0NLSU5HID0gMTYKK307CisKKy8qKgorICogb25seSB1c2UgQ01lZGlhQnVmZmVyIGFsbG9jYXRlZCBmcm9tIHRoZSBDTWVkaWFCdWZmZXJHcm91cCB0aGF0IGlzCisgKiBwcm92aWRlZCB0byBDTWVkaWFUcmFjazo6c3RhcnQoKQorICovCitzdHJ1Y3QgQ01lZGlhQnVmZmVyIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCogKCpkYXRhKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnNpemUpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2Vfb2Zmc2V0KSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX2xlbmd0aCkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkICgqc2V0X3JhbmdlKSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworICAgIEFNZWRpYUZvcm1hdCogKCptZXRhX2RhdGEpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhQnVmZmVyR3JvdXAgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBib29sICgqaW5pdCkodm9pZCAqaGFuZGxlLCBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworICAgIHZvaWQgKCphZGRfYnVmZmVyKSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmFjcXVpcmVfYnVmZmVyKSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKTsKKyAgICBib29sICgqaGFzX2J1ZmZlcnMpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhVHJhY2sgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0b3ApKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0Rm9ybWF0KSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpyZWFkKSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKTsKKyAgICBib29sICAgICAoKnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3IgeworICAgIHZvaWQgKmRhdGE7CisKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisgICAgc2l6ZV90ICgqY291bnRUcmFja3MpKHZvaWQgKmRhdGEpOworICAgIENNZWRpYVRyYWNrKiAoKmdldFRyYWNrKSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0VHJhY2tNZXRhRGF0YSkoCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldE1ldGFEYXRhKSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqc2V0TWVkaWFDYXMpKHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7CisgICAgY29uc3QgY2hhciAqICgqbmFtZSkodm9pZCAqZGF0YSk7Cit9OworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Cit0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOworCisvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKy8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKKy8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCit0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jIENyZWF0b3JGdW5jOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90IGJbMTZdOworfSBtZWRpYV91dWlkX3Q7CisKK3N0cnVjdCBFeHRyYWN0b3JEZWYgeworICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247CisKKyAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICBtZWRpYV91dWlkX3QgZXh0cmFjdG9yX3V1aWQ7CisKKyAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgLy8gYmUgdXNlZC4KKyAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOworCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU25pZmZlckZ1bmMgc25pZmY7CisgICAgICAgIH0gdjI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgICAgIC8vIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgY29udGFpbmVyIG1pbWUgdHlwZXMgYW5kL29yIGZpbGUgZXh0ZW5zaW9ucworICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cworICAgICAgICAgICAgY29uc3QgY2hhciAqKnN1cHBvcnRlZF90eXBlczsKKyAgICAgICAgfSB2MzsKKyAgICB9IHU7Cit9OworCisvLyB0aGUgQysrIGJhc2VkIEFQSSB3aGljaCBmaXJzdCBzaGlwcGVkIGluIFAgYW5kIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0xFR0FDWSA9IDE7CisKKy8vIHRoZSBmaXJzdCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSA9IDI7CisKKy8vIHRoZSBzZWNvbmQgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIgPSAzOworCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMjsKKworLy8gZWFjaCBwbHVnaW4gbGlicmFyeSBleHBvcnRzIG9uZSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUKK3R5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOworCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXI7CisKK2NsYXNzIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKik7CisgICAgQ01lZGlhQnVmZmVyICptQnVmZmVyOworcHVibGljOgorICAgIE1lZGlhQnVmZmVySGVscGVyKENNZWRpYUJ1ZmZlciAqYnVmKSB7CisgICAgICAgIG1CdWZmZXIgPSBidWY7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1CdWZmZXItPnJlbGVhc2UobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnNpemUobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9vZmZzZXQobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9sZW5ndGgobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKG1CdWZmZXItPmhhbmRsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+bWV0YV9kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cEhlbHBlciB7Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgc3RkOjptYXA8Q01lZGlhQnVmZmVyKiwgTWVkaWFCdWZmZXJIZWxwZXIqPiBtQnVmZmVySGVscGVyczsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKENNZWRpYUJ1ZmZlckdyb3VwICpncm91cCkgeworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICB9CisgICAgfk1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoKSB7CisgICAgICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXAKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmdyb3VwICVwIG1hcCBoYXMgJXp1IGVudHJpZXMiLCB0aGlzLCBtQnVmZmVySGVscGVycy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVySGVscGVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySGVscGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aW5pdChtR3JvdXAtPmhhbmRsZSwgYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICB9CisgICAgdm9pZCBhZGRfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKSB7CisgICAgICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCAmYnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIGhlbHBlciA9IG1CdWZmZXJIZWxwZXJzLmZpbmQoYnVmKTsKKyAgICAgICAgICAgIGlmIChoZWxwZXIgPT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogbmV3SGVscGVyID0gbmV3IE1lZGlhQnVmZmVySGVscGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckhlbHBlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJ1ZiwgbmV3SGVscGVyKSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ld0hlbHBlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGhlbHBlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYm9vbCBoYXNfYnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aGFzX2J1ZmZlcnMobUdyb3VwLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXIgeworcHVibGljOgorICAgIE1lZGlhVHJhY2tIZWxwZXIoKSA6IG1CdWZmZXJHcm91cChudWxscHRyKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgfQorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gZmFsc2U7IH0KK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKK307CisKK2lubGluZSBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIGlmICh0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlciA9IChDTWVkaWFUcmFjayopIG1hbGxvYyhzaXplb2YoQ01lZGlhVHJhY2spKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0YXJ0ID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIGlmICgoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGhhbmRsZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIGRlbGV0ZSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoYnVmZmVyR3JvdXApOworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RhcnQoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0b3AgPSBbXSh2b2lkICpkYXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPmdldEZvcm1hdChtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnJlYWQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsICB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykKKyAgICAgICAgICAgIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgb3B0cyhvcHRpb25zLCBzZWVrUG9zVXMpOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmID0gTlVMTDsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+cmVhZCgmYnVmLCAmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gYnVmLT5tQnVmZmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCA9IFtdKHZvaWQgKmRhdGEpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKworLy8gZXh0cmFjdG9yIHBsdWdpbnMgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgd2hpY2ggbG9va3MgcmVtYXJrYWJseQorLy8gbGlrZSBNZWRpYUV4dHJhY3RvciBhbmQgY2FuIGJlIGVhc2lseSB3cmFwcGVkIGluIHRoZSByZXF1aXJlZCBDIEFQSQorY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcihjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworfTsKKworaW5saW5lIENNZWRpYUV4dHJhY3RvciAqd3JhcChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqZXh0cmFjdG9yKSB7CisgICAgQ01lZGlhRXh0cmFjdG9yICp3cmFwcGVyID0gKENNZWRpYUV4dHJhY3RvciopIG1hbGxvYyhzaXplb2YoQ01lZGlhRXh0cmFjdG9yKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IGV4dHJhY3RvcjsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmNvdW50VHJhY2tzID0gW10odm9pZCAqZGF0YSkgLT4gc2l6ZV90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5jb3VudFRyYWNrcygpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2sgPSBbXSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpIC0+IENNZWRpYVRyYWNrKiB7CisgICAgICAgIHJldHVybiB3cmFwKCgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFjayhpbmRleCkpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2tNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFja01ldGFEYXRhKG1ldGEsIGluZGV4LCBmbGFncyk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldE1ldGFEYXRhKG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+ZmxhZ3MgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5mbGFncygpOworICAgIH07CisgICAgd3JhcHBlci0+c2V0TWVkaWFDYXMgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPnNldE1lZGlhQ2FzKGNhc1Rva2VuLCBzaXplKTsKKyAgICB9OworICAgIHdyYXBwZXItPm5hbWUgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IGNvbnN0IGNoYXIgKiB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+bmFtZSgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKy8qIGFkZHMgc29tZSBjb252aWVuY2UgbWV0aG9kcyAqLworY2xhc3MgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgeworICAgICAgICBtU291cmNlID0gc291cmNlLT5tU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkobVNvdXJjZS0+aGFuZGxlLCB1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5mbGFncyhtU291cmNlLT5oYW5kbGUpOworICAgIH0KKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDMpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgMTYpIHwgKGJ5dGVbMV0gPDwgOCkgfCBieXRlWzJdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9obCh0bXApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoKHVpbnQ2NF90KW50b2hsKHRtcCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHRtcCA+PiAzMik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKKworCisvLyBoZWxwZXJzIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwKKworLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgorLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCitpbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgeworICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKKyAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NvbnN0ZXhwciBtZWRpYV91dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgbWVkaWFfdXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBtZWRpYV91dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmNzU3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCmluZGV4IDJlMTQ3YzQuLjM0YmY2NWQgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVhNjMyODdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2ViYTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworc3RydWN0IENNZWRpYVRyYWNrOworCitjbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKK3N0cnVjdCBNZWRpYVRyYWNrCisvLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCit7CisgICAgTWVkaWFUcmFjaygpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgeworICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCwKKyAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVggPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1PcHRpb25zID0gMDsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOworICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCkgeworICAgICAgICAgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKKworICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCisgICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgeworICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZW51bSBPcHRpb25zIHsKKyAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKKworICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKKyAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAvLyBpcyByZWFjaGVkLgorICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCisgICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKKyAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCisgICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8cmVhZHwgc3VwcG9ydHMgbm9uYmxvY2tpbmcgb3B0aW9uLCBvdGhlcndpc2UgZmFsc2UuCisgICAgLy8gfHJlYWRNdWx0aXBsZXwgaWYgc3VwcG9ydGVkLCBhbHdheXMgYWxsb3dzIHRoZSBub25ibG9ja2luZyBvcHRpb24uCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOworICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOworfTsKKworY2xhc3MgTWVkaWFUcmFja0NVbndyYXBwZXIgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgc3RhdGljIE1lZGlhVHJhY2tDVW53cmFwcGVyICpjcmVhdGUoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tDVW53cmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgTWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworICAgIENNZWRpYVRyYWNrICp3cmFwcGVyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmJhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKGFuZHJvaWQ6OnN0YXR1c190KTsKKworYW5kcm9pZDo6c3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QpOworCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9QUklWX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGE0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTWVzc2FnZT4gbUZvcm1hdDsKKyAgICBhbmRyb2lkOjpTdHJpbmc4IG1EZWJ1ZzsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCmluZGV4IGUzZWYxMzQuLjg1ZTE3ZjkgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFkYWE0ODkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IGNhMTE5ZDUuLjVmMTlmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTM4LDYgKzUzOCwxMCBAQAogICAgICAgICBtVGltZXN0YW1wTXV0YXRvci5wdXNoKHRpbWVzdGFtcCk7CiAgICAgfQogCisgICAgdmlydHVhbCBFeHRlbmRlZFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGltZXN0YW1wTXV0YXRvci5sYXN0KCk7CisgICAgfQorCiAgICAgLy8gRmx1c2hlcyB0aGUgc2hhcmVkIHJpbmcgYnVmZmVyIGlmIHRoZSBjbGllbnQgaGFkIHJlcXVlc3RlZCBpdCB1c2luZyBtU3RyZWFtaW5nLm1GbHVzaC4KICAgICAvLyBJZiBmbHVzaCBvY2N1cnMgdGhlbjoKICAgICAvLyAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQsIFNlcnZlclByb3h5OjptRmx1c2ggYW5kIFNlcnZlclByb3h5OjptRmx1c2hlZCB3aWxsIGJlIG1vZGlmaWVkCkBAIC01NTEsNiArNTU1LDkgQEAKICAgICAvLyBUb3RhbCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGZsdXNoZWQgZnJhbWVzIHNpbmNlIGNyZWF0aW9uIChuZXZlciByZXNldCkuCiAgICAgdmlydHVhbCBpbnQ2NF90ICAgICBmcmFtZXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbUZsdXNoZWQ7IH0KIAorICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHdpdGggbm8gc2lkZSBlZmZlY3RzLgorICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QgPSAwOworCiAgICAgLy8gR2V0IGR5bmFtaWMgYnVmZmVyIHNpemUgZnJvbSB0aGUgc2hhcmVkIGNvbnRyb2wgYmxvY2suCiAgICAgdWludDMyX3QgICAgICAgICAgICBnZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoKGludDMyX3QgKikmbUNibGstPm1CdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNTg4LDggKzU5NSw3IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCi0gICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCi0gICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgc2VydmVyLgogCiAgICAgLy8gQ3VycmVudGx5IEF1ZGlvRmxpbmdlciB3aWxsIGNhbGwgZnJhbWVzUmVhZHkoKSBmb3IgYSBmYXN0IHRyYWNrIGZyb20gdHdvIHRocmVhZHM6CiAgICAgLy8gRmFzdE1peGVyIHRocmVhZCwgYW5kIG5vcm1hbCBtaXhlciB0aHJlYWQuICBUaGlzIGlzIGRhbmdlcm91cywgYXMgdGhlIHByb3h5IGlzIGludGVuZGVkCkBAIC02OTMsNiArNjk5LDggQEAKICAgICAgICAgcmV0dXJuIG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7IC8vIEZvciBjb21wbGV0ZW5lc3Mgb25seTsgbVJlYXIgd3JpdHRlbiBieSBzZXJ2ZXIuCiAgICAgfQogCisgICAgc2l6ZV90IGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgY2xpZW50LgorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSgpIHsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAppbmRleCA1ZmQ4ZWIyLi5jMzU3Y2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCkBAIC00MCw2ICs0MCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKaW5kZXggN2EyOWUzMS4uMmUyZmY3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKQEAgLTUyLDYgKzUyLDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDFmNjg3YTIuLjFlMmQxMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTIsOCArMiwxMCBAQAogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCitqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDcwYzI4MWEuLjEwZDhiMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtNCw3ICs0LDYgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAltYWluX2F1ZGlvc2VydmVyLmNwcCBcCi0JLi4vbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmFhdWRpb3NlcnZpY2UgXApAQCAtMTgsOCArMTcsMTAgQEAKIAlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCisJbGlibmJsb2cgXAogCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAotCWxpYnV0aWxzCisJbGlidXRpbHMgXAorCWxpYnZpYnJhdG9yCiAKICMgVE9ETyBvYm9lc2VydmljZSBpcyB0aGUgb2xkIGZvbGRlciBuYW1lIGZvciBhYXVkaW9zZXJ2aWNlLiBJdCB3aWxsIGJlIGNoYW5nZWQuCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKQEAgLTQwLDkgKzQxLDYgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKLUxPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKLQogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCkBAIC01NCwxMyArNTIsOSBAQAogIyAgIGJvdGggICAgdG8gYnVpbGQgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBsaWJyYXJpZXMsCiAjICAgICAgICAgICBhbmQgdXNlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoMzIgb3IgNjQpIGZvciBhdWRpb3NlcnZlci4KICMgICBmaXJzdCAgIHRvIGJ1aWxkIGxpYnJhcmllcyBhbmQgYXVkaW9zZXJ2ZXIgZm9yIHRoZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgb25seS4KLSMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIDMyIGJpdCBhdWRpb3NlcnZlci4KKyMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIHByaW1hcnkgdGFyZ2V0IGF1ZGlvc2VydmVyLgogCi1pZmVxICgkKHN0cmlwICQoQVVESU9TRVJWRVJfTVVMVElMSUIpKSwpCi1MT0NBTF9NVUxUSUxJQiA6PSAzMgotZWxzZQogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLWVuZGlmCiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgogCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCmluZGV4IDFmMmU4MmYuLmRmYjFhM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCkBAIC03LDYgKzcsNyBAQAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKICAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCiAgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMApAQCAtMTUsMyArMTYsNiBAQAogICAgIHN0b3AgYXVkaW9zZXJ2ZXIKIG9uIHByb3BlcnR5OnZ0cy5uYXRpdmVfc2VydmVyLm9uPTAKICAgICBzdGFydCBhdWRpb3NlcnZlcgorCitvbiBpbml0CisgICAgbWtkaXIgL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIgMDc3NSBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqIGZtcURlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIGZhbHNlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsICpmbXFEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbDsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCh0aGlzLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTdmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgZm1xRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApIHt9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbCAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYTcwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUyMGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw3MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCgpOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1JbnZhbGlkYXRlZDsgLy8gVE9ETzogaW1wbGVtZW50CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1JbnZhbGlkYXRlZChmYWxzZSksIG1IYXNDYWNoZShmYWxzZSksCisgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpbUludmFsaWRhdGVkOworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgKmZtcURlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmZm1xRGVzYywgdHJ1ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKmZtcURlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dENoYW5uZWxdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yJiBkZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgIH0KKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlCisgKiBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEFuIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcworICogYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThmNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVye2J1ZmZlcklkLCBoYW5kbGV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcnswLCBudWxscHRyfSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWNiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBRdWV1ZURlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU3NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YTc1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCit2b2lkIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QgbXNnSWQ7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciogZm1xRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiBpbnZEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgZmFsc2UsICZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmbXNnSWQsICZmbXFEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCBtc2dJZCwgKmZtcURlc2MsICppbnZEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsIDAsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLyksCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JVbnN5bmM8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Zmx1c2goKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsIGJvb2wgbG9jYWwsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QoCisgICAgICAgICAgICAgICAgdGhpcywgb2JzZXJ2ZXIsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIHBNc2dJZCwKKyAgICAgICAgICAgICAgICBzdGF0dXNEZXNjUHRyLCBpbnZEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDI1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLCBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBvd25lZCBieSBidWZmZXJwb29sICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgICAgICBjbGllbnQgb2JzZXJ2ZXIgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwTXNnSWQgICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjZW50IGJ1ZmZlciBwb29sIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc3RhdHVzRGVzY1B0ciBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52RGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgZnJvbSBhIGJ1ZmZlciBwb29sIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjYwOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDg1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZyksCisgICAgICAgICAgICBtSW52YWxpZGF0ZWQoZmFsc2UpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1JbnZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIHN0YXR1c0Rlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICpwTXNnSWQgPSBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uQ2hhbm5lbC5nZXREZXNjKGludkRlc2NQdHIpOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25Db25uZWN0KGlkLCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIEFMT0dWKCJjb25uZWN0aW9uIGNsb3NlICVsbGQ6ICV1IiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQsIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUlkKTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25DbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5mbHVzaChzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpoYW5kbGVJbnZhbGlkYXRlQWNrKCkgeworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gb2JzZXJ2ZXJzOworICAgIHVpbnQzMl90IGludmFsaWRhdGlvbklkOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25IYW5kbGVBY2soJm9ic2VydmVycywgJmludmFsaWRhdGlvbklkKTsKKyAgICB9CisgICAgLy8gRG8gbm90IGhvbGQgbG9jayBmb3Igc2VuZCBpbnZhbGlkYXRpb25zCisgICAgZm9yIChhdXRvIGl0ID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ICE9IG9ic2VydmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBvYnNlcnZlci0+b25NZXNzYWdlKGl0LT5maXJzdCwgaW52YWxpZGF0aW9uSWQpOworICAgICAgICAgICAgKHZvaWQpIHRyYW5zUmVzdWx0OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtQnVmZmVyUG9vbC5pc1ZhbGlkKCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSwKKyAgICAgIG1TdGFydFNlcSgwKSB7CisgICAgbVZhbGlkID0gbUludmFsaWRhdGlvbkNoYW5uZWwuaXNWYWxpZCgpOworfQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK3N0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246OnNJbnZTZXFJZCgwKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbDIgJXAgIgorICAgICAgICAgICJjYWNoZWQ6ICV6dS8lenVNLCAlenUvJWQlJSBpbiB1c2U7ICIKKyAgICAgICAgICAiYWxsb2NzOiAlenUsICVkJSUgcmVjeWNsZWQ7ICIKKyAgICAgICAgICAidHJhbnNmZXJzOiAlenUsICVkJSUgdW5mZXRjZWQiLAorICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkID4+IDIwLAorICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBwZXJjZW50YWdlKG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucyksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycywKKyAgICAgICAgICBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMgLSBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycykpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQ29ubmVjdCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+JiBvYnNlcnZlcikgeworICAgIG1BY2tzW2NvbklkXSA9IG1JbnZhbGlkYXRpb25JZDsgLy8gc3RhcnRzIGZyb20gY3VycmVudCBpbnZhbGlkYXRpb25JZAorICAgIG1PYnNlcnZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBvYnNlcnZlcikpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQ2xvc2UoQ29ubmVjdGlvbklkIGNvbklkKSB7CisgICAgbUFja3MuZXJhc2UoY29uSWQpOworICAgIG1PYnNlcnZlcnMuZXJhc2UoY29uSWQpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQWNrKAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsCisgICAgICAgIHVpbnQzMl90IG1zZ0lkKSB7CisgICAgYXV0byBpdCA9IG1BY2tzLmZpbmQoY29uSWQpOworICAgIGlmIChpdCA9PSBtQWNrcy5lbmQoKSkgeworICAgICAgICBBTE9HVygiQUNLIGZyb20gaW5jb25zaXN0ZW50IGNvbm5lY3Rpb24hICVsbGQiLCAobG9uZyBsb25nKWNvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobXNnSWQsIGl0LT5zZWNvbmQpKSB7CisgICAgICAgIG1BY2tzW2NvbklkXSA9IG1zZ0lkOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkJ1ZmZlckludmFsaWRhdGVkKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCkgeworICAgIGZvciAoYXV0byBpdCA9IG1QZW5kaW5ncy5iZWdpbigpOyBpdCAhPSBtUGVuZGluZ3MuZW5kKCk7KSB7CisgICAgICAgIGlmIChpdC0+aXNJbnZhbGlkYXRlZChidWZmZXJJZCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICAgICAgICAgIGlmIChpdC0+bU5lZWRzQWNrKSB7CisgICAgICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsLnBvc3RJbnZhbGlkYXRpb24obXNnSWQsIGl0LT5tRnJvbSwgaXQtPm1Ubyk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5ncy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkludmFsaWRhdGlvblJlcXVlc3QoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssCisgICAgICAgIHVpbnQzMl90IGZyb20sCisgICAgICAgIHVpbnQzMl90IHRvLAorICAgICAgICBzaXplX3QgbGVmdCwKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgaWYgKG5lZWRzQWNrKSB7CisgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIGludmFsaWRhdGlvbiByZXF1ZXN0ZWQgYW5kIHF1ZXVlZCIpOworICAgIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBmcm9tLCB0byk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogc2VuZGluZyBoaW50IG1lc3NhZ2U/CisgICAgICAgIEFMT0dWKCJidWZmZXJwb28yIGludmFsaWRhdGlvbiByZXF1ZXN0ZWQgYW5kIHBlbmRpbmciKTsKKyAgICAgICAgUGVuZGluZyBwZW5kaW5nKG5lZWRzQWNrLCBmcm9tLCB0bywgbGVmdCwgaW1wbCk7CisgICAgICAgIG1QZW5kaW5ncy5wdXNoX2JhY2socGVuZGluZyk7CisgICAgfQorICAgIHNJbnZhbGlkYXRvci0+YWRkQWNjZXNzb3IobUlkLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkhhbmRsZUFjaygKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpIHsKKyAgICBpZiAobUludmFsaWRhdGlvbklkICE9IDApIHsKKyAgICAgICAgKmludmFsaWRhdGlvbklkID0gbUludmFsaWRhdGlvbklkOworICAgICAgICBzdGQ6OnNldDxpbnQ+IGRlYWRzOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWNrcy5iZWdpbigpOyBpdCAhPSBtQWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQgIT0gbUludmFsaWRhdGlvbklkKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiBvYnNlcnZlciA9IG1PYnNlcnZlcnNbaXQtPmZpcnN0XTsKKyAgICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLT5lbXBsYWNlKGl0LT5maXJzdCwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29ubmVjdGlvbiAlbGxkIHdpbGwgY2FsbCBvYnNlcnZlciAoJXU6ICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXQtPmZpcnN0LCBpdC0+c2Vjb25kLCBtSW52YWxpZGF0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBOLkI6IG9uTWVzc2FnZSB3aWxsIGJlIGNhbGxlZCBsYXRlci4gaWdub3JlIHBvc3NpYmlsaXR5IG9mCisgICAgICAgICAgICAgICAgICAgIC8vIG9uTWVzc2FnZSMgb25ld2F5IGNhbGwgYmVpbmcgbG9zdC4KKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVycG9vbDIgb2JzZXJ2ZXIgZGllZCAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgICAgICBkZWFkcy5pbnNlcnQoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGRlYWRzLmJlZ2luKCk7IGl0ICE9IGRlYWRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgb25DbG9zZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtUGVuZGluZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gQWxsIGludmFsaWRhdGlvbiBJZHMgYXJlIHN5bmNlZCBhbmQgbm8gbW9yZSBwZW5kaW5nIGludmFsaWRhdGlvbnMuCisgICAgICAgIHNJbnZhbGlkYXRvci0+ZGVsQWNjZXNzb3IobUlkKTsKKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQobWVzc2FnZS5idWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoZm91bmQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ0cmFuc2ZlciBmaW5pc2hlZCAlbGx1ICV1IC0gJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCwgZGVsZXRlZCk7CisgICAgICAgIHJldHVybiBkZWxldGVkOworICAgIH0KKyAgICBBTE9HVigidHJhbnNmZXIgbm90IGZvdW5kICVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiBtZXNzYWdlczsKKyAgICBtT2JzZXJ2ZXIuZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhtZXNzYWdlcyk7CisgICAgbVRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgZm9yIChCdWZmZXJTdGF0dXNNZXNzYWdlJiBtZXNzYWdlOiBtZXNzYWdlcykgeworICAgICAgICBib29sIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubmV3U3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpVU0VEOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTzoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclRvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST006CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0xPU1Q6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSzoKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclJlc3VsdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25BY2sobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sMiAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytmcmVlSXQ7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wyIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aW52YWxpZGF0ZSgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sICpmcmVlSXQpKSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsrZnJlZUl0OworICAgIH0KKworICAgIHNpemVfdCBsZWZ0ID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCBpdC0+Zmlyc3QpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICArK2xlZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUludmFsaWRhdGlvbi5vbkludmFsaWRhdGlvblJlcXVlc3QobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBtSW52YWxpZGF0aW9uQ2hhbm5lbCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBCdWZmZXJJZCBmcm9tID0gbVN0YXJ0U2VxOworICAgIEJ1ZmZlcklkIHRvID0gbVNlcTsKKyAgICBtU3RhcnRTZXEgPSBtU2VxOworICAgIC8vIFRPRE86IG5lZWRzQWNrIHBhcmFtcyAKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiByZXF1ZXN0IGJwOiV1ICV1ICV1IiwgbUludmFsaWRhdGlvbi5tSWQsIGZyb20sIHRvKTsKKyAgICBpZiAoZnJvbSAhPSB0bykgeworICAgICAgICBpbnZhbGlkYXRlKHRydWUsIGZyb20sIHRvLCBpbXBsKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgICAgICBib29sICZyZWFkeSkgeworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBjb3BpZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBpZiAoIXJlYWR5KSB7CisgICAgICAgICAgICAgICAgY3Yud2FpdChsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcGllZC5pbnNlcnQoYWNjZXNzb3JzLmJlZ2luKCksIGFjY2Vzc29ycy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpsaXN0PENvbm5lY3Rpb25JZD4gZXJhc2VkOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb3BpZWQuYmVnaW4oKTsgaXQgIT0gY29waWVkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+IGltcGwgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghaW1wbCkgeworICAgICAgICAgICAgICAgIGVyYXNlZC5wdXNoX2JhY2soaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1wbC0+aGFuZGxlSW52YWxpZGF0ZUFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBlcmFzZWQuYmVnaW4oKTsgaXQgIT0gZXJhc2VkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3JzLmVyYXNlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkcmFpbmluZyBjcHUuCisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6QWNjZXNzb3JJbnZhbGlkYXRvcigpIDogbVJlYWR5KGZhbHNlKSB7CisgICAgc3RkOjp0aHJlYWQgaW52YWxpZGF0b3IoCisgICAgICAgICAgICBpbnZhbGlkYXRvclRocmVhZCwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1BY2Nlc3NvcnMpLAorICAgICAgICAgICAgc3RkOjpyZWYobU11dGV4KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1DdiksCisgICAgICAgICAgICBzdGQ6OnJlZihtUmVhZHkpKTsKKyAgICBpbnZhbGlkYXRvci5kZXRhY2goKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6YWRkQWNjZXNzb3IoCisgICAgICAgIHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgYm9vbCBub3RpZnkgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGFjY2Vzc29ySWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCFtUmVhZHkpIHsKKyAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29ySWQsIGltcGwpKTsKKyAgICAgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gYWRkZWQgYnA6JXUgJWQiLCBhY2Nlc3NvcklkLCBub3RpZnkpOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgbUN2Lm5vdGlmeV9vbmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJZCk7CisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gZGVsZXRlZCBicDoldSIsIGFjY2Vzc29ySWQpOworICAgIGlmIChtQWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1SZWFkeSA9IGZhbHNlOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPiBBY2Nlc3Nvcjo6SW1wbDo6c0ludmFsaWRhdG9yOworCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBpZiAoIXNJbnZhbGlkYXRvcikgeworICAgICAgICBzSW52YWxpZGF0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE3MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwKKyAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEFjY2Vzc29yOjpJbXBsPiB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB+SW1wbCgpOworCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHZvaWQgaGFuZGxlSW52YWxpZGF0ZUFjaygpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25uZWN0aW9uSWQgPSBwaWQgOiAodGltZXN0YW1wX2NyZWF0ZWQgKyBzZXFJZCkKKyAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBmb3IgZWFjaCBjb25uZWN0aW9uCisgICAgc3RhdGljIHVpbnQzMl90IHNTZXFJZDsKKyAgICBzdGF0aWMgaW50MzJfdCBzUGlkOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcy4gSGFuZGxlcyBidWZmZXIgYWxsb2NhdGlvbi9yZWN5Y2xpbmcuCisgICAgICogSGFuZGxlcyBidWZmZXIgdHJhbnNmZXIgYmV0d2VlbiBidWZmZXIgcG9vbCBjbGllbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCdWZmZXJQb29sIHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RMb2dVczsKKyAgICAgICAgQnVmZmVySWQgbVNlcTsKKyAgICAgICAgQnVmZmVySWQgbVN0YXJ0U2VxOworICAgICAgICBib29sIG1WYWxpZDsKKyAgICAgICAgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgbU9ic2VydmVyOworICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIG1JbnZhbGlkYXRpb25DaGFubmVsOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8QnVmZmVySWQ+PiBtVXNpbmdCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPj4gbVVzaW5nQ29ubmVjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPj4gbVBlbmRpbmdUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIFRyYW5zYWN0aW9ucyBjb21wbGV0ZWQgYmVmb3JlIFRSQU5TRkVSX1RPIG1lc3NhZ2UgYXJyaXZhbC4KKyAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3Qgb2NjdXIgZm9yIHRoZSB0cmFuc2FjdGlvbnMuCisgICAgICAgIC8vIE9ubHkgdHJhbnNhY3Rpb24gaWQgaXMga2VwdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyBpbiBzaG9ydCBkdXJhdGlvbi4KKyAgICAgICAgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4gbUNvbXBsZXRlZFRyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gQ3VycmVudGx5IGFjdGl2ZShwZW5kaW5nKSB0cmFuc2F0aW9ucycgc3RhdHVzICYgaW5mb3JtYXRpb24uCisgICAgICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2FjdGlvblN0YXR1cz4+CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6c2V0PEJ1ZmZlcklkPiBtRnJlZUJ1ZmZlcnM7CisKKyAgICAgICAgc3RydWN0IEludmFsaWRhdGlvbiB7CisgICAgICAgICAgICBzdGF0aWMgc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gc0ludlNlcUlkOworCisgICAgICAgICAgICBzdHJ1Y3QgUGVuZGluZyB7CisgICAgICAgICAgICAgICAgYm9vbCBtTmVlZHNBY2s7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbUZyb207CisgICAgICAgICAgICAgICAgdWludDMyX3QgbVRvOworICAgICAgICAgICAgICAgIHNpemVfdCBtTGVmdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiBtSW1wbDsKKyAgICAgICAgICAgICAgICBQZW5kaW5nKGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1OZWVkc0FjayhuZWVkc0FjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gcm9tKGZyb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVG8odG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwoaW1wbCkKKyAgICAgICAgICAgICAgICB7fQorCisgICAgICAgICAgICAgICAgYm9vbCBpc0ludmFsaWRhdGVkKHVpbnQzMl90IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0J1ZmZlckluUmFuZ2UobUZyb20sIG1UbywgYnVmZmVySWQpICYmIC0tbUxlZnQgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdGQ6Omxpc3Q8UGVuZGluZz4gbVBlbmRpbmdzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCB1aW50MzJfdD4gbUFja3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG1PYnNlcnZlcnM7CisgICAgICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICB1aW50MzJfdCBtSWQ7CisKKyAgICAgICAgICAgIEludmFsaWRhdGlvbigpIDogbUludmFsaWRhdGlvbklkKDApLCBtSWQoc0ludlNlcUlkLmZldGNoX2FkZCgxKSkge30KKworICAgICAgICAgICAgdm9pZCBvbkNvbm5lY3QoQ29ubmVjdGlvbklkIGNvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAgICAgICAgIHZvaWQgb25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQWNrKENvbm5lY3Rpb25JZCBjb25JZCwgdWludDMyX3QgbXNnSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKTsKKworICAgICAgICAgICAgdm9pZCBvbkludmFsaWRhdGlvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25IYW5kbGVBY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKTsKKyAgICAgICAgfSBtSW52YWxpZGF0aW9uOworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgICAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlKGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnZhbGlkYXRlIGFsbCBjdXJyZW50CisgICAgICAgICAqIGZyZWUgYnVmZmVycy4gQWN0aXZlIGJ1ZmZlcnMgYXJlIGludmFsaWRhdGVkIGFmdGVyIGJlaW5nIGluYWN0aXZlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzb3I6OkltcGw7CisgICAgfSBtQnVmZmVyUG9vbDsKKworICAgIHN0cnVjdCAgQWNjZXNzb3JJbnZhbGlkYXRvciB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gbUFjY2Vzc29yczsKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DdjsKKyAgICAgICAgYm9vbCBtUmVhZHk7CisKKyAgICAgICAgQWNjZXNzb3JJbnZhbGlkYXRvcigpOworICAgICAgICB2b2lkIGFkZEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKyAgICAgICAgdm9pZCBkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKTsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBY2Nlc3NvckludmFsaWRhdG9yPiBzSW52YWxpZGF0b3I7CisKKyAgICBzdGF0aWMgdm9pZCBpbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICBib29sICZyZWFkeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiT2JzZXJ2ZXIuY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwN2RlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lEKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCh1aW50MzJfdCBtc2dJZCA9IDApOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpOworCisgICAgdm9pZCBpbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+IG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IFJlbGVhc2VDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG9uZSBsaXN0Pyh1c2luZyBvbmUgbGlzdCBtYXkgZGVhbHkgc2VuZGluZyBtZXNzYWdlcz8pCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2luZ0lkczsKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzZWRJZHM7CisgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRlSWQ7IC8vIFRPRE86IGludmFsaWRhdGlvbiBBQ0sgdG8gYnVmZmVycG9vbAorICAgICAgICBib29sIG1JbnZhbGlkYXRlQWNrOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisKKyAgICAgICAgUmVsZWFzZUNhY2hlKCkgOiBtSW52YWxpZGF0ZUlkKDApLCBtSW52YWxpZGF0ZUFjayh0cnVlKSB7fQorICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1IYXNDYWNoZShmYWxzZSksIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwKKyAgICAgICAgICAgICAgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQnVmZmVySWQgaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKHRydWUpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgKnN0YXR1c0Rlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqaW52RGVzYzsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgdHJ1ZSwKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwKKyAgICAgICAgICAgICZzdGF0dXNEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKnN0YXR1c0Rlc2MpOworICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KCppbnZEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICB1aW50MzJfdCYgb3V0TXNnSWQgPSBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+JiBvdXRDaGFubmVsID0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiYgb3V0T2JzZXJ2ZXIgPQorICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsCisgICAgICAgICAgICBbJnZhbGlkLCAmb3V0Q29ubmVjdGlvbiwgJmlkLCAmb3V0TXNnSWQsICZvdXRDaGFubmVsLCAmb3V0T2JzZXJ2ZXJdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQsCisgICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciYgc3RhdHVzRGVzYywKKyAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yJiBpbnZEZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0TXNnSWQgPSBtc2dJZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oc3RhdHVzRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oaW52RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgJiYgb3V0T2JzZXJ2ZXItPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICBzeW5jUmVsZWFzZWQobWVzc2FnZUlkKTsKKyAgICAvLyBUT0RPOiBldmljdCBjYWNoZSByZXF1aXJlZD8KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZsdXNoKCkgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICByZXR1cm4gbUxvY2FsQ29ubmVjdGlvbi0+Zmx1c2goKTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWxsb2NhdGVCdWZmZXJIYW5kbGUocGFyYW1zLCAmYnVmZmVySWQsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBpdCBpcyByZWN5Y2xlZC4gKG5vdCBoYXZpbmcgYWN0aXZlIHJlZikKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoY2FjaGVJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IGNhY2hlIGNyZWF0aW9uIGZhaWx1cmUgJWQ6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IG51bGxwdHIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIHBvc3RCdWZmZXJSZWxlYXNlKGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBVcyAhPSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzICs9IGtSZWNlaXZlVGltZW91dFVzOworICAgIH0KKyAgICBpZiAoIXBvc3RSZWNlaXZlKGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5mZXRjaENhY2hlKHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0cmFuc2ZlciB0aW1lX291dAorICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gcmVmZXJlbmNlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5jcmVhdGVDYWNoZShzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSBjYWNoZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlLm1DcmVhdGluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZldGNoQnVmZmVySGFuZGxlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlcklkLCBzdGQ6Om1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgYm9vbCBwb3N0ZWQgPSBwb3N0UmVjZWl2ZVJlc3VsdChidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA/IHRydWUgOiBmYWxzZSwgJm5lZWRzU3luYyk7CisgICAgQUxPR1YoImNsaWVudCByZWNlaXZlICVsbGQgLSAldSA6ICVzICglZCkiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICpidWZmZXIgPyAib2siIDogImZhaWwiLCBwb3N0ZWQpOworICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgaWYgKCFwb3N0ZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKKyAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworfQorCisvLyBUT0RPOiByZXZpc2UgYWQtaG9jIHBvc3RpbmcgZGF0YSBzdHJ1Y3R1cmUKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgeworICAgICAgICAvLyBUT0RPOiBkb24ndCBuZWVkIHRvIGNhbGwgc3luY1JlbGVhc2VkIGV2ZXJ5IHRpbWUKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgfQorICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIGJvb2wgY2xlYXJlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlbGVhc2UgYnVmZmVyICVsbGQgLSAldSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChpZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+b25DYWNoZVJlbGVhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmRlY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSByZWxlYXNlIHN0YXR1cyBpbmNvbnNpdGVudCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHN0YXR1cyBpbmNvbnNpdGVudCEiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLmNsZWFyKCk7CisgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiBpbnZhbGlkYXRpb25zOworICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+Z2V0SW52YWxpZGF0aW9ucyhpbnZhbGlkYXRpb25zKTsKKyAgICB1aW50MzJfdCBsYXN0TXNnSWQgPSAwOworICAgIGlmIChpbnZhbGlkYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gaW52YWxpZGF0aW9ucy5iZWdpbigpOyBpdCAhPSBpbnZhbGlkYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPm1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdE1zZ0lkID0gaXQtPm1lc3NhZ2VJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+ZnJvbUJ1ZmZlcklkID09IGl0LT50b0J1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyb21CdWZmZXJJZCA9IFVJTlQzMl9NQVgKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQnVmZmVyKGl0LT5mcm9tQnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmFuZ2UoaXQtPmZyb21CdWZmZXJJZCwgaXQtPnRvQnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChsYXN0TXNnSWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKGxhc3RNc2dJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IGxhc3RNc2dJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFyZSBkcmFpbmVkLgorICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1lc3NhZ2VJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IG1lc3NhZ2VJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spIHsKKyAgICAgICAgICAgIC8vIHBvc3QgQUNLCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayk7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50ICVsbGQgaW52YWxpZGF0ZWlvbiBhY2sgKCVkKSAldSIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2ssIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsZWFyZWQ7Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fCBjbGVhckNhY2hlKSB7CisgICAgICAgIHNpemVfdCBldmljdGVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSAmJiAoaXQtPnNlY29uZC0+ZXhwaXJlKCkgfHwgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgKytldmljdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjYWNoZSBjb3VudCAlbGxkIDogdG90YWwgJXp1LCBhY3RpdmUgJWQsIGV2aWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBtQ2FjaGUubUJ1ZmZlcnMuc2l6ZSgpLCBtQ2FjaGUubUFjdGl2ZSwgZXZpY3RlZCk7CisgICAgICAgIG1MYXN0RXZpY3RDYWNoZVVzID0gbm93OworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpZCA9PSBpdC0+c2Vjb25kLT5pZCgpKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogYnVmZmVyICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkluY29uc2l0ZW50IGludmFsaWRhdGlvbiAlbGxkIDogYWN0aXZlciBidWZmZXIhISAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCAodW5zaWduZWQgaW50KWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKSB7CisgICAgc2l6ZV90IGludmFsaWRhdGVkID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJpZCA9IGl0LT5zZWNvbmQtPmlkKCk7CisgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkICYmIGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgfHwgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiAjIG9mIGludmFsaWRhdGVkICV6dSIsCisgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpbnZhbGlkYXRlZCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6On5CdWZmZXJQb29sQ2xpZW50KCkgeworICAgIC8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3JwaGFuZWQgYnVmZmVycz8KK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc1ZhbGlkKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzTG9jYWwoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc0xvY2FsKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1JbXBsLT5pc0FjdGl2ZShsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSk7Cit9CisKK0Nvbm5lY3Rpb25JZCBCdWZmZXJQb29sQ2xpZW50OjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmFjY2Vzc29yID0gbUltcGwtPmdldEFjY2Vzc29yKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKSB7CisgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIGNsaWVudCByZWN2IGludiAldSIsIG1zZ0lkKTsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIG1JbXBsLT5yZWNlaXZlSW52YWxpZGF0aW9uKG1zZ0lkKTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpmbHVzaCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50Ojpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gbUltcGwtPnBvc3RTZW5kKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUlkLCByZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgICAgIHJldHVybiByZXN1bHQgPyBSZXN1bHRTdGF0dXM6Ok9LIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ5YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgY2xpZW50IGZvciBhIGJ1ZmZlciBwb29sLiBGb3IgYSBzcGVjaWZpYyBidWZmZXIgcG9vbCwgYXQgbW9zdAorICogb25lIGJ1ZmZlciBwb29sIGNsaWVudCBleGlzdHMgcGVyIHByb2Nlc3MuIFRoaXMgY2xhc3Mgd2lsbCBub3QgYmUgZXhwb3NlZAorICogb3V0c2lkZS4gQSBidWZmZXIgcG9vbCBjbGllbnQgd2lsbCBiZSB1c2VkIHZpYSBDbGllbnRNYW5hZ2VyLgorICovCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSBsb2NhbCBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNjcmVhdGUpLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIHJlbW90ZSBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNyZWdpc3RlclNlbmRlcikuCisgICAgICogTm90ZTogQSBidWZmZXIgcG9vbCBjbGllbnQgY3JlYXRlZCB3aXRoIHJlbW90ZSBidWZmZXIgcG9vbCBjYW5ub3QKKyAgICAgKiBhbGxvY2F0ZSBhIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgcmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7CisgICAgZnJpZW5kIHN0cnVjdCBPYnNlcnZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzcyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sU3RhdHVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitib29sIGlzTWVzc2FnZUxhdGVyKHVpbnQzMl90IGN1ck1zZ0lkLCB1aW50MzJfdCBwcmV2TXNnSWQpIHsKKyAgICByZXR1cm4gY3VyTXNnSWQgIT0gcHJldk1zZ0lkICYmIGN1ck1zZ0lkIC0gcHJldk1zZ0lkIDwgcHJldk1zZ0lkIC0gY3VyTXNnSWQ7Cit9CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgcmV0dXJuIGZyb20gPD0gYnVmZmVySWQgJiYgYnVmZmVySWQgPCB0bzsKKyAgICB9IGVsc2UgeyAvLyB3cmFwIGhhcHBlbnMKKyAgICAgICAgcmV0dXJuIGZyb20gPD0gYnVmZmVySWQgfHwgYnVmZmVySWQgPCB0bzsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1FbGVtZW50c0luUXVldWUgPSAxMDI0KjE2Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA9IDEyODsKKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpvcGVuKAorICAgICAgICBDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVyU3RhdHVzUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpuZWVkc1N5bmMoKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIGF2YWlsICsga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA8IGtOdW1FbGVtZW50c0luUXVldWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiBwZW5kaW5nLnNpemUoKSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGF2YWlsID0gc3RkOjptaW4oYXZhaWwsIHBlbmRpbmcuc2l6ZSgpKTsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbDsgKytpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCBpbnZhbGlkYXRlSWQsCisgICAgICAgIGJvb2wgKmludmFsaWRhdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiAhKmludmFsaWRhdGVkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpbnZhbGlkYXRlSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICppbnZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OkJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKKyAgICAvLyBkcmFpbiBwcmV2aW91cyBtZXNzYWdlcworICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5hdmFpbGFibGVUb1JlYWQoKSwgKHNpemVfdCkga051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gdGVtcChhdmFpbCk7CisgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKTsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmdldEludmFsaWRhdGlvbnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIC8vIFRyeSB0d2ljZSBpbiBjYXNlIG9mIG92ZXJmbG93LgorICAgIC8vIFRPRE86IGhhbmRsaW5nIG92ZXJmbG93IHRob3VnaCBpdCBtYXkgbm90IGhhcHBlbi4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gdGVtcChhdmFpbCk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5yZWFkKHRlbXAuZGF0YSgpLCBhdmFpbCkpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlcy5yZXNlcnZlKG1lc3NhZ2VzLnNpemUoKSArIGF2YWlsKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSB0ZW1wLmJlZ2luKCk7IGl0ICE9IHRlbXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKCppdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK0J1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OkJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKQorICAgIDogbVZhbGlkKHRydWUpLAorICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlKAorICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlLCB0cnVlKSkgeworICAgIGlmICghbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlIHx8IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgIH0KK30KKworYm9vbCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6Z2V0RGVzYyhjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICoqZm1xRGVzY1B0cikgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmdldERlc2MoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OnBvc3RJbnZhbGlkYXRpb24oCisgICAgICAgIHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpIHsKKyAgICBCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2U7CisKKyAgICBtZXNzYWdlLm1lc3NhZ2VJZCA9IG1zZ0lkOworICAgIG1lc3NhZ2UuZnJvbUJ1ZmZlcklkID0gZnJvbUlkOworICAgIG1lc3NhZ2UudG9CdWZmZXJJZCA9IHRvSWQ7CisgICAgLy8gVE9ETzogaGFuZGxlIGZhaWx1cmUgKGl0IGRvZXMgbm90IGhhcHBlbiBub3JtYWxseS4pCisgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT53cml0ZSgmbWVzc2FnZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY1ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvKiogUmV0dXJucyBtb25vdG9uaWMgdGltZXN0YW1wIGluIFVzIHNpbmNlIGZpeGVkIHBvaW50IGluIHRpbWUuICovCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpOworCitib29sIGlzTWVzc2FnZUxhdGVyKHVpbnQzMl90IGN1ck1zZ0lkLCB1aW50MzJfdCBwcmV2TXNnSWQpOworCitib29sIGlzQnVmZmVySW5SYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywgQnVmZmVySWQgYnVmZmVySWQpOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBidWZmZXIKKyAqIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgRk1RcyBmcm9tIHRoZSBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNPYnNlcnZlciB7Citwcml2YXRlOgorICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPj4KKyAgICAgICAgICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXM7CisKK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBGTVEgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIG9wZW4oQ29ubmVjdGlvbklkIGlkLCBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICAvKiogQ2xvc2VzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBpcyBjbG9zZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgaWQpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBGTVEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgb3duZXJzaGlwL3N0YXR1cworICogY2hhbmdlIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgZm1xIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gbUJ1ZmZlclN0YXR1c1F1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mCisgICAgICogdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gdGhlIGJ1ZmZlciBwb29sICovCisgICAgYm9vbCBuZWVkc1N5bmMoKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgorICAgICAqIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBidWZmZXIgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICBuZXcgc3RhdHVzIG9mIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXRJZCAgICAgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHJlY2VpdmVyKG9ubHkgd2hlbiB0aGUgc2VuZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdHMgYSBzdGF0dXMgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaXMgcG9zdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgaW52YWxpYWRhdGlvbiBtZXNzZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlSWQgIGludmFsaWRhdGlvbiBhY2sgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIGludmFsaWRhdGlvbiBpZCBpcyB6ZXJvLCB0aGUgYWNrIHdpbGwgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlZCAgIHNldHMge0Bjb2RlIHRydWV9IG9ubHkgd2hlbiB0aGUgaW52YWxpZGF0aW9uIGFjayBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgICAgIGJvb2wgKmludmFsaWRhdGVkKTsKK307CisKKy8qKgorICogQSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBpbnZhbGlkYXRpb24KKyAqIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCB2aWEgdGhlIGZtcSBmcm9tIHRoZSBidWZmZXIgcG9vbC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIGhhbmRsZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcihjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRJbnZhbGlkYXRpb25zKHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+ICZtZXNzYWdlcyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBBIGJ1ZmZlciBwb29sIHdpbGwgc2VuZCBidWZmZXIKKyAqIGludmFsaWRhdGlvbiBtZXNzYWdlcyB0byB0aGUgY2xpZW50cyB2aWEgdGhlIEZNUS4gVGhlIEZNUSBpcyBzaGFyZWQgYW1vbmcKKyAqIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4KKyAgICAgKi8KKyAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBkZXNjcmlwdG9yIG9mIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEuIHRoZSBkZXNjcmlwdG9yIG1heQorICAgICAqIGJlIHBhc3NlZCB0byB0aGUgY2xpZW50IGZvciBidWZmZXIgaW52YWxpZGF0aW9uIGhhbmRsaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgdm9pZCBnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKTsKKworICAgIC8qKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gZm9yIGludmFsaWRhdGVkIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnSWQgICAgIEludmFsaWRhdGlvbiBtZXNzYWdlIGlkIHdoaWNoIGlzIHVzZWQgd2hlbiBjbGllbnRzIHNlbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGFja3MgYmFjayB2aWEgQnVmZmVyU3RhdHVzTWVzc2FnZQorICAgICAqIEBwYXJhbSBmcm9tSWQgICAgVGhlIHN0YXJ0IGJ1ZmZlcmlkIG9mIHRoZSBpbnZhbGlkYXRlZCBidWZmZXJzKGluY2x1c2l2ZSkKKyAgICAgKiBAcGFyYW0gdG9JZCAgICAgIFRoZSBlbmQgYnVmZmVySWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqLworICAgIHZvaWQgcG9zdEludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCwgQnVmZmVySWQgZnJvbUlkLCBCdWZmZXJJZCB0b0lkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFkMzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAKQEAgLTAsMCArMSw1MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIk9ic2VydmVyLmgiCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBzcDxPYnNlcnZlcj4gbU9ic2VydmVyOworCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciBtUmVtb3RlQ2xpZW50Q29va2llczsKK307CisKK0NsaWVudE1hbmFnZXI6OkltcGw6OkltcGwoKQorICAgIDogbU9ic2VydmVyKG5ldyBPYnNlcnZlcigpKSB7fQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjbGVhblVwKCk7CisgICAgaW50NjRfdCB0aW1lb3V0VXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtSZWdpc3RlclRpbWVvdXRVczsKKyAgICBkbyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBzQWNjZXNzb3IgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNBY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoc0FjY2Vzc29yLCBhY2Nlc3NvcikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmUubUNsaWVudHMuZmluZCgqcENvbm5lY3Rpb25JZCkgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIGV4aXN0aW5nIGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DYWNoZS5tQ29ubmVjdGluZykgeworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yLCBtT2JzZXJ2ZXIpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIG1PYnNlcnZlci0+YWRkQ2xpZW50KGNvbklkLCB3Y2xpZW50KTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2LndhaXRfZm9yKAorICAgICAgICAgICAgICAgIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoa1JlZ2lzdGVyVGltZW91dFVzKSk7CisgICAgfSB3aGlsZSAoZ2V0VGltZXN0YW1wTm93KCkgPCB0aW1lb3V0VXMpOworICAgIC8vIFRPRE86IHJldHVybiB0aW1lb3V0IGVycm9yCisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgIGJvb2wgbG9jYWwgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChzZW5kZXJJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbG9jYWwgPSBpdC0+c2Vjb25kLT5pc0xvY2FsKCk7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBycyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICAgICAgICAgIGFjY2Vzc29yLAorICAgICAgICAgICAgICAgIFsmcnMsIHJlY2VpdmVySWRdKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAqcmVjZWl2ZXJJZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsICYmIHJzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50ID0gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworICAgICAgICAgICAgaWYgKHJlY2lwaWVudCkgIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IGRlYXRoIHJlY2lwaWVudCByZWdpc3RlcmVkICVsbGQiLCAobG9uZyBsb25nKSpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IG1SZW1vdGVDbGllbnRDb29raWVzLmdldENvb2tpZShyZWNlaXZlciwgJmFkZGVkKTsKKyAgICAgICAgICAgICAgICByZWNpcGllbnQtPmFkZENvb2tpZVRvQ29ubmVjdGlvbihjb29raWUsICpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPmxpbmtUb0RlYXRoKHJlY2lwaWVudCwgY29va2llKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJzOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY29uc3Qgc3A8QWNjZXNzb3I+IGFjY2Vzc29yID0gbmV3IEFjY2Vzc29yKGFsbG9jYXRvcik7CisgICAgaWYgKCFhY2Nlc3NvciB8fCAhYWNjZXNzb3ItPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gVE9ETzogb2JzZXJ2ZXIgaXMgbG9jYWwuIHVzZSBkaXJlY3QgY2FsbCBpbnN0ZWFkIG9mIGhpZGwgY2FsbC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgaWYgKCFjbGllbnQgfHwgIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBTaW5jZSBhIG5ldyBidWZmZXJwb29sIGlzIGNyZWF0ZWQsIGV2aWN0IG1lbW9yaWVzIHdoaWNoIGFyZSB1c2VkIGJ5CisgICAgLy8gZXhpc3RpbmcgYnVmZmVycG9vbHMgYW5kIGNsaWVudHMuCisgICAgY2xlYW5VcCh0cnVlKTsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgIG1PYnNlcnZlci0+YWRkQ2xpZW50KGNvbklkLCB3Y2xpZW50KTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICB9CisgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgIEFMT0dWKCJjcmVhdGUgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xvc2luZyA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1BY3RpdmUubUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IgfHwgKGFjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChjQWNjZXNzb3IsIGFjY2Vzc29yKSkpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2l0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jazIudW5sb2NrKCk7CisgICAgICAgIGxvY2sxLnVubG9jaygpOworICAgICAgICBjbG9zaW5nLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Zmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5mbHVzaCgpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSBidWZmZXItPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Z2V0QWNjZXNzb3IoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmdldEFjY2Vzc29yKGFjY2Vzc29yKTsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaW50NjRfdCBsYXN0VHJhbnNhY3Rpb25VczsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIDwgbm93KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGludCBjbGVhbmVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc0FjdGl2ZSgmbGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RUcmFuc2FjdGlvblVzICsga0NsaWVudFRpbWVvdXRVcyA8IG5vdykgeworICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1BY3RpdmUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICArK2NsZWFuZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytjaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiMgb2YgY2xlYW5lZCBjb25uZWN0aW9uczogJWQiLCBjbGVhbmVkKTsKKyAgICAgICAgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzID0gbm93OworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5yZWdpc3RlclNlbmRlcihidWZmZXJQb29sLCAmY29ubmVjdGlvbklkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1IsIC0xKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gTWV0aG9kcyBmb3IgbG9jYWwgdXNlLgorc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlOworc3RkOjptdXRleCBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2VMb2NrOworCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzSW5zdGFuY2VMb2NrKTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2xpZW50TWFuYWdlcigpOworICAgIH0KKyAgICBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitDbGllbnRNYW5hZ2VyOjpDbGllbnRNYW5hZ2VyKCkgOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitDbGllbnRNYW5hZ2VyOjp+Q2xpZW50TWFuYWdlcigpIHsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNyZWF0ZShhbGxvY2F0b3IsIHBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBzZW5kZXJJZCwgcmVjZWl2ZXJJZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Zmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUoY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QqIHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1JbXBsICYmIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gbUltcGwtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpjbGVhblVwKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcCh0cnVlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMGU3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorUmV0dXJuPHZvaWQ+IENvbm5lY3Rpb246OmZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIGlmIChidWZmZXJJZCAhPSBTWU5DX0JVRkZFUklEKSB7CisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWNjZXNzb3ItPmZldGNoKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcntidWZmZXJJZCwgaGFuZGxlfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7MCwgbnVsbHB0cn0pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmZsdXNoKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDc3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBhY3RpdmUgYW5kL29yIGFyZSByZWFkeSB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK09ic2VydmVyOjpPYnNlcnZlcigpIHsKK30KKworT2JzZXJ2ZXI6On5PYnNlcnZlcigpIHsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IE9ic2VydmVyOjpvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgY2xpZW50LT5yZWNlaXZlSW52YWxpZGF0aW9uKG1zZ0lkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIE9ic2VydmVyOjphZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQubG9jaygpIHx8IGl0LT5maXJzdCA9PSBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIGl0ID0gbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCB3Y2xpZW50KSk7CisKK30KKwordm9pZCBPYnNlcnZlcjo6ZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJkN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBPYnNlcnZlciA6IHB1YmxpYyBJT2JzZXJ2ZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gb25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgb3ZlcnJpZGU7CisKKyAgICB+T2JzZXJ2ZXIoKTsKKworICAgIHZvaWQgYWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCk7CisKKyAgICB2b2lkIGRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworcHJpdmF0ZToKKyAgICBPYnNlcnZlcigpOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworCisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+IG1DbGllbnRzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzkwNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtVbnN5bmNocm9uaXplZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBTdGF0dXNEZXNjcmlwdG9yOworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSwga1Vuc3luY2hyb25pemVkV3JpdGU+CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOwordHlwZWRlZiBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTo6RGVzY3JpcHRvciBJbnZhbGlkYXRpb25EZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0cyBjYWNoZWQgYWxsb2NhdGlvbnMuIElmIGl0J3MgbG9jYWwgY29ubmVjdGlvbiwgcmVsZWFzZSB0aGUKKyAgICAgKiBwcmV2aW91cyBhbGxvY2F0aW9ucyBhbmQgZG8gbm90IHJlY3ljbGUgY3VycmVudCBhY3RpdmUgYWxsb2NhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyByZXNldHRlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ0ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmN2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4MWRjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI2OTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdlZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNzM5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRE9DVU1FTlRBVElPTiBHRU5FUkFUSU9OCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDMl9ST09UIDo9ICQoY2FsbCBteS1kaXIpCisKK0MyX0RPQ1NfUk9PVCA6PSAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIKKworQzJfT1VUX1RFTVAgOj0gJChQUk9EVUNUX09VVCkvZ2VuL0VUQy9Db2RlYzItZG9jc19pbnRlcm1lZGlhdGVzCisKK0MyX0RPWFkgOj0gJChvciAkKHNoZWxsIGNvbW1hbmQgLXYgZG94eWdlbiksXAorCQkkKHNoZWxsIGNvbW1hbmQgLXYgL0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvZG94eWdlbikpCisKKy5QSE9OWTogY2hlY2stZG94eWdlbgorY2hlY2stZG94eWdlbjoKK2lmbmRlZiBDMl9ET1hZCisJJChlcnJvciAnZG94eWdlbiBpcyBub3QgYXZhaWxhYmxlJykKK2VuZGlmCisKKyQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJIyBvbmx5IGRvY3VtZW50IGluY2x1ZGUgZGlyZWN0b3J5LCBubyBpbnRlcm5hbCBzZWN0aW9ucworCXNlZCAncy9cKF5JTlBVVCAqPS4qXCkvXDFpbmNsdWRlXC8vOyBcCisJcy9cKF5JTlRFUk5BTF9ET0NTICo9ICpcKS4qL1wxTk8vOyBcCisJcy9cKF5FTkFCTEVEX1NFQ1RJT05TICo9LipcKUlOVEVSTkFMXCguKlwpLiovXDFcMi87IFwKKwlzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXQ6XDEnJChPVVRfRElSKSc6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCiskKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJc2VkICdzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXRcKC4qXClhcGk6XDEnJChPVVRfRElSKSdcMmludGVybmFsOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworLlBIT05ZOiBkb2NzLWFwaQorZG9jcy1hcGk6ICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBBUEkgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2FwaQorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2FwaQorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnCisKKy5QSE9OWTogZG9jcy1pbnRlcm5hbAorZG9jcy1pbnRlcm5hbDogJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gSW50ZXJuYWwgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcKKworLlBIT05ZOiBkb2NzLWFsbAorZG9jcy1hbGw6IGRvY3MtYXBpIGRvY3MtaW50ZXJuYWwKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKGNhbGwgbXktZGlyKSkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYTU4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0QWFjRGVjLmNwcCIsCisgICAgICAgICJEcmNQcmVzTW9kZVdyYXAuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwMGQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0RlYy5oIgorCisjZGVmaW5lIEZJTEVSRUFEX01BWF9MQVlFUlMgMgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgwLjI1KSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDJ1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDczNTAsIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFhY0Zvcm1hdCwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXLCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBpbnQzMl90IGdldERyY0NvbXByZXNzTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNDb21wcmVzc01vZGUtPnZhbHVlID09IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgPyAxIDogMDsgfQorICAgIGludDMyX3QgZ2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY0VuY1RhcmdldExldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjQm9vc3RGYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQm9vc3RGYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQXR0ZW51YXRpb25GYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjRWZmZWN0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNFZmZlY3RUeXBlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRBYWNEZWM6OkMyU29mdEFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRGVjb2RlcihudWxscHRyKSwKKyAgICAgIG1TdHJlYW1JbmZvKG51bGxwdHIpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRBYWNEZWM6On5DMlNvZnRBYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgLy8gVG8gbWFrZSB0aGUgY29kZWMgYmVoYXZlIHRoZSBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgYSByZXNldCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZQorICAgIC8vIHN0cmVhbWluZm8gc3RydWN0LiBUaGlzIGRvZXMgdGhhdDoKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQUFDRGVjb2RlcikgeworICAgICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgbUFBQ0RlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIG1BQUNEZWNvZGVyID0gYWFjRGVjb2Rlcl9PcGVuKFRUX01QNF9BRElGLCAvKiBudW0gbGF5ZXJzICovIDEpOworICAgIGlmIChtQUFDRGVjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdHJlYW1JbmZvID0gYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgaWYgKG1TdHJlYW1JbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworCisgICAgaWYgKG1BQUNEZWNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGlzIG51bGwuIFRPRE86IENhbiBub3QgY2FsbCBhYWNEZWNvZGVyX1NldFBhcmFtIGluIHRoZSBmb2xsb3dpbmcgY29kZSIpOworICAgIH0KKworICAgIC8vYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwgMCk7CisKKyAgICAvL2luaXQgRFJDIHdyYXBwZXIKKyAgICBtRHJjV3JhcC5zZXREZWNvZGVySGFuZGxlKG1BQUNEZWNvZGVyKTsKKyAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKworICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4gYnkgcGxhdGZvcm0gcHJvcGVydGllcworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgRFJDIHNldHRpbmdzIGRlcGVuZGluZyBvbiBhdWRpbyBvdXRwdXQgZGV2aWNlIHR5cGUgKEhETUksIGxvYWRzcGVha2VyLCBoZWFkcGhvbmUpCisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgKHVuc2lnbmVkKXRhcmdldFJlZkxldmVsKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SCisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCAodW5zaWduZWQpYXR0ZW51YXRpb25GYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgKHVuc2lnbmVkKWJvb3N0RmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCAodW5zaWduZWQpY29tcHJlc3NNb2RlKTsKKworICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGludDMyX3QgZW5jVGFyZ2V0TGV2ZWwgPSBtSW50Zi0+Z2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZW5jb2Rlci1zaWRlIERSQyByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCBlbmNUYXJnZXRMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCAodW5zaWduZWQpZW5jVGFyZ2V0TGV2ZWwpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgZWZmZWN0VHlwZSk7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwuCisgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAorICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwgbnVtU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgT1ZFUkZMT1ciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrXSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkIC09IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGJvb2wgZW9zKSB7CisgICAgd2hpbGUgKCFtQnVmZmVyc0luZm8uZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgID49IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgSW5mbyAmb3V0SW5mbyA9IG1CdWZmZXJzSW5mby5mcm9udCgpOworICAgICAgICBBTE9HVigib3V0SW5mby5mcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBvdXRJbmZvLmZyYW1lSW5kZXgpOworICAgICAgICBpbnQgc2FtcGxlc2l6ZSBfX3VudXNlZCA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3V0SW5mby5kZWNvZGVkU2l6ZXMuc2l6ZSgpOworICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQgc2FtcGxlcyBhdmFpbGFibGUgKCVkKSwgb3IgJWQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IGZpbGxXb3JrID0KKyAgICAgICAgICAgIFsmYmxvY2ssIG51bVNhbXBsZXMsIHBvb2wsIHRoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgLT4gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IHsKKyAgICAgICAgICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLCBjMl9zdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgICAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX09LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gZmV0Y2ggYSBsaW5lYXIgYmxvY2sgKCVkKSIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX05PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4od1ZpZXcuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KCk7CisKKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG91dEluZm8uZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluaXNoKG91dEluZm8uZnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG91dEluZm8udGltZXN0YW1wLCBibG9jayA/IGJsb2NrLT5jYXBhY2l0eSgpIDogMCk7CisgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVDSEFSKiBpbkJ1ZmZlcltGSUxFUkVBRF9NQVhfTEFZRVJTXTsKKyAgICBVSU5UIGluQnVmZmVyTGVuZ3RoW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworICAgIFVJTlQgYnl0ZXNWYWxpZFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKworICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgLy9UT0RPCisjaWYgMAorICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVygiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIEZMQUdfQ09ERUNfQ09ORklHIHNldCIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGNvZGVjQ29uZmlnICYmIHNpemUgPiAwdSkgeworICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImFhY0RlY29kZXJfQ29uZmlnUmF3IGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbmZvIGluSW5mbzsKKyAgICBpbkluZm8uZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGluSW5mby50aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIGluSW5mby5idWZmZXJTaXplID0gc2l6ZTsKKyAgICBpbkluZm8uZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CisKKyAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOworICAgICAgICBzaXplIC09IGluQnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgb2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPAorICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYnVmZmVyCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlcyAtIG51bUNvbnN1bWVkOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wdXNoX2JhY2sobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ5dGVzVmFsaWRbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSBidWZmZXJTaXplIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBkZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuYmVnaW4oKSwgaW5JbmZvLmRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAoKG1JbnB1dEJ1ZmZlckNvdW50ID4gMikgJiYgKG1PdXRwdXRCdWZmZXJDb3VudCA8PSAxKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgYWx0ZXJlZCBkdXJpbmcgY29uZmlnLgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOworICAgIH0KKworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICBtQnVmZmVyc0luZm8ucHVzaF9iYWNrKHN0ZDo6bW92ZShpbkluZm8pKTsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIGlmICghZW9zICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgLy8gZGlzY2FyZCBvdXRwdXREZWxheSBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpZiAoZGlzY2FyZCA+IHRvQ29tcGVuc2F0ZSkgeworICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRpc2NhcmRlZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgZGlzY2FyZCk7CisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBmYWxzZSAvKiBub3QgRU9TICovKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBib29sIGVvcyA9IChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKworICAgIGRyYWluRGVjb2RlcigpOworICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBlb3MpOworCisgICAgaWYgKGVvcykgeworICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgfTsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXJzSW5mby5zaXplKCkgPiAxdSkgeworICAgICAgICAgICAgZmluaXNoKG1CdWZmZXJzSW5mby5mcm9udCgpLmZyYW1lSW5kZXgsIGZpbGxFbXB0eVdvcmspOworICAgICAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgaW50IGF2YWlsOworICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBhdmFpbCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgYXZhaWwpOworICAgICAgICBpZiAobnMgIT0gYXZhaWwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLy8gZmx1c2ggZGVjb2RlciB1bnRpbCBvdXRwdXREZWxheSBpcyBjb21wZW5zYXRlZAorICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0QWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFhY0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtQUFDRGVjb2RlcjsKKyAgICBDU3RyZWFtSW5mbyAqbVN0cmVhbUluZm87CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlY29kZWRTaXplczsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxJbmZvPiBtQnVmZmVyc0luZm87CisKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyIG1EcmNXcmFwOworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBkcmFpbkRlY29kZXIoKTsKKworICAgIHZvaWQgZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgYm9vbCBlb3MpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3ZTc3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgNil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4QnVmU2l6ZUNhbGN1bGF0b3IsIG1DaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4QnVmU2l6ZUNhbGN1bGF0b3IoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gJmNoYW5uZWxDb3VudCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAxMDI0ICogc2l6ZW9mKHNob3J0KSAqIGNoYW5uZWxDb3VudC52LnZhbHVlOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworfTsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIjsKKworQzJTb2Z0QWFjRW5jOjpDMlNvZnRBYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0VuY29kZXIobnVsbHB0ciksCisgICAgICBtU0JSTW9kZSgtMSksCisgICAgICBtU0JSUmF0aW8oMCksCisgICAgICBtQUFDUHJvZmlsZShBT1RfQUFDX0xDKSwKKyAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUoMHUpLAorICAgICAgbU91dEJ1ZmZlclNpemUoMHUpLAorICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCisgICAgICBtSW5wdXRUaW1lU2V0KGZhbHNlKSwKKyAgICAgIG1JbnB1dFNpemUoMCksCisgICAgICBtSW5wdXRUaW1lVXMoLTFsbCksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdEFhY0VuYzo6fkMyU29mdEFhY0VuYygpIHsKKyAgICBvblJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jT3BlbigmbUFBQ0VuY29kZXIsIDAsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHNldEF1ZGlvUGFyYW1zKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25TdG9wKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1JbnB1dFRpbWVVcyA9IC0xbGw7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBhYWNFbmNDbG9zZSgmbUFBQ0VuY29kZXIpOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIC8vIG5vLW9wCit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBDSEFOTkVMX01PREUgZ2V0Q2hhbm5lbE1vZGUodWludDMyX3QgbkNoYW5uZWxzKSB7CisgICAgQ0hBTk5FTF9NT0RFIGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICBzd2l0Y2ggKG5DaGFubmVscykgeworICAgICAgICBjYXNlIDE6IGNoTW9kZSA9IE1PREVfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogY2hNb2RlID0gTU9ERV8yOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBjaE1vZGUgPSBNT0RFXzFfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogY2hNb2RlID0gTU9ERV8xXzJfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogY2hNb2RlID0gTU9ERV8xXzJfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogY2hNb2RlID0gTU9ERV8xXzJfMl8xOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gY2hNb2RlOworfQorCisvL3N0YXRpYyBBVURJT19PQkpFQ1RfVFlQRSBnZXRBT1RGcm9tUHJvZmlsZShPTVhfVTMyIHByb2ZpbGUpIHsKKy8vICAgIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RMQykgeworLy8gICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RIRSkgeworLy8gICAgICAgIHJldHVybiBBT1RfU0JSOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUykgeworLy8gICAgICAgIHJldHVybiBBT1RfUFM7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdExEKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfTEQ7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEVMRCkgeworLy8gICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0VMRDsKKy8vICAgIH0gZWxzZSB7CisvLyAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIEFBQyBwcm9maWxlIC0gZGVmYXVsdGluZyB0byBBQUMtTEMiKTsKKy8vICAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKy8vICAgIH0KKy8vfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OnNldEF1ZGlvUGFyYW1zKCkgeworICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRyYXRlIG9yIFNCUiBtb2RlIGNoYW5nZQorICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgorCisgICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcywgJWkgc2JyIG1vZGUsICVpIHNiciByYXRpbyIsCisgICAgICAgICBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCksIG1JbnRmLT5nZXRCaXRyYXRlKCksIG1TQlJNb2RlLCBtU0JSUmF0aW8pOworCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQU9ULCBtQUFDUHJvZmlsZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQU1QTEVSQVRFLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwKKyAgICAgICAgICAgIGdldENoYW5uZWxNb2RlKG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1RSQU5TTVVYLCBUVF9NUDRfUkFXKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU0JSTW9kZSAhPSAtMSAmJiBtQUFDUHJvZmlsZSA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgbVNCUk1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNCUiByYXRpbyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnM6CisgICAgICAgMDogRGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZXJlaW4gU0JSIHJhdGlvIGlzIGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIGF1ZGlvIG9iamVjdCB0eXBlIGJ5CisgICAgICAgICAgdGhlIEZESy4KKyAgICAgICAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkKKyAgICAgICAyOiBEdWFscmF0ZSBTQlIgKGRlZmF1bHQgZm9yIEhFLUFBQykKKyAgICAgKi8KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfUkFUSU8sIG1TQlJSYXRpbykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKworICAgIGlmICghbVNlbnRDb2RlY1NwZWNpZmljRGF0YSkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMKKyAgICAgICAgLy8gZGF0YS4KKworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIGZvciBwcm9maWxlIC8gc2FtcGxlLXJhdGUgLyBiaXQtcmF0ZSAvIGNoYW5uZWxzIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlKCk7CisgICAgICAgIHVpbnQzMl90IGFjdHVhbEJpdFJhdGUgPSBhYWNFbmNvZGVyX0dldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSk7CisgICAgICAgIGlmIChiaXRyYXRlICE9IGFjdHVhbEJpdFJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAldSB1bnN1cHBvcnRlZCwgdXNpbmcgJXUiLCBiaXRyYXRlLCBhY3R1YWxCaXRSYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0IGVuY0luZm87CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jSW5mbyhtQUFDRW5jb2RlciwgJmVuY0luZm8pKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBBQUMgZW5jb2RlciBpbmZvIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShlbmNJbmZvLmNvbmZTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGVuY0luZm8uY29uZkJ1ZiwgZW5jSW5mby5jb25mU2l6ZSk7CisgICAgICAgIEFMT0dWKCJwdXQgY3NkIik7CisjaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIG1PdXRCdWZmZXJTaXplID0gZW5jSW5mby5tYXhPdXRCdWZCeXRlczsKKyAgICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGVuY0luZm8uZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCB0ZW1wWzFdOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSB0ZW1wOworICAgIHNpemVfdCBjYXBhY2l0eSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgZGF0YSA9IHZpZXcuZGF0YSgpOworICAgICAgICBjYXBhY2l0eSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKCFtSW5wdXRUaW1lU2V0ICYmIGNhcGFjaXR5ID4gMCkgeworICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgbUlucHV0VGltZVNldCA9IHRydWU7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IChjYXBhY2l0eSArIG1JbnB1dFNpemUgKyAoZW9zID8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZSAtIDEgOiAwKSkKKyAgICAgICAgICAgIC8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBBTE9HVigiY2FwYWNpdHkgPSAlenU7IG1JbnB1dFNpemUgPSAlenU7IG51bUZyYW1lcyA9ICV6dSBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gJXUiLAorICAgICAgICAgIGNhcGFjaXR5LCBtSW5wdXRTaXplLCBudW1GcmFtZXMsIG1OdW1CeXRlc1BlcklucHV0RnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldyaXRlVmlldz4gd1ZpZXc7CisgICAgdWludDhfdCAqb3V0UHRyID0gdGVtcDsKKyAgICBzaXplX3Qgb3V0QXZhaWxhYmxlID0gMHU7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworCisgICAgQUFDRU5DX0luQXJncyBpbmFyZ3M7CisgICAgQUFDRU5DX091dEFyZ3Mgb3V0YXJnczsKKyAgICBtZW1zZXQoJmluYXJncywgMCwgc2l6ZW9mKGluYXJncykpOworICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkKiBpbkJ1ZmZlcltdICAgICAgICA9IHsgKHVuc2lnbmVkIGNoYXIgKilkYXRhIH07CisgICAgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlclNpemVbXSAgICA9IHsgKElOVCljYXBhY2l0eSB9OworICAgIElOVCAgIGluQnVmZmVyRWxTaXplW10gID0geyBzaXplb2YoaW50MTZfdCkgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKKyAgICBpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKKyAgICBpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKKyAgICBpbkJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBpbkJ1ZmZlclNpemU7CisgICAgaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CisKKyAgICB2b2lkKiBvdXRCdWZmZXJbXSAgICAgICA9IHsgb3V0UHRyIH07CisgICAgSU5UICAgb3V0QnVmZmVySWRzW10gICAgPSB7IE9VVF9CSVRTVFJFQU1fREFUQSB9OworICAgIElOVCAgIG91dEJ1ZmZlclNpemVbXSAgID0geyAwIH07CisgICAgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CisgICAgb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworICAgIG91dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CisgICAgb3V0QnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IG91dEJ1ZmZlclNpemU7CisgICAgb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKKworICAgIEFBQ0VOQ19FUlJPUiBlbmNvZGVyRXJyID0gQUFDRU5DX09LOworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIHdoaWxlIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSyAmJiBpbmFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIGVuY29kZXJFcnIgPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKworICAgICAgICBpZiAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0YXJncy5udW1PdXRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3VtZWQgPSAoY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCkpIC0gaW5hcmdzLm51bUluU2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dGFyZ3MubnVtT3V0Qnl0ZXMpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBoZXhkdW1wKG91dFB0ciwgc3RkOjptaW4ob3V0YXJncy5udW1PdXRCeXRlcywgMjU2KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRQdHIgPSB0ZW1wOworICAgICAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSBpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1JbnB1dFRpbWVVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtSW5wdXRUaW1lVXMucGVla2xsKCkpOworICAgIH0KKworICAgIGlmIChlb3MgJiYgaW5CdWZmZXJTaXplWzBdID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIC8vIEZsdXNoCisgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKworICAgICAgICAodm9pZClhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworICAgIH0KKworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZW9zID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDApLAorICAgICAgICAgICAgIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgKHZvaWQpcG9vbDsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKworICAgIC8vIFRPRE86IHdlIGRvbid0IGhhdmUgYW55IHBlbmRpbmcgd29yayBhdCB0aGlzIHRpbWUgdG8gZHJhaW4uCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QWFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzkzNjViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiYWFjZW5jX2xpYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDRU5DT0RFUiBtQUFDRW5jb2RlcjsKKworICAgIGludDMyX3QgbVNCUk1vZGU7CisgICAgaW50MzJfdCBtU0JSUmF0aW87CisgICAgQVVESU9fT0JKRUNUX1RZUEUgbUFBQ1Byb2ZpbGU7CisgICAgVUlOVCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIFVJTlQgbU91dEJ1ZmZlclNpemU7CisKKyAgICBib29sIG1TZW50Q29kZWNTcGVjaWZpY0RhdGE7CisgICAgYm9vbCBtSW5wdXRUaW1lU2V0OworICAgIHNpemVfdCBtSW5wdXRTaXplOworICAgIGMyX2NudHI2NF90IG1JbnB1dFRpbWVVczsKKworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BhcmFtcygpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YWViYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RyY1dyYXBwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vI2RlZmluZSBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKworI2RlZmluZSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA0MAorCitDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisKKyAgICAvKiBEYXRhIGZyb20gc3RyZWFtSW5mby4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbVN0cmVhbVBSTCA9IC0xOworICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IC0xOworICAgIG1TdHJlYW1OckFBQ0NoYW4gPSAwOworICAgIG1TdHJlYW1Ock91dENoYW4gPSAwOworCisgICAgLyogRGVzaXJlZCB2YWx1ZXMgKHNldCBieSB1c2VyKS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbURlc1RhcmdldCA9IC0xOworICAgIG1EZXNBdHRGYWN0b3IgPSAwOworICAgIG1EZXNCb29zdEZhY3RvciA9IDA7CisgICAgbURlc0hlYXZ5ID0gMDsKKworICAgIG1FbmNvZGVyVGFyZ2V0ID0gLTE7CisKKyAgICAvKiBWYWx1ZXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBkZXNpcmVkIHZhbHVlcyAqLworICAgIG1MYXN0VGFyZ2V0ID0gLTE7CisgICAgbUxhc3RBdHRGYWN0b3IgPSAwOworICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSAwOworICAgIG1MYXN0SGVhdnkgPSAwOworfQorCitDRHJjUHJlc01vZGVXcmFwcGVyOjp+Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKQoreworICAgIG1IYW5kbGVEZWNvZGVyID0gaGFuZGxlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKiBwU3RyZWFtSW5mbykKK3sKKyAgICBhc3NlcnQocFN0cmVhbUluZm8pOworCisgICAgaWYgKG1TdHJlYW1QUkwgIT0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYpIHsKKyAgICAgICAgbVN0cmVhbVBSTCA9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2OworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJvZ1JlZkxldiBpcyAlZFxuIiwgbVN0cmVhbVBSTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbURSQ1ByZXNNb2RlICE9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSkgeworICAgICAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGU7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcmVzTW9kZSBpcyAlZFxuIiwgbVN0cmVhbURSQ1ByZXNNb2RlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuICE9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJBQUNDaGFuID0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogYWFjTnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1OckFBQ0NoYW4pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW4gIT0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1Ock91dENoYW4gPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBudW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yT3V0Q2hhbik7CisjZW5kaWYKKyAgICB9CisKKworCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW48bVN0cmVhbU5yQUFDQ2hhbikgeworICAgICAgICBtSXNEb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNEb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgKG1TdHJlYW1Ock91dENoYW4gPT0gMSkpIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgbVN0cmVhbU5yT3V0Q2hhbiA9PSAyKXsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IGZhbHNlOworICAgIH0KKworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQ6CisgICAgICAgIG1EZXNUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SOgorICAgICAgICBtRGVzQXR0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SOgorICAgICAgICBtRGVzQm9vc3RGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWToKKyAgICAgICAgbURlc0hlYXZ5ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUOgorICAgICAgICBtRW5jb2RlclRhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjp1cGRhdGUoKQoreworICAgIC8vIEdldCBEYXRhIGZyb20gRGVjb2RlcgorICAgIGludCBwcm9nUmVmTGV2ZWwgPSBtU3RyZWFtUFJMOworICAgIGludCBkcmNQcmVzTW9kZSA9IG1TdHJlYW1EUkNQcmVzTW9kZTsKKworICAgIC8vIGJ5IGRlZmF1bHQsIGRvIGFzIGRlc2lyZWQKKyAgICBpbnQgbmV3VGFyZ2V0ICAgICAgICAgPSBtRGVzVGFyZ2V0OworICAgIGludCBuZXdBdHRGYWN0b3IgICAgICA9IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG5ld0Jvb3N0RmFjdG9yICAgID0gbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKKworICAgIGlmIChtRGF0YVVwZGF0ZSkgeworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xMCBkQiBvciBiZWxvdworICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nLCBjYWxjdWxhdGVkIHNjYWxpbmcgb2YgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBhcyBsaXR0bGUgY29tcHJlc3Npb24gYXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgPCBtRGVzVGFyZ2V0KSB7IC8vIGlmIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsY0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYWxjRmFjdG9yX25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMC4wZiA8IGNhbGNGYWN0b3Jfbm9ybSA8IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoZmxvYXQpKG1EZXNUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobUVuY29kZXJUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3IgPSAoaW50KShjYWxjRmFjdG9yX25vcm0qMTI3LjBmKTsgLy8gMCA8PSBjYWxjRmFjdG9yIDwgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY0ZhY3RvciBpcyB0aGUgbG93ZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAoY2FsY0ZhY3Rvcj5uZXdBdHRGYWN0b3IpID8gY2FsY0ZhY3RvciA6IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgQXR0RmFjdG9yIHdpbGwgYmUgYWx3YXlzID0gY2FsY0ZhY3RvciwgYXMgaXQgaXMgc2V0IHRvIDAgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgbGV2ZWwgPiBtRW5jb2RlclRhcmdldCA+IFBSTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQ8OTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCOiBsaWdodCBEUkMgb25seSBuZWVkZWQgaWYgd2UgcGVyZm9ybSBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscworCisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgeworICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChkcmNQcmVzTW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDogLy8gcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsgLy8gYXQgbGVhc3QsIHVzZSBsaWdodCBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0IDwgOTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcmVzZW50YXRpb24gbW9kZSAxIGFuZCAyIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQ6CisgICAgICAgICAgICAvLyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyAoRFZCKTsgU3BlY2lmaWNhdGlvbiBmb3IgdGhlIHVzZSBvZiBWaWRlbyBhbmQgQXVkaW8gQ29kaW5nCisgICAgICAgICAgICAvLyBpbiBCcm9hZGNhc3RpbmcgQXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSwKKyAgICAgICAgICAgIC8vIHNlY3Rpb24gQy41LjQuLCAiRGVjb2RpbmciLCBhbmQgVGFibGUgQy4zMworICAgICAgICAgICAgLy8gSVNPIERSQyAgICAgICAgICAgIC0+IG5ld0hlYXZ5ID0gMCAgKFVzZSBsaWdodCBjb21wcmVzc2lvbiwgTVBFRy1zdHlsZSkKKyAgICAgICAgICAgIC8vIENvbXByZXNzaW9uX3ZhbHVlICAtPiBuZXdIZWF2eSA9IDEgIChVc2UgaGVhdnkgY29tcHJlc3Npb24sIERWQi1zdHlsZSkKKyAgICAgICAgICAgIC8vIHNjYWxpbmcgcmVzdHJpY3RlZCAtPiBuZXdBdHRGYWN0b3IgPSAxMjcKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjogLy8gcHJlc2VudGF0aW9uIG1vZGUgMiwgTGlnaHQ6LTIzL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc01vbm9Eb3dubWl4KSB7IC8vIGlmIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQorICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQorCisgICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgeworICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQorICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWNvZGVyCisgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbUxhc3RUYXJnZXQpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgbUxhc3RUYXJnZXQgPSBuZXdUYXJnZXQ7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1EZXNUYXJnZXQpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgdGFyZ2V0IGxldmVsIHRvICVkIChmcm9tICVkKVxuIiwgbmV3VGFyZ2V0LCBtRGVzVGFyZ2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCB0YXJnZXQgbGV2ZWwgdG8gJWRcbiIsIG5ld1RhcmdldCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbUxhc3RBdHRGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBuZXdBdHRGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1EZXNBdHRGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwgbmV3QXR0RmFjdG9yLCBtRGVzQXR0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWRcbiIsIG5ld0F0dEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtTGFzdEJvb3N0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgbmV3Qm9vc3RGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RCb29zdEZhY3RvciA9IG5ld0Jvb3N0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1EZXNCb29zdEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBib29zdCBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IsIG1EZXNCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYm9vc3QgZmFjdG9yIHRvICVkXG4iLCBuZXdCb29zdEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtTGFzdEhlYXZ5KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBuZXdIZWF2eSk7CisgICAgICAgICAgICBtTGFzdEhlYXZ5ID0gbmV3SGVhdnk7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3SGVhdnkgIT0gbURlc0hlYXZ5KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5LCBtRGVzSGVhdnkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkXG4iLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgY29uZmlnOiB0Z3RfbGV2OiAlM2QsIGN1dDogJTNkLCBib29zdDogJTNkLCBoZWF2eTogJWRcbiIsIG5ld1RhcmdldCwKKyAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IsIG5ld0Jvb3N0RmFjdG9yLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgbURhdGFVcGRhdGUgPSBmYWxzZTsKKworICAgIH0gLy8gaWYgKG1EYXRhVXBkYXRlKQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQgICAgICAgICA9IDB4MDAwMCwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SICAgICA9IDB4MDAwMSwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IgICA9IDB4MDAwMiwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSAgICAgICAgICA9IDB4MDAwMywKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQgICAgICAgICA9IDB4MDAwNAorfSBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU07CisKKworY2xhc3MgQ0RyY1ByZXNNb2RlV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIH5DRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgdm9pZCBzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSk7CisgICAgdm9pZCBzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSk7CisgICAgdm9pZCBzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKik7CisgICAgdm9pZCB1cGRhdGUoKTsKKworcHJvdGVjdGVkOgorICAgIEhBTkRMRV9BQUNERUNPREVSIG1IYW5kbGVEZWNvZGVyOworICAgIGludCBtRGVzVGFyZ2V0OworICAgIGludCBtRGVzQXR0RmFjdG9yOworICAgIGludCBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG1EZXNIZWF2eTsKKworICAgIGludCBtRW5jb2RlclRhcmdldDsKKworICAgIGludCBtTGFzdFRhcmdldDsKKyAgICBpbnQgbUxhc3RBdHRGYWN0b3I7CisgICAgaW50IG1MYXN0Qm9vc3RGYWN0b3I7CisgICAgaW50IG1MYXN0SGVhdnk7CisKKyAgICBTQ0hBUiBtU3RyZWFtUFJMOworICAgIFNDSEFSIG1TdHJlYW1EUkNQcmVzTW9kZTsKKyAgICBJTlQgbVN0cmVhbU5yQUFDQ2hhbjsKKyAgICBJTlQgbVN0cmVhbU5yT3V0Q2hhbjsKKworICAgIGJvb2wgbUlzRG93bm1peDsKKyAgICBib29sIG1Jc01vbm9Eb3dubWl4OworICAgIGJvb2wgbUlzU3RlcmVvRG93bm1peDsKKworICAgIGJvb2wgbURhdGFVcGRhdGU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI1YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3NyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFNUk5CIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yTmJFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJXYkVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFkNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgQU1STkIKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yTmJEZWMiCisjZWxzZQorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJXYkRlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJEZWMuaCIKKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgQU1STkIKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiOworI2Vsc2UKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdEFtckRlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJEZWM6OkMyU29mdEFtckRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQW1ySGFuZGxlKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0ciksCisgICAgICBtRGVjb2RlckNvb2tpZShudWxscHRyKSB7CisjaWZkZWYgQU1STkIKKyAgICBtSXNXaWRlID0gZmFsc2U7CisjZWxzZQorICAgIG1Jc1dpZGUgPSB0cnVlOworI2VuZGlmCit9CisKK0MyU29mdEFtckRlYzo6fkMyU29mdEFtckRlYygpIHsKKyAgICAodm9pZClvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25TdG9wKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChtQW1ySGFuZGxlKSB7CisgICAgICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgbURlY29kZXJDb29raWUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChpbnQ4X3QgKikiQU1STkJEZWNvZGVyIikpCisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbUFtckhhbmRsZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZNKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0geworICAgICAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgIDUsIDYsIDUsIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbMTZdID0geworICAgICAgICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLAorICAgICAgICA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworCisgICAgaWYgKEZNID4gMTUgfHwgKGlzV2lkZSAmJiBGTSA+IDkgJiYgRk0gPCAxNCkgfHwgKCFpc1dpZGUgJiYgRk0gPiAxMSAmJiBGTSA8IDE1KSkgeworICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgbW9kZSAlZCIsIEZNKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFkZCAxIGZvciBoZWFkZXIgYnl0ZQorICAgIHJldHVybiAoaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZNXSA6IGtGcmFtZVNpemVOQltGTV0pICsgMTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU51bUZyYW1lcyhjb25zdCB1aW50OCAqaW5wdXQsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmZyYW1lU2l6ZUxpc3QsIGJvb2wgaXNXaWRlKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBpblNpemU7KSB7CisgICAgICAgIGludDE2X3QgRk0gPSAoKGlucHV0WzBdID4+IDMpICYgMHgwZik7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGTSk7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpblNpemUgLSBrKSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGlucHV0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGsgKz0gZnJhbWVTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGZyYW1lU2l6ZUxpc3QtPnB1c2hfYmFjayhmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVMaXN0OworICAgIGlmIChPSyAhPSBjYWxjdWxhdGVOdW1GcmFtZXMoclZpZXcuZGF0YSgpICsgaW5PZmZzZXQsIGluU2l6ZSwgJmZyYW1lU2l6ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZyYW1lU2l6ZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgc2l6ZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCBvdXRTYW1wbGVzID0gbUlzV2lkZSA/IGtOdW1TYW1wbGVzUGVyRnJhbWVXQiA6IGtOdW1TYW1wbGVzUGVyRnJhbWVOQjsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZSA9IG91dFNhbXBsZXMgKiBmcmFtZVNpemVMaXN0LnNpemUoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBhdXRvIGl0ID0gZnJhbWVTaXplTGlzdC5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGZyYW1lU2l6ZUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoKmlucHV0ID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQgPSBBTVJEZWNvZGUobUFtckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGcmFtZV9UeXBlXzNHUFApIEZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyAxLCBvdXRwdXQsIE1JTUVfSUVURik7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQgKyAxKSAhPSAqaXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChGTSA+PSA5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGluc3RlYWQgb2YgY29tZm9ydCBub2lzZSBhbmQgZm9yCisgICAgICAgICAgICAgICAgLy8gc3BlZWNoIGxvc3Qvbm8gZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MTZfdCBGVDsKKyAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IG51bVJlY1NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBtaW1lX3Vuc29ydGluZyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsICZGVCwgJkZNLCAxLCAmcnhfc3RhdGUpOworICAgICAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYihGTSwgbUlucHV0U2FtcGxlQnVmZmVyLCBvdXRwdXQsICZudW1SZWNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgRlQsIG1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUmVjU2FtcGxlcyAhPSBvdXRTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgb3V0cHV0IHBlciBmcmFtZSBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgb3V0cHV0KSAqLworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVjU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtpXSAmPSAweGZmZkM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluUG9zICs9ICppdDsKKyAgICAgICAgb3V0cHV0ICs9IG91dFNhbXBsZXM7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBTVJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QU1SRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFtckRlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBTVJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFtckRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBbXJEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZU5CICAgPSAxNjAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVXQiAgID0gMzIwLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQgKm1BbXJIYW5kbGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgYm9vbCBtSXNXaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYWE3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJOYkVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJOYkVuYzo6QzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNTdGF0ZShudWxscHRyKSwKKyAgICAgIG1TaWRTdGF0ZShudWxscHRyKSB7Cit9CisKK0MyU29mdEFtck5iRW5jOjp+QzJTb2Z0QW1yTmJFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkluaXQoKSB7CisgICAgYm9vbCBkdHhfZW5hYmxlID0gZmFsc2U7CisKKyAgICBpZiAoQU1SRW5jb2RlSW5pdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlLCBkdHhfZW5hYmxlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA0NzUwOiBtTW9kZSA9IE1SNDc1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE1MDogbU1vZGUgPSBNUjUxNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU5MDA6IG1Nb2RlID0gTVI1OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY3MDA6IG1Nb2RlID0gTVI2NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0MDA6IG1Nb2RlID0gTVI3NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc5NTA6IG1Nb2RlID0gTVI3OTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDIwMDogbU1vZGUgPSBNUjEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyMjAwOiBtTW9kZSA9IE1SMTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gTVI3OTU7CisgICAgfQorICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNTdGF0ZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUpOworICAgICAgICBtRW5jU3RhdGUgPSBtU2lkU3RhdGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoQU1SRW5jb2RlUmVzZXQobUVuY1N0YXRlLCBtU2lkU3RhdGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGU7CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbU1vZGUsIG1JbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuZGF0YSgpICsgb3V0UG9zLCAmZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1RYX1dNRik7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDAgfHwgbnVtRW5jQnl0ZXMgPiAoKGludClvdXRDYXBhY2l0eSAtIChpbnQpb3V0UG9zKSkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgaGVhZGVyIGJ5dGUgZnJvbSBXTUYgdG8gSUVURiBmb3JtYXQuCisgICAgICAgIGlmIChudW1FbmNCeXRlcyA+IDApCisgICAgICAgICAgICB3Vmlldy5kYXRhKClbb3V0UG9zXSA9ICgod1ZpZXcuZGF0YSgpW291dFBvc10gPDwgMykgfCA0KSAmIDB4N2M7CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtck5iRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtck5iRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJOYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWIxNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNTdGF0ZTsKKyAgICB2b2lkICptU2lkU3RhdGU7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yTmJFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5Y2IzMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yV2JFbmMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDE2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbygxNjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJXYkVuYzo6QzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNvZGVySGFuZGxlKG51bGxwdHIpLAorICAgICAgbUFwaUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1NZW1PcGVyYXRvcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFtcldiRW5jOjp+QzJTb2Z0QW1yV2JFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDY2MDA6IG1Nb2RlID0gVk9BTVJXQl9NRDY2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODg1MDogbU1vZGUgPSBWT0FNUldCX01EODg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI2NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDEyNjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDI1MDogbU1vZGUgPSBWT0FNUldCX01EMTQyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE4MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTk4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzMDUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUFwaUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICAgICAgbUFwaUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtTWVtT3BlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKKyAgICAgICAgbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvblN0b3AoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlc1BlckZyYW1lOyBpKyspIHsKKyAgICAgICAgbUlucHV0RnJhbWVbaV0gPSAweDAwMDg7IC8qIEVIRl9NQVNLICovCisgICAgfQorICAgIHVpbnQ4X3Qgb3V0QnVmZmVyW2tOdW1CeXRlc1BlcklucHV0RnJhbWVdOworICAgICh2b2lkKSBlbmNvZGVJbnB1dChvdXRCdWZmZXIsIGtOdW1CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgaWYgKCFtTWVtT3BlcmF0b3IpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KAorICAgICAgICAgICAgICAgICZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgVk9BTVJXQkZSQU1FVFlQRSB0eXBlID0gVk9BTVJXQl9SRkMzMjY3OworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0KKyAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICAmbU1vZGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1Nb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQzJTb2Z0QW1yV2JFbmM6OmVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworCisgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwKKyAgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbnB1dERhdGEpKTsKKworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBidWZmZXI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBsZW5ndGg7CisgICAgVk9fVTMyIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEoCisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBpZiAocmV0ICE9IFZPX0VSUl9OT05FICYmIHJldCAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKSB7CisgICAgICAgIEFMT0dEKCJlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgZW5jb2RlIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGF0YS5MZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBlbmNvZGVJbnB1dCgod1ZpZXcuZGF0YSgpICsgb3V0UG9zKSwgb3V0Q2FwYWNpdHkgLSBvdXRQb3MpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtcldiRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtcldiRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJXYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY29kZXJIYW5kbGU7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SICptTWVtT3BlcmF0b3I7CisgICAgVk9BTVJXQk1PREUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgaW50IGVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtcldiRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYmY1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2MyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW9tRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBb21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBb21EZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICBoZWxwZXIsIENPTVBPTkVOVF9OQU1FLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geworICAgICAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIG9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+JiBtZSwKKyAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4KKyAgICAgICAgLy8gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+JiBtZSwKKyAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4mIG1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZ2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKK307CisKK0MyU29mdEFvbURlYzo6QzJTb2Z0QW9tRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKXsKKworICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0QW9tRGVjOjp+QzJTb2Z0QW9tRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBb21EZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyLiIpOworICAgICAgICBkZXN0cm95RGVjb2RlcigpOworICAgICAgICAodm9pZClpbml0RGVjb2RlcigpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBb21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBkZXN0cm95RGVjb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgd2hpbGUgKGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcikpIHsKKyAgICB9CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbmV3IGFvbV9jb2RlY19jdHhfdDsKKyAgICB9CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBhb21fY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGFvbV9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIGNmZy5hbGxvd19sb3diaXRkZXB0aCA9IDE7CisKKyAgICBhb21fY29kZWNfZmxhZ3NfdCBmbGFnczsKKyAgICBtZW1zZXQoJmZsYWdzLCAwLCBzaXplb2YoYW9tX2NvZGVjX2ZsYWdzX3QpKTsKKworICAgIGFvbV9jb2RlY19lcnJfdCBlcnI7CisgICAgaWYgKChlcnIgPSBhb21fY29kZWNfZGVjX2luaXQobUNvZGVjQ3R4LCBhb21fY29kZWNfYXYxX2R4KCksICZjZmcsIDApKSkgeworICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEFvbURlYzo6ZGVzdHJveURlY29kZXIoKSB7CisgICAgaWYgKG1Db2RlY0N0eCkgeworICAgICAgICBhb21fY29kZWNfZGVzdHJveShtQ29kZWNDdHgpOworICAgICAgICBkZWxldGUgbUNvZGVjQ3R4OworICAgICAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBb21EZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworICAgIGlmIChpblNpemUpIHsKKyAgICAgICAgdWludDhfdCogYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90Kj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBpbnQzMl90IGRlY29kZVRpbWUgPSAwOworICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKworICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIGJpdHN0cmVhbSwgaW5TaXplKTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworCisgICAgICAgIGFvbV9jb2RlY19lcnJfdCBlcnIgPQorICAgICAgICAgICAgYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCk7CisKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNGQgZGVsYXk9JTRkXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBBT01fQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90KiBkc3RTdGFydCA9IGRzdDsKKworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RTdHJpZGUgLyAyLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0QW9tRGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgYW9tX2ltYWdlX3QqIGltZyA9IGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QqKWltZy0+dXNlcl9wcml2LCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKKyAgICBibG9jayA9IG51bGxwdHI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICB1aW50MzJfdCBkcmFpbk1vZGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHdoaWxlICgob3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspKSkgeworICAgIH0KKworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TICYmIHdvcmsgJiYKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QW9tRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworICAgcHVibGljOgorICAgIEMyU29mdEFvbUZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW9tRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBb21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW9tRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW9tRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MjY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSAiYW9tL2FvbV9kZWNvZGVyLmgiCisjaW5jbHVkZSAiYW9tL2FvbWR4LmgiCisKKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBb21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QW9tRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFvbURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYW9tX2NvZGVjX2N0eF90KiBtQ29kZWNDdHg7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyAgICAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2spOworICAgIGJvb2wgb3V0cHV0QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCh1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW9tRGVjKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvdGVtcC9hdjEiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICJ3ZWJtIgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvdGVtcC9hdjEiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiYXYxIgorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiR0VORVJBVEVfRklMRV9OQU1FUyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorICAgIH0KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkR1bXAgdG8gZmlsZSEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgICAgICAgICAgaWYgKGZwICE9IE5VTEwpIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjE0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM3IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZGVjIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0RlYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2VuYyJdLAorCisgICAgc3JjczogWyJDMlNvZnRBdmNFbmMuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjkwZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKQEAgLTAsMCArMSw5ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QXZjRGVjLmgiCisjaW5jbHVkZSAiaWgyNjRkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEF2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDh1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBjb2RlZCBhbmQgb3V0cHV0IHBpY3R1cmUgc2l6ZSBpcyB0aGUgc2FtZSBmb3IgdGhpcyBjb2RlYworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0h9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ180LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ181LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA4MHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA4MHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDE5Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0QXZjRGVjOjpDMlNvZnRBdmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpIHsKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKK30KKworQzJTb2Z0QXZjRGVjOjp+QzJTb2Z0QXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gbVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRBdmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUgyNjREX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdGZyX2NoYXJzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZnM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEF2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIHsKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZClnZXRWdWlQYXJhbXMoKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR0QoIkJ5dGVzIGNvbnN1bWVkIGlzIHplcm8uIElnbm9yaW5nIHJlbWFpbmluZyBieXRlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEF2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBdmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBdmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjdhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloMjY0ZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL2F2Y2RfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJoMjY0IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMICYmIG1fb2Zmc2V0ID09IDApIHsgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCkgbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGZwID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisKK2NsYXNzIEMyU29mdEF2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QXZjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpOworICAgIHZvaWQgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODUxOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKQEAgLTAsMCArMSwxNTYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEF2Y0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNFbmMuaCIKKyNpbmNsdWRlICJpaDI2NGUuaCIKKyNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBdmNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjU2MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgMC4pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIG1vZGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9BUkJJVFJBUlkgfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW50cmFSZWZyZXNoLCBwZXJpb2QpLmFueSgpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihJbnRyYVJlZnJlc2hTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsIExFVkVMX0FWQ180XzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMywKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfM18yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzQsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ181LAorICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUsIG1GcmFtZVJhdGUsIG1CaXRyYXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gJmZyYW1lUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZiaXRyYXRlKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBMZXZlbExpbWl0cyB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbDsKKyAgICAgICAgICAgIGZsb2F0IG1ic1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IG1iczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgICAgMTQ4NSwgICAgOTksICAgICA2NDAwMCB9LAorICAgICAgICAgICAgLy8gRGVjb2RlciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbGV2ZWwgMWIuCisgICAgICAgICAgICAvLyB7IExFVkVMX0FWQ18xQiwgICAgMTQ4NSwgICA5OSwgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgICAzMDAwLCAgIDM5NiwgICAgMTkyMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsICAgNjAwMCwgICAzOTYsICAgIDM4NDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAgMTE4ODAsICAgMzk2LCAgICA3NjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgIDExODgwLCAgIDM5NiwgICAyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsICAxOTgwMCwgICA3OTIsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAgMjAyNTAsICAxNjIwLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgIDQwNTAwLCAgMTYyMCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDEwODAwMCwgIDM2MDAsICAxNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAyMTYwMDAsICA1MTIwLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgMjQ1NzYwLCAgODE5MiwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDI0NTc2MCwgIDgxOTIsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA1MjIyNDAsICA4NzA0LCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTg5ODI0LCAyMjA4MCwgMTM1MDAwMDAwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgdWludDY0X3QgbWJzID0gdWludDY0X3QoKHNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgoc2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KTsKKyAgICAgICAgZmxvYXQgbWJzUGVyU2VjID0gZmxvYXQobWJzKSAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuIEZvciBMZXZlbCAxYiwgd2Ugd2FudCB0byB1cGRhdGUgdGhlIGxldmVsIGFueXdheSwKKyAgICAgICAgLy8gc28gd2Ugc2V0IGl0IHRvIHRydWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gKG1lLnYubGV2ZWwgPT0gTEVWRUxfQVZDXzFCKTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAobWJzIDw9IGxpbWl0Lm1icyAmJiBtYnNQZXJTZWMgPD0gbGltaXQubWJzUGVyU2VjICYmCisgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUudi52YWx1ZSA8PSBsaW1pdC5iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cywgYW5kIGlmCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdXBwbGllZCBsZXZlbCB5ZXQsIHRoYXQgbWVhbnMgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJHaXZlbiBsZXZlbCAleCBkb2VzIG5vdCBjb3ZlciBjdXJyZW50IGNvbmZpZ3VyYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGluZyB0byAleCIsIG1lLnYubGV2ZWwsIGxpbWl0LmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBsaW1pdC5sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lLnYubGV2ZWwgPT0gbGltaXQubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB0aGUgbG93ZXN0IGZlYXNpYmxlIGxldmVsIGlzCisgICAgICAgICAgICAgICAgLy8gZm91bmQuIFRoZSBmYWN0IHRoYXQgd2UncmUgaGVyZSBtZWFucyB0aGF0IG91ciBsZXZlbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gbWVldCB0aGUgcmVxdWlyZW1lbnQgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vIFdlIHNldCB0byB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGV2ZWwuCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0FWQ181OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEludHJhUmVmcmVzaFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi5wZXJpb2QgPCAxKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQ7CisgICAgICAgICAgICBtZS5zZXQoKS5wZXJpb2QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IGFyYml0cmFyeSBtb2RlIChjeWNsaWMgaW4gb3VyIGNhc2UpCisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgSVZfUFJPRklMRV9UIGdldFByb2ZpbGVfbCgpIGNvbnN0IHsKKyAgICAgICAgc3dpdGNoIChtUHJvZmlsZUxldmVsLT5wcm9maWxlKSB7CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU6ICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfQkFTRUxJTkU6IHJldHVybiBJVl9QUk9GSUxFX0JBU0U7CisgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfTUFJTjogICAgIHJldHVybiBJVl9QUk9GSUxFX01BSU47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHByb2ZpbGU6ICV4IiwgbVByb2ZpbGVMZXZlbC0+cHJvZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gSVZfUFJPRklMRV9ERUZBVUxUOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgYXZjTGV2ZWw7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbCBsZXZlbHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzEsICAgMTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFCLCAgIDkgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgMTEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMiwgMTIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgMTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgMjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMSwgMjEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgMjIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgMzAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMSwgMzEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMzIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgNDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMSwgNDEgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNDIgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTAgfSwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbCAmbGV2ZWwgOiBsZXZlbHMpIHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZUxldmVsLT5sZXZlbCA9PSBsZXZlbC5jMkxldmVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsLmF2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gNDE7CisgICAgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZF9sKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGdldEludHJhUmVmcmVzaF9sKCkgY29uc3QgeyByZXR1cm4gbUludHJhUmVmcmVzaDsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworI2RlZmluZSBpdmVfYXBpX2Z1bmN0aW9uICBpaDI2NGVfYXBpX2Z1bmN0aW9uCisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciI7CisKK25hbWVzcGFjZSB7CisKKy8vIEZyb20gZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIvaWgyNjRlX2JpdHN0cmVhbS5oCitjb25zdGV4cHIgdWludDMyX3QgTUlOX1NUUkVBTV9TSVpFID0gMHg4MDA7CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMlNvZnRBdmNFbmM6OkMyU29mdEF2Y0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1BVkNFbmNQcm9maWxlKElWX1BST0ZJTEVfQkFTRSksCisgICAgICBtQVZDRW5jTGV2ZWwoNDEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKKyAgICAgIG1TYXdPdXRwdXRFT1MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKSwKKyAgICAgIC8vIFRPRE86IG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgbU91dEJ1ZmZlclNpemUoNTI0Mjg4KSB7CisKKyAgICAvLyBJZiBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCitDMlNvZnRBdmNFbmM6On5DMlNvZnRBdmNFbmMoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpvblJlc2V0KCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9SRVNFVD8KKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0ZMVVNIPworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCAgQzJTb2Z0QXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIG1OdW1NZW1SZWNvcmRzID0gREVGQVVMVF9NRU1fUkVDX0NOVDsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gMDsKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtQXJjaCA9IERFRkFVTFRfQVJDSDsKKyAgICBtU2xpY2VNb2RlID0gREVGQVVMVF9TTElDRV9NT0RFOworICAgIG1TbGljZVBhcmFtID0gREVGQVVMVF9TTElDRV9QQVJBTTsKKyAgICBtSGFsZlBlbEVuYWJsZSA9IERFRkFVTFRfSFBFTDsKKyAgICBtSUludGVydmFsID0gREVGQVVMVF9JX0lOVEVSVkFMOworICAgIG1JRFJJbnRlcnZhbCA9IERFRkFVTFRfSURSX0lOVEVSVkFMOworICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTDsKKyAgICBtRW5hYmxlRmFzdFNhZCA9IERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEOworICAgIG1FbmFibGVBbHRSZWYgPSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGOworICAgIG1FbmNTcGVlZCA9IERFRkFVTFRfRU5DX1NQRUVEOworICAgIG1JbnRyYTR4NCA9IERFRkFVTFRfSU5UUkE0eDQ7CisgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnID0gREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQTsKKyAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CisgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CisgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREaW1lbnNpb25zKCkgeworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCBzX2RpbWVuc2lvbnNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90IHNfZGltZW5zaW9uc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtU2l6ZS0+d2lkdGg7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90KTsKKyAgICBzX2RpbWVuc2lvbnNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RpbWVuc2lvbnNfaXAsICZzX2RpbWVuc2lvbnNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSBkaW1lbnNpb25zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RpbWVuc2lvbnNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXROdW1Db3JlcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19udW1fY29yZXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19udW1fY29yZXNfb3A7CisgICAgc19udW1fY29yZXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9DT1JFUyk7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisKKyAgICBzX251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopICZzX251bV9jb3Jlc19pcCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvY2Vzc29yIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90IHNfZnJhbWVfcmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3Qgc19mcmFtZV9yYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90KTsKKyAgICBzX2ZyYW1lX3JhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3JhdGVfaXAsICZzX2ZyYW1lX3JhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSByYXRlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3JhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRJcGVQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90IHNfaXBlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3Qgc19pcGVfcGFyYW1zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfaXBlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfaXBlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfSVBFX1BBUkFNUzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmFibGVfaW50cmFfNHg0ID0gbUludHJhNHg0OworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmNfc3BlZWRfcHJlc2V0ID0gbUVuY1NwZWVkOworICAgIHNfaXBlX3BhcmFtc19pcC51NF9jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gbUNvbnN0cmFpbmVkSW50cmFGbGFnOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCk7CisgICAgc19pcGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pcGVfcGFyYW1zX2lwLCAmc19pcGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaXBlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19pcGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0Qml0UmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3Qgc19iaXRyYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCBzX2JpdHJhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19iaXRyYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19iaXRyYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9CSVRSQVRFOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUtPnZhbHVlOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYml0cmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCk7CisgICAgc19iaXRyYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19iaXRyYXRlX2lwLCAmc19iaXRyYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYml0IHJhdGUgPSAweCV4XG4iLCBzX2JpdHJhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UIGVfZnJhbWVfdHlwZSkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19mcmFtZV90eXBlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV90eXBlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVRZUEU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9mcmFtZV90eXBlID0gZV9mcmFtZV90eXBlOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCk7CisgICAgc19mcmFtZV90eXBlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV90eXBlX2lwLCAmc19mcmFtZV90eXBlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgdHlwZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV90eXBlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UXAoKSB7CisgICAgaXZlX2N0bF9zZXRfcXBfaXBfdCBzX3FwX2lwOworICAgIGl2ZV9jdGxfc2V0X3FwX29wX3Qgc19xcF9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CisKKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7CisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3FwX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfaXBfdCk7CisgICAgc19xcF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3FwX2lwLCAmc19xcF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHFwIDB4JXhcbiIsIHNfcXBfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCBzX2VuY19tb2RlX2lwOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3Qgc19lbmNfbW9kZV9vcDsKKworICAgIHNfZW5jX21vZGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2VuY19tb2RlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9FTkNfTU9ERTsKKworICAgIHNfZW5jX21vZGVfaXAuZV9lbmNfbW9kZSA9IGVfZW5jX21vZGU7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCk7CisgICAgc19lbmNfbW9kZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY19tb2RlX2lwLCAmc19lbmNfbW9kZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGluIGhlYWRlciBlbmNvZGUgbW9kZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19lbmNfbW9kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFZidlBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3Qgc192YnZfaXA7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90IHNfdmJ2X29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfdmJ2X2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc192YnZfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1ZCVl9QQVJBTVM7CisKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmX3NpemUgPSAwOworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZmZXJfZGVsYXkgPSAxMDAwOworCisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Zidl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCk7CisgICAgc192YnZfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Zidl9pcCwgJnNfdmJ2X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgVkJWIHBhcmFtcyA9IDB4JXhcbiIsIHNfdmJ2X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0QWlyUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCBzX2Fpcl9pcDsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3Qgc19haXJfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19haXJfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2Fpcl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQUlSX1BBUkFNUzsKKworICAgIHNfYWlyX2lwLmVfYWlyX21vZGUgPQorICAgICAgICAobUludHJhUmVmcmVzaC0+bW9kZSA9PSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCB8fCBtSW50cmFSZWZyZXNoLT5wZXJpb2QgPCAxKQorICAgICAgICAgICAgPyBJVkVfQUlSX01PREVfTk9ORSA6IElWRV9BSVJfTU9ERV9DWUNMSUM7CisgICAgc19haXJfaXAudTRfYWlyX3JlZnJlc2hfcGVyaW9kID0gbUludHJhUmVmcmVzaC0+cGVyaW9kOworCisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2Fpcl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCk7CisgICAgc19haXJfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2Fpcl9pcCwgJnNfYWlyX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYWlyIHBhcmFtcyA9IDB4JXhcbiIsIHNfYWlyX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0TWVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90IHNfbWVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90IHNfbWVfcGFyYW1zX29wOworCisgICAgc19tZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX21lX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTUVfUEFSQU1TOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2Zhc3Rfc2FkID0gbUVuYWJsZUZhc3RTYWQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2FsdF9yZWYgPSBtRW5hYmxlQWx0UmVmOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2hwZWwgPSBtSGFsZlBlbEVuYWJsZTsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfcXBlbCA9IERFRkFVTFRfUVBFTDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9tZV9zcGVlZF9wcmVzZXQgPSBERUZBVUxUX01FX1NQRUVEOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3ggPSBERUZBVUxUX1NSQ0hfUk5HX1g7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeSA9IERFRkFVTFRfU1JDSF9STkdfWTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCk7CisgICAgc19tZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfbWVfcGFyYW1zX2lwLCAmc19tZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBtZSBwYXJhbXMgPSAweCV4XG4iLCBzX21lX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEdvcFBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90IHNfZ29wX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3Qgc19nb3BfcGFyYW1zX29wOworCisgICAgc19nb3BfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19nb3BfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9HT1BfUEFSQU1TOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3QpOworICAgIHNfZ29wX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZ29wX3BhcmFtc19pcCwgJnNfZ29wX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEdPUCBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZ29wX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFByb2ZpbGVQYXJhbXMoKSB7CisgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCBzX3Byb2ZpbGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3Qgc19wcm9maWxlX3BhcmFtc19vcDsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9QUk9GSUxFX1BBUkFNUzsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID0gbUludGYtPmdldFByb2ZpbGVfbCgpOworICAgIGlmIChzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9PSBJVl9QUk9GSUxFX0JBU0UpIHsKKyAgICAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAxOworICAgIH0KKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCk7CisgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3QpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcHJvZmlsZV9wYXJhbXNfaXAsICZzX3Byb2ZpbGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvZmlsZSBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREZWJsb2NrUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90IHNfZGVibG9ja19wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCBzX2RlYmxvY2tfcGFyYW1zX29wOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RFQkxPQ0tfUEFSQU1TOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9kaXNhYmxlX2RlYmxvY2tfbGV2ZWwgPSBtRGlzYWJsZURlYmxrTGV2ZWw7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCk7CisgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RlYmxvY2tfcGFyYW1zX2lwLCAmc19kZWJsb2NrX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZW5hYmxlL2Rpc2FibGUgZGVibG9jayBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB1MV92ZXJzaW9uID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZnNpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfY3RsX2lwLCAodm9pZCAqKSAmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb246IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiSXR0aWFtIGVuY29kZXIgdmVyc2lvbjogJXMiLCAoY2hhciAqKXNfY3RsX2lwLnB1MV92ZXJzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgbGV2ZWw7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgYzJfc3RhdHVzX3QgZXJyVHlwZSA9IEMyX09LOworCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgbUFWQ0VuY0xldmVsID0gbUludGYtPmdldExldmVsX2woKTsKKyAgICAgICAgbUlJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICB9CisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKworICAgIG1TdHJpZGUgPSB3aWR0aDsKKworICAgIC8vIFRPRE8KKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisKKyAgICBBTE9HRCgiUGFyYW1zIHdpZHRoICVkIGhlaWdodCAlZCBsZXZlbCAlZCBjb2xvckZvcm1hdCAlZCIsIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LCBtQVZDRW5jTGV2ZWwsIG1JdlZpZGVvQ29sb3JGb3JtYXQpOworCisgICAgLyogR2V0dGluZyBOdW1iZXIgb2YgTWVtUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X251bV9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19udW1fbWVtX3JlY19pcCwgJnNfbnVtX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkdldCBudW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYXJyYXkgdG8gaG9sZCBtZW1vcnkgcmVjb3JkcyAqLworICAgIGlmIChtTnVtTWVtUmVjb3JkcyA+IFNJWkVfTUFYIC8gc2l6ZW9mKGl2X21lbV9yZWNfdCkpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RlZCBtZW1vcnkgc2l6ZSBpcyB0b28gYmlnLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBtTWVtUmVjb3JkcyA9IChpdl9tZW1fcmVjX3QgKiltYWxsb2MobU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKG51bGxwdHIgPT0gbU1lbVJlY29yZHMpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvbGQgbWVtb3J5IHJlY29yZHM6IFNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBudWxscHRyOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUgPSAwOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5lX21lbV90eXBlID0gSVZfTkFfTUVNX1RZUEU7CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldHRpbmcgTWVtUmVjb3JkcyBBdHRyaWJ1dGVzICovCisgICAgeworICAgICAgICBpdl9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX3JlY19pcDsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NvbG9yX2Zvcm1hdCA9IERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfZmlsbF9tZW1fcmVjX2lwLCAmc19maWxsX21lbV9yZWNfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkZpbGwgbWVtb3J5IHJlY29yZHMgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGluZyBNZW1vcnkgZm9yIE1lbSBSZWNvcmRzICovCisgICAgeworICAgICAgICBXT1JEMzIgdG90YWxfc2l6ZTsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICB0b3RhbF9zaXplID0gMDsKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZV9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbSByZWNvcmQgaWQgJXp1IHNpemUgJXVcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29kZWMgSW5zdGFuY2UgQ3JlYXRpb24gKi8KKyAgICB7CisgICAgICAgIGl2ZV9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmVfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICBtQ29kZWNDdHggPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZV9hcGlfZnVuY3Rpb247CisKKyAgICAgICAgc19pbml0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfaXBfdCk7CisgICAgICAgIHNfaW5pdF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X29wX3QpOworCisgICAgICAgIHNfaW5pdF9pcC5lX2NtZCA9IElWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF93ZCA9IHdpZHRoOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfaW5pdF9pcC5lX2lucF9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgICAgIGlmIChtUmVjb25FbmFibGUgfHwgbVBTTlJFbmFibGUpIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc19pbml0X2lwLmVfcmVjb25fY29sb3JfZm10ID0gREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfaW5pdF9pcC5lX3JjX21vZGUgPSBERUZBVUxUX1JDX01PREU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfZnJhbWVyYXRlID0gREVGQVVMVF9NQVhfRlJBTUVSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2JpdHJhdGUgPSBERUZBVUxUX01BWF9CSVRSQVRFOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2JmcmFtZXMgPSBtQmZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLmVfY29udGVudF90eXBlID0gSVZfUFJPR1JFU1NJVkU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworICAgICAgICBzX2luaXRfaXAuZV9zbGljZV9tb2RlID0gbVNsaWNlTW9kZTsKKyAgICAgICAgc19pbml0X2lwLnU0X3NsaWNlX3BhcmFtID0gbVNsaWNlUGFyYW07CisgICAgICAgIHNfaW5pdF9pcC5lX2FyY2ggPSBtQXJjaDsKKyAgICAgICAgc19pbml0X2lwLmVfc29jID0gREVGQVVMVF9TT0M7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2luaXRfaXAsICZzX2luaXRfb3ApOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkluaXQgZW5jb2RlciBmYWlsZWQgPSAweCV4XG4iLCBzX2luaXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IENvZGVjIFZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBzZXQgcHJvY2Vzc29yIGRldGFpbHMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgZGltZW5zaW9ucyAqLworICAgIHNldERpbWVuc2lvbnMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIHJhdGVzICovCisgICAgc2V0RnJhbWVSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBJUEUgUGFyYW1zICovCisgICAgc2V0SXBlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBCaXRyYXRlICovCisgICAgc2V0Qml0UmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUVAgKi8KKyAgICBzZXRRcCgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQUlSIHBhcmFtcyAqLworICAgIHNldEFpclBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgVkJWIHBhcmFtcyAqLworICAgIHNldFZidlBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgTW90aW9uIGVzdGltYXRpb24gcGFyYW1zICovCisgICAgc2V0TWVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEdPUCBwYXJhbXMgKi8KKyAgICBzZXRHb3BQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IERlYmxvY2sgcGFyYW1zICovCisgICAgc2V0RGVibG9ja1BhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUHJvZmlsZSBwYXJhbXMgKi8KKyAgICBzZXRQcm9maWxlUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBpbiBFbmNvZGUgaGVhZGVyIG1vZGUgKi8KKyAgICBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9IRUFERVIpOworCisgICAgQUxPR1YoImluaXRfY29kZWMgc3VjY2Vzc2Z1bGwiKTsKKworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXMgPSBJVl9TVUNDRVNTOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCBzX3JldHJpZXZlX21lbV9pcDsKKyAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3Qgc19yZXRyaWV2ZV9tZW1fb3A7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc19yZXRyaWV2ZV9tZW1faXAudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3QpOworICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X3NpemUgPSBzaXplb2YoaXZfcmV0cmlldmVfbWVtX3JlY19vcF90KTsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5lX2NtZCA9IElWX0NNRF9SRVRSSUVWRV9NRU1SRUM7CisgICAgc19yZXRyaWV2ZV9tZW1faXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3JldHJpZXZlX21lbV9pcCwgJnNfcmV0cmlldmVfbWVtX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHJldHJpZXZlIG1lbW9yeSByZWNvcmRzID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3JldHJpZXZlX21lbV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvKiBGcmVlIG1lbW9yeSByZWNvcmRzICovCisgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc19yZXRyaWV2ZV9tZW1fb3AudTRfbnVtX21lbV9yZWNfZmlsbGVkOyBpKyspIHsKKyAgICAgICAgaWYgKHBzX21lbV9yZWMpIGl2ZV9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1lbW9yeSByZWNvcmQgaXMgbnVsbC4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgcHNfbWVtX3JlYysrOworICAgIH0KKworICAgIGlmIChtTWVtUmVjb3JkcykgZnJlZShtTWVtUmVjb3Jkcyk7CisKKyAgICAvLyBjbGVhciBvdGhlciBwb2ludGVycyBpbnRvIHRoZSBzcGFjZSBiZWluZyBmcmVlKClkCisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RW5jb2RlQXJncygKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAsCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgdWludDhfdCAqYmFzZSwKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGl2X3Jhd19idWZfdCAqcHNfaW5wX3Jhd19idWY7CisKKyAgICBwc19pbnBfcmF3X2J1ZiA9ICZwc19lbmNvZGVfaXAtPnNfaW5wX2J1ZjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi5wdl9idWYgPSBiYXNlOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J5dGVzID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9idWZzaXplID0gY2FwYWNpdHk7CisgICAgcHNfZW5jb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfaXBfdCk7CisgICAgcHNfZW5jb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfb3BfdCk7CisKKyAgICBwc19lbmNvZGVfaXAtPmVfY21kID0gSVZFX0NNRF9WSURFT19FTkNPREU7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9idWZzID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnB2X21iX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfcGljX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+dTRfbWJfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3BpY19pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IHRpbWVzdGFtcCA+PiAzMjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSB0aW1lc3RhbXAgJiAweEZGRkZGRkZGOworICAgIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnB2X2J1ZiA9IG51bGxwdHI7CisKKyAgICAvKiBJbml0aWFsaXplIGNvbG9yIGZvcm1hdHMgKi8KKyAgICBtZW1zZXQocHNfaW5wX3Jhd19idWYsIDAsIHNpemVvZihpdl9yYXdfYnVmX3QpKTsKKyAgICBwc19pbnBfcmF3X2J1Zi0+dTRfc2l6ZSA9IHNpemVvZihpdl9yYXdfYnVmX3QpOworICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaWYgKGlucHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyl7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJ3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsIGlucHV0LT53aWR0aCgpLCBpbnB1dC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBpbnB1dC0+bGF5b3V0KCk7CisgICAgdWludDhfdCAqeVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICp1UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKnZQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBBTE9HVigieVBsYW5lU2l6ZSA9ICV6dSIsIHlQbGFuZVNpemUpOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKmlucHV0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JdlZpZGVvQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwUDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnN0IGJ1dCBJdHRpYW0gQVBJIHdhbnRzIGJhcmUgcG9pbnRlci4KKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1syXSA9IHZQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMl0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMl0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsyXSA9IHZTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0gcHUxX2J1ZjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBtV2lkdGggKiAyOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2hpbGUgKCFtU2F3T3V0cHV0RU9TICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyb3I7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOworICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKKworICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVhZGVyTGVuZ3RoID0gTUlOX1NUUkVBTV9TSVpFOworICAgICAgICB1aW50OF90IGhlYWRlcltrSGVhZGVyTGVuZ3RoXTsKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBudWxscHRyLCBoZWFkZXIsIGtIZWFkZXJMZW5ndGgsIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChlcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkOiAlZCIsIGVycm9yKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgaGVhZGVyIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGhlYWRlciwgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIERVTVBfVE9fRklMRSgKKyAgICAgICAgICAgICAgICBtT3V0RmlsZSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIHNldEJpdFJhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRyYVJlZnJlc2ggIT0gbUludHJhUmVmcmVzaCkgeworICAgICAgICAgICAgbUludHJhUmVmcmVzaCA9IGludHJhUmVmcmVzaDsKKyAgICAgICAgICAgIHNldEFpclBhcmFtcygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIHNldEZyYW1lVHlwZShJVl9JRFJfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgfQorCisgICAgLyogSW4gbm9ybWFsIG1vZGUsIHN0b3JlIGlucHV0QnVmZmVySW5mbyBhbmQgdGhpcyB3aWxsIGJlIHJldHVybmVkCisgICAgICAgd2hlbiBlbmNvZGVyIGNvbnN1bWVzIHRoaXMgaW5wdXQgKi8KKyAgICAvLyBpZiAoIW1JbnB1dERhdGFJc01ldGEgJiYgKGlucHV0QnVmZmVySW5mbyAhPSBOVUxMKSkgeworICAgIC8vICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUzsgaSsrKSB7CisgICAgLy8gICAgICAgICBpZiAoTlVMTCA9PSBtSW5wdXRCdWZmZXJJbmZvW2ldKSB7CisgICAgLy8gICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXSA9IGlucHV0QnVmZmVySW5mbzsKKyAgICAvLyAgICAgICAgICAgICBicmVhazsKKyAgICAvLyAgICAgICAgIH0KKyAgICAvLyAgICAgfQorICAgIC8vIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgdmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmICh2aWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgZG8geworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaCBsaW5lYXIgYmxvY2sgZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGVyciA9ICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCB2aWV3LmdldCgpLCB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChlcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIDogJWQiLCBlcnJvcik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyb3I7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEVU1QX1RPX0ZJTEUoCisgICAgICAgIC8vICAgICAgICAgbUluRmlsZSwgc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdLAorICAgICAgICAvLyAgICAgICAgIChtSGVpZ2h0ICogbVN0cmlkZSAqIDMgLyAyKSk7CisKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCisgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKChzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikgPT0gSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfR0VUQlVGSU5GTyBmb3IgcHJvcGVyIG1heCBpbnB1dCBzaXplPworICAgICAgICAgICAgICAgIG1PdXRCdWZmZXJTaXplICo9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiRW5jb2RlIEZyYW1lIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKTsKKworICAgIC8vIEhvbGQgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICBtQnVmZmVyc1tzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworCisgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgLyogSWYgZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLworICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgbm90IHRyYWNrZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9CisgICAgICAgICgodWludDY0X3Qpc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwgc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2xvdzsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworCisgICAgaWYgKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIGlmIChJVl9JRFJfRlJBTUUgPT0gc19lbmNvZGVfb3AudTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgICAgICBBTE9HVigiSURSIGZyYW1lIHByb2R1Y2VkIik7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAoc19lbmNvZGVfb3AudTRfaXNfbGFzdCkgeworICAgICAgICAvLyBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIG1TYXdPdXRwdXRFT1MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICY9IH5PTVhfQlVGRkVSRkxBR19FT1M7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgKHZvaWQpZHJhaW5Nb2RlOworICAgICh2b2lkKXBvb2w7CisgICAgcmV0dXJuIEMyX09LOworfQorCisKK2NsYXNzIEMyU29mdEF2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBdmNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBdmNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhM2NhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdjIuaCIKKyNpbmNsdWRlICJpdmUyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgICAgICAgICAgNAorI2RlZmluZSBMRU5fU1RBVFVTX0JVRkZFUiAgICAgICAgKDEwICAqIDEwMjQpCisjZGVmaW5lIE1BWF9WQlZfQlVGRl9TSVpFICAgICAgICAoMTIwICogMTYzODQpCisjZGVmaW5lIE1BWF9OVU1fSU9fQlVGUyAgICAgICAgICAgMworCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAyCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCisjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDIwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWCAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9GUkFNRVJBVEUgICAgICAgMTIwMDAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTX1BSRV9FTkMgICAwCisjZGVmaW5lIERFRkFVTFRfRlBTICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0VOQ19TUEVFRCAgICAgICAgICAgSVZFX05PUk1BTAorCisjZGVmaW5lIERFRkFVTFRfTUVNX1JFQ19DTlQgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkVDT05fRU5BQkxFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfQ0hLU1VNX0VOQUJMRSAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1RBUlRfRlJNICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0ZSTVMgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVCAgICAgICBJVl9ZVVZfNDIwU1BfVlUKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQgICAgIElWX1lVVl80MjBQCisjZGVmaW5lIERFRkFVTFRfTE9PUEJBQ0sgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1JDX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX1RHVF9GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9NQVhfV0QgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfSFQgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTEVWRUwgICAgICAgICAgIDQxCisjZGVmaW5lIERFRkFVTFRfU1RSSURFICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfV0QgICAgICAgICAgICAgICAgICAxMjgwCisjZGVmaW5lIERFRkFVTFRfSFQgICAgICAgICAgICAgICAgICA3MjAKKyNkZWZpbmUgREVGQVVMVF9QU05SX0VOQUJMRSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NRV9TUEVFRCAgICAgICAgICAgIDEwMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRCAgICAgMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JDX01PREUgICAgICAgICAgICAgSVZFX1JDX1NUT1JBR0UKKyNkZWZpbmUgREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgIDYwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9JX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0lfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9QX1FQICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIERFRkFVTFRfUF9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9CX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0JfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9BSVIgICAgICAgICAgICAgICAgIElWRV9BSVJfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfQUlSX1JFRlJFU0hfUEVSSU9EICAzMAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1ggICAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19ZICAgICAgICAgIDQ4CisjZGVmaW5lIERFRkFVTFRfSV9JTlRFUlZBTCAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0lEUl9JTlRFUlZBTCAgICAgICAgMTAwMAorI2RlZmluZSBERUZBVUxUX0JfRlJBTUVTICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUwgMAorI2RlZmluZSBERUZBVUxUX0hQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX1FQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0k0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0VQUk9GSUxFICAgICAgICAgICAgSVZfUFJPRklMRV9CQVNFCisjZGVmaW5lIERFRkFVTFRfRU5UUk9QWV9NT0RFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfTU9ERSAgICAgICAgICBJVkVfU0xJQ0VfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfUEFSQU0gICAgICAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9BUkNIICAgICAgICAgICAgICAgIEFSQ0hfQVJNX0E5UQorI2RlZmluZSBERUZBVUxUX1NPQyAgICAgICAgICAgICAgICAgU09DX0dFTkVSSUMKKyNkZWZpbmUgREVGQVVMVF9JTlRSQTR4NCAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RSTEVOR1RIICAgICAgICAgICAgICAgICAgIDUwMAorI2RlZmluZSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBICAgMAorCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIEFMSUdOMTYoeCkgKCgoKHgpICsgMTUpID4+IDQpIDw8IDQpCisjZGVmaW5lIEFMSUdOMTI4KHgpICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKKyNkZWZpbmUgQUxJR040MDk2KHgpICgoKCh4KSArIDQwOTUpID4+IDEyKSA8PCAxMikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNkZWZpbmUgaXZlX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmVfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKK3N0cnVjdCBDMlNvZnRBdmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QXZjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuYygpOworCitwcml2YXRlOgorICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CisgICAgICAgIGludDMyX3QgbUZsYWdzOworICAgIH0gSW5wdXRCdWZmZXJJbmZvOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIGludDMyX3QgbVN0cmlkZTsKKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgSVZfUFJPRklMRV9UIG1BVkNFbmNQcm9maWxlIF9fdW51c2VkOworICAgIFdPUkQzMiAgIG1BVkNFbmNMZXZlbDsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisKKyAgICBib29sICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgbVNhd091dHB1dEVPUzsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCAgICAgbUludHJhNHg0OworICAgIGJvb2wgICAgIG1FbmFibGVGYXN0U2FkOworICAgIGJvb2wgICAgIG1FbmFibGVBbHRSZWY7CisgICAgYm9vbCAgICAgbVJlY29uRW5hYmxlOworICAgIGJvb2wgICAgIG1QU05SRW5hYmxlOworICAgIGJvb2wgICAgIG1FbnRyb3B5TW9kZTsKKyAgICBib29sICAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisgICAgSVZFX1NQRUVEX0NPTkZJRyAgICAgbUVuY1NwZWVkOworCisgICAgaXZfb2JqX3QgKm1Db2RlY0N0eDsgICAgICAgICAvLyBDb2RlYyBjb250ZXh0CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsgICAvLyBNZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOyAgICAgICAvLyBOdW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IGNvZGVjCisgICAgc2l6ZV90IG1OdW1Db3JlczsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgdXNlZCBieSB0aGUgY29kZWMKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBVV09SRDMyIG1CZnJhbWVzOworICAgIElWX0FSQ0hfVCBtQXJjaDsKKyAgICBJVkVfU0xJQ0VfTU9ERV9UIG1TbGljZU1vZGU7CisgICAgVVdPUkQzMiBtU2xpY2VQYXJhbTsKKyAgICBib29sIG1IYWxmUGVsRW5hYmxlOworICAgIFVXT1JEMzIgbUlJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1EaXNhYmxlRGVibGtMZXZlbDsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IG1CdWZmZXJzOworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICB2b2lkIGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UICBlX2ZyYW1lX3R5cGUpOworICAgIGMyX3N0YXR1c190IHNldFFwKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREaW1lbnNpb25zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRJcGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRCaXRSYXRlKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0QWlyUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TWVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRHb3BQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRQcm9maWxlUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RGVibG9ja1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFZidlBhcmFtcygpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QXZjRW5jKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX2lucHV0IgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJ5dXYiCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggICAgIi9zZGNhcmQvbWVkaWEvYXZjZV9vdXRwdXQiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAgICAgImgyNjQiCisKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCxcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE0NDRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTI5IEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlQzJDb21wb25lbnQuY3BwIiwKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICAgICAgImxpYmxvZyIsICAgIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLCAvLyBmb3IgSW1hZ2VDb3B5CisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIE11dGV4ZWQKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5IGFzIGl0cyBzdGFiaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLCAvLyBmb3IgSW1hZ2VDb3B5CisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIENvbG9yVXRpbHMgYW5kIE1JTUUKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGYxZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMyQ29tcG9uZW50IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwb3BfZnJvbnQoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHN0ZDo6bW92ZShtUXVldWUuZnJvbnQoKS53b3JrKTsKKyAgICBtUXVldWUucG9wX2Zyb250KCk7CisgICAgcmV0dXJuIHdvcms7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgc3RkOjptb3ZlKHdvcmspLCBOT19EUkFJTiB9KTsKK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjplbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmVtcHR5KCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6Y2xlYXIoKSB7CisgICAgbVF1ZXVlLmNsZWFyKCk7Cit9CisKK3VpbnQzMl90IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmRyYWluTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmZyb250KCkuZHJhaW5Nb2RlOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6Om1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgbnVsbHB0ciwgZHJhaW5Nb2RlIH0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OldvcmtIYW5kbGVyKCkgOiBtUnVubmluZyhmYWxzZSkge30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeikgeworICAgIG1UaGl6ID0gdGhpejsKK30KKworc3RhdGljIHZvaWQgUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgKmVyciA9IG51bGxwdHIpIHsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCAqZXJyKTsKKyAgICB9CisgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiB0aGl6ID0gbVRoaXoubG9jaygpOworICAgIGlmICghdGhpeikgeworICAgICAgICBBTE9HRCgiY29tcG9uZW50IG5vdCB5ZXQgc2V0OyBtc2cgPSAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgICAgIGlmIChtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UHJvY2VzczogeworICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXotPnByb2Nlc3NRdWV1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZXNzLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgcHJvY2VzcyBtZXNzYWdlIGFzIHdlJ3JlIG5vdCBydW5uaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0SW5pdDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vbkluaXQoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RvcDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vblN0b3AoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVzZXQ6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVzZXQoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2U6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVsZWFzZSgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIG1zZzogJWQiLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQ6OkJsb2NraW5nQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBCbG9ja2luZ0Jsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBiYXNlKTogbUJhc2V7YmFzZX0ge30KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldExvY2FsSWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldEFsbG9jYXRvcklkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoQ2lyY3VsYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1CYXNlOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IER1bW15UmVhZFZpZXcgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgRHVtbXlSZWFkVmlldygpIDogQzJSZWFkVmlldyhDMl9OT19JTklUKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1NpbXBsZUMyQ29tcG9uZW50OjpTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikKKyAgICA6IG1EdW1teVJlYWRWaWV3KER1bW15UmVhZFZpZXcoKSksCisgICAgICBtSW50ZihpbnRmKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbUhhbmRsZXIobmV3IFdvcmtIYW5kbGVyKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZShpbnRmLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfVklERU8pOworfQorCitTaW1wbGVDMkNvbXBvbmVudDo6flNpbXBsZUMyQ29tcG9uZW50KCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAodm9pZCltTG9vcGVyLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUhhbmRsZXItPnNldENvbXBvbmVudChzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1heUJsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUtPm1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIC8vIFRPRE86IHdhaXQgZm9yIGxpc3RlbmVyIGNoYW5nZSB0byBoYXZlIHRha2VuIHBsYWNlIGJlZm9yZSByZXR1cm5pbmcKKyAgICAvLyAoZS5nLiBpZiB0aGVyZSBpcyBhbiBvbmdvaW5nIGxpc3RlbmVyIGNhbGxiYWNrKQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKiBjb25zdCBpdGVtcykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBxdWV1ZVdhc0VtcHR5ID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWVXYXNFbXB0eSA9IHF1ZXVlLT5lbXB0eSgpOworICAgICAgICB3aGlsZSAoIWl0ZW1zLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+cHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtcy0+ZnJvbnQoKSkpOworICAgICAgICAgICAgaXRlbXMtPnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChxdWV1ZVdhc0VtcHR5KSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UHJvY2VzcywgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50Ojphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICAodm9pZClpdGVtczsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmZsdXNoX3NtKAorICAgICAgICBmbHVzaF9tb2RlX3QgZmx1c2hNb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKWZsdXNoTW9kZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5pbmNHZW5lcmF0aW9uKCk7CisgICAgICAgIC8vIFRPRE86IHF1ZXVlLT5zcGxpY2VkQnkoZmx1c2hlZFdvcmssIGZsdXNoZWRXb3JrLT5lbmQoKSk7CisgICAgICAgIHdoaWxlICghcXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICB3aGlsZSAoIXBlbmRpbmctPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBlbmRpbmctPmJlZ2luKCktPnNlY29uZCkpOworICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UocGVuZGluZy0+YmVnaW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpkcmFpbl9uYihkcmFpbl9tb2RlX3QgZHJhaW5Nb2RlKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHF1ZXVlLT5tYXJrRHJhaW4oZHJhaW5Nb2RlKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgIH0KKyAgICBib29sIG5lZWRzSW5pdCA9IChzdGF0ZS0+bVN0YXRlID09IFVOSU5JVElBTElaRUQpOworICAgIHN0YXRlLnVubG9jaygpOworICAgIGlmIChuZWVkc0luaXQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdEluaXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdGFydCwgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICBzdGF0ZS5sb2NrKCk7CisgICAgc3RhdGUtPm1TdGF0ZSA9IFJVTk5JTkc7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBBTE9HVigic3RvcCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBwZW5kaW5nLT5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdG9wLCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIGludDMyX3QgZXJyOworICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBBTE9HVigicmVzZXQiKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBzdGF0ZS0+bVN0YXRlID0gVU5JTklUSUFMSVpFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlc2V0LCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoInJlbGVhc2UiKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZWxlYXNlLCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBTaW1wbGVDMkNvbXBvbmVudDo6aW50ZigpIHsKKyAgICByZXR1cm4gbUludGY7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gdmVjKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiByZXQ7CisgICAgcmV0LnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIHJldHVybiByZXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpmaW5pc2goCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrID0gc3RkOjptb3ZlKHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcGVuZGluZy0+ZXJhc2UoZnJhbWVJbmRleCk7CisgICAgfQorICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyBwZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmNsb25lQW5kU2VuZCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICBpZiAoY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBmcmFtZUluZGV4KSB7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gY3VycmVudFdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpLT5pbnB1dC5vcmRpbmFsOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigiY2xvbmVkIGFuZCBzZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OnByb2Nlc3NRdWV1ZSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHVpbnQ2NF90IGdlbmVyYXRpb247CisgICAgaW50MzJfdCBkcmFpbk1vZGU7CisgICAgYm9vbCBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIGJvb2wgaGFzUXVldWVkV29yayA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGlvbiA9IHF1ZXVlLT5nZW5lcmF0aW9uKCk7CisgICAgICAgIGRyYWluTW9kZSA9IHF1ZXVlLT5kcmFpbk1vZGUoKTsKKyAgICAgICAgaXNGbHVzaFBlbmRpbmcgPSBxdWV1ZS0+cG9wUGVuZGluZ0ZsdXNoKCk7CisgICAgICAgIHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgIGhhc1F1ZXVlZFdvcmsgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgfQorICAgIGlmIChpc0ZsdXNoUGVuZGluZykgeworICAgICAgICBBTE9HVigicHJvY2Vzc2luZyBwZW5kaW5nIGZsdXNoIik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZsdXNoIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbU91dHB1dEJsb2NrUG9vbCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3QgdXNlIHF1ZXJ5X3ZiCisgICAgICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb3V0cHV0Rm9ybWF0KDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgeyAmb3V0cHV0Rm9ybWF0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInF1ZXJ5IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBpZiAocGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCAqb3V0cHV0UG9vbHMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9vbHMgJiYgb3V0cHV0UG9vbHMtPmZsZXhDb3VudCgpID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbElkID0gb3V0cHV0UG9vbHMtPm0udmFsdWVzWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgICAgICAgICBlcnIgPSBHZXRDb2RlYzJCbG9ja1Bvb2wocG9vbElkLCBzaGFyZWRfZnJvbV90aGlzKCksICZibG9ja1Bvb2wpOworICAgICAgICAgICAgQUxPR0QoIlVzaW5nIG91dHB1dCBibG9jayBwb29sIHdpdGggcG9vbElEICVsbHUgPT4gZ290ICVsbHUgLSAlZCIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJsb2NrUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QmxvY2tpbmdCbG9ja1Bvb2w+KGJsb2NrUG9vbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9KCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghd29yaykgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBkcmFpbihkcmFpbk1vZGUsIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB1cGRhdGVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW06IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdXBkYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmKCktPmNvbmZpZ192Yih1cGRhdGVzLCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiYXBwbGllZCAlenUgY29uZmlnVXBkYXRlcyA9PiAlcyAoJWQpIiwgdXBkYXRlcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic3RhcnQgcHJvY2Vzc2luZyBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgLy8gSWYgaW5wdXQgYnVmZmVyIGxpc3QgaXMgbm90IGVtcHR5LCBpdCBtZWFucyB3ZSBoYXZlIHNvbWUgaW5wdXQgdG8gcHJvY2VzcyBvbi4KKyAgICAvLyBIb3dldmVyLCBpbnB1dCBjb3VsZCBiZSBhIG51bGwgYnVmZmVyLiBJbiBzdWNoIGNhc2UsIGNsZWFyIHRoZSBidWZmZXIgbGlzdAorICAgIC8vIGJlZm9yZSBtYWtpbmcgY2FsbCB0byBwcm9jZXNzKCkuCisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkgJiYgIXdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pIHsKKyAgICAgICAgQUxPR0QoIkVuY291bnRlcmVkIG51bGwgaW5wdXQgYnVmZmVyLiBDbGVhcmluZyB0aGUgaW5wdXQgYnVmZmVyIik7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisgICAgcHJvY2Vzcyh3b3JrLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICBBTE9HVigicHJvY2Vzc2VkIGZyYW1lICMlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmdlbmVyYXRpb24oKSAhPSBnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBBTE9HRCgid29yayBmb3JtIG9sZCBnZW5lcmF0aW9uOiB3YXMgJSIgUFJJdTY0ICIgbm93ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPmdlbmVyYXRpb24oKSwgZ2VuZXJhdGlvbik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBxdWV1ZS51bmxvY2soKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHRoaXMgd29yayIpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlIHBlbmRpbmcgd29yayIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHVuZXhwZWN0ZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkID0gc3RkOjptb3ZlKHBlbmRpbmctPmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBlbmRpbmctPmluc2VydCh7IGZyYW1lSW5kZXgsIHN0ZDo6bW92ZSh3b3JrKSB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5leHBlY3RlZCkgeworICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgcGVuZGluZyB3b3JrIik7CisgICAgICAgICAgICB1bmV4cGVjdGVkLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWModW5leHBlY3RlZCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICByZXR1cm4gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKG9mZnNldCwgc2l6ZSwgOjpDMkZlbmNlKCkpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgICByZXR1cm4gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssIGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jay0+c2hhcmUoY3JvcCwgOjpDMkZlbmNlKCkpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMySW50ZXJmYWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyB1c2UgTWVkaWFEZWZzIGhlcmUgdnMuIE1lZGlhQ29kZWNDb25zdGFudHMgYXMgdGhpcyBpcyBub3QgTWVkaWFDb2RlYyBzcGVjaWZpYy9kZXBlbmRlbnQKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBTaW1wbGVJbnRlcmZhY2UgKi8KKworU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpCYXNlUGFyYW1zKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyU3RyaW5nIG5hbWUsCisgICAgICAgIEMyQ29tcG9uZW50OjpraW5kX3Qga2luZCwKKyAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlcykKKyAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgeworICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1OYW1lLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPihuYW1lLmNfc3RyKCkpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgaWYgKGFsaWFzZXMuc2l6ZSgpKSB7CisgICAgICAgIEMyU3RyaW5nIGpvaW5lZDsKKyAgICAgICAgZm9yIChjb25zdCBDMlN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICBpZiAoam9pbmVkLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgam9pbmVkICs9ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpvaW5lZCArPSBhbGlhczsKKyAgICAgICAgfQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFsaWFzZXMsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BTElBU0VTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nPihqb2luZWQuY19zdHIoKSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1LaW5kLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRLaW5kU2V0dGluZyhraW5kKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Eb21haW4sIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9ET01BSU4pCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyhkb21haW4pKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2ltcGxlIGludGVyZmFjZXMgaGF2ZSBzaW5nbGUgc3RyZWFtcworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjppbnB1dCgxKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dCgxKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNldCB1cCBidWZmZXIgZm9ybWF0cyBhbmQgYWxsb2NhdG9ycworCisgICAgLy8gZGVmYXVsdCB0byBsaW5lYXIgYnVmZmVycyBhbmQgbm8gbWVkaWEgdHlwZQorICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICBDMlN0cmluZyByYXdNZWRpYVR5cGU7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCBjb2RlZEJ1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBjb2RlZEFsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGNvZGVkUG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKworICAgIHN3aXRjaCAoZG9tYWluKSB7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOgorICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRlZmluZSByYXcgaW1hZ2U/IFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGltZXN0YW1wIGhhbmRsaW5nCisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpHUkFQSElDOworICAgICAgICAgICAgcmF3TWVkaWFUeXBlID0gTUVESUFfTUlNRVRZUEVfVklERU9fUkFXOworICAgICAgICAgICAgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOgorICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgICAgICAgICAgcmF3TWVkaWFUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXOworICAgICAgICAgICAgcmF3QWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYm9vbCBpc0VuY29kZXIgPSBraW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisKKyAgICAvLyBoYW5kbGUgcmF3IGRlY29kZXJzCisgICAgaWYgKG1lZGlhVHlwZSA9PSByYXdNZWRpYVR5cGUpIHsKKyAgICAgICAgY29kZWRCdWZmZXJUeXBlID0gcmF3QnVmZmVyVHlwZTsKKyAgICAgICAgY29kZWRBbGxvY2F0b3IgPSByYXdBbGxvY2F0b3I7CisgICAgICAgIGNvZGVkUG9vbElkID0gcmF3UG9vbElkOworICAgIH0KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIGlzRW5jb2RlciA/IHJhd0J1ZmZlclR5cGUgOiBjb2RlZEJ1ZmZlclR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgaXNFbmNvZGVyID8gcmF3TWVkaWFUeXBlIDogbWVkaWFUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIGlzRW5jb2RlciA/IGNvZGVkQnVmZmVyVHlwZSA6IHJhd0J1ZmZlclR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgaXNFbmNvZGVyID8gbWVkaWFUeXBlIDogcmF3TWVkaWFUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gcmF3QWxsb2NhdG9yIDogY29kZWRBbGxvY2F0b3IgfTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZEFsbG9jYXRvciA6IHJhd0FsbG9jYXRvciB9OworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZHNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkUG9vbElkIDogcmF3UG9vbElkIH07CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9JTlBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZChpbnB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUlucHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUlucHV0QWxsb2NhdG9ycywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfT1VUUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFBvb2xJZHMsIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dFBvb2xJZHMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBhZGQgc3RhdGVsZXNzIHBhcmFtcworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1BBUkFNX0lORElDRVMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvKiBUT0RPCisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ3VycmVudFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9DVVJSRU5UX1dPUkspCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQ3VycmVudFdvcmtUdW5pbmcoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJDdXJyZW50V29ya1R1bmluZz46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfSU5QVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dCgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX09VVFBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dCgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyT3V0T2ZNZW1vcnlUdW5pbmc+IG1PdXRPZk1lbW9yeTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjppbnB1dD4gbUlucHV0Q29uZmlnQ291bnRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb25maWdDb3VudGVyVHVuaW5nPiBtRGlyZWN0Q29uZmlnQ291bnRlcjsKKworICAgICovCit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub0lucHV0TGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vT3V0cHV0TGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUGlwZWxpbmVMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9Qcml2YXRlQnVmZmVycygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZUFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50LCBDMl9QQVJBTUtFWV9NQVhfUFJJVkFURV9CVUZGRVJfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlUG9vbElkcywgQzJfUEFSQU1LRVlfUFJJVkFURV9CTE9DS19QT09MUykKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub0lucHV0UmVmZXJlbmNlcygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vT3V0cHV0UmVmZXJlbmNlcygpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vVGltZVN0cmV0Y2goKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVRpbWVTdHJldGNoLCBDMl9QQVJBTUtFWV9USU1FX1NUUkVUQ0gpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmcoMS5mKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKworLyoKKyAgICBDbGllbnRzIG5lZWQgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgYmFzZSBwYXJhbXMgZHVlIHRvIGN1c3RvbSBkZXBlbmRlbmN5LgorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpRmVhdHVyZXNTZXR0aW5nPiBtQXBpRmVhdHVyZXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmc+IG1BdHRyaWI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dD4gbVN1Z2dlc3RlZE91dHB1dEJ1ZmZlckNvdW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisKKyovCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMjlhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisjZGVmaW5lIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKyAgICB2aXJ0dWFsIH5TaW1wbGVDMkNvbXBvbmVudCgpOworCisgICAgLy8gQzJDb21wb25lbnQKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgLy8gZm9yIGhhbmRsZXIKKyAgICBib29sIHByb2Nlc3NRdWV1ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZyBzZXQKKyAgICAgKiBpbiB0aGUgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBzdGFydCgpLCBidXQgb25seSBhdCB0aGUgZmlyc3QgaW52b2NhdGlvbiBvcgorICAgICAqIGFmdGVyIHJlc2V0KCkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkluaXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvblN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHdvcmsgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSAgIHdvcmsgICAgdGhlIHdvcmsgdG8gcHJvY2VzcworICAgICAqIFxwYXJhbVtpbl0gICAgICAgcG9vbCAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLyoqCisgICAgICogRHJhaW4gdGhlIGNvbXBvbmVudCBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBkcmFpbk1vZGUgICBtb2RlIG9mIGRyYWluLgorICAgICAqIFxwYXJhbVtpbl0gICBwb29sICAgICAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICBUaGUgY29tcG9uZW50IGhhcyBkcmFpbmVkIGFsbCBwZW5kaW5nIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLgorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgICAgICBVbnN1cHBvcnRlZCBtb2RlIChlLmcuIERSQUlOX0NIQUlOKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvLyBmb3IgZGVyaXZlZCBjbGFzc2VzCisgICAgLyoqCisgICAgICogRmluaXNoIHBlbmRpbmcgd29yay4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHBlbmRpbmcgd29yayBhY2NvcmRpbmcgdG8gfGZyYW1lSW5kZXh8IGFuZAorICAgICAqIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8IG11c3QgYmUKKyAgICAgKiAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSBwZW5kaW5nIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBmaW5pc2godWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhbmQgc2VuZCB0aGUgd29yayBiYWNrIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYW5kIGNsb25lIHRoZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhY2NvcmRpbmcKKyAgICAgKiB0byB8ZnJhbWVJbmRleHwgYW5kIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8CisgICAgICogbXVzdCBiZSAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGN1cnJlbnRXb3JrICAgdGhlIGN1cnJlbnQgd29yayB1bmRlciBwcm9jZXNzaW5nCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmY3JvcCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OworCisgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworCisgICAgY2xhc3MgV29ya0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBrV2hhdFByb2Nlc3MsCisgICAgICAgICAgICBrV2hhdEluaXQsCisgICAgICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICAgICAga1doYXRTdG9wLAorICAgICAgICAgICAga1doYXRSZXNldCwKKyAgICAgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAgfTsKKworICAgICAgICBXb3JrSGFuZGxlcigpOworICAgICAgICB+V29ya0hhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gbVRoaXo7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgICBTVE9QUEVELAorICAgICAgICBSVU5OSU5HLAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXhlY1N0YXRlIHsKKyAgICAgICAgRXhlY1N0YXRlKCkgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkge30KKworICAgICAgICBpbnQgbVN0YXRlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgfTsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT4gbUV4ZWNTdGF0ZTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8V29ya0hhbmRsZXI+IG1IYW5kbGVyOworCisgICAgY2xhc3MgV29ya1F1ZXVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGlubGluZSBXb3JrUXVldWUoKSA6IG1GbHVzaChmYWxzZSksIG1HZW5lcmF0aW9uKDB1bCkge30KKworICAgICAgICBpbmxpbmUgdWludDY0X3QgZ2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1HZW5lcmF0aW9uOyB9CisgICAgICAgIGlubGluZSB2b2lkIGluY0dlbmVyYXRpb24oKSB7ICsrbUdlbmVyYXRpb247IG1GbHVzaCA9IHRydWU7IH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBwb3BfZnJvbnQoKTsKKyAgICAgICAgdm9pZCBwdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayk7CisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbWFya0RyYWluKHVpbnQzMl90IGRyYWluTW9kZSk7CisgICAgICAgIGlubGluZSBib29sIHBvcFBlbmRpbmdGbHVzaCgpIHsKKyAgICAgICAgICAgIGJvb2wgZmx1c2ggPSBtRmx1c2g7CisgICAgICAgICAgICBtRmx1c2ggPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmbHVzaDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZTsKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1GbHVzaDsKKyAgICAgICAgdWludDY0X3QgbUdlbmVyYXRpb247CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVF1ZXVlOworICAgIH07CisgICAgTXV0ZXhlZDxXb3JrUXVldWU+IG1Xb3JrUXVldWU7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IFBlbmRpbmdXb3JrOworICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+IG1QZW5kaW5nV29yazsKKworICAgIGNsYXNzIEJsb2NraW5nQmxvY2tQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCbG9ja2luZ0Jsb2NrUG9vbD4gbU91dHB1dEJsb2NrUG9vbDsKKworICAgIFNpbXBsZUMyQ29tcG9uZW50KCkgPSBkZWxldGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1MWQzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV3JhcCBhIGNvbW1vbiBpbnRlcmZhY2Ugb2JqZWN0IChzdWNoIGFzIENvZGVjMkNsaWVudDo6SW50ZXJmYWNlLCBvciBDMkludGVyZmFjZUhlbHBlciBpbnRvCisgKiBhIEMyQ29tcG9uZW50SW50ZXJmYWNlLgorICoKKyAqIFxwYXJhbSBUIGNvbW1vbiBpbnRlcmZhY2UgdHlwZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBTaW1wbGVDMkludGVyZmFjZShjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUPiAmaW1wbCkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtSWQoaWQpLAorICAgICAgICAgIG1JbXBsKGltcGwpIHsKKyAgICB9CisKKyAgICB+U2ltcGxlQzJJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50SW50ZXJmYWNlCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1OYW1lOyB9CisgICAgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUlkOyB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgbWF5QmxvY2ssIGhlYXBQYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y29uZmlnKHBhcmFtcywgbWF5QmxvY2ssIGZhaWx1cmVzKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBjb25zdCBjMl9ub2RlX2lkX3QgbUlkOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUPiBtSW1wbDsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzc2VzIGZvciBjb21tb24gaW50ZXJmYWNlcy4KKyAqLwordGVtcGxhdGU8PgorY2xhc3MgU2ltcGxlQzJJbnRlcmZhY2U8dm9pZD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIEJhc2UgQ29kZWMgMi4wIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGFsbCBjb21wb25lbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCYXNlUGFyYW1zIDogQzJJbnRlcmZhY2VIZWxwZXIgeworICAgICAgICBleHBsaWNpdCBCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlciwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpraW5kX3Qga2luZCwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICAgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlcyA9IHN0ZDo6dmVjdG9yPEMyU3RyaW5nPigpKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gaW5wdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCBhbmQgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIG91dHB1dCBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCBhbmQgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dC4KKyAgICAgICAgdm9pZCBub091dHB1dExhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gcGlwZWxpbmUgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZyBhbmQgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLgorICAgICAgICB2b2lkIG5vUGlwZWxpbmVMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIG5lZWQgZm9yIHByaXZhdGUgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nLCBDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nIGFuZAorICAgICAgICAvLy8gQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZy4KKyAgICAgICAgdm9pZCBub1ByaXZhdGVCdWZmZXJzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBpbnB1dCBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0IGFuZAorICAgICAgICAvLy8gQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQuCisgICAgICAgIHZvaWQgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBob2xkcyBubyByZWZlcmVuY2VzIHRvIG91dHB1dCBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dC4KKyAgICAgICAgdm9pZCBub091dHB1dFJlZmVyZW5jZXMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCBzdHJldGNoIHRpbWUuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nLgorICAgICAgICB2b2lkIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpRmVhdHVyZXNTZXR0aW5nPiBtQXBpRmVhdHVyZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1MZXZlbFNldHRpbmc+IG1QbGF0Zm9ybUxldmVsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZz4gbVBsYXRmb3JtRmVhdHVyZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+IG1OYW1lOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4gbUFsaWFzZXM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEtpbmRTZXR0aW5nPiBtS2luZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50RG9tYWluU2V0dGluZz4gbURvbWFpbjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmc+IG1BdHRyaWI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nPiBtVGltZVN0cmV0Y2g7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQ+IG1SZXF1ZXN0ZWRJbnB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RlZE91dHB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nPiBtUmVxdWVzdGVkUGlwZWxpbmVEZWxheTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0PiBtQWN0dWFsSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1BY3R1YWxPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZz4gbUFjdHVhbFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dD4gbU1heElucHV0UmVmZXJlbmNlQWdlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dD4gbU1heE91dHB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dD4gbU1heE91dHB1dFJlZmVyZW5jZUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc+IG1NYXhQcml2YXRlQnVmZmVyQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjppbnB1dD4gbUlucHV0U3RyZWFtQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0PiBtT3V0cHV0U3RyZWFtQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gbVN1YnNjcmliZWRQYXJhbUluZGljZXM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dD4gbVN1Z2dlc3RlZE91dHB1dEJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkN1cnJlbnRXb3JrVHVuaW5nPiBtQ3VycmVudFdvcmtPcmRpbmFsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+IG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD4gbUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+IG1JbnB1dEFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZz4gbVByaXZhdGVBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0UG9vbElkczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc+IG1Qcml2YXRlUG9vbElkczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyT3V0T2ZNZW1vcnlUdW5pbmc+IG1PdXRPZk1lbW9yeTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb25maWdDb3VudGVyVHVuaW5nPiBtRGlyZWN0Q29uZmlnQ291bnRlcjsKKyAgICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3VzaW5nIFNpbXBsZUludGVyZmFjZSA9IFNpbXBsZUMySW50ZXJmYWNlPFQ+OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3QgY2hhciAqc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpICsgMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcmV0ID0gVDo6QWxsb2NTaGFyZWQobGVuLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CitzdGQ6OnNoYXJlZF9wdHI8VD4gQWxsb2NTaGFyZWRTdHJpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKHN0ci5sZW5ndGgoKSArIDEsIGFyZ3MuLi4pOworICAgIHN0cmNweShyZXQtPm0udmFsdWUsIHN0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTZXR0ZXIgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIHR5cGU7CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWUudi5mbGV4Q291bnQoKTsgKytpeCkgeworICAgICAgICAgICAgcmVzLnBsdXMobWUuRihtZS52Lm0udmFsdWVzW2l4XSkudmFsaWRhdGVQb3NzaWJsZShtZS52Lm0udmFsdWVzW2l4XSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmb2xkLAorICAgICAgICAgICAgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnZhbHVlKS5zdXBwb3J0c05vdyhtZS52LnZhbHVlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSBvbGQudi52YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNjg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM2IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjb2RlYzJwbGF5IiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiY29kZWMyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoeyBibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSkgfSkge30KK307CisKK2NsYXNzIExpc3RlbmVyOworCitjbGFzcyBTaW1wbGVQbGF5ZXIgeworcHVibGljOgorICAgIFNpbXBsZVBsYXllcigpOworICAgIH5TaW1wbGVQbGF5ZXIoKTsKKworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uVHJpcHBlZChzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpOworICAgIHZvaWQgb25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSk7CisKKyAgICB2b2lkIHBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgICBzcDxJUHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzdGQ6OmF0b21pY19pbnQgbUxpbmVhclBvb2xJZDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jSW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6bXV0ZXggbVByb2Nlc3NlZExvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVByb2Nlc3NlZENvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Qcm9jZXNzZWRXb3JrOworCisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1Db250cm9sOworfTsKKworY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaXN0ZW5lcihTaW1wbGVQbGF5ZXIgKnRoaXopIDogbVRoaXModGhpeikge30KKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25Xb3JrRG9uZShjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vblRyaXBwZWQoY29tcG9uZW50LCBzZXR0aW5nUmVzdWx0KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbkVycm9yKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU2ltcGxlUGxheWVyICogY29uc3QgbVRoaXM7Cit9OworCisKK1NpbXBsZVBsYXllcjo6U2ltcGxlUGxheWVyKCkKKyAgICA6IG1MaXN0ZW5lcihuZXcgTGlzdGVuZXIodGhpcykpLAorICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IER1bW15UHJvZHVjZXJMaXN0ZW5lciksCisgICAgICBtTGluZWFyUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICBtQ29tcG9zZXJDbGllbnQobmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCkgeworICAgIENIRUNLX0VRKG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmbUFsbG9jSW9uKSwgQzJfT0spOworICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspOworCisgICAgbUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCisgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKKyAgICAgICAgICAgIDEyODAsCisgICAgICAgICAgICA4MDAsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpOworICAgICAgICAgICAgLy9QSVhFTF9GT1JNQVRfUkdCXzU2NSk7CisKKyAgICBDSEVDSyhtQ29udHJvbCAhPSBudWxscHRyKTsKKyAgICBDSEVDSyhtQ29udHJvbC0+aXNWYWxpZCgpKTsKKworICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgLnNldExheWVyKG1Db250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgLnNob3cobUNvbnRyb2wpCisgICAgICAgICAgICAuYXBwbHkoKTsKKworICAgIG1TdXJmYWNlID0gbUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICBDSEVDSyhtU3VyZmFjZSAhPSBudWxscHRyKTsKKyAgICBtU3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUsIG1Qcm9kdWNlckxpc3RlbmVyKTsKK30KKworU2ltcGxlUGxheWVyOjp+U2ltcGxlUGxheWVyKCkgeworICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUiKTsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgIGZvciAoYXV0byAmIGl0ZW0gOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgbVByb2Nlc3NlZFdvcmsucHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtKSk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ubm90aWZ5X2FsbCgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25UcmlwcGVkKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgc2V0dGluZ1Jlc3VsdDsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgZXJyb3JDb2RlOworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6OnBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6cGxheSIpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgKHZvaWQpIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2UtPmdldEZvcm1hdCgpLCAmZm9ybWF0KTsKKworICAgIHNwPEFCdWZmZXI+IGNzZDAsIGNzZDE7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZjc2QwKTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpOworCisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvdXJjZSByZXR1cm5lZCBlcnJvciAlZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICh2b2lkKXN0b3JlLT5jcmVhdGVDb21wb25lbnQoImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCAmY29tcG9uZW50KTsKKworICAgICh2b2lkKWNvbXBvbmVudC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29scyA9CisgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyAodWludDY0X3QpQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgfSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdDsKKyAgICAodm9pZCljb21wb25lbnQtPmludGYoKS0+Y29uZmlnX3ZiKHtwb29scy5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZyZXN1bHQpOworICAgIGNvbXBvbmVudC0+c3RhcnQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgIH0KKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgcnVubmluZyh0cnVlKTsKKyAgICBzdGQ6OnRocmVhZCBzdXJmYWNlVGhyZWFkKFt0aGlzLCAmcnVubmluZ10oKSB7CisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZpZ2JwID0gbVN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NlZENvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVByb2Nlc3NlZFdvcmsuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVByb2Nlc3NlZFdvcmsucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKKyAgICAgICAgICAgIEFMT0dWKCJSZW5kZXI6IEZyYW1lICMlbGxkIiwgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrID0gb3V0cHV0LT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0gVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG5ldyBHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCkpKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCAqIDEwMDBsbCkucGVla2xsKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QoYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHFibzsKKyAgICAgICAgICAgICAgICBlcnIgPSBpZ2JwLT5xdWV1ZUJ1ZmZlcihzbG90LCBxYmksICZxYm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworCisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInJlbmRlciBsb29wIGZpbmlzaGVkIik7CisgICAgfSk7CisKKyAgICBsb25nIG51bUZyYW1lcyA9IDA7CisgICAgbUxpbmVhclBvb2wucmVzZXQobmV3IEMyUG9vbGVkQmxvY2tQb29sKG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgICAgIHZvaWQgKmRhdGEgPSBudWxscHRyOworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IDB1OworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgaWYgKGNzZDAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMDsKKyAgICAgICAgICAgIGNzZDAgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNzZDEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMTsKKyAgICAgICAgICAgIGNzZDEgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5yZWFkKCZidWZmZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcCkpOworCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3NkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBjc2QtPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgd2hpbGUgKCF3b3JrKSB7CisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBudW1GcmFtZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBtTGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZibG9jayk7CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWxkIHNpemUgPSAlenUiLCBudW1GcmFtZXMsIHNpemUpOworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgY29tcG9uZW50LT5xdWV1ZV9uYigmaXRlbXMpOworCisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgICsrbnVtRnJhbWVzOworICAgIH0KKyAgICBBTE9HVigibWFpbiBsb29wIGZpbmlzaGVkIik7CisgICAgc291cmNlLT5zdG9wKCk7CisgICAgcnVubmluZy5zdG9yZShmYWxzZSk7CisgICAgc3VyZmFjZVRocmVhZC5qb2luKCk7CisKKyAgICBjb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICptZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXRfZmlsZW5hbWVdXG4iLCBtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWgoZWxwKVxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIGludCByZXM7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImgiKSkgPj0gMCkgeworICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgU2ltcGxlUGxheWVyIHBsYXllcjsKKworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYyAmJiBlcnIgPT0gT0s7ICsraykgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CisKKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShudWxscHRyIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKGZpbGVuYW1lLCAic2luZToiLCA1KSAmJiBkYXRhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKKyAgICAgICAgc3A8SU1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UpOworCisgICAgICAgIGlmIChleHRyYWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGV4dHJhY3Rvci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV4dHJhY3RvciBkaWQgbm90IHByb3ZpZGUgTUlNRSB0eXBlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGksIDApOworCisgICAgICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFsbG93aW5nIEFWQyBvbmx5IGZvciB0aGUgdGltZSBiZWluZworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vYXZjIiwgOSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIEFWQyB0cmFjayBmb3VuZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFTb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICBpZiAobWVkaWFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwIE5VTEwgdHJhY2sgJXp1LCB0b3RhbCB0cmFja3MgJXp1LlxuIiwgaSwgbnVtVHJhY2tzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBsYXllci5wbGF5KG1lZGlhU291cmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWViNTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYkZMQUMtaGVhZGVycyJdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIxNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcApAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0RlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzI3NjgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIC8vIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdEZsYWNEZWM6OkMyU29mdEZsYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZMQUNEZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0RlYzo6fkMyU29mdEZsYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZXNldCgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIG1GTEFDRGVjb2RlciA9IG51bGxwdHI7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSB7CisgICAgICAgIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgfQorICAgIG1GTEFDRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKKyAgICBpZiAoIW1GTEFDRGVjb2RlcikgeworICAgICAgICBBTE9HRSgiaW5pdERlY29kZXI6IGZhaWxlZCB0byBjcmVhdGUgRkxBQ0RlY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCisvLyAoVE9ETykgYWRkIG11bHRpZnJhbWUgc3VwcG9ydCwgaW4gcGx1Z2luIGFuZCBGTEFDRGVjb2Rlci5jcHAKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIWNvZGVjQ29uZmlnKSB7CisgICAgICAgIEFMT0dWKCJGaXJzdCBmcmFtZSBoYXMgdG8gaW5jbHVkZSBjb25maWd1cmF0aW9uLCBmb3JjaW5nIGNvbmZpZyIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKGlucHV0LCBpblNpemUpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSyAmJiBkZWNvZGVyRXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgcGFyc2VNZXRhRGF0YSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJwcm9jZXNzOiBwYXJzZU1ldGFkYXRhIGlzIEJsb2NraW5nLCBDb250aW51ZSAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0cmVhbUluZm8gPSBtRkxBQ0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSAmJiBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICYmCisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBtSGFzU3RyZWFtSW5mbyA9IHRydWU7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oCisgICAgICAgICAgICAgICAgICAgIDB1LCBtU3RyZWFtSW5mby5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgicHJvY2VzczogZGVjb2RlciBjb25maWd1cmF0aW9uIDogJWQgSHosICVkIGNoYW5uZWxzLCAlZCBzYW1wbGVzLCIKKyAgICAgICAgICAgICAgICAgICIgJWQgYmxvY2sgc2l6ZSIsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlLCBtU3RyZWFtSW5mby5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgIChpbnQpbVN0cmVhbUluZm8udG90YWxfc2FtcGxlcywgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgb3V0cHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihzaG9ydCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBtSGFzU3RyZWFtSW5mbyA/CisgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzYW1wbGVTaXplCisgICAgICAgICAgOiBrTWF4QmxvY2tTaXplICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNhbXBsZVNpemU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBpblNpemUsIHdWaWV3LmRhdGEoKSwgJm91dFNpemUsIG91dHB1dEZsb2F0KTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDkxYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEZsYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhCbG9ja1NpemUgICA9IDQwOTYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUhhc1N0cmVhbUluZm87CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDQ2MDgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6aW5wdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciI7CisKK0MyU29mdEZsYWNFbmM6OkMyU29mdEZsYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMzIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRW5jOjp+QzJTb2Z0RmxhY0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25Jbml0KCkgeworICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX25ldygpOworICAgIGlmICghbUZsYWNTdHJlYW1FbmNvZGVyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICBrSW5CbG9ja1NpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoRkxBQ19faW50MzIpKTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTMyKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2RlbGV0ZShtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTMyKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlc2V0KCkgeworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgbnVsbHB0cik7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpZiAoZXJyICE9IE9LKSBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUpIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCB1bnNpZ25lZCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2FtcGxlU2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGZyYW1lU2l6ZTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBmcmFtZVNpemUsIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyBmcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzYW1wbGVTaXplOworCisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNl90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgaW50IGJpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsIG1Db21wcmVzc2lvbkxldmVsKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF92ZXJpZnkobUZsYWNTdHJlYW1FbmNvZGVyLCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb2sgJj0gRkxBQ19fU1RSRUFNX0VOQ09ERVJfSU5JVF9TVEFUVVNfT0sgPT0KKyAgICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2luaXRfc3RyZWFtKG1GbGFjU3RyZWFtRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrICAgIC8qd3JpdGVfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnNlZWtfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnRlbGxfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKm1ldGFkYXRhX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoaXMgLypjbGllbnRfZGF0YSovKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1CbG9ja1NpemUgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfYmxvY2tzaXplKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisKKyAgICBBTE9HVigiZW5jb2RlciBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCIpOworICAgIHJldHVybiBPSzsKK30KKworRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIEMyU29mdEZsYWNFbmM6OmZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiwKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKSB7CisgICAgcmV0dXJuICgoQzJTb2Z0RmxhY0VuYyopIGNsaWVudF9kYXRhKS0+b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGJ1ZmZlciwgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgc3dpdGNoIChkcmFpbk1vZGUpIHsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIERSQUlOX0NIQUlOOgorICAgICAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzoKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgZmxhZyBpcyBub3QgYmVpbmcgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIFBlbmRpbmdXb3JrIHF1ZXVlIGFzIGFsbCB0aGUKKyAgICAgICAgICAgIC8vIGlucHV0cyBhcmUgYmVpbmcgc2VudCBiYWNrIHdpdGggZW1wdHl3b3JrIG9yIHZhbGlkIGVuY29kZWQgZGF0YQorICAgICAgICAgICAgLy8gbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOworICAgIGlmICghb2spIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjMwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZW5jb2Rlci5oIgorCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUlOICAgICAwCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVCA1CisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYICAgICA4CisKKyNkZWZpbmUgRkxBQ19IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0RmxhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRGbGFjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgY29uZmlndXJlRW5jb2RlcigpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlciwgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgb25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga0luQmxvY2tTaXplID0gMTE1MjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bUNoYW5uZWxzID0gMjsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyKiBtRmxhY1N0cmVhbUVuY29kZXI7CisgICAgRkxBQ19faW50MzIqIG1JbnB1dEJ1ZmZlclBjbTMyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQzMl90IG1Db21wcmVzc2lvbkxldmVsOworICAgIHVpbnQzMl90IG1CbG9ja1NpemU7CisgICAgYm9vbCBtSXNGaXJzdEZyYW1lOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAorICAgIGJvb2wgbUVuY29kZXJXcml0ZURhdGE7CisgICAgc2l6ZV90IG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzOworICAgIHVuc2lnbmVkIG1IZWFkZXJPZmZzZXQ7CisgICAgYm9vbCBtV3JvdGVIZWFkZXI7CisgICAgY2hhciBtSGVhZGVyW0ZMQUNfSEVBREVSX1NJWkVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RmxhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0Y2E3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEc3MTFEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgQUxBVworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyNpZmRlZiBBTEFXCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbyg2NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEc3MTFEZWM6OkMyU29mdEc3MTFEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpIHsKK30KKworQzJTb2Z0RzcxMURlYzo6fkMyU29mdEc3MTFEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uSW5pdCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVsZWFzZSgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaW50IG91dFNpemUgPSBpblNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dHB0ciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQxNl90ICpvdXRwdXRwdHIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKworI2lmZGVmIEFMQVcKKyAgICBEZWNvZGVBTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZWxzZQorICAgIERlY29kZU1MYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbmRpZgorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisjaWZkZWYgQUxBVwordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKKyAgICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7CisKKyAgICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgICAgICBtYW50ICs9IDE2OworICAgICAgICB9CisKKyAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgICBpZiAoaWV4cCA+IDEpIHsKKyAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7CisgICAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworCisgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KK30KKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RzcxMURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U4ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRHNzExRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEc3MTFEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisjaWZkZWYgQUxBVworICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbHNlCisgICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2VuZGlmCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0R3NtRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0R3NtRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHc21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRHc21EZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgMTMyMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDEzMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTAyNCAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX0lOX0ZSTV9TWikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0R3NtRGVjOjpDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Hc20obnVsbHB0cikgeworfQorCitDMlNvZnRHc21EZWM6On5DMlNvZnRHc21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25Jbml0KCkgeworICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyBzaXplX3QgZGVjb2RlR1NNKGdzbSBoYW5kbGUsIGludDE2X3QgKm91dCwgc2l6ZV90IG91dENhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IDA7CisKKyAgICBpZiAoaW5TaXplICUgTVNHU01fSU5fRlJNX1NaID09IDAKKyAgICAgICAgICAgICYmIChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKCpvdXQpCisgICAgICAgICAgICAgICAgICAgIDw9IG91dENhcGFjaXR5KSkgeworICAgICAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworCisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dFNpemUgKiBzaXplb2YoaW50MTZfdCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiApICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCAqb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHNpemVfdCBvdXRTaXplID0gZGVjb2RlR1NNKG1Hc20sIG91dHB1dCwgb3V0Q2FwYWNpdHksIGlucHV0LCBpblNpemUpOworICAgIGlmICghb3V0U2l6ZSkgeworICAgICAgICBBTE9HRSgiZW5jb3VudGVyZWQgaW1wcm9wZXIgaW5zaXplIG9yIG91dHNpemUiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRHU01EZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0R1NNRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEdzbURlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0R1NNRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0R1NNRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMDlmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSAiZ3NtLmgiCit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1ogICAgICAgICAgICAgMzMKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEgICAgIDMyCisjZGVmaW5lIEZSR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAxNjAKKyNkZWZpbmUgTVNHU01fSU5fRlJNX1NaICAgICAgICAgICAgIChGUkdTTV9JTl9GUk1fU1ogKyBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSkKKyNkZWZpbmUgTVNHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIChGUkdTTV9PVVRfRlJNX1NaICogMikKKworc3RydWN0IEMyU29mdEdzbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0R3NtRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBnc20gbUdzbTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHc21EZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRIZXZjRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAorCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNlbmMiXSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZGRhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTAsMCArMSw5ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRIZXZjRGVjLmgiCisjaW5jbHVkZSAiaWhldmNkX2N4YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCg4dSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEhldmNEZWM6OkMyU29mdEhldmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSkgeworfQorCitDMlNvZnRIZXZjRGVjOjp+QzJTb2Z0SGV2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50ID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEhldmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSEVWQ0RfQ1hBX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEhldmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgIH0KKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEhldmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEhldmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworCitzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciBjb2xvckFzcGVjdHMgZnVuY3Rpb25zLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBib29sIGNvbG9yQXNwZWN0c0RpZmZlcihjb25zdCBDb2xvckFzcGVjdHMgJmEsIGNvbnN0IENvbG9yQXNwZWN0cyAmYik7CisgICAgdm9pZCB1cGRhdGVGaW5hbENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgIGNvbnN0IENvbG9yQXNwZWN0cyAmb3RoZXJBc3BlY3RzLCBjb25zdCBDb2xvckFzcGVjdHMgJnByZWZlcnJlZEFzcGVjdHMpOworICAgIHN0YXR1c190IGhhbmRsZUNvbG9yQXNwZWN0c0NoYW5nZSgpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBhN2EwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXR0X3ZpZGVvX2FwaS5oIgorI2luY2x1ZGUgImloZXZjZV9hcGkuaCIKKyNpbmNsdWRlICJpaGV2Y2VfcGx1Z2luLmgiCisjaW5jbHVkZSAiQzJTb2Z0SGV2Y0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEhldmNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDMyMCwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDEyOCwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSEVWQ19NQUlOLCBMRVZFTF9IRVZDX01BSU5fMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vbmVPZih7QzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtMRVZFTF9IRVZDX01BSU5fMSwgTEVWRUxfSEVWQ19NQUlOXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8yXzEsIExFVkVMX0hFVkNfTUFJTl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fM18xLCBMRVZFTF9IRVZDX01BSU5fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzRfMSwgTEVWRUxfSEVWQ19NQUlOXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl81XzEsIExFVkVMX0hFVkNfTUFJTl81XzJ9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUsIG1GcmFtZVJhdGUsIG1CaXRyYXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJnNpemUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+ICZmcmFtZVJhdGUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IRVZDX01BSU47CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3RleHByIExldmVsTGltaXRzIGtMaW1pdHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzEsICAgICAgIDU1Mjk2MCwgICAgMzY4NjQsICAgIDEyODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAzNjg2NDAwLCAgIDEyMjg4MCwgICAxNTAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yXzEsICAgIDczNzI4MDAsICAgMjQ1NzYwLCAgIDMwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAxNjU4ODgwMCwgICA1NTI5NjAsICAgNjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgIDMzMTc3NjAwLCAgIDk4MzA0MCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80LCAgICAgNjY4NDY3MjAsICAyMjI4MjI0LCAgMTIwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzRfMSwgIDEzMzY5MzQ0MCwgIDIyMjgyMjQsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAgMjY3Mzg2ODgwLCAgODkxMjg5NiwgIDI1MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzEsICA1MzQ3NzM3NjAsICA4OTEyODk2LCAgNDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMiwgMTA2OTU0NzUyMCwgIDg5MTI4OTYsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxMDY5NTQ3NTIwLCAzNTY1MTU4NCwgIDYwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzEsIDIxMzkwOTUwNDAsIDM1NjUxNTg0LCAxMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMiwgNDI3ODE5MDA4MCwgMzU2NTE1ODQsIDI0MDAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IHNhbXBsZXMgPSBzaXplLnYud2lkdGggKiBzaXplLnYuaGVpZ2h0OworICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjID0gc2FtcGxlcyAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuCisgICAgICAgIGJvb2wgbmVlZHNVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyA8PSBsaW1pdC5zYW1wbGVzICYmIHNhbXBsZXNQZXJTZWMgPD0gbGltaXQuc2FtcGxlc1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IRVZDX01BSU5fNV8yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMOiByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgaGV2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgNjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzJfMSwgIDYzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICA5MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgOTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzQsICAgMTIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsIDEyMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAxNTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMSwgMTUzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDE1NiB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxODAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMSwgMTgzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDE4NiB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuaGV2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gMTU2OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fAorICAgICAgICAgICAgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVSYXRlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0cmF0ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RTeW5jOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiOworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitDMlNvZnRIZXZjRW5jOjpDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtSGV2Y0VuY1Byb2ZpbGUoMSksCisgICAgICBtSGV2Y0VuY0xldmVsKDMwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZChmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0SGV2Y0VuYzo6fkMyU29mdEhldmNFbmMoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6b25Jbml0KCkgeworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIHJldHVybiByZWxlYXNlRW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVzZXQoKSB7CisgICAgb25TdG9wKCk7CisgICAgaW5pdEVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoIlNpZ25hbGxpbmcgRU9TIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU51bUNvcmVzID0gTUlOKEdldENQVUNvcmVDb3VudCgpLCBDT0RFQ19NQVhfQ09SRVMpOworICAgIG1lbXNldCgmbUVuY1BhcmFtcywgMCwgc2l6ZW9mKGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KSk7CisKKyAgICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9zZXRfZGVmX3BhcmFtcygmbUVuY1BhcmFtcyk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGRlZmF1bHQgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgY29uZmlndXJhdGlvbgorICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF93aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub20gPSAxMDAwOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9udW0gPSBtRnJhbWVSYXRlLT52YWx1ZSAqIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X2NvZGVjX2xldmVsID0gbUhldmNFbmNMZXZlbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2lfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfY3JhX29wZW5fZ29wX3BlcmlvZCA9IG1JRFJJbnRlcnZhbDsKKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisgICAgbUVuY1BhcmFtcy5zX211bHRpX3RocmRfcHJtcy5pNF9tYXhfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIG1FbmNQYXJhbXMuc19vdXRfc3RybV9wcm1zLmk0X2NvZGVjX3Byb2ZpbGUgPSBtSGV2Y0VuY1Byb2ZpbGU7CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMjsKKyAgICBtRW5jUGFyYW1zLnNfbGFwX3BybXMuaTRfcmNfbG9va19haGVhZF9waWNzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX2Nsb3NlKG1Db2RlY0N0eCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgKHZvaWQpZHJhaW5Nb2RlOworICAgICh2b2lkKXBvb2w7CisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgQ0hFQ0soIW1Db2RlY0N0eCk7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1IZXZjRW5jUHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlX2woKTsKKyAgICAgICAgbUhldmNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKKworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgcGFyYW1zIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworICAgIGVyciA9IGloZXZjZV9pbml0KCZtRW5jUGFyYW1zLCAmbUNvZGVjQ3R4KTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZW5jb2RlciBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QqIHBhcmFtcyA9ICZtRW5jUGFyYW1zOworICAgIG1lbXNldChwc19lbmNvZGVfaXAsIDAsIHNpemVvZihpaGV2Y2VfaW5wX2J1Zl90KSk7CisKKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQmIGxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90KiB5UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIHVQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogdlBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbgorICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPQorICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgdVN0cmlkZSA9PSB2U3RyaWRlICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0KKyAgICAgICAgICAgICAgICBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6IHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlCisgICAgICAgICAgICAvLyBwb2ludGVyLgorICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsyXSA9IHZTdHJpZGU7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzBdID0geVN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzFdID0gdVN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMl0gPSB2U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRTogeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1syXSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzJdID0gMDsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMF0gPSB5U3RyaWRlICogaGVpZ2h0OworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMV0gPSB1U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsyXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF90Z3RfYml0cmF0ZVswXTsKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfcGVha19iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9wZWFrX2JpdHJhdGVbMF07CisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX3JhdGVfZmFjdG9yID0gcGFyYW1zLT5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfZmFjdG9yOworICAgIHBzX2VuY29kZV9pcC0+dThfcHRzID0gdGltZXN0YW1wOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIEFMT0dEKCJTaWduYWxsZWQgRXJyb3IgLyBTaWduYWxsZWQgRW9zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHN0YXR1cyA9IGluaXRFbmNvZGVyKCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICB2aWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IElIRVZDRV9FT0s7CisKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgIGloZXZjZV9vdXRfYnVmX3Qgc19oZWFkZXJfb3B7fTsKKyAgICAgICAgZXJyID0gaWhldmNlX2VuY29kZV9oZWFkZXIobUNvZGVjQ3R4LCAmc19oZWFkZXJfb3ApOworICAgICAgICBpZiAoZXJyID09IElIRVZDRV9FT0sgJiYgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkLCAwdSk7CisgICAgICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBzX2hlYWRlcl9vcC5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNzZCkpOworICAgICAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWhldmNlX2lucF9idWZfdCBzX2VuY29kZV9pcHt9OworICAgIGloZXZjZV9vdXRfYnVmX3Qgc19lbmNvZGVfb3B7fTsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisKKyAgICBzdGF0dXMgPSBzZXRFbmNvZGVBcmdzKCZzX2VuY29kZV9pcCwgdmlldy5nZXQoKSwgdGltZXN0YW1wKTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOworICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwID0gKGlucHV0QnVmZmVyKSA/ICZzX2VuY29kZV9pcCA6IG51bGxwdHI7CisKKyAgICBlcnIgPSBpaGV2Y2VfZW5jb2RlKG1Db2RlY0N0eCwgcHNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICBBTE9HRSgiRW5jb2RlIEZyYW1lIGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCAoaW50KXRpbWVUYWtlbiwKKyAgICAgICAgICAoaW50KXRpbWVEZWxheSwgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgIGlmIChzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgICAgICBzdGF0dXMgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCwgdXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKEMyX09LICE9IHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHdWaWV3LmRhdGEoKSwgc19lbmNvZGVfb3AucHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIHNfZW5jb2RlX29wLnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBzX2VuY29kZV9vcC51OF9wdHM7CisgICAgICAgIGlmIChzX2VuY29kZV9vcC5pNF9pc19rZXlfZnJhbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRIZXZjRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJmZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgNAorCitzdHJ1Y3QgQzJTb2Z0SGV2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyU29mdEhldmNFbmMoKTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190IG1FbmNQYXJhbXM7CisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgIFVXT1JEMzIgbUhldmNFbmNQcm9maWxlOworICAgIFVXT1JEMzIgbUhldmNFbmNMZXZlbDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB2b2lkKiBtQ29kZWNDdHg7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApOworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC9oZXZjIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJoMjY1IgorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkR1bXAgdG8gZmlsZSEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX0hFVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wM0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI2ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wM0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wM0RlYy5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXAzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNUDM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHs4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAzMjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRNUDM6OkMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29uZmlnKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0cikgeworfQorCitDMlNvZnRNUDM6On5DMlNvZnRNUDMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uU3RvcCgpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlbGVhc2UoKSB7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnOworICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE1QMzo6aW5pdERlY29kZXIoKSB7CisgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICBpZiAoIW1Db25maWcpIHJldHVybiBOT19NRU1PUlk7CisgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7CisgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworCisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIGlmICghbURlY29kZXJCdWYpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIFRoZSBiZWxvdyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gLi90ZXN0L21wM3JlYWRlci5jcHAgKi8KK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICBpZiAob3V0X2JpdHJhdGUpICpvdXRfYml0cmF0ZSA9IDA7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgICAgaWYgKGxheWVyID09IDB4MDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7IC8vIGxheWVyIEkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGxheWVyIElJIG9yIElJSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBWMiAob3IgMi41KQorICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVPdXRTaXplKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpkZWNvZGVkU2l6ZXMpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzOworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKworICAgIHdoaWxlICh0b3RhbEluU2l6ZSArIDQgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZU1wM0hlYWRlcihVMzJfQVQoaGVhZGVyICsgdG90YWxJblNpemUpLCAmZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjaGFubmVscywgbnVsbHB0ciwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcGFyc2UgbXAzIGhlYWRlciBkdXJpbmcgb3V0U2l6ZSBlc3RpbWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbEluU2l6ZSArPSBmcmFtZVNpemU7CisgICAgICAgIGRlY29kZWRTaXplcy0+cHVzaF9iYWNrKG51bVNhbXBsZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgaWYgKGRlY29kZWRTaXplcy0+ZW1wdHkoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCisvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCisvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKKy8vICAgICAgIG1wZWcgbGF5ZXIgMSBmcmFtZSBzaXplIGlzIDM4NCBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzaG91bGQgaW50cm9kdWNlCisvLyAgICAgICBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNhbiBjYXVzZSBTRUcgZmF1bHRzLiBTb2Z0IG9teCBtcDMgcGx1Z2luIGNhbiBoYXZlCisvLyAgICAgICB0aGlzIHByb2JsZW0gKENIRUNLISkKK3ZvaWQgQzJTb2Z0TVAzOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwICYmICghbUdhcGxlc3NCeXRlcyB8fCAhZW9zKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisgICAgc2l6ZV90IGNhbE91dFNpemU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBkZWNvZGVkU2l6ZXM7CisgICAgaWYgKGluU2l6ZSAmJiBPSyAhPSBjYWxjdWxhdGVPdXRTaXplKGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLCAmZGVjb2RlZFNpemVzKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsT3V0U2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShkZWNvZGVkU2l6ZXMuYmVnaW4oKSwgZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGNhbE91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dFNpemUgPSAwOworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGF1dG8gaXQgPSBkZWNvZGVkU2l6ZXMuYmVnaW4oKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZGVjb2RlZFNpemVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSArIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAoY2FsT3V0U2l6ZSAtIG91dFNpemUpOworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkgKyBvdXRTaXplKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiBkZWNvZGVyRXJyICE9IFNJREVfSU5GT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWNvdmVyYWJsZSwganVzdCBpZ25vcmUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEFMT0dWKCJpZ25vcmluZyBlcnJvciBhbmQgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICBpZiAobUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAqaXQgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy0+cE91dHB1dEJ1ZmZlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKml0ICE9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0U2l6ZSArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGluUG9zICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0KSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVjb2RlciBkZWxheSBpcyA1Mjkgc2FtcGxlcywgc28gdHJpbSB0aGF0IG1hbnkgc2FtcGxlcyBvZmYKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IG1ha2VzIHRoaXMKKyAgICAgICAgLy8gZGVjb2RlciBoYXZlIHplcm8gZGVsYXksIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBhc3N1bWVzLgorICAgICAgICBvdXRPZmZzZXQgPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBpZiAoY2FsT3V0U2l6ZSA+PQorICAgICAgICAgICAgb3V0U2l6ZSArIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBpZiAoIW1lbXNldChyZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkgKyBvdXRTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIDUyOSBzYW1wbGVzIGF0IGVuZCIpOworICAgICAgICAgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCisgICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRNcDNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXAzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgIG5ldyBDMlNvZnRNUDMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNUDM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wM0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmJkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKKworYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TVAzIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNUDMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSA9IDUyOSAvLyBzYW1wbGVzCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworCisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtR2FwbGVzc0J5dGVzOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TVAzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWcyRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApAQCAtMCwwICsxLDEwNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWcyRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzJEZWMuaCIKKyNpbmNsdWRlICJpbXBlZzJkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWcyLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE5MjAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTA4OCwgNCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2MoV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICptZW0pIHsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjpDMlNvZnRNcGVnMkRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1lbVJlY29yZHMobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJEcmFpbihudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApIHsKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworfQorCitDMlNvZnRNcGVnMkRlYzo6fkMyU29mdE1wZWcyRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJEcmFpbiA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldE51bU1lbVJlY29yZHMoKSB7CisgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKyAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLCBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZmlsbE1lbVJlY29yZHMoKSB7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gKGl2X21lbV9yZWNfdCAqKSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmICghcHNfbWVtX3JlYykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwc19tZW1fcmVjLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspCisgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgIG1NZW1SZWNvcmRzID0gcHNfbWVtX3JlYzsKKworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworCisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gbVdpZHRoOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IG1IZWlnaHQ7CisgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEobU51bU1lbVJlY29yZHMsIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgaWYgKCFwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gbVdpZHRoOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IG1IZWlnaHQ7CisgICAgc19pbml0X2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2luaXRfaXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9vcF90KTsKKworICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmaWxsTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckRyYWluOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6Z2V0U2VxSW5mbygpIHsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90IHNfY3RsX2dldF9zZXFfaW5mb19pcDsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90IHNfY3RsX2dldF9zZXFfaW5mb19vcDsKKworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QpOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9HRVRfU0VRX0lORk87CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HVygiRXJyb3IgaW4gZ2V0dGluZyBTZXF1ZW5jZSBpbmZvOiAweCV4Iiwgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9ICBmYWxzZTsgIC8vIG1wZWcyIHZpZGVvIGhhcyBsaW1pdGVkIHJhbmdlLgorCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVN0cmlkZSA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlSW5pdERlY29kZXIoKSB7CisgICAgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgIGRlbGV0ZURlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCisgICAgICAgIERVTVBfVE9fRklMRShtSW5GaWxlLCBzX2RlY29kZV9pcC5wdl9zdHJlYW1fYnVmZmVyLCBzX2RlY29kZV9pcC51NF9udW1fQnl0ZXMpOworICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkICIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSU1QRUcyRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBzX2RlY29kZV9vcC51NF9waWNfd2QsIHNfZGVjb2RlX29wLnU0X3BpY19odCk7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworCisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT0sgIT0gcmVJbml0RGVjb2RlcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWluaXRpYWxpemUgZGVjb2RlciIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyIG91dDogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpIGdldFNlcUluZm8oKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisKKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzJEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlICJpdl9kYXRhdHlwZWRlZi5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGltcGVnMmRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9fb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvbXBlZzJkX2lucHV0IgorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAodWludDMyX3QpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworc3RydWN0IEMyU29mdE1wZWcyRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWcyRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgZmlsbE1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRTZXFJbmZvKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckRyYWluOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnMkRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGE3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RGVjIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RGVjLmgiCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgxdSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QNFZfMykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzZ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAxOTIwLCAxMDg4KSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDM1MiwgMjg4KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTkyMCAqIDEwODggKiAzIC8gMikpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM1MiAqIDI4OCAqIDMgLyAyKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworI2lmZGVmIE1QRUc0CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisjZWxzZQorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMzUydSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyODh1KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRNYXhXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT53aWR0aDsgfQorICAgIHVpbnQzMl90IGdldE1heEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT5oZWlnaHQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitDMlNvZnRNcGVnNERlYzo6QzJTb2Z0TXBlZzREZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgeworfQorCitDMlNvZnRNcGVnNERlYzo6fkMyU29mdE1wZWc0RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICAodm9pZClvbkluaXQoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1Jc01wZWc0ID0gdHJ1ZTsKKyNlbHNlCisgICAgbUlzTXBlZzQgPSBmYWxzZTsKKyNlbmRpZgorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgLyogVE9ETzogYnJpbmcgdGhlc2UgdmFsdWVzIHRvIDM1MiBhbmQgMjg4LiBJdCBjYW5ub3QgYmUgZG9uZSBhcyBvZiBub3cKKyAgICAgKiBiZWNhdXNlLCBoMjYzIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBwb3J0IHJlY29uZmlndXJhdGlvbi4gSW4gT01YLCB0aGUKKyAgICAgKiBwcm9ibGVtIG9mIGxhcmdlciB3aWR0aCBhbmQgaGVpZ2h0IHRoYW4gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGlzCisgICAgICogb3ZlcmNvbWUgYnkgYWRhcHRpdmVQbGF5QmFjaygpIGFwaSBjYWxsLiBUaGlzIGNhbGwgZ2V0cyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogaW5mb3JtYXRpb24gZnJvbSBleHRyYWN0b3IuIFN1Y2ggYSB0aGluZyBpcyBub3QgcG9zc2libGUgaGVyZS4KKyAgICAgKiBTbyB3ZSBhcmUgY29uZmlndXJpbmcgdG8gbGFyZ2VyIHZhbHVlcy4qLworICAgIG1XaWR0aCA9IDE0MDg7CisgICAgbUhlaWdodCA9IDExNTI7CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBhbGlnbihtV2lkdGgsIDE2KSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzREZWM6OmhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OworICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOworCisgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisKKyAgICBDSEVDS19MRShkaXNwX3dpZHRoLCBidWZfd2lkdGgpOworICAgIENIRUNLX0xFKGRpc3BfaGVpZ2h0LCBidWZfaGVpZ2h0KTsKKworICAgIEFMT0dWKCJkaXNwbGF5IHNpemUgKCVkeCVkKSwgYnVmZmVyIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOworCisgICAgYm9vbCByZXNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gbVdpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICByZXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNNcGVnNCkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmVzQ2hhbmdlZDsKK30KKworLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQorICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKKyAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKyAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisgICAgLyogVSBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgLyogViBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKKyAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CisgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CisgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChjb2RlY0NvbmZpZyB8fCB2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gYml0c3RyZWFtOworICAgICAgICAgICAgdm9sX3NpemUgPSBpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIG1vZGUgPSAobUlzTXBlZzQpID8gTVBFRzRfTU9ERSA6IEgyNjNfTU9ERTsKKyAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCisgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBtb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIlBWSW5pdFZpZGVvRGVjb2RlciBmYWlsZWQuIFVuc3VwcG9ydGVkIGNvbnRlbnQ/Iik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgICAgICBpZiAobW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiRGVjb2RlZCBtb2RlIG5vdCBzYW1lIGFzIGFjdHVhbCBtb2RlIG9mIHRoZSBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpOworICAgICAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1EZWNIYW5kbGUtPnNpemU7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMil7CisgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICV6dSBieXRlcyIsIG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLG1PdXRwdXRCdWZmZXJbMV0pOworICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgorICAgICAgICBWb3BIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOworICAgICAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAoaW5Qb3MgPT0gMCk7CisgICAgICAgIGludDMyX3QgdG1wSW5TaXplID0gKGludDMyX3QpaW5TaXplOworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW1UbXAgPSBiaXRzdHJlYW07CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IHdvcmtJbmRleDsKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCAmYml0c3RyZWFtVG1wLCAmdGltZXN0YW1wLCAmdG1wSW5TaXplLAorICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2luZm8sICZ1c2VFeHRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdm9wIGhlYWRlci4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBIMjYzIGRvZXNuJ3QgaGF2ZSBWT0wgaGVhZGVyLCB0aGUgZnJhbWUgc2l6ZSBpbmZvcm1hdGlvbiBpcyBpbiBzaG9ydCBoZWFkZXIsIGkuZS4gdGhlCisgICAgICAgIC8vIGRlY29kZXIgbWF5IGRldGVjdCBzaXplIGNoYW5nZSBhZnRlciBQVkRlY29kZVZvcEhlYWRlci4KKyAgICAgICAgYm9vbCByZXNDaGFuZ2UgPSBoYW5kbGVSZXNDaGFuZ2Uod29yayk7CisgICAgICAgIGlmIChtSXNNcGVnNCAmJiByZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRtcEluU2l6ZSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdmlkZW8gZnJhbWUuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJZID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKG91dHB1dEJ1ZmZlclksIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LndpZHRoKCksIGFsaWduKG1XaWR0aCwgMTYpLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIGluUG9zICs9IGluU2l6ZSAtIChzaXplX3QpdG1wSW5TaXplOworICAgICAgICBmaW5pc2hXb3JrKHdvcmtJbmRleCwgd29yayk7CisgICAgICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgICAgIGlmIChpblNpemUgLSBpblBvcyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzREZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnNERlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfREVDX0hfCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKKyAgICB9OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYm9vbCBoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOworICAgIHNpemVfdCAgbU91dHB1dEJ1ZmZlclNpemU7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dDsKKworICAgIGJvb2wgbUlzTXBlZzQ7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnNERlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfTVBFRzRfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmE1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApAQCAtMCwwICsxLDY3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIE1QRUc0CisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzRFbmMiCisjZWxzZQorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdEgyNjNFbmMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzRFbmMuaCIKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAxNzYsIDE0NCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE3NiwgMTYpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTQ0LCAxNiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5vbmVPZih7MTc2LCAzNTJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLm9uZU9mKHsxNDQsIDI4OH0pLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDE3LikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIE1QRUc0CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9NUDRWX1NJTVBMRSwgTEVWRUxfTVA0Vl8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0gyNjNfQkFTRUxJTkUsIExFVkVMX0gyNjNfNDUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9IMjYzX0JBU0VMSU5FKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX01QNFZfU0lNUExFOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0gyNjNfQkFTRUxJTkU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX01QNFZfMjsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0gyNjNfNDU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKK0MyU29mdE1wZWc0RW5jOjpDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1FbmNQYXJhbXMobnVsbHB0ciksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKK30KKworQzJTb2Z0TXBlZzRFbmM6On5DMlNvZnRNcGVnNEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uSW5pdCgpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1FbmNvZGVNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyNlbHNlCisgICAgbUVuY29kZU1vZGUgPSBIMjYzX01PREU7CisjZW5kaWYKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIH0KKworICAgIGlmICghbUVuY1BhcmFtcykgeworICAgICAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ3ZpZGVvRW5jT3B0aW9uczsKKyAgICB9CisKKyAgICBpZiAoIShtRW5jUGFyYW1zICYmIG1IYW5kbGUpKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICh2b2lkKVBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtSGFuZGxlOworICAgICAgICBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0VuY0NvbnRyb2xzKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIGlmICghUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNQYXJhbXMsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGlmIChtRnJhbWVSYXRlLT52YWx1ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZXJhdGUgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IG1FbmNvZGVNb2RlOworICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMtPmVuY0hlaWdodFswXSA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgbUVuY1BhcmFtcy0+cmNUeXBlID0gVkJSXzE7CisgICAgbUVuY1BhcmFtcy0+dmJ2RGVsYXkgPSA1LjBmOworICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyAobUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjUpOworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy0+aVF1YW50WzBdID0gMTU7CisgICAgbUVuY1BhcmFtcy0+cFF1YW50WzBdID0gMTI7CisgICAgbUVuY1BhcmFtcy0+cXVhbnRUeXBlWzBdID0gMDsKKyAgICBtRW5jUGFyYW1zLT5ub0ZyYW1lU2tpcHBlZCA9IFBWX09GRjsKKworICAgIC8vIFBWJ3MgTVBFRzQgZW5jb2RlciByZXF1aXJlcyB0aGUgdmlkZW8gZGltZW5zaW9uIG9mIG11bHRpcGxlCisgICAgaWYgKG1TaXplLT53aWR0aCAlIDE2ICE9IDAgfHwgbVNpemUtPmhlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW5pdEVuY1BhcmFtcygpOworICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplZCBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtSGFuZGxlLCBtRW5jUGFyYW1zKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyAxc3QgYnVmZmVyIGZvciBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCAmJiBDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopd1ZpZXcuZGF0YSgpOworICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgorICAgICAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKCFQVkdldFZvbEhlYWRlcihtSGFuZGxlLCBvdXRQdHIsICZvdXRwdXRTaXplLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXctPmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPSBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGluQnVmZmVyLndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBwbGFuZXMgYXJlIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLKE5VTEwgIT0geVBsYW5lKTsKKyAgICAvKiBFbmNvZGUgZnJhbWVzICovCisgICAgVmlkZW9FbmNGcmFtZUlPIHZpbiwgdm91dDsKKyAgICBtZW1zZXQoJnZpbiwgMCwgc2l6ZW9mKHZpbikpOworICAgIG1lbXNldCgmdm91dCwgMCwgc2l6ZW9mKHZvdXQpKTsKKyAgICB2aW4ueUNoYW4gPSB5UGxhbmU7CisgICAgdmluLnVDaGFuID0gdVBsYW5lOworICAgIHZpbi52Q2hhbiA9IHZQbGFuZTsKKyAgICB2aW4udGltZXN0YW1wID0gKGlucHV0VGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcworICAgIHZpbi5oZWlnaHQgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICB2aW4ucGl0Y2ggPSBhbGlnbih3aWR0aCwgMTYpOworCisgICAgdWludDMyX3QgbW9kVGltZU1zID0gMDsKKyAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICBpZiAoIVBWRW5jb2RlVmlkZW9GcmFtZShtSGFuZGxlLCAmdmluLCAmdm91dCwgJm1vZFRpbWVNcywgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgJm5MYXllcikgfHwKKyAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW50IHRyYWNrIGF0IGZyYW1lICUiIFBSSWQ2NCwgbU51bUlucHV0RnJhbWVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXRwdXRTaXplIGZpbGxlZCA6ICVkIiwgb3V0cHV0U2l6ZSk7CisgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgQ0hFQ0soTlVMTCA9PSBQVkdldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworCisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0cHV0U2l6ZSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworICAgICAgICBpZiAoaGludFRyYWNrLkNvZGVUeXBlID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0KKworICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKHlQbGFuZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzRFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQ2MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmMoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgdGFndmlkZW9FbmNDb250cm9scyAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICptRW5jUGFyYW1zOworCisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB1aW50MzJfdCBtT3V0QnVmZmVyU2l6ZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgTVA0RW5jb2RpbmdNb2RlIG1FbmNvZGVNb2RlOworCisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzRFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQxNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0T3B1c0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKK30KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfb3B1c2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0T3B1c0VuYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDcxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRPcHVzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2MDAwLCA1MTAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA5NjAgKiA2KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRPcHVzRGVjOjpDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0T3B1c0RlYzo6fkMyU29mdE9wdXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgY29uc3QgaW50IGtSYXRlID0gNDgwMDA7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCByYXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnMpICogcmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGluU2l6ZTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gKHZvaWQgKilkYXRhOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CisKKyAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGRhdGEsIGluU2l6ZSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworCisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBQYXJzaW5nIE9wdXMgSGVhZGVyLiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBpZiAobUhlYWRlci5jaGFubmVscyA8PSBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmICYmIGNvZGVjRGVsYXlCdWZTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjb2RlY0RlbGF5QnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXModmFsdWUsIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vla1ByZVJvbGxCdWYgJiYgc2Vla1ByZVJvbGxCdWZTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjb2RlY0RlbGF5QnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNFbmMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVMgMjAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdE9wdXNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCAxMjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDUwMCwgNTEyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29tcGxleGl0eSwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0KDB1LCAxMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ29tcGxleGl0eSwgdmFsdWUpLmluUmFuZ2UoMSwgMTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzODQwKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiBtQ29tcGxleGl0eS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNFbmM6OkMyU29mdE9wdXNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1PdXRwdXRCbG9jayhudWxscHRyKSwKKyAgICAgIG1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMTYobnVsbHB0ciksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0T3B1c0VuYzo6fkMyU29mdE9wdXNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICB1bnNpZ25lZCBjaGFyIG1vbm9fbWFwcGluZ1syNTZdID0gezB9OworICAgIHVuc2lnbmVkIGNoYXIgc3RlcmVvX21hcHBpbmdbMjU2XSA9IHswLCAxfTsKKyAgICB1bnNpZ25lZCBjaGFyIHN1cnJvdW5kX21hcHBpbmdbMjU2XSA9IHswLCAxLCAyNTV9OworICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIGludCBjb21wbGV4aXR5ID0gbUludGYtPmdldENvbXBsZXhpdHkoKTsKKyAgICBtTnVtU2FtcGxlc1BlckZyYW1lID0gbVNhbXBsZVJhdGUgLyAoMTAwMCAvIG1GcmFtZUR1cmF0aW9uTXMpOworICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgPQorICAgICAgICBtQ2hhbm5lbENvdW50ICogbU51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQgZXJyID0gQzJfT0s7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBtYXBwaW5nOworICAgIGlmIChtQ2hhbm5lbENvdW50IDwgMikgeworICAgICAgICBtYXBwaW5nID0gbW9ub19tYXBwaW5nOworICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAyKSB7CisgICAgICAgIG1hcHBpbmcgPSBzdGVyZW9fbWFwcGluZzsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXBwaW5nID0gc3Vycm91bmRfbWFwcGluZzsKKyAgICB9CisKKyAgICBpZiAobUVuY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgfQorCisgICAgbUVuY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LAorICAgICAgICAxLCAxLCBtYXBwaW5nLCBPUFVTX0FQUExJQ0FUSU9OX0FVRElPLCAmZXJyKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgY3JlYXRlIGxpYm9wdXMgZW5jb2Rlci4gRXJyb3IgY29kZTogJWkiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIENvbXBsZXhpdHkKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bCgKKyAgICAgICAgICAgIG1FbmNvZGVyLCBPUFVTX1NFVF9DT01QTEVYSVRZKGNvbXBsZXhpdHkpKSAhPSBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGNvbXBsZXhpdHkiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBEVFgKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfRFRYKDApICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGR0eCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFwcGxpY2F0aW9uCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsCisgICAgICAgICAgICBPUFVTX1NFVF9BUFBMSUNBVElPTihPUFVTX0FQUExJQ0FUSU9OX0FVRElPKSkgIT0gT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBhcHBsaWNhdGlvbiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNpZ25hbCB0eXBlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1NJR05BTChPUFVTX0FVVE8pKSAhPQorICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHNpZ25hbCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFVuY29uc3RyYWluZWQgVkJSCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUigwKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCB2YnIgdHlwZSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSX0NPTlNUUkFJTlQoMCkgIT0KKyAgICAgICAgICAgIE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciBjb25zdHJhaW50Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQml0cmF0ZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9CSVRSQVRFKGJpdHJhdGUpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBiaXRyYXRlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IGNvZGVjRGVsYXkKKyAgICBpbnQzMl90IGxvb2thaGVhZDsKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19HRVRfTE9PS0FIRUFEKCZsb29rYWhlYWQpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBsb29rYWhlYWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgbUNvZGVjRGVsYXkgPSBsb29rYWhlYWQgKiAxMDAwMDAwMDAwbGwgLyBtU2FtcGxlUmF0ZTsKKworICAgIC8vIFNldCBzZWVrIHByZXJvbGwgdG8gODAgbXMKKyAgICBtU2Vla1ByZVJvbGwgPSA4MDAwMDAwMDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICBtRnJhbWVEdXJhdGlvbk1zID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTl9NUzsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTE2KSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0KKyAgICAgICAgICAgIChpbnQxNl90KiltYWxsb2Moa0ZyYW1lU2l6ZSAqIGtNYXhOdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorICAgIGlmICghbUlucHV0QnVmZmVyUGNtMTYpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICAvKiBEZWZhdWx0IENvbmZpZ3VyYXRpb25zICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiT1BVU19SRVNFVF9TVEFURSBmYWlsZWQgc3RhdHVzID0gJXMiLCBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRwdXRCbG9jaykgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMTYpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20xNik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9kZXN0cm95KG1FbmNvZGVyKTsKKyAgICAgICAgbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKKy8vIERyYWluIHRoZSBlbmNvZGVyIHRvIGdldCBsYXN0IGZyYW1lcyAoaWYgYW55KQoraW50IEMyU29mdE9wdXNFbmM6OmRyYWluRW5jb2Rlcih1aW50OF90KiBvdXRQdHIpIHsKKyAgICBtZW1zZXQoKHVpbnQ4X3QgKiltSW5wdXRCdWZmZXJQY20xNiArIG1GaWxsZWRMZW4sIDAsCisgICAgICAgIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgIGludCBlbmNvZGVkQnl0ZXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZSgKKyAgICAgICAgbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTE2LCBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICBpZiAoZW5jb2RlZEJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlZCBieXRlcyIsCisgICAgICAgICAgICAgIG1CeXRlc0VuY29kZWQpOworICAgICAgICAvLyBhIGZhdGFsIGVycm9yIHdvdWxkIHN0b3AgdGhlIGVuY29kaW5nCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSk7CisgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICByZXR1cm4gZW5jb2RlZEJ5dGVzOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGlmICghbUVuY29kZXIpIHsKKyAgICAgICAgaWYgKGluaXRFbmNvZGVyKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0RW5jb2RlciBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUgPiAwKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IHByb2Nlc3NTaXplID0gMDsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSAwdTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICB1aW50NjRfdCBpbnB1dEluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgY29uc3QgdWludDhfdCogaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoIW1IZWFkZXJHZW5lcmF0ZWQpIHsKKyAgICAgICAgdWludDhfdCBoZWFkZXJbQU9QVVNfVU5JRklFRF9DU0RfTUFYU0laRV07CisgICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKyAgICAgICAgT3B1c0hlYWRlciBvcHVzSGVhZGVyOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxzID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fc3RyZWFtcyA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgIG9wdXNIZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobUNoYW5uZWxDb3VudCA+IDgpID8gMjU1IDogKG1DaGFubmVsQ291bnQgPiAyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IFdyaXRlT3B1c0hlYWRlcnMob3B1c0hlYWRlciwgbVNhbXBsZVJhdGUsIGhlYWRlciwKKyAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBtQ29kZWNEZWxheSwgbVNlZWtQcmVSb2xsKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKGhlYWRlckxlbiwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBoZWFkZXJMZW4pOworICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIGhlYWRlckxlbik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgbUhlYWRlckdlbmVyYXRlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgYnVmZmVyIHNpemUgd2hpY2ggaXMgbm90IGEgbXVsdGlwbGUgb2YgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSwgd2Ugd2lsbAorICAgICAqIGFjY3VtdWxhdGUgdGhlIGlucHV0IGFuZCBrZWVwIGl0LiBPbmNlIHRoZSBpbnB1dCBpcyBmaWxsZWQgd2l0aCBleHBlY3RlZCBudW1iZXIKKyAgICAgKiBvZiBieXRlcywgd2Ugd2lsbCBzZW5kIGl0IHRvIGVuY29kZXIuIG1GaWxsZWRMZW4gbWFuYWdlcyB0aGUgYnl0ZXMgb2YgaW5wdXQgeWV0CisgICAgICogdG8gYmUgcHJvY2Vzc2VkLiBUaGUgbmV4dCBjYWxsIHdpbGwgZmlsbCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbgorICAgICAqIGJ5dGVzIHRvIGlucHV0IGFuZCBzZW5kIGl0IHRvIHRoZSBlbmNvZGVyLgorICAgICAqLworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBwY21CeXRlcyA9IGluUHRyICsgaW5Qb3M7CisgICAgICAgIGludCBmaWxsZWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbjsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBpblNpemUgLSBpblBvczsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0QnVmZmVyUGNtMTYgKyBmaWxsZWRTYW1wbGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCB1bnNpZ25lZCBuSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5JbnB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBkYXRhID0gcGNtQnl0ZXNbMiAqIGkgKyAxXSA8PCA4IHwgcGNtQnl0ZXNbMiAqIGldOworICAgICAgICAgICAgZGF0YSA9ICgoZGF0YSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwOworICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMTZbaSArIGZpbGxlZFNhbXBsZXNdID0gZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgbUZpbGxlZExlbiArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgaWYgKCFtQnVmZmVyQXZhaWxhYmxlKSBicmVhazsKKyAgICAgICAgdWludDhfdCogb3V0UHRyID0gd1ZpZXcuZGF0YSgpICsgbUJ5dGVzRW5jb2RlZDsKKyAgICAgICAgaW50IGVuY29kZWRCeXRlcyA9CisgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZShtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICAgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgICAgIHByb2Nlc3NTaXplKTsKKworICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzIDwgMCB8fCBlbmNvZGVkQnl0ZXMgPiBrTWF4UGF5bG9hZCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfZW5jb2RlIGZhaWxlZCwgZW5jb2RlZEJ5dGVzIDogJWQiLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kZWRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKG1PdXRwdXRCbG9jaywgbUJ5dGVzRW5jb2RlZCwgZW5jb2RlZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQnl0ZXNFbmNvZGVkICs9IGVuY29kZWRCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKGZpbGxlZFNhbXBsZXMgKyBuSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgb3V0VGltZVN0YW1wID0KKyAgICAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAoKHByb2Nlc3NTaXplICsgbUZpbGxlZExlbikgPCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKQorICAgICAgICAgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBlb3MiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIGlmICghbUVuY29kZXJGbHVzaGVkKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkcmFpbiB0aGUgZW5jb2RlciBmb3IgbGFzdCBidWZmZXIKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwocG9vbCwgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZmxhZ3MpLCBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IG51bGxwdHI7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpbnQgZW5jQnl0ZXMgPSBkcmFpbkVuY29kZXIod1ZpZXcuZGF0YSgpKTsKKyAgICBpZiAoZW5jQnl0ZXMgPiAwKSBtQnl0ZXNFbmNvZGVkICs9IGVuY0J5dGVzOworICAgIGlmIChtQnl0ZXNFbmNvZGVkID4gMCkgeworICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCAwLCBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC8gc2l6ZW9mKGludDE2X3QpKTsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1DaGFubmVsQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0KKyAgICAgICAgKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG91dE9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0T3B1c0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNTI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitzdHJ1Y3QgT3B1c01TRW5jb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0T3B1c0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICAvKiBPUFVTX0ZSQU1FU0laRV8yMF9NUyAqLworICAgIGNvbnN0IGludCBrRnJhbWVTaXplID0gOTYwOworICAgIGNvbnN0IGludCBrTWF4UGF5bG9hZCA9IDQwMDA7CisgICAgY29uc3QgaW50IGtNYXhOdW1DaGFubmVscyA9IDg7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisKKyAgICBPcHVzTVNFbmNvZGVyKiBtRW5jb2RlcjsKKyAgICBpbnQxNl90KiBtSW5wdXRCdWZmZXJQY20xNjsKKworICAgIGJvb2wgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgYm9vbCBtRW5jb2RlckZsdXNoZWQ7CisgICAgYm9vbCBtQnVmZmVyQXZhaWxhYmxlOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQzMl90IG1GcmFtZUR1cmF0aW9uTXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBDb2RlYyBkZWxheSBpbiBucworICAgIHVpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIC8vIFNlZWsgcHJlLXJvbGwgaW4gbnMKKyAgICB1aW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50IG1OdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgaW50IG1CeXRlc0VuY29kZWQ7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIHNpemVfdCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpbnQgZHJhaW5FbmNvZGVyKHVpbnQ4X3QqIG91dFB0cik7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0T3B1c0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0UmF3RGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJjYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFJhd0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0UmF3RGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0UmF3RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMTkyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAxMDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDY0ICogMTAyNCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWb3JiaXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2b3JiaXNpZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzkzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0Vm9yYmlzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWb3JiaXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMzIwMDAsIDUwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIgKiAyICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRWb3JiaXNEZWM6OkMyU29mdFZvcmJpc0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtU3RhdGUobnVsbHB0ciksCisgICAgICBtVmkobnVsbHB0cikgeworfQorCitDMlNvZnRWb3JiaXNEZWM6On5DMlNvZnRWb3JiaXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIChpbml0RGVjb2RlcigpID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRWb3JiaXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mb3t9OworICAgIGlmICghbVZpKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisKKyAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZXt9OworICAgIGlmICghbVN0YXRlKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbmZvVW5wYWNrZWQgPSBmYWxzZTsKKyAgICBtQm9va3NVbnBhY2tlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmIChtU3RhdGUpIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBudWxscHRyOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCisvLyAoQ0hFQ0shKSBtdWx0aWZyYW1lIGlzIHRyaWNreS4gZGVjb2RlIGNhbGwgZG9lc250IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisvLyBjb25zdW1lZCBieSB0aGUgY29tcG9uZW50LiBBbHNvIGl0IGlzIHVuY2xlYXIgd2h5IG51bVBhZ2VGcmFtZXMgaXMgYmVpbmcKKy8vIHRhZ2dlZCBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIG5ldyBwYWdlcy4gUmVmZXIgbGluZXMgMjk3LTMwMCBpbgorLy8gU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaW50MzJfdCBudW1DaGFubmVscyAgPSBtVmktPmNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmVuY29kZXIiOworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciI7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjBmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmIDAKKyAgICAgICAgLy8gc2FtcGxlIEJULjIwMjAgc3RhdGljIGluZm8KKyAgICAgICAgbUhkclN0YXRpY0luZm8gPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigpOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWFzdGVyaW5nID0geworICAgICAgICAgICAgLnJlZCAgID0geyAueCA9IDAuNzA4LCAgLnkgPSAwLjI5MiB9LAorICAgICAgICAgICAgLmdyZWVuID0geyAueCA9IDAuMTcwLCAgLnkgPSAwLjc5NyB9LAorICAgICAgICAgICAgLmJsdWUgID0geyAueCA9IDAuMTMxLCAgLnkgPSAwLjA0NiB9LAorICAgICAgICAgICAgLndoaXRlID0geyAueCA9IDAuMzEyNywgLnkgPSAwLjMyOTAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IDAuMSwKKyAgICAgICAgfTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heENsbCA9IDEwMDA7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhGYWxsID0gMTIwOworCisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhMdW1pbmFuY2UgPSAwOyAvLyBkaXNhYmxlIHN0YXRpYyBpbmZvCisKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCwgQzJDb2xvclh5U3RydWN0PigpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkclN0YXRpY0luZm8pCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkclN0YXRpY0luZm8sIG1hc3RlcmluZy5yZWQueCkuaW5SYW5nZSgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyU3RhdGljSW5mb1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAyMDQ4dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyMDQ4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisjaWZkZWYgVlA5CisjaWYgMAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gbUhkclN0YXRpY0luZm87CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4LCBpbnRmID0gdGhpcy0+bUludGZdKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0U3RyaWRlICogaGVpZ2h0OworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorYm9vbCBDMlNvZnRWcHhEZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIGZhbHNlOworCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKTsKKworICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaW1nLT5kX3cgIT0gbVdpZHRoIHx8IGltZy0+ZF9oICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgIG1IZWlnaHQgPSBpbWctPmRfaDsKKworICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludCkqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdik7CisKKyAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJgorICAgICAgICAgICAgd29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdFZweEZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcHhGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZweERlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZweEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZweEZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzg0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWcHhEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZweERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBNT0RFX1ZQOCwKKyAgICAgICAgTU9ERV9WUDksCisgICAgfSBtTW9kZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdnB4X2NvZGVjX2N0eF90ICptQ29kZWNDdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOWE4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZweEVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWYgMAorc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKyNlbmRpZgorCitDMlNvZnRWcHhFbmM6OkMyU29mdFZweEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDb250ZXh0KG51bGxwdHIpLAorICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbihudWxscHRyKSwKKyAgICAgIG1Db2RlY0ludGVyZmFjZShudWxscHRyKSwKKyAgICAgIG1TdHJpZGVBbGlnbigyKSwKKyAgICAgIG1Db2xvckZvcm1hdChWUFhfSU1HX0ZNVF9JNDIwKSwKKyAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUoVlBYX1ZCUiksCisgICAgICBtRXJyb3JSZXNpbGllbmNlKGZhbHNlKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGgoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4KDApLAorICAgICAgbUxhc3RUaW1lc3RhbXAoMHg3RkZGRkZGRkZGRkZGRkZGdWxsKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CisgICAgbWVtc2V0KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCAwLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSA9IDEwMDsKK30KKworQzJTb2Z0VnB4RW5jOjp+QzJTb2Z0VnB4RW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRWcHhFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUNvZGVjQ29udGV4dCkgeworICAgICAgICB2cHhfY29kZWNfZGVzdHJveShtQ29kZWNDb250ZXh0KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbnRleHQ7CisgICAgICAgIG1Db2RlY0NvbnRleHQgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29kZWNDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDb25maWd1cmF0aW9uOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyB0aGlzIG9uZSBpcyBub3QgYWxsb2NhdGVkIGJ5IHVzCisgICAgbUNvZGVjSW50ZXJmYWNlID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvblN0b3AoKSB7CisgICAgb25SZWxlYXNlKCk7CisgICAgbUxhc3RUaW1lc3RhbXAgPSAweDdGRkZGRkZGRkZGRkZGRkZMTDsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuOworICAgIHN0YXR1c190IHJlc3VsdCA9IFVOS05PV05fRVJST1I7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtQml0cmF0ZU1vZGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZU1vZGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgbVJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gbUludGYtPmdldFRlbXBvcmFsTGF5ZXJzX2woKS0+bS5sYXllckNvdW50OworICAgIH0KKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICAgICAgbUJpdHJhdGVDb250cm9sTW9kZSA9IFZQWF9WQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9DT05TVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUgPSBWUFhfQ0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKyAgICBpZiAoIW1Db2RlY0ludGVyZmFjZSkgZ290byBDbGVhblVwOworCisgICAgQUxPR0QoIlZQeDogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBuZXcgdnB4X2NvZGVjX2VuY19jZmdfdDsKKyAgICBpZiAoIW1Db2RlY0NvbmZpZ3VyYXRpb24pIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z193ID0gbVNpemUtPndpZHRoOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfaCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy9tQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSBnZXRDcHVDb3JlQ291bnQoKTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gbUVycm9yUmVzaWxpZW5jZTsKKworICAgIC8vIHRpbWViYXNlIHVuaXQgaXMgbWljcm9zZWNvbmQKKyAgICAvLyBnX3RpbWViYXNlIGlzIGluIHNlY29uZHMgKGkuZS4gMS8xMDAwMDAwIHNlY29uZHMpCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5udW0gPSAxOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UuZGVuID0gMTAwMDAwMDsKKyAgICAvLyByY190YXJnZXRfYml0cmF0ZSBpcyBpbiBrYnBzLCBtQml0cmF0ZSBpbiBicHMKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOworICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOworICAgIC8vIERpc2FibGUgbGFnZ2VkIGVuY29kaW5nLgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDE7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSA+PSAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CisgICAgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKyAgICBtQ29kZWNDb250ZXh0ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQpIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIGZsYWdzCisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluaXRpYWxpemluZyB2cHggZW5jb2RlciIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgLy8gRXh0cmEgQ0JSIHNldHRpbmdzCisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJjX21heF9pbnRyYV90YXJnZXQgPQorICAgICAgICAgICAgICAgICh1aW50MzJfdCkobUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiBtRnJhbWVSYXRlLT52YWx1ZSAvIDIwICsgMC41KTsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvZGVjX3JldHVybiA9IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSBnb3RvIENsZWFuVXA7CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgICAgICBpZiAoKCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCkgPgorICAgICAgICAgICAgKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcsIHdpZHRoPSV1LCBoZWlnaHQ9JXUuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMik7CisgICAgICAgICAgICBpZiAoIW1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitDbGVhblVwOgorICAgIG9uUmVsZWFzZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBDMlNvZnRWcHhFbmM6OmdldEVuY29kZUZsYWdzKCkgeworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgaWYgKG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPiAwKSB7CisgICAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgICAgc3dpdGNoIChtVGVtcG9yYWxQYXR0ZXJuW3BhdHRlcm5JZHhdKSB7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQorCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgWVVWIGlucHV0IGNvbG9yIGZvcm1hdHMKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBTVkMsIEFSRi4gU1ZDIGFuZCBBUkYgcmV0dXJucyBtdWx0aXBsZSBmcmFtZXMKKy8vIChoaWVyYXJjaGljYWwgLyBub3Nob3cpIGluIG9uZSBjYWxsLiBUaGVzZSBmcmFtZXMgc2hvdWxkIGJlIGNvbWJpbmVkIGluIHRvCisvLyBhIHNpbmdsZSBidWZmZXIgYW5kIHNlbnQgYmFjayB0byB0aGUgY2xpZW50Cit2b2lkIEMyU29mdFZweEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5CisgICAgaWYgKCFtQ29kZWNDb250ZXh0ICYmIE9LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkVtcHR5IGlucHV0IEJ1ZmZlciIpOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0KKyAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSAhPSBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgIT0gbVNpemUtPmhlaWdodCkgeworICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBJbnB1dCBidWZmZXIgYXR0cmlidXRlcyAlZCglZCkgeCAlZCglZCkiLAorICAgICAgICAgICAgICBpbkJ1ZmZlci53aWR0aCgpLCBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQzMl90IHdpZHRoID0gclZpZXctPndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gclZpZXctPmhlaWdodCgpOworICAgIGlmICh3aWR0aCA+IDB4ODAwMCB8fCBoZWlnaHQgPiAweDgwMDApIHsKKyAgICAgICAgQUxPR0UoIkltYWdlIHRvbyBiaWc6ICV1IHggJXUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVihtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sIG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSB0aG91Z2ggd2l0aCBjdXN0b20gb2Zmc2V0IGFuZCBzdHJpZGUKKyAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1sxXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzFdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMl0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsyXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzBdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMV0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsyXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd0luYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgc3RyaWRlLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpID49IHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMF0pOworICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX3NldF9yZWN0KCZyYXdfZnJhbWUsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGw6ICV1IHggJXUgZm9yICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB2c3RyaWRlLCBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgIC8vIGhhbmRsZSBkeW5hbWljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IHJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBBTE9HVigiR290IG1JbnRyYVJlZnJlc2ggcmVxdWVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0KKyAgICAgICAgICAgICAgICAobUJpdHJhdGUtPnZhbHVlICsgNTAwKSAvIDEwMDA7CisgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIHVwZGF0ZSBiaXRyYXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcocmVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgaW5wdXRUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgdWludDMyX3QgZnJhbWVEdXJhdGlvbjsKKyAgICBpZiAoaW5wdXRUaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KShpbnB1dFRpbWVTdGFtcCAtIG1MYXN0VGltZXN0YW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgZGVmYXVsdCBvZiAzMCBmcHMgaW4gY2FzZSBvZiAwIGZyYW1lIHJhdGUuCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICBpZiAoZnJhbWVSYXRlIDwgMC4wMDEpIHsKKyAgICAgICAgICAgIGZyYW1lUmF0ZSA9IDMwOworICAgICAgICB9CisgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKDEwMDAwMDAgLyBmcmFtZVJhdGUgKyAwLjUpOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworCisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNvZGUobUNvZGVjQ29udGV4dCwgJnJhd19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJ2cHggZW5jb2RlciBmYWlsZWQgdG8gZW5jb2RlIGZyYW1lIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7CisgICAgdnB4X2NvZGVjX2l0ZXJfdCBlbmNvZGVkX3BhY2tldF9pdGVyYXRvciA9IG51bGxwdHI7CisgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiBlbmNvZGVkX3BhY2tldDsKKyAgICB3aGlsZSAoKGVuY29kZWRfcGFja2V0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCAmZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IpKSkgeworICAgICAgICBpZiAoZW5jb2RlZF9wYWNrZXQtPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeiwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSh3Vmlldy5kYXRhKCksIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmJ1ZiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgICAgICAgIEFMT0dEKCJieXRlcyBnZW5lcmF0ZWQgJXp1IiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spOworICAgICAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0tFWSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUucHRzOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHBvcHVsYXRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBvcHVsYXRlZCkgeworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTFhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCitjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMHUsIDAsIDAsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJMYXllckNvdW50KS5pblJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJpdHJhdGVSYXRpb3MpLmluUmFuZ2UoMC4sIDEuKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTGF5ZXJpbmdTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKKyAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbUxheWVyaW5nOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDczMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNDb21wcmVzc01vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dD4gbURyY0VuY1RhcmdldExldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0Jvb3N0RmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0PiBtRHJjRWZmZWN0VHlwZTsKKyAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZworfTsKKworQzJTb2Z0WGFhY0RlYzo6QzJTb2Z0WGFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTXBlZ0REcmNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcihudWxscHRyKSB7Cit9CisKK0MyU29mdFhhYWNEZWM6On5DMlNvZnRYYWFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvbkluaXQoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1TYW1wRnJlcSA9IDA7CisgICAgbU51bUNoYW5uZWxzID0gMDsKKyAgICBtUGNtV2RTeiA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gMDsKKyAgICBtTnVtT3V0Qnl0ZXMgPSAwOworICAgIG1DdXJGcmFtZUluZGV4ID0gMDsKKyAgICBtQ3VyVGltZXN0YW1wID0gMDsKKyAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKworICAgIElBX0VSUk9SQ09ERSBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gSUFfTk9fRVJST1IgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKKworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvblN0b3AoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbURSQ0ZsYWcgPSAwOworICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisKKyAgICBlcnJDb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVyckNvZGUpIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGlmIChtT3V0cHV0RHJhaW5CdWZmZXIpIHsKKyAgICAgICAgZGVsZXRlW10gbU91dHB1dERyYWluQnVmZmVyOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBudWxscHRyOworICAgIH0KK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIEZhaWxlZCIpOworICAgICAgICAvKiBDYWxsIGRlSW5pdCB0byBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgICAgIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltrT3V0cHV0RHJhaW5CdWZmZXJTaXplXTsKKyAgICAgICAgaWYgKCFtT3V0cHV0RHJhaW5CdWZmZXIpIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRHJjKCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgImluaXRYQUFDRHJjIik7CisKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICBBTE9HVigibUN1ckZyYW1lSW5kZXggPSAlIiBQUkl1NjQsIG1DdXJGcmFtZUluZGV4KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGludDE2X3QqIG91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSk7CisgICAgbWVtY3B5KG91dEJ1ZmZlciwgbU91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spXSgKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG1DdXJGcmFtZUluZGV4KSkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2gobUN1ckZyYW1lSW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9CisKKyAgICBBTE9HVigib3V0IHRpbWVzdGFtcCAlIiBQUkl1NjQgIiAvICV1IiwgbUN1clRpbWVzdGFtcCwgYmxvY2stPmNhcGFjaXR5KCkpOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCogaW5CdWZmZXIgPSBudWxscHRyOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gMDsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIHNpemUgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorICAgIGlmIChzaXplICYmIHZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB2aWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbXB0eSBjb2RlYyBjb25maWciKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICBpbkJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworCisgICAgICAgIC8qIEdBIGhlYWRlciBjb25maWd1cmF0aW9uIHNlbnQgdG8gRGVjb2RlciEgKi8KKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DdXJGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgbUN1clRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIGNoYXIqIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciA9IG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB3aGlsZSAoc2l6ZSA+IDB1KSB7CisgICAgICAgIGlmICgoa091dHB1dERyYWluQnVmZmVyU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtCisgICAgICAgICAgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIDwKKyAgICAgICAgICAgIChtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gRHJhaW5CdWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImluQXR0cmlidXRlIHNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgaWYgKG1JbnRmLT5pc0FkdHMoKSkgeworICAgICAgICAgICAgQUxPR1YoIkFEVFMiKTsKKyAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFkdHNIZWFkZXIgPSB2aWV3LmRhdGEoKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9ICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZHRzSGVhZGVyWzRdIDw8IDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFhY19mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwgc2l6ZSwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gYWFjX2ZyYW1lX2xlbmd0aCAtIGFkdHNIZWFkZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTm9uIEFEVFMiKTsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBwcmV2U2FtcGxlUmF0ZSA9IG1TYW1wRnJlcTsKKyAgICAgICAgc2lnbmVkIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgLyogWEFBQyBkZWNvZGVyIGV4cGVjdHMgZmlyc3QgZnJhbWUgdG8gYmUgZmVkIHZpYSBjb25maWdYQUFDRGVjb2RlciBBUEkKKyAgICAgICAgICogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUKKyAgICAgICAgICogZGVjb2RlWEFBQ1N0cmVhbSBBUEkgd2l0aCBzYW1lIGZyYW1lIHRvIGRlY29kZSEgKi8KKyAgICAgICAgaWYgKCFtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG1TYW1wRnJlcSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAobU51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TYW1wRnJlcSwgcHJldk51bUNoYW5uZWxzLCBtTnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU2FtcEZyZXEpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBieXRlc0NvbnN1bWVkID0gMDsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycm9yQ29kZSA9IElBX05PX0VSUk9SOworICAgICAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVycm9yQ29kZSA9IGRlY29kZVhBQUNTdHJlYW0oaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNDb25zdW1lZCwgJm1OdW1PdXRCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAgICAgQUxPR1coIkFzc3VtcHRpb24gdGhhdCBmaXJzdCBmcmFtZSBhZnRlciBoZWFkZXIgaW5pdGlhbGl6ZXMgZGVjb2RlciBGYWlsZWQhIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gYnl0ZXNDb25zdW1lZDsKKyAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzQ29uc3VtZWQ7CisKKyAgICAgICAgaWYgKGluQnVmZmVyTGVuZ3RoICE9ICh1aW50MzJfdClieXRlc0NvbnN1bWVkKQorICAgICAgICAgICAgQUxPR1coIkFsbCBkYXRhIG5vdCBjb25zdW1lZCIpOworCisgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGRlY29kZXIgd291bGQgaGF2ZSBnaXZlbiBvdXQgZW1wdHkgYnVmZmVyICovCisgICAgICAgIGlmICgoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSAmJiAoMCA9PSBtTnVtT3V0Qnl0ZXMpICYmIG1Jc0NvZGVjSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBtTnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKKworICAgICAgICBpZiAoIWJ5dGVzQ29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJieXRlc0NvbnN1bWVkID0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVpbnQzMl90KW1OdW1PdXRCeXRlcyA+CisgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtTnVtT3V0Qnl0ZXMgPiBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMsIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3csIEFTQU4KKyAgICAgICAgICAgIG1lbXNldChtT3V0cHV0QnVmZmVyLCAwLCBtTnVtT3V0Qnl0ZXMpOworCisgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodGVtcE91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0QnVmZmVyLCBtTnVtT3V0Qnl0ZXMpOworICAgICAgICB0ZW1wT3V0cHV0RHJhaW5CdWZmZXIgKz0gbU51bU91dEJ5dGVzOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyArPSBtTnVtT3V0Qnl0ZXM7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKSB7CisgICAgICAgIGZpbmlzaFdvcmsod29yaywgcG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisgICAgaWYgKGVvcykgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdmbHVzaERlY29kZSgpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGU7CisgICAgdWludDMyX3QgdWlfaW5pdF9kb25lOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dWKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gY29uZmlnZmx1c2hEZWNvZGU6IEVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICB9CisgICAgfQorICAgIGRyYWluRGVjb2RlcigpOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRyYWluRGVjb2RlcigpIHsKKyAgICAvKiBPdXRwdXQgZGVsYXkgY29tcGVuc2F0aW9uIGxvZ2ljIHNob3VsZCBzaXQgaGVyZS4gKi8KKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgYXMgWEFBQyBkZWNvZGVyIGRvZXMgbm90IGludHJvZHVjZSBvdXRwdXQgYnVmZmVyIGRlbGF5ICovCisKKyAgICByZXR1cm4gMDsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRGVjb2RlcigpIHsKKyAgICAvKiBGaXJzdCBwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogRXJyb3IgSGFuZGxlciBJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBMaWJyYXJ5IE5hbWUsIExpYnJhcnkgVmVyc2lvbiBhbmQgQVBJIFZlcnNpb24gKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgKyBEZWZhdWx0IGNvbmZpZyBzZXQgICAgICovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbXMgZnJvbSB1c2VyICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEluaXRpYWxpemUgbWVtb3J5IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBHZXQgbWVtb3J5IGluZm9ybWF0aW9uIGFuZCBhbGxvY2F0ZSBtZW1vcnkgICAgICAgICovCisKKyAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIC8qIFByb2Nlc3Mgc3RydWN0IGluaXRpbmcgZW5kICovCisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlIGFuZCBzZXQgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0ICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBUEkgc2l6ZSAqLworICAgIHVpbnQzMl90IHB1aV9hcGlfc2l6ZTsKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1aV9hcGlfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKCFtWGhlYWFjQ29kZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogR2V0IHRoZSBBUEkgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobnVsbHB0ciwgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsIDAsICZwdWlfYXBpX3NpemUpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbU1wZWdERHJjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1NcGVnRERyY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9tcDRfZmxhZyA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9tcDRfZmxhZyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgTWVtb3J5IGluZm8gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplOworICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKCFwdl9hbGxvY19wdHIpIHsKKyAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBbGxvY2F0ZSBNZW1vcnkgd2l0aCBpbmZvIGZyb20gbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBtZW1vcmllcywgdGhhdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICAvKiBwZXJzaXN0ZW50LHNjcmF0Y2gsaW5wdXQgYW5kIG91dHB1dCAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCB1aV9zaXplID0gMCwgdWlfYWxpZ25tZW50ID0gMCwgdWlfdHlwZSA9IDA7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwKKyAgICAgICAgICAgICAgICAgICB1aV9zaXplICsgdWlfYWxpZ25tZW50KTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgICAgIGlmICh1aV90eXBlID09IElBX01FTVRZUEVfSU5QVVQpIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IChwV09SRDgpcHZfYWxsb2NfcHRyOworICAgICAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IHVpX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9PVVRQVVQpCisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgfQorICAgIC8qIEVuZCBmaXJzdCBwYXJ0ICovCisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIHVuc2lnbmVkIGludCB1aV9kcmNfdmFsOworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKKyAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsID0gbUludGYtPmdldERyY1RhcmdldFJlZkxldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCB0YXJnZXRSZWZMZXZlbCk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpdGFyZ2V0UmVmTGV2ZWw7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCIpOworCisgICAgLyogVXNlIHVpX2RyY192YWwgZnJvbSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgb3IgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTAorICAgICAqIGZvciBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIHRvbyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgaW50MzJfdCBhdHRlbnVhdGlvbkZhY3RvciA9IG1JbnRmLT5nZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQiLCBhdHRlbnVhdGlvbkZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYXR0ZW51YXRpb25GYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWJvb3N0RmFjdG9yOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpbnQzMl90IGNvbXByZXNzTW9kZSA9IG1JbnRmLT5nZXREcmNDb21wcmVzc01vZGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIiwgY29tcHJlc3NNb2RlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCljb21wcmVzc01vZGU7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKworICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9IG1JbnRmLT5nZXREcmNFZmZlY3RUeXBlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIE1QRUctRCBEUkMgZWZmZWN0IHR5cGUgJWQiLCBlZmZlY3RUeXBlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCllZmZlY3RUeXBlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworICAgIEFMT0dWKCJkZUluaXRYQUFDRGVjb2RlciIpOworCisgICAgLyogRXJyb3IgY29kZSAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICB9CisKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgZXJyb3IgcmV0dXJuZWQgaW4gSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1NZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HVigiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICBpZiAobUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgIC8qIElmIGNvZGVjIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZW4gR0EgaGVhZGVyIGlzIHBhc3NlZCBhZ2FpbiAqLworICAgICAgICAvKiBOZWVkIHRvIGNhbGwgdGhlIEZsdXNoIEFQSSBpbnN0ZWFkIG9mIElOSVRfUFJPQ0VTUyAqLworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7IC8qIENvZGVjIG5lZWRzIHRvIGJlIFJlaW5pdGlhbGl6ZWQgYWZ0ZXIgZmx1c2ggKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0dBX0hEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfR0FfSERSIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2VzcyAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX1BST0NFU1MiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBpbml0aWFsaXphdGlvbiAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2J5dGVzX2NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dJKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIGVycl9jb2RlID0gY29uZmlnTVBFR0REcmMoKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiY29uZmlnTVBFR0REcmMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdE1QRUdERERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQoraW50IEMyU29mdFhhYWNEZWM6OmNvbmZpZ01QRUdERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpX2VmZmVjdF90eXBlOworICAgIGludCBpX2xvdWRfbm9ybTsKKyAgICBpbnQgaV90YXJnZXRfbG91ZG5lc3M7CisgICAgdW5zaWduZWQgaW50IGlfc2JyX21vZGU7CisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplID0gMDsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHIgPSBOVUxMOworCisgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgLyogVG90YWwgTnVtYmVyIG9mIENoYW5uZWxzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworCisgICAgLypTZXQgRWZmZWN0IFR5cGUqLworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1lbXNldChwdl9hbGxvY19wdHIsIDAsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICBkZUluaXRNUEVHREREcmMoKTsKKworICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBEUkMgYnVmZmVycworICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCisgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KKyAgICB7CisgICAgICAgIFZPSUQqIHBfYXJyYXlbMl1bMTZdOworICAgICAgICBXT1JEMzIgaWk7CisgICAgICAgIFdPUkQzMiBidWZfc2l6ZXNbMl1bMTZdOworICAgICAgICBXT1JEMzIgbnVtX2VsZW1lbnRzOworICAgICAgICBXT1JEMzIgbnVtX2NvbmZpZ19leHQ7CisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisKKyAgICAgICAgV09SRDMyIHVvX251bV9jaGFuOworCisgICAgICAgIG1lbXNldChidWZfc2l6ZXMsIDAsIDMyICogc2l6ZW9mKFdPUkQzMikpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUywgJmJ1Zl9zaXplc1swXVswXSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUyIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9QVFIiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwgSUFfQ01EX1RZUEVfSU5JVF9TRVRfQlVGRl9QVFIsIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fRUxFLCAmbnVtX2VsZW1lbnRzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUiKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0NPTkZJR19FWFQsICZudW1fY29uZmlnX2V4dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCIpOworCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9jb25maWdfZXh0OyBpaSsrKSB7CisgICAgICAgICAgICAvKmNvcHkgbG91ZG5lc3MgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMF1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMF1baWldLCBidWZfc2l6ZXNbMF1baWldKTsKKworICAgICAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQsICZiaXRfc3RyX2ZtdCk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1swXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQ1BZX0lMX0JTRl9CVUZGIik7CisKKyAgICAgICAgICAgICAgICBtRFJDRmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1fZWxlbWVudHM7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBjb25maWcgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMV1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMV1baWldLCBidWZfc2l6ZXNbMV1baWldKTsKKyAgICAgICAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRFJDRmxhZyA9PSAxKSB7CisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLypSZWFkIGludGVyZmFjZSBidWZmZXIgY29uZmlnIGZpbGUgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICAgICAgV09SRDMyIGludGVyZmFjZV9pc19wcmVzZW50ID0gMTsKKworICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpX3Nicl9tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMjA0ODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlfc2JyX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFLCAoV09SRDMyICopJm1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9JTlRfUFJFU0VOVCwgJmludGVyZmFjZV9pc19wcmVzZW50KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5UIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLCBudWxscHRyKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZ1b19udW1fY2hhbik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET19FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBwcm9jZXNzaW5nICovCisgICAgdWludDMyX3QgdWlfZXhlY19kb25lOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2V4ZWNfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9leGVjX2RvbmUgIT0gMSkgeworICAgICAgICBWT0lEKiBwX2FycmF5OyAgICAgICAgLy8gSVRUSUFNOmJ1ZmZlciB0byBoYW5kbGUgZ2FpbiBwYXlsb2FkCisgICAgICAgIFdPUkQzMiBidWZfc2l6ZSA9IDA7ICAvLyBJVFRJQU06Z2FpbiBwYXlsb2FkIGxlbmd0aAorICAgICAgICBXT1JEMzIgYml0X3N0cl9mbXQgPSAxOworICAgICAgICBXT1JEMzIgZ2Fpbl9zdHJlYW1fZmxhZyA9IDE7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4sICZidWZfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19HQUlOX1BBWUxPQURfTEVOIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYsICZwX2FycmF5KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYiKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgPiAwKSB7CisgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXksIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFU19CUywgMCwgJmJ1Zl9zaXplKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0dBSU5fU1RSRUFNX0ZMQUcsICZnYWluX3N0cmVhbV9mbGFnKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIC8qIEdldCB0aGUgb3V0cHV0IGJ5dGVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCeXRlcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX09VVFBVVF9CWVRFUyIpOworCisgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICBtZW1jcHkobURyY0luQnVmLCBtT3V0cHV0QnVmZmVyLCAqb3V0Qnl0ZXMpOworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsIDAsIG91dEJ5dGVzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfRVhFQ1VURSwgSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0RPX0VYRUNVVEUiKTsKKworICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2FtcEZyZXEpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTnVtQ2hhbm5lbHMpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUENNIHdvcmQgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTUFTSyIpOworCisgICAgLyogQ2hhbm5lbCBtb2RlIHRvIHRlbGwgTU9OTy9TVEVSRU8vRFVBTC1NT05PL05PTkVfT0ZfVEhFU0UgKi8KKyAgICB1aW50MzJfdCB1aV9jaGFubmVsX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfY2hhbm5lbF9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTU9ERSIpOworICAgIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTU9OT19PUl9QU1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDEpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IFNURVJFT1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDIpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IERVQUwtTU9OT1xuIik7CisgICAgZWxzZQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBOT05FX09GX1RIRVNFIG9yIE1VTFRJQ0hBTk5FTFxuIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBTQlIgUFJFU0VOVC9OT1RfUFJFU0VOVCAqLworICAgIHVpbnQzMl90IHVpX3Nicl9tb2RlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKyAgICBpZiAodWlfc2JyX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBOT1RfUFJFU0VOVFxuIik7CisgICAgZWxzZSBpZiAodWlfc2JyX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBQUkVTRU5UXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJTQlIgTW9kZTogSUxMRUdBTFxuIik7CisKKyAgICAvKiBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyBTQlJfTU9ERSkgZm9yIEFBQyAqLworICAgIC8qIEZvciBVU0FDIGl0IGNvdWxkIGJlIDEwMjQgKiAzICwgc3VwcG9ydCB0byBxdWVyeSAgKi8KKyAgICAvKiBub3QgeWV0IGFkZGVkIGluIGNvZGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNCAqICgxICsgdWlfc2JyX21vZGUpOworICAgIEFMT0dJKCJtT3V0cHV0RnJhbWVMZW5ndGggJWQgdWlfc2JyX21vZGUgJWQiLCBtT3V0cHV0RnJhbWVMZW5ndGgsIHVpX3Nicl9tb2RlKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OnNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpbnQzMl90IHVpX2RyY19lbmFibGUgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfZW5hYmxlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSIpOworICAgIGlmIChkcmNDdXQgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsICZkcmNDdXQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworICAgIH0KKworICAgIGlmIChkcmNCb29zdCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsICZkcmNCb29zdCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisgICAgfQorCisgICAgaWYgKGRyY1JlZkxldmVsICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworICAgIH0KKworICAgIGlmIChkcmNIZWF2eUNvbXByZXNzaW9uICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0hlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisgICAgfQorCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJmRyRWZmZWN0VHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBpbnQzMl90IGlfZWZmZWN0X3R5cGUsIGlfdGFyZ2V0X2xvdWRuZXNzLCBpX2xvdWRfbm9ybTsKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIC8qU2V0IHRhcmdldCBsb3VkbmVzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLCAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjbGFzcyBDMlNvZnRYYWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFhhYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0WGFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRYYWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg1NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfWEFBQ19ERUNfSF8KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaXhoZWFhY2RfdHlwZV9kZWYuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9oYW5kbGVyLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX21lbW9yeV9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hYWNfY29uZmlnLmgiCisKKyNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKyNkZWZpbmUgTUFYX05VTV9CTE9DS1MgICAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGJsb2NrcyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LCBwVk9JRCBwdl92YWx1ZSk7CitleHRlcm4gIkMiICBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZ2V0X2NvbmZpZ19wYXJhbShwVk9JRCBwX2lhX3Byb2Nlc3NfYXBpX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfc2FtcF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9udW1fY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfcGNtX3dkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9jaGFubmVsX21hc2spOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRYYWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFhhYWNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgICAgICA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIE1BWF9OVU1fQkxPQ0tTLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQqIG1YaGVhYWNDb2RlY0hhbmRsZTsKKyAgICB2b2lkKiBtTXBlZ0REcmNIYW5kbGU7CisgICAgdWludDMyX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RnJhbWVMZW5ndGg7CisgICAgaW50OF90KiBtSW5wdXRCdWZmZXI7CisgICAgaW50OF90KiBtT3V0cHV0QnVmZmVyOworICAgIGludDMyX3QgbVNhbXBGcmVxOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVBjbVdkU3o7CisgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CisgICAgaW50MzJfdCBtTnVtT3V0Qnl0ZXM7CisgICAgdWludDY0X3QgbUN1ckZyYW1lSW5kZXg7CisgICAgdWludDY0X3QgbUN1clRpbWVzdGFtcDsKKyAgICBib29sIG1Jc0NvZGVjSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQ7CisgICAgaW50OF90KiBtRHJjSW5CdWY7CisgICAgaW50OF90KiBtRHJjT3V0QnVmOworICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKKyAgICBpbnQzMl90IG1EUkNGbGFnOworCisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudCBfX3VudXNlZDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBjaGFyKiBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgdWludDMyX3QgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3M7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0RHJjUGFyYW1ldGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCk7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgaW50IGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7CisgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY1JlZkxldmVsLCBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFhhYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX1hBQUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjM3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsiQzIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8qKgorICogVGhlcmUgaXMgbm90aGluZyBoZXJlIHlldC4gVGhpcyBsaWJyYXJ5IGlzIGJ1aWx0IHRvIHNlZSB3aGF0IHN5bWJvbHMgYW5kIG1ldGhvZHMgZ2V0CisgKiBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIEFQSSBpbmNsdWRlIGZpbGVzLgorICoKKyAqIEdvaW5nIGZvcndhcmQsIHRoZSBDb2RlYzIgbGlicmFyeSB3aWxsIGNvbnRhaW4gdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBmb3IKKyAqIENvZGVjMiBjbGllbnRzLgorICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzQ2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX0hfCisjZGVmaW5lIEMyX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvKiogbmFub3NlY29uZHMgd2l0aCBhcmJpdHJhcnkgb3JpZ2luLiAqLwordHlwZWRlZiBpbnQ2NF90IGMyX25zZWNzX3Q7CisKKy8qKiBcbWFpbnBhZ2UgQ29kZWMyCisgKgorICogQ29kZWMyIGlzIGEgZ2VuZXJpYyBmcmFtZS1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgQVBJLgorICoKKyAqIFRoZSBtZWRpYSBzdWJzeXN0ZW0gYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgorICovCisKKy8qKiBcaW5ncm91cCBBUEkKKyAqCisgKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKgorICogQ29kaW5nIENvbnZlbnRpb25zCisgKgorICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KKyAqCisgKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCisgKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKKyAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBjMl9zdGF0dXNfdCwgd2l0aCBDMl9PTUlUVEVEIG5vdCByZXF1aXJpbmcKKyAqICAgYW55IHVwZGF0ZSB0byBpbnB1dC9vdXRwdXQgYXJndW1lbnRzLgorICogLSBsaW1pdGluZyBzeW1ib2wgZXhwb3J0IG9mIGlubGluZSBtZXRob2RzCisgKiAtIHVzZSBvZiBwaW1wbCAob3Igc2hhcmVkLXBpbXBsKQorICoKKyAqIE5hbWluZworICoKKyAqIC0gYWxsIGNsYXNzZXMgYW5kIHR5cGVzIHByZWZpeCB3aXRoIEMyCisgKiAtIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBwcmVmaXggd2l0aCBfQzIKKyAqIC0gZW51bSB2YWx1ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSBwcmVmaXggd2l0aCBDMl8gYWxsIGNhcHMKKyAqIC0gZW51bSB2YWx1ZXMgaW5zaWRlIGNsYXNzZXMgaGF2ZSBubyBDMl8gcHJlZml4IGFzIGNsYXNzIGFscmVhZHkgaGFzIGl0CisgKiAtIHN1cHBvcnRpbmcgdHdvIGtpbmRzIG9mIGVudW0gbmFtaW5nOiBhbGwtY2FwcyBhbmQga0NhbWVsQ2FzZQorICogXHRvZG8gcmV2aXNpdCBrQ2FtZWxDYXNlIGZvciBwYXJhbS10eXBlCisgKgorICogQXNwZWN0cworICoKKyAqIEFzcGVjdHMgZGVmaW5lIGNlcnRhaW4gY29tbW9uIGJlaGF2aW9yIGFjcm9zcyBhIGdyb3VwIG9mIG9iamVjdHMuCisgKiAtIGNsYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIF9DMi4qQXNwZWN0CisgKiAtIG9ubHkgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworICogLSBubyBkZXNjdHJ1Y3RvciBhbmQgY29waWFibGUKKyAqIC0gYWxsIG1ldGhvZHMgYXJlIGlubGluZSBvciBzdGF0aWMgKHRoaXMgaXMgb3Bwb3NpdGUgb2YgdGhlIGludGVyZmFjZSBwYXJhZGlnbSB3aGVyZSBhbGwgbWV0aG9kcworICogICBhcmUgdmlydHVhbCwgd2hpY2ggd291bGQgbm90IHdvcmsgZHVlIHRvIHRoZSBhdCBtb3N0IG9uZSB2dGFibGUgcnVsZS4pCisgKiAtIG9ubHkgcHJpdmF0ZSB2YXJpYWJsZXMgKHRoaXMgcHJldmVudHMgc3ViY2xhc3NlcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBhc3BlY3RzLikKKyAqLworCisvLy8gXGRlZmdyb3VwIHR5cGVzIENvbW1vbiBUeXBlcworLy8vIEB7CisKKy8qKgorICogQzJTdHJpbmc6IGJhc2ljIHN0cmluZyBpbXBsZW1lbnRhdGlvbgorICovCit0eXBlZGVmIHN0ZDo6c3RyaW5nIEMyU3RyaW5nOworCisvKioKKyAqIEMyU3RyaW5nTGl0ZXJhbDogYmFzaWMgc3RyaW5nIGxpdGVyYWwgaW1wbGVtZW50YXRpb24uCisgKiBcbm90ZSB0aGVzZSBhcmUgbmV2ZXIgb3duZWQgYnkgYW55IG9iamVjdCwgYW5kIGNhbiBvbmx5IHJlZmVyIHRvIEMgc3RyaW5nIGxpdGVyYWxzLgorICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKKworLyoqCisgKiBjMl9zdGF0dXNfdDogc3RhdHVzIGNvZGVzIHVzZWQuCisgKi8KK2VudW0gYzJfc3RhdHVzX3QgOiBpbnQzMl90IHsKKy8qCisgKiBVc2UgUE9TSVggZXJybm8gY29uc3RhbnRzLgorICovCisgICAgQzJfT0sgICAgICAgID0gMCwgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisKKyAgICAvLyBiYWQgaW5wdXQKKyAgICBDMl9CQURfVkFMVUUgPSBFSU5WQUwsICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCisgICAgQzJfQkFEX0lOREVYID0gRU5YSU8sICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKKyAgICBDMl9DQU5OT1RfRE8gPSBFTk9UU1VQLCAgICAgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsaWQgYnV0IG5vdCBwb3NzaWJsZQorCisgICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCisgICAgQzJfRFVQTElDQVRFID0gRUVYSVNULCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cworICAgIEMyX05PVF9GT1VORCA9IEVOT0VOVCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCisgICAgQzJfQkFEX1NUQVRFID0gRVBFUk0sICAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCisgICAgQzJfQkxPQ0tJTkcgID0gRVdPVUxEQkxPQ0ssICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAorICAgIEMyX0NBTkNFTEVEICA9IEVJTlRSLCAgICAgICAgLy8vPCBvcGVyYXRpb24gaW50ZXJydXB0ZWQvY2FuY2VsZWQKKworICAgIC8vIGJhZCBlbnZpcm9ubWVudAorICAgIEMyX05PX01FTU9SWSA9IEVOT01FTSwgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KKyAgICBDMl9SRUZVU0VEICAgPSBFQUNDRVMsICAgICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorCisgICAgQzJfVElNRURfT1VUID0gRVRJTUVET1VULCAgICAvLy88IG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiB0aW1lb3V0CisKKyAgICAvLyBiYWQgdmVyc2lvbmluZworICAgIEMyX09NSVRURUQgICA9IEVOT1NZUywgICAgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkL3N1cHBvcnRlZCAob3B0aW9uYWwgb25seSkKKworICAgIC8vIHVua25vd24gZmF0YWwKKyAgICBDMl9DT1JSVVBURUQgPSBFRkFVTFQsICAgICAgIC8vLzwgc29tZSB1bmV4cGVjdGVkIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uCisgICAgQzJfTk9fSU5JVCAgID0gRU5PREVWLCAgICAgICAvLy88IHN0YXR1cyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKK307CisKKy8qKgorICogVHlwZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVzaXJlZCBibG9ja2luZyBiZWhhdmlvciBmb3IgdmFyaWFibGUgYmxvY2tpbmcgY2FsbHMuIEJsb2NraW5nIGluIHRoaXMKKyAqIEFQSSBpcyB1c2VkIGluIGEgc29tZXdoYXQgbW9kaWZpZWQgbWVhbmluZyBzdWNoIHRoYXQgb3BlcmF0aW9ucyB0aGF0IG1lcmVseSB1cGRhdGUgdmFyaWFibGVzCisgKiBwcm90ZWN0ZWQgYnkgbXV0ZXhlcyBhcmUgc3RpbGwgY29uc2lkZXJlZCAibm9uLWJsb2NraW5nIiAoYWx3YXlzIHVzZWQgaW4gcXVvdGVzKS4KKyAqLworZW51bSBjMl9ibG9ja2luZ190IDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBTSEFMTCBiZSAibm9uLWJsb2NraW5nIi4gVGhpcyBtZWFucyB0aGF0IGl0IHNoYWxsIG5vdCBwZXJmb3JtIGFueSBmaWxlCisgICAgICogb3BlcmF0aW9ucywgb3IgY2FsbC93YWl0IG9uIG90aGVyIHByb2Nlc3Nlcy4gSXQgbWF5IHVzZSBhIHByb3RlY3RlZCByZWdpb24gYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBtdXRleCBpcyBuZXZlciB1c2VkIHRvIHByb3RlY3QgY29kZSB0aGF0IGlzIG90aGVyd2lzZSAibWF5IGJsb2NrIi4KKyAgICAgKi8KKyAgICBDMl9ET05UX0JMT0NLID0gZmFsc2UsCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBNQVkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuCisgICAgICovCisgICAgQzJfTUFZX0JMT0NLID0gdHJ1ZSwKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcworLy8vIEB7CisKKyNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisgICAgdHlwZShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisKKyNkZWZpbmUgQzJfREVGQVVMVF9NT1ZFKHR5cGUpIFwKKyAgICB0eXBlJiBvcGVyYXRvcj0odHlwZSAmJikgPSBkZWZhdWx0OyBcCisgICAgdHlwZSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKworI2RlZmluZSBDMl9BTExPV19PVkVSRkxPVyBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyNkZWZpbmUgQzJfQ09OU1QgICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorI2RlZmluZSBDMl9ISURFICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIEMyX0lOTElORSAgIGlubGluZSBDMl9ISURFCisjZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQorI2RlZmluZSBDMl9QQUNLICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgQzJfUFVSRSAgICAgX19hdHRyaWJ1dGVfXygocHVyZSkpCisKKyNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQorCisjZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCwgbWFzaykgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyBcCisgICAgICAgIHJldHVybiAoZmllbGQgJiBtYXNrKSA8IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spID09IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKKworI2RlZmluZSBERUZJTkVfRU5VTV9PUEVSQVRPUlMoZXR5cGUpIFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfChldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSB8IHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yfD0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3ImKGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpICYgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3ImPShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvcl4oZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgXiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvcl49KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfihldHlwZSBhKSB7IHJldHVybiAoZXR5cGUpKH5zdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdDsKKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX2MyX2NudHJfY29tcGF0X2hlbHBlciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mKFUpID49IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgVCBnZXQoY29uc3QgYzJfY250cl90PFUsIHZvaWQ+ICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZS5tVmFsdWUpOworICAgIH0KK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBJbnRlZ3JhbCBjb3VudGVyIHR5cGUuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIE5FVkVSIGNoZWNrZWQgZm9yIG92ZXJmbG93L3VuZGVyZmxvdyAtIGFuZAorICogY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHJlZGVmaW5lZC4KKyAqCisgKiBcbm90ZSBDb21wYXJpc29uIG9mIGNvdW50ZXIgdHlwZXMgaXMgbm90IGZ1bGx5IHRyYW5zaXRpdmUsIGUuZy4KKyAqIGl0IGNvdWxkIGJlIHRoYXQgYSA+IGIgPiBjIGJ1dCBhICE+IGMuCisgKiBzdGQ6Omxlc3M8PiwgZ3JlYXRlcjw+LCBsZXNzX2VxdWFsPD4gYW5kIGdyZWF0ZXJfZXF1YWw8PiBzcGVjaWFsaXphdGlvbnMgeWllbGQgdG90YWwgb3JkZXJpbmcsCisgKiBidXQgbWF5IG5vdCBtYXRjaCBzZW1hbnRpYyBvcmRlcmluZyBvZiB0aGUgdmFsdWVzLgorICoKKyAqIFRlY2huaWNhbGx5OiBjb3VudGVyIHR5cGVzIHJlcHJlc2VudCBpbnRlZ2VyIHZhbHVlczogQSAqIDJeTiArIHZhbHVlLCB3aGVyZSBBIGNhbiBiZSBhcmJpdHJhcnkuCisgKiBUaGlzIG1ha2VzIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgbXVsdGlwbGljYXRpb24gKGFzIHdlbGwgYXMgYml0d2lzZSBvcGVyYXRpb25zKSB3ZWxsIGRlZmluZWQuCisgKiBIb3dldmVyLCBkaXZpc2lvbiBpcyBpbiBnZW5lcmFsIG5vdCB3ZWxsIGRlZmluZWQsIGFzIHRoZSByZXN1bHQgbWF5IGRlcGVuZCBvbiBBLiBUaGlzIGlzIGFsc28KKyAqIHRydWUgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCBib29sZWFuIGNvbnZlcnNpb24uCisgKgorICogRXZlbiB0aG91Z2ggd2VsbCBkZWZpbmVkLCBiaXR3aXNlIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIGZvciBjb3VudGVyIHR5cGVzIGFzIHRoZXkgYXJlIG5vdAorICogbWVhbmluZ2Z1bC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdCB7CisgICAgdXNpbmcgY29tcGF0ID0gX2MyX2NudHJfY29tcGF0X2hlbHBlcjxUPjsKKworICAgIFQgbVZhbHVlOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBIQUxGX1JBTkdFID0gVCh+MCkgXiAoVCh+MCkgPj4gMSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGZyaWVuZCBzdHJ1Y3QgX2MyX2NudHJfY29tcGF0X2hlbHBlcjsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemVkIGNvdW50ZXIgdG8gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdCgpIDogbVZhbHVlKFQoMCkpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIGNvbXBhdGlibGUgdHlwZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KGNvbnN0IFUgJnZhbHVlKSA6IG1WYWx1ZShjb21wYXQ6OmdldCh2YWx1ZSkpIHt9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGUgcGVlaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyB1bmRlcmx5aW5nIHVuc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBUIHBlZWt1KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGxvbmcgbG9uZyBwZWVrbGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobG9uZyBsb25nKW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuc2lnbmVkIGxvbmcgbG9uZyAtIGUuZy4gZm9yIHByaW50aW5nLgorICAgICAqLworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgcGVla3VsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gYSBzbWFsbGVyIGNvdW50ZXIgdHlwZS4gVGhpcyBpcyBhbHdheXMgc2FmZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4KKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGMyX2NudHJfdDxVPigpIHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihtVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyaXRobWV0aWMgb3BlcmF0b3JzCisgICAgICovCisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKGF0dHJpYiwgb3AsIG9wX2Fzc2lnbikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiYgb3BlcmF0b3Igb3BfYXNzaWduKGNvbnN0IFUgJnZhbHVlKSB7IFwKKyAgICAgICAgbVZhbHVlIG9wX2Fzc2lnbiBjb21wYXQ6OmdldCh2YWx1ZSk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoY29tcGF0OjpnZXQoVSgwKSkpPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGNvbnN0IFUgJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgb3AgY29tcGF0OjpnZXQodmFsdWUpKTsgXAorICAgIH0gXAorICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4gXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxVPiBvcGVyYXRvciBvcChjb25zdCBjMl9jbnRyX3Q8VT4gJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihVKG1WYWx1ZSkgb3AgdmFsdWUucGVla3UoKSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoYXR0cmliLCBvcCkgXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcCgpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG9wIG1WYWx1ZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjMl9jbnRyX3Q8VD4gJm9wZXJhdG9yIG9wKCkgeyBcCisgICAgICAgIG9wIG1WYWx1ZTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcChpbnQpIHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQsIHZvaWQ+KG1WYWx1ZSBvcCk7IFwKKyAgICB9CisKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICssICs9KQorICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgLSwgLT0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAqLCAqPSkKKworICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtKQorICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKQorCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgKyspCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgLS0pCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yPDwoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgPDwgdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3I8PD0oY29uc3QgVSAmdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlIDw8PSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG90aGVyLm1WYWx1ZSAtIG1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gVChtVmFsdWUgLSBvdGhlci5tVmFsdWUpIDwgSEFMRl9SQU5HRTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWUgPT0gb3RoZXIubVZhbHVlOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKnRoaXMgPD0gb3RoZXIgJiYgKnRoaXMgIT0gb3RoZXI7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA+PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKyhjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiArIGE7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3ItKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBjMl9jbnRyX3Q8VD4oYSkgLSBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKihjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiAqIGE7Cit9CisKK3R5cGVkZWYgYzJfY250cl90PHVpbnQzMl90PiBjMl9jbnRyMzJfdDsgLyoqIDMyLWJpdCBjb3VudGVyIHR5cGUgKi8KK3R5cGVkZWYgYzJfY250cl90PHVpbnQ2NF90PiBjMl9jbnRyNjRfdDsgLyoqIDY0LWJpdCBjb3VudGVyIHR5cGUgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBzdHJ1Y3QgYzJfdHlwZXM7CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgYSBzaW5nbGUgdHlwZSAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBjMl90eXBlczxUPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlIHdpZGVfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBtaW5fdHlwZTsgLy8gdHlwZSBmb3IgbWluKFQuLi4pCit9OworCisvKiogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB0eXBlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBjMl90eXBlczxULCBVPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJtaXhpbmcgZmxvYXRpbmcgcG9pbnQgYW5kIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPT0gc3RkOjppc19zaWduZWQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIGRlY2x0eXBlKHRydWUgPyBzdGQ6OmRlY2x2YWw8VD4oKSA6IHN0ZDo6ZGVjbHZhbDxVPigpKT46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKFQpIDwgc2l6ZW9mKFUpLCBULCBVPjo6dHlwZT46OnR5cGUgbmFycm93X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCB3aWRlX3R5cGUsIG5hcnJvd190eXBlPjo6dHlwZSBtaW5fdHlwZTsKK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcy4gT25seSBzdXBwb3J0cyBzaW1pbGFyIGNsYXNzZXMsIHN1Y2ggYXM6CisgKiAtIGFsbCBmbG9hdGluZyBwb2ludAorICogLSBhbGwgdW5zaWduZWQvYWxsIHNpZ25lZAorICogLSBhbGwgcG9pbnRlcgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorc3RydWN0IGMyX3R5cGVzPFQsIFUsIFYuLi4+IHsKKyAgICAvKiogQ29tbW9uIHR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgYWxsIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIC8qKiBOYXJyb3dlc3QgdHlwZSBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om5hcnJvd190eXBlLCBWLi4uPjo6bmFycm93X3R5cGUgbmFycm93X3R5cGU7CisgICAgLyoqIFR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpbnB1dCBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSwgVi4uLj46Om1pbl90eXBlIG1pbl90eXBlOworfTsKKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWF4IHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Citjb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSBjMl9tYXgoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeyB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21heChiLCBjLi4uKSk7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBsaXN0IG9mICJzaW1pbGFybHkgdHlwZWQiIHZhbHVlcy4KKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdGQ6Om1pbiB3aGVyZSB0aGUgdHlwZXMgZG8gbm90IGhhdmUgdG8gYmUgaWRlbnRpY2FsLCBhbmQgdGhlIHNtYWxsZXN0CisgKiByZXN1bHRpbmcgdHlwZSBpcyB1c2VkIHRoYXQgYWNjb21tb2RhdGVzIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAqCisgKiBcbm90ZSBWYWx1ZSB0eXBlcyBtdXN0IGJlIHNpbWlsYXIsIGUuZy4gYWxsIGZsb2F0aW5nIHBvaW50LCBhbGwgcG9pbnRlcnMsIGFsbCBzaWduZWQsIG9yIGFsbAorICogdW5zaWduZWQuCisgKgorICogQHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIC4uLiBjKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxVLCBWLi4uPjo6bWluX3R5cGUgcmVzdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgcmVzdF90eXBlPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhjMl9taW4oYiwgYy4uLikpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+OjptaW5fdHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOworICAgIH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlIGMyX2NsYW1wKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFY+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpLCBjXyhjKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVj46OndpZGVfdHlwZT4oYl8gPCBhXyA/IGFfIDogYl8gPiBjXyA/IGNfIDogYl8pOworICAgIH0pOworfQorCisvLy8gQH0KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzczw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPCByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzc19lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPD0gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXI8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID4gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXJfZXF1YWw8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID49IHJoLnBlZWt1KCk7CisgICAgfQorfTsKKworI2VuZGlmICAvLyBDMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKQEAgLTAsMCArMSwyMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9IXworI2RlZmluZSBDMkJVRkZFUl9IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+IC8vIGZvciBDMkluZm8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJCdWZmZXIuaD4KKyNlbHNlCisKK3R5cGVkZWYgdm9pZCogQzJIYW5kbGU7CisKKyNlbmRpZgorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlciBCdWZmZXJzCisvLy8gQHsKKworLy8vIFxkZWZncm91cCBidWZmZXJfc3luYyBTeW5jaHJvbml6YXRpb24KKy8vLyBAeworCisvKioKKyAqIFN5bmNocm9uaXphdGlvbiBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZXZlbnQgYW5kIGZlbmNlIG9iamVjdHMuCisgKgorICogVGhlc2UgYXJlIGNyb3NzLXByb2Nlc3MgZXh0ZW5zaW9ucyBvZiBwcm9taXNlL2Z1dHVyZSBpbmZyYXN0cnVjdHVyZS4KKyAqIEV2ZW50cyBhcmUgYW5hbG9nb3VzIHRvIHN0ZDo6cHJvbWlzZTx2b2lkPiwgd2hlcmVhcyBmZW5jZXMgYXJlIHRvIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPi4KKyAqCisgKiBGZW5jZXMgYW5kIGV2ZW50cyBhcmUgc2hhcmVhYmxlL2NvcHlhYmxlLgorICoKKyAqIEZlbmNlcyBhcmUgdXNlZCBpbiB0d28gc2NlbmFyaW9zLCBhbmQgYWxsIGNvcGllZCBpbnN0YW5jZXMgcmVmZXIgdG8gdGhlIHNhbWUgZXZlbnQuCisgKiBcdG9kbyBkbyBldmVudHMgbmVlZCB0byBiZSBjb3B5YWJsZSBvciBzaG91bGQgdGhleSBiZSB1bmlxdWU/CisgKgorICogYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdDogc2lnbmFsZWQgd2hlbiBpdCBpcyBzYWZlIGZvciB0aGUgY29tcG9uZW50IG9yIGNsaWVudCB0byBhY2Nlc3MKKyAqICh0aGUgY29udGVudHMgb2YpIGFuIG9iamVjdC4KKyAqCisgKiByZWxlYXNlIHN5bmMgZmVuY2Ugb2JqZWN0OiBcdG9kbworICoKKyAqIEZlbmNlcyBjYW4gYmUgYmFja2VkIGJ5IGhhcmR3YXJlLiBIYXJkd2FyZSBmZW5jZXMgYXJlIGd1YXJhbnRlZWQgdG8gc2lnbmFsIE5PIE1BVFRFUiBXSEFUIHdpdGhpbgorICogYSBzaG9ydCAocGxhdGZvcm0gc3BlY2lmaWMpIGFtb3VudCBvZiB0aW1lOyB0aGlzIGd1YXJhbnRlZSBpcyB1c3VhbGx5IGxlc3MgdGhhbiAxNSBtc2Vjcy4KKyAqLworCisvKioKKyAqIEZlbmNlIG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgd2FpdGluZyBmb3IgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdmdXR1cmUnLgorICoKKyAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHZlbmRvcnMgaWYgdXNpbmcgSFcgZmVuY2VzLgorICovCitjbGFzcyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBXYWl0cyBmb3IgYSBmZW5jZSB0byBiZSBzaWduYWxlZCB3aXRoIGEgdGltZW91dC4KKyAgICAgKgorICAgICAqIFx0b2RvIGEgbWVjaGFuaXNtIHRvIGNhbmNlbCBhIHdhaXQgLSBmb3Igbm93IHRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGlzIHRvIGFiYW5kb24gdGhlCisgICAgICogZXZlbnQsIGJ1dCBmZW5jZXMgYXJlIHNoYXJlZCBzbyBjYW5jZWxpbmcgYSB3YWl0IHdpbGwgY2FuY2VsIGFsbCB3YWl0cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0aW1lb3V0TnMgICAgICAgICAgIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBuc2VjcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgZmVuY2UgaGFzIG5vdCBiZWVuIHNpZ25hbGVkIHdpdGhpbiB0aGUgdGltZW91dAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGFzIGJlZW4gYWJhbmRvbmVkIHdpdGhvdXQgYmVpbmcgc2lnbmFsZWQgKGl0IHdpbGwgbmV2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2lnbmFsZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gd2FpdCBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHdhaXRpbmcgZm9yIHRoZSBmZW5jZSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBpcyB2YWxpZCAoaWYgdGhlcmUgaXMgYSBjaGFuY2UgZm9yIGl0IHRvIGJlIHNpZ25hbGVkLikKKyAgICAgKiBBIGZlbmNlIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgY29udHJvbGluZyBldmVudCBpcyBkZXN0cm95ZWQgd2l0aG91dCBpdCBzaWduYWxpbmcgdGhlIGZlbmNlLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBib29sIHZhbGlkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQgKGlzIHJlYWR5KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICovCisgICAgYm9vbCByZWFkeSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoaXMgZmVuY2UgaW4gYSBzZWxlY3Qgc3lzdGVtIGNhbGwuCisgICAgICogXG5vdGUgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciwgaWYgdmFsaWQsIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGUuZy4gcG9sbCgpIHN5c3RlbSBjYWxscy4gVGhpcyBmaWxlIGJlY29tZXMgcmVhZGFibGUgKFBPTExJTikgd2hlbiB0aGUKKyAgICAgKiBmZW5jZSBpcyBzaWduYWxlZCwgYW5kIGJhZCAoUE9MTEVSUikgaWYgdGhlIGZlbmNlIGlzIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgZmVuY2UgKHdpdGggb3duZXJzaGlwKSwgb3IgLTEgaWYgdGhlIGZlbmNlCisgICAgICogaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoXHRvZG8gb3IgYWJhbmRvbmVkKS4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggZmVuY2VzIHVzZWQgYnkgZ3JhbGxvYworICAgICAqLworICAgIGludCBmZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgYSBoYXJkd2FyZS1iYWNrZWQgZmVuY2UuCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkd2FyZSBmZW5jZQorICAgICAqLworICAgIGJvb2wgaXNIVygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogTnVsbC1mZW5jZS4gQSBmZW5jZSB0aGF0IGhhcyBmaXJlZC4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJGZW5jZSgpIDogbUltcGwobnVsbHB0cikgeyB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgQzJGZW5jZShzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZnJpZW5kIHN0cnVjdCBfQzJGZW5jZUZhY3Rvcnk7Cit9OworCisvKioKKyAqIEV2ZW50IG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgc2lnbmFsaW5nIG9mIGFuIGV2ZW50LCBhbmFsb2dvdXMgdG8gYSAncHJvbWlzZScuCisgKgorICogSGFyZHdhcmUgYmFja2VkIGV2ZW50cyBkbyBub3QgZ28gdGhyb3VnaCB0aGlzIG9iamVjdCwgYW5kIG11c3QgYmUgZXhwb3NlZCBkaXJlY3RseSBhcyBmZW5jZXMKKyAqIGJ5IHZlbmRvcnMuCisgKi8KK2NsYXNzIEMyRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmZW5jZSBmb3IgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIChhbGwpIGFzc29jaWF0ZWQgZmVuY2UocykuCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBzaWduYWwgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHNpZ25hbGluZyB0aGUgZmVuY2UocykgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmlyZSgpOworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGlzIGV2ZW50IGZyb20gdGhlIG1lcmdpbmcgb2YgdGhlIHN1cHBsaWVkIGZlbmNlcy4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgKiBhYmFuZG9uZWQgaWYgYW55IG9mIHRoZXNlIGZlbmNlcyBoYXZlIGJlZW4gYWJhbmRvbmVkLCBhbmQgaXQgd2lsbCBiZSBmaXJlZCBpZiBhbGwgb2YgdGhlc2UKKyAgICAgKiBmZW5jZXMgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBtZXJnaW5nIHdhcyBzdWNjZXNzZnVsbHkgZG9uZQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBtZXJnaW5nCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZSBoYXZlIGFscmVhZHkgYmVlbiBtZXJnZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIGFiYW5kb25lZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIG1lcmdlIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBtZXJnaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBtZXJnZShzdGQ6OnZlY3RvcjxDMkZlbmNlPiBmZW5jZXMpOworCisgICAgLyoqCisgICAgICogQWJhbmRvbnMgdGhlIGV2ZW50IGFuZCBhbnkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBcbm90ZSBDYWxsIHRoaXMgdG8gZXhwbGljaXRseSBhYmFuZG9uIGFuIGV2ZW50IGJlZm9yZSBpdCBpcyBkZXN0cnVjdGVkIHRvIGF2b2lkIGEgd2FybmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgaGFzIG5vIGVmZmVjdCBubyBlZmZlY3QgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNpZ25hbGVkIG9yIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2Uocykgd2VyZSBzdWNjZXNzZnVsbHkgc2lnbmFsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlKHMpIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gYWJhbmRvbiB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgYnVmX2ludGVybmFsIEludGVybmFsCisvLy8gQHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBlbmNhcHN1bGF0ZSBhbiB1cGRhdGFibGUgc3RhdHVzIHZhbHVlLgorICovCitzdHJ1Y3QgX0MySW5uYXRlU3RhdHVzIHsKKyAgICBpbmxpbmUgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcm90ZWN0ZWQ6CisgICAgX0MySW5uYXRlU3RhdHVzKGMyX3N0YXR1c190IHN0YXR1cykgOiBtU3RhdHVzKHN0YXR1cykgeyB9CisKKyAgICBjMl9zdGF0dXNfdCBtU3RhdHVzOyAvLyB0aGlzIHN0YXR1cyBpcyB1cGRhdGFibGUgYnkgdGhlIG9iamVjdAorfTsKKworLy8vIEB9CisKKy8qKgorICogVGhpcyBpcyBhIHV0aWxpdHkgdGVtcGxhdGUgZm9yIG9iamVjdHMgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UsIHNvIHRoYXQgZXJyb3JzIGR1cmluZworICogYWNxdWlyaW5nIHRoZSBvYmplY3QgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkFjcXVpcmFibGUgOiBwdWJsaWMgQzJGZW5jZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIG9iamVjdCBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZS4gQW55IGVycm9ycyBkdXJpbmcgdGhlIG1hcHBpbmcgd2lsbCBiZQorICAgICAqIHBhc3NlZCB0byB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogXHJldHVybiBhY3F1aXJlZCBvYmplY3QgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgaWYgd2FpdGluZyBmb3IgdGhlIGZlbmNlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBUIGdldCgpIHsKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gd2FpdCgpOworICAgICAgICByZXR1cm4gbVQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJBY3F1aXJhYmxlKGMyX3N0YXR1c190IGVycm9yLCBDMkZlbmNlIGZlbmNlLCBUIHQpIDogQzJGZW5jZShmZW5jZSksIG1Jbml0aWFsRXJyb3IoZXJyb3IpLCBtVCh0KSB7IH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdGlhbEVycm9yOworICAgIFQgbVQ7IC8vIFRPRE86IG1vdmUgaW5zdGVhZCBvZiBjb3B5Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBsaW5lYXIgTGluZWFyIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIExJTkVBUiBBU1BFQ1RTLCBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNpYyBzZWdtZW50IG1hdGggc3VwcG9ydC4KKyAqLworc3RydWN0IEMyU2VnbWVudCB7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHNpemU7CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCh1aW50MzJfdCBvZmZzZXRfLCB1aW50MzJfdCBzaXplXykKKyAgICAgICAgOiBvZmZzZXQob2Zmc2V0XyksCisgICAgICAgICAgc2l6ZShzaXplXykgeworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IH5zaXplOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiAhaXNFbXB0eSgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhYm9vbCgqdGhpcyk7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgY29udGFpbnMoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoIWlzVmFsaWQoKSB8fCAhb3RoZXIuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IG90aGVyLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgKyBzaXplID49IG90aGVyLm9mZnNldCArIG90aGVyLnNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPT0gb3RoZXIub2Zmc2V0ICYmIHNpemUgPT0gb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcikgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIHNpemU7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBpbnRlcnNlY3QoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGVuZCgpLCBvdGhlci5lbmQoKSkgLSBjMl9tYXgob2Zmc2V0LCBvdGhlci5vZmZzZXQpKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBvZmZzZXQgaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG9mZnNldCwgYzJfbWF4KG9mZnNldCwgZW5kKCkpIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBtYXggaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgc2F0dXJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9taW4oc2l6ZSwgfm9mZnNldCkpOworICAgIH0KKworfTsKKworLyoqCisgKiBDb21tb24gYXNwZWN0IGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKi8KK2NsYXNzIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBMaW5lYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIEMyU2VnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudCgwLCBtQ2FwYWNpdHkpOworICAgIH0KKworcHJvdGVjdGVkOgorCisjaWYgVUlOVFBUUl9NQVggPT0gMHhmZmZmZmZmZgorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSwgInNpemVfdCBpcyB0b28gYmlnIik7CisjZWxzZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBzbWFsbCIpOworICAgIC8vIGV4cGxpY2l0bHkgZGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBzaXplX3QKKyAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Qoc2l6ZV90IGNhcGFjaXR5KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgIDogbUNhcGFjaXR5KGNhcGFjaXR5KSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBjb25zdGV4cHIgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBtQ2FwYWNpdHkocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FwYWNpdHk7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciByYW5nZSBpbnNpZGUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldCArIG1TaXplOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG1PZmZzZXQsIG1TaXplKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gc3VicmFuZ2Ugb2YgY2FwYWNpdHkgWzAsIGNhcGFjaXR5XSAmIFtzaXplLCBzaXplICsgb2Zmc2V0XQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QodWludDMyX3QgY2FwYWNpdHlfLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjYXBhY2l0eV8pLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIChubyBlcnJvciBjaGVjaykKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZvdGhlcikKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChvdGhlci5jYXBhY2l0eSgpKSwKKyAgICAgICAgICBtT2Zmc2V0KG90aGVyLm9mZnNldCgpKSwKKyAgICAgICAgICBtU2l6ZShvdGhlci5zaXplKCkpIHsKKyAgICB9CisKKyAgICAvLyBwYXJlbnQgY2FwYWNpdHkgcmFuZ2UgWzAsIGNhcGFjaXR5XQorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoMCksCisgICAgICAgICAgbVNpemUoY2FwYWNpdHkoKSkgeworICAgIH0KKworICAgIC8vIHN1YnJhbmdlIG9mIHBhcmVudCBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKKyAgICAvLyBzdWJzZWN0aW9uIG9mIHRoZSBwYXJlbnQncyBhbmQgW29mZnNldCwgb2Zmc2V0ICsgc2l6ZV0gcmFuZ2VzCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKGMyX21heChvZmZzZXQsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+b2Zmc2V0KCkpLCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoc3RkOjptaW4oYzJfbWluKHNpemUsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+c2l6ZSgpKSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpKSB7CisgICAgfQorCitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCBjaGlsZFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgKKyAgICAgICAgICAgIG1TaXplLAorICAgICAgICAgICAgYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSAtIG1PZmZzZXQsCisgICAgICAgICAgICBjMl9taW4oYzJfbWluKHNpemUsIG1TaXplKSwgY2FwYWNpdHkoKSAtIGMyX21pbihjMl9tYXgob2Zmc2V0LCBtT2Zmc2V0KSwgY2FwYWNpdHkoKSkpKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdDsKKyAgICAvLyBpbnZhcmlhbnRzIDAgPD0gbU9mZnNldCA8PSBtT2Zmc2V0ICsgbVNpemUgPD0gY2FwYWNpdHkoKQorICAgIHVpbnQzMl90IG1PZmZzZXQ7CisgICAgdWludDMyX3QgbVNpemU7CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyTGluZWFyUmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmcGFyZW50LCBvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UgaW50ZXJzZWN0KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIGNhcGFjaXR5IGFuZCByYW5nZSBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyTGluZWFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJMaW5lYXJDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpCisgICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKGNhcGFjaXR5LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSByYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYW4gZWRpdGFibGUgbGluZWFyIHJhbmdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgIHVzaW5nIF9DMkxpbmVhclJhbmdlQXNwZWN0OjpfQzJMaW5lYXJSYW5nZUFzcGVjdDsKKworcHVibGljOgorLy8vIFxuYW1lIEVkaXRhYmxlIGxpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb2Zmc2V0IHRvIHxvZmZzZXR8LCB3aGlsZSB0cnlpbmcgdG8ga2VlcCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdW5jaGFuZ2VkIChlLmcuCisgICAgICogc2l6ZSB3aWxsIGdyb3cgaWYgb2Zmc2V0IGlzIGRlY3JlYXNlZCwgYW5kIG1heSBzaHJpbmsgaWYgb2Zmc2V0IGlzIGluY3JlYXNlZC4pIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gaWYgMCA8PSB8b2Zmc2V0fCA8PSBjYXBhY2l0eSgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPiBtT2Zmc2V0ICsgbVNpemUpIHsKKyAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaXplID0gbU9mZnNldCArIG1TaXplIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0bworICAgICAqIGlmIDAgPD0gfHNpemV8IDw9IGNhcGFjaXR5KCkgLSBvZmZzZXQoKS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQorICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRTaXplKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIC0gbU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRPZmZzZXQoKSBleGNlcHQgdGhhdCBvZmZzZXQgd2lsbAorICAgICAqIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCisgICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0T2Zmc2V0X2JlKHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICAodm9pZClzZXRPZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8IHdpdGggYmVzdCBlZmZvcnQuIFNhbWUgYXMgc2V0U2l6ZSgpIGV4Y2VwdCB0aGF0IHRoZSBzZWxlY3RlZCByZWdpb24KKyAgICAgKiB3aWxsIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eSAoZS5nLiBzaXplIGlzIGNsYW1wZWQgdG8gWzAsIGNhcGFjaXR5KCkgLSBvZmZzZXQoKV0pLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplX2JlKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgbVNpemUgPSBjMl9taW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpOworICAgIH0KKy8vLyBAfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEFMTE9DQVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxpbmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiAgQWxsb2NhdG9ycyBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFsbG9jYXRlIG1lbW9yeSAoYWxsb2NhdGlvbnMpIGZvciBidWZmZXJzLiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIDFEIG9yIDJEIGFsbG9jYXRpb25zLgorICoKKyAqICBcbm90ZSBJbiB0aGVvcnkgdGhleSBjb3VsZCBzdXBwb3J0IGJvdGgsIGJ1dCBpbiBwcmFjdGljZSwgd2Ugd2lsbCB1c2Ugb25seSBvbmUgb3IgdGhlIG90aGVyLgorICoKKyAqICBOZXZlciBjb25zdHJ1Y3RlZCBvbiBzdGFjay4KKyAqCisgKiAgQWxsb2NhdG9ycyBhcmUgcHJvdmlkZWQgYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRvciBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgaWRfdDsKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIEJBRF9JRCA9IDB4QkFERCwgLy8gaW52YWxpZCBhbGxvY2F0b3IgSUQKKyAgICB9OworCisgICAgLyoqCisgICAgICogQWxsb2NhdGlvbiB0eXBlcy4gVGhpcyBpcyBhIGJpdG1hc2sgYW5kIGlzIHVzZWQgaW4gQzJBbGxvY2F0b3I6OkluZm8KKyAgICAgKiB0byBsaXN0IHRoZSBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcyBvZiBhbiBhbGxvY2F0b3IuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIExJTkVBUiAgPSAxIDw8IDAsIC8vCisgICAgICAgIEdSQVBISUMgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGFuIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEFsbG9jYXRvcnMgZG9uJ3QgaGF2ZSBhIHF1ZXJ5IEFQSSBzbyBhbGwgcXVlcmlhYmxlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlLgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAgICBDMlN0cmluZyBuYW1lOyAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgbmFtZQorICAgICAgICBpZF90IGlkOyAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgSUQKKyAgICAgICAgdHlwZV90IHN1cHBvcnRlZFR5cGVzOyAgICAgIC8vLzwgc3VwcG9ydGVkIGFsbG9jYXRpb24gdHlwZXMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5pbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtaW5pbWFsbHkgcmVxdWlyZWQgZm9yIGFsbG9jYXRpb25zCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4aW11bVVzYWdlOyAvLy88IHVzYWdlIHRoYXQgaXMgbWF4aW1hbGx5IGFsbG93ZWQgZm9yIGFsbG9jYXRpb25zCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBhbGxvY2F0b3IgZnJvbSB0aGUKKyAgICAgKiBhbGxvY2F0b3Igc3RvcmUsIGFuZCB0byBpZGVudGlmeSB0aGlzIGFsbG9jYXRvciBhY3Jvc3MgYWxsIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuCisgICAgICovCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIHRyYWl0cy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgZnVsbC1mbGVkZ2VkIHF1ZXJ5IEFQSSwgb25seSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYWxsb2NhdG9yIGluZm9ybWF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSAxRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICogc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgIHRoZSBzaXplIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDFEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSB8aGFuZGxlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkCisgICAgICogaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLiBPbiBzdWNjZXNzLCB0aGUgYWxsb2NhdGlvbiB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRha2Ugb3duZXJzaGlwIG9mIHxoYW5kbGV8LgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHJlY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSByZWNyZWF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDJEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFRoaXMgY291bGQgYmUgYSB2ZW5kb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBhbGxvY2F0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDJEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSBoYW5kbGUuICBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjcmVhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK3Byb3RlY3RlZDoKKyAgICBDMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogXGluZ3JvdXAgbGluZWFyIGFsbG9jYXRvcgorICogMUQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbiBzdGFydGluZyBmcm9tIHxvZmZzZXR8IHdpdGggfHNpemV8IGludG8gbG9jYWwgcHJvY2VzcyBtZW1vcnkuCisgICAgICogU3RvcmVzIHRoZSBzdGFydGluZyBhZGRyZXNzIGludG8gfGFkZHJ8LCBvciBOVUxMIGlmIHRoZSBvcGVyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKiB8ZmVuY2V8IHdpbGwgY29udGFpbiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5CisgICAgICogc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGNvbnRhaW4gYW4gZW1wdHkgKGFscmVhZHkgZmlyZWQpIGZlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgICAgICAgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHBvcnRpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwYWdlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBwYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb3J0aW9uIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKgorICAgICAqIFx0b2RvIE9ubHkgb25lIHBvcnRpb24gY2FuIGJlIG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lIC0gdGhpcyBpcyB0cnVlIGZvciBncmFsbG9jLCBidXQgdGhlcmUKKyAgICAgKiAgICAgICBpcyBubyBuZWVkIGZvciB0aGlzIGZvciAxRCBidWZmZXJzLgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW5jIG9wZXJhdGlvbiBhcyB3ZSBjb3VsZCBqdXN0IHdhaXQgZm9yIHRoZSBmZW5jZT8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgaWYgdGhlIGFsbG9jYXRpb24gaXMgYWxyZWFkeSBtYXBwZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChvZmZzZXQvc2l6ZSkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovLAorICAgICAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxzaXplfC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgbWFwcGVkIHJlZ2lvbgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyB1bm1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhIHJlbGVhc2UgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eSBmZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIFRoaXMgZmVuY2Ugc2lnbmFscyB3aGVuIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGNvbnRhaW5zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCB0byB0aGUgbWFwcGVkIHJlZ2lvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdGlvbiB3YXMgbm90IG1hcHBlZCBwcmV2aW91c2x5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChhZGRyL3NpemUpIGRvIG5vdCBjb3JyZXNwb25kIHRvIHByZXZpb3VzbHkgbWFwcGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgcG9ydGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gXHRvZG8gc2hvdWxkIHdlIGxpbWl0IGFsbG9jYXRpb24gZGlyZWN0bHk/CisgICAgQzJMaW5lYXJBbGxvY2F0aW9uKHNpemVfdCBjYXBhY2l0eSkgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIFVJTlQzMl9NQVgpKSB7fQorICAgIHZpcnR1YWwgfkMyTGluZWFyQWxsb2NhdGlvbigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ2lyY3VsYXJCbG9jazsKK2NsYXNzIEMyTGluZWFyQmxvY2s7CitjbGFzcyBDMkdyYXBoaWNCbG9jazsKKworLyoqCisgKiAgQmxvY2sgcG9vbHMgYXJlIHVzZWQgYnkgY29tcG9uZW50cyB0byBvYnRhaW4gb3V0cHV0IGJ1ZmZlcnMgaW4gYW4gZWZmaWNpZW50IHdheS4gVGhleSBjYW4KKyAqICBzdXBwb3J0IGVpdGhlciBsaW5lYXIgKDFEKSwgY2lyY3VsYXIgKDFEKSBvciBncmFwaGljICgyRCkgYmxvY2tzLgorICoKKyAqICBCbG9jayBwb29scyBkZWNvdXBsZSB0aGUgcmVjeWNsaW5nIG9mIG1lbW9yeS9hbGxvY2F0aW9ucyBmcm9tIHRoZSBjb21wb25lbnRzLiBUaGV5IGFyZSBtZWFudCB0bworICogIGJlIGFuIG9wYXF1ZSBzZXJ2aWNlICh0aGVyZSBhcmUgbm8gcHVibGljIEFQSXMgb3RoZXIgdGhhbiBvYnRhaW5pbmcgYmxvY2tzKSBwcm92aWRlZCBieSB0aGUKKyAqICBwbGF0Zm9ybS4gQmxvY2sgcG9vbHMgYXJlIGFsc28gbWVhbnQgdG8gZGVjb3VwbGUgYWxsb2NhdGlvbnMgZnJvbSBtZW1vcnkgdXNlZCBieSBidWZmZXJzLiBUaGlzCisgKiAgaXMgYWNjb21wbGlzaGVkIGJ5IGFsbG93aW5nIHBvb2xzIHRvIGFsbG90IG11bHRpcGxlIG1lbW9yeSAnYmxvY2tzJyBvbiBhIHNpbmdsZSBhbGxvY2F0aW9uLiBBcworICogIHRoZWlyIG5hbWUgc3VnZ2VzdCwgYmxvY2sgcG9vbHMgbWFpbnRhaW4gYSBwb29sIG9mIG1lbW9yeSBibG9ja3MuIFdoZW4gYSBjb21wb25lbnQgYXNrcyBmb3IKKyAqICBhIG1lbW9yeSBibG9jaywgcG9vbHMgd2lsbCB0cnkgdG8gcmV0dXJuIGEgZnJlZSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBpbiB0aGUgcG9vbC4gSWYgbm8gc3VjaAorICogIGJsb2NrIGV4aXN0cywgdGhleSB3aWxsIGFsbG9jYXRlIG1lbW9yeSB1c2luZyB0aGUgYmFja2luZyBhbGxvY2F0b3IgYW5kIGFsbG90IGEgYmxvY2sgb24gdGhhdAorICogIGFsbG9jYXRpb24uIFdoZW4gYmxvY2tzIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgc3lzdGVtLCB0aGV5IGFyZSByZWN5Y2xlZCBiYWNrIHRvIHRoZSBibG9jaworICogIHBvb2wgYW5kIGFyZSBhdmFpbGFibGUgYXMgZnJlZSBibG9ja3MuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICovCitjbGFzcyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmxvY2sgcG9vbCBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDY0X3QgbG9jYWxfaWRfdDsKKworICAgIGVudW0gOiBsb2NhbF9pZF90IHsKKyAgICAgICAgQkFTSUNfTElORUFSID0gMCwgIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAxRCBibG9ja3MKKyAgICAgICAgQkFTSUNfR1JBUEhJQyA9IDEsIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAyRCBibG9ja3MKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhpcyBibG9jayBwb29sLiBUaGlzIElEIGlzIHVzZWQgdG8gZ2V0IHRoaXMgYmxvY2sgcG9vbCBmcm9tIHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBsb2NhbCBJRCBmb3IgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGxpbmVhciB3cml0ZWFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlCisgICAgICogYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wuIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBibG9jay4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGNpcmN1bGFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGNpcmN1bGFyIGJsb2NrLiAobm90ZTogdGhlIHNpemUgb2YgdGhlIG9idGFpbmVkCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLiB0byBhY2NvbW1vZGF0ZSBhbnkgc3lzdGVtLXJlcXVpcmVkCisgICAgICogICAgICAgICAgICAgICAgIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4KKyAgICAgKiAgICAgICAgICAgICAgIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYmxvY2suIFRoaXMgY291bGQgYmUgYSB2ZW5kb3Igc3BlY2lmaWMgZm9ybWF0LgorICAgICAqIFxwYXJhbSB1c2FnZSAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CisgICAgICogICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IDJEIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworfTsKKworLy8vIEB9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJMT0NLUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorICogQmxvY2tzIGFyZSBzZWN0aW9ucyBvZiBhbGxvY2F0aW9ucy4gVGhleSBjYW4gYmUgZWl0aGVyIDFEIG9yIDJELgorICovCisKK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDFEIGJsb2NrLgorICoKKyAqIFxub3RlIGNhcGFjaXR5KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCBzaXplKCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZQorICogdXNhYmxlIHBvcnRpb24uIFVzZSBhbmQgb2Zmc2V0KCkgYW5kIHNpemUoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrIGRpcmVjdGx5IHRocm91Z2ggaXRzIGhhbmRsZQorICogdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIHRvIHRoaXMgYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2sxRCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBoYW5kbGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIHRoYXQgdGhlIGJsb2NrIGFuZCBpdHMgYmxvY2sgcG9vbCBoYXMgc2hhcmVkIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlCisgICAgICogICAgICAgYW5kIGlmIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBibG9jayBhcmUgcmVsZWFzZWQsIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgICAgICogICAgICAgYWxsb2NhdGlvbiBtYXkgZ2V0IHJldXNlZCBldmVuIGlmIGEgY2xpZW50IGtlZXBzIGEgY2xvbmUgb2YgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgdGhhdCBjcmVhdGVkIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gZm9yIHRoaXMgYmxvY2suIFRoaXMKKyAgICAgKiBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaGFuZGxlLgorICAgICAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIC8qKiBjb25zdHJ1Y3QgYSBibG9jay4gKi8KKyAgICBDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIFJlYWQgdmlldyBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBDMlJlYWRWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgIHZpZXcuCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIEMyUmVhZFZpZXcgc3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24vbWFwcGluZyBvZiB0aGlzIHZpZXcuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoaXMgdmlldy4gVGhpcyBzZXRzIGVycm9yIHRvIEMyX05PX0lOSVQuCisgICAgICovCisgICAgLy92b2lkIHJlbGVhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKKyAgICBleHBsaWNpdCBDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgdWludDMyX3QgbU9mZnNldDsgLyoqPCBvZmZzZXQgaW50byB0aGUgbGluZWFyIGJsb2NrIGJhY2tpbmcgdGhpcyByZWFkIHZpZXcgKi8KK307CisKKy8qKgorICogV3JpdGUgdmlldyBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4gXHRvZG8gbW92YWJsZSBvbmx5PworICovCitjbGFzcyBDMldyaXRlVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBibG9jayBhdCB0aGUgY3VycmVudCBvZmZzZXQgb3IgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgKiAgICAgICAgIFRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhpcyB2aWV3IG9yIHVudGlsIGl0IGlzIHJlbGVhc2VkLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZXhwbGljaXQgQzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBsaW5lYXIgYmxvY2sgKHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbikgd2l0aCBhbiBhY3F1aXJlIGZlbmNlLgorICogQmxvY2tzIGFyZSB1bm1hcHBlZCB3aGVuIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbWFwcGVkIGludG8gYSByZWFkIHZpZXcgb24gZGVtYW5kLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUgYW5kIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0aW9uIHRoYXQgaXQgaXMgYmFzZWQgb24uCisgKi8KK2NsYXNzIEMyQ29uc3RMaW5lYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgYmxvY2suCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGluZWFyIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc3ViQmxvY2soc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmb3IgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmZW5jZSB0aGF0IG11c3QgYmUgd2FpdGVkIG9uIGJlZm9yZSByZWFkaW5nIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3QgeyByZXR1cm4gbUZlbmNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBtRmVuY2UpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIEMyRmVuY2UgbUZlbmNlOworfTsKKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaXMgYSB3cml0ZWFibGUgMUQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0cyB3aXRoCisgKiBjb25zdW1lcnMvcmVhZGVycyBhcyByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrKHMpLgorICovCitjbGFzcyBDMkxpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdExpbmVhckJsb2NrIHNoYXJlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworcHJvdGVjdGVkOgorICAgIEMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ0lSQ1VMQVIgQkxPQ0tTIEFORCBWSUVXUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLyBcZGVmZ3JvdXAgY2lyY3VsYXIgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQKKy8vLyBAeworCisvKioKKyAqIENpcmN1bGFyIGJsb2NrcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gYSB3cml0ZXIgYW5kIGEgcmVhZGVyIChhbmQvb3Igb3RoZXIgY29uc3VtZXJzKS0KKyAqIGluIGEgbWVtb3J5LWVmZmljaWVudCB3YXkgYnkgcmV1c2luZyBhIHNlY3Rpb24gb2YgbWVtb3J5LiBDaXJjdWxhciBibG9ja3MgYXJlIGEgYml0IG1vcmUgY29tcGxleAorICogdGhhbiBzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgc2NoZW1lcyB0byBmYWNpbGl0YXRlIGJsb2NrLWJhc2VkIGNvbnN1bWluZyBvZiBkYXRhLgorICoKKyAqIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOgorICoKKyAqIDEpIG9uZSB3cml0ZXIgdGhhdCBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZCAodGhpcyBtb2RlbCBjYW4gYmUgdXNlZCBieSBjb21wb25lbnRzKQorICoKKyAqIDIpIG9uZSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGludW91c2x5LCBhbmQgb25lIHJlYWRlciB0aGF0IGNhbiBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZAorICogICAgYnkgZnVydGhlciByZWNpcGllbnRzICh0aGlzIG1vZGVsIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGNhbm5vdCBiZSB1c2VkIGJ5IGNvbXBvbmVudHMuKQorICoKKyAqIENpcmN1bGFyIGJsb2NrcyBoYXZlIGZvdXIgc2VnbWVudHMgd2l0aCBydW5uaW5nIHBvaW50ZXJzOgorICogIC0gcmVzZXJ2ZWQ6IGRhdGEgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdGhlIHdyaXRlcgorICogIC0gY29tbWl0dGVkOiBkYXRhIGNvbW1pdHRlZCBieSB0aGUgd3JpdGVyIGFuZCBhdmFpbGFibGUgdG8gdGhlIHJlYWRlciAoaWYgcHJlc2VudCkKKyAqICAtIHVzZWQ6IGRhdGEgdXNlZCBieSBjb25zdW1lcnMgKGlmIHByZXNlbnQpCisgKiAgLSBhdmFpbGFibGU6IHVudXNlZCBkYXRhIGF2YWlsYWJsZSB0byBiZSByZXNlcnZlZAorICovCitjbGFzcyBDMkNpcmN1bGFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKKyAgICAvLyBUT0RPOiBhZGQgbWV0aG9kcworCitwcml2YXRlOgorICAgIHNpemVfdCBtUmVzZXJ2ZWQgX191bnVzZWQ7ICAgLy8gZW5kIG9mIHJlc2VydmVkIHNlY3Rpb24KKyAgICBzaXplX3QgbUNvbW1pdHRlZCBfX3VudXNlZDsgIC8vIGVuZCBvZiBjb21taXR0ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtVXNlZCBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIHVzZWQgc2VjdGlvbgorICAgIHNpemVfdCBtRnJlZSBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIGZyZWUgc2VjdGlvbgorfTsKKworY2xhc3MgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50CisgICAgICovCisgICAgc2l6ZV90IGF2YWlsYWJsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciB0aGlzIHNlZ21lbnQgZnJvbSBpdHMgY3VycmVudCBzdGFydC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIGRlc2lyZWQgc3BhY2UgaW4gYnl0ZXMKKyAgICAgKiBccGFyYW0gZmVuY2UgICBhIHBvaW50ZXIgdG8gYW4gYWNxdWlyZSBmZW5jZS4gSWYgbm9uLW51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBhc3luY2hyb25vdXMgYW5kCisgICAgICogICAgICAgICAgICAgIGEgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSB0aGF0IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiB0aGUgcmVzZXJ2YXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgICAgY29tcGxldGUuIElmIG51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgc3BhY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICB0aGUgc3BhY2UgcmVxdWVzdGVkIGNhbm5vdCBiZSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgcmVzZXJ2YXRpb24gdGltZWQgb3V0IFx0b2RvIHdoZW4/CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXJ2aW5nIHNwYWNlLiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZXNlcnZlKHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50LiBUaGlzIHdpbGwgbW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWJhbmRvbgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYWJhbmRvbmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGFiYW5kb25pbmcgdGhlIGRhdGEgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgYWJhbmRvbihzaXplX3Qgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTaGFyZSBhIHBvcnRpb24gYXMgYmxvY2socykgd2l0aCBjb25zdW1lcnMgKHRoZXNlIGFyZSBtb3ZlZCB0byB0aGUgdXNlZCBzZWN0aW9uKS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICogXG5vdGUgU2hhcmUgZG9lcyBub3QgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LiAoXHRvZG8gYWRkIGFiYW5kb24vb2Zmc2V0PykKKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBzaGFyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWN0aW9uCisgICAgICogXHBhcmFtIGJsb2NrcyAgdmVjdG9yIHdoZXJlIHRoZSBibG9ja3Mgb2YgdGhlIHNlY3Rpb24gYXJlIGFwcGVuZGVkIHRvCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHBvcnRpb24gd2FzIHN1Y2Nlc3NmdWxseSBzaGFyZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gc2hhcmUgdGhlIHBvcnRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2hhcmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzaGFyZShzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSwgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlZ2lubmluZyBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgYmVnaW4oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVuZCBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgZW5kKCk7Cit9OworCisvKioKKyAqIEEgY2lyY3VsYXIgd3JpdGUtdmlldyBpcyBhIGR5bmFtaWMgbWFwcGVkIHZpZXcgZm9yIGEgc2VnbWVudCBvZiBhIGNpcmN1bGFyIGJsb2NrLiBDYXJlIG11c3QgYmUKKyAqIHRha2VuIHdoZW4gdXNpbmcgdGhpcyB2aWV3IHNvIHRoYXQgb25seSB0aGUgc2VjdGlvbiBvd25lZCBieSB0aGUgc2VnbWVudCBpcyBtb2RpZmllZC4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrLgorICAgICAqIFxub3RlIHRoZSBzZWdtZW50IGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmJhc2UoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworfTsKKworLyoqCisgKiBUaGUgd3JpdGVyIG9mIGEgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIENhbiBjb21taXQgZGF0YSB0byBhIHJlYWRlciAobm90IHN1cHBvcnRlZCBmb3IgY29tcG9uZW50cykgT1Igc2hhcmUgZGF0YSBibG9ja3MgZGlyZWN0bHkgd2l0aCBhCisgKiBjb25zdW1lci4KKyAqCisgKiBJZiBhIGNvbXBvbmVudCBzdXBwb3J0cyBvdXRwdXR0aW5nIGRhdGEgaW50byBjaXJjdWxhciBidWZmZXJzLCBpdCBtdXN0IGFsbG9jYXRlIGEgY2lyY3VsYXIKKyAqIGJsb2NrIGFuZCB1c2UgYSBjaXJjdWxhciB3cml0ZXIuCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJXcml0ZXIgOiBwdWJsaWMgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbW1pdHMgYSBwb3J0aW9uIG9mIHRoaXMgc2VnbWVudCB0byB0aGUgbmV4dCBzZWdtZW50LiBUaGlzIG1vdmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBjb21taXQgdG8gdGhlIG5leHQgc2VnbWVudAorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHVzZWQgZm9yIHRoZSBjb21taXQgKHRoZSBmZW5jZSBtdXN0IHNpZ25hbCBiZWZvcmUgdGhlIGRhdGEgaXMgY29tbWl0dGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGNvbW1pdChzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMkNpcmN1bGFyV3JpdGVWaWV3PiBtYXAoKTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGdyYXBoaWMgR3JhcGhpYyBEYXRhIEJsb2NrcworLy8vIEB7CisKKy8qKgorICogQzJSZWN0OiByZWN0YW5nbGUgdHlwZSB3aXRoIG5vbi1uZWdhdGl2ZSBjb29yZGluYXRlcy4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KKyAqLworc3RydWN0IEMyUmVjdCB7CisvLyBwdWJsaWM6CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QoKQorICAgICAgICA6IEMyUmVjdCgwLCAwLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiBDMlJlY3Qod2lkdGhfLCBoZWlnaHRfLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBDMlJlY3QgaW5saW5lIGF0KHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3Qod2lkdGgsIGhlaWdodCwgbGVmdF8sIHRvcF8pOworICAgIH0KKworICAgIC8vIHV0aWxpdHkgbWV0aG9kcworCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8PSB+d2lkdGggJiYgdG9wIDw9IH5oZWlnaHQ7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0IDw9IG90aGVyLmxlZnQgJiYgdG9wIDw9IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiBsZWZ0ICsgd2lkdGggPj0gb3RoZXIubGVmdCArIG90aGVyLndpZHRoCisgICAgICAgICAgICAgICAgICAgICYmIHRvcCArIGhlaWdodCA+PSBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IG90aGVyLmxlZnQgJiYgdG9wID09IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiB3aWR0aCA9PSBvdGhlci53aWR0aCAmJiBoZWlnaHQgPT0gb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgcmlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkdGg7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGJvdHRvbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRvcCArIGhlaWdodDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGludGVyc2VjdChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWluKHJpZ2h0KCksIG90aGVyLnJpZ2h0KCkpIC0gYzJfbWF4KGxlZnQsIG90aGVyLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpIC0gYzJfbWF4KHRvcCwgb3RoZXIudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWF4KHRvcCwgb3RoZXIudG9wKSk7CisgICAgfQorCisgICAgLyoqIGNsYW1wcyByaWdodCBhbmQgYm90dG9tIHRvIHRvcCwgbGVmdCBpZiB0aGV5IG92ZXJmbG93ICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3Qgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KGMyX21heChsZWZ0LCByaWdodCgpKSAtIGxlZnQsIGMyX21heCh0b3AsIGJvdHRvbSgpKSAtIHRvcCwgbGVmdCwgdG9wKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIG5vdGU6IHBvdGVudGlhbGx5IHVudXN1YWwgYXJndW1lbnQgb3JkZXIKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCh1aW50MzJfdCB3aWR0aF8sIHVpbnQzMl90IGhlaWdodF8sIHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksCisgICAgICAgICAgaGVpZ2h0KGhlaWdodF8pLAorICAgICAgICAgIGxlZnQobGVmdF8pLAorICAgICAgICAgIHRvcCh0b3BfKSB7IH0KK307CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHdpZHRoIGFuZCBoZWlnaHQgKHBsYW5hciBjYXBhY2l0eSkuCisgKi8KK2NsYXNzIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX21XaWR0aDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gX21IZWlnaHQ7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJSZWN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KF9tV2lkdGgsIF9tSGVpZ2h0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCisgICAgICA6IF9tV2lkdGgod2lkdGgpLCBfbUhlaWdodChoZWlnaHQpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9tV2lkdGgocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT53aWR0aCgpKSwKKyAgICAgICAgICBfbUhlaWdodChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmhlaWdodCgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBfbVdpZHRoOworICAgIHVpbnQzMl90IF9tSGVpZ2h0OworLy8vIEB9Cit9OworCisvKioKKyAqIEMyUGxhbmVJbmZvOiBpbmZvcm1hdGlvbiBvbiB0aGUgbGF5b3V0IG9mIGEgc2luZ2UgZmxleGlibGUgcGxhbmUuCisgKgorICogUHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4KKyAqLworc3RydWN0IEMyUGxhbmVJbmZvIHsKKy8vcHVibGljOgorICAgIGVudW0gY2hhbm5lbF90IDogdWludDMyX3QgeworICAgICAgICBDSEFOTkVMX1ksICAvLy88IGx1bWEKKyAgICAgICAgQ0hBTk5FTF9SLCAgLy8vPCByZWQKKyAgICAgICAgQ0hBTk5FTF9HLCAgLy8vPCBncmVlbgorICAgICAgICBDSEFOTkVMX0IsICAvLy88IGJsdWUKKyAgICAgICAgQ0hBTk5FTF9BLCAgLy8vPCBhbHBoYQorICAgICAgICBDSEFOTkVMX0NSLCAvLy88IENyCisgICAgICAgIENIQU5ORUxfQ0IsIC8vLzwgQ2IKKyAgICB9IGNoYW5uZWw7CisKKyAgICBpbnQzMl90IGNvbEluYzsgICAgICAgLy8vPCBjb2x1bW4gaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKyAgICBpbnQzMl90IHJvd0luYzsgICAgICAgLy8vPCByb3cgaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKworICAgIHVpbnQzMl90IGNvbFNhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIHdpZHRoIChtdXN0IGJlIGEgcG93ZXIgb2YgMikKKyAgICB1aW50MzJfdCByb3dTYW1wbGluZzsgLy8vPCBzdWJzYW1wbGluZyBjb21wYXJlZCB0byBoZWlnaHQgKG11c3QgYmUgYSBwb3dlciBvZiAyKQorCisgICAgdWludDMyX3QgYWxsb2NhdGVkRGVwdGg7IC8vLzwgc2l6ZSBvZiBlYWNoIHNhbXBsZSAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDgpCisgICAgdWludDMyX3QgYml0RGVwdGg7ICAgICAgIC8vLzwgc2lnbmlmaWNhbnQgYml0cyBwZXIgc2FtcGxlCisgICAgLyoqCisgICAgICogdGhlIHJpZ2h0IHNoaWZ0IG9mIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBzYW1wbGUuIEUuZy4gaWYgYSAxMC1iaXQgc2lnbmlmaWNhbnQKKyAgICAgKiB2YWx1ZSBpcyBsYWlkIG91dCBpbiBhIDE2LWJpdCBhbGxvY2F0aW9uIGFsaWduZWQgdG8gTFNCICh2YWx1ZXMgMC0xMDIzKSwgcmlnaHRTaGlmdAorICAgICAqIHdvdWxkIGJlIDAgYXMgdGhlIDE2LWJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIHNhbXBsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJpZ2h0IHNoaWZ0ZWQKKyAgICAgKiBhbmQgY2FuIGJlIHVzZWQgYXMgaXMgKGFmdGVyIGFwcGx5aW5nIGEgMTAtYml0IG1hc2sgb2YgMHgzRkYpLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHwgICAgICBWVnxWVlZWVlZWVnwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICoKKyAgICAgKiBJZiB0aGUgdmFsdWUgaXMgbGFpZCBvdXQgYWxpZ25lZCB0byBNU0IsIHJpZ2h0U2hpZnQgd291bGQgYmUgNiwgYXMgdGhlIHZhbHVlIHJlYWQKKyAgICAgKiBmcm9tIHRoZSBhbGxvY2F0ZWQgc2FtcGxlIG11c3QgYmUgcmlnaHQtc2hpZnRlZCBieSA2IHRvIGdldCB0aGUgYWN0dWFsIHNhbXBsZSB2YWx1ZS4KKyAgICAgKgorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiB8VlZWVlZWVlZ8VlYgICAgICB8CisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqICAxNSAgICAgOCA3ICAgICAgMAorICAgICAqLworICAgIHVpbnQzMl90IHJpZ2h0U2hpZnQ7CisKKyAgICBlbnVtIGVuZGlhbm5lc3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTkFUSVZFLAorICAgICAgICBMSVRUTEVfRU5ELCAvLyBMSVRUTEVfRU5ESUFOIGlzIHJlc2VydmVkIG1hY3JvCisgICAgICAgIEJJR19FTkQsICAgIC8vIEJJR19FTkRJQU4gaXMgYSByZXNlcnZlZCBtYWNybworICAgIH0gZW5kaWFubmVzczsgLy8vPCBlbmRpYW5uZXNzIG9mIHRoZSBzYW1wbGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgZGVmaW5lIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBsYW5lcy4gSWYgbXVsdGlwbGUgcGxhbmVzIGFyZQorICAgICAqIGludGVybGVhdmVkLCB0aGV5IHNoYXJlIGEgcm9vdCBwbGFuZSAod2hpY2hldmVyIHBsYW5lJ3Mgc3RhcnQgYWRkcmVzcyBpcyB0aGUgbG93ZXN0KSwgYW5kCisgICAgICogfG9mZnNldHwgaXMgdGhlIG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSB0aGUgcm9vdCBwbGFuZSAoaW4gYnl0ZXMpLiB8cm9vdEl4fCBpcyB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUgcm9vdCBwbGFuZS4gSWYgYSBwbGFuZSBpcyBpbmRlcGVuZGVudCwgcm9vdEl4IGlzIGl0cyBpbmRleCBhbmQgb2Zmc2V0IGlzIDAuCisgICAgICovCisgICAgdWludDMyX3Qgcm9vdEl4OyAvLy88IGluZGV4IG9mIHRoZSByb290IHBsYW5lCisgICAgdWludDMyX3Qgb2Zmc2V0OyAvLy88IG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSBvZiB0aGUgcm9vdCBwbGFuZQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBzc2l6ZV90IG1pbk9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgICAgIHNzaXplX3Qgb2ZmcyA9IDA7CisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgY29sSW5jIDwgMCkgeworICAgICAgICAgICAgb2ZmcyArPSBjb2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiByb3dJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IHJvd0luYyAqIChzc2l6ZV90KShoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2ZmczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWF4T2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gKGFsbG9jYXRlZERlcHRoICsgNykgPj4gMzsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPiAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KK30gQzJfUEFDSzsKKworc3RydWN0IEMyUGxhbmFyTGF5b3V0IHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAorICAgICAgICBUWVBFX1lVViA9IDB4MTAwLCAgIC8vLzwgWVVWIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9ZVVZBLCAgICAgICAgICAvLy88IFlVVkEgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgICAgICBUWVBFX1JHQiwgICAgICAgICAgIC8vLzwgUkdCIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9SR0JBLCAgICAgICAgICAvLy88IFJCR0EgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHR5cGUKKyAgICB1aW50MzJfdCBudW1QbGFuZXM7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb21wb25lbnQgcGxhbmVzCisgICAgdWludDMyX3Qgcm9vdFBsYW5lczsgICAgICAgICAgICAvLyBudW1iZXIgb2YgbGF5b3V0IHBsYW5lcyAocm9vdCBwbGFuZXMpCisKKyAgICBlbnVtIHBsYW5lX2luZGV4X3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBMQU5FX1kgPSAwLAorICAgICAgICBQTEFORV9VID0gMSwKKyAgICAgICAgUExBTkVfViA9IDIsCisgICAgICAgIFBMQU5FX1IgPSAwLAorICAgICAgICBQTEFORV9HID0gMSwKKyAgICAgICAgUExBTkVfQiA9IDIsCisgICAgICAgIFBMQU5FX0EgPSAzLAorICAgICAgICBNQVhfTlVNX1BMQU5FUyA9IDQsCisgICAgfTsKKworICAgIEMyUGxhbmVJbmZvIHBsYW5lc1tNQVhfTlVNX1BMQU5FU107Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7Citwcml2YXRlOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Qod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgbUNyb3AoQzJSZWN0KHN0ZDo6bWluKHdpZHRoIC0gc3RkOjptaW4oY3JvcC5sZWZ0LCB3aWR0aCksIGNyb3Aud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihoZWlnaHQgLSBzdGQ6Om1pbihjcm9wLnRvcCwgaGVpZ2h0KSwgY3JvcC5oZWlnaHQpKS5hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmhlaWdodCwgaGVpZ2h0KSkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjaGlsZCBwbGFuYXIgc2VjdGlvbiBmb3IgfGNyb3B8LCB3aGVyZSB0aGUgY2FwYWNpdHkgcmVwcmVzZW50cyB0aGlzIHNlY3Rpb24uCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IGNoaWxkU2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoCisgICAgICAgICAgICAgICAgbUNyb3Aud2lkdGgsIG1Dcm9wLmhlaWdodCwKKyAgICAgICAgICAgICAgICAvLyBjcm9wIGFuZCB0cmFuc2xhdGUgfGNyb3B8IHJlY3QKKyAgICAgICAgICAgICAgICBDMlJlY3QoYzJfbWluKG1Dcm9wLnJpZ2h0KCkgLSBjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihtQ3JvcC5ib3R0b20oKSAtIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAuYXQoYzJfY2xhbXAobUNyb3AubGVmdCwgY3JvcC5sZWZ0LCBtQ3JvcC5yaWdodCgpKSAtIG1Dcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSAtIG1Dcm9wLnRvcCkpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksIG1Dcm9wKHdpZHRoKCksIGhlaWdodCgpKSB7fQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1Dcm9wKHBhcmVudCA9PSBudWxscHRyID8gQzJSZWN0KCkgOiAoKEMyUmVjdCkqcGFyZW50KS5pbnRlcnNlY3QoY3JvcCkubm9ybWFsaXplKCkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6IHBhcmVudC0+Y3JvcCgpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdDsKKyAgICBDMlJlY3QgbUNyb3A7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgc2VjdGlvbiBpbnRlcmZhY2UKKy8vLyBAeworICAgIHVzaW5nIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q6Ol9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q7CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqICBTZXRzIGNyb3AgdG8gY3JvcCBpbnRlcnNlY3RlZCB3aXRoIFsoMCwwKSAuLiAod2lkdGgsIGhlaWdodCldCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0Q3JvcF9iZShjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICAgICAgbUNyb3AubGVmdCA9IHN0ZDo6bWluKHdpZHRoKCksIGNyb3AubGVmdCk7CisgICAgICAgIG1Dcm9wLnRvcCA9IHN0ZDo6bWluKGhlaWdodCgpLCBjcm9wLnRvcCk7CisgICAgICAgIC8vIEl0J3MgZ3VhcmFudGVlZCB0aGF0IG1Dcm9wLmxlZnQgPD0gd2lkdGgoKSAmJiBtQ3JvcC50b3AgPD0gaGVpZ2h0KCkKKyAgICAgICAgbUNyb3Aud2lkdGggPSBzdGQ6Om1pbih3aWR0aCgpIC0gbUNyb3AubGVmdCwgY3JvcC53aWR0aCk7CisgICAgICAgIG1Dcm9wLmhlaWdodCA9IHN0ZDo6bWluKGhlaWdodCgpIC0gbUNyb3AudG9wLCBjcm9wLmhlaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QsIGl0IHNldHMgY3JvcCB0byBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRDcm9wKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBpZiAod2lkdGgoKSA8IGNyb3Aud2lkdGggfHwgaGVpZ2h0KCkgPCBjcm9wLmhlaWdodAorICAgICAgICAgICAgICAgIHx8IHdpZHRoKCkgLSBjcm9wLndpZHRoIDwgY3JvcC5sZWZ0IHx8IGhlaWdodCgpIC0gY3JvcC5oZWlnaHQgPCBjcm9wLnRvcCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Dcm9wID0gY3JvcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorLy8vIEB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNhZmUgcmFuZ2UgY2FsY3VsYXRpb25zIHVzaW5nIHNpemVfdC1zLgorICovCitjbGFzcyBDMlBsYW5hclNlY3Rpb24gOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24oY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KCZwYXJlbnQsIGNyb3ApIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJQbGFuYXJTZWN0aW9uKCp0aGlzLCBjcm9wKTsKKyAgICB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNpbXBsZSBhbmQgc2FmZSBwbGFuYXIgY2FwYWNpdHkgYW5kIHNlY3Rpb24gY29uc3RydWN0aW9uLgorICovCitjbGFzcyBDMlBsYW5hckNhcGFjaXR5IDogcHVibGljIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIGV4cGxpY2l0IEMyUGxhbmFyQ2FwYWNpdHkoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGMyX21pbih3aWR0aCwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oaGVpZ2h0LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uIHNlY3Rpb24oY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKworLyoqCisgKiBcaW5ncm91cCBncmFwaGljIGFsbG9jYXRvcgorICogMkQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyR3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgYSByZWN0YW5ndWxhciBzZWN0aW9uIChhcyBkZWZpbmVkIGJ5IHxyZWN0fCkgb2YgYSAyRCBhbGxvY2F0aW9uIGludG8gbG9jYWwgcHJvY2VzcworICAgICAqIG1lbW9yeSBmb3IgZmxleGlibGUgYWNjZXNzLiBPbiBzdWNjZXNzLCBpdCBmaWxscyBvdXQgfGxheW91dHwgd2l0aCB0aGUgcGxhbmUgc3BlY2lmaWNhdGlvbnMKKyAgICAgKiBhbmQgZmlsbHMgdGhlIHxhZGRyfCBhcnJheSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiBlYWNoCisgICAgICogcGxhbmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCBsZWF2ZXMgfGxheW91dHwgYW5kIHxhZGRyfCB1bnRvdWNoZWQuIHxmZW5jZXwgd2lsbCBjb250YWluCisgICAgICogYW4gYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdC4gSWYgaXQgaXMgYWxyZWFkeSBzYWZlIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBidWZmZXIgY29udGVudHMsIHRoZW4gaXQgd2lsbCBiZSBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBTYWZlIHJlZ2lvbnMgZm9yIHRoZSBwb2ludGVyIGFkZHJlc3NlcyByZXR1cm5lZCBjYW4gYmUgZ290dGVuIHZpYSBDMkxheW91dEluZm8ubWluT2Zmc2V0KCkvCisgICAgICogbWF4T2Zmc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICAgICAgICBzZWN0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyBtYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYW5kIGFjcXVpcmUgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZlbmNlIG9uIGZhaWx1cmUuIElmIG51bGwsIHRoZSBtYXBwaW5nIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICogXHBhcmFtIGxheW91dCAgICAgICAgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBtYXBwZWQgcGxhbmVzJyBkZXNjcmlwdG9ycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiBPbiBmYWlsdXJlLCBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUuCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLiBPbmx5IGxheW91dC5udW1QbGFuZXMgZWxlbWVudHMgd2lsbCBiZSBtb2RpZmllZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBzZWN0aW9uCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlcmUgaXMgYWxyZWFkeSBhIG1hcHBlZCByZWdpb24gYW5kIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG11bHRpLW1hcHBpbmcgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAocmVjdCkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFVubWFwcyBhIHNlY3Rpb24gb2YgYW4gYWxsb2NhdGlvbiBhdCB8YWRkcnwgd2l0aCB8cmVjdHwuIFRoZXNlIG11c3QgYmUgcGFyYW1ldGVycyBwcmV2aW91c2x5CisgICAgICogcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB8bWFwfDsgb3RoZXJ3aXNlLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorICAgICAqCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgbWFwcGVkIGxheWVycworICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIGJvdW5kYXJpZXMgb2YgdGhlIG1hcHBlZCBzZWN0aW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgc2VjdGlvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGVyZSBpcyBubyBzdWNoIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gdW5tYXAgdGhlIHNlY3Rpb24gKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHVzaW5nIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OjpfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdDsKKyAgICB2aXJ0dWFsIH5DMkdyYXBoaWNBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDJEIGJsb2NrLgorICoKKyAqIFxub3RlIHdpZHRoKCkvaGVpZ2h0KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCwgY3JvcCgpLndpZHRoKCkgYW5kCisgKiBjcm9wKCkuaGVpZ2h0KCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZSB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBjcm9wKCkgaWYgYWNjZXNzaW5nIHRoZSBibG9jaworICogZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlIHRvIHJlcHJlc2VudCB0aGUgYWxsb3R0ZWQgcmVnaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcworICogYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2syRCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogR3JhcGhpYyB2aWV3IHByb3ZpZGVzIHJlYWQgb3IgcmVhZC13cml0ZSBhY2Nlc3MgZm9yIGEgZ3JhcGhpYyBibG9jay4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICoKKyAqIFxub3RlIER1ZSB0byB0aGUgc3Vic2FtcGxpbmcgb2YgZ3JhcGhpYyBidWZmZXJzLCBhIHJlYWQgdmlldyBtdXN0IHN0aWxsIGNvbnRhaW4gYSBjcm9wIHJlY3RhbmdsZQorICogdG8gZW5zdXJlIHN1YnNhbXBsaW5nIGlzIGZvbGxvd2VkLiBUaGlzIHJlc3VsdHMgaW4gbmVhcmx5IGlkZW50aWNhbCBpbnRlcmZhY2UgYmV0d2VlbiByZWFkIGFuZAorICogd3JpdGUgdmlld3MsIHNvIEMyR3JhcGhpY1ZpZXcgY2FuIGVuY29tcGFzcyBib3RoIG9mIHRoZW0uCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXcgOiBwdWJsaWMgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGxheW91dCBvZiB0aGUgZ3JhcGhpYyBibG9jayB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3Agb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbiBvZiB0aGlzIHZpZXcKKyAgICAgKi8KKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKyAgICBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKyAgICBleHBsaWNpdCBDMkdyYXBoaWNWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgZ3JhcGhpYyBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdEdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCByZWN0YW5nbGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBncmFwaGljIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaXMgYSB3cml0ZWFibGUgMkQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBncmFwaGljIGJsb2NrLgorICovCitjbGFzcyBDMkdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJHcmFwaGljQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBidWZmZXJfb25qIEJ1ZmZlciBvYmplY3RzCisvLy8gQHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQlVGRkVSUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBcdG9kbzogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzPworLy8vCisvLyBUaGVyZSBhcmUgMiBraW5kcyBvZiBidWZmZXJzOiBsaW5lYXIgb3IgZ3JhcGhpYy4gTGluZWFyIGJ1ZmZlcnMgY2FuIGNvbnRhaW4gYSBzaW5nbGUgYmxvY2ssIG9yCisvLyBhIGxpc3Qgb2YgYmxvY2tzIChMSU5FQVJfQ0hVTktTKS4gU3VwcG9ydCBmb3IgbGlzdCBvZiBibG9ja3MgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYWxsb3cgY29uc3VtaW5nCisvLyBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVycyBvciBzY2F0dGVyZWQgZGF0YSBzb3VyY2VzIHdpdGhvdXQgZXh0cmEgbWVtY3B5LiBDdXJyZW50bHksIGxpc3Qgb2YKKy8vIGdyYXBoaWMgYmxvY2tzIGlzIG5vdCBzdXBwb3J0ZWQuCisKK2NsYXNzIEMyTGluZWFyQnVmZmVyOyAgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkdyYXBoaWNCdWZmZXI7ICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgorY2xhc3MgQzJMaW5lYXJDaHVua3NCdWZmZXI7CisKKy8qKgorICogQzJCdWZmZXJEYXRhOiB0aGUgbWFpbiwgbm9uLW1ldGEgZGF0YSBvZiBhIGJ1ZmZlci4gQSBidWZmZXIgY2FuIGNvbnRhaW4gZWl0aGVyIGxpbmVhciBibG9ja3MKKyAqIG9yIGdyYXBoaWMgYmxvY2tzLCBhbmQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgc2luZ2xlIGJsb2NrIG9yIG11bHRpcGxlIGJsb2Nrcy4gVGhpcyBpcyBkZXRlcm1pbmVkCisgKiBieSBpdHMgdHlwZS4KKyAqLworY2xhc3MgQzJCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgVGhlIHR5cGUgb2YgYnVmZmVyIGRhdGEuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIElOVkFMSUQsICAgICAgICAgICAgLy8vPCBpbnZhbGlkIGJ1ZmZlciB0eXBlLiBEbyBub3QgdXNlLgorICAgICAgICBMSU5FQVIsICAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBsaW5lYXIgYmxvY2sKKyAgICAgICAgTElORUFSX0NIVU5LUywgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgbGluZWFyIGJsb2NrcworICAgICAgICBHUkFQSElDLCAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBncmFwaGljIGJsb2NrCisgICAgICAgIEdSQVBISUNfQ0hVTktTLCAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvZiBtb3JlIGdyYXBoaWMgYmxvY2tzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgorICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGxpbmVhciBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7Cit9OworCisvKioKKyAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAorICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCisgKgorICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCisgKi8KK2NsYXNzIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworCisgICAgLy8vQG5hbWUgUHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uIGhhbmRsaW5nCisgICAgLy8vQHsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24ganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqT25EZXN0cm95Tm90aWZ5KSAoY29uc3QgQzJCdWZmZXIgKmJ1Ziwgdm9pZCAqYXJnKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBmb3IgYSBwcmUtZGVzdHJveSBub3RpZmljYXRpb24uIFRoaXMgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gdGhlIGRlc3RydWN0aW9uIG9mCisgICAgICogdGhpcyBidWZmZXIgKHdoZW4gdGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlZ2lzdGVyIGZvciB0aGlzIGNhbGxiYWNrCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHVucmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBub3RpZmljYXRpb24gd2FzIG5vdCBmb3VuZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGFuIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWdpc3RyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8vL0B9CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIC8vL0BuYW1lIEJ1ZmZlci1zcGVjaWZpYyBhcmJpdHJhcnkgbWV0YWRhdGEgaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBpbmZvIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2hlcyAob3IgdXBkYXRlcykgYW4gKGV4aXN0aW5nKSBtZXRhZGF0YSBmb3IgdGhpcyBidWZmZXIuCisgICAgICogSWYgdGhlIG1ldGFkYXRhIGlzIHN0cmVhbSBzcGVjaWZpYywgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZm8gTWV0YWRhdGEgdG8gdXBkYXRlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgbWV0YWRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZC91cGRhdGVkLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGF0dGFjaCB0aGUgbWV0YWRhdGEgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaWYgdGhlIHNhbWUga2luZCBvZiBtZXRhZGF0YSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBidWZmZXIpLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgY2VydGFpbiB0eXBlIG9mIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgaXMgYSBtZXRhZGF0YSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIsIGFuZCByZXR1cm5zIGEKKyAgICAgKiBzaGFyZWQgcG9pbnRlciB0byBpdCBpZiB0aGVyZSBpcy4gUmV0dXJucyBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlciBvYmplY3QgKG51bGxwdHIpIGlmIHRoZXJlCisgICAgICogaXMgbm90LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEgZnJvbSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCk7CisgICAgLy8vQH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBsaW5lYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBncmFwaGljIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKTsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KKyAqCisgKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgorICovCitjbGFzcyBDMkluZm9CdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgaW5mbyBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCisgICAgICovCisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7Cit9OworCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0JBU0VfSF8KKyNkZWZpbmUgQzJCVUZGRVJfQkFTRV9IXworCisvLy8gXGRlZmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworLyoqCisgKiBCdWZmZXIvbWVtb3J5IHVzYWdlIGJpdHMuIFRoZXNlIHNoYWxsIGJlIHVzZWQgYnkgdGhlIGFsbG9jYXRvcnMgdG8gc2VsZWN0IG9wdGltYWwgbWVtb3J5IHR5cGUvCisgKiBwb29sIGFuZCBidWZmZXIgbGF5b3V0LiBVc2FnZSBiaXRzIGFyZSBjb25jZXB0dWFsbHkgc2VwYXJhdGVkIGludG8gcmVhZCBhbmQgd3JpdGUgdXNhZ2UsIHdoaWxlCisgKiB0aGUgYnVmZmVyIHVzZSBsaWZlLWN5Y2xlIGlzIHNlcGFyYXRlZCBpbnRvIHByb2R1Y2VycyAod3JpdGVycykgYW5kIGNvbnN1bWVycyAocmVhZGVycykuCisgKiBUaGVzZSB0d28gY29uY2VwdHMgYXJlIHJlbGF0ZWQgYnV0IG5vdCBlcXVpdmFsZW50OiBjb25zdW1lcnMgbWF5IG9ubHkgcmVhZCBidWZmZXJzIGFuZCBvbmx5CisgKiBwcm9kdWNlcnMgbWF5IHdyaXRlIHRvIGJ1ZmZlcnM7IG5vdGUsIGhvd2V2ZXIsIHRoYXQgYnVmZmVyIHByb2R1Y2VycyBtYXkgYWxzbyB3YW50IG9yIG5lZWQgdG8KKyAqIHJlYWQgdGhlIGJ1ZmZlcnMuCisgKgorICogUmVhZCBhbmQgd3JpdGUgYnVmZmVyIHVzYWdlIGJpdHMgc2hhbGwgYmUgb3ItZWQgdG8gYXJyaXZlIGF0IHRoZSBmdWxsIGJ1ZmZlciB1c2FnZS4gQWRtaXR0ZWRseSwKKyAqIHRoaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIGFtb3VudCBvZiByZWFkaW5nIGFuZCB3cml0aW5nIChlLmcuIGEgYnVmZmVyIG1heSBoYXZlIG9uZSBvciBtb3JlCisgKiByZWFkZXJzKTsgaG93ZXZlciwgdGhlIHByb3BlciBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcHJvcGVybHkgd2VpZ2ggdGhlIHZhcmlvdXMgdXNhZ2VzIHdvdWxkIGJlCisgKiB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZC93cml0dGVuIGZvciBlYWNoIHVzYWdlIHR5cGUuIFRoaXMgd291bGQgcmVzdWx0IGluIGFuIGludGVnZXIgYXJyYXkgb2YKKyAqIHNpemUgNjQgKG9yIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNhZ2VzKSBmb3IgbWVtb3J5IHVzYWdlLCBhbmQgbGlrZWx5IHN1Y2ggZGV0YWlsZWQgaW5mb3JtYXRpb24KKyAqIHdvdWxkIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgorICoKKyAqIFRoYXQgcGxhdGZvcm0tYWdub3N0aWMgQ29kZWMgMi4wIEFQSSBvbmx5IGRlZmluZXMgdGhlIGJhcmUgbWluaW11bSB1c2FnZXMuIFBsYXRmb3JtcyBzaGFsbCBkZWZpbmUKKyAqIHVzYWdlIGJpdHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwbGF0Zm9ybS4KKyAqLworc3RydWN0IEMyTWVtb3J5VXNhZ2UgeworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIEJ1ZmZlciByZWFkIHVzYWdlLgorICAgICAqLworICAgIGVudW0gcmVhZF90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHJlYWQgYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1JFQUQgICAgICAgID0gMSA8PCAwLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgcmVhZCBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlIGlzCisgICAgICAgICAqIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHJlYWRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgYWNjZXNzIG11c3QgYmUKKyAgICAgICAgICogcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUkVBRF9QUk9URUNURUQgID0gMSA8PCAxLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgd3JpdGUgdXNhZ2UuCisgICAgICovCisgICAgZW51bSB3cml0ZV90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHdyaXR0ZWQgdG8gYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1dSSVRFICAgICAgICA9IDEgPDwgMiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBzaGFsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gYnkgdHJ1c3RlZCBoYXJkd2FyZS4gVGhlIGRlZmluaXRpb24gb2YgdHJ1c3RlZCBoYXJkd2FyZQorICAgICAgICAgKiBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgYnV0IHRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byBwcmV2ZW50IG1hcHBpbmcgdGhpcyBibG9jayBpbnRvIENQVQorICAgICAgICAgKiB3cml0YWJsZSBtZW1vcnkgcmVzdWx0aW5nIGluIGJ1cyBmYXVsdC4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIHdoZW4gYnVmZmVyIGludGVncml0eSBtdXN0CisgICAgICAgICAqIGJlIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgPSAxIDw8IDMsCisgICAgfTsKKworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgdXNhZ2UgYml0cyByZXNlcnZlZCBmb3IgdGhlIHBsYXRmb3JtLiBXZSBkb24ndCBzZXBhcmF0ZWx5IHJlc2VydmUgcmVhZCBhbmQKKyAgICAgICAgICogd3JpdGUgdXNhZ2VzIGFzIHBsYXRmb3JtcyBtYXkgaGF2ZSBhc3ltbWV0cmljIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9NQVNLICAgICA9IH4oQ1BVX1JFQUQgfCBDUFVfV1JJVEUgfCBSRUFEX1BST1RFQ1RFRCB8IFdSSVRFX1BST1RFQ1RFRCksCisgICAgfTsKKworICAgIC8qKiBDcmVhdGUgYSB1c2FnZSBmcm9tIHNlcGFyYXRlIGNvbnN1bWVyIGFuZCBwcm9kdWNlciB1c2FnZSBtYXNrLiBcZGVwcmVjYXRlZCAqLworICAgIGlubGluZSBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGNvbnN1bWVyLCB1aW50NjRfdCBwcm9kdWNlcikKKyAgICAgICAgOiBleHBlY3RlZChjb25zdW1lciB8IHByb2R1Y2VyKSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGV4cGVjdGVkXykKKyAgICAgICAgOiBleHBlY3RlZChleHBlY3RlZF8pIHsgfQorCisgICAgdWludDY0X3QgZXhwZWN0ZWQ7IC8vIGV4cGVjdGVkIGJ1ZmZlciB1c2FnZQorfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmOGQyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJDT01QT05FTlRfSF8KKworI2RlZmluZSBDMkNPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8vLyBcZGVmZ3JvdXAgY29tcG9uZW50cyBDb21wb25lbnRzCisvLy8gQHsKKworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSB7CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBPU1NJQkxFLCAvLy88IHF1ZXJ5IGFsbCBwb3NzaWJsZSB2YWx1ZXMgcmVnYXJkbGVzcyBvZiBvdGhlciBzZXR0aW5ncworICAgICAgICBDVVJSRU5ULCAgLy8vPCBxdWVyeSBjdXJyZW50bHkgcG9zc2libGUgdmFsdWVzIGdpdmVuIGRlcGVuZGVudCBzZXR0aW5ncworICAgIH07CisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgdHlwZV90IF9tVHlwZTsKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB2YWx1ZXM7CisKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8sIHR5cGVfdCB0eXBlXykKKyAgICAgICAgOiBfbUZpZWxkKGZpZWxkXyksIF9tVHlwZSh0eXBlXyksIHN0YXR1cyhDMl9OT19JTklUKSB7IH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBDdXJyZW50KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfKSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoZmllbGRfLCBDVVJSRU5UKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CisgICAgUG9zc2libGUoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIFBPU1NJQkxFKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkIGZpZWxkKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZDsgfTsKKworICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorfTsKKworLyoqCisgKiBDb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4gVGhpcyBvYmplY3QgY29udGFpbnMgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgcG90ZW50aWFsIG9yCisgKiBhY3R1YWwgY29tcG9uZW50LiBJdCBjYW4gYmUgY3JlYXRlZCBhbmQgdXNlZCBpbmRlcGVuZGVudGx5IG9mIGFuIGFjdHVhbCBDMkNvbXBvbmVudCBpbnN0YW5jZSB0bworICogcXVlcnkgc3VwcG9ydCBhbmQgcGFyYW1ldGVycyBmb3IgdmFyaW91cyBjb21wb25lbnQgc2V0dGluZ3MgYW5kIGNvbmZpZ3VyYXRpb25zIGZvciBhIHBvdGVudGlhbAorICogY29tcG9uZW50LiBBY3R1YWwgY29tcG9uZW50cyBhbHNvIGV4cG9zZSB0aGlzIGludGVyZmFjZS4KKyAqLworCitjbGFzcyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQUxXQVlTIEFWQUlMQUJMRSBNRVRIT0RTCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSAnY2xhc3MnOyBob3dldmVyLCBtdWx0aXBsZQorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBTSEFMTCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIElEIGlzIHVzZWQgYXMgd29yayB0YXJnZXRzLCB1bmlxdWUgd29yayBJRHMsIGFuZCB3aGVuIGNvbmZpZ3VyaW5nIHR1bm5lbGluZy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB1bmlxdWUgbm9kZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgYSBzZXQgb2YgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb3IgcGFyYW1ldGVycworICAgICAqIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgd2l0aG91dCBibG9ja2luZy4gQW55IGVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICogQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuCisgICAgICogSW52YWxpZCBvciBibG9ja2luZyBwYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgorICAgICAqCisgICAgICogXHRvZG8gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcXVlcnkgaW5mby1idWZmZXJzLiBJcyB0aGF0IGEgcHJvYmxlbT8KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vdGUgRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW1baW5dIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQgcGFyYW0gaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgICAgICAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGVzIGluCisgICAgICogdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHxwYXJhbXN8LiBJZiBhbnkgcGFyYW1ldGVyIHVwZGF0ZSBmYWlscywgdGhlIGNvbXBvbmVudCBzaGFsbAorICAgICAqIGNvbW11bmljYXRlIHRoZSBmYWlsdXJlIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wsIGFuZCBzdGlsbCBwcm9jZXNzIHRoZQorICAgICAqIHJlbWFpbmluZyBwYXJhbWV0ZXJzLiBVbnN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBza2lwcGVkLCB0aG91Z2ggdGhleSBhcmUgY29tbXVuaWNhdGVkIGluCisgICAgICogdGhlciByZXR1cm4gdmFsdWUuIE1vc3QgcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBhdCBiZXN0IGVmZm9ydCAtIHN1Y2ggdGhhdCBldmVuIGlmIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgYSBmaWVsZCwgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlIGlzIHVzZWQuIE9uIHRoZQorICAgICAqIG90aGVyIGhhbmQsIHN0cmljdCBwYXJhbWV0ZXJzIG9ubHkgYWNjZXB0IHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlaXIgZmllbGRzLCBhbmQgaWYgdGhlIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSwgdGhlIHBhcmFtZXRlciBzZXR0aW5nIHNoYWxsIGZhaWwgZm9yIHRoYXQgZmllbGQuCisgICAgICogSWYgdGhlIGNsaWVudCB0cmllcyB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgZmllbGQgdGhhdCByZXF1aXJlcyBtb21lbnRhcnkgYmxvY2tpbmcgd2l0aG91dAorICAgICAqIHNldHRpbmcgfG1heUJsb2NrfCB0byBDMl9NQVlfQkxPQ0ssIHRoYXQgcGFyYW1ldGVyIHNoYWxsIGFsc28gYmUgc2tpcHBlZCBhbmQgYSBzcGVjaWZpYworICAgICAqIHJldHVybiB2YWx1ZSBzaGFsbCBiZSB1c2VkLiBGaW5hbCB2YWx1ZXMgZm9yIGFsbCBwYXJhbWV0ZXJzIHNldCBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZQorICAgICAqIGNhbGxlciBpbiB8cGFyYW1zfC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB0dW5pbmcgRE9FUyBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycy4gRS5nLiBzb21lIHBhcmFtZXRlcgorICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgZnVydGhlciBwYXJhbWV0ZXIgdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPworICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICogXHBhcmFtW291dF0gZmFpbHVyZXMgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMgYW5kIG9wdGlvbmFsIGd1aWRhbmNlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHNldCB0aGUgcGFyYW1ldGVycyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBUVU5ORUxJTkcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIElmIHRoZSBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgbWF5IGluY2x1ZGUgYQorICAgICAqIHR1bm5lbGVkIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIHR1bm5lbCBhbHJlYWR5IGV4aXN0cworICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIHNwZWNpZmljIHR1bm5lbCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIHR1bm5lbCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhlIHJlbGVhc2Ugb2YgYSB0dW5uZWwgaXMgZGVsYXllZCB3aGlsZSB0aGVyZSBhcmUgcGVuZGluZyB3b3JrIGl0ZW1zIGZvciB0aGUgdHVubmVsLgorICAgICAqIEFmdGVyIHJlbGVhc2luZyBhIHR1bm5lbCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBNVVNUIE5PVCBpbmNsdWRlIGEgdHVubmVsZWQKKyAgICAgKiBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgbWFya2VkIGZvciByZWxlYXNlIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIHR1bm5lbCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBtYXJrIHRoZSB0dW5uZWwgZm9yIHJlbGVhc2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlbGVhc2Ugb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOworCisgICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBxdWVyaWVkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIENsaWVudCBTSEFMTCBzZXQgdGhlIHBhcmFtZXRlci1maWVsZCBzcGVjaWZpZXIgYW5kIHRoZSB0eXBlIG9mIHN1cHBvcnRlZCB2YWx1ZXMgcXVlcnkgKGUuZy4KKyAgICAgKiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcywgb3IgcG90ZW50aWFsIHN1cHBvcnRlZCB2YWx1ZXMpIGluIGZpZWxkcy4KKyAgICAgKiBVcG9uIHJldHVybiB0aGUgY29tcG9uZW50IFNIQUxMIGZpbGwgaW4gdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMgbGlzdGVkIGFzIHdlbGwKKyAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IGZpZWxkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHN1cHBvcnRlZCB2YWx1ZXMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgTGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25UdW5uZWxSZWxlYXNlZCg8ZnJvbT4sIDx0bz4pID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25Db21wb25lbnRSZWxlYXNlZCg8aWQ+KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIGZvciB0aGlzIGNvbXBvbmVudAorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIHN0YXRlcyBleGNlcHQgcmVsZWFzZWQuCisgICAgICogVGhlIGxpc3RlbmVyIGNhbiBvbmx5IGJlIHNldCB0byBub24tbnVsbCB2YWx1ZSBpbiBzdG9wcGVkIHN0YXRlICh0aGF0IGRvZXMgbm90IGluY2x1ZGUKKyAgICAgKiB0cmlwcGVkIG9yIGVycm9yKS4gSXQgY2FuIGJlIHNldCB0byBudWxscHRyIGluIGJvdGggc3RvcHBlZCBhbmQgcnVubmluZyBzdGF0ZXMuCisgICAgICogQ29tcG9uZW50cyBvbmx5IHVzZSB0aGUgbGlzdGVuZXIgaW4gcnVubmluZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIGxpc3RlbmVyIGlzIG51bGxwdHIsIHRoZSBjb21wb25lbnQgU0hBTEwgZ3VhcmFudGVlIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3MgYXJlCisgICAgICogZG9uZSB0byB0aGUgb3JpZ2luYWwgbGlzdGVuZXIgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLiAoQW55IHBlbmRpbmcgbGlzdGVuZXIgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBuZWVkIHRvIGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhpcyBjYWxsIC0gaGVuY2UgdGhpcyBjYWxsIG1heSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4pCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBTSEFMTCBoYW5kbGUgbGlzdGVuZXIgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBzYW1lIHRocmVhZCAodGhlIHRocmVhZCB1c2VkIGlzCisgICAgICogYXQgdGhlIGNvbXBvbmVudCdzIGRpc2NyZXRpb24uKQorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBjb3VsZCBhbHNvIGJlIGFjY29tcGxpc2hlZCBieSBwYXNzaW5nIGEgd2Vha19wdHIgdG8gYSBjb21wb25lbnQtc3BlY2lmaWMgbGlzdGVuZXIKKyAgICAgKiBoZXJlIGFuZCByZXF1aXJpbmcgdGhlIGNsaWVudCB0byBhbHdheXMgcHJvbW90ZSB0aGUgd2Vha19wdHIgYmVmb3JlIGFueSBjYWxsYmFjay4gVGhpcyB3b3VsZAorICAgICAqIHB1dCB0aGUgYnVyZGVuIG9uIHRoZSBjbGllbnQgdG8gY2xlYXIgdGhlIGxpc3RlbmVyIC0gd2FpdCBmb3IgaXRzIGRlbGV0aW9uIC0gYXQgd2hpY2ggcG9pbnQKKyAgICAgKiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBvY2N1ci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gbGlzdGVuZXIgdGhlIGNvbXBvbmVudCBsaXN0ZW5lciBvYmplY3QKKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSBhdHRlbXB0aW5nIHRvIGNoYW5nZSB0aGUgbGlzdGVuZXIgaW4gdGhlIHJ1bm5pbmcgc3RhdGUgdG8gYSBub24tbnVsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICh1c2VyIGVycm9yKSwgb3IgY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBsaXN0ZW5lciB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSA9IDA7CisKKyAgICAvLy8gY29tcG9uZW50IGRvbWFpbiAoZS5nLiBhdWRpbyBvciB2aWRlbykKKyAgICBlbnVtIGRvbWFpbl90IDogdWludDMyX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGtpbmQgKGUuZy4gZW5jb2RlciwgZGVjb2RlciBvciBmaWx0ZXIpCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQgcmFuay4gVGhpcyBudW1iZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgY29tcG9uZW50IG9yZGVyaW5nICh0aGUgbG93ZXIgdGhlIHNvb25lcikKKyAgICAvLy8gaW4gdGhlIGNvbXBvbmVudCBsaXN0LgorICAgIHR5cGVkZWYgdWludDMyX3QgcmFua190OworCisgICAgLy8vIGNvbXBvbmVudCBhdHRyaWJ1dGVzCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQ2NF90OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSBjb21wb25lbnQuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgLy8gcHVibGljOgorICAgICAgICBDMlN0cmluZyBuYW1lOyAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudAorICAgICAgICBkb21haW5fdCBkb21haW47IC8vLzwgY29tcG9uZW50IGRvbWFpbgorICAgICAgICBraW5kX3Qga2luZDsgLy8vPCBjb21wb25lbnQga2luZAorICAgICAgICByYW5rX3QgcmFuazsgLy8vPCBjb21wb25lbnQgcmFuaworICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGU7IC8vLzwgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgICAgICBDMlN0cmluZyBvd25lcjsgLy8vPCBuYW1lIG9mIHRoZSBjb21wb25lbnQgc3RvcmUgb3duaW5nIHRoaXMgY29tcG9uZW50CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5hbWUgYWxpYXMoZXMpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKiBcbm90ZSBNdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzIGFzIGxvbmcgYXMgdGhlaXIgbWVkaWEtdHlwZSBkaWZmZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgfTsKKworICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE9LIGFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdXNpbmcgdGhlCisgICAgICogb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgd2FzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudHMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgdGhlIHdvcmsKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHF1ZXVpbmcgdGhlIHdvcmsgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgPSAwOworCisgICAgLyoqCisgICAgICogQW5ub3VuY2VzIGEgd29yayB0byBiZSBxdWV1ZWQgbGF0ZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcmVzZXJ2ZXMgYSBzbG90IGZvciB0aGUgcXVldWUKKyAgICAgKiB0byBlbnN1cmUgY29ycmVjdCB3b3JrIG9yZGVyaW5nIGV2ZW4gaWYgdGhlIHdvcmsgaXMgcXVldWVkIGxhdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KKyAgICAgKiBcdG9kbyBFeHBvc2UgbmV4dCB3b3JrIGl0ZW0gZm9yIGVhY2ggY29tcG9uZW50IHRvIGRldGVjdCBzdGFsbHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOworCisgICAgZW51bSBmbHVzaF9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgb25seQorICAgICAgICBGTFVTSF9DT01QT05FTlQsCisKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIGNvbXBvbmVudHMgY29ubmVjdGVkIGRvd25zdHJlYW0gZnJvbSBpdCB2aWEKKyAgICAgICAgLy8vIHR1bm5lbGluZworICAgICAgICBGTFVTSF9DSEFJTiA9ICgxIDw8IDE2KSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKKyAgICAgKiBkb3duc3RyZWFtLgorICAgICAqCisgICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCisgICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93CisgICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQorICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKKyAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCisgICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQorICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKiBUaGlzIHNoYWxsIGJlIGNvbXBsZXRlZCB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCisgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KKyAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cworICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KKyAgICAgICAgRFJBSU5fQ0hBSU4gPSAoMSA8PCAxNiksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCisgICAgICAgICAqICAgICAgIGFsbCB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjb21wb25lbnQuCisgICAgICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/CisgICAgICAgICAqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CisgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImRyYWluLXRpbGwtaGVyZSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgorICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyB1c2VkIHRvIHNldCB0aGUKKyAgICAgKiBlbmQtb2Ytc3RyZWFtIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrCisgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBkcmFpbiBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgZHJhaW4gcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgZHJhaW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBkZWZpbmUgc3VwcG9ydGVkIG1vZGVzIGRpc2NvdmVyeQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCisgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgKG9yIHJlc3VtZWQpIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXJ0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBzdG9wcGVkIHN0YXRlIG9yIHRyaXBwZWQgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCBhbmQgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlCisgICAgICogcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCisgICAgICogdmVyaWZ5IGFjY291bnRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdG9wIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBydW5uaW5nIHN0YXRlLCBpbmNsdWRpbmcgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0b3BwZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RvcHBpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcyBvdGhlciB0aGFuIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCisgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CisgICAgICoKKyAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgorICAgICAqCisgICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZworICAgICAqIHN0dWZmLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZXNldAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHJlc2V0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlc2V0IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2V0dGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuIFVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzIHNoYWxsIGJlIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZWxlYXNlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWxlYXNpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7Cit9OworCitDMkVOVU0oQzJDb21wb25lbnQ6OmtpbmRfdCwgdWludDMyX3QsCisgICAgS0lORF9PVEhFUiwKKyAgICBLSU5EX0RFQ09ERVIsCisgICAgS0lORF9FTkNPREVSCispOworCitDMkVOVU0oQzJDb21wb25lbnQ6OmRvbWFpbl90LCB1aW50MzJfdCwKKyAgICBET01BSU5fT1RIRVIsCisgICAgRE9NQUlOX1ZJREVPLAorICAgIERPTUFJTl9BVURJTywKKyAgICBET01BSU5fSU1BR0UKKyk7CisKK2NsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwYXJzZUZyYW1lKEMyRnJhbWVEYXRhICZmcmFtZSk7CisKKyAgICB2aXJ0dWFsIH5DMkZyYW1lSW5mb1BhcnNlcigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIHR5cGVkZWYgQzJBbGxvY2F0b3I6OmlkX3QgaWRfdDsKKworICAgIGVudW0gOiBDMkFsbG9jYXRvcjo6aWRfdCB7CisgICAgICAgIERFRkFVTFRfTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgREVGQVVMVF9HUkFQSElDLCAgICAvLy88IGJhc2ljIGdyYXBoaWMgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgICAgICBWRU5ET1JfU1RBUlQgICA9IDB4MTAwLAorICAgICAgICBCQURfSUQgICAgICAgICA9IEMyQWxsb2NhdG9yOjpCQURfSUQsIC8vLzwgRE8gTk9UIFVTRQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvY2F0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgYWxsb2NhdG9yIGluZm9ybWF0aW9uIChhcyBzaGFyZWQgcG9pbnRlcnMpCisgICAgICogXHJldHZhbCBhbiBlbXB0eSB2ZWN0b3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSB2ZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzL2NyZWF0ZXMgYSBzaGFyZWQgYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBUaGUgYWxsb2NhdG9yIGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBhbmQgdGhlIHNhbWUgYWxsb2NhdG9yIGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBjb25jdXJyZW50IHVzZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhlIGFsbG9jYXRvciBpcyBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0b3JlLCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgbGluZWFyIGFuZCBncmFwaGljIGFsbG9jYXRvcnMgaXMgZm9ybWFsaXplZC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCisgICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gY29tcG9uZW50ICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGludGVyZmFjZSAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZAorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIGFuIGludGVyZmFjZSwgb3IgY291bGQgdGhpcyBqdXN0IGJlIGEgY29tcG9uZW50IHRoYXQgaXMgbmV2ZXIgc3RhcnRlZD8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKKyAgICAvLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGUuZy4gZm9yIGdsb2JhbCBzZXR0aW5ncyAoc3lzdGVtLXdpZGUgc3RyaWRlLCBldGMuKQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCisgICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0CisgICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCisgICAgICogdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLiBVbnN1cHBvcnRlZCBwYXJhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCisgICAgICogZnV0dXJlLgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKKyAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQorICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLiBUaGlzIGlzIHNoYXJlZCBmb3IgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgc2hhcmVkIHBhcmFtZXRlciByZWZsZWN0b3Igb2JqZWN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBzdG9yZSBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIFN0b3JlIHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IHN0b3JlIGZpZWxkCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0LAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKyAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEZyYW1lUmF0ZSA9IEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWF4Qml0cmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heEZyYW1lUmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4R29wLAorICAgIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWwsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lLAorICAgIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZywKKyAgICBrUGFyYW1JbmRleExheWVySW5kZXgsCisgICAga1BhcmFtSW5kZXhMYXllckNvdW50LAorICAgIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFRpbGVMYXlvdXQgPSBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFRpbGVIYW5kbGluZywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdWRpbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhTYW1wbGVSYXRlID0gQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhQY21FbmNvZGluZywKKyAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleEFhY1Nick1vZGUsIC8vIGFhYyBlbmNvZGUsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbCwgIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbCwgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQsIC8vIGFsbCwgdTMyCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzLCAvLyBhbGwsIHU2NCBtYXNrCisgICAga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhBc3BlY3RzVG9EYXRhU3BhY2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnMsIC8vIHN0b3JlLCBzdHJ1Y3RbXQorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlVG9Bc3BlY3RzLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2UsIC8vIHUzMgorICAgIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmcsIC8vIHUzMgorCisgICAgLy8gaW5wdXQgc3VyZmFjZQorICAgIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zLCAvLyBpbnB1dC1zdXJmYWNlLCBlb3MKKyAgICBrUGFyYW1JbmRleFRpbWVkQ29udHJvbCwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhTdGFydEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN1c3BlbmRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhSZXN1bWVBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdG9wQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VGltZU9mZnNldCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGUsIC8vIGlucHV0LXN1cmZhY2UsIGZsb2F0CisgICAga1BhcmFtSW5kZXhUaW1lc3RhbXBHYXBBZGp1c3RtZW50LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKworICAgIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvciwgLy8gdTMyCit9OworCit9CisKKy8qKgorICogQ29kZWMgMi4wIHBhcmFtZXRlciB0eXBlcyBmb2xsb3cgdGhlIGZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiBDMjxncm91cD48ZG9tYWluPjxpbmRleD48dHlwZT4KKyAqCisgKiBFLmcuIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOiBncm91cD0iIiBkb21haW49IlN0cmVhbSIgaW5kZXg9IlBpY3R1cmVTaXplIiB0eXBlPSJJbmZvIi4KKyAqIEdyb3VwIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGRlbm90ZXMga2luZCBvZiBvYmplY3RzIHRoZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZC4KKyAqIEF0IHRoaXMgcG9pbnQgd2UgdXNlIENvbXBvbmVudCBhbmQgU3RvcmUgdG8gZGlzdGluZ3Vpc2ggYmFzaWMgY29tcG9uZW50L3N0b3JlIHBhcmFtZXRlcnMuCisgKgorICogUGFyYW1ldGVyIGtleXMgYXJlIG5hbWVkIEMyX1BBUkFNS0VZX1s8Z3JvdXA+X108ZG9tYWluPl88aW5kZXg+IGFzIHR5cGUgaXMgbm90IGV4cGVjdGVkCisgKiB0byBkaXN0aW5ndWlzaCBwYXJhbWV0ZXJzLiBFLmcuIGEgY29tcG9uZW50IGNvdWxkIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGFuZCBpdAorICogaXMgbm90IGV4cGVjdGVkIHVzZXJzIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHRoZSBrZXkuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIGxldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gQzJDb25maWc6OmFwaV9sZXZlbF90IDogdWludDMyX3QgeworICAgIEFQSV9MMF8xID0gMCwgICAvLy88IHN1cHBvcnQgZm9yIEFQSSBsZXZlbCAwLjEKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2xldmVsX3Q+LCBrUGFyYW1JbmRleEFwaUxldmVsPgorICAgICAgICBDMkFwaUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9MRVZFTFtdID0gImFwaS5sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OmFwaV9mZWF0dXJlX3QgOiB1aW50NjRfdCB7CisgICAgQVBJX1JFRkxFQ1RJT04gICAgICAgPSAoMVUgPDwgMCksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgcGFyYW1ldGVycworICAgIEFQSV9WQUxVRVMgICAgICAgICAgID0gKDFVIDw8IDEpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3Qgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIKKyAgICBBUElfQ1VSUkVOVF9WQUxVRVMgICA9ICgxVSA8PCAyKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9ERVBFTkRFTkNZICAgICAgID0gKDFVIDw8IDMpLCAgLy8vPCBoYXZlIGEgZGVmaW5lZCBwYXJhbWV0ZXIgZGVwZW5kZW5jeQorCisgICAgQVBJX1NUUkVBTVMgICAgICAgICAgPSAoMVVMTCA8PCAzMiksICAvLy88IHN1cHBvcnRpbmcgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmVhbXMKKworICAgIEFQSV9UVU5ORUxJTkcgICAgICAgID0gKDFVTEwgPDwgNDgpLCAgLy8vPCB0dW5uZWxpbmcgQVBJCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFwaV9mZWF0dXJlX3Q+LCBrUGFyYW1JbmRleEFwaUZlYXR1cmVzPgorICAgICAgICBDMkFwaUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9GRUFUVVJFU1tdID0gImFwaS5mZWF0dXJlcyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdlbmVyaWMgY29tcG9uZW50IGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBkb3QgJy4nLCBoeXBoZW4gJy0nLCBwbHVzICcrJywgb3IKKyAqIHVuZGVybGluZSAnXycuIFRoZSBuYW1lIG9mIGVhY2ggY29tcG9uZW50IG11c3QgYmUgdW5pcXVlLgorICoKKyAqIEZvciBBbmRyb2lkOiBDb21wb25lbnQgbmFtZXMgbXVzdCBzdGFydCB3aXRoICdjMi4nIGZvbGxvd2VkIGJ5IHRoZSBjb21wYW55IG5hbWUgb3IgYWJicmV2aWF0aW9uCisgKiBhbmQgYW5vdGhlciBkb3QsIGUuZy4gJ2MyLmFuZHJvaWQuJy4gVXNlIG9mIGxvd2VyY2FzZSBpcyBwcmVmZXJyZWQgYnV0IG5vdCByZXF1aXJlZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE5hbWU+IEMyQ29tcG9uZW50TmFtZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRVtdICA9ICJjb21wb25lbnQubmFtZSI7CisKKy8qKgorICogQWx0ZXJuYXRlIG5hbWVzIChhbGlhc2VzKSBvZiB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoaXMgaXMgYSBjb21tYSAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWx0ZXJuYXRlIGNvbXBvbmVudCBuYW1lcy4gVW5saWtlIGNvbXBvbmVudCBuYW1lcyB0aGF0CisgKiBtdXN0IGJlIHVuaXF1ZSwgbXVsdGlwbGUgY29tcG9uZW50cyBjYW4gaGF2ZSB0aGUgc2FtZSBhbGlhcy4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleEFsaWFzZXM+IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFU1tdICA9ICJjb21wb25lbnQuYWxpYXNlcyI7CisKKy8qKgorICogQ29tcG9uZW50IGtpbmQuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6a2luZF90Piwga1BhcmFtSW5kZXhLaW5kPgorICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkRbXSAgPSAiY29tcG9uZW50LmtpbmQiOworCisvKioKKyAqIENvbXBvbmVudCBkb21haW4uCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+LCBrUGFyYW1JbmRleERvbWFpbj4KKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTltdICA9ICJjb21wb25lbnQuZG9tYWluIjsKKworLyoqCisgKiBDb21wb25lbnQgYXR0cmlidXRlcy4KKyAqCisgKiBUaGVzZSBhcmUgYSBzZXQgb2YgZmxhZ3MgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBjaGFyYWN0ZXJpemluZyBpdHMgcHJvY2Vzc2luZyBhbGdvcml0aG0uCisgKi8KK0MyRU5VTShDMkNvbXBvbmVudDo6YXR0cmliX3QsIHVpbnQ2NF90LAorICAgIEFUVFJJQl9JU19URU1QT1JBTCA9IDF1IDw8IDAsIC8vLzwgY29tcG9uZW50IGlucHV0IG9yZGVyaW5nIG1hdHRlcnMgZm9yIHByb2Nlc3NpbmcKKykKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjphdHRyaWJfdD4sIGtQYXJhbUluZGV4QXR0cmlidXRlcz4KKyAgICAgICAgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTW10gPSAiY29tcG9uZW50LmF0dHJpYnV0ZXMiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaGluZy4KKyAqCisgKiBUaGlzIGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSByYXRlIG9mIHRoZSBpbnB1dCB0aW1lc3RhbXAsIGFuZCB0aGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqIEUuZy4gaWYgdGhpcyBpcyA0LjAsIGZvciBldmVyeSAxIHNlY29uZHMgb2YgaW5wdXQgdGltZXN0YW1wIGRpZmZlcmVuY2UsIHRoZSBvdXRwdXQgc2hhbGwgZGlmZmVyCisgKiBieSA0IHNlY29uZHMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleFRpbWVTdHJldGNoPiBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIW10gID0gImFsZ28udGltZS1zdHJldGNoIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29kaW5nIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFByb2ZpbGUgYW5kIGxldmVsLgorICoKKyAqIFByb2ZpbGUgZGV0ZXJtaW5lcyB0aGUgdG9vbHMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICogTGV2ZWwgZGV0ZXJtaW5lcyB0aGUgbGV2ZWwgb2YgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCituYW1lc3BhY2UgeworCitlbnVtIDogdWludDMyX3QgeworICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCisgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKKyAgICBfQzJfUExfSDI2M19CQVNFID0gMHgzMDAwLAorICAgIF9DMl9QTF9NUDRWX0JBU0UgPSAweDQwMDAsCisgICAgX0MyX1BMX0FWQ19CQVNFICA9IDB4NTAwMCwKKyAgICBfQzJfUExfSEVWQ19CQVNFID0gMHg2MDAwLAorICAgIF9DMl9QTF9WUDlfQkFTRSAgPSAweDcwMDAsCisgICAgX0MyX1BMX0RWX0JBU0UgICA9IDB4ODAwMCwKKyAgICBfQzJfUExfQVYxX0JBU0UgID0gMHg5MDAwLAorCisgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAorfTsKKworfQorCitlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CisgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBBQUMgKE1QRUctMiBQYXJ0IDcgYW5kIE1QRUctNCBQYXJ0IDMpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BQUNfTEMgPSBfQzJfUExfQUFDX0JBU0UsICAgICAgICAgICAvLy88IEFBQyBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTWFpbgorICAgIFBST0ZJTEVfQUFDX1NTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZQorICAgIFBST0ZJTEVfQUFDX0xUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAgICBQUk9GSUxFX0FBQ19IRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19FUl9MQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19IRV9QUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeSBQYXJhbWV0cmljIFN0ZXJlbworICAgIFBST0ZJTEVfQUFDX0VMRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfWEhFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFeHRlbmRlZCBIaWdoLUVmZmljaWVuY3kKKworICAgIC8vIE1QRUctMiBWaWRlbyBwcm9maWxlcworICAgIFBST0ZJTEVfTVAyVl9TSU1QTEUgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTaW1wbGUKKyAgICBQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbgorICAgIFBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTTlIgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU3BhdGlhbGx5IFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2gKKyAgICBQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgNDoyOjIKKyAgICBQUk9GSUxFX01QMlZfTVVMVElWSUVXLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTXVsdGktdmlldworCisgICAgLy8gSC4yNjMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUgPSBfQzJfUExfSDI2M19CQVNFLCAgIC8vLzwgSC4yNjMgQmFzZWxpbmUgKFByb2ZpbGUgMCkKKyAgICBQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMSkKKyAgICBQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAxIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMikKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgMykKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAzIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgNCkKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiAoUHJvZmlsZSA1KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCAoUHJvZmlsZSA2KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgKFByb2ZpbGUgNykKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSGlnaCBMYXRlbmN5IChQcm9maWxlIDgpCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgTmF0dXJhbCBWaXN1YWwgUHJvZmlsZXMKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlCisgICAgUFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBNYWluCisgICAgUFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBOLUJpdAorICAgIFBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgUmVhbHRpbWUgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTywgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9GR1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZQorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBwcm9maWxlcworICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgLy8vPCBBVkMgKEguMjY0KSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNYWluCisgICAgUFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEV4dGVuZGVkCisgICAgUFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaAorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgUHJlZGljdGl2ZQorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDQVZMQyA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFICsgMHgxMDAsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdILCAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoIEludHJhCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCwgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU3RlcmVvIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdILCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHg0MDAsICAvLy88IEFWQyAoSC4yNjQpIEVuaGFuY2VkIE11bHRpdmlldyBEZXB0aCBIaWdoCisKKyAgICAvLyBIRVZDIHByb2ZpbGVzCisgICAgUFJPRklMRV9IRVZDX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fU1RJTEwsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xNiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0ID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgzMDAsICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE11bHRpdmlldyBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg1MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg2MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0LCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDXzNEX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg3MDAsICAvLy88IEhFVkMgKEguMjY1KSAzRCBNYWluCisKKyAgICAvLyBWUDkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOV8wID0gX0MyX1BMX1ZQOV9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMCAoNDoyOjApCisgICAgUFJPRklMRV9WUDlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDEgKDQ6MjoyIG9yIDQ6NDo0KQorICAgIFBST0ZJTEVfVlA5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAyICg0OjI6MCwgMTAgb3IgMTIgYml0KQorICAgIFBST0ZJTEVfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAzICg0OjI6MiBvciA0OjQ6NCwgMTAgb3IgMTIgYml0KQorCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGVzCisgICAgUFJPRklMRV9EVl9BVl9QRVIgPSBfQzJfUExfRFZfQkFTRSArIDAsICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfQVZfUEVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDQgPSBfQzJfUExfRFZfQkFTRSArIDQsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wNSA9IF9DMl9QTF9EVl9CQVNFICsgNSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA1IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFX0RUSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZHRoIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNyA9IF9DMl9QTF9EVl9CQVNFICsgNywgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA3IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA4ID0gX0MyX1BMX0RWX0JBU0UgKyA4LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDggcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfQVZfMDkgPSBfQzJfUExfRFZfQkFTRSArIDksICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi4wOSBwcm9maWxlCisKKyAgICAvLyBBVjEgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKKyAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCit9OworCitlbnVtIEMyQ29uZmlnOjpsZXZlbF90IDogdWludDMyX3QgeworICAgIExFVkVMX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZXZlbCBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIE1QRUctMiBWaWRlbyBsZXZlbHMKKyAgICBMRVZFTF9NUDJWX0xPVyA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTG93IExldmVsCisgICAgTEVWRUxfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4gTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCAxNDQwIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaFAgTGV2ZWwKKworICAgIC8vIEguMjYzIGxldmVscworICAgIExFVkVMX0gyNjNfMTAgPSBfQzJfUExfSDI2M19CQVNFLCAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAxMAorICAgIExFVkVMX0gyNjNfMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAyMAorICAgIExFVkVMX0gyNjNfMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAzMAorICAgIExFVkVMX0gyNjNfNDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0MAorICAgIExFVkVMX0gyNjNfNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0NQorICAgIExFVkVMX0gyNjNfNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA1MAorICAgIExFVkVMX0gyNjNfNjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA2MAorICAgIExFVkVMX0gyNjNfNzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA3MAorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIGxldmVscworICAgIExFVkVMX01QNFZfMCA9IF9DMl9QTF9NUDRWX0JBU0UsICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMAorICAgIExFVkVMX01QNFZfMEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMGIKKyAgICBMRVZFTF9NUDRWXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDEKKyAgICBMRVZFTF9NUDRWXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDIKKyAgICBMRVZFTF9NUDRWXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDMKKyAgICBMRVZFTF9NUDRWXzNCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDNiCisgICAgTEVWRUxfTVA0Vl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0CisgICAgTEVWRUxfTVA0Vl80QSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0YQorICAgIExFVkVMX01QNFZfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNQorICAgIExFVkVMX01QNFZfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNgorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBsZXZlbHMKKyAgICBMRVZFTF9BVkNfMSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMQorICAgIExFVkVMX0FWQ18xQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxYgorICAgIExFVkVMX0FWQ18xXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjEKKyAgICBMRVZFTF9BVkNfMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4yCisgICAgTEVWRUxfQVZDXzFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMworICAgIExFVkVMX0FWQ18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyCisgICAgTEVWRUxfQVZDXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMQorICAgIExFVkVMX0FWQ18yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVkNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMworICAgIExFVkVMX0FWQ18zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVkNfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVZDXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQKKyAgICBMRVZFTF9BVkNfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVZDXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMgorICAgIExFVkVMX0FWQ181LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1CisgICAgTEVWRUxfQVZDXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMQorICAgIExFVkVMX0FWQ181XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVkNfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNgorICAgIExFVkVMX0FWQ182XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjEKKyAgICBMRVZFTF9BVkNfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNi4yCisKKyAgICAvLyBIRVZDIChILjI2NSkgdGllcnMgYW5kIGxldmVscworICAgIExFVkVMX0hFVkNfTUFJTl8xID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDEKKyAgICBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyCisgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMworICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDMuMQorICAgIExFVkVMX0hFVkNfTUFJTl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQKKyAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA0LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1CisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4yCisgICAgTEVWRUxfSEVWQ19NQUlOXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNgorICAgIExFVkVMX0hFVkNfTUFJTl82XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMQorICAgIExFVkVMX0hFVkNfTUFJTl82XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMgorCisgICAgTEVWRUxfSEVWQ19ISUdIXzQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfSElHSF80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfSElHSF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX0hJR0hfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4yCisKKyAgICAvLyBWUDkgbGV2ZWxzCisgICAgTEVWRUxfVlA5XzEgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxCisgICAgTEVWRUxfVlA5XzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxLjEKKyAgICBMRVZFTF9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIKKyAgICBMRVZFTF9WUDlfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIuMQorICAgIExFVkVMX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMworICAgIExFVkVMX1ZQOV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMy4xCisgICAgTEVWRUxfVlA5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0CisgICAgTEVWRUxfVlA5XzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0LjEKKyAgICBMRVZFTF9WUDlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUKKyAgICBMRVZFTF9WUDlfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUuMQorICAgIExFVkVMX1ZQOV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4yCisgICAgTEVWRUxfVlA5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2CisgICAgTEVWRUxfVlA5XzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2LjEKKyAgICBMRVZFTF9WUDlfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMgorCisgICAgLy8gRG9sYnkgVmlzaW9uIGxldmVscworICAgIExFVkVMX0RWX01BSU5fSERfMjQgPSBfQzJfUExfRFZfQkFTRSwgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQzMAorICAgIExFVkVMX0RWX01BSU5fRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQzMAorICAgIExFVkVMX0RWX01BSU5fVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfTUFJTl9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNjAKKworICAgIExFVkVMX0RWX0hJR0hfSERfMjQgPSBfQzJfUExfRFZfQkFTRSArIDB4MTAwLCAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQzMAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfSElHSF9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQzMAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfSElHSF9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNjAKKworICAgIC8vIEFWMSBsZXZlbHMKKyAgICBMRVZFTF9BVjFfMiAgICA9IF9DMl9QTF9BVjFfQkFTRSAsICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIKKyAgICBMRVZFTF9BVjFfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMQorICAgIExFVkVMX0FWMV8yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4yCisgICAgTEVWRUxfQVYxXzJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjMKKyAgICBMRVZFTF9BVjFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMKKyAgICBMRVZFTF9BVjFfM18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMQorICAgIExFVkVMX0FWMV8zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVYxXzNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjMKKyAgICBMRVZFTF9BVjFfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQKKyAgICBMRVZFTF9BVjFfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMQorICAgIExFVkVMX0FWMV80XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVYxXzRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjMKKyAgICBMRVZFTF9BVjFfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUKKyAgICBMRVZFTF9BVjFfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMQorICAgIExFVkVMX0FWMV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4yCisgICAgTEVWRUxfQVYxXzVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjMKKyAgICBMRVZFTF9BVjFfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYKKyAgICBMRVZFTF9BVjFfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMQorICAgIExFVkVMX0FWMV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4yCisgICAgTEVWRUxfQVYxXzZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjMKKyAgICBMRVZFTF9BVjFfNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcKKyAgICBMRVZFTF9BVjFfN18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMQorICAgIExFVkVMX0FWMV83XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4yCisgICAgTEVWRUxfQVYxXzdfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjMKK307CisKK3N0cnVjdCBDMlByb2ZpbGVMZXZlbFN0cnVjdCB7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlOyAgLy8vPCBjb2RpbmcgcHJvZmlsZQorICAgIEMyQ29uZmlnOjpsZXZlbF90ICAgbGV2ZWw7ICAgIC8vLzwgY29kaW5nIGxldmVsCisKKyAgICBDMlByb2ZpbGVMZXZlbFN0cnVjdCgKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZV8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsCisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbF8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKQorICAgICAgICA6IHByb2ZpbGUocHJvZmlsZV8pLCBsZXZlbChsZXZlbF8pIHsgfQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChQcm9maWxlTGV2ZWwpCisgICAgQzJGSUVMRChwcm9maWxlLCAicHJvZmlsZSIpCisgICAgQzJGSUVMRChsZXZlbCwgICAibGV2ZWwiKQorfTsKKworLy8gVE9ETzogbWF5IG5lZWQgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IChoYXZlIC5zZXQgbWVtYmVyKQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QsIGtQYXJhbUluZGV4UHJvZmlsZUxldmVsPgorICAgICAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMW10gPSAiY29kZWQucGwiOworCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTklUX0RBVEFbXSA9ICJjb2RlZC5pbml0LWRhdGEiOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhLgorICoKKyAqIFRoaXMgaXMgY29kaW5nLXNwZWNpZmljIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbmFsIGRhdGEsIGUuZy4gU0VJIGZvciBBVkMvSEVWQy4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCBhIGNvbmZpZ3VyYXRpb24gc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBrZXkuCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSByZXR1cm5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGUsIGFuZCBjYW4gYmUgcmVwZWF0ZWQgYXMgbmVlZGVkCisgKiBpbiB0aGUgc2FtZSB1cGRhdGUuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCwgdWludDMyX3QsCisgICAgSU5GT19OT05FID0gMCwKKworICAgIElORk9fUFJFRklYX1NFSV9VTklUID0gMHgxMDAwMCwgLy8vPCBwcmVmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworICAgIElORk9fU1VGRklYX1NFSV9VTklUID0gMHgyMDAwMCwgLy8vPCBzdWZmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworCisgICAgSU5GT19TRUlfVVNFUl9EQVRBID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCA0LCAgICAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKyAgICBJTkZPX1NFSV9NRENWICAgICAgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDEzNywgIC8vLzwgbWFzdGVyaW5nIGRpc3BsYXkgY29sb3Igdm9sdW1lCisgICAgSU5GT19TRVRfVVNFUl9EQVRBX1NGWCA9IElORk9fU1VGRklYX1NFSV9VTklUIHwgNCwgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisKKyAgICBJTkZPX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAKKykKKworc3RydWN0IEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCB7CisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KCkKKyAgICAgICAgOiB0eXBlXyhJTkZPX05PTkUpIHsgfQorCisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV8pCisgICAgICAgIDogdHlwZV8odHlwZSkgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICZkYXRhX1swXSwgYzJfbWluKGRhdGFfLnNpemUoKSwgZmxleENvdW50KSk7CisgICAgfQorCisgICAgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZV87CisgICAgdWludDhfdCBkYXRhW107CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoU3VwcGxlbWVudGFsRGF0YSwgZGF0YSkKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChkYXRhLCAiZGF0YSIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0LCBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3VwcGxlbWVudGFsRGF0YUluZm87CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEgU3Vic2NyaXB0aW9uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfU1VQUExFTUVOVEFMX0RBVEFbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1zdXBwbGVtZW50YWwiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogTWVkaWEtdHlwZS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgZm9yIGJvdGggcG9ydCBhbmQgc3RyZWFtLCBidXQgc3RyZWFtIG1lZGlhIHR5cGUgbWF5IGJlIGEgc3VidHlwZSBvZiB0aGUKKyAqIHBvcnQgbWVkaWEgdHlwZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRVtdID0gImlucHV0Lm1lZGlhLXR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEVbXSA9ICJvdXRwdXQubWVkaWEtdHlwZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4gQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUW10gPSAiaW5wdXQuZGVsYXkucmVxdWVzdGVkIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWV9SRVFVRVNUW10gPSAib3V0cHV0LmRlbGF5LnJlcXVlc3RlZCI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheVJlcXVlc3Q+CisgICAgICAgIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1RbXSA9ICJwaXBlbGluZS1kZWxheS5yZXF1ZXN0ZWQiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXk+IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlbXSA9ICJpbnB1dC5kZWxheS5hY3R1YWwiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZW10gPSAib3V0cHV0LmRlbGF5LmFjdHVhbCI7CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWVtdID0gImFsZ28uZGVsYXkuYWN0dWFsIjsKKworLyoqCisgKiBSZWZlcmVuY2UgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqIFRoZSBjb21wb25lbnQgbWF5IGhvbGQgb250byBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZXZlbiBhZnRlciBjb21wbGV0aW5nIHRoZSBjb3JyZXNwb25kaW5nCisgKiB3b3JrIGl0ZW0uCisgKgorICogTWF4IHJlZmVyZW5jZSBhZ2UgaXMgdGhlIGxvbmdlc3QgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWUgcHJvY2Vzc2luZyB0aGF0IGEgY29tcG9uZW50IG1heQorICogaG9sZCBvbnRvIGEgYnVmZmVyIGZvci4gTWF4IHJlZmVyZW5jZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhdCB0aGUgc2FtZSB0aW1lIGF0IHRoZSB3b3JzdCBjYXNlLiBUaGVzZSBudW1iZXJzIGFzc3VtZSBzaW5nbGUgZnJhbWUgcGVyIGJ1ZmZlcnMuCisgKgorICogVXNlIG1heC11aW50MzIgaWYgdGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBtYXggYWdlIG9yIGNvdW50LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQWdlPgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAiaW5wdXQucmVmZXJlbmNlLm1heC1hZ2UiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50PgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVFtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJvdXRwdXQucmVmZXJlbmNlLm1heC1jb3VudCI7CisKKy8qKgorICogT3V0cHV0IHJlb3JkZXJpbmcuCisgKgorICogVGhlIHNpemUgb2YgdGhlIHdpbmRvdyB0byB1c2UgZm9yIG91dHB1dCBidWZmZXIgcmVvcmRlcmluZy4gMCBpcyBpbnRlcnByZXRlZCBhcyAxLgorICovCisvLyBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZW9yZGVyQnVmZmVyRGVwdGg+CisgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LnJlb3JkZXIuZGVwdGgiOworCitDMkVOVU0oQzJDb25maWc6Om9yZGluYWxfa2V5X3QsIHVpbnQzMl90LAorICAgICAgICBPUkRJTkFMLAorICAgICAgICBUSU1FU1RBTVAsCisgICAgICAgIENVU1RPTSkKKworLy8gcmVhZC1vbmx5LCBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6Om9yZGluYWxfa2V5X3Q+LCBrUGFyYW1JbmRleFJlb3JkZXJLZXk+CisgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFT1JERVJfS0VZW10gPSAib3V0cHV0LnJlb3JkZXIua2V5IjsKKworLyoqCisgKiBTdHJlYW0gY291bnQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3RyZWFtQ291bnQ+IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UW10gPSAiaW5wdXQuc3RyZWFtLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlRbXSA9ICJvdXRwdXQuc3RyZWFtLWNvdW50IjsKKworLyoqCisgKiBDb25maWcgdXBkYXRlIHN1YnNjcmlwdGlvbi4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXM+CisgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFU1tdID0gIm91dHB1dC5zdWJzY3JpYmVkLWluZGljZXMiOworCisvKioKKyAqIFN1Z2dlc3RlZCBidWZmZXIgKEMyRnJhbWUpIGNvdW50LiBUaGlzIGlzIGEgc3VnZ2VzdGlvbiBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgbnVtYmVyIG9mCisgKiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lcyBhbGxvY2F0ZWQgZm9yIHRoZSBjb21wb25lbnQncyB1c2UgaW4gdGhlIGJ1ZmZlciBwb29scy4KKyAqCisgKiBDb21wb25lbnQgc2hhbGwgc2V0IHRoZSBhY2NlcHRhYmxlIHJhbmdlIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBpdC4gRS5nLiBjbGllbnQgc2hhbGwKKyAqIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZhbHVlLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4U3VnZ2VzdGVkQnVmZmVyQ291bnQ+CisgICAgICAgIEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gImlucHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVUdHRVNURURfQlVGRkVSX0NPVU5UW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKKworLyoqCisgKiBJbnB1dC9vdXRwdXQgYmF0Y2hpbmcuCisgKgorICogRm9yIGlucHV0LCBjb21wb25lbnQgcmVxdWVzdHMgdGhhdCBjbGllbnQgYmF0Y2hlcyB3b3JrIGluIGJhdGNoZXMgb2Ygc3BlY2lmaWVkIHNpemUuIEZvciBvdXRwdXQsCisgKiBjbGllbnQgcmVxdWVzdHMgdGhhdCB0aGUgY29tcG9uZW50IGJhdGNoZXMgd29yayBjb21wbGV0aW9uIGluIGdpdmVuIGJhdGNoIHNpemUuCisgKiBWYWx1ZSAwIG1lYW5zIGRvbid0IGNhcmUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4QmF0Y2hTaXplPiBDMlBvcnRCYXRjaFNpemVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9CQVRDSF9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5iYXRjaC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CQVRDSF9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7CisKKy8qKgorICogQ3VycmVudCAmIGxhc3Qgd29yayBvcmRpbmFscy4KKyAqCisgKiBpbnB1dCBwb3J0OiBsYXN0IHdvcmsgcXVldWVkIHRvIGNvbXBvbmVudC4KKyAqIG91dHB1dCBwb3J0OiBsYXN0IHdvcmsgY29tcGxldGVkIGJ5IGNvbXBvbmVudC4KKyAqIGdsb2JhbDogY3VycmVudCB3b3JrLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleExhc3RXb3JrUXVldWVkPiBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleEN1cnJlbnRXb3JrPiBDMkN1cnJlbnRXb3JrVHVuaW5nOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVtb3J5IGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFsbG9jYXRvcnMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSByZXF1ZXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBJZiBub25lIHNwZWNpZmllZCwgY2xpZW50IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBJRCBiYXNlZCBvbiB0aGUgY29tcG9uZW50IGRvbWFpbiBhbmQKKyAqIGtpbmQuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9BTExPQ0FUT1JTW10gPSAiaW5wdXQuYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTW10gPSAib3V0cHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkFsbG9jYXRvcjo6aWRfdD4sIGtQYXJhbUluZGV4QWxsb2NhdG9ycz4KKyAgICAgICAgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSVZBVEVfQUxMT0NBVE9SU1tdID0gImFsZ28uYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKKworLyoqCisgKiBBbGxvY2F0b3IgdG8gdXNlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSByZXF1ZXN0IGFsbG9jYXRvciB0eXBlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBCdWZmZXJRdWV1ZS1iYWNrZWQgYWxsb2NhdG9yIElEIGZvciBvdXRwdXR0aW5nIHRvCisgKiBzdXJmYWNlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN1cmZhY2VBbGxvY2F0b3I+CisgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VSRkFDRV9BTExPQ0FUT1JbXSA9ICJvdXRwdXQuYnVmZmVycy5zdXJmYWNlLWFsbG9jYXRvci1pZCI7CisKKy8qKgorICogQmxvY2sgcG9vbHMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIGNsaWVudCBmb3IgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYWxsb2NhdG9yIElEcyBzcGVjaWZpZWQgYnkgdGhlCisgKiBjb21wb25lbnQuIFRoaXMgaXMgbm90IHVzZWQgZm9yIHRoZSBpbnB1dCBwb3J0LgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+LCBrUGFyYW1JbmRleEJsb2NrUG9vbHM+CisgICAgICAgIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTW10gPSAiYWxnby5idWZmZXJzLnBvb2wtaWRzIjsKKworLyoqCisgKiBUaGUgbWF4IG51bWJlciBvZiBwcml2YXRlIGFsbG9jYXRpb25zIGF0IGFueSBvbmUgdGltZSBieSB0aGUgY29tcG9uZW50LgorICogKFRoaXMgaXMgYW4gYXJyYXkgd2l0aCBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgZm9yIGVhY2ggcHJpdmF0ZSBhbGxvY2F0b3IpCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfUFJJVkFURV9CVUZGRVJfQ09VTlRbXSA9ICJhbGdvLmJ1ZmZlcnMubWF4LWNvdW50IjsKKworLyoqCisgKiBCdWZmZXIgdHlwZQorICoKKyAqIFRoaXMgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIGNsaWVudCB0byBhbGxvY2F0ZSB0aGUgcHJvcGVyIGJ1ZmZlciB0eXBlIGZvciB0aGUKKyAqIGlucHV0IHBvcnQsIGFuZCBjYW4gYmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCB0byBjb250cm9sIHRoZSBidWZmZXIgdHlwZSBmb3IgdGhlIG91dHB1dC4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQnVmZmVyRGF0YTo6dHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlPgorICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAiaW5wdXQuYnVmZmVycy50eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJvdXRwdXQuYnVmZmVycy50eXBlIjsKKworLyoqCisgKiBNZW1vcnkgdXNhZ2UuCisgKgorICogU3VnZ2VzdGVkIGJ5IGNvbXBvbmVudCBmb3IgaW5wdXQgYW5kIG5lZ290aWF0ZWQgYmV0d2VlbiBjbGllbnQgYW5kIGNvbXBvbmVudCBmb3Igb3V0cHV0LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4VXNhZ2U+IEMyU3RyZWFtVXNhZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0VbXSA9ICJpbnB1dC5idWZmZXJzLnVzYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fVVNBR0VbXSA9ICJvdXRwdXQuYnVmZmVycy51c2FnZSI7CisKKy8qKgorICogUGljdHVyZSAodmlkZW8gb3IgaW1hZ2UgZnJhbWUpIHNpemUuCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVTaXplU3RydWN0IHsKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCgpCisgICAgICAgIDogd2lkdGgoMCksIGhlaWdodCgwKSB7IH0KKworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiB3aWR0aCh3aWR0aF8pLCBoZWlnaHQoaGVpZ2h0XykgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsgICAgIC8vLzwgdmlkZW8gd2lkdGgKKyAgICB1aW50MzJfdCBoZWlnaHQ7ICAgIC8vLzwgdmlkZW8gaGVpZ2h0CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVTaXplKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorfTsKKworLyoqCisgKiBPdXQgb2YgbWVtb3J5IHNpZ25hbGluZworICoKKyAqIFRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IHRvIG1hcmsgdGhhdCBpdCBjYW5ub3QgYWxsb2NhdGUgbmVjZXNzYXJ5IHByaXZhdGUgYW5kLworICogb3Igb3V0cHV0IGJ1ZmZlcnMgdG8gY29udGludWUgb3BlcmF0aW9uLCBhbmQgdG8gc2lnbmFsIHRoZSBmYWlsaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBDMk91dE9mTWVtb3J5U3RydWN0IHsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sOyAgIC8vLzwgcG9vbCBJRCB0aGF0IGZhaWxlZCB0aGUgYWxsb2NhdGlvbgorICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgLy8vPCBtZW1vcnkgdXNhZ2UgdXNlZAorICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgcGxhbmFyOyAgICAgLy8vPCBidWZmZXIgZGltZW5zaW9ucyB0byBiZSBhbGxvY2F0ZWQgaWYgMkQKKyAgICB1aW50MzJfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8vLzwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQgaWYgMkQKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIGNhcGFjaXR5IHRvIGJlIGFsbG9jYXRlZCBpZiAxRAorICAgIGMyX2Jvb2xfdCBvdXRPZk1lbW9yeTsgICAgICAgICAgIC8vLzwgdHJ1ZSBpZiBjb21wb25lbnQgaXMgb3V0IG9mIG1lbW9yeQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChPdXRPZk1lbW9yeSkKKyAgICBDMkZJRUxEKHBvb2wsICJwb29sIikKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQocGxhbmFyLCAicGxhbmFyIikKKyAgICBDMkZJRUxEKGZvcm1hdCwgImZvcm1hdCIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKG91dE9mTWVtb3J5LCAib3V0LW9mLW1lbW9yeSIpCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyT3V0T2ZNZW1vcnlTdHJ1Y3QsIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnk+IEMyT3V0T2ZNZW1vcnlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRfT0ZfTUVNT1JZW10gPSAiYWxnby5vb20iOworCisvKioKKyAqIE1heCBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgaXMgYSBoaW50IHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGV4cGVjdGVkIG9uIGEgc3RyZWFtIGZvciB0aGUKKyAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvbiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBUaGlzIGlzIGNvbW11bmljYXRlZCB0byBjbGllbnRzIHNvIHRoZXkKKyAqIGNhbiBwcmVhbGxvY2F0ZSBpbnB1dCBidWZmZXJzLCBvciBjb25maWd1cmUgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhIG1heGltdW0gc2l6ZSBvbgorICogdGhlaXIgYnVmZmVycy4KKyAqCisgKiBSZWFkLW9ubHkuIFJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGNvbXBvbmVudHMgb24gYWxsIGNvbXByZXNzZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplPiBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5tYXgtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMubWF4LXNpemUiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pc2MuIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUcmlwcGVkIHN0YXRlLAorICoKKyAqIFRoaXMgc3RhdGUgZXhpc3RzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSByZWFzb25pbmcgZm9yIGEgdHJpcHBlZCBzdGF0ZSBkdXJpbmcgbm9ybWFsCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucywgYXMgd2VsbCBhcyB0byBhbGxvdyBjbGllbnQgdG8gdHJpcCB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUcmlwcGVkPgorICAgICAgICBDMlRyaXBwZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UUklQUEVEW10gPSAiYWxnby50cmlwcGVkIjsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNvdW50ZXJzLgorICoKKyAqIENvbmZpZ3VyYXRpb25zIGFyZSB0cmFja2VkIHVzaW5nIHRocmVlIGNvdW50ZXJzLiBUaGUgaW5wdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGFjY2VwdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoZSBvdXRwdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGNvbXBsZXRlZCBieSB0aGUgY29tcG9uZW50IChpbiB0aGUgb3JkZXIgb2Ygd29yayBjb21wbGV0aW9uKS4gVGhlCisgKiBnbG9iYWwgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHRvIGVhY2ggY29uZmlnKCkgY2FsbC4gVGhlc2UgY291bnRlcnMKKyAqIHNoYWxsIGJlIHJlYWQtb25seS4KKyAqCisgKiBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY291bnRlcnMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMkNvbmZpZ0NvdW50ZXJUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9DT1VOVEVSW10gPSAiaW5wdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9DT1VOVEVSW10gPSAib3V0cHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT05GSUdfQ09VTlRFUltdID0gImFsZ28uY29uZmlnLmNvdW50ZXIiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNvdXJjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBSZXNvdXJjZXMgbmVlZGVkIGFuZCByZXNvdXJjZXMgcmVzZXJ2ZWQgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXNvdXJjZXMgYXJlIHRyYWNrZWQgYXMgYSB2ZWN0b3Igb2YgcG9zaXRpdmUgbnVtYmVycy4gQXZhaWxhYmxlIHJlc291cmNlcyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4KKyAqCisgKiBCeSBkZWZhdWx0LCBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudC4gSWYgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAqIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgYWJsZSB0byB1c2UgdGhvc2UgcmVzb3VyY2VzIGV4Y2x1c2l2ZWx5LiBJZiBob3dldmVyLCB0aGUgY29tcG9uZW50IGlzCisgKiBub3QgdXNpbmcgYWxsIG9mIHRoZSByZXNlcnZlZCByZXNvdXJjZXMsIHRob3NlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIFRPRE86IGRlZmluZSBzb21lIG9mIHRoZSByZXNvdXJjZXMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQ+IEMyUmVzb3VyY2VzTmVlZGVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkPgorICAgICAgICBDMlJlc291cmNlc1Jlc2VydmVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX05FRURFRFtdID0gInJlc291cmNlcy5uZWVkZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX1JFU0VSVkVEW10gPSAicmVzb3VyY2VzLnJlc2VydmVkIjsKKworLyoqCisgKiBPcGVyYXRpbmcgcmF0ZS4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiB3b3JrIHRocm91Z2ggdGhlIGNvbXBvbmVudC4gTmVnYXRpdmUgdmFsdWVzIGlzCisgKiBpbnZhbGlkLgorICoKKyAqIFRPRE86IHRoaXMgY291bGQgZGlzdGluZ3Vpc2ggc2V0IHZhbHVlCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGU+IEMyT3BlcmF0aW5nUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFW10gPSAiYWxnby5yYXRlIjsKKworLyoqCisgKiBSZWFsdGltZSAvIG9wZXJhdGluZyBwb2ludC4KKyAqCisgKiBQcmlvcml0eSB2YWx1ZSBkZWZpbmVzIHRoZSBvcGVyYXRpbmcgcG9pbnQgZm9yIHRoZSBjb21wb25lbnQuIE9wZXJhdGluZyBwb2ludHMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuIFByaW9yaXR5IHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIG9wZXJhdGlvbiBhdCB0aGUgZ2l2ZW4gb3BlcmF0aW5nCisgKiByYXRlLiBQcmlvcml0eSB2YWx1ZXMgLTEgYW5kIGJlbG93IGRlZmluZSBvcGVyYXRpbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UuIEluIHRoaXMKKyAqIGNhc2UgY2xpZW50IGV4cGVjdHMgYmVzdCBlZmZvcnQgd2l0aG91dCBleGNlZWRpbmcgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBwb2ludC4gVGhpcyBhbGxvd3MKKyAqIGNsaWVudCB0byBydW4gY29tcG9uZW50cyBkZWVwZXIgaW4gdGhlIGJhY2tncm91bmQgYnkgdXNpbmcgbGFyZ2VyIHByaW9yaXR5IHZhbHVlcy4gSW4gdGhlc2UKKyAqIGNhc2VzIG9wZXJhdGluZyByYXRlIGlzIGEgaGludCBmb3IgdGhlIG1heGltdW0gcmF0ZSB0aGF0IHRoZSBjbGllbnQgYW50aWNpcGF0ZXMuCisgKgorICogT3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGFyZSB1c2VkIGluIHRhbmRlbS4gRS5nLiBpZiB0aGVyZSBhcmUgY29tcG9uZW50cyB0aGF0IHJ1biBhdCBhCisgKiBoaWdoZXIgb3BlcmF0aW5nIHBvaW50IChwcmlvcml0eSkgaXQgd2lsbCBtYWtlIG1vcmUgcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgY29tcG9uZW50cyBhdAorICogYSBsb3dlciBvcGVyYXRpbmcgcG9pbnQsIHNvIG9wZXJhdGluZyByYXRlIGNhbiBiZSB1c2VkIHRvIGdhdGUgdGhvc2UgY29tcG9uZW50cy4KKyAqCisgKiBQb3NpdGl2ZSBwcmlvcml0eSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGF0IHRoZSBtb21lbnQgYW5kIHNoYWxsIGJlIHRyZWF0ZWQgZXF1aXZhbGVudCB0byAwLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5PgorICAgICAgICBDMlJlYWxUaW1lUHJpb3JpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklPUklUWVtdID0gImFsZ28ucHJpb3JpdHkiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZWN1cmUgbW9kZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KKyAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFW10gPSAiYWxnby5zZWN1cmUtbW9kZSI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5DT0RFUiBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBCaXRyYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Qml0cmF0ZT4gQzJTdHJlYW1CaXRyYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVbXSA9ICJjb2RlZC5iaXRyYXRlIjsKKworLyoqCisgKiBCaXRyYXRlIG1vZGUuCisgKgorICogVE9ETzogcmVmaW5lIHRoaXMgd2l0aCBiaXRyYXRlIHJhbmdlcyBhbmQgc3VnZ2VzdGVkIHdpbmRvdworICovCitDMkVOVU0oQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBCSVRSQVRFX0NPTlNUX1NLSVBfQUxMT1dFRCA9IDAsICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9DT05TVCA9IDEsICAgICAgICAgICAgICAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9WQVJJQUJMRV9TS0lQX0FMTE9XRUQgPSAyLCAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfVkFSSUFCTEUgPSAzLCAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfSUdOT1JFID0gNywgICAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIGJlIGV4Y2VlZGVkIGF0IHdpbGwgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YWxpdHkgb3Igb3RoZXIgc2V0dGluZ3MKKworICAgIC8vIGJpdHJhdGUgbW9kZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAgICBCSVRSQVRFX0ZMQUdfS0VFUF9BTExfRlJBTUVTID0gMSwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX1ZBUlkgPSAyLAorICAgIEJJVFJBVEVfRkxBR19DQU5fRVhDRUVEID0gNCwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZT4KKyAgICAgICAgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERVtdID0gImFsZ28uYml0cmF0ZS1tb2RlIjsKKworLyoqCisgKiBRdWFsaXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhlIGhpZ2hlciB0aGUgYmV0dGVyIHRoZSBvdXRwdXQgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZgorICogbGVzcyBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBxdWFsaXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJTdHJlYW1RdWFsaXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlF1YWxpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9RVUFMSVRZW10gPSAiYWxnby5xdWFsaXR5IjsKKworLyoqCisgKiBDb21wbGV4aXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhpcyBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSByZXNvdXJjZXMgdGhlIGNvbXBvbmVudAorICogd2lsbCB1c2UgdG8gcHJvZHVjZSBiZXR0ZXIgcXVhbGl0eSBhdCB0aGUgc2FtZSBjb21wcmVzc2lvbiBlZmZpY2llbmN5IG9yIGJldHRlciBjb21wcmVzc2lvbgorICogZWZmaWNpZW5jeSBhdCB0aGUgc2FtZSBxdWFsaXR5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBjb21wbGV4aXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyQ29tcGxleGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFlbXSA9ICJhbGdvLmNvbXBsZXhpdHkiOworCisvKioKKyAqIEhlYWRlciAoaW5pdC1kYXRhKSBoYW5kbGluZyBhcm91bmQgc3luYyBmcmFtZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90LCB1aW50MzJfdCwKKyAgICAvKioKKyAgICAgKiBkb24ndCBwcmVwZW5kIGhlYWRlci4gU2lnbmFsIGhlYWRlciBvbmx5IHRocm91Z2ggQzJTdHJlYW1Jbml0RGF0YUluZm8uCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fTk9ORSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lIGFuZCB0aGVyZWFmdGVyIGJlZm9yZSB0aGUgbmV4dCBzeW5jIGZyYW1lCisgICAgICogaWYgaXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0UsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgZXZlcnkgc3luYyBmcmFtZS4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQywKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZT4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkVbXSA9ICJyYXcuc2l6ZSI7CisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZENyb3BSZWN0PgorICAgICAgICBDMlN0cmVhbVNjYWxlZENyb3BSZWN0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX0NST1BfUkVDVFtdID0gInJhdy5zY2FsZWQtY3JvcCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29sb3IgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIENvbG9yIEluZm8KKyAqCisgKiBDaHJvbWEgbG9jYXRpb24gY2FuIHZhcnkgZm9yIHRvcCBhbmQgYm90dG9tIGZpZWxkcywgc28gdXNlIGFuIGFycmF5LCB0aGF0IGNhbiBoYXZlIDAgdG8gMgorICogdmFsdWVzLiBFbXB0eSBhcnJheSBpcyB1c2VkIGZvciBub24gWVVWIGZvcm1hdHMuCisgKi8KKworc3RydWN0IEMyQ29sb3IgeworICAgIGVudW0gbWF0cml4X3QgOiB1aW50MzJfdDsgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50IChZVVYgPD0+IFJHQikKKyAgICBlbnVtIHBsYW5lX2xheW91dF90IDogdWludDMyX3Q7ICAvLy88IHBsYW5lIGxheW91dCBmb3IgZmxleGlibGUgZm9ybWF0cworICAgIGVudW0gcHJpbWFyaWVzX3QgOiB1aW50MzJfdDsgIC8vLzwgY29sb3IgcHJpbWFyaWVzIGFuZCB3aGl0ZSBwb2ludAorICAgIGVudW0gcmFuZ2VfdCA6IHVpbnQzMl90OyAgLy8vPCByYW5nZSBvZiBjb2xvciBjb21wb25lbnQgdmFsdWVzCisgICAgZW51bSBzdWJzYW1wbGluZ190IDogdWludDMyX3Q7ICAvLy88IGNocm9tYSBzdWJzYW1wbGluZworICAgIGVudW0gdHJhbnNmZXJfdCA6IHVpbnQzMl90OyAgLy8vPCB0cmFuc2ZlciBmdW5jdGlvbgorfTsKKworLy8vIENocm9tYSBzdWJzYW1wbGluZworQzJFTlVNKEMyQ29sb3I6OnN1YnNhbXBsaW5nX3QsIHVpbnQzMl90LAorICAgIE1PTk9DSFJPTUUsICAgICAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzCisgICAgTU9OT0NIUk9NRV9BTFBIQSwgLy8vPCB0aGVyZSBhcmUgbm8gQ3Igbm9yIENiIHBsYW5lcywgYnV0IHRoZXJlIGlzIGFuIGFscGhhIHBsYW5lCisgICAgUkdCLCAgICAgICAgICAgIC8vLzwgUkdCCisgICAgUkdCQSwgICAgICAgICAgIC8vLzwgUkdCQQorICAgIFlVVl80MjAsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgYnkgMiBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgIFlVVl80MjIsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5CisgICAgWVVWXzQ0NCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgbm90IHN1YnNhbXBsZWQKKyAgICBZVVZBXzQ0NCwgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZCwgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKykKKworc3RydWN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0IHsKKyAgICAvLyBjaHJvbWEgb2Zmc2V0cyBkZWZpbmVkIGJ5IElUVQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80NDQoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMCgpIHsgcmV0dXJuIHsgMC4wZiwgMC41ZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8xKCkgeyByZXR1cm4geyAwLjVmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMygpIHsgcmV0dXJuIHsgMC41ZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF80KCkgeyByZXR1cm4geyAwLjBmLCAxLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzUoKSB7IHJldHVybiB7IDAuNWYsIDEuMGYgfTsgfQorCisgICAgZmxvYXQgeDsgICAgLy8vPCB4IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgcmlnaHQpCisgICAgZmxvYXQgeTsgICAgLy8vPCB5IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgZG93bikKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ2hyb21hT2Zmc2V0KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyQ29sb3JJbmZvU3RydWN0IHsKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgpCisgICAgICAgIDogYml0RGVwdGgoOCksIHN1YnNhbXBsaW5nKEMyQ29sb3I6OllVVl80MjApIHsgfQorCisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbXTsgLy8gbWF4IDIgZWxlbWVudHMKKworICAgIEMyQ29sb3JJbmZvU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgYml0RGVwdGhfLCBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nXykKKyAgICAgICAgOiBiaXREZXB0aChiaXREZXB0aF8pLCBzdWJzYW1wbGluZyhzdWJzYW1wbGluZ18pIHsgfQorCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfLAorICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyQ2hyb21hT2Zmc2V0U3RydWN0PiBsb2NhdGlvbnNfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0ICZsb2NhdGlvbiA6IGxvY2F0aW9uc18pIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2F0aW9uc1tpeF0gPSBsb2NhdGlvbjsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoQ29sb3JJbmZvLCBsb2NhdGlvbnMpCisgICAgQzJGSUVMRChiaXREZXB0aCwgImJpdC1kZXB0aCIpCisgICAgQzJGSUVMRChzdWJzYW1wbGluZywgInN1YnNhbXBsaW5nIikKKyAgICBDMkZJRUxEKGxvY2F0aW9ucywgImxvY2F0aW9ucyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9ySW5mb1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckluZm8+IEMyU3RyZWFtQ29sb3JJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09MT1JfSU5GT1tdID0gInJhdy5jb2xvci1mb3JtYXQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GT1tdID0gImNvZGVkLmNvbG9yLWZvcm1hdCI7CisKKy8qKgorICogQ29sb3IgQXNwZWN0cworICovCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgZW51bWVyYXRvcnMgaXMgYXMgZGVzY3JpYmVkIGluIElUVS1UIEguMjczLiAqLworCisvLy8gUmFuZ2UKK0MyRU5VTShDMkNvbG9yOjpyYW5nZV90LCB1aW50MzJfdCwKKyAgICBSQU5HRV9VTlNQRUNJRklFRCwgICAgICAgICAgLy8vPCByYW5nZSBpcyB1bnNwZWNpZmllZAorICAgIFJBTkdFX0ZVTEwsICAgICAgICAgICAgICAgICAvLy88IGZ1bGwgcmFuZ2UKKyAgICBSQU5HRV9MSU1JVEVELCAgICAgICAgICAgICAgLy8vPCBsaW1pdGVkIHJhbmdlCisKKyAgICBSQU5HRV9WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcmFuZ2UgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBSQU5HRV9PVEhFUiA9IDBYRkYgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBDb2xvciBwcmltYXJpZXMKK0MyRU5VTShDMkNvbG9yOjpwcmltYXJpZXNfdCwgdWludDMyX3QsCisgICAgUFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHByaW1hcmllcyBhcmUgdW5zcGVjaWZpZWQKKyAgICBQUklNQVJJRVNfQlQ3MDksICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS02IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ0NzBfTSwgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MC02IFN5c3RlbSBNIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC42MDEtNiA1MjUgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19HRU5FUklDX0ZJTE0sICAgICAgICAgLy8vPCBHZW5lcmljIEZpbG0KKyAgICBQUklNQVJJRVNfQlQyMDIwLCAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19SUDQzMSwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBSUCA0MzEtMiBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0VHNDMyLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIEVHIDQzMi0xIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUJVMzIxMywgICAgICAgICAgICAgIC8vLzwgRUJVIFRlY2guMzIxMy1FIG9yIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLworICAgIFBSSU1BUklFU19WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcHJpbWFyaWVzIHZhbHVlcyBzdGFydCBoZXJlCisgICAgUFJJTUFSSUVTX09USEVSID0gMHhmZiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIFRyYW5zZmVyIGZ1bmN0aW9uCitDMkVOVU0oQzJDb2xvcjo6dHJhbnNmZXJfdCwgdWludDMyX3QsCisgICAgVFJBTlNGRVJfVU5TUEVDSUZJRUQsICAgICAgICAgICAvLy88IHRyYW5zZmVyIGlzIHVuc3BlY2lmaWVkCisgICAgVFJBTlNGRVJfTElORUFSLCAgICAgICAgICAgICAgICAvLy88IExpbmVhciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MKKyAgICBUUkFOU0ZFUl9TUkdCLCAgICAgICAgICAgICAgICAgIC8vLzwgc1JHQiBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfMTcwTSwgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDE3ME0gb3IgZXF1aXZhbGVudCAoZS5nLiBCVC42MDEvNzA5LzIwMjApCisgICAgVFJBTlNGRVJfR0FNTUEyMiwgICAgICAgICAgICAgICAvLy88IEFzc3VtZWQgZGlzcGxheSBnYW1tYSAyLjIKKyAgICBUUkFOU0ZFUl9HQU1NQTI4LCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuOAorICAgIFRSQU5TRkVSX1NUMjA4NCwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC8xMi8xNC8xNiBiaXQgc3lzdGVtcworICAgIFRSQU5TRkVSX0hMRywgICAgICAgICAgICAgICAgICAgLy8vPCBBUklCIFNURC1CNjcgaHlicmlkLWxvZy1nYW1tYQorCisgICAgVFJBTlNGRVJfMjQwTSA9IDB4NDAsICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX1hWWUNDLCAgICAgICAgICAgICAgICAgLy8vPCBJRUMgNjE5NjYtMi00IG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl9CVDEzNjEsICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjEzNjEgZXh0ZW5kZWQgZ2FtdXQKKyAgICBUUkFOU0ZFUl9TVDQyOCwgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgU1QgNDI4LTEgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgVFJBTlNGRVJfVkVORE9SX1NUQVJUID0gMHg4MCwgICAvLy88IHZlbmRvci1zcGVjaWZpYyB0cmFuc2ZlciB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFRSQU5TRkVSX09USEVSID0gMHhmZiAgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBNYXRyaXggY29lZmZpY2llbnQKK0MyRU5VTShDMkNvbG9yOjptYXRyaXhfdCwgdWludDMyX3QsCisgICAgTUFUUklYX1VOU1BFQ0lGSUVELCAgICAgICAgICAgICAvLy88IG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHVuc3BlY2lmaWVkCisgICAgTUFUUklYX0JUNzA5LCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC43MDktNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgICAgICAgICAvLy88IEZDQyBUaXRsZSA0NyBDRlIgNzMuNjgyIG9yIGVxdWl2YWxlbnQgKEtSPTAuMzAsIEtCPTAuMTEpCisgICAgTUFUUklYX0JUNjAxLCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC40NzAsIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYXzI0ME0sICAgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIE1BVFJJWF9CVDIwMjAsICAgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIGNvbnN0YW50IGx1bWluYW5jZQorICAgIE1BVFJJWF9WRU5ET1JfU1RBUlQgPSAweDgwLCAgICAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgbWF0cml4IGNvZWZmaWNpZW50IHZhbHVlcyBzdGFydCBoZXJlCisgICAgTUFUUklYX09USEVSID0gMHhmZiwgICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCB1aW50MzJfdCBjb3VudF8pCisgICAgICAgIDogdHlwZV8odHlwZSksIGNvdW50KGNvdW50XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEdvcExheWVyKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGNvdW50LCAiY291bnQiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyR29wTGF5ZXJTdHJ1Y3Q+LCBrUGFyYW1JbmRleEdvcD4KKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9HT1BbXSA9ICJjb2RpbmcuZ29wIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCisgKgorICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZAorICogc3luY2hyb25vdXNseSB3aXRoIHRoZSB3b3JrLCBvciBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50IC0gbGVhZGluZyB0byBkaWZmZXJlbnQgcmVzdWx0LgorICogSWYgaXQgaXMgcGFzc2VkIHdpdGggd29yaywgaXQgc2hhbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGF0IHdvcmsgaXRlbSBpcyBiZWluZyBwcm9jZXNzZWQgKHNvCisgKiB0aGUgZmlyc3QgSSBmcmFtZSBhdCBvciBhZnRlciB0aGF0IHdvcmsgaXRlbSBzaGFsbCBiZSBhIHN5bmMgZnJhbWUpLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lPgorICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJjb2RpbmcucmVxdWVzdC1zeW5jLWZyYW1lIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGludGVydmFsIGluIHRpbWUgZG9tYWluICh0aW1lc3RhbXApLgorICoKKyAqIElmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGlzIHZhbHVlLCB0aGUgbmV4dCBpbnRyYSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkCisgKiBhcyBhIHN5bmMgZnJhbWUuIFRoZSB2YWx1ZSBvZiBNQVhfSTY0IG9yIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gc3luYyBmcmFtZXMgYWZ0ZXIgdGhlIGZpcnN0CisgKiBmcmFtZS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGFsbCBzeW5jIGZyYW1lcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWw+CisgICAgICAgIEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMW10gPSAiY29kaW5nLnN5bmMtZnJhbWUtaW50ZXJ2YWwiOworCisvKioKKyAqIFRlbXBvcmFsIGxheWVyaW5nCisgKgorICogTGF5ZXIgaW5kZXggaXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIGxheWVyIGNvdW50IC0gMS4gTGF5ZXJzIHdpdGggaGlnaGVyIGluZGV4IGhhdmUgaGlnaGVyCisgKiBmcmVxdWVuY3k6CisgKiAgICAgMAorICogICAxICAgMQorICogIDIgMiAyIDIKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckluZGV4PiBDMlN0cmVhbUxheWVySW5kZXhJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfSU5ERVhbXSA9ICJjb2RlZC5sYXllci1pbmRleCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TGF5ZXJDb3VudD4gQzJTdHJlYW1MYXllckNvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0xBWUVSX0NPVU5UW10gPSAiY29kZWQubGF5ZXItY291bnQiOworCitzdHJ1Y3QgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0IHsKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QoKQorICAgICAgICA6IGxheWVyQ291bnQoMCksIGJMYXllckNvdW50KDApIHsgfQorCisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KHNpemVfdCAvKiBmbGV4Q291bnQgKi8sIHVpbnQzMl90IGxheWVyQ291bnRfLCB1aW50MzJfdCBiTGF5ZXJDb3VudF8pCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGZsb2F0PiByYXRpb3MpCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGZsb2F0IHJhdGlvIDogcmF0aW9zKSB7CisgICAgICAgICAgICBpZiAoaXggPT0gZmxleENvdW50KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiaXRyYXRlUmF0aW9zW2l4KytdID0gcmF0aW87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBsYXllckNvdW50OyAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgbGF5ZXJzICgwIG1lYW5zIG5vIHRlbXBvcmFsIGxheWVyaW5nKQorICAgIHVpbnQzMl90IGJMYXllckNvdW50OyAgICAvLy88IHRvdGFsIG51bWJlciBvZiBiaWRpcmVjdGlvbmFsIGxheWVycyAoPD0gbnVtIGxheWVycykKKyAgICAvKioKKyAgICAgKiBCaXRyYXRlIGJ1ZGdldHMgZm9yIGVhY2ggbGF5ZXIgYW5kIHRoZSBsYXllcnMgYmVsb3csIGdpdmVuIGFzIGEgcmF0aW8gb2YgdGhlIHRvdGFsCisgICAgICogc3RyZWFtIGJpdHJhdGUuIFRoaXMgY2FuIGJlIG9taXR0ZWQgb3IgcGFydGlhbGx5IHNwZWNpZmlmZWQgYnkgdGhlIGNsaWVudCB3aGlsZSBjb25maWd1cmluZywKKyAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb21wb25lbnQgc2hhbGwgZmlsbCBpbiBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBtaXNzaW5nIGxheWVycy4KKyAgICAgKiBUaGlzIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aGVuIHF1ZXJpZWQgZm9yIGF0IGxlYXN0IGxheWVyIGNvdW50IC0gMSAoYXMgdGhlCisgICAgICogbGFzdCBsYXllcidzIGJ1ZGdldCBpcyBhbHdheXMgMS4wKS4KKyAgICAgKi8KKyAgICBmbG9hdCBiaXRyYXRlUmF0aW9zW107ICAgLy8vPCAxLjAtYmFzZWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZW1wb3JhbExheWVyaW5nLCBiaXRyYXRlUmF0aW9zKQorICAgIEMyRklFTEQobGF5ZXJDb3VudCwgImxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJMYXllckNvdW50LCAiYi1sYXllci1jb3VudCIpCisgICAgQzJGSUVMRChiaXRyYXRlUmF0aW9zLCAiYml0cmF0ZS1yYXRpb3MiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZz4KKyAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkdbXSA9ICJjb2RpbmcudGVtcG9yYWwtbGF5ZXJpbmciOworCisvKioKKyAqIEludHJhLXJlZnJlc2guCisgKi8KKworQzJFTlVNKEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCwgdWludDMyX3QsCisgICAgSU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgICAgIC8vLzwgbm8gaW50cmEgcmVmcmVzaAorICAgIElOVFJBX1JFRlJFU0hfQVJCSVRSQVJZLCAgICAvLy88IGFyYml0cmFyeSwgdW5zcGVjaWZpZWQKKykKKworc3RydWN0IEMySW50cmFSZWZyZXNoU3RydWN0IHsKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdCgpCisgICAgICAgIDogbW9kZShDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCksIHBlcmlvZCgwLikgeyB9CisKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdChDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QgbW9kZV8sIGZsb2F0IHBlcmlvZF8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHBlcmlvZChwZXJpb2RfKSB7IH0KKworICAgIEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlOyAvLy88IHJlZnJlc2ggbW9kZQorICAgIGZsb2F0IHBlcmlvZDsgICAgICAgICAvLy88IGludHJhIHJlZnJlc2ggcGVyaW9kIGluIGZyYW1lcyAobXVzdCBiZSA+PSAxKSwgMCBtZWFucyBkaXNhYmxlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChJbnRyYVJlZnJlc2gpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRChwZXJpb2QsICJwZXJpb2QiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludHJhUmVmcmVzaFN0cnVjdCwga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2g+CisgICAgICAgIEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSFtdID0gImNvZGluZy5pbnRyYS1yZWZyZXNoIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UgQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRpbGUgbGF5b3V0LgorICoKKyAqIFRoaXMgZGVzY3JpYmVkIGhvdyB0aGUgaW1hZ2UgaXMgZGVjb21wb3NlZCBpbnRvIHRpbGVzLgorICovCitDMkVOVU0oQzJDb25maWc6OnNjYW5fb3JkZXJfdCwgdWludDMyX3QsCisgICAgU0NBTl9MRUZUX1RPX1JJR0hUX1RIRU5fRE9XTgorKQorCitzdHJ1Y3QgQzJUaWxlTGF5b3V0U3RydWN0IHsKKyAgICBDMlBpY3R1cmVTaXplU3RydWN0IHRpbGU7ICAgICAgIC8vLzwgdGlsZSBzaXplCisgICAgdWludDMyX3QgY29sdW1uQ291bnQ7ICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aWxlcyBob3Jpem9udGFsbHkKKyAgICB1aW50MzJfdCByb3dDb3VudDsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIHZlcnRpY2FsbHkKKyAgICBDMkNvbmZpZzo6c2Nhbl9vcmRlcl90IG9yZGVyOyAgIC8vLzwgdGlsZSBvcmRlcgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUaWxlTGF5b3V0KQorICAgIEMyRklFTEQodGlsZSwgInRpbGUiKQorICAgIEMyRklFTEQoY29sdW1uQ291bnQsICJjb2x1bW5zIikKKyAgICBDMkZJRUxEKHJvd0NvdW50LCAicm93cyIpCisgICAgQzJGSUVMRChvcmRlciwgIm9yZGVyIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVGlsZUxheW91dFN0cnVjdCwga1BhcmFtSW5kZXhUaWxlTGF5b3V0PiBDMlN0cmVhbVRpbGVMYXlvdXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVRbXSA9ICJjb2RlZC50aWxlLWxheW91dCI7CisKKy8qKgorICogVGlsZSBoYW5kbGluZy4KKyAqCisgKiBXaGV0aGVyIHRvIGNvbmNhdGVuYXRlIHRpbGVzIG9yIG91dHB1dCB0aGVtIGVhY2guCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6dGlsaW5nX21vZGVfdCwgdWludDMyX3QsCisgICAgVElMSU5HX1NFUEFSQVRFLCAgICAvLy88IG91dHB1dCBlYWNoIHRpbGUgaW4gYSBzZXBhcmF0ZSBvbldvcmtEb25lCisgICAgVElMSU5HX0NPTkNBVEVOQVRFICAvLy88IG91dHB1dCBvbmUgd29yayBjb21wbGV0aW9uIHBlciBmcmFtZSAoY29uY2F0ZW5hdGUgdGlsZXMpCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVIYW5kbGluZz4KKyAgICAgICAgQzJTdHJlYW1UaWxlSGFuZGxpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0hBTkRMSU5HW10gPSAiY29kaW5nLnRpbGUtaGFuZGxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBVURJTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogU2FtcGxlIHJhdGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTYW1wbGVSYXRlPiBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEVbXSA9ICJyYXcuc2FtcGxlLXJhdGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEVbXSA9ICJjb2RlZC5zYW1wbGUtcmF0ZSI7CisKKy8qKgorICogQ2hhbm5lbCBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcuY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQuY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogTWF4IGNoYW5uZWwgY291bnQuIFVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb2RlZCBvciBkZWNvZGVkIGNoYW5uZWxzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudD4gQzJTdHJlYW1NYXhDaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcubWF4LWNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5tYXgtY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogQXVkaW8gc2FtcGxlIGZvcm1hdCAoUENNIGVuY29kaW5nKQorICovCitDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKKyAgICBQQ01fMTYsCisgICAgUENNXzgsCisgICAgUENNX0ZMT0FUCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBjbV9lbmNvZGluZ190Piwga1BhcmFtSW5kZXhQY21FbmNvZGluZz4KKyAgICAgICAgQzJTdHJlYW1QY21FbmNvZGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkdbXSA9ICJyYXcucGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1BDTV9FTkNPRElOR1tdID0gImNvZGVkLnBjbS1lbmNvZGluZyI7CisKKy8qKgorICogQUFDIFNCUiBNb2RlLiBVc2VkIGR1cmluZyBlbmNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdCwgdWludDMyX3QsCisgICAgQUFDX1NCUl9PRkYsCisgICAgQUFDX1NCUl9TSU5HTEVfUkFURSwKKyAgICBBQUNfU0JSX0RVQUxfUkFURSwKKyAgICBBQUNfU0JSX0FVVE8gLy8vPCBsZXQgdGhlIGNvZGVjIGRlY2lkZQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdD4sIGtQYXJhbUluZGV4QWFjU2JyTW9kZT4KKyAgICAgICAgQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFW10gPSAiY29kaW5nLmFhYy1zYnItbW9kZSI7CisKKy8qKgorICogRFJDIENvbXByZXNzaW9uLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90LCBpbnQzMl90LAorICAgIERSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgRFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgIERSQ19DT01QUkVTU0lPTl9IRUFWWSAvLy88CispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24+CisgICAgICAgIEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREVbXSA9ICJjb2RpbmcuZHJjLmNvbXByZXNzaW9uLW1vZGUiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTFtdID0gImNvZGluZy5kcmMucmVmZXJlbmNlLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLmVuY29kZWQtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SW10gPSAiY29kaW5nLmRyYy5ib29zdC1mYWN0b3IiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiY29kaW5nLmRyYy5hdHRlbnVhdGlvbi1mYWN0b3IiOworCisvKioKKyAqIERSQyBFZmZlY3QgVHlwZSAoc2VlIElTTyAyMzAwMy00KSBVbmlmb3JtIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3QsIGludDMyX3QsCisgICAgRFJDX0VGRkVDVF9PRE1fREVGQVVMVCA9IC0yLCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfRUZGRUNUX09GRiA9IC0xLCAgICAvLy88IG5vIERSQworICAgIERSQ19FRkZFQ1RfTk9ORSA9IDAsICAgIC8vLzwgbm8gRFJDIGV4Y2VwdCB0byBwcmV2ZW50IGNsaXBwaW5nCisgICAgRFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgIERSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgRFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgIERSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgIERSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgIERSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTgorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlPgorICAgICAgICBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEVbXSA9ICJjb2RpbmcuZHJjLmVmZmVjdC10eXBlIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFBQyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFBQyBzdHJlYW0gZm9ybWF0CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190LCB1aW50MzJfdCwKKyAgICBBQUNfUEFDS0FHSU5HX1JBVywKKyAgICBBQUNfUEFDS0FHSU5HX0FEVFMKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmc+IEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvIEMyU3RyZWFtQWFjRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkdbXSA9ICJjb2RlZC5hYWMtcGFja2FnaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUExBVEZPUk0tREVGSU5FRCBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogUGxhdGZvcm0gbGV2ZWwgYW5kIGZlYXR1cmVzLgorICovCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3QgeworICAgIFBMQVRGT1JNX1AsICAgLy8vPCBzdXBwb3J0IGZvciBBbmRyb2lkIDkuMCBmZWF0dXJlIHNldAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWw+CisgICAgICAgIEMyUGxhdGZvcm1MZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9MRVZFTFtdID0gImFwaS5wbGF0Zm9ybS1sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICAvLyBubyBwbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcz4KKyAgICAgICAgQzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0ZFQVRVUkVTW10gPSAiYXBpLnBsYXRmb3JtLWZlYXR1cmVzIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBpb24gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIG1lbW9yeSB1c2FnZS4KKyAqLworc3RydWN0IEMyU3RvcmVJb25Vc2FnZVN0cnVjdCB7CisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QodWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgaGVhcE1hc2soMCksIGFsbG9jRmxhZ3MoMCksIG1pbkFsaWdubWVudCgwKSB7IH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAvLy88IGNhcGFjaXR5CisgICAgaW50MzJfdCBoZWFwTWFzazsgICAgICAvLy88IGlvbiBoZWFwTWFzaworICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIHVpbnQzMl90IG1pbkFsaWdubWVudDsgLy8vPCBtaW5pbXVtIGFsaWdubWVudAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChTdG9yZUlvblVzYWdlKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGhlYXBNYXNrLCAiaGVhcC1tYXNrIikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChtaW5BbGlnbm1lbnQsICJtaW4tYWxpZ25tZW50IikKK307CisKKy8vIHN0b3JlLCBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZT4KKyAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKKworLyoqCisgKiBGbGV4aWJsZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgeworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGJpdERlcHRoOworICAgIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmc7CisgICAgQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QgbGF5b3V0OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcikKKyAgICBDMkZJRUxEKHBpeGVsRm9ybWF0LCAicGl4ZWwtZm9ybWF0IikKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobGF5b3V0LCAibGF5b3V0IikKK307CisKKy8qKgorICogUGxhbmUgbGF5b3V0IG9mIGZsZXhpYmxlIHBpeGVsIGZvcm1hdHMuCisgKgorICogYnBwOiBieXRlcyBwZXIgY29sb3IgY29tcG9uZW50LCBlLmcuIDEgZm9yIDgtYml0IGZvcm1hdHMsIGFuZCAyIGZvciAxMC0xNi1iaXQgZm9ybWF0cy4KKyAqLworQzJFTlVNKEMyQ29sb3I6OnBsYW5lX2xheW91dF90LCB1aW50MzJfdCwKKyAgICAgICAvKiogVW5rbm93biBsYXlvdXQgKi8KKyAgICAgICBVTktOT1dOX0xBWU9VVCwKKworICAgICAgIC8qKiBQbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jID0gYnBwKSAqLworICAgICAgIFBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogU2VtaXBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmNfWS9BID0gYnBwIChwbGFuYXIpLAorICAgICAgICAqICBjb2xJbmNfQ2IvQ3IgPSAyKmJwcCAoaW50ZXJsZWF2ZWQpLiBVc2VkIG9ubHkgZm9yIFlVVihBKSBmb3JtYXRzLiAqLworICAgICAgIFNFTUlQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIHBhY2tlZC4gY29sSW5jID0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgYWxpZ25lZC4gY29sSW5jID0gc21hbGxlc3QgcG93ZXIgb2YgMiA+PSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvcgorICAgICAgICAqICBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX0FMSUdORUQKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycz4KKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIGRhdGFzcGFjZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGF0YVNwYWNlPiBDMlN0cmVhbURhdGFTcGFjZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFW10gPSAicmF3LmRhdGEtc3BhY2UiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBzdXJmYWNlIHNjYWxpbmcgbW9kZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmc+IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc3VyZmFjZS1zY2FsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElOUFVUIFNVUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW5wdXQgc3VyZmFjZSBFT1MKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zPgorICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TW10gPSAiaW5wdXQtc3VyZmFjZS5lb3MiOworCisvKioKKyAqIFN0YXJ0L3N1c3BlbmQvcmVzdW1lL3N0b3AgY29udHJvbHMgYW5kIHRpbWVzdGFtcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogVE9ETzogbWFrZSB0aGVzZSBjb3VudGVycworICovCisKK3N0cnVjdCBDMlRpbWVkQ29udHJvbFN0cnVjdCB7CisgICAgYzJfYm9vbF90IGVuYWJsZWQ7IC8vLzwgY29udHJvbCBpcyBlbmFibGVkCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgaWYgZW5hYmxlZCwgdGltZSB0aGUgY29udHJvbCBzaG91bGQgdGFrZSBlZmZlY3QKKworICAgIEMyVGltZWRDb250cm9sU3RydWN0KCkKKyAgICAgICAgOiBlbmFibGVkKEMyX0ZBTFNFKSwgdGltZXN0YW1wKDApIHsgfQorCisgICAgLyogaW1wbGljaXQgKi8gQzJUaW1lZENvbnRyb2xTdHJ1Y3QodWludDY0X3QgdGltZXN0YW1wXykKKyAgICAgICAgOiBlbmFibGVkKEMyX1RSVUUpLCB0aW1lc3RhbXAodGltZXN0YW1wXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVkQ29udHJvbCkKKyAgICBDMkZJRUxEKGVuYWJsZWQsICAgImVuYWJsZWQiKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0YXJ0QXQ+CisgICAgICAgIEMyUG9ydFN0YXJ0VGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVEFSVF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RhcnQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3VzcGVuZEF0PgorICAgICAgICBDMlBvcnRTdXNwZW5kVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVVNQRU5EX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdXNwZW5kIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFJlc3VtZUF0PgorICAgICAgICBDMlBvcnRSZXN1bWVUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1JFU1VNRV9BVFtdID0gImlucHV0LXN1cmZhY2UucmVzdW1lIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0b3BBdD4KKyAgICAgICAgQzJQb3J0U3RvcFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RPUF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RvcCI7CisKKy8qKgorICogVGltZSBvZmZzZXQgZm9yIGlucHV0IHN1cmZhY2UuIElucHV0IHRpbWVzdGFtcCB0byBjb2RlYyBpcyBzdXJmYWNlIGJ1ZmZlciB0aW1lc3RhbXAgcGx1cyB0aGlzCisgKiB0aW1lIG9mZnNldC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4VGltZU9mZnNldD4gQzJDb21wb25lbnRUaW1lT2Zmc2V0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FX09GRlNFVFtdID0gImlucHV0LXN1cmZhY2UudGltZS1vZmZzZXQiOworCisvKioKKyAqIE1pbmltdW0gZnBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFJlcGVhdCBmcmFtZSB0byBtZWV0IHRoaXMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGU+IEMyUG9ydE1pbkZyYW1lUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfTUlOX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC1zdXJmYWNlLm1pbi1mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lc3RhbXAgYWRqdXN0bWVudCAob3ZlcnJpZGUpIGZvciBpbnB1dCBzdXJmYWNlIGJ1ZmZlcnMuIFRoZXNlIGNvbnRyb2wgdGhlIGlucHV0IHRpbWVzdGFtcAorICogZmVkIHRvIHRoZSBjb2RlYywgYnV0IGRvIG5vdCBpbXBhY3QgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QgeworICAgIC8vLyBjb250cm9sIG1vZGVzCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKTsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QobW9kZV90IG1vZGVfLCB1aW50NjRfdCB2YWx1ZV8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHZhbHVlKHZhbHVlXykgeyB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgLy8vPCBjb250cm9sIG1vZGUKKyAgICB1aW50NjRfdCB2YWx1ZTsgLy8vPCBjb250cm9sIHZhbHVlIGZvciBnYXAgYmV0d2VlbiB0d28gdGltZXN0YW1wCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVzdGFtcEdhcEFkanVzdG1lbnQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK0MyRU5VTShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBNSU5fR0FQLAorICAgIEZJWEVEX0dBUCwKKyk7CisKK2lubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6OkMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpCisgICAgOiBtb2RlKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6Tk9ORSksIHZhbHVlKDApIHsgfQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkVOVU1fSF8KKyNkZWZpbmUgQzJFTlVNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVG9vbHMgZm9yIGVhc2llciBlbnVtIHN1cHBvcnQuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCisgKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0MyRW51bUNvbnN0IHsKK3B1YmxpYzoKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAorICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAorICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCisgICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KKyAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKKyAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Citwcml2YXRlOgorICAgIFQgX21WYWx1ZTsKK307CisKKy8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQorLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKKy8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorCisvLy8gXGVuZGNvbmQKKworY2xhc3MgX0MyRW51bVV0aWxzIHsKKyAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSk7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXggPSBudWxscHRyKTsKKworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X0VudW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorICAgIC8vIHRoaXMgbWF5IG5vdCBiZSB1c2VkLi4uCisgICAgc3RhdGljIEMyX0hJREUgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IG51bGxwdHIpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzID0gc2FuaXRpemVFbnVtVmFsdWVOYW1lcyhuYW1lcywgcHJlZml4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpICYmIGkgPCBzYW5pdGl6ZWROYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKHNhbml0aXplZE5hbWVzW2ldLCB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgY3VzdG9tRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIEU+PiBpdGVtcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIHR5cGUsIHByZWZpeCwgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUiMjZW5hYmxlZChuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgcHJlZml4KTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIjI2VuYWJsZWQobmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6Y3VzdG9tRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgbmFtZT4+IG5hbWVzKTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyLiBUaGUgZGVmYXVsdCBtYXBwZXIKKyAqIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggYWNyb3NzIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcywgYW5kCisgKiByZXBsYWNlcyBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTShjMl9lbnVtX3QsIHVpbnQzMl90LAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICIxIiwgQzJfVkFMVUUyID0+ICIyIiwgLi4uCisgKiAgLy8gbG9uZ2VzdCBjb21tb24gcHJlZml4IGlzICJDMl9WQUxVRSIKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICovCisjZGVmaW5lIEMyRU5VTShuYW1lLCB0eXBlLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBudWxscHRyLCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlciBidXQgY3VzdG9tIHByZWZpeC4gVGhlIGRlZmF1bHQKKyAqIG1hcHBlciByZW1vdmVzIHRoZSBwcmVmaXggZnJvbSBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMgKGlmIHByZXNlbnQpLCBhbmQKKyAqIGluc2VydHMgZGFzaGVzIGF0IGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyAobG93SGlnaCBiZWNvbWVzIGxvdy1oaWdoKSBhbmQgYWxzbyByZXBsYWNlcworICogbm9uLWxlYWRpbmcgdW5kZXJzY29yZXMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fUFJFRklYKGMyX2VudW1fdCwgdWludDMyX3QsICJDMl8iLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJWQUxVRTEiLCBDMl9WQUxVRTIgPT4gIlZBTFVFMiIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKiBccGFyYW0gcHJlZml4IHByZWZpeCB0byByZW1vdmUKKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX1BSRUZJWChuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCBjdXN0b20gbmFtZXMuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fTkFNRVMoU29tZVN0cnVjdDo6YzJfZW51bV90LCB1aW50MzJfdCwgKHsKKyAqICAgICAgeyAiT25lIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUxIH0sCisgKiAgICAgIHsgIlR3byIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMiB9LAorICogICAgICB7ICJUaHJlZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMyB9IH0pLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKgorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiT25lIiwgQzJfVkFMVUUyID0+ICJUd28iLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9OQU1FUyhuYW1lLCB0eXBlLCBuYW1lcywgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykKKworLyoqCisgKiBNYWtlIGVudW1zIHVzYWJsZSBhcyB0aGVpciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBOb3RlOiB0aGlzIG1ha2VzIHRoZW0gbm90IHVzYWJsZSBpbiBwcmludGYoKQorICovCit0ZW1wbGF0ZTxjbGFzcyBFPgorc3RydWN0IEMyRWFzeUVudW0geworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICBFIHZhbHVlOworICAgIC8vIGRlZmluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgRSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKEUgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXykgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKFUgdmFsdWVfKSA6IHZhbHVlKEUodmFsdWVfKSkgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKCkgPSBkZWZhdWx0OworfTsKKworLy8gbWFrZSBDMkVhc3lFbnVtIGJlaGF2ZSBsaWtlIGEgcmVndWxhciBlbnVtCisKK25hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IGlzX2VudW08QzJFYXN5RW51bTxFPj4geworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQzJFTlVNX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJQQVJBTV9IXworI2RlZmluZSBDMlBBUkFNX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCisKKy8qIQorICogXGZpbGUKKyAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKKyAqID09PQorICoKKyAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCisgKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKKyAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKKyAqIG1ldGhvZHMuCisgKgorICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6CisgKgorICogUmVzdHJpY3Rpb25zOgorICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKKyAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCisgKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCisgKiAgIC0gc29tZSBjb21tb24gbWVtYmVyIGZpZWxkIG5hbWVzIGFyZSByZXNlcnZlZCBhcyB0aGV5IGFyZSBkZWZpbmVkIGFzIG1ldGhvZHMgZm9yIGFsbAorICogICAgIHBhcmFtZXRlcnM6CisgKiAgICAgdGhleSBhcmU6IHNpemUsIHR5cGUsIGtpbmQsIGluZGV4IGFuZCBzdHJlYW0KKyAqCisgKiBCZWhhdmlvcjoKKyAqIC0gUGFyYW1zIGNhbiBiZSBnbG9iYWwgKG5vdCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCksIHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0LAorICogICBvciByZWxhdGVkIHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uCisgKiAtIEFsbCBwYXJhbXMgYXJlIHF1ZXJpZWQvc2V0IHVzaW5nIGEgdW5pcXVlIHBhcmFtIGluZGV4LCB3aGljaCBpbmNvcnBvcmF0ZXMgYSBwb3RlbnRpYWwgc3RyZWFtCisgKiAgIGluZGV4IGFuZC9vciBwb3J0LgorICogLSBRdWVyeWluZyAoc3VwcG9ydGVkKSBwYXJhbXMgTVVTVCBuZXZlciBmYWlsLgorICogLSBBbGwgcGFyYW1zIE1VU1QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KKyAqIC0gSWYgc29tZSBmaWVsZHMgaGF2ZSAidW5zdXBwb3J0ZWQiIG9yICJpbnZhbGlkIiB2YWx1ZXMgZHVyaW5nIHNldHRpbmcsIHRoaXMgU0hPVUxEIGJlCisgKiAgIGNvbW11bmljYXRlZCB0byB0aGUgYXBwLgorICogICBhKSBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBhdm9pZGVkLiAgV2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMsIGluIGdlbmVyYWwsIGNvbXBvbmVudCBzaG91bGQgZG8KKyAqICAgICAiYmVzdCBlZmZvcnQiIHRvIGFwcGx5IGFsbCBzZXR0aW5ncy4gSXQgc2hvdWxkIGNoYW5nZSAiaW52YWxpZC91bnN1cHBvcnRlZCIgdmFsdWVzIHRvIHRoZQorICogICAgIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlcy4KKyAqICAgLSBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50IGJ5IGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWVzIGluIHR1bmUoKS8KKyAqICAgICBjb25maWd1cmUoKS4KKyAqICAgYikgSWYgZmFsbGluZyBiYWNrIHRvIGEgc3VwcG9ydGVkIHZhbHVlIGlzIGFic29sdXRlbHkgaW1wb3NzaWJsZSwgdGhlIGNvbXBvbmVudCBTSEFMTCByZXR1cm4KKyAqICAgICBhbiBlcnJvciBmb3IgdGhlIHNwZWNpZmljIHNldHRpbmcsIGJ1dCBzaG91bGQgY29udGludWUgdG8gYXBwbHkgb3RoZXIgc2V0dGluZ3MuCisgKiAgICAgVE9ETzogdGhpcyBjdXJyZW50bHkgbWF5IHJlc3VsdCBpbiB1bmludGVuZGVkIHJlc3VsdHMuCisgKgorICogKipOT1RFOioqIHVubGlrZSBPTVgsIHBhcmFtcyBhcmUgbm90IHZlcnNpb25lZC4gSW5zdGVhZCwgYSBuZXcgc3RydWN0IHdpdGggbmV3IHBhcmFtIGluZGV4CisgKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCisgKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqCisgKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKKyAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAorICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCisgKi8KKworLy8vIFxpbmdyb3VwIGludGVybmFsCisKKy8qKgorICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCisgKi8KK3N0cnVjdCBDMlBhcmFtIHsKKyAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gLSBraW5kIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKKyAgICAvLyAtIHNjb3BlCisgICAgLy8gICAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQorICAgIC8vICAgLSBzdHJlYW0gZmxhZworICAgIC8vICAgLSBzdHJlYW0gSUQgKHVzdWFsbHkgMCkKKyAgICAvLyAtIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdHlwZSAoY29yZSBpbmRleCkKKyAgICAvLyAgIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKKyAgICAvLyAgIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCisgICAgLy8gICAtIHR5cGUgaW5kZXggKHRoaXMgaW5jbHVkZXMgdGhlIHZlbmRvciBleHRlbnNpb24gZmxhZykKKyAgICAvLworICAgIC8vIGxheW91dDoKKyAgICAvLworICAgIC8vICAgICAgICBraW5kIDogPC0tLS0tLS0gc2NvcGUgLS0tLS0tLT4gOiA8LS0tLS0gY29yZSBpbmRleCAtLS0tLT4KKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIHR5cGUgaW5kZXggIHwKKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAorICAgIC8vCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCisgICAgICovCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PTkUgICAgPSAwLAorICAgICAgICBTVFJVQ1QgID0gKDEgPDwgMCksCisgICAgICAgIElORk8gICAgPSAoMSA8PCAxKSwKKyAgICAgICAgU0VUVElORyA9ICgxIDw8IDIpLAorICAgICAgICBUVU5JTkcgID0gKDEgPDwgMykgfCBTRVRUSU5HLCAvLyB0dW5pbmdzIGFyZSBzZXR0aW5ncworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW5kZXggc3BlY2lmaWVzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIG9mIGEgcGFyYW1ldGVyIGFzCisgICAgICogYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlciB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHBsYXRmb3JtIHR5cGVzIGFuZCB2ZW5kb3IgdHlwZXMuCisgICAgICoKKyAgICAgKiBQbGF0Zm9ybSB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gYW5kIGFyZSBjb21tb24gZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICoKKyAgICAgKiBWZW5kb3IgdHlwZXMgYXJlIGRlZmluZWQgYnkgZWFjaCB2ZW5kb3JzLCBzbyB0aGV5IG1heSBkaWZmZXIgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZW5kb3IgdHlwZXMgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgYnkgYSBzcGVjaWZpYworICAgICAqIHZlbmRvci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHVpbnQzMl90IHR5cGVfaW5kZXhfdDsKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgVFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQgPSAweDAwMDA4MDAwLCAvLy88IHZlbmRvciBpbmRpY2VzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29yZSBpbmRleCBpcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBwYXJhbWV0ZXIuIEl0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAgICogbGF5b3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbXBvbmVudCBvciBwYXJhbWV0ZXIga2luZC9zY29wZS4KKyAgICAgKgorICAgICAqIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGRpc3Rpbmd1aXNoIGdsb2JhbCBwYXJhbWV0ZXJzLCBhbmQgYWxzbyBwYXJhbWV0ZXJzIG9uIGEgZ2l2ZW4KKyAgICAgKiBwb3J0IG9yIHN0cmVhbS4gVGhleSBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHNldCBvZiBnbG9iYWwgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgICogc2V0IG9mIHBhcmFtZXRlcnMgb24gZWFjaCBwb3J0IG9yIGVhY2ggc3RyZWFtLCBidXQgdGhlIHNhbWUgY29yZSBpbmRleCBjYW4gYmUgdXNlZCBmb3IKKyAgICAgKiBwYXJhbWV0ZXJzIG9uIGRpZmZlcmVudCBzdHJlYW1zIG9yIHBvcnRzLCBhcyB3ZWxsIGFzIGZvciBnbG9iYWwgcGFyYW1ldGVycyBhbmQgcG9ydC9zdHJlYW0KKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogTXVsdGlwbGUgcGFyYW1ldGVyIHR5cGVzIGNhbiBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgbGF5b3V0IGZvciBhbGwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGNvcmUgaW5kZXggYWNyb3NzIGFsbCBjb21wb25lbnRzIG11c3QKKyAgICAgKiBiZSBpZGVudGljYWwuCisgICAgICovCisgICAgc3RydWN0IENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBJU19GTEVYX0ZMQUcgPSAweDAwMDEwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRkUwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMTcsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgY2xhc3M9ZGVjbHR5cGUoQzJQYXJhbShQKCkpKT4KKyAgICBQICpBcygpIHsgcmV0dXJuIFA6OkZyb20odGhpcyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQPgorICAgIGNvbnN0IFAgKkFzKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBQKj4oUDo6RnJvbShjb25zdF9jYXN0PEMyUGFyYW0qPih0aGlzKSkpOyB9CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIC8vLyBzZXRzIHRoZSBzdHJlYW0gZmllbGQuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8vLyBzZXRzIHRoZSBwb3J0IChkaXJlY3Rpb24pLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgorICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCisgICAgaW5saW5lIHZvaWQgaW52YWxpZGF0ZSgpIHsgX21TaXplID0gMDsgfQorCisgICAgLy8gaWYgb3RoZXIgaXMgdGhlIHNhbWUga2luZCBvZiAodmFsaWQpIHBhcmFtIGFzIHRoaXMsIGNvcHkgaXQgaW50byB0aGlzIGFuZCByZXR1cm4gdHJ1ZS4KKyAgICAvLyBvdGhlcndpc2UsIGRvIG5vdCBjb3B5IGFueXRoaW5nLCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlubGluZSBib29sIHVwZGF0ZUZyb20oY29uc3QgQzJQYXJhbSAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLl9tU2l6ZSA8PSBfbVNpemUgJiYgb3RoZXIuX21JbmRleCA9PSBfbUluZGV4ICYmIF9tU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSh0aGlzLCAmb3RoZXIsIG90aGVyLl9tU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gcmV0dXJucyB8b3wgaWYgaXQgaXMgYSBudWxsIHB0ciwgb3IgaWYgY2FuIHN1aXRhYmx5IGJlIGEgcGFyYW0gb2YgZ2l2ZW4gfHR5cGV8IChlLmcuIGhhcworICAgIC8vIHNhbWUgdHlwZSAoaWdub3Jpbmcgc3RyZWFtIElEKSwgYW5kIHNpemUpLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4gSWYgfGNoZWNrRGlyfCBpcyBmYWxzZSwKKyAgICAvLyBhbGxvdyB1bmRlZmluZWQgb3IgZGlmZmVyZW50IGRpcmVjdGlvbiAoZS5nLiBhcyBjb25zdHJ1Y3RlZCBmcm9tIEMyUG9ydFBhcmFtKCkgdnMuCisgICAgLy8gQzJQb3J0UGFyYW06OmlucHV0KSwgYnV0IHN0aWxsIHJlcXVpcmUgZXF1aXZhbGVudCB0eXBlIChzdHJlYW0sIHBvcnQgb3IgZ2xvYmFsKTsgb3RoZXJ3aXNlLAorICAgIC8vIHJldHVybiBudWxsLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgQzJQYXJhbSogSWZTdWl0YWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0qIG8sIHNpemVfdCBzaXplLCBUeXBlIHR5cGUsIHNpemVfdCBmbGV4U2l6ZSA9IDAsIGJvb2wgY2hlY2tEaXIgPSB0cnVlKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIgfHwgby0+X21TaXplIDwgc2l6ZSB8fCAoZmxleFNpemUgJiYgKChvLT5fbVNpemUgLSBzaXplKSAlIGZsZXhTaXplKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRGlyKSB7CisgICAgICAgICAgICByZXR1cm4gby0+X21JbmRleC50eXBlKCkgPT0gdHlwZS5tSW5kZXggPyBvIDogbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChvLT5fbUluZGV4LmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoby0+X21JbmRleC50eXBlKCkgXiB0eXBlLm1JbmRleCkgJiB+VHlwZTo6RElSX01BU0spID8gbnVsbHB0ciA6IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXgpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3Igd2l0aCBzdHJlYW0gc2V0CisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4LCB1bnNpZ25lZCBzdHJlYW0pCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4IHwgSW5kZXg6Ok1ha2VTdHJlYW1JZChzdHJlYW0pKSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7CisgICAgfQorCisgICAgdWludDMyX3QgX21TaXplOworICAgIEluZGV4IF9tSW5kZXg7Cit9OworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycworI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAorCisvKioKKyAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfU0VUVElORyB9OworfTsKKworLyoqCisgKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgeworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9UVU5JTkcgfTsKK307CisKKy8qKgorICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9JTkZPIH07Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCisgKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCisgKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKKyAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgorICovCitzdHJ1Y3QgX0MyRmllbGRJZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQorICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCisgICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KKyAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKKyAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVCopMCktPipwbSkpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA9PSBvdGhlci5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA8IG90aGVyLl9tT2Zmc2V0IHx8CisgICAgICAgICAgICAvLyBOT1RFOiBvcmRlciBwYXJlbnQgc3RydWN0dXJlIGJlZm9yZSBzdWIgZmllbGQKKyAgICAgICAgICAgIChfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPiBvdGhlci5fbVNpemUpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhfQzJGaWVsZElkKQorCisjaWYgMAorICAgIGlubGluZSB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBfbU9mZnNldDsgfQorICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZkLCA6OnN0ZDo6b3N0cmVhbSopOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKyAgICBmcmllbmQgc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOworCisgICAgdWludDMyX3QgX21PZmZzZXQ7IC8vIG9mZnNldCBvZiBmaWVsZAorICAgIHVpbnQzMl90IF9tU2l6ZTsgICAvLyBzaXplIG9mIGZpZWxkCit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgJ2ZpZWxkJyBpbiBhIGNvbmZpZ3VyYXRpb24uIFRoZSBmaWVsZAorICogY2FuIGJlIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLCBhIHN1YmZpZWxkIG9mIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLAorICogYW5kIGV2ZW4gdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24uIE1vcmVvdmVyLCBpZiB0aGUgZmllbGQgY2FuIHBvaW50IHRvIGFuCisgKiBlbGVtZW50IGluIGEgYXJyYXkgZmllbGQsIG9yIHRvIHRoZSBlbnRpcmUgYXJyYXkgZmllbGQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcXVlcnlpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCwgYXMgd2VsbAorICogYXMgY29tbXVuaWNhdGluZyBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMgd2hlbiB0cnlpbmcgdG8gY2hhbmdlCisgKiBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29tcG9uZW50L2ludGVyZmFjZSBvciBhIHN0b3JlLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIHN0cnVjdCBDMlNvbWVQYXJhbSB7CisgICAgICogICB1aW50MzJfdCBtRmllbGQ7CisgICAgICogICB1aW50MzJfdCBtQXJyYXlbMl07CisgICAgICogICBDMk90aGVyU3RydWN0IG1TdHJ1Y3Q7CisgICAgICogICB1aW50MzJfdCBtRmxleEFycmF5W107CisgICAgICogfSAqbVBhcmFtOworICAgICAqCisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheVswXSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bVN0cnVjdC5tU3ViRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXlbMl0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHRvZG8gZml4IHdoYXQgdGhpcyBpcyBmb3IgVFtdIChmb3Igbm93IHNpemUgYmVjb21lcyBUWzFdKQorICAgICAqCisgICAgICogXG5vdGUgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciA2NC1iaXQgbWVtYmVycyBhcyBpdCB0cmlnZ2VycyBhCisgICAgICogJ3Rha2luZyBhZGRyZXNzIG9mIHBhY2tlZCBtZW1iZXInIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG1lbWJlciBwb2ludGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZElkKChUKikoKHVpbnRwdHJfdClvZmZzZXQgLSAodWludHB0cl90KXBhcmFtKSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtRmllbGQgTWFrZShTJiBwYXJhbSwgVCYgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQocGFyYW0uaW5kZXgoKSwgKHVpbnRwdHJfdCkmb2Zmc2V0IC0gKHVpbnRwdHJfdCkmcGFyYW0sIHNpemVvZihUKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgbWVtYmVyIHBvaW50ZXIuIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuCisgICAgICogYXJyYXkgZWxlbWVudCBvciBhIHN1YmZpZWxkLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSwgJkMyU29tZVBhcmFtOjptTWVtYmVyRmllbGQpOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHAgcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gVCBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQgbWVtYmVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPmluZGV4KCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB0byBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSkuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwgX21GaWVsZElkKDB1LCBwYXJhbS0+c2l6ZSgpKSB7IH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKKyAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBDMlBhcmFtOjpJbmRleCBfbUluZGV4OyAvLy88IHBhcmFtZXRlciBpbmRleAorICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vLzwgZmllbGQgaWRlbnRpZmllcgorfTsKKworLyoqCisgKiBBIHNoYXJlZCAodW5pb24pIHJlcHJlc2VudGF0aW9uIG9mIG51bWVyaWMgdmFsdWVzCisgKi8KK2NsYXNzIEMyVmFsdWUgeworcHVibGljOgorICAgIC8vLyBBIHVuaW9uIG9mIHN1cHBvcnRlZCBwcmltaXRpdmUgdHlwZXMuCisgICAgdW5pb24gUHJpbWl0aXZlIHsKKyAgICAgICAgLy8gZmlyc3QgbWVtYmVyIGlzIGFsd2F5cyB6ZXJvIGluaXRpYWxpemVkIHNvIGl0IG11c3QgYmUgdGhlIGxhcmdlc3QKKyAgICAgICAgdWludDY0X3QgICAgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKKyAgICAgICAgaW50NjRfdCAgICAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyNjRfdCBjNjQ7ICAgLy8vPCBjMl9jbnRyNjRfdCB2YWx1ZQorICAgICAgICB1aW50MzJfdCAgICB1MzI7ICAgLy8vPCB1aW50MzJfdCB2YWx1ZQorICAgICAgICBpbnQzMl90ICAgICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCisgICAgICAgIGMyX2NudHIzMl90IGMzMjsgICAvLy88IGMyX2NudHIzMl90IHZhbHVlCisgICAgICAgIGZsb2F0ICAgICAgIGZwOyAgICAvLy88IGZsb2F0IHZhbHVlCisKKyAgICAgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ2NF90IHZhbHVlKSAgICA6IHU2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgICAgOiBpNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjY0X3QgdmFsdWUpIDogYzY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjMyX3QgdmFsdWUpIDogYzMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ4X3QgdmFsdWUpICAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjaGFyIHZhbHVlKSAgICAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgICAgIDogZnAodmFsdWUpICB7IH0KKworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBlbnVtIHR5cGUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08RT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgUHJpbWl0aXZlKEUgdmFsdWUpCisgICAgICAgICAgICA6IFByaW1pdGl2ZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZT4odmFsdWUpKSB7IH0KKworICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KKworICAgICAgICAvKiogZ2V0cyB2YWx1ZSBvdXQgb2YgdGhlIHVuaW9uICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgJnJlZigpIGNvbnN0OworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoaTY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihjNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGkzMiksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoYzMyKSwgIiIpOworICAgIH07CisgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTMyKSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzMyKSwgIiIpOworCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PX0lOSVQsCisgICAgICAgIElOVDMyLAorICAgICAgICBVSU5UMzIsCisgICAgICAgIENOVFIzMiwKKyAgICAgICAgSU5UNjQsCisgICAgICAgIFVJTlQ2NCwKKyAgICAgICAgQ05UUjY0LAorICAgICAgICBGTE9BVCwKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IFR5cGVGb3IoKSB7CisgICAgICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VT4oKTsKKyAgICB9CisKKyAgICAvLyBkZXByZWN0YXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQiA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IHR5cGVGb3IoKSB7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFQsIEI+KCk7CisgICAgfQorCisgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogX21UeXBlKHR5cGVGb3I8VD4oKSksIF9tVmFsdWUodmFsdWUpIHsgfQorCisgICAgQzJWYWx1ZSgpIDogX21UeXBlKE5PX0lOSVQpIHsgfQorCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgeworICAgICAgICBpZiAoX21UeXBlID09IHR5cGVGb3I8VD4oKSkgeworICAgICAgICAgICAgKnZhbHVlID0gX21WYWx1ZS5yZWY8VD4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAgICB2b2lkICpnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVR5cGUgPT0gTk9fSU5JVCA/IG51bGxwdHIgOiAodm9pZCopJl9tVmFsdWU7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZQorICAgIHNpemVfdCBpbmxpbmUgc2l6ZU9mKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU2l6ZUZvcihfbVR5cGUpOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgU2l6ZUZvcih0eXBlX3QgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQ05UUjMyOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGNhc2UgSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQ05UUjY0OiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5mcCk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgX21UeXBlOworICAgIFByaW1pdGl2ZSBfbVZhbHVlOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gdTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyMzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjMyX3Q+KCkgY29uc3QgeyByZXR1cm4gYzMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyNjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjY0X3Q+KCkgY29uc3QgeyByZXR1cm4gYzY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KKworLy8gcHJvdmlkZSB0eXBlcyBmb3IgZW51bXMgYW5kIHVpbnQ4X3QsIGNoYXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvdmlkZSByZWFkaW5nIGFzIHRoZW0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGNoYXIsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ4X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFIzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFI2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8ZmxvYXQsIGZhbHNlPigpIHsgcmV0dXJuIEZMT0FUOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyZSBlYXN5IGVudW0gdGVtcGxhdGUKK3RlbXBsYXRlPHR5cGVuYW1lIEU+IHN0cnVjdCBDMkVhc3lFbnVtOworCisvKioKKyAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgorICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCisgKgorICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKKyAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KKyAqLworc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKKy8vcHVibGljOgorICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKKyAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0CisgICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgorICAgICAqLworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgSU5UMzIgICA9IEMyVmFsdWU6OklOVDMyLCAgLy8vPCAzMi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDMyICA9IEMyVmFsdWU6OlVJTlQzMiwgLy8vPCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSMzIgID0gQzJWYWx1ZTo6Q05UUjMyLCAvLy88IDMyLWJpdCBjb3VudGVyCisgICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFI2NCAgPSBDMlZhbHVlOjpDTlRSNjQsIC8vLzwgNjQtYml0IGNvdW50ZXIKKyAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKKworICAgICAgICAvLyBhcnJheSB0eXBlcworICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQorICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCisKKyAgICAgICAgLy8gY29tcGxleCB0eXBlcworICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MjAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGNvcmVJbmRleC4KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gTmFtZWRWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOYW1lZFZhbHVlVHlwZT4gTmFtZWRWYWx1ZXNUeXBlOworICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBOYW1lZFZhbHVlc1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgorICAgICAqCisgICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorICAgIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQiAmKTsKKworICAgIC8qKiBzcGVjaWFsaXphdGlvbiBmb3IgZWFzeSBlbnVtcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgaW5saW5lIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQzJFYXN5RW51bTxFPiAmKSB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdudWxsLWRlcmVmZXJlbmNlIgorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXNGb3IoKihFKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEIsIGJvb2wgZW5hYmxlZD1zdGQ6OmlzX2FyaXRobWV0aWM8Qj46OnZhbHVlIHx8IHN0ZDo6aXNfZW51bTxCPjo6dmFsdWU+CisgICAgc3RydWN0IEMyX0hJREUgX05hbWVkVmFsdWVzR2V0dGVyOworCitwdWJsaWM6CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGV4dGVudCwgQzJTdHJpbmcgbmFtZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21UeXBlKCh0eXBlX3QpdHlwZSksIF9tRXh0ZW50KGV4dGVudCksIF9tTmFtZShuYW1lKSwgX21GaWVsZElkKG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJikgPSBkZWZhdWx0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tTmFtZWRWYWx1ZXMoX05hbWVkVmFsdWVzR2V0dGVyPEI+OjpnZXROYW1lZFZhbHVlcygpKSwKKyAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKFMqLCBUIFM6OiogZmllbGQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbUZpZWxkSWQoJigoKFMqKTApLT4qZmllbGQpKSB7fQorCisgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgaW5saW5lIHNpemVfdCBleHRlbnQoKSBjb25zdCB7IHJldHVybiBfbUV4dGVudDsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKKyAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBvZmZzZXRlZCBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZGVzYywgc2l6ZV90IG9mZnNldCkKKyAgICAgICAgOiBfbVR5cGUoZGVzYy5fbVR5cGUpLCBfbUV4dGVudChkZXNjLl9tRXh0ZW50KSwKKyAgICAgICAgICBfbU5hbWUoZGVzYy5fbU5hbWUpLCBfbU5hbWVkVmFsdWVzKGRlc2MuX21OYW1lZFZhbHVlcyksCisgICAgICAgICAgX21GaWVsZElkKGRlc2MuX21GaWVsZElkLl9tT2Zmc2V0ICsgb2Zmc2V0LCBkZXNjLl9tRmllbGRJZC5fbVNpemUpIHsgfQorCisgICAgdHlwZV90IF9tVHlwZTsKKyAgICB1aW50MzJfdCBfbUV4dGVudDsgLy8gdGhlIGxhc3QgbWVtYmVyIGNhbiBiZSBhcmJpdHJhcnkgbGVuZ3RoIGlmIGl0IGlzIFRbXSBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciAodGhpcyBpcyBtYXJrZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAvLyAwKS4gVFswXS1zIGFyZSBub3QgZmllbGRzLgorICAgIEMyU3RyaW5nIF9tTmFtZTsKKyAgICBOYW1lZFZhbHVlc1R5cGUgX21OYW1lZFZhbHVlczsKKworICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vIGZpZWxkIGlkZW50aWZpZXIgKG9mZnNldCBhbmQgc2l6ZSkKKworICAgIC8vIE5PVEU6IFdlIGRvIG5vdCBjYXB0dXJlIGRlZmF1bHQgdmFsdWUocykgaGVyZSBhcyB0aGF0IG1heSBkZXBlbmQgb24gdGhlIGNvbXBvbmVudC4KKyAgICAvLyBOT1RFOiBXZSBhbHNvIGRvIG5vdCBjYXB0dXJlIGJlc3RFZmZvcnQsIGFzIDEpIHRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgZmllbGRzLAorICAgIC8vIDIpIHRoaXMgaXMgYXQgcGFyYW1ldGVyIGdyYW51bGFyaXR5LgorCisgICAgLy8gdHlwZSByZXNvbHV0aW9uCisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQzMl90KikgICAgIHsgcmV0dXJuIElOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50MzJfdCopICAgIHsgcmV0dXJuIFVJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjMyX3QqKSB7IHJldHVybiBDTlRSMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDY0X3QqKSAgICAgeyByZXR1cm4gSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ2NF90KikgICAgeyByZXR1cm4gVUlOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyNjRfdCopIHsgcmV0dXJuIENOVFI2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoZmxvYXQqKSAgICAgICB7IHJldHVybiBGTE9BVDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoY2hhciopICAgICAgICB7IHJldHVybiBTVFJJTkc7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ4X3QqKSAgICAgeyByZXR1cm4gQkxPQjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHVuZGVybHlpbmcoMCk7CisgICAgICAgIHJldHVybiBHZXRUeXBlKCZ1bmRlcmx5aW5nKTsKKyAgICB9CisKKyAgICAvLyB2ZXJpZnkgQzJTdHJ1Y3QgYnkgaGF2aW5nIGEgRmllbGRMaXN0KCkgYW5kIGEgQ09SRV9JTkRFWC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPWRlY2x0eXBlKFQ6OkNPUkVfSU5ERVggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6RmllbGRMaXN0KCkpPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7CisgICAgICAgIHJldHVybiAodHlwZV90KShUOjpDT1JFX0lOREVYIHwgU1RSVUNUX0ZMQUcpOworICAgIH0KKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCisvLyBubyBuYW1lZCB2YWx1ZXMgZm9yIGNvbXBvdW5kIHR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgZmFsc2U+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgdHJ1ZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihCKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih0eXBlKSBcCit0ZW1wbGF0ZTw+IGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCB0eXBlICYpIHsgXAorICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsgXAorfQorCisvLyBXZSBjYW5ub3Qgc3VidHlwZSBjb25zdHJ1Y3RvciBmb3IgZW51bWVyYXRlZCB0eXBlcyBzbyBpbnN0ZWQgZGVmaW5lIG5vIG5hbWVkIHZhbHVlcyBmb3IKKy8vIG5vbi1lbnVtZXJhdGVkIGludGVncmFsIHR5cGVzLgorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyNjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ4X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjaGFyKQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoZmxvYXQpCisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBDMlN0cnVjdERlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRoZSBjb3JlIGluZGV4IG9mIHRoZSBzdHJ1Y3QKKyAgICBpbmxpbmUgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZS5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHN0cnVjdCAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICAvLyBNdXN0IGJlIGF0IGxlYXN0IDEgZm9yIHZhbGlkIHN0cnVjdHMuCisgICAgaW5saW5lIHNpemVfdCBudW1GaWVsZHMoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5zaXplKCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0IGZpZWxkcyAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcmF0b3I7CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIC8vIG9ubHkgc3VwcGx5aW5nIGNvbnN0IGl0ZXJhdG9yIC0gYnV0IHRoZXNlIG5hbWVzIGFyZSBuZWVkZWQgZm9yIHJhbmdlIGJhc2VkIGxvb3BzCisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoVCopCisgICAgICAgIDogQzJTdHJ1Y3REZXNjcmlwdG9yKFQ6OkNPUkVfSU5ERVgsIFQ6OkZpZWxkTGlzdCgpKSB7IH0KKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoZmllbGRzKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpIHsgfQorCisgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IF9tVHlwZTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIERlc2NyaWJlcyBwYXJhbWV0ZXJzIGZvciBhIGNvbXBvbmVudC4KKyAqLworc3RydWN0IEMyUGFyYW1EZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIHRydWUgZm9yIGJ1aWx0aW4gcGFyYW1zIGZvciBwbGF0Zm9ybS1kZWZpbmVkIGNvbXBvbmVudHMgKGUuZy4gdmlkZW8gYW5kCisgICAgICogYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMsIHZpZGVvL2F1ZGlvIGZpbHRlcnMpLgorICAgICAqIEZvciB2ZW5kb3ItZGVmaW5lZCBjb21wb25lbnRzLCBpdCBjYW4gYmUgdHJ1ZSBldmVuIGZvciB2ZW5kb3ItZGVmaW5lZCBwYXJhbXMsCisgICAgICogYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCwgaW4gY2FzZSB0aGUgY29tcG9uZW50IGJlY29tZXMgcGxhdGZvcm0tZGVmaW5lZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRVFVSVJFRDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIHBlcnNpc3RlbnQuIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIEMyVHVuaW5nIGFuZCBDMlNldHRpbmcsCisgICAgICogYnV0IG1heSBiZSBmYWxzZSBmb3IgQzJJbmZvLiBJZiB0cnVlLCB0aGlzIHBhcmFtZXRlciBwZXJzaXN0cyBhY3Jvc3MgZnJhbWVzIGFuZCBhcHBsaWVzIHRvCisgICAgICogdGhlIGN1cnJlbnQgYW5kIHN1YnNlcXVlbnQgZnJhbWVzLiBJZiBmYWxzZSwgdGhpcyBDMkluZm8gcGFyYW1ldGVyIG9ubHkgYXBwbGllcyB0byB0aGUKKyAgICAgKiBjdXJyZW50IGZyYW1lIGFuZCBpcyBub3QgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIChvciBldmVuIGJlIHByZXNlbnQpIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmcmFtZXMsIHVubGVzcyBpdCBpcyBzcGVjaWZpZWQgZm9yIHRob3NlIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1BlcnNpc3RlbnQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1BFUlNJU1RFTlQ7IH0KKworICAgIGlubGluZSBib29sIGlzU3RyaWN0KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19TVFJJQ1Q7IH0KKworICAgIGlubGluZSBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFQURfT05MWTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0hJRERFTik7IH0KKworICAgIGlubGluZSBib29sIGlzUHVibGljKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0lOVEVSTkFMKTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbS4KKyAgICAvLy8gVGhpcyBkZWZhdWx0cyB0byB0aGUgdW5kZXJseWluZyBDMlN0cnVjdCdzIG5hbWUsIGJ1dCBjb3VsZCBiZSBhbHRlcmVkIGZvciBhIGNvbXBvbmVudC4KKyAgICBpbmxpbmUgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHBhcmFtZXRlciBpbmRleAorICAgIGlubGluZSBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXg7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCB0aGlzIHBhcmFtZXRlciBoYXMgYSBkZXBlbmRlbmN5IG9uCisgICAgaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmZGVwZW5kZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gX21EZXBlbmRlbmNpZXM7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIGNvbnN0IFQqKQorICAgICAgICA6IF9tSW5kZXgoVDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICAgICAgYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9uCisgICAgICAgIElTX1JFUVVJUkVEICAgPSAxdSA8PCAwLCAvLy88IHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgSVNfUEVSU0lTVEVOVCA9IDF1IDw8IDEsIC8vLzwgcGFyYW1ldGVyIHJldGFpbnMgaXRzIHZhbHVlCisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvZmYKKyAgICAgICAgSVNfU1RSSUNUICAgICA9IDF1IDw8IDIsIC8vLzwgcGFyYW1ldGVyIGlzIHN0cmljdAorICAgICAgICBJU19SRUFEX09OTFkgID0gMXUgPDwgMywgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgcmVhZC1vbmx5CisgICAgICAgIElTX0hJRERFTiAgICAgPSAxdSA8PCA0LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdmlzaWJsZSB0byBjbGllbnRzCisgICAgICAgIElTX0lOVEVSTkFMICAgPSAxdSA8PCA1LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdXNlZCBieSBmcmFtZXdvcmsgKG90aGVyIHRoYW4gdGVzdGluZykKKyAgICAgICAgSVNfQ09OU1QgICAgICA9IDF1IDw8IDYgfCBJU19SRUFEX09OTFksIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IGNvbnN0IChoZW5jZSByZWFkLW9ubHkpCisgICAgfTsKKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nICYmbmFtZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICYmZGVwZW5kZW5jaWVzKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRGVwZW5kZW5jaWVzKHN0ZDo6bW92ZShkZXBlbmRlbmNpZXMpKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBfbUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IF9tQXR0cmliOworICAgIGNvbnN0IEMyU3RyaW5nIF9tTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gX21EZXBlbmRlbmNpZXM7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKDo6QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KQorCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisvLy8gXG5vdGUgX0ZJRUxEX0xJU1QgaXMgdXNlZCBvbmx5IGR1cmluZyBkZWNsYXJhdGlvbiBzbyB0aGF0IEMyU3RydWN0IGRlY2xhcmF0aW9ucyBjYW4gZW5kIHdpdGgKKy8vLyBhIHNpbXBsZSBsaXN0IG9mIEMyRklFTEQtcyBhbmQgY2xvc2luZyBicmFja2V0LiBNYXJrIGl0IHVudXNlZCBhcyBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZWQKKy8vLyBzdHJ1Y3RzLgorI2RlZmluZSBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCitwcml2YXRlOiBcCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVCBfX3VudXNlZDsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzICovIFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgQzIjI25hbWUjI1N0cnVjdCBfdHlwZTsgLyoqPCB0eXBlIG5hbWUgc2hvcnRoYW5kICovIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgZmFjdG9yeSAqLworCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0MyU1RSVUNUKG5hbWUpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZXNjcmliZSBhIHN0cnVjdHVyZSBvZiBhIHRlbXBsYXRlZCBzdHJ1Y3R1cmUuCisvLyBVc2UgbGlzdC4uLiBhcyB0aGUgYXJndW1lbnQgZ2V0cyByZXN1YnNpdGl0dXRlZCBhbmQgaXQgY29udGFpbnMgY29tbWFzLiBBbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8gdG8gd3JhcCBsaXN0IGluIGFuIGV4cHJlc3Npb24sIGUuZy4gKHsgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGxpc3Q7IH0pKSB3aGljaCBjb252ZXJ0cworLy8gaXQgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgdmVjdG9yLgorI2RlZmluZSBERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1Qoc3RydWt0LCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlPD4sIHN0cnVrdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGRlcHJlY2F0ZWQKKy8vLyBEZXNjcmliZSB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlIHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisjZGVmaW5lIERFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QoLCBDMiMjbmFtZSMjU3RydWN0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIGdldCB2YWx1ZSBvZiBlbmFibGVkIHRoYXQgaXMgcGFzc2VkIGluIGFzIGEgbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIHJlc29sdmUgdG8gdGhlIHNwZWNpZmljIG1hY3JvIGJhc2VkIG9uIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUIyNlbmFibGVkKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QpCisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikgXAorICAgIHRlbXBsYXRlIFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gc3RydWt0OjpGaWVsZExpc3QoKSB7IHJldHVybiBsaXN0OyB9CisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18odGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikKKworLyoqCisgKiBEZXNjcmliZSBhIGZpZWxkIG9mIGEgc3RydWN0dXJlLgorICogVGhlc2UgbXVzdCBiZSBpbiBvcmRlci4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgbWFjcm86CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpIHt9IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkgPSBkZWZhdWx0OyAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgsIHsKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgRm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMgKHRob3NlIGVuZGluZyBpbiBUW10pLCB1c2UgdGhlIGZsZXhpYmxlIG1hY3JvczoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogIHByaXZhdGU6CisgKiAgICAgIC8vIG1heSBoYXZlIHByaXZhdGUgY29uc3RydWN0b3JzIHRha2luZyBudW1iZXIgb2Ygd2lkdGhzIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICogICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUoc2l6ZV90LCBpbnQzMl90KTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgaW50MzJfdCB2YWx1ZSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IHZhbHVlOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBUW05dIG9yIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgdGhlIGZsZXhDb3VudCB3aWxsCisgKiAgICAgIC8vIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgcGFzc2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIGludCB3aWR0aHNbXSA9IHsgMSwgMiwgMyB9OworICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHdpZHRocyk7CisgKiAgICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IGludDMyX3QoJmluaXQpW05dKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gaW5pdFtpXTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgd2lkdGhzKQorICogICAgICBDMkZJRUxEKHdpZHRocywgIndpZHRocyIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCBtV2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgbVdpZHRocykKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgeworICogICAgICBDMkZJRUxEKG1XaWR0aHMsICJ3aWR0aHMiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqLworI2RlZmluZSBERVNDUklCRV9DMkZJRUxEKG1lbWJlciwgbmFtZSkgXAorICBDMkZpZWxkRGVzY3JpcHRvcigmKChfdHlwZSopKG51bGxwdHIpKS0+bWVtYmVyLCBuYW1lKSwKKworI2RlZmluZSBDMkZJRUxEKG1lbWJlciwgbmFtZSkgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisvLy8gXGlmIDAKKyNkZWZpbmUgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKQorI2RlZmluZSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBERVNDUklCRV9DMkZJRUxEIyNlbmFibGVkKG1lbWJlciwgbmFtZSkKKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhtZW1iZXIsIG5hbWUpCisvLy8gXGVuZGlmCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9CQVNFX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIFxpZiAwCisvKgorICAgQWx0ZXJuYXRlIGRlY2xhcmF0aW9uIG9mIGZpZWxkIGRlZmluaXRpb25zIGluIGNhc2Ugbm8gZmllbGQgbGlzdCBpcyB0byBiZSBnZW5lcmF0ZWQuCisgICBUaGUgc3BlY2lmaWMgbWFjcm8gaXMgY2hvc2VkIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18gKHdoZXRoZXIgaXQgaXMKKyAgIGRlZmluZWQgKHRvIGJlIGVtcHR5KSBvciBub3QuIFRoaXMgcmVxdWlyZXMgdHdvIGxldmVsIG9mIG1hY3JvIHN1YnN0aXR1dGlvbi4KKyAgIFRSSUNLWTogdXNlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0byBoYW5kbGUgY2xvc2luZyBicmFja2V0IHRoYXQgaXMgbm9ybWFsbHkgYWZ0ZXIKKyAgIHRoZXNlIG1hY3Jvcy4KKyovCisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworLy8vIFxlbmRpZgorCisKKy8qKgorICogUGFyYW1ldGVyIHJlZmxlY3RvciBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNlbnRyYWxpemVzIHRoZSBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgc3RydWN0dXJlcy4gVGhpcyBjYW4gYmUgc2hhcmVkCisgKiBieSBtdWx0aXBsZSBjb21wb25lbnRzIGFzIGRlc2NyaWJpbmcgYSBwYXJhbWV0ZXIgZG9lcyBub3QgaW1wbHkgc3VwcG9ydCBvZiB0aGF0CisgKiBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGVhY2ggc3VwcG9ydGVkIHBhcmFtZXRlciBhbmQgYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzIHdpdGhpbgorICogbXVzdCBiZSBkZXNjcmliZWQgYnkgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IgcHJvdmlkZWQgYnkgYSBjb21wb25lbnQuCisgKi8KK2NsYXNzIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBEZXNjcmliZXMgYSBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgICAqCisgICAgICogIFxwYXJhbVtpbl0gY29yZUluZGV4IHRoZSBjb3JlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlCisgICAgICogIGNvcmUgaW5kZXgKKyAgICAgKgorICAgICAqICBccmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZQorICAgICAqICBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVmbGVjdG9yCisgICAgICoKKyAgICAgKiAgVGhpcyBtZXRob2RzIHNoYWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogIFxub3RlIHRoaXMgY2xhc3MgZG9lcyBub3QgdGFrZSBhIHNldCBvZiBpbmRpY2VzIGJlY2F1c2Ugd2Ugd291bGQgdGhlbiBwcmVmZXIKKyAgICAgKiAgdG8gYWxzbyByZXR1cm4gYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGlzIGxvZ2ljIHRvIGJlCisgICAgICogIHJlcGVhdGVkIGluIGVhY2ggcmVmbGVjdG9yLiBBbHRlcm5hdGVseSwgdGhpcyBjb3VsZCBqdXN0IHJldHVybiBhIG1hcCBvZiBhbGwKKyAgICAgKiAgZGVzY3JpcHRpb25zLCBidXQgd2Ugd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkgaWYgY2xpZW50IG9ubHkgd2FudHMgdGhlIGRlc2NyaXB0aW9uCisgICAgICogIG9mIGEgZmV3IGluZGljZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBHZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCisgKgorICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGEgc2ltcGxlIHJhbmdlLCBhbiBhcml0aG1ldGljLAorICogZ2VvbWV0cmljIG9yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHdpdGggYSBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLiBWYWx1ZXMgY2FuCisgKiBiZSBkaXNjcmV0ZSB2YWx1ZXMsIG9yIGNhbiBvcHRpb25hbGx5IHJlcHJlc2VudCBmbGFncyB0byBiZSBvci1lZC4KKyAqCisgKiBcbm90ZSBEbyBub3QgdXNlIGZsYWdzIHRvIHJlcHJlc2VudCBiaXRmaWVsZHMuIFVzZSBpbmRpdmlkdWFsIHZhbHVlcyBvciBzZXBhcmF0ZSBmaWVsZHMgaW5zdGVhZC4KKyAqLworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgeworICAgICAgICBFTVBUWSwgICAgICAvLy88IG5vIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgUkFOR0UsICAgICAgLy8vPCBhIG51bWVyaWMgcmFuZ2UgdGhhdCBjYW4gYmUgY29udGludW91cyBvciBkaXNjcmV0ZQorICAgICAgICBWQUxVRVMsICAgICAvLy88IGEgbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgRkxBR1MgICAgICAgLy8vPCBhIGxpc3Qgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgT1ItZWQKKyAgICB9OworCisgICAgdHlwZV90IHR5cGU7IC8qKiBUeXBlIG9mIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKworICAgIHR5cGVkZWYgQzJWYWx1ZTo6UHJpbWl0aXZlIFByaW1pdGl2ZTsKKworICAgIC8qKgorICAgICAqIFJhbmdlIHNwZWNpZmllciBmb3Igc3VwcG9ydGVkIHZhbHVlLiBVc2VkIGlmIHR5cGUgaXMgUkFOR0UuCisgICAgICoKKyAgICAgKiBJZiBzdGVwIGlzIDAgYW5kIG51bSBhbmQgZGVub20gYXJlIGJvdGggMSwgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGFueSB2YWx1ZSwgZm9yIHdoaWNoCisgICAgICogbWluIDw9IHZhbHVlIDw9IG1heC4KKyAgICAgKgorICAgICAqIE90aGVyd2lzZSwgdGhlIHJhbmdlIHJlcHJlc2VudHMgYSBnZW9tZXRyaWMvYXJpdGhtZXRpYy9tdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcywgd2hlcmUKKyAgICAgKiBzdWNjZXNzaXZlIHN1cHBvcnRlZCB2YWx1ZXMgY2FuIGJlIGRlcml2ZWQgZnJvbSBwcmV2aW91cyB2YWx1ZXMgKHN0YXJ0aW5nIGF0IG1pbiksIHVzaW5nIHRoZQorICAgICAqIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAqICB2WzBdID0gbWluCisgICAgICogIHZbaV0gPSB2W2ktMV0gKiBudW0gLyBkZW5vbSArIHN0ZXAgZm9yIGkgPj0gMSwgd2hpbGUgbWluIDwgdltpXSA8PSBtYXguCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgLyoqIExvd2VyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkuICovCisgICAgICAgIFByaW1pdGl2ZSBtaW47CisgICAgICAgIC8qKiBVcHBlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUgaWYgcGVybWl0dGVkIGJ5IHNlcmllcykuICovCisgICAgICAgIFByaW1pdGl2ZSBtYXg7CisgICAgICAgIC8qKiBTdGVwIGJldHdlZW4gc3VwcG9ydGVkIHZhbHVlcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIHN0ZXA7CisgICAgICAgIC8qKiBOdW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgbnVtOworICAgICAgICAvKiogRGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgZGVub207CisgICAgfSByYW5nZTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgdmFsdWVzLiBVc2VkIGlmIHR5cGUgaXMgVkFMVUVTIG9yIEZMQUdTLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBWQUxVRVMsIHRoaXMgaXMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlcyBpbiBkZWNyZWFzaW5nIHByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIEZMQUdTLCB0aGlzIHZlY3RvciBjb250YWlucyB7IG1pbi1tYXNrLCBmbGFnMSwgZmxhZzIuLi4gfS4gQmFzaWNhbGx5LCB0aGUgZmlyc3QKKyAgICAgKiB2YWx1ZSBpcyB0aGUgcmVxdWlyZWQgc2V0IG9mIGZsYWdzIHRvIGJlIHNldCwgYW5kIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIGZsYWdzIHRoYXQgY2FuCisgICAgICogYmUgc2V0IGluZGVwZW5kZW50bHkuIEZMQUdTIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ3JhbCB0eXBlcy4gU3VwcG9ydGVkIGZsYWdzIHNob3VsZAorICAgICAqIG5vdCBvdmVybGFwLCBhcyBpdCBjYW4gbWFrZSB2YWxpZGF0aW9uIG5vbi1kZXRlcm1pbmlzdGljLiBUaGUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXRob2QKKyAgICAgKiBpcyB0aGF0IHN0YXJ0aW5nIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlLCBpZiBlYWNoIGZsYWcgaXMgcmVtb3ZlZCB3aGVuIGZ1bGx5IHByZXNlbnQgKHRoZQorICAgICAqIG1pbi1tYXNrIG11c3QgYmUgZnVsbHkgcHJlc2VudCksIHdlIHNoYWxsIGFycml2ZSBhdCAwLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPFByaW1pdGl2ZT4gdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpCisgICAgICAgIDogdHlwZShFTVBUWSkgeworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVuKSA6CisgICAgICAgIHR5cGUoUkFOR0UpLAorICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbnVtLCBkZW59IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIG51bSwgZGVufSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yIChUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvcihUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGludGVybmFsCisgICAgLy8vIFx0b2RvOiBjcmVhdGUgc2VwYXJhdGUgdmFsdWVzIHZzLiBmbGFncyBpbml0aWFsaXplciBhcyBmb3IgZmxhZ3Mgd2Ugd2FudAorICAgIC8vLyB0byBsaXN0IGJvdGggYWxsb3dlZCBhbmQgcmVxdWlyZWQgZmxhZ3MKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKiludWxscHRyKSk+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKW51bGxwdHIpOworICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soMCk7IC8vIG1pbi1tYXNrIGRlZmF1bHRzIHRvIDAKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmaXRlbSA6IG5hbWVkKXsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBzcGVjaWZpYyBmaWVsZC4KKyAqCisgKiBUaGlzIGlzIGEgcGFpciBvZiB0aGUgZmllbGQgc3BlY2lmaWVyIHRvZ2V0aGVyIHdpdGggYW4gb3B0aW9uYWwgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gcmVwb3J0aW5nIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXMgeworICAgIEMyUGFyYW1GaWVsZCBwYXJhbU9yRmllbGQ7IC8vLzwgdGhlIGZpZWxkIG9yIHBhcmFtZXRlcgorICAgIC8vLyBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQgaWYgcGFyYW1PckZpZWxkIHNwZWNpZmllcyBhbiBhY3R1YWwgZmllbGQgdGhhdCBpcworICAgIC8vLyBudW1lcmljIChub24gc3RydWN0LCBibG9iIG9yIHN0cmluZykuIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGFycmF5cyAoaW5jbHVkaW5nIHN0cmluZyBhbmQKKyAgICAvLy8gYmxvYnMpIGRlc2NyaWJlIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIGVsZW1lbnQgKGNoYXJhY3RlciBmb3Igc3RyaW5nLCBhbmQgYnl0ZXMgZm9yCisgICAgLy8vIGJsb2JzKS4gSXQgaXMgb3B0aW9uYWwgZm9yIHJlYWQtb25seSBzdHJpbmdzIGFuZCBibG9icy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgbWVhbnQgdG8gYmUgbW92ZSBjb25zdHJ1Y3RlZC4KKyAgICBDMl9ERUZBVUxUX01PVkUoQzJQYXJhbUZpZWxkVmFsdWVzKTsKKworICAgIC8vIENvcHkgY29uc3RydWN0b3IvYXNzaWdubWVudCBpcyBhbHNvIHByb3ZpZGVkIGFzIHRoaXMgb2JqZWN0IG1heSBnZXQgY29waWVkLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChvdGhlci5wYXJhbU9yRmllbGQpLAorICAgICAgICAgIHZhbHVlcyhvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cikgeyB9CisKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMmIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKSB7CisgICAgICAgIHBhcmFtT3JGaWVsZCA9IG90aGVyLnBhcmFtT3JGaWVsZDsKKyAgICAgICAgdmFsdWVzID0gb3RoZXIudmFsdWVzID8gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigqb3RoZXIudmFsdWVzKSA6IG51bGxwdHI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIG5vIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPih2YWx1ZXNfKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBmaWVsZHMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXywgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXyksCisgICAgICAgICAgdmFsdWVzKHN0ZDo6bW92ZSh2YWx1ZXNfKSkgeyB9Cit9OworCisvLy8gQH0KKworLy8gaW5jbHVkZSBkZWJ1ZyBoZWFkZXIgZm9yIEMyUGFyYW1zLmggaWYgQzJEZWJ1Zy5oIHdhcyBhbHJlYWR5IGluY2x1ZGVkCisjaWZkZWYgQzJVVElMU19ERUJVR19IXworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJQQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMzMjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiogXGZpbGUKKyAqIFRlbXBsYXRlcyB1c2VkIHRvIGRlY2xhcmUgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBDMlBBUkFNX0RFRl9IXworI2RlZmluZSBDMlBBUkFNX0RFRl9IXworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKy8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCisvLy8gQHsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFVUSUxJVFkgVEVNUExBVEVTIEZPUiBQQVJBTUVURVIgREVGSU5JVElPTlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAorLy8vIEB7CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCitzdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgPT0gUygpKT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdEVxdWFsKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0RXF1YWwoLi4uKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSAhPSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Tm90RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3ROb3RFcXVhbCguLi4pOworfTsKKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzLgorICoKKyAqIFVzZSBhcyBfQzJDb21wYXJhYmxlPHR5cGVuYW1lIFM+Ojp2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdEVxdWFsPFM+KDApKTo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdE5vdEVxdWFsPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyAgSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYSBDT1JFX0lOREVYIGNvbnN0YW50Lgorc3RydWN0IEMyX0hJREUgX0MyQ29yZUluZGV4SGVscGVyX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQ9Uzo6Q09SRV9JTkRFWD4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdENvcmVJbmRleChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdENvcmVJbmRleCguLi4pOworfTsKKworLy8vIE1hY3JvIHRoYXQgZGVmaW5lcyBhbmQgdGh1cyBvdmVycmlkZXMgYSB0eXBlJ3MgQ09SRV9JTkRFWCBmb3IgYSBzZXR0aW5nCisjZGVmaW5lIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKGNvcmVJbmRleCkgXAorcHVibGljOiBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGNvcmVJbmRleCB9OworCisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBhZGRzIGEgQ09SRV9JTkRFWCB0byBhIHR5cGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUgKGZvciB0ZXN0aW5nKQordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleD4KK3N0cnVjdCBDMl9ISURFIF9DMkFkZENvcmVJbmRleCA6IHB1YmxpYyBTIHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShDb3JlSW5kZXgpCit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgc3RydWN0IHJlcXVpcmVtZW50cyBmb3IgcGFyYW1ldGVycy4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAtIHZlcmlmeSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBubyB2aXJ0dWFsIG1ldGhvZHMsIGFuZCBubyBlcXVhbGl0eSBvcGVyYXRvcnMuCisgKiAgLSBleHBvc2UgUEFSQU1fVFlQRSwgYW5kIG5vbi1mbGV4IEZMRVhfU0laRS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyU3RydWN0Q2hlY2sgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgICAgICBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3IiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvbHltb3JwaGljPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIHZpcnR1YWwgbWV0aG9kcyIpOworICAgIHN0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgb3BlcmF0b3I9PSBvciAhPSIpOworCitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgUEFSQU1fVFlQRSA9IENvcmVJbmRleCB8IFR5cGVGbGFncworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBGTEVYX1NJWkUgPSAwLAorICAgIH07Cit9OworCisvLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBGTEVYX1NJWkUgbWVtYmVyLgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGVfaW1wbCB7CisgICAgLy8vIHNwZWNpYWxpemF0aW9uIGZvciB0eXBlcyB0aGF0IGhhdmUgYSBGTEVYX1NJWkUgbWVtYmVyCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdW5zaWduZWQ9Uzo6RkxFWF9TSVpFPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RmxleFNpemUoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RGbGV4U2l6ZSguLi4pOworfTsKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkZsZXhpYmxlX2ltcGw6OlRlc3RGbGV4U2l6ZTxTPigwKSk6OnZhbHVlPiB7Cit9OworCisvLy8gTWFjcm8gdG8gdGVzdCBpZiBhIHR5cGUgaXMgZmxleGlibGUgKGhhcyBhIEZMRVhfU0laRSBtZW1iZXIpLgorI2RlZmluZSBJRl9GTEVYSUJMRShTKSBFTkFCTEVfSUYoX0MyRmxleGlibGU8Uz46OnZhbHVlKQorLy8vIFNob3J0aGFuZCBmb3Igc3RkOjplbmFibGVfaWYKKyNkZWZpbmUgRU5BQkxFX0lGKGNvbmQpIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGNvbmQ+Ojp0eXBlCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFY9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9jMl9lbmFibGVfaWZfdHlwZSB7CisgICAgdHlwZWRlZiBWIHR5cGU7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgZXhwb3NlcyB0aGUgZmxleGlibGUgc3VidHlwZSBvZiBhIHN0cnVjdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIEU9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXIgeworICAgIHR5cGVkZWYgdm9pZCBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSAwIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXhpYmxlIHR5cGVzLiBUaGlzIG9ubHkgd29ya3MgaWYgX0ZsZXhNZW1iZXJUeXBlIGlzIHB1YmxpYy4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyPFMsCisgICAgICAgIHR5cGVuYW1lIF9jMl9lbmFibGVfaWZfdHlwZTx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+Ojp0eXBlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXggYXJyYXlzLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8U1tdLAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgX0MyRmxleEhlbHBlcjxTPjo6RmxleFR5cGU+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIFMgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gc2l6ZW9mKFMpIH07Cit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgZmxleGlibGUgc3RydWN0IHJlcXVpcmVtZW50cyBhbmQgYWRkIGNvbW1vbiBvcGVyYXRpb25zLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gZXhwb3NlIENPUkVfSU5ERVggYW5kIEZpZWxkTGlzdCAodGhpcyBpcyBub3JtYWxseSBpbmhlcml0ZWQgZnJvbSB0aGUgc3RydWN0LCBidXQgZmxleGlibGUKKyAqICAgIHN0cnVjdHMgY2Fubm90IGJlIGJhc2UgY2xhc3NlcyBhbmQgdGh1cyBpbmhlcml0ZWQgZnJvbSkKKyAqICAtIGRpc2FibGUgY29weSBhc3NpZ25tZW50IGFuZCBjb25zdHJ1Y3Rpb24gKFRPRE86IHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRoZSBGTEVYIG1hY3JvIGZvciB0aGUKKyAqICAgIGZsZXhpYmxlIHN0cnVjdCwgc28gbWF5IG5vdCBiZSBuZWVkZWQgaGVyZSkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXgsIHVuc2lnbmVkIFR5cGVGbGFncz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhTdHJ1Y3RDaGVjayA6CisvLyBhZGQgZmxleGlibGUgZmxhZyBhcyBfQzJTdHJ1Y3RDaGVjayBkZWZpbmVzIFBBUkFNX1RZUEUKKyAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgVHlwZUZsYWdzPiB7CitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQ09SRV9JTkRFWCA9IFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgLy8vPCBmbGV4aWJsZSBzdHJ1Y3QgY29yZS1pbmRleAorICAgIH07CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKSB7IHJldHVybiBTOjpGaWVsZExpc3QoKTsgfQorCisgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgZGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBfQzJGbGV4U3RydWN0Q2hlY2soKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYW5ub3QgY29weSBmbGV4aWJsZSBwYXJhbXMKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2soY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisgICAgX0MyRmxleFN0cnVjdENoZWNrJiBvcGVyYXRvcj0gKGNvbnN0IF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUeXBlRmxhZ3M+ICYpID0gZGVsZXRlOworCisgICAgLy8gY29uc3RhbnRzIHVzZWQgZm9yIGhlbHBlciBtZXRob2RzCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxTPjo6RkxFWF9TSVpFLCAvLy88IHNpemUgb2YgZmxleGlibGUgdHlwZQorICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBNQVhfU0laRSA9ICh1aW50MzJfdClzdGQ6Om1pbigoc2l6ZV90KVVJTlQzMl9NQVgsIFNJWkVfTUFYKSwgLy8gVE9ETzogaXMgdGhpcyBhbHdheXMgdTMyIG1heD8KKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQkFTRV9TSVpFID0gc2l6ZW9mKFMpICsgc2l6ZW9mKEMyUGFyYW0pLCAvLy88IHNpemUgb2YgdGhlIGJhc2UgcGFyYW0KKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoaXMgcGFyYW0gd2l0aCBmbGV4Q291bnQsIG9yIDAgaWYgaXQgd291bGQgb3ZlcmZsb3cuCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3QgQ2FsY1NpemUoc2l6ZV90IGZsZXhDb3VudCwgc2l6ZV90IHNpemUgPSBCQVNFX1NJWkUpIHsKKyAgICAgICAgaWYgKGZsZXhDb3VudCA8PSAoTUFYX1NJWkUgLSBzaXplKSAvIFM6OkZMRVhfU0laRSkgeworICAgICAgICAgICAgcmV0dXJuIHNpemUgKyBTOjpGTEVYX1NJWkUgKiBmbGV4Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIGR5bmFtaWMgbmV3IG9wZXJhdG9yIHVzYWJsZSBmb3IgcGFyYW1zIG9mIHR5cGUgUworICAgIGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHNpemVfdCBmbGV4Q291bnQpIG5vZXhjZXB0IHsKKyAgICAgICAgLy8gVE9ETzogYXNzZXJ0KHNpemUgPT0gQkFTRV9TSVpFKTsKKyAgICAgICAgc2l6ZSA9IENhbGNTaXplKGZsZXhDb3VudCwgc2l6ZSk7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIDo6b3BlcmF0b3IgbmV3KHNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK307CisKKy8vLyBEZWZpbmUgRnJvbSgpIGNhc3Qgb3BlcmF0b3JzIGZvciBwYXJhbXMuCisjZGVmaW5lIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkgXAorICAgIGlubGluZSBzdGF0aWMgX1R5cGUqIEZyb20oQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gKF9UeXBlKilDMlBhcmFtOjpJZlN1aXRhYmxlKCBcCisgICAgICAgICAgICAgICAgb3RoZXIsIHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFLCBfVHlwZTo6RkxFWF9TSVpFLCBcCisgICAgICAgICAgICAgICAgKF9UeXBlOjpQQVJBTV9UWVBFICYgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpICE9IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEKTsgXAorICAgIH0gXAorICAgIGlubGluZSBzdGF0aWMgY29uc3QgX1R5cGUqIEZyb20oY29uc3QgQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBfVHlwZSo+KEZyb20oY29uc3RfY2FzdDxDMlBhcmFtICo+KG90aGVyKSkpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfSBcCisKKy8qKgorICogRGVmaW5lIGZsZXhpYmxlIGFsbG9jYXRvcnMgKEFsbG9jU2hhcmVkIG9yIEFsbG9jVW5pcXVlKSBmb3IgZmxleGlibGUgcGFyYW1zLgorICogIC0gUDo6QWxsb2NYeXooZmxleENvdW50LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIGdpdmVuIGZsZXgtY291bnQuIFRoaXMgbWFwcyB0bworICogICAgICAgICAgVChmbGV4Q291bnQsIGFyZ3MuLi4pXAorICoKKyAqIENsYW5nIGRvZXMgbm90IHN1cHBvcnQgYXJncy4uLiBmb2xsb3dlZCBieSB0ZW1wbGF0ZWQgcGFyYW0gYXMgYXJncy4uLiBlYXRzIGl0LiBIZW5jZSwKKyAqIHByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIHdoZXJlIHRoZSBpbml0aWFsaXplciByZXBsYWNlcyB0aGUgZmxleENvdW50LgorICoKKyAqIFNwZWNpYWxpemF0aW9ucyB0aGF0IGRlZHVjZSBmbGV4Q291bnQ6CisgKiAgLSBQOjpBbGxvY1h5eihUW10sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgYXJyYXkuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXRpYWxpemVyCisgKiAgICAgICAgICAgIGxpc3QuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OnZlY3RvcjxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCB2ZWN0b3IuCisgKiAgVGhlc2Ugc3BlY2lhbGl6YXRpb25zIG1hcCB0byBUKGZsZXhDb3VudCA9IHNpemUtb2YtaW5pdCwgYXJncy4uLiwgaW5pdCkKKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHB0ciwgUHRyKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoZmxleENvdW50KSBfVHlwZShmbGV4Q291bnQsIGFyZ3MuLi4pKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGU+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKCBcCisgICAgICAgICAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFU+ICZpbml0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhpbml0LnNpemUoKSkgX1R5cGUoaW5pdC5zaXplKCksIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGUsIHVuc2lnbmVkIE4+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKGNvbnN0IFUoJmluaXQpW05dLCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhOKSBfVHlwZShOLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgbWV0aG9kcyBBbGxvY1NoYXJlZCwgQWxsb2NVbmlxdWUgYW5kIGZsZXhDb3VudC4KKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgc2hhcmVkLCBTaGFyZWQpIFwKKyAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHVuaXF1ZSwgVW5pcXVlKSBcCisgICAgaW5saW5lIHNpemVfdCBmbGV4Q291bnQoKSBjb25zdCB7IFwKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoX1R5cGUpID09IF9UeXBlOjpCQVNFX1NJWkUsICJpbmNvcnJlY3QgQkFTRV9TSVpFIik7IFwKKyAgICAgICAgc2l6ZV90IHN6ID0gdGhpcy0+c2l6ZSgpOyBcCisgICAgICAgIGlmIChzeiA+PSBzaXplb2YoX1R5cGUpKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAoc3ogLSBzaXplb2YoX1R5cGUpKSAvIF9UeXBlOjpGTEVYX1NJWkU7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisKKy8vLyBNYXJrIGZsZXhpYmxlIG1lbWJlciB2YXJpYWJsZSBhbmQgbWFrZSBzdHJ1Y3R1cmUgZmxleGlibGUuCisjZGVmaW5lIEZMRVgoY2xzLCBtKSBcCisgICAgQzJfRE9fTk9UX0NPUFkoY2xzKSBcCitwcml2YXRlOiBcCisgICAgQzJQQVJBTV9NQUtFX0ZSSUVORFMgXAorICAgIC8qKiBcaWYgMCAqLyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IF9DMkZsZXhIZWxwZXI7IFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgZGVjbHR5cGUobSkgX0ZsZXhNZW1iZXJUeXBlOyBcCisgICAgLyogZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIGZsZXhDb3VudCAqLyBcCisgICAgaW5saW5lIGNscyhzaXplX3QpIDogY2xzKCkge30gXAorICAgIC8qIGNvbnN0ZXhwciBzdGF0aWMgX0ZsZXhNZW1iZXJUeXBlIGNsczo6KiBmbGV4TWVtYmVyID0gJmNsczo6bTsgKi8gXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGbGV4VHlwZSBGbGV4VHlwZTsgXAorICAgIHN0YXRpY19hc3NlcnQoXAorICAgICAgICAgICAgIXN0ZDo6aXNfdm9pZDxGbGV4VHlwZT46OnZhbHVlLCBcCisgICAgICAgICAgICAibWVtYmVyIGlzIG5vdCBmbGV4aWJsZSwgb3IgYSBmbGV4aWJsZSBhcnJheSBvZiBhIGZsZXhpYmxlIHR5cGUiKTsgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07IFwKKyAgICAvKiogXGVuZGlmICovIFwKKworLy8vIEB9CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiBzdHJ1Y3R1cmVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKKyAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwcml2YXRlIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKworICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULCBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYmFzaWMgYWxsb2NhdGlvbjogbmV3KGZsZXhDb3VudCkgUC4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9JTlBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gU3RyZWFtIHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBzcGVjaWZpYyBzdHJlYW0gb24gYSBwb3J0IChpbnB1dCBvcgorICogb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW10ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCisgKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAorICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKKyAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwKKyAgICAgICAgICBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKyAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9JTlBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgaW5wdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgb3V0cHV0KCkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQorICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsCisgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUsIDB1KSB7IH0KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCisgICAgLy8vIHN0cmVhbS1JRC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBWQUxVRSBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFxpbmdyb3VwIGludGVybmFsCisgKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0IHsKKyAgICBUIHZhbHVlOyAvLy88IHNpbXBsZSB2YWx1ZSBvZiB0aGUgc3RydWN0dXJlCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIGFuIGluaXRpYWwgdmFsdWUuCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoVCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKK307CisKKy8vIFRPRE86IG1vdmUgdGhpcyBhbmQgbmV4dCB0byBzb21lIGdlbmVyaWMgcGxhY2UKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgKG1hcHBlZCkgbWVtb3J5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMk1lbW9yeUJsb2NrIHsKKyAgICAvLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJsb2NrLgorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisgICAgLy8vIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG91dHNpZGUKKyAgICAvLy8gdGhlIGJsb2NrLgorICAgIHZpcnR1YWwgY29uc3QgVCAqZGF0YSgpIGNvbnN0ID0gMDsgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgZnJpZW5kIGFjY2VzcyBvbmx5IGluIHNvbWUgQzJNZW1vcnkgbW9kdWxlPworICAgIC8vLyBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvciB3cml0ZQorICAgIC8vLyBvdXRzaWRlIHRoZSBibG9jay4KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KGNvbnN0X2Nhc3Q8Y29uc3QgQzJNZW1vcnlCbG9jayo+KHRoaXMpLT5kYXRhKCkpOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBUT0RPOiBmb3Igbm93IGl0IHNob3VsZCBuZXZlciBiZSBkZWxldGVkIGFzIEMyTWVtb3J5QmxvY2sKKyAgICB2aXJ0dWFsIH5DMk1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiBtZW1vcnkgY29udGFpbmluZyBhIGNvbnN0YW50IChjb25zdGV4cHIpIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJDb25zdE1lbW9yeUJsb2NrIDogcHVibGljIEMyTWVtb3J5QmxvY2s8VD4geworICAgIHZpcnR1YWwgY29uc3QgVCAqIGRhdGEoKSBjb25zdCB7IHJldHVybiBfbURhdGE7IH0KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgY29uc3RleHByIEMyQ29uc3RNZW1vcnlCbG9jayhjb25zdCBUKCZpbml0KVtOXSkgOiBfbURhdGEoaW5pdCksIF9tU2l6ZShOKSB7fQorCitwcml2YXRlOgorICAgIGNvbnN0IFQgKl9tRGF0YTsKKyAgICBjb25zdCBzaXplX3QgX21TaXplOworfTsKKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0byBpbml0aWFsaXplIGZsZXhpYmxlIGFycmF5cyB3aXRoIHZhcmlvdXMgaW5pdGFsaXplcnMuCitzdHJ1Y3QgX0MyVmFsdWVBcnJheUhlbHBlciB7CisgICAgLy8gY2hhcltdLXMgYXJlIHVzZWQgYXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHNvIHRoZSBsYXN0IGVsZW1lbnQgaXMgbmV2ZXIgaW5pdGVkLgorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIGNvbnN0ZXhwciBtZW1vcnkgYmxvY2suCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChibG9jay5kYXRhKCkpIHsKKyAgICAgICAgICAgIG1lbWNweShhcnJheSwgYmxvY2suZGF0YSgpLCBzdGQ6Om1pbihhcnJheUxlbiwgYmxvY2suc2l6ZSgpKSAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFQgJml0ZW0gOiBpbml0KSB7CisgICAgICAgICAgICBpZiAoaXggPT0gYXJyYXlMZW4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5W2l4KytdID0gaXRlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSB2ZWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBUKCZzdHIpW05dKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChhcnJheUxlbikgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBzdHIsIHN0ZDo6bWluKGFycmF5TGVuLCAoc2l6ZV90KU4pICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGEgZmxleGlibGUgYmxvYiBhbmQgc3RyaW5nIGFycmF5cy4gQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZQorICogZmxleGlibGUgYXJyYXkgbWVtYmVyIHdpdGggZGVmYXVsdCBmbGV4aWJsZSBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUKKyAqIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplIGlzIDAuCisgKgorICogXGludGVybmFsIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gQzJTaW1wbGVBcnJheVN0cnVjdDxUW10+IHNpbXBseSBiZWNhdXNlIGl0cyBtZW1iZXIgaGFzIHRoZSBuYW1lCisgKiBhcyB2YWx1ZSB0byByZWZsZWN0IHRoaXMgaXMgYSBzaW5nbGUgdmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgb25seSBmb3IgQkxPQiBvciBTVFJJTkciKTsKKyAgICBUIHZhbHVlW107CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKKyAgICBGTEVYKEMyU2ltcGxlVmFsdWVTdHJ1Y3QsIHZhbHVlKQorCitwcml2YXRlOgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgYmxvY2spOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8vLyBAfQorCisvKioKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZmxleGlibGUgYXJyYXkgZWxlbWVudCBvZiBhIHNwZWNpZmljIHR5cGUgKFQpIHdpdGgKKyAqIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplCisgKiBpcyAwLiBJbnN0ZWFkLCBpdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyLCBlLmcuCisgKgorICogICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyTXlGYW5jeVN0cnVjdD4sCisgKiAgICAgICAgICAga1BhcmFtSW5kZXhNeUZhbmN5QXJyYXlTdHJlYW1QYXJhbT4gQzJNeUZhbmN5QXJyYXlTdHJlYW1JbmZvOworICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlQXJyYXlTdHJ1Y3QgeworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgJiYgIXN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAidXNlIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBmb3IgQkxPQiBvciBTVFJJTkciKTsKKworICAgIFQgdmFsdWVzW107IC8vLzwgYXJyYXkgbWVtYmVyCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFNpbXBsZUFycmF5LCB2YWx1ZXMpCisgICAgLy9GTEVYKEMyU2ltcGxlQXJyYXlTdHJ1Y3QsIHZhbHVlcykKKworcHJpdmF0ZToKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDMk1lbW9yeUJsb2NrLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gdmVjdG9yLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9Cit9OworCisvKioKKyAqIFxhZGR0b2dyb3VwIHNpbXBsZXZhbHVlIFNpbXBsZSB2YWx1ZSBhbmQgYXJyYXkgc3RydWN0dXJlcy4KKyAqIEB7CisgKgorICogU2ltcGxlIHZhbHVlIHN0cnVjdHVyZXMuCisgKgorICogU3RydWN0dXJlcyBjb250YWluaW5nIGEgc2luZ2xlIHNpbXBsZSB2YWx1ZS4gVGhlc2UgY2FuIGJlIHJldXNlZCB0byBlYXNpbHkgZGVmaW5lIHNpbXBsZQorICogcGFyYW1ldGVycyBvZiB2YXJpb3VzIHR5cGVzOgorICoKKyAqICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE15SW50ZWdlclBvcnRQYXJhbT4KKyAqICAgICAgICAgICBDMk15SW50ZWdlclBvcnRQYXJhbVR1bmluZzsKKyAqCisgKiBUaGV5IGNvbnRhaW4gYSBzaW5nbGUgbWVtYmVyICh2YWx1ZSBvciB2YWx1ZXMpIHRoYXQgaXMgZGVzY3JpYmVkIGFzICJ2YWx1ZSIgb3IgInZhbHVlcyIuCisgKgorICogVGhlc2Ugc3RydWN0dXJlcyBkb24ndCBkZWZpbmUgYSBjb3JlIGluZGV4LCBhbmQgYXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBzdHJ1Y3R1cmUKKyAqIGRlY2xhcmF0aW9ucy4gVXNlIHR5cGVbXSBpbnN0ZWFkLCBzdWNoIGFzIGludDMyX3QgZmllbGRbXS4KKyAqLworLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQzMl90PiBDMkludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMkFycmF5OworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMlZhbHVlOworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyQXJyYXk7CisvLy8gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDY0X3Q+IEMySW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQ2NF90PiBDMkludDY0QXJyYXk7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDY0X3Q+IEMyVWludDY0VmFsdWU7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRBcnJheTsKKy8vLyBBIGZsb2F0IHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxmbG9hdD4gQzJGbG9hdFZhbHVlOworLy8vIEEgZmxvYXQgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRBcnJheTsKKy8vLyBBIGJsb2IgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ4X3RbXT4gQzJCbG9iVmFsdWU7CisvLy8gQSBzdHJpbmcgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGNoYXJbXT4gQzJTdHJpbmdWYWx1ZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVBcnJheVN0cnVjdDxUPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWVzLCAidmFsdWVzIikgfTsKK30KKworLy8vIEB9CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyUEFSQU1fREVGX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzZjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJXT1JLX0hfCisKKyNkZWZpbmUgQzJXT1JLX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLy8vIFxkZWZncm91cCB3b3JrIFdvcmsgYW5kIGRhdGEgcHJvY2Vzc2luZworLy8vIEB7CisKKy8qKgorICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgcmVhc29uIGEgcGFyYW1ldGVyIHNldHRpbmdzIG1heSBmYWlsLCBvcgorICogbWF5IGJlIG92ZXJyaWRlbi4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgZW51bSBGYWlsdXJlIDogdWludDMyX3QgeworICAgICAgICAvKiBwYXJhbWV0ZXIgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1RZUEUsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBCQURfUE9SVCwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBwb3J0CisgICAgICAgIEJBRF9JTkRFWCwgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHN0cmVhbQorICAgICAgICBSRUFEX09OTFksICAvLy88IHBhcmFtZXRlciBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQKKyAgICAgICAgTUlTTUFUQ0gsICAgLy8vPCBwYXJhbWV0ZXIgbWlzbWF0Y2hlcyBpbnB1dCBkYXRhCisKKyAgICAgICAgLyogZmllbGQgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1ZBTFVFLCAgLy8vPCBzdHJpY3QgcGFyYW1ldGVyIGRvZXMgbm90IGFjY2VwdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGF0IGFsbAorICAgICAgICBDT05GTElDVCwgICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZmllbGQgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisKKyAgICAgICAgLy8vIHBhcmFtZXRlciBmaWVsZCBpcyBvdXQgb2YgcmFuZ2UgZHVlIHRvIG90aGVyIHNldHRpbmdzICh0aGlzIGZhaWx1cmUgbW9kZQorICAgICAgICAvLy8gY2FuIG9ubHkgYmUgdXNlZCBmb3Igc3RyaWN0IGNhbGN1bGF0ZWQgcGFyYW1ldGVycykKKyAgICAgICAgVU5TVVBQT1JURUQsCisKKyAgICAgICAgLy8vIGZpZWxkIGRvZXMgbm90IGFjY2VzcyB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBhdCBhbGwuIEl0IGhhcyBiZWVuIGNvcnJlY3RlZCB0bworICAgICAgICAvLy8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUgbW9kZSBpcyBwcm92aWRlZCB0byBnaXZlIGd1aWRhbmNlIGFzIHRvIHdoYXQKKyAgICAgICAgLy8vIGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQgKHdoaWNoIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgYXQtYWxsLQorICAgICAgICAvLy8gcG90ZW50aWFsIHZhbHVlcykKKyAgICAgICAgSU5GT19CQURfVkFMVUUsCisKKyAgICAgICAgLy8vIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisgICAgICAgIC8vLyBhbmQgaGFzIGJlZW4gY29ycmVjdGVkIHRvIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZS4gVGhpcyBmYWlsdXJlCisgICAgICAgIC8vLyBtb2RlIGlzIGdpdmVuIHRvIHByb3ZpZGUgZ3VpZGFuY2UgYXMgdG8gd2hhdCBhcmUgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHdlbGwKKyAgICAgICAgLy8vIGFzIHRvIG9wdGlvbmFsbHkgcHJvdmlkZSBzdWdnZXN0aW9uIHRvIHRoZSBjbGllbnQgYXMgdG8gaG93IHRvIGVuYWJsZSB0aGUgcmVxdWVzdGVkCisgICAgICAgIC8vLyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgIElORk9fQ09ORkxJQ1QsCisgICAgfTsKKworICAgIEZhaWx1cmUgZmFpbHVyZTsgICAgLy8vPCBmYWlsdXJlIGNvZGUKKworICAgIC8vLyBGYWlsaW5nIChvciBjb3JyZWN0ZWQpIGZpZWxkIG9yIHBhcmFtZXRlcmFuZCBvcHRpb25hbGx5LCBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlCisgICAgLy8vIGZpZWxkLiBWYWx1ZXMgbXVzdCBvbmx5IGJlIHNldCBmb3IgZmllbGQgZmFpbHVyZXMgb3RoZXIgdGhhbiBCQURfVkFMVUUsIGFuZCBvbmx5IGlmIHRoZXkgYXJlCisgICAgLy8vIGRpZmZlcmVudCBmcm9tIHRoZSBnbG9iYWxseSBzdXBwb3J0ZWQgdmFsdWVzIChlLmcuIGR1ZSB0byByZXN0cmljdGlvbnMgYnkgYW5vdGhlciBwYXJhbSBvcgorICAgIC8vLyBpbnB1dCBkYXRhKS4KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMgZmllbGQ7CisKKyAgICAvLy8gQ29uZmxpY3RpbmcgcGFyYW1ldGVycyBvciBmaWVsZHMgd2l0aCBvcHRpb25hbCBzdWdnZXN0aW9ucyB3aXRoIChvcHRpb25hbCkgc3VnZ2VzdGVkIHZhbHVlcworICAgIC8vLyBmb3IgYW55IGNvbmZsaWN0aW5nIGZpZWxkcyB0byBhdm9pZCB0aGUgY29uZmxpY3QuIE11c3Qgb25seSBiZSBzZXQgZm9yIENPTkZMSUNULCBVTlNVUFBPUlRFRAorICAgIC8vLyBhbmQgSU5GT19DT05GTElDVCBmYWlsdXJlIGNvZGVzLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gY29uZmxpY3RzOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV09SSworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKiBVbmlxdWUgSUQgZm9yIGEgcHJvY2Vzc2luZyBub2RlLiAqLwordHlwZWRlZiB1aW50MzJfdCBjMl9ub2RlX2lkX3Q7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4V29ya09yZGluYWwsCit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGZvciBvcmRlcmluZyB3b3JrIGl0ZW1zIG9uIGEgY29tcG9uZW50IHBvcnQuCisgKi8KK3N0cnVjdCBDMldvcmtPcmRpbmFsU3RydWN0IHsKKy8vcHVibGljOgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcDsgICAgIC8qKiBmcmFtZSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzICovCisgICAgYzJfY250cjY0X3QgZnJhbWVJbmRleDsgICAgLyoqIHN1Ym1pc3Npb24gb3JkaW5hbCBvbiB0aGUgaW5pdGlhbCBjb21wb25lbnQgKi8KKyAgICBjMl9jbnRyNjRfdCBjdXN0b21PcmRpbmFsOyAvKiogY2FuIGJlIGdpdmVuIGJ5IHRoZSBjb21wb25lbnQsIGUuZy4gZGVjb2RlIG9yZGVyICovCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFdvcmtPcmRpbmFsKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKKyAgICBDMkZJRUxEKGZyYW1lSW5kZXgsICJmcmFtZS1pbmRleCIpCisgICAgQzJGSUVMRChjdXN0b21PcmRpbmFsLCAiY3VzdG9tLW9yZGluYWwiKQorfTsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgQ29kZWMgMi4wIGZyYW1lIHdpdGggaXRzIG1ldGFkYXRhLgorICoKKyAqIEEgZnJhbWUgYmFzaWNhbGx5IGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgc2V0cyBvZiBidWZmZXJzLCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYW5kIGluZm8gYnVmZmVycworICogYWxvbmcgd2l0aCBzb21lIG5vbi1jb25maWd1cmF0aW9uIG1ldGFkYXRhLgorICovCitzdHJ1Y3QgQzJGcmFtZURhdGEgeworLy9wdWJsaWM6CisgICAgZW51bSBmbGFnc190IDogdWludDMyX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGlucHV0IGZyYW1lczogbm8gb3V0cHV0IGZyYW1lIHNoYWxsIGJlIGdlbmVyYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhpcyBmcmFtZSwgYnV0CisgICAgICAgICAqIG1ldGFkYXRhIHNoYWxsIHN0aWxsIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgICogRm9yIG91dHB1dCBmcmFtZXM6IHRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIGFuZCBidXQgbWV0YWRhdGEgaXMgc3RpbGwgdmFsaWQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0RST1BfRlJBTUUgICAgPSAoMSA8PCAwKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGN1cnJlbnQgc3RyZWFtLiBGdXJ0aGVyIGZyYW1lcyBhcmUgcGFydCBvZiBhIG5ldworICAgICAgICAgKiBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBGTEFHX0VORF9PRl9TVFJFQU0gPSAoMSA8PCAxKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIHdpdGggaXRzIG1ldGFkYXRhLgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgb25seSBzZXQgYnkgY29tcG9uZW50cyAtIGUuZy4gYXMgYSByZXNwb25zZSB0byB0aGUgZmx1c2ggY29tbWFuZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRElTQ0FSRF9GUkFNRSA9ICgxIDw8IDIpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyBub3QgdGhlIGxhc3QgZnJhbWUgcHJvZHVjZWQgZm9yIHRoZSBpbnB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBmbGFnIGlzIG5vcm1hbGx5IHNldCBieSB0aGUgY29tcG9uZW50IC0gZS5nLiB3aGVuIGFuIGlucHV0IGZyYW1lIHJlc3VsdHMgaW4gbXVsdGlwbGUKKyAgICAgICAgICogb3V0cHV0IGZyYW1lcywgdGhpcyBmbGFnIGlzIHNldCBvbiBhbGwgYnV0IHRoZSBsYXN0IG91dHB1dCBmcmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxzbywgd2hlbiBjb21wb25lbnRzIGFyZSBjaGFpbmVkLCB0aGlzIGZsYWcgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZG93biB0aGUKKyAgICAgICAgICogd29yayBjaGFpbi4gVGhhdCBpcywgaWYgc2V0IG9uIGFuIGVhcmxpZXIgZnJhbWUgb2YgYSB3b3JrLWNoYWluLCBpdCBzaG91bGQgYmUgcHJvcGFnYXRlZAorICAgICAgICAgKiB0byBhbGwgbGF0ZXIgZnJhbWVzIGluIHRoYXQgY2hhaW4uIEFkZGl0aW9uYWxseSwgY29tcG9uZW50cyBkb3duIHRoZSBjaGFpbiBjb3VsZCBzZXQKKyAgICAgICAgICogdGhpcyBmbGFnIGV2ZW4gaWYgbm90IHNldCBlYXJsaWVyLCBlLmcuIGlmIG11bHRpcGxlIG91dHB1dCBmcmFtZSBpcyBnZW5lcmF0ZWQgYXQgdGhhdAorICAgICAgICAgKiBjb21wb25lbnQgZm9yIHRoZSBpbnB1dCBmcmFtZS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfSU5DT01QTEVURSA9ICgxIDw8IDMpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBjb250YWlucyBvbmx5IGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YSwgYW5kIG5vIGFjdHVhbCBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGRlcHJlY2F0ZWQgcGFzcyBjb2RlYyBjb25maWd1cmF0aW9uIHdpdGggdXNpbmcgdGhlIFx0b2RvIGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaW5mbyB0b2dldGhlciB3aXRoIHRoZSBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfQ09ERUNfQ09ORklHICA9ICgxdSA8PCAzMSksCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGZsYWdzICovCisgICAgZmxhZ3NfdCAgZmxhZ3M7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnM7CisgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAorICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7Cit9OworCitzdHJ1Y3QgQzJXb3JrbGV0IHsKKy8vcHVibGljOgorICAgIC8vIElOCisgICAgYzJfbm9kZV9pZF90IGNvbXBvbmVudDsKKworICAgIC8qKiBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gYmUgYXBwbGllZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGlzIHdvcmtsZXQuICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gdHVuaW5nczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBPVVQKKyAgICBDMkZyYW1lRGF0YSBvdXRwdXQ7Cit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHBhcnRpYWwgd29yay1jaGFpbnMgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgd29yayBpdGVtcy4KKyAqCisgKiBUbyBiZSBkZWZpbmVkIGxhdGVyLgorICovCitzdHJ1Y3QgQzJXb3JrQ2hhaW5JbmZvOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBhIHNpbmdsZSB3b3JrIGl0ZW0uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdG8gdGhlIGNvbXBvbmVudCBmb3IgdGhlIGZpcnN0IHdvcmtsZXQuIEFzIHN1Y2gsCisgKiB3b3JrbGV0cyBtdXN0IG5vdCBiZSBlbXB0eS4gVGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCBpcyBwYXNzZWQuCisgKi8KK3N0cnVjdCBDMldvcmsgeworLy9wdWJsaWM6CisgICAgLy8vIGFkZGl0aW9uYWwgd29yayBjaGFpbiBpbmZvIG5vdCBwYXJ0IG9mIHRoaXMgd29yaworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMldvcmtDaGFpbkluZm8+IGNoYWluSW5mbzsKKworICAgIC8vLyBUaGUgaW5wdXQgZGF0YSB0byBiZSBwcm9jZXNzZWQgYXMgcGFydCBvZiB0aGlzIHdvcmsvd29yay1jaGFpbi4gVGhpcyBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdpdGggb3duZXJzaGlwLiBXaGVuIHRoZSB3b3JrIGlzIHJldHVybmVkICh2aWEgb25Xb3JrRG9uZSksIHRoZSBpbnB1dCBidWZmZXItcGFjaydzCisgICAgLy8vIGJ1ZmZlciB2ZWN0b3Igc2hhbGwgY29udGFpbiBudWxscHRycy4KKyAgICBDMkZyYW1lRGF0YSBpbnB1dDsKKworICAgIC8vLyBUaGUgY2hhaW4gb2YgY29tcG9uZW50cywgdHVuaW5ncyAoaW5jbHVkaW5nIG91dHB1dCBidWZmZXIgcG9vbCBJRHMpIGFuZCBpbmZvIHJlcXVlc3RzIHRoYXQgdGhlCisgICAgLy8vIGRhdGEgbXVzdCBwYXNzIHRocm91Z2guIElmIHRoaXMgaGFzIG1vcmUgdGhhbiBhIHNpbmdsZSBlbGVtZW50LCB0aGUgdHVubmVscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICAvLy8gY29tcG9uZW50cyBvZiB0aGUgd29ya2xldCBjaGFpbiBtdXN0IGhhdmUgYmVlbiAoc3VjY2Vzc2Z1bGx5KSBwcmUtcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGF0CisgICAgLy8vIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gQWxsb2NhdGluZyB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gdGhlIHdvcmtsZXRzIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICAgIC8vLyBlYWNoIGNvbXBvbmVudC4gVXBvbiB3b3JrIHN1Ym1pc3Npb24sIGVhY2ggb3V0cHV0IGJ1ZmZlci1wYWNrIHNoYWxsIGJlIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQKKyAgICAvLy8gdmVjdG9yIGNvbnRhaW5pbmcgbnVsbHB0cnMuIFdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGVkL3JldHVybmVkIHRvIHRoZSBjbGllbnQsIG91dHB1dCBidWZmZXJzCisgICAgLy8vIHBvaW50ZXJzIGZyb20gYWxsIGJ1dCB0aGUgZmluYWwgd29ya2xldCBzaGFsbCBiZSBudWxscHRycy4KKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4+IHdvcmtsZXRzOworCisgICAgLy8vIE51bWJlciBvZiB3b3JrbGV0cyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGluIHRoaXMgY2hhaW4uIFRoaXMgc2hhbGwgYmUgaW5pdGlhbGl6ZWQgdG8gMCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdoZW4gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBJdCBzaGFsbCBjb250YWluIHRoZSBudW1iZXIgb2Ygd29ya2xldHMgdGhhdCB3ZXJlCisgICAgLy8vIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgd2hlbiB0aGUgd29yayBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LiBJZiB0aGlzIGlzIGxlc3MgdGhlbiB0aGUgbnVtYmVyCisgICAgLy8vIG9mIHdvcmtsZXRzLCByZXN1bHQgbXVzdCBub3QgYmUgc3VjY2Vzcy4gSXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIHdvcmtsZXRzLnNpemUoKV0uCisgICAgdWludDMyX3Qgd29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAvLy8gVGhlIGZpbmFsIG91dGNvbWUgb2YgdGhlIHdvcmsgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgd29ya2xldHNQcm9jZXNzZWQpLiBJZiAwIHdoZW4KKyAgICAvLy8gd29yayBpcyByZXR1cm5lZCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB3b3JrbGV0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorICAgIGMyX3N0YXR1c190IHJlc3VsdDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBmdXR1cmUgd29yayB0byBiZSBzdWJtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudC4gVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8KKyAqIHJlc2VydmUgdGhlIHdvcmsgZm9yIHdvcmsgb3JkZXJpbmcgcHVycG9zZXMuCisgKi8KK3N0cnVjdCBDMldvcmtPdXRsaW5lIHsKKy8vcHVibGljOgorICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICBzdGQ6OnZlY3RvcjxjMl9ub2RlX2lkX3Q+IGNoYWluOworfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJXT1JLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTliYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19NQUNST19VVElMU19IXworI2RlZmluZSBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisKKy8qKiBcZmlsZQorICogTWFjcm8gdXRpbGl0aWVzIGZvciB0aGUgdXRpbHMgbGlicmFyeSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxpZiAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT1VOVElORyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIF9DMl9BUkcoKSBleHBhbmRzIHRvICcnLCB3aGlsZSBfQzJfQVJHKHgpIGV4cGFuZHMgdG8gJywgeCcKKy8vIF9DMl9BUkduKC4uLikgZG9lcyB0aGUgc2FtZSBmb3IgbiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX0FSRyguLi4pICwgIyNfX1ZBX0FSR1NfXworI2RlZmluZSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcoXzEpIF9DMl9BUkcoXzIpCisjZGVmaW5lIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcyKF8zLCBfNCkKKyNkZWZpbmUgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzQoXzUsIF82LCBfNywgXzgpCisjZGVmaW5lIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICAgICAgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHOChfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KQorCisvLyByZXR1cm4gdGhlIDY1dGggYXJndW1lbnQKKyNkZWZpbmUgX0MyX0FSR0NfMyhfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIF82NAorCisvLy8gXGVuZGlmCisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAqLworLy8gV2UgZG8gdGhpcyBieSBwcmVwZW5kaW5nIDEgYW5kIGFwcGVuZGluZyA2NSBkZXNpZ25lZCB2YWx1ZXMgc3VjaCB0aGF0IHRoZSA2NXRoIGVsZW1lbnQKKy8vIHdpbGwgYmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisjZGVmaW5lIF9DMl9BUkdDKC4uLikgX0MyX0FSR0NfMSgwLCAjI19fVkFfQVJHU19fLCBcCisgICAgICAgIDY0LCA2MywgNjIsIDYxLCA2MCwgNTksIDU4LCA1NywgNTYsIDU1LCA1NCwgNTMsIDUyLCA1MSwgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLCBcCisgICAgICAgIDQyLCA0MSwgNDAsIDM5LCAzOCwgMzcsIDM2LCAzNSwgMzQsIDMzLCAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCBcCisgICAgICAgIDIwLCAxOSwgMTgsIDE3LCAxNiwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCkKKworLy8vIFxpZiAwCisKKy8vIHN0ZXAgMS4gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIHRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW0gZGVmaW5pdGlvbnMKKy8vIChOT1RFOiB3ZSBkb24ndCBrbm93IHdoaWNoIGFyZ3VtZW50IHdpbGwgaGF2ZSB0aGlzIHRyYWlsaW5nIGNvbW1hIHNvIHdlIGhhdmUgdG8gdHJ5IGFsbCkKKyNkZWZpbmUgX0MyX0FSR0NfMShfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIFwKKyAgICBfQzJfQVJHQ18yKF8gX0MyX0FSRyhfMCkgXAorICAgIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICBfQzJfQVJHMTYoXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyKSBcCisgICAgX0MyX0FSRzE2KF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCkgXAorICAgIF9DMl9BUkcxNihfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQpLCBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworLy8gc3RlcCAyLiB0aGlzIGlzIG5lZWRlZCBhcyByZW1vdmVkIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIGRpcmVjdGx5IGFzIGVtcHR5IGludG8gYSBtYWNybworI2RlZmluZSBfQzJfQVJHQ18yKC4uLikgX0MyX0FSR0NfMyhfX1ZBX0FSR1NfXykKKworLy8vIFxlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT05WRVJTSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vLyBcaWYgMAorCisvLyBtYWNyb3MgdGhhdCBjb252ZXJ0IF8xLCBfMiwgXzMsIC4uLiB0byBmbihfMSwgYXJnKSwgZm4oXzIsIGFyZyksIGZuKF8zLCBhcmcpLCAuLi4KKyNkZWZpbmUgX0MyX01BUF82NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF84KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF83KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZykKKworLy8vIFxlbmRpZgorCisvKioKKyAqIE1hcHMgZWFjaCBhcmd1bWVudCB1c2luZyBhbm90aGVyIG1hY3JvIHggLT4gZm4oeCwgYXJnKQorICovCisvLyB1c2Ugd3JhcHBlciB0byBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCisjZGVmaW5lIF9DMl9NQVAoZm4sIGFyZywgLi4uKSBfQzJfTUFQX18oX0MyX0FSR0MoX19WQV9BUkdTX18pLCBmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorCisvLy8gXGlmIDAKKworLy8gZXZhbHVhdGUgX24gc28gaXQgYmVjb21lcyBhIG51bWJlcgorI2RlZmluZSBfQzJfTUFQX18oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8oX24sIGZuLCBhcmcsIF9fVkFfQVJHU19fKQorLy8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlcgorI2RlZmluZSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyMjX24gKGZuLCBhcmcsIF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19NQUNST19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJlYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMkJVRkZFUl9IXworI2RlZmluZSBBTkRST0lEX0MyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworLyogVXNlIGFuZHJvaWQgbmF0aXZlIGhhbmRsZSBmb3IgQzJIYW5kbGUgKi8KK3R5cGVkZWYgOjpuYXRpdmVfaGFuZGxlX3QgQzJIYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBbmRyb2lkIHBsYXRmb3JtIGJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4KKyAqLworc3RydWN0IEMyQW5kcm9pZE1lbW9yeVVzYWdlIDogcHVibGljIEMyTWVtb3J5VXNhZ2UgeworICAgIGlubGluZSBDMkFuZHJvaWRNZW1vcnlVc2FnZShjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSkgOiBDMk1lbW9yeVVzYWdlKHVzYWdlKSB7IH0KKworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIFJldXNlIGdyYWxsb2MgZmxhZ3Mgd2hlcmUgcG9zc2libGUsIGFzIENvZGVjIDIuMCBBUEkgb25seSB1c2VzIGJpdHMgMCBhbmQgMS4KKyAgICAgKi8KKyAgICBlbnVtIGNvbnN1bWVyX3QgOiB1aW50NjRfdCB7CisgICAgICAgIFJFTkRFUlNDUklQVF9SRUFEID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfUkVBRCAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAorICAgICAgICBIV19DT01QT1NFUl9SRUFEICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIsCisgICAgICAgIC8vIGdyYWxsb2MgZG9lcyBub3QgZGVmaW5lIGEgdmlkZW8gZGVjb2RlciByZWFkIHVzYWdlIGZsYWcsIHNvIHVzZSBlbmNvZGVyIGZvcgorICAgICAgICAvLyBub3cKKyAgICAgICAgSFdfQ09ERUNfUkVBRCAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCisgICAgICAgIFJFQURfUFJPVEVDVEVEICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCisgICAgfTsKKworICAgIGVudW0gcHJvZHVjZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1dSSVRFID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfV1JJVEUgICA9IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAorICAgICAgICBIV19DT01QT1NFUl9XUklURSAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPREVDX1dSSVRFICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB3cml0ZSBwcm90ZWN0ZWQgdXNhZ2UgZmxhZywgc28gdXNlIHJlYWQgcHJvdGVjdGVkCisgICAgICAgIC8vIG5vdworICAgICAgICBXUklURV9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgc3RhdGljIEMyTWVtb3J5VXNhZ2UgRnJvbUdyYWxsb2NVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRvIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgdWludDY0X3QgYXNHcmFsbG9jVXNhZ2UoKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTFhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlOworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVE9ETzogOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxJSW5wdXRTdXJmYWNlPgordHlwZWRlZiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IElucHV0U3VyZmFjZUJhc2U7CisKK2NsYXNzIElucHV0U3VyZmFjZSA6IHB1YmxpYyBJbnB1dFN1cmZhY2VCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUlucHV0U3VyZmFjZQorICAgIHNwPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OkMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgLy8gVE9ETzogaW50ZigpCisKKyAgICBzdGF0aWMgc3A8SW5wdXRTdXJmYWNlPiBDcmVhdGUoKTsKKworcHJpdmF0ZToKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYmFzZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gVE9ETzogaW5oZXJpdCBmcm9tIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uCitjbGFzcyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIEZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSW5wdXRTdXJmYWNlOworCisgICAgLy8gRm9yIElucHV0U3VyZmFjZQorICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICBib29sIGluaXQoKTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKworICAgIGNsYXNzIEltcGw7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEltcGw+IG1JbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRTdXJmYWNlQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaCBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgxMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKK2ltcG9ydCByZSwgc3lzCisKK2dsb2JhbCBpbl9jb21tZW50LCBjdXJyZW50LCBpbmRlbnQsIGhvbGQKK2luX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZCA9IEZhbHNlLCBOb25lLCAnJywgW10KKworY2xhc3MgQ2hhbmdlQ1N0eWxlQ29tbWVudHNUb0RveHk6CisgICAgZGVmIGR1bXBfaG9sZCgpOgorICAgICAgICBnbG9iYWwgaG9sZAorICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBkb3h5X2hvbGQoKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGhvbGQKKyAgICAgICAgaWYgY3VycmVudCA9PSAnLy8nOgorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBwcmludChyZS5zdWIocideKCAqLy8oPyEvKSknLCByJ1wxLycsIGgpLCBlbmQ9JycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGggPSByZS5zdWIocideKCAqL1sqXSg/IVsqXSkpJywgcidcMSonLCBoKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodCwgaW5kLCBsaW5lKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGluZGVudCwgaG9sZAorICAgICAgICBpZiB0ICE9IGN1cnJlbnQgb3IgaW5kIG5vdCBpbiAoaW5kZW50LCBpbmRlbnQgKyAnICcpOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgICAgIGN1cnJlbnQsIGluZGVudCA9IHQsIGluZAorICAgICAgICBob2xkLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50CisgICAgICAgIGlmIGluZCBpbiAoaW5kZW50LCAnJyk6CisgICAgICAgICAgICBkb3h5X2hvbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgY3VycmVudCwgaW5kZW50ID0gTm9uZSwgTm9uZQorICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaW5kID0gcmUubWF0Y2gocideKCAqKScsIGxpbmUpLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbl9jb21tZW50OgorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKlsqXS8nLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKi8vJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBvbmUtbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvLycsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqL1sqXScsIGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgbXVsdGktbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZ29vZCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpbl9jb21tZW50ID0gbm90IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpCisKK2NsYXNzIEF1dG9Hcm91cDoKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGlmICcvY29kZWMyL2luY2x1ZGUvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnQVBJIENvZGVjMiBBUEknCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiAnL2NvZGVjMi92bmRrLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1ZOREsgUGxhdGZvcm0gcHJvdmlkZWQgZ2x1ZScKKyAgICAgICAgZWxpZiAnL2NvZGVjMi90ZXN0cy8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdUZXN0cyBVbml0IHRlc3RzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSAnUmFuZG9tIE1pc2MuIHNhbmRib3gnCisKKyAgICAgICAgcHJpbnQoJyN1bmRlZiBfX0FQUExFX18nKQorCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaWYgcmUubWF0Y2gocidebmFtZXNwYWNlIGFuZHJvaWQgeycsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gXGFkZHRvZ3JvdXAge30nLmZvcm1hdChncm91cCkpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gQHsnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInXn0gKy8vICtuYW1lc3BhY2UnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAfScpCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorCitQID0gQXV0b0dyb3VwKCkKK2ZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3J0JykgYXMgaW5wdXQ6CisgICAgICAgIFAucHJvY2VzcyhpbnB1dCwgcGF0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYmVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnCkBAIC0wLDAgKzEsMjQ0NiBAQAorIyBEb3h5ZmlsZSAxLjguMTEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBDb2RlYzIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBhbiBpY29uIHRoYXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQorIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5CisjIHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IG91dC90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyL2FwaQorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQorIyBVKzMwNDQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYSBuZXcKKyMgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZSBwYXJ0CisjIG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgSWYgb25lIGFkZHMgYSBzdHJ1Y3Qgb3IgY2xhc3MgdG8gYSBncm91cCBhbmQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbiBhbHNvCisjIGFueSBuZXN0ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFkZGVkIHRvIHRoZSBzYW1lIGdyb3VwLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCisjIGlzIGRpc2FibGVkIGFuZCBvbmUgaGFzIHRvIGFkZCBuZXN0ZWQgY29tcG91bmRzIGV4cGxpY2l0bHkgdmlhIFxpbmdyb3VwLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dST1VQX05FU1RFRF9DT01QT1VORFMgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLAorIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gSWYgc2V0IHRvIFlFUywgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLCBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PLCB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbgorIyBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTywgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTywgdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0NPTVBPVU5EX1JFRkVSRU5DRSB0YWcgaXMgc2V0IHRvIE5PIChkZWZhdWx0KSB0aGVuIGRveHlnZW4gd2lsbAorIyBhcHBlbmQgYWRkaXRpb25hbCB0ZXh0IHRvIGEgcGFnZSdzIHRpdGxlLCBzdWNoIGFzIENsYXNzIFJlZmVyZW5jZS4gSWYgc2V0IHRvCisjIFlFUyB0aGUgY29tcG91bmQgcmVmZXJlbmNlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfQ09NUE9VTkRfUkVGRVJFTkNFPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0dST1VQRURfTUVNQl9JTkMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgYWRkIGZvciBlYWNoCisjIGdyb3VwZWQgbWVtYmVyIGFuIGluY2x1ZGUgc3RhdGVtZW50IHRvIHRoZSBkb2N1bWVudGF0aW9uLCB0ZWxsaW5nIHRoZSByZWFkZXIKKyMgd2hpY2ggZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSB0aGUgbWVtYmVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRvZG8KKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdGVzdAorIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSBJTlRFUk5BTAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCisjIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCisjIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyByZWFkIGJ5IGRveHlnZW4uCisjCisjIElmIGxlZnQgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLAorIyAqLmMrKywgKi5qYXZhLCAqLmlpLCAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLAorIyAqLmhoLCAqLmh4eCwgKi5ocHAsICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsCisjICoubSwgKi5tYXJrZG93biwgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICoucHl3LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsCisjICoudmhkLCAqLnZoZGwsICoudWNmLCAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IEMyKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouaAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gLl8qCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHByb3Blcmx5IHByb2Nlc3NlZCBieSBkb3h5Z2VuLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGdlbmVyYXRlZCB3aXRoIHRoZSAtRHVzZS1saWJjbGFuZz1PTiBvcHRpb24gZm9yIENNYWtlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gLXN0ZD1jKysxNAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIFlFUyBjYW4gaGVscCB0byBzaG93IHdoZW4gZG94eWdlbiB3YXMgbGFzdCBydW4gYW5kIHRodXMgaWYgdGhlCisjIGRvY3VtZW50YXRpb24gaXMgdXAgdG8gZGF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHksCisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZAorIyAoWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGUgc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgSWYgdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlLXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm9ycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlIEVYVEVSTkFMX1NFQVJDSAorIyBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvciBzZWFyY2hpbmcgYW5kCisjIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkIHRoZSBpbmRleGluZworIyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUgdGhlIHNlY3Rpb24KKyMgIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQganVzdAorIyBieSBpdHMgbmFtZSBvciB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBhcyB0byBiZSB1c2VkIHdpdGggdGhlIExhVGVYCisjIFx1c2VwYWNrYWdlIGNvbW1hbmQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5IDoKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMgb3IgRVhUUkFfUEFDS0FHRVM9e3RpbWVzfQorIyBUbyB1c2UgdGhlIG9wdGlvbiBpbnRsaW1pdHMgd2l0aCB0aGUgYW1zbWF0aCBwYWNrYWdlIHlvdSBjYW4gc3BlY2lmeToKKyMgRVhUUkFfUEFDS0FHRVM9W2ludGxpbWl0c117YW1zbWF0aH0KKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIsCisjICRwcm9qZWN0YnJpZWYsICRwcm9qZWN0bG9nby4gRG94eWdlbiB3aWxsIHJlcGxhY2UgJHRpdGxlIHdpdGggdGhlIGVtcHR5CisjIHN0cmluZywgZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHRoZSB1c2VyIGlzIHJlZmVycmVkCisjIHRvIEhUTUxfSEVBREVSLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIExhVGVYIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzIGNyZWF0ZWQKKyMgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIERveHlnZW4KKyMgd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9TVFlMRVNIRUVUID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMgSWYgdGhlIFJURl9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZSBjb2RlCisjIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgUlRGIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NPVVJDRV9DT0RFICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIFRoZSBNQU5fU1VCRElSIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCB3aXRoaW4KKyMgTUFOX09VVFBVVCBpbiB3aGljaCB0aGUgbWFuIHBhZ2VzIGFyZSBwbGFjZWQuIElmIGRlZmF1bHRzIHRvIG1hbiBmb2xsb3dlZCBieQorIyBNQU5fRVhURU5TSU9OIHdpdGggdGhlIGluaXRpYWwgLiByZW1vdmVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9TVUJESVIgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8sIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IC9Wb2x1bWVzL0EvYW9zcC9wcmVidWlsdHMvY2xhbmcvZGFyd2luLXg4Ni9ob3N0LzMuNi9saWIvY2xhbmcvMy42L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9leHRlcm5hbC9saWJjeHgvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm02NCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2d0ZXN0CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19BUFBMRV9fPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19BTkRST0lEX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRDo9MSBcCisJCQkgX191bnVzZWQ9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IERFRklORV9GTEVYSUJMRV9NRVRIT0RTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbCBncmFwaCBjYW4gYmUKKyMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbGVyIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZXJncmFwaC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzZWUgdGhlIHNlY3Rpb24KKyMgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRvdCB0b29sIChHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pKS4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmLCBzdmcsIHBuZzpnZCwgcG5nOmdkOmdkLCBwbmc6Y2Fpcm8sCisjIHBuZzpjYWlybzpnZCwgcG5nOmNhaXJvOmNhaXJvLCBwbmc6Y2Fpcm86Z2RpcGx1cywgcG5nOmdkaXBsdXMgYW5kCisjIHBuZzpnZGlwbHVzOmdkaXBsdXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIHNwZWNpZmllZCBwYXRocyBhcmUgc2VhcmNoZWQgZm9yIGZpbGVzIHNwZWNpZmllZCBieQorIyB0aGUgIWluY2x1ZGUgc3RhdGVtZW50IGluIGEgcGxhbnR1bWwgYmxvY2suCisKK1BMQU5UVU1MX0lOQ0xVREVfUEFUSCAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIHRvIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY29tcG9uZW50X3dyYXBwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkNvbXBvbmVudFdyYXBwZXIuY3BwIiwKKyAgICAgICAgIlNpbXBsZU1ldGhvZFN0YXRlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWY4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQ29tcG9uZW50V3JhcHBlciIKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK2MyX3N0YXR1c190IFdyYXBTaW1wbGVNZXRob2QoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qodm9pZCk+IG9wLCBjb25zdCBTaW1wbGVNZXRob2RTdGF0ZSAmc3RhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBDMl9PSzsKKyAgICBzd2l0Y2ggKHN0YXRlLmdldE1vZGUoKSkgeworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpFWEVDVVRFOgorICAgICAgICAgICAgcmVzdWx0ID0gb3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpOT19PUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpIQU5HOgorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXN0YXRlLm92ZXJyaWRlUmVzdWx0KCZyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMkNvbXBvbmVudFdyYXBwZXI6OkluamVjdGVyOjpJbmplY3RlcihDMkNvbXBvbmVudFdyYXBwZXIgKnRoaXopIDogbVRoaXoodGhpeikge30KKworU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIEMyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIoJm1UaGl6LT5tU3RhcnRTdGF0ZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Okxpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIG1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgIG1MaXN0ZW5lci0+b25UcmlwcGVkX25iKGNvbXBvbmVudCxzZXR0aW5nUmVzdWx0KTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvbkVycm9yX25iKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgIG1MaXN0ZW5lci0+b25FcnJvcl9uYihjb21wb25lbnQsIGVycm9yQ29kZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6QzJDb21wb25lbnRXcmFwcGVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKSA6IG1Db21wKGNvbXApIHt9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1MaXN0ZW5lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGlzdGVuZXI+KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gbUNvbXAtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgbWF5QmxvY2spOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5xdWV1ZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5hbm5vdW5jZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6Zmx1c2hfc20oCisgICAgICAgIEMyQ29tcG9uZW50OjpmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICByZXR1cm4gbUNvbXAtPmZsdXNoX3NtKG1vZGUsIGZsdXNoZWRXb3JrKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpkcmFpbl9uYihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbUNvbXAtPmRyYWluX25iKG1vZGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBXcmFwU2ltcGxlTWV0aG9kKFt0aGlzXSB7IHJldHVybiBtQ29tcC0+c3RhcnQoKTsgfSwgbVN0YXJ0U3RhdGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1Db21wLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVzZXQoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZWxlYXNlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gQzJDb21wb25lbnRXcmFwcGVyOjppbnRmKCl7CisgICAgcmV0dXJuIG1Db21wLT5pbnRmKCk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjppbmplY3QoKSB7CisgICAgcmV0dXJuIEluamVjdGVyKHRoaXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKyNkZWZpbmUgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ3JlYXRlcyBhIFdyYXBwZXIgYXJvdW5kIHRoZSBjbGFzcyBDMkNvbXBvbmVudCBhbmQgaXRzIG1ldGhvZHMuIFRoZSB3cmFwcGVyIGlzIHVzZWQgdG8KKyAqIHNpbXVsYXRlIGVycm9ycyBpbiB0aGUgYW5kcm9pZCBtZWRpYSBjb21wb25lbnRzIGJ5IGZhdWx0IGluamVjdGlvbiB0ZWNobmlxdWUuCisgKiBUaGlzIGlzIGRvbmUgdG8gY2hlY2sgaG93IHRoZSBmcmFtZXdvcmsgaGFuZGxlcyB0aGUgZXJyb3Igc2l0dWF0aW9uLgorICovCitjbGFzcyBDMkNvbXBvbmVudFdyYXBwZXIKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEMyQ29tcG9uZW50V3JhcHBlcj4geworcHVibGljOgorICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeik7CisKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIHN0YXJ0KCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQzJDb21wb25lbnRXcmFwcGVyICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgbGlzdGVuZXIgY2xhc3MgaW5zaWRlIEMyQ29tcG9uZW50IGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBMaXN0ZW5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpOworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworCisgICAgZXhwbGljaXQgQzJDb21wb25lbnRXcmFwcGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50V3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgSW5qZWN0ZXIgaW5qZWN0KCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcDsKKworICAgIFNpbXBsZU1ldGhvZFN0YXRlIG1TdGFydFN0YXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEMyX0NPTVBPTkVOVF9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlkNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlTWV0aG9kU3RhdGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiU2ltcGxlTWV0aG9kU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OkluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KSA6IG1UaGl6KHRoaXopIHt9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpoYW5nKCkgeworICAgIG1UaGl6LT5tTW9kZSA9IEhBTkc7Cit9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlKSB7CisgICAgbVRoaXotPm1Nb2RlID0gZXhlY3V0ZSA/IEVYRUNVVEUgOiBOT19PUDsKKyAgICBtVGhpei0+bU92ZXJyaWRlID0gdHJ1ZTsKKyAgICBtVGhpei0+bVJlc3VsdE92ZXJyaWRlID0gZXJyOworfQorCitTaW1wbGVNZXRob2RTdGF0ZTo6U2ltcGxlTWV0aG9kU3RhdGUoKQorICAgIDogbU1vZGUoRVhFQ1VURSksIG1PdmVycmlkZShmYWxzZSksIG1SZXN1bHRPdmVycmlkZShDMl9PSykge30KKworU2ltcGxlTWV0aG9kU3RhdGU6Ok1vZGUgU2ltcGxlTWV0aG9kU3RhdGU6OmdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nb2RlOworfQorCitib29sIFNpbXBsZU1ldGhvZFN0YXRlOjpvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKCFtT3ZlcnJpZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcmVzdWx0ID0gbVJlc3VsdE92ZXJyaWRlOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX01FVEhPRF9TVEFURV9IXworI2RlZmluZSBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RhdGUgZm9yIGEgc2ltcGxlIG1ldGhvZCB3aGljaCByZXR1cm5zIGMyX3N0YXR1c190IGFuZCB0YWtlcyBubyBwYXJhbWV0ZXJzLgorICovCitjbGFzcyBTaW1wbGVNZXRob2RTdGF0ZSB7CitwdWJsaWM6CisgICAgZW51bSBNb2RlIHsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICBFWEVDVVRFLAorICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZworICAgICAgICBOT19PUCwKKyAgICAgICAgLy8gSGFuZzsgbmV2ZXIgcmV0dXJuCisgICAgICAgIEhBTkcsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluamVjdGVyIGNsYXNzIHRoYXQgbW9kaWZpZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZyB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZhaWwgdGhlIG9wZXJhdGlvbiB3aXRoIGdpdmVuIHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJvciBjb2RlIHRvIHJlcGxhY2UgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGV4ZWN1dGUgICB3aGV0aGVyIHRoZSB3cmFwcGVyIHNob3VsZCBleGVjdXRlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmFpbChjMl9zdGF0dXNfdCBlcnIsIGJvb2wgZXhlY3V0ZSA9IGZhbHNlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNpbXBsZU1ldGhvZFN0YXRlICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBleGVjdXRpb24gbW9kZS4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBpZiBjb25maWd1cmVkIHNvLgorICAgICAqLworICAgIGJvb2wgb3ZlcnJpZGVSZXN1bHQoYzJfc3RhdHVzX3QgKnJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1PdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBtUmVzdWx0T3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU0lNUExFX01FVEhPRF9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI5NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OSBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyLWhpZGwtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiQ29tcG9uZW50SW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZS5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3M2I1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIENvbXBvbmVudExpc3RlbmVyIHdyYXBwZXIKK3N0cnVjdCBDb21wb25lbnQ6Okxpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisKKyAgICBMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBjb21wb25lbnQpIDoKKyAgICAgICAgbUNvbXBvbmVudChjb21wb25lbnQpLAorICAgICAgICBtTGlzdGVuZXIoY29tcG9uZW50LT5tTGlzdGVuZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbkVycm9yKFN0YXR1czo6T0ssIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uRXJyb3JfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IHNldHRpbmdSZXN1bHRzKGMyc2V0dGluZ1Jlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmMycmVzdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYzJzZXR0aW5nUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZzZXR0aW5nUmVzdWx0c1tpeCsrXSwgKmMycmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5yZXNpemUoaXgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uVHJpcHBlZChzZXR0aW5nUmVzdWx0cyk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworCisgICAgICAgICAgICBzcDxDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9IG1Db21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgY29ycnVwdGVkIHdvcmsgaXRlbXMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25Xb3JrRG9uZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCisvLyBDb21wb25lbnQ6OlNpbmsKK3N0cnVjdCBDb21wb25lbnQ6OlNpbmsgOiBwdWJsaWMgSUlucHV0U2luayB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxJQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50LT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKKyAgICB9CisKKyAgICBTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpOworICAgIHZpcnR1YWwgflNpbmsoKSBvdmVycmlkZTsKKworICAgIC8vIFByb2Nlc3Mtd2lkZSBtYXA6IENvbXBvbmVudDo6U2luayAtPiBDMkNvbXBvbmVudC4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBzU2luazJDb21wb25lbnRNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8SUlucHV0U2luayosIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBzU2luazJDb21wb25lbnQ7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luayk7Cit9OworCitzdGQ6Om11dGV4CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50TXV0ZXh7fTsKK3N0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4KKyAgICAgICAgQ29tcG9uZW50OjpTaW5rOjpzU2luazJDb21wb25lbnR7fTsKKworQ29tcG9uZW50OjpTaW5rOjpTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpCisgICAgICAgIDogbUNvbXBvbmVudHtjb21wb25lbnR9LAorICAgICAgICAgIG1Db25maWd1cmFibGV7WyZjb21wb25lbnRdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHJldDEgPSBjb21wb25lbnQtPmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDEuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGNvbXBvbmVudCdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiByZXQyID0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4ocmV0MSktPgorICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGludGVyZmFjZSdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+PihyZXQyKTsKKyAgICAgICAgICB9KCl9IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVtcGxhY2UodGhpcywgY29tcG9uZW50LT5tQ29tcG9uZW50KTsKK30KKworQ29tcG9uZW50OjpTaW5rOjp+U2luaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVyYXNlKHRoaXMpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6U2luazo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBhdXRvIGkgPSBzU2luazJDb21wb25lbnQuZmluZChzaW5rLmdldCgpKTsKKyAgICBpZiAoaSA9PSBzU2luazJDb21wb25lbnQuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBpLT5zZWNvbmQubG9jaygpOworfQorCisvLyBDb21wb25lbnQKK0NvbXBvbmVudDo6Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpCisgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgbUludGVyZmFjZXtuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGNvbXBvbmVudC0+aW50ZigpLCBzdG9yZS5nZXQoKSl9LAorICAgICAgICBtTGlzdGVuZXJ7bGlzdGVuZXJ9LAorICAgICAgICBtU3RvcmV7c3RvcmV9LAorICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntjbGllbnRQb29sTWFuYWdlcn0geworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICAvLyBUT0RPOiBXZSBjb3VsZCBjYWNoZSB0aGlzIHBlciBjb21wb25lbnQvaW50ZXJmYWNlIHR5cGUKKyAgICBtSW5pdCA9IG1JbnRlcmZhY2UtPnN0YXR1cygpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnQ6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrczsKKworICAgIGlmICghb2JqY3B5KCZjMndvcmtzLCB3b3JrQnVuZGxlKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgaW5wdXQgYnVmZmVycy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5xdWV1ZV9uYigmYzJ3b3JrcykpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtQ29tcG9uZW50LT5mbHVzaF9zbSgKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsCisgICAgICAgICAgICAmYzJmbHVzaGVkV29ya3MpOworCisgICAgLy8gVW5yZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMmZsdXNoZWRXb3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgV29ya0J1bmRsZSBmbHVzaGVkV29ya0J1bmRsZTsKKyAgICBTdGF0dXMgcmVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjMnJlcyk7CisgICAgaWYgKGMycmVzID09IEMyX09LKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZmbHVzaGVkV29ya0J1bmRsZSwgYzJmbHVzaGVkV29ya3MsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHJlcywgZmx1c2hlZFdvcmtCdW5kbGUpOworICAgIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZHJhaW4oYm9vbCB3aXRoRW9zKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+ZHJhaW5fbmIod2l0aEVvcyA/CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TIDoKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfTk9fRU9TKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgIEdldENvZGVjMkJsb2NrUG9vbChibG9ja1Bvb2xJZCwgbUNvbXBvbmVudCwgJnBvb2wpOworICAgIGlmIChwb29sICYmIHBvb2wtPmdldEFsbG9jYXRvcklkKCkgPT0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4gYnFQb29sID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4ocG9vbCk7CisgICAgICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6Ok9uUmVuZGVyQ2FsbGJhY2sgY2IgPQorICAgICAgICAgICAgW3RoaXNdKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBiYXRjaCB0aGlzCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lPiByZW5kZXJlZDsKKyAgICAgICAgICAgICAgICByZW5kZXJlZC5yZXNpemUoMSk7CisgICAgICAgICAgICAgICAgcmVuZGVyZWRbMF0gPSB7IHByb2R1Y2VyLCBzbG90LCBuc2VjcyB9OworICAgICAgICAgICAgICAgICh2b2lkKW1MaXN0ZW5lci0+b25GcmFtZXNSZW5kZXJlZChyZW5kZXJlZCkuaXNPaygpOworICAgICAgICB9OworICAgICAgICBpZiAoYnFQb29sKSB7CisgICAgICAgICAgICBicVBvb2wtPnNldFJlbmRlckNhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgIGJxUG9vbC0+Y29uZmlndXJlUHJvZHVjZXIoc3VyZmFjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgY29ubmVjdFRvSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2luaz4gc2luazsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaW5rTXV0ZXgpOworICAgICAgICBpZiAoIW1TaW5rKSB7CisgICAgICAgICAgICBtU2luayA9IG5ldyBTaW5rKHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2luayA9IG1TaW5rOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzOworICAgIHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBpbnB1dFN1cmZhY2UtPmNvbm5lY3Qoc2luaywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmY29ubmVjdGlvbl0oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAodm9pZClwcm9kdWNlcjsKKyAgICAodm9pZClzb3VyY2U7CisgICAgKHZvaWQpX2hpZGxfY2I7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBCbG9ja1Bvb2xJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQmxvY2tQb29sSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmeworICAgICAgICAgICAgICAgICJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgKHBvb2wgPyBzdGQ6OnRvX3N0cmluZyhwb29sLT5nZXRMb2NhbElkKCkpIDogIm51bGwiKSwKKyAgICAgICAgICAgICAgICAwfSwKKyAgICAgICAgICAgIG1Qb29se3Bvb2x9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIGluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpaW5kaWNlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmllbGRzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJsb2NrUG9vbCkgeworICAgICAgICBtQmxvY2tQb29sc011dGV4LmxvY2soKTsKKyAgICAgICAgbUJsb2NrUG9vbHMuZW1wbGFjZShibG9ja1Bvb2wtPmdldExvY2FsSWQoKSwgYmxvY2tQb29sKTsKKyAgICAgICAgbUJsb2NrUG9vbHNNdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpLAorICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAwLAorICAgICAgICAgICAgbmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmxvY2tQb29sSW50Zj4oYmxvY2tQb29sKSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgIHJldHVybiBtQmxvY2tQb29scy5lcmFzZShibG9ja1Bvb2xJZCkgPT0gMSA/CisgICAgICAgICAgICBTdGF0dXM6Ok9LIDogU3RhdHVzOjpDT1JSVVBURUQ7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RhcnQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdG9wKCkpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlc2V0KCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gQ29tcG9uZW50OjpnZXRJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHNwPElDb21wb25lbnRJbnRlcmZhY2U+KG1JbnRlcmZhY2UpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHJldHVybiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNTM1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRJbnRlcmZhY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmFibGVDMkludGYgYmFzZWQgb24gQzJDb21wb25lbnRJbnRlcmZhY2UKK3N0cnVjdCBDb21wSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIENvbXBJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRme2ludGYtPmdldE5hbWUoKSwgaW50Zi0+Z2V0SWQoKX0sCisgICAgICAgIG1JbnRme2ludGZ9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIENvbXBvbmVudEludGVyZmFjZQorQ29tcG9uZW50SW50ZXJmYWNlOjpDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYsCisgICAgICAgIENvbXBvbmVudFN0b3JlKiBzdG9yZSkKKyAgICAgIDogbUludGVyZmFjZXtpbnRmfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGludGYpKX0geworICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZSk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudEludGVyZmFjZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRJbnRlcmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ZmFhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb247CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IFN0b3JlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIFN0b3JlSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRme3N0b3JlID8gc3RvcmUtPmdldE5hbWUoKSA6ICIiLCAwfSwKKyAgICAgICAgICAgIG1TdG9yZXtzdG9yZX0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgcGFyYW1zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+Y29uZmlnX3NtKHBhcmFtcywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIGZpZWxkcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKGZpZWxkcyk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6Om1ha2VfdW5pcXVlPFN0b3JlSW50Zj4oc3RvcmUpKX0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0geworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RvcmUpOworCisgICAgLy8gUmV0cmlldmUgc3RydWN0IGRlc2NyaXB0b3JzCisgICAgbVBhcmFtUmVmbGVjdG9yID0gbVN0b3JlLT5nZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdCh0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcG9ydENvbXBvbmVudEJpcnRoKGNvbXBvbmVudC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+aW5pdExpc3RlbmVyKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzKSwgaW50ZXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBjMnRyYWl0cyA9CisgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisgICAgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+IHRyYWl0cyhjMnRyYWl0cy5zaXplKCkpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmMydHJhaXQgOiBjMnRyYWl0cykgeworICAgICAgICBpZiAoYzJ0cmFpdCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmdHJhaXRzW2l4XSwgKmMydHJhaXQpKSB7CisgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhaXRzLnJlc2l6ZShpeCk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdHJhaXRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Q09SUlVQVEVELCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR2JwOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR2JwPiBCMkhHYnA7CisgICAgc3A8SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPSBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBuZXcgQjJIR2JwKHNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgIHNvdXJjZSk7CisgICAgX2hpZGxfY2IoaW5wdXRTdXJmYWNlID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Tk9fTUVNT1JZLAorICAgICAgICAgICAgIGlucHV0U3VyZmFjZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDb21wb25lbnRTdG9yZTo6b25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIC8vIGludmFsaWRhdGUgdW5zdXBwb3J0ZWQgc3RydWN0IGRlc2NyaXB0b3JzIGlmIGEgbmV3IGludGVyZmFjZSBpcyBsb2FkZWQgYXMgaXQgbWF5IGhhdmUKKyAgICAvLyBleHBvc2VkIG5ldyBkZXNjcmlwdG9ycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICBpZiAoIW1Mb2FkZWRJbnRlcmZhY2VzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvYWRlZEludGVyZmFjZXMuZW1wbGFjZShpbnRmLT5nZXROYW1lKCkpOworICAgIH0KK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgeworICAgIGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKGluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gMDsgc3JjSXggPCBpbmRpY2VzLnNpemUoKTsgKytzcmNJeCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoaW5kaWNlc1tzcmNJeF0pLmNvcmVJbmRleCgpOworICAgICAgICBjb25zdCBhdXRvIGl0ZW0gPSBtU3RydWN0RGVzY3JpcHRvcnMuZmluZChjb3JlSW5kZXgpOworICAgICAgICBpZiAoaXRlbSA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgY2FjaGUsIGFuZCBub3Qga25vd24gdG8gYmUgdW5zdXBwb3J0ZWQsIHF1ZXJ5IGxvY2FsIHJlZmxlY3RvcgorICAgICAgICAgICAgaWYgKCFtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jb3VudChjb3JlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuZW1wbGFjZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4XSwgKnN0cnVjdERlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2RzdEl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqaXRlbS0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50U3RvcmU6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gQ2FsbGVkIGZyb20gY3JlYXRlQ29tcG9uZW50KCkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIGBjb21wb25lbnRgLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBDb21wb25lbnRTdGF0dXMgY29tcG9uZW50U3RhdHVzOworICAgIGNvbXBvbmVudFN0YXR1cy5jMkNvbXBvbmVudCA9IGNvbXBvbmVudC0+bUNvbXBvbmVudDsKKyAgICBjb21wb25lbnRTdGF0dXMuYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZW1wbGFjZShjb21wb25lbnQsIGNvbXBvbmVudFN0YXR1cyk7Cit9CisKKy8vIENhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGVzdHJ1Y3RvciBvZiBgY29tcG9uZW50YC4gTm8gdmlydHVhbCBmdW5jdGlvbiBjYWxscworLy8gYXJlIG1hZGUgb24gYGNvbXBvbmVudGAgaGVyZS4KK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICBtQ29tcG9uZW50Um9zdGVyLmVyYXNlKGNvbXBvbmVudCk7Cit9CisKKy8vIER1bXBzIGNvbXBvbmVudCB0cmFpdHMuCitzdGQ6Om9zdHJlYW0mIENvbXBvbmVudFN0b3JlOjpkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wKSB7CisKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICAgIjsKKworICAgIG91dCA8PCBpbmRlbnQgPDwgIm5hbWU6ICIgPDwgY29tcC0+bmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiZG9tYWluOiAiIDw8IGNvbXAtPmRvbWFpbiA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAia2luZDogIiA8PCBjb21wLT5raW5kIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJyYW5rOiAiIDw8IGNvbXAtPnJhbmsgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIm1lZGlhVHlwZTogIiA8PCBjb21wLT5tZWRpYVR5cGUgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImFsaWFzZXM6IjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFsaWFzIDogY29tcC0+YWxpYXNlcykgeworICAgICAgICBvdXQgPDwgJyAnIDw8IGFsaWFzOworICAgIH0KKyAgICBvdXQgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHN0YXR1cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgLy8gUHJpbnQgYmlydGggdGltZS4KKyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1zID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgIGNvbXBTdGF0dXMuYmlydGhUaW1lLnRpbWVfc2luY2VfZXBvY2goKSk7CisgICAgc3RkOjp0aW1lX3QgYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KAorICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUpOworICAgIHN0ZDo6dG0gdG0gPSAqc3RkOjpsb2NhbHRpbWUoJmJpcnRoVGltZSk7CisgICAgb3V0IDw8IGluZGVudCA8PCAiQ3JlYXRpb24gdGltZTogIgorICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bSwgIiVZLSVtLSVkICVIOiVNOiVTIikKKyAgICAgICAgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtcy5jb3VudCgpICUgMTAwMAorICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBQcmludCBuYW1lIGFuZCBpZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wU3RhdHVzLmMyQ29tcG9uZW50LT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gY29tcG9uZW50IC0tIG51bGwgaW50ZXJmYWNlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQgPDwgIk5hbWU6ICIgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJJZDogIiA8PCBpbnRmLT5nZXRJZCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1Db21wb25lbnRSb3N0ZXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUNvbXBvbmVudFJvc3RlcikgeworICAgICAgICAgICAgICAgICAgICBkdW1wKG91dCwgcGFpci5zZWNvbmQpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIkVuZCBvZiBkdW1wIC0tIEMyQ29tcG9uZW50U3RvcmU6ICIKKyAgICAgICAgICAgICAgICA8PCBtU3RvcmUtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQob3V0LnN0cigpLCBoLT5kYXRhWzBdKSkgeworICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSB3cml0ZSgpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcgc3VjY2VlZGVkIjsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29uZmlndXJhYmxlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworQ2FjaGVkQ29uZmlndXJhYmxlOjpDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50ZikKKyAgICAgIDogbUludGZ7c3RkOjptb3ZlKGludGYpfSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx1aW50MzJfdD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpnZXRJZCgpIHsKKyAgICByZXR1cm4gbUludGYtPmdldElkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJnBhcmFtcywgYzJoZWFwUGFyYW1zKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIGludmFsaWQgb3V0cHV0IHBhcmFtcy4iOworICAgIH0KKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKSwgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmYzJwYXJhbXMsIGluUGFyYW1zQ29weSkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBpbnB1dCBwYXJhbXMuIjsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4oKSwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gVE9ETzogY2hlY2sgaWYgYmxvYiB3YXMgaW52YWxpZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMmZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgIGMycGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmMyZmFpbHVyZXMpOworICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGZhaWx1cmVzKGMyZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIGMycmVzdWx0IDogYzJmYWlsdXJlcykgeworICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZmFpbHVyZXNbaXhdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICsraXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGludmFsaWQgc2V0dGluZyByZXN1bHRzLiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsdXJlcy5yZXNpemUoaXgpOworICAgIH0KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBvdXRQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIGZhaWx1cmVzLCBvdXRQYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiIF9oaWRsX2NiKSB7CisgICAgQzJMaW5lYXJSYW5nZSByZXF1ZXN0ID0gQzJMaW5lYXJDYXBhY2l0eShtU3VwcG9ydGVkUGFyYW1zLnNpemUoKSkucmFuZ2UoCisgICAgICAgICAgICBzdGFydCwgY291bnQpOworICAgIGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4gcGFyYW1zKHJlcXVlc3Quc2l6ZSgpKTsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gcmVxdWVzdC5vZmZzZXQoKTsgc3JjSXggPCByZXF1ZXN0LmVuZE9mZnNldCgpOyArK3NyY0l4KSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkUGFyYW1zW3NyY0l4XSkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmcGFyYW1zW2RzdEl4XSwgKm1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJhbXMucmVzaXplKGRzdEl4KTsKKyAgICBfaGlkbF9jYihyZXMsIHBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGMyZmllbGRzOworICAgIHsKKyAgICAgICAgLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IG9iamVjdHMgYXJlIHJlc3RyaWN0ZWQgaW4gdGhhdCBzb21lCisgICAgICAgIC8vIG1lbWJlcnMgYXJlIGNvbnN0LgorICAgICAgICAvLyBDMlBhcmFtRmllbGQgLSByZXF1aXJlZCBmb3IgaXRzIGNvbnN0cnVjdG9yIC0gaGFzIG5vIGNvbnN0cnVjdG9ycworICAgICAgICAvLyBmcm9tIGZpZWxkcy4gVXNlIEMyUGFyYW1JbnNwZWN0b3IuCisgICAgICAgIGZvciAoY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBpbkZpZWxkcykgeworICAgICAgICAgICAgYzJmaWVsZHMuZW1wbGFjZV9iYWNrKF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVQYXJhbUZpZWxkKAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQuc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnR5cGUgPT0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEUgPworICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFIDoKKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGMyZmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLKTsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiBvdXRGaWVsZHMoaW5GaWVsZHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZyZXN1bHQgOiBjMmZpZWxkcykgeworICAgICAgICBpZiAob2JqY3B5KCZvdXRGaWVsZHNbZHN0SXhdLCByZXN1bHQpKSB7CisgICAgICAgICAgICArK2RzdEl4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0RmllbGRzLnJlc2l6ZShkc3RJeCk7CisgICAgICAgICAgICBjMnJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBvdXRGaWVsZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyM2EwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dEJ1ZmZlck1hbmFnZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6cmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcik7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpzZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIklucHV0IGJ1ZmZlciBhdCBpbmRleCAiIDw8IGkgPDwgIiBpcyBudWxsLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wbGFjZSgKKyAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgIT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICAgICAgPSBmaW5kTGlzdGVuZXItPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBmaW5kTGlzdGVuZXJEID0gbURlYXRoTm90aWZpY2F0aW9ucy5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyRCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpKSB7CisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gZmluZExpc3RlbmVyRC0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCAtPSBidWZmZXJJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUmVtb3ZlIGxpc3RlbmVyIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZCBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMKKy8vIGFsbCBmcmFtZUluZGljZXMgYW5kIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywgaS5lLiwgd2hlbgorLy8gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgLS0gY2FsbGVkIHdpdGggIgorICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMgPQorICAgICAgICAgICAgICAgIGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBmb3IgKGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5iZWdpbigpOworICAgICAgICAgICAgICAgIGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpOworICAgICAgICAgICAgICAgICsrZmluZEZyYW1lSW5kZXgpIHsKKyAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChjb25zdCBUcmFja2VkQnVmZmVyJiBidWZmZXJJZCA6IGJ1ZmZlcklkcykgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gYnVmZmVySWQuYnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIobGlzdGVuZXIgQCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IGJ1ZmZlcklkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGJ1ZmZlcklkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGxpc3RlbmVyKTsKK30KKworLy8gU2V0IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9zZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuc3RvcmUoCisgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zLAorICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibnVsbCBhcmd1bWVudCAocyk6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhcmcgQCAweCIgPDwgc3RkOjpoZXggPDwgYXJnCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIiAtLSAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQoaWQubGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgPT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIChmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgZnJhbWUgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICBhdXRvIGZpbmRCdWZmZXJJZCA9IGJ1ZmZlcklkcy5maW5kKGlkKTsKKyAgICBpZiAoZmluZEJ1ZmZlcklkID09IGJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgPDwgImJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVySWRzLmVyYXNlKGZpbmRCdWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBtRGVhdGhOb3RpZmljYXRpb25zW2lkLmxpc3RlbmVyXTsKKyAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlc1tpZC5mcmFtZUluZGV4XS5lbXBsYWNlX2JhY2soaWQuYnVmZmVySW5kZXgpOworICAgICsrZGVhdGhOb3RpZmljYXRpb25zLmNvdW50OworICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC5ub3RpZnlfb25lKCk7Cit9CisKKy8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorLy8gUmV0dXJuIHRydWUgYW5kIHNldCB0aW1lVG9SZXRyeSB0byB0aGUgdGltZSBwb2ludCB0byB3YWl0IGZvciBiZWZvcmUKKy8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCitib29sIElucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcykgeworCisgICAgc3RydWN0IE5vdGlmaWNhdGlvbiB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+IGlucHV0QnVmZmVyczsKKyAgICAgICAgTm90aWZpY2F0aW9uKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGwsIHNpemVfdCBzKQorICAgICAgICAgICAgICA6IGxpc3RlbmVyKGwpLCBpbnB1dEJ1ZmZlcnMocykge30KKyAgICB9OworICAgIHN0ZDo6bGlzdDxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbnM7CisgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zID0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgICBib29sIHJldHJ5ID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAqdGltZVRvUmV0cnlOcyA9IG5vdGlmaWNhdGlvbkludGVydmFsTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOworICAgICAgICAgICAgICAgICp0aW1lVG9SZXRyeU5zID0gc3RkOjptaW4oKnRpbWVUb1JldHJ5TnMsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zIC0gdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMpOworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOb3RpZmljYXRpb25zIGZvciBsaXN0ZW5lciBAICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2lsbCBiZSBwb3N0cG9uZWQuIjsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0byB0aGlzCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBidXQgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMsIHRoZQorICAgICAgICAgICAgLy8gbGlzdGVuZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zLS0tdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBub3RpZmljYXRpb24gdGltZSBhbnltb3JlLgorICAgICAgICAgICAgaWYgKGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5lbXBsYWNlX2JhY2sobGlzdGVuZXIsIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCk7CisgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyPiAmaW5wdXRCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5iYWNrKCkuaW5wdXRCdWZmZXJzOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yIChzdGQ6OnBhaXI8Y29uc3QgdWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+JiBwIDoKKyAgICAgICAgICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gcC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzaXplX3QmIGJ1ZmZlckluZGV4IDogYnVmZmVySW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyICZpbnB1dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5wdXRCdWZmZXJzW2krK107CisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhciBkZWF0aE5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIHNldCByZXRyeSB0byB0cnVlCisgICAgICAgICAgICAvLyBzbyBwcm9jZXNzTm90aWZpY2F0aW9ucyB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi4gVGhpcyB3aWxsCisgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhhdCBhIGxpc3RlbmVyIHdpdGggbm8gcGVuZGluZyBub3RpZmljYXRpb25zIHdpbGwKKyAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGhhcyBwYXNzZWQuCisgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID0gMDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5sYXN0U2VudE5zID0gdGltZU5vd05zOworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmlucHV0QnVmZmVycykuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGlmIHRoZSBjbGllbnQgaGFzIGRpZWQuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBzZW5kIGRlYXRoIG5vdGlmaWNhdGlvbnMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG5vdGlmaWNhdGlvbi5saXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIH0gZWxzZSB7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbnB1dEJ1ZmZlckxvZzsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIgOgorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJMb2cgPDwgIiAoIiA8PCBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZGVhdGggbm90aWZpY2F0aW9ucyBzZW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIHRoZXNlIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgcGFpcnM6IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlucHV0QnVmZmVyTG9nLnN0cigpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAid2lsbCByZXRyeSBhZ2FpbiBpbiAiIDw8ICp0aW1lVG9SZXRyeU5zIDw8ICJucy4iOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibm8gcGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zLiI7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldHJ5OworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6bWFpbigpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlciBtYWluIC0tIHN0YXJ0ZWQuIjsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHdoaWxlIChwcm9jZXNzTm90aWZpY2F0aW9ucygmdGltZVRvUmV0cnlOcykpIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHRpbWVUb1JldHJ5TnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyOjpJbnB1dEJ1ZmZlck1hbmFnZXIoKQorICAgICAgOiBtTWFpblRocmVhZHsmSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluLCB0aGlzfSB7Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlciYgSW5wdXRCdWZmZXJNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyIGluc3RhbmNle307CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM0NGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIERlcml2ZWQgY2xhc3Mgb2YgQzJJbnRlcmZhY2VIZWxwZXIKK2NsYXNzIElucHV0U3VyZmFjZTo6SW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb25maWd1cmFibGVDMkludGYKK2NsYXNzIElucHV0U3VyZmFjZTo6Q29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZUludGYoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpJbnRlcmZhY2U+ICZpbnRmLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBDb25maWd1cmFibGVDMkludGYoImlucHV0LXN1cmZhY2UiLCAwKSwKKyAgICAgICAgICBtSW50ZihpbnRmKSwKKyAgICAgICAgICBtU291cmNlKHNvdXJjZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkNvbmZpZ3VyYWJsZUludGYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnkoe30sIGluZGljZXMsIG1heUJsb2NrLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUludGYtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gbUludGY7CisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK1JldHVybjxzcDxJbnB1dFN1cmZhY2U6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICByZXR1cm4gbVByb2R1Y2VyOworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IElucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAoIXNpbmspIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBDb21wb25lbnQ6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKKyAgICBpZiAoY29tcCkgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgY29tcCwgbVN0b3JlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgc2luaywgbVN0b3JlKTsKKyAgICB9CisgICAgaWYgKCFjb25uZWN0aW9uLT5pbml0KCkpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gRGVyaXZlZCBtZXRob2RzIGZyb20gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorCisvLyBDb25zdHJ1Y3RvciBpcyBleGNsdXNpdmUgdG8gQ29tcG9uZW50U3RvcmUuCitJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpCisgICAgICA6IG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1Qcm9kdWNlcntwcm9kdWNlcn0sCisgICAgICAgIG1Tb3VyY2V7c291cmNlfSwKKyAgICAgICAgbUludGZ7c3RkOjptYWtlX3NoYXJlZDxJbnRlcmZhY2U+KHJlZmxlY3Rvcil9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVJbnRmPigKKyAgICAgICAgICAgICAgICAgICAgbUludGYsIHNvdXJjZSkpfSB7CisKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTMyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZUNvbm5lY3Rpb24iCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworY29uc3RleHByIGludDMyX3Qga0J1ZmZlckNvdW50ID0gMTY7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkgeworICAgIH0KK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb21wb25lbnRXcmFwcGVyIGZvciB1c2Ugd2l0aAorLy8gR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKCkuCisvLworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwgOiBwdWJsaWMgQ29tcG9uZW50V3JhcHBlciB7CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBsb2NhbENvbXApCisgICAgICAgICAgOiBtU291cmNle3NvdXJjZX0sIG1Mb2NhbENvbXB7bG9jYWxDb21wfSwgbVNpbmt7fSwgbUZyYW1lSW5kZXh7MH0geworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBsb2NhbENvbXAtPmludGYoKTsKKyAgICAgICAgbVNpbmtOYW1lID0gaW50ZiA/IGludGYtPmdldE5hbWUoKSA6ICIiOworICAgIH0KKworICAgIEltcGwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKQorICAgICAgICAgIDogbVNvdXJjZXtzb3VyY2V9LCBtTG9jYWxDb21we30sIG1TaW5re3Npbmt9LCBtRnJhbWVJbmRleHswfSB7CisgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBzaW5rLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rIGlzIGRlYWQuIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2lua0NvbmZpZ3VyYWJsZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KTsKKyAgICAgICAgaWYgKCFtU2lua0NvbmZpZ3VyYWJsZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsgaXMgbm90IGNvbmZpZ3VyYWJsZS4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBoaWRsX3N0cmluZyBuYW1lOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtU2lua0NvbmZpZ3VyYWJsZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbJm5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsncyBjb25maWd1cmFibGUgaXMgZGVhZC4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNpbmtOYW1lID0gbmFtZS5jX3N0cigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZS0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGJvb2wgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR3JhcGhpY0J1ZmZlclNvdXJjZSBpbml0IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGVyciA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBxdWVyeUZyb21TaW5rKHsgJmlucHV0U2l6ZSwgJnVzYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBpZiAoYzJTdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBjYW5ub3QgcXVlcnkgaW5mb3JtYXRpb24gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjb21wb25lbnQgaW50ZXJmYWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoYzJTdGF0dXMpIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHByb3BlciBjb2xvciBhc3BlY3QgJiBkYXRhc3BhY2UKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKworICAgICAgICAvLyBUT0RPOiB1c2UgdGhlIHVzYWdlIHJlYWQgZnJvbSBpbnRmCisgICAgICAgIC8vIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgIC8vICAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpLgorICAgICAgICAvLyAgICAgICAgIGFzR3JhbGxvY1VzYWdlKCk7CisKKyAgICAgICAgdWludDMyX3QgZ3JhbGxvY1VzYWdlID0KKyAgICAgICAgICAgICAgICBtU2lua05hbWUuY29tcGFyZSgwLCAxMSwgImMyLmFuZHJvaWQuIikgPT0gMCA/CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDoKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR0JTIGNvbmZpZ3VyZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBlcnIgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1Tb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQ6IGZhaWxlZCB0byBwb3B1bGF0ZSBHQlMgc2xvdHMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU291cmNlLT5zdGFydCgpLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdCUyBmYWlsZWQgdG8gc3RhcnQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6UExBVEZPUk1fU1RBUlQgKyAxLCAgLy8gR1JBTExPQworICAgICAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoYzJlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhjMmVycikgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW1wbDo6c3VibWl0QnVmZmVyIC0tIGJ1ZmZlcklkID0gIiA8PCBidWZmZXJJZCA8PCAiLiI7CisgICAgICAgIC8vIFRPRE86IFVzZSBmZCB0byBjb25zdHJ1Y3QgZmVuY2UKKyAgICAgICAgKHZvaWQpZmVuY2VGZDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIEMySGFuZGxlKiBoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwgYnVmZmVyLT51c2FnZSwgYnVmZmVyLT5zdHJpZGUpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmZldGNoX2FkZCgKKyAgICAgICAgICAgICAgICAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyKAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSwKKyAgICAgICAgICAgICAgICBbYnVmZmVySWQsIHNvdXJjZSA9IG1Tb3VyY2VdKEMyQnVmZmVyKiBwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpc291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgLTEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCBidWZmZXJJZCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkltcGw6OnN1Ym1pdEVvcyAtLSBidWZmZXJJZCA9ICIgPDwgYnVmZmVySWQgPDwgIi4iOworICAgICAgICAodm9pZClidWZmZXJJZDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5mZXRjaF9hZGQoCisgICAgICAgICAgICAgICAgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworICAgIC8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwuCisgICAgLy8KKyAgICAvLyBUaGlzIGNsYXNzIGlzIGRlY2xhcmVkIGFzIGFuIGlubmVyIGNsYXNzIHNvIHRoYXQgaXQgd2lsbCBoYXZlIGFjY2VzcyB0bworICAgIC8vIGFsbCBJbXBsJ3MgbWVtYmVycy4KKyAgICBzdHJ1Y3QgQ29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgICAgICBzcDxJbXBsPiBtQ29ubmVjdGlvbjsKKyAgICAgICAgQ29uZmlndXJhYmxlSW50Zihjb25zdCBzcDxJbXBsPiYgY29ubmVjdGlvbikKKyAgICAgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7ImlucHV0LXN1cmZhY2UtY29ubmVjdGlvbiIsIDB9LAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ue2Nvbm5lY3Rpb259IHt9CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBxdWVyeUZyb21TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgICAgIGlmIChtTG9jYWxDb21wKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBtTG9jYWxDb21wLT5pbnRmKCk7CisgICAgICAgICAgICBpZiAoaW50ZikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobVNpbmspIDw8ICItLSBxdWVyeUZyb21TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisgICAgICAgIENIRUNLKG1TaW5rQ29uZmlndXJhYmxlKSA8PCAiLS0gcXVlcnlGcm9tU2luayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gc2luayBoYXMgbm8gY29uZmlndXJhYmxlLiI7CisKKyAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgICAgICB9CisgICAgICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgICAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1TaW5rQ29uZmlndXJhYmxlLT5xdWVyeSgKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoc3RhdHVzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBlcnJvciB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaSA8IHN0YWNrUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIHNraXBwZWQgKGluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gdXBkYXRlIGZhaWxlZCAoaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBzdGFjayBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVldWVUb1Npbmsoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICAgICAgaWYgKG1Mb2NhbENvbXApIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYWxDb21wLT5xdWV1ZV9uYihpdGVtcyk7CisgICAgICAgIH0KKworICAgICAgICBDSEVDSyhtU2luaykgPDwgIi0tIHF1ZXVlVG9TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gYmFkIGlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVNpbmstPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb1NpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhc1N0cmluZyhzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Mb2NhbENvbXA7CisgICAgc3A8SUlucHV0U2luaz4gbVNpbms7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbVNpbmtDb25maWd1cmFibGU7CisgICAgc3RkOjpzdHJpbmcgbVNpbmtOYW1lOworCisgICAgLy8gTmVlZGVkIGZvciBDb21wb25lbnRXcmFwcGVyIGltcGxlbWVudGF0aW9uCisgICAgc3RkOjptdXRleCBtQWxsb2NhdG9yTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworCit9OworCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIGNvbXApfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIHNpbmspfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUltcGxNdXRleCk7CisgICAgbUltcGwgPSBudWxscHRyOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjp+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIHsKKyAgICBtSW1wbCA9IG51bGxwdHI7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW1wbE11dGV4KTsKKyAgICByZXR1cm4gbUltcGwtPmluaXQoKTsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClwYXJhbXM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClpbmRpY2VzOworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKXBhcmFtczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWZpZWxkczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM5NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIElDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBnZXRJbnRlcmZhY2UoKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgYSBDMkNvbXBvbmVudCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzaW5rIGlmIHRoZSBzaW5rIGlzIGluZGVlZAorICAgIC8vIGEgbG9jYWwgY29tcG9uZW50LiBSZXR1cm5zIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IElucHV0U3VyZmFjZTo6Y29ubmVjdCgpLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKKworcHJvdGVjdGVkOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdHJ1Y3QgU2luazsKKyAgICBzdGQ6Om11dGV4IG1TaW5rTXV0ZXg7CisgICAgc3A8U2luaz4gbVNpbms7CisKKyAgICBzdGQ6Om11dGV4IG1CbG9ja1Bvb2xzTXV0ZXg7CisgICAgLy8gVGhpcyBtYXAga2VlcHMgQzJCbG9ja1Bvb2wgb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUJsb2NrUG9vbCgpCisgICAgLy8gYWxpdmUuIFRoZXNlIEMyQmxvY2tQb29sIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQgYnkgY2FsbGluZworICAgIC8vIGRlc3Ryb3lCbG9ja1Bvb2woKSwgcmVzZXQoKSBvciByZWxlYXNlKCksIG9yIGJ5IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudC4KKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBJQ29tcG9uZW50SW50ZXJmYWNlIHsKKyAgICBDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICBDb21wb25lbnRTdG9yZSogc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIElDb21wb25lbnRTdG9yZSB7CisgICAgQ29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisgICAgdmlydHVhbCB+Q29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdCgpIHRvIHZhbGlkYXRlCisgICAgICogc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiBnZXRQb29sQ2xpZW50TWFuYWdlcigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRlYnVnKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICAvLyBEb2VzIGJvb2trZWVwaW5nIGZvciBhbiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnRTdG9yZSBrZWVwcyB0cmFjayBvZiBsaXZlIENvbXBvbmVudHMuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMkNvbXBvbmVudDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBiaXJ0aFRpbWU7CisgICAgfTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ29tcG9uZW50Um9zdGVyTXV0ZXg7CisgICAgc3RkOjptYXA8Q29tcG9uZW50KiwgQ29tcG9uZW50U3RhdHVzPiBtQ29tcG9uZW50Um9zdGVyOworCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIENvbXBvbmVudCBpcyBjcmVhdGVkLgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworICAgIC8vIENhbGxlZCBvbmx5IGZyb20gdGhlIGRlc3RydWN0b3Igb2YgQ29tcG9uZW50LgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworCisgICAgZnJpZW5kIENvbXBvbmVudDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGR1bXBpbmcuCisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCk7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cyk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTE4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCisvKioKKyAqIENvZGVjMiBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcXVlcnlpbmcgYW5kIGNvbmZpZ3VyaW5nCisgKiBmdW5jdGlvbnMsIGJ1dCBhY3Jvc3MgdGhlIFRyZWJsZSBib3VuZGFyeSwgdGhleSBzaGFyZSB0aGUgc2FtZSBISURMCisgKiBpbnRlcmZhY2UsIElDb25maWd1cmFibGUuCisgKgorICogQ29uZmlndXJhYmxlQzJJbnRmIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgYSBDb2RlYzIgb2JqZWN0IGNhbiBpbXBsZW1lbnQgdG8KKyAqIGVhc2lseSBleHBvc2UgYW4gSUNvbmZpZ3VyYWJsZSBpbnN0YW5jZS4gU2VlIENhY2hlZENvbmZpZ3VyYWJsZSBiZWxvdy4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdWludDMyX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5X3ZiIHNhbnMgc3RhY2sgcGFyYW1zICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OmNvbmZpZ192YiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5Db25maWd1cmFibGVDMkludGYoKSA9IGRlZmF1bHQ7CisKKyAgICBDb25maWd1cmFibGVDMkludGYoY29uc3QgQzJTdHJpbmcmIG5hbWUsIHVpbnQzMl90IGlkKQorICAgICAgICAgIDogbU5hbWV7bmFtZX0sIG1JZHtpZH0ge30KKworcHJvdGVjdGVkOgorICAgIEMyU3RyaW5nIG1OYW1lOyAvKiBjYWNoZWQgY29tcG9uZW50IG5hbWUgKi8KKyAgICB1aW50MzJfdCBtSWQ7Cit9OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJQ29uZmlndXJhYmxlIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcgb2YKKyAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gYSBzdXBwbGllZCBDb21wb25lbnRTdG9yZS4KKyAqCisgKiBDYWNoZWRDb25maWd1cmFibGUgZXNzZW50aWFsbHkgY29udmVydHMgYSBDb25maWd1cmFibGVDMkludGYgaW50byBISURMJ3MKKyAqIElDb25maWd1cmFibGUuIEEgQ29kZWMyIG9iamVjdCBnZW5lcmFsbHkgaW1wbGVtZW50cyBDb25maWd1cmFibGVDMkludGYgYW5kCisgKiBwYXNzZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBDYWNoZWRDb25maWd1cmFibGUuCisgKgorICogTm90ZSB0aGF0IGNhY2hpbmcgaGFwcGVucworICovCitzdHJ1Y3QgQ2FjaGVkQ29uZmlndXJhYmxlIDogcHVibGljIElDb25maWd1cmFibGUgeworICAgIENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiYmIGludGYpOworCisgICAgYzJfc3RhdHVzX3QgaW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbmZpZ3VyYWJsZQorCisgICAgdmlydHVhbCBSZXR1cm48dWludDMyX3Q+IGdldElkKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NTdkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLyoqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIKKyAqID09PT09PT09PT09PT09PT09PQorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBwcmVzZW50cyBhIHdheSB0byB0cmFjayBhbmQgdW50cmFjayBpbnB1dCBidWZmZXJzIGluIHRoaXMKKyAqIChjb2RlYykgcHJvY2VzcyBhbmQgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhIGxpc3RlbmVyLCBwb3NzaWJseSBpbiBhCisgKiBkaWZmZXJlbnQgcHJvY2Vzcywgd2hlbiBhIHRyYWNrZWQgYnVmZmVyIG5vIGxvbmdlciBoYXMgYW55IHJlZmVyZW5jZXMgaW4gdGhpcworICogcHJvY2Vzcy4KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIHJlY29yZHMgcmVwcmVzZW50aW5nIHRyYWNrZWQgYnVmZmVycworICogYW5kIHRoZWlyIGNhbGxiYWNrIGxpc3RlbmVycy4gQ29uY2VwdHVhbGx5LCBvbmUgcmVjb3JkIGlzIGEgdHJpcGxlIChsaXN0ZW5lciwKKyAqIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZQorICoKKyAqIC0gKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBpcyBhIHBhaXIgb2YgaW5kaWNlcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBidWZmZXIuCisgKiAtIGxpc3RlbmVyIGlzIG9mIHR5cGUgSUNvbXBvbmVudExpc3RlbmVyLiBJdHMgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpCisgKiAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBkaWVzLiBUaGUgYXJndW1lbnQgb2YKKyAqICAgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGEgbGlzdCBvZiBJbnB1dEJ1ZmZlciBvYmplY3RzLCBlYWNoIG9mIHdoaWNoCisgKiAgIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisgKgorICogICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgKKyAqICAgICB1aW50MzJfdCBhcnJheUluZGV4CisgKgorICogV2hlbiBhIHRyYWNrZWQgYnVmZmVyIGFzc29jaWF0ZWQgdG8gdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsCisgKiBidWZmZXJJbmRleCkgZ29lcyBvdXQgb2Ygc2NvcGUsIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgd2lsbCBiZQorICogY2FsbGVkIHdpdGggYW4gSW5wdXRCdWZmZXIgb2JqZWN0IHdob3NlIG1lbWJlcnMgYXJlIHNldCBhcyBmb2xsb3dzOgorICoKKyAqICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleAorICogICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleAorICoKKyAqIElQQyBPcHRpbWl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTaW5jZSBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgaXMgYW4gSVBDIGNhbGwsIElucHV0QnVmZmVyTWFuYWdlciB0cmllcyBub3QKKyAqIHRvIGNhbGwgaXQgdG9vIG9mdGVuLiBBbnkgdHdvIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdAorICogbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgYXBhcnQsIHdoZXJlIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzCisgKiBjb25maWd1cmFibGUgdmlhIGNhbGxpbmcgc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwoKS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzIGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJuYWxOcy4KKyAqCisgKiBQdWJsaWMgTWVtYmVyIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaXMgYSBzaW5nbGV0b24gY2xhc3MuIEl0cyBvbmx5IGluc3RhbmNlIGlzIGFjY2Vzc2libGUgdmlhCisgKiB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6CisgKgorICogLSByZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpCisgKgorICogLSB1bnJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICoKKyAqIC0gc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKQorICoKKyAqLworCitzdHJ1Y3QgSW5wdXRCdWZmZXJNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIDIgc3Vic2VxdWVudCBJUENzLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMgPSAxMDAwMDAwOyAvKiAxbXMgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrIGFsbCBidWZmZXJzIGluIGEgQzJGcmFtZURhdGEgb2JqZWN0LgorICAgICAqCisgICAgICogaW5wdXQgKEMyRnJhbWVEYXRhKSBoYXMgdGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyB0aGF0IGFyZSBvZiBpbnRlcmVzdDoKKyAgICAgKgorICAgICAqICAgQzJXb3JrT3JkaW5hbCAgICAgICAgICAgICAgICBvcmRpbmFsCisgICAgICogICB2ZWN0b3I8c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnMKKyAgICAgKgorICAgICAqIENhbGxpbmcgcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlCisgICAgICogdHJpcGxlcyAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZSBmcmFtZUluZGV4IGlzIGVxdWFsIHRvCisgICAgICogaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IGFuZCBidWZmZXJJbmRleCBydW5zIHRocm91Z2ggdGhlIGluZGljZXMgb2YKKyAgICAgKiBpbnB1dC5idWZmZXJzIHN1Y2ggdGhhdCBpbnB1dC5idWZmZXJzW2J1ZmZlckluZGV4XSBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgb2YgZGVhdGggbm90aWZpY2F0aW9ucy4KKyAgICAgKiBccGFyYW0gaW5wdXQgSW5wdXQgZnJhbWUgZGF0YSB3aG9zZSBpbnB1dCBidWZmZXJzIGFyZSB0byBiZSB0cmFja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVW50cmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgICogcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZmksIGJ1ZmZlckluZGV4KSBzdWNoIHRoYXQKKyAgICAgKiBsID0gbGlzdGVuZXIgYW5kIGZpID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKiBccGFyYW0gaW5wdXQgUHJldmlvdXNseSByZWdpc3RlcmVkIGZyYW1lIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxpc3RlbmVyLgorICAgICAqCisgICAgICogQ2FsbGluZyB1bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBzdWNoCisgICAgICogdGhhdCBsID0gbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywKKyAgICAgKiBpLmUuLCB3aGVuIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgUHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBub3RpZmljYXRpb25JbnRlcnZhbE5zIE5ldyBub3RpZmljYXRpb24gaW50ZXJ2YWwsIGluIG5hbm9zZWNvbmRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKyAgICB2b2lkIF91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHZvaWQgX3NldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGllZCB0byBDMkJ1ZmZlciBvYmplY3RzLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgc0luc3RhbmNlIGlzIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMKKyAgICAvLyAgICAgICBjbGFzcy4KKyAgICBzdGF0aWMgdm9pZCBvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworICAgIHZvaWQgX29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+PiBUcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIFN0b3JhZ2UgZm9yIHBlbmRpbmcgKHVuc2VudCkgZGVhdGggbm90aWZpY2F0aW9ucyBmb3Igb25lIGxpc3RlbmVyLgorICAgIC8vIEVhY2ggcGFpciBpbiBtZW1iZXIgbmFtZWQgImluZGljZXMiIGFyZSAoZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIGZyb20KKyAgICAvLyB0aGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgdHJpcGxlLgorICAgIHN0cnVjdCBEZWF0aE5vdGlmaWNhdGlvbnMgeworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcGVuZGluZyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICAvLyBjb3VudCBtYXkgYmUgMCwgaW4gd2hpY2ggY2FzZSB0aGUgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB3aWxsCisgICAgICAgIC8vIHJlbWFpbiB2YWxpZCBmb3Igb25seSBhIHNtYWxsIHBlcmlvZCAoc3BlY2lmaWVkCisgICAgICAgIC8vIG5hbm9zZWNvbmRzKS4KKyAgICAgICAgc2l6ZV90IGNvdW50OworCisgICAgICAgIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IGNhbGxiYWNrIG9uIHRoaXMgbGlzdGVuZXIuIFRoaXMgaXMKKyAgICAgICAgLy8gdXNlZCB0byBndWFyYW50ZWUgdGhhdCBjYWxsYmFja3MgZG8gbm90IG9jY3VyIHRvbyBmcmVxdWVudGx5LCBhbmQKKyAgICAgICAgLy8gYWxzbyB0byB0cmlnZ2VyIGV4cGlyYXRpb24gb2YgYSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IHRoYXQgaGFzCisgICAgICAgIC8vIGNvdW50ID0gMC4KKyAgICAgICAgbnNlY3NfdCBsYXN0U2VudE5zOworCisgICAgICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29sbGVjdGlvbiBvZiAoZnJhbWRlSW5kZXgsIGJ1ZmZlckluZGV4KS4KKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+IGluZGljZXM7CisKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyA9IGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAgICAgICAgICAgICAgOiBjb3VudCgwKSwKKyAgICAgICAgICAgICAgICBsYXN0U2VudE5zKHN5c3RlbVRpbWUoKSAtIG5vdGlmaWNhdGlvbkludGVydmFsTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBUaGUgbWluaW11bSB0aW1lIHBlcmlvZCBiZXR3ZWVuIElQQyBjYWxscyB0byBub3RpZnkgdGhlIGNsaWVudCBhYm91dCB0aGUKKyAgICAvLyBkZXN0cnVjdGlvbiBvZiBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6YXRvbWljPG5zZWNzX3Q+IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5ze2tEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOc307CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgorICAgIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sIERlYXRoTm90aWZpY2F0aW9ucz4gbURlYXRoTm90aWZpY2F0aW9uczsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBzaWduYWxlZCB3aGVuIGFuIGVudHJ5IGlzIGFkZGVkIHRvIG1EZWF0aE5vdGlmaWNhdGlvbnMuCisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbU9uQnVmZmVyRGVzdHJveWVkOworCisgICAgLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorICAgIC8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIGR1cmF0aW9uIHRvIHdhaXQgZm9yIGJlZm9yZQorICAgIC8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCisgICAgYm9vbCBwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKTsKKworICAgIC8vIE1haW4gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dCBidWZmZXIgbWFuYWdlciB0aHJlYWQuCisgICAgdm9pZCBtYWluKCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIHRoYXQgbWFuYWdlcyBub3RpZmljYXRpb25zLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBsYXN0IHNvIGl0cyBpbml0aWFsaXphdGlvbiB3aWxsIGhhcHBlbgorICAgIC8vIGFmdGVyIGFsbCBvdGhlciBtZW1iZXIgdmFyaWFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGQ6OnRocmVhZCBtTWFpblRocmVhZDsKKworICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyKCk7CisKKyAgICAvLyBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXImIGdldEluc3RhbmNlKCk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjgyYzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSBHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGNsYXNzIEludGVyZmFjZTsKKyAgICBjbGFzcyBDb25maWd1cmFibGVJbnRmOworCisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK307CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThiNmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworLy8gQW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBjb25uZWN0cyBhbiBJbnB1dFN1cmZhY2UgdG8gYSBzaW5rLCB3aGljaCBtYXkgYmUgYW4KKy8vIElJbnB1dFNpbmsgb3IgYSBsb2NhbCBDMkNvbXBvbmVudC4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGNob29zaW5nIHRoZQorLy8gY29ycmVzcG9uZGluZyBjb25zdHJ1Y3Rvci4gVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgdHdvIGNhc2VzIGlzCisvLyB0aGF0IHdoZW4gYW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZQorLy8gY29tcG9uZW50IHRoYXQgcHJvY2Vzc2VzIHRoZSBidWZmZXJzLCBkYXRhIHBhcmNlbGluZyBpcyBub3QgbmVlZGVkLgorc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgYm9vbCBpbml0KCk7CisKKyAgICBmcmllbmQgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKworICAgIHN0ZDo6bXV0ZXggbUltcGxNdXRleDsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENvbm5lY3Rpb25JZDsKK3VzaW5nIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVHlwZXMgb2YgbWV0YWRhdGEgZm9yIEJsb2Nrcy4KK3N0cnVjdCBDMkhpZGxfUmFuZ2UgeworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBsZW5ndGg7IC8vIERvIG5vdCB1c2UgInNpemUiIGJlY2F1c2UgdGhlIG5hbWUgY29sbGlkZXMgd2l0aCBDMkluZm86OnNpemUoKS4KK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmFuZ2UsIDA+IEMySGlkbF9SYW5nZUluZm87CisKK3N0cnVjdCBDMkhpZGxfUmVjdCB7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworfTsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySGlkbF9SZWN0LCAxPiBDMkhpZGxfUmVjdEluZm87CisKKy8vIE1ha2UgYXNTdHJpbmcoKSBhbmQgb3BlcmF0b3I8PCB3b3JrIHdpdGggU3RhdHVzIGFzIHdlbGwgYXMgYzJfc3RhdHVzX3QuCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoU3RhdHVzKTsKKworLyoqCisgKiBBbGwgb2JqY3B5KCkgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiBjb252ZXJzaW9uIHN1Y2NlZWRzIG9yIG5vdC4KKyAqLworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIFNldHRpbmdSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFBhcmFtRGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzJiBzKTsKKworLy8gQ29tcG9uZW50VHJhaXRzIC0+IEMyQ29tcG9uZW50OjpUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcyk7CisKKy8vIEMyU3RydWN0RGVzY3JpcHRvciAtPiBTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiogZCwKKyAgICAgICAgY29uc3QgU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIEFic3RyYWN0IGNsYXNzIHRvIGJlIHVzZWQgaW4KKy8vIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorc3RydWN0IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgUmVzdWx0U3RhdHVzIFJlc3VsdFN0YXR1czsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjoKKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhIEJ1ZmZlclBvb2xEYXRhOworCisgICAgLyoqCisgICAgICogU2VuZCBicERhdGEgYW5kIHJldHVybiBCdWZmZXJTdGF0dXNNZXNzYWdlIHRoYXQgY2FuIGJlIHN1cHBsaWVkIHRvCisgICAgICogSUNsaWVudE1hbmFnZXI6OnJlY2VpdmUoKSBpbiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbgorICAgICAqIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBicERhdGEgQnVmZmVyUG9vbERhdGEgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqIFxwYXJhbVtvdXRdIGJwTWVzc2FnZSBCdWZmZXJTdGF0dXNNZXNzYWdlIG9mIHRoZSB0cmFuc2FjdGlvbi4gSW5mb3JtYXRpb24KKyAgICAgKiAgICBpbnNpZGUgXHAgYnBNZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBwcm9jZXNzIGJ5IHNvbWUKKyAgICAgKiAgICBvdGhlciBtZWFucyBzbyBpdCBjYW4gY2FsbCByZWNlaXZlKCkgcHJvcGVybHkuCisgICAgICogXHJldHVybiBSZXN1bHRTdGF0dXMgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgKFNlZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIFJlc3VsdFN0YXR1cyBpbgorICAgICAqICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaGFsLikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBzZW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sU2VuZGVyKCkgPSBkZWZhdWx0OworfTsKKworLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJQb29sU2VuZGVyLgorLy8KKy8vIFRvIHVzZSBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciwgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcKKy8vIHByb2Nlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIHNlbmQoKSBjYW4gb3BlcmF0ZS4gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgd2lsbAorLy8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIGFuZCB1c2UgaXQgdG8gY2FsbAorLy8gSUNsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKCkgdG8gZXN0YWJsaXNoIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24gd2hlbgorLy8gc2VuZCgpIGlzIGNhbGxlZC4KK3N0cnVjdCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciA6IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXIgQ2xpZW50TWFuYWdlcjsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyIElDbGllbnRNYW5hZ2VyOworCisgICAgLy8gU2V0IHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYW5kIHRoZSByZWZyZXNoCisgICAgLy8gaW50ZXJ2YWwgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyA0LjUgc2Vjb25kcywgd2hpY2gKKyAgICAvLyBpcyBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBidWZmZXJwb29sIHdpbGwga2VlcCBhbgorICAgIC8vIGluYWN0aXZlIGNvbm5lY3Rpb24gZm9yLgorICAgIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIgPSBudWxscHRyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICB2b2lkIHNldFJlY2VpdmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwgPSA0NTAwbXMpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgpLiBzZW5kKCkgd2lsbCBlc3RhYmxpc2ggYQorICAgIC8vIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBpZiBuZWVkZWQsIHRoZW4gc2VuZCB0aGUgYnVmZmVycG9vbCBkYXRhIG92ZXIgdG8KKyAgICAvLyB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8Q2xpZW50TWFuYWdlcj4gbVNlbmRlck1hbmFnZXI7CisgICAgc3A8SUNsaWVudE1hbmFnZXI+IG1SZWNlaXZlck1hbmFnZXI7CisgICAgaW50NjRfdCBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtU291cmNlQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbUxhc3RTZW50OworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIG1SZWZyZXNoSW50ZXJ2YWw7Cit9OworCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKKy8vIE5vdGU6IElmIGJ1ZmZlcnBvb2wgd2lsbCBiZSB1c2VkLCBicFNlbmRlciBtdXN0IG5vdCBiZSBudWxsLgorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsCisgICAgICAgIGNvbnN0IFdvcmtCdW5kbGUmIHMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCByZXR1cm5zIEMyUGFyYW0gcG9pbnRlcnMgdG8gaXRzIHBhcmFtcy4gVGhlIHBvaW50ZXJzCisgKiBwb2ludCB0byBsb2NhdGlvbnMgaW5zaWRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBvZiBccCBibG9iLiBJZiBccCBibG9iIGlzCisgKiBkZXN0cm95ZWQsIHRoZSBwb2ludGVycyBiZWNvbWUgaW52YWxpZC4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgZmFsc2UgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsICh0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGUKKyAqICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBjb25zdCkKKyAqLworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIHBhcmFtcyB0aGUgcmVzdWx0aW5nIHZlY3RvcgorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYik7Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBhcHBsaWVzIHVwZGF0ZXMgdG8gcGFyYW1zLgorICoKKyAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBwYXJhbXMgdG8gYmUgdXBkYXRlZAorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIGNvbnRhaW5pbmcgdXBkYXRlcworICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIEJ1ZmZlclBvb2wgc3RhdHVzIHZhbHVlIHRvIGMyX3N0YXR1c190LgorICogXHBhcmFtIEJ1ZmZlclBvb2wgc3RhdHVzCisgKiBccmV0dXJuIENvcnJlc3BvbmRpbmcgYzJfc3RhdHVzX3QKKyAqLworYzJfc3RhdHVzX3QgdG9DMlN0YXR1cyg6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIFJlc3VsdFN0YXR1cyBycyk7CisKKy8vIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrIE9wZXJhdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2sgYW5kIGF0dGFjaCBpdCB0byBhbgorLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4KK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBSZXR1cm4gZmFsc2UgaWYgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorLy8gT3RoZXJ3aXNlLCBleHRyYWN0IGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdCBhbmQgcmV0dXJuIHRydWUuCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBEaXNhc3NvY2lhdGUgdGhlIGdpdmVuIGJsb2NrIHdpdGggaXRzIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUgc28gdGhhdAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4gSWYgdGhlIGJsb2NrCisvLyBkb2VzIG5vdCBoYXZlIGEgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisvLyBPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYXR0YWNoQnVmZmVyKCkgb3IgcXVldWVCdWZmZXIoKSBpcworLy8gY2FsbGVkIG1hbnVhbGx5LgorYm9vbCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOworCisvLyBDYWxsIHlpZWxkQnVmZmVyUXVldWVCbG9jaygpIG9uIGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuIHByb2Nlc3NJbnB1dAorLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0IGJsb2NrcyBhcmUgeWllbGRlZC4gcHJvY2Vzc091dHB1dCB3b3JrcyBzaW1pbGFybHkgb24KKy8vIG91dHB1dCBibG9ja3MuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzSW5wdXQgaXMgZmFsc2Ugd2hpbGUgdGhlIGRlZmF1bHQKKy8vIHZhbHVlIG9mIHByb2Nlc3NPdXRwdXQgaXMgdHJ1ZS4gVGhpcyBpbXBsaWVzIHRoYXQgaW4gbW9zdCBjYXNlcywgb25seSBvdXRwdXQKKy8vIGJ1ZmZlcnMgY29udGFpbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MuKQorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorLy8gc2VudCBvdmVyIHRoZSBUcmVibGUgYm91bmRhcnkgdG8gYW5vdGhlciBwcm9jZXNzLgordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzT3V0cHV0ID0gdHJ1ZSk7CisKKy8vIEFzc2lnbiB0aGUgZ2l2ZW4gYmxvY2sgdG8gYSBidWZmZXJxdWV1ZSBzbyB0aGF0IHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZCwKKy8vIGNhbmNlbEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLgorLy8KKy8vIElmIHRoZSBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIHRoaXMgZnVuY3Rpb24KKy8vIHJldHVybnMgZmFsc2UuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG9uZSwKKy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZQorLy8gZ2l2ZW4gb25lLCB0aGUgYmxvY2sgd2lsbCBiZSByZWFzc2lnbmVkIHRvIHRoZSBnaXZlbiBidWZmZXJxdWV1ZS4gVGhpcworLy8gd2lsbCBjYWxsIGF0dGFjaEJ1ZmZlcigpIG9uIHRoZSBnaXZlbiBpZ2JwLiBUaGUgZnVuY3Rpb24gdGhlbiByZXR1cm5zIHRydWUgb24KKy8vIHN1Y2Nlc3Mgb3IgZmFsc2Ugb24gYW55IGZhaWx1cmUgZHVyaW5nIHRoZSBvcGVyYXRpb24uCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGRldGFjaEJ1ZmZlcigpIG9yIGRlcXVldWVCdWZmZXIoKQorLy8gaXMgY2FsbGVkIG1hbnVhbGx5LgorYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pOworCisvLyBDYWxsIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gaW5wdXQgb3Igb3V0cHV0IGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisvLyBTaW5jZSB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGNhbiBiZQorLy8gZGlmZmVyZW50LCB0aGlzIGZ1bmN0aW9uIHRha2VzIGZvcklucHV0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbgorLy8gYnVmZmVycXVldWUgaXMgZm9yIGlucHV0IGJ1ZmZlcnMgb3Igb3V0cHV0IGJ1ZmZlcnMuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZgorLy8gZm9ySW5wdXQgaXMgZmFsc2UuKQorLy8KKy8vIEluIHRoZSAocmFyZSkgY2FzZSB0aGF0IGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBidWZmZXJxdWV1ZS1iYXNlZCwKKy8vIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIHRoZSBpbnB1dCBidWZmZXJzIGFuZCBvbmNlIGZvcgorLy8gdGhlIG91dHB1dCBidWZmZXJzLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20KKy8vIGFub3RoZXIgcHJvY2Vzcy4KK3ZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9ySW5wdXQgPSBmYWxzZSk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNiY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMCwwICsxLDE5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpCdWZmZXJTdGF0dXNNZXNzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENsaWVudE1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBUcmFuc2FjdGlvbklkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworY29uc3QgY2hhciogYXNTdHJpbmcoU3RhdHVzIHN0YXR1cywgY29uc3QgY2hhciogZGVmKSB7CisgICAgcmV0dXJuIGFzU3RyaW5nKHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0dXMpLCBkZWYpOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtQ2xhc3M+Cit0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlIHVuZGVybHlpbmdfdmFsdWUoCisgICAgICAgIEVudW1DbGFzcyB4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEVudW1DbGFzcz46OnR5cGU+KHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tbW9uLCB0eXBlbmFtZSBEc3RWZWN0b3IsIHR5cGVuYW1lIFNyY1ZlY3Rvcj4KK3ZvaWQgY29weVZlY3RvcihEc3RWZWN0b3IqIGQsIGNvbnN0IFNyY1ZlY3RvciYgcykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKCgqZClbMF0pKSwKKyAgICAgICAgICAgICJEc3RWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZShzWzBdKSksCisgICAgICAgICAgICAiU3JjVmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgZC0+cmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0gKyBzLnNpemUoKSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENvbW1vbio+KCYoKmQpWzBdKSk7Cit9CisKKy8vIEMyUGFyYW1GaWVsZCAtPiBQYXJhbUZpZWxkCitib29sIG9iamNweShQYXJhbUZpZWxkICpkLCBjb25zdCBDMlBhcmFtRmllbGQgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChzKSk7CisgICAgZC0+ZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzKSk7CisgICAgZC0+ZmllbGRJZC5zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IEMyUGFyYW1GaWVsZEJ1aWxkZXIgOiBwdWJsaWMgQzJQYXJhbUZpZWxkIHsKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKCkgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDApKSwgMCwgMCkgeworICAgIH0KKyAgICAvLyBQYXJhbUZpZWxkIC0+IEMyUGFyYW1GaWVsZAorICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoY29uc3QgUGFyYW1GaWVsZCYgcykgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQub2Zmc2V0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQuc2l6ZSkpIHsKKyAgICB9Cit9OworCisvLyBDMldvcmtPcmRpbmFsU3RydWN0IC0+IFdvcmtPcmRpbmFsCitib29sIG9iamNweShXb3JrT3JkaW5hbCAqZCwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGQtPnRpbWVzdGFtcFVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMudGltZXN0YW1wLnBlZWt1KCkpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5jdXN0b21PcmRpbmFsLnBlZWt1KCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBXb3JrT3JkaW5hbCAtPiBDMldvcmtPcmRpbmFsU3RydWN0Citib29sIG9iamNweShDMldvcmtPcmRpbmFsU3RydWN0ICpkLCBjb25zdCBXb3JrT3JkaW5hbCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBjMl9jbnRyNjRfdChzLmZyYW1lSW5kZXgpOworICAgIGQtPnRpbWVzdGFtcCA9IGMyX2NudHI2NF90KHMudGltZXN0YW1wVXMpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBjMl9jbnRyNjRfdChzLmN1c3RvbU9yZGluYWwpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSdzIHR5cGUgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlCitib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlKiBkLAorICAgICAgICBjb25zdCBkZWNsdHlwZShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSkmIHMpIHsKKyAgICBkLT5taW4gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5taW4udTY0KTsKKyAgICBkLT5tYXggPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5tYXgudTY0KTsKKyAgICBkLT5zdGVwID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuc3RlcC51NjQpOworICAgIGQtPm51bSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm51bS51NjQpOworICAgIGQtPmRlbm9tID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuZGVub20udTY0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkZMQUdTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU+KHMudHlwZSk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlCitib29sIG9iamNweSgKKyAgICAgICAgZGVjbHR5cGUoQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UpKiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UmIHMpIHsKKyAgICBkLT5taW4udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWluKTsKKyAgICBkLT5tYXgudTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWF4KTsKKyAgICBkLT5zdGVwLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLnN0ZXApOworICAgIGQtPm51bS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5udW0pOworICAgIGQtPmRlbm9tLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmRlbm9tKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXMgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZCwgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkVNUFRZOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90PihzLnR5cGUpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnJhbmdlLCBzLnJhbmdlKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvcHlWZWN0b3I8dWludDY0X3Q+KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBpZiAoIW9iamNweSgmZC0+ZmllbGQsIHMuZmllbGQoKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3dpdGNoIChzLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OkNVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZT4ocy50eXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGRUeXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3Q+KHMudHlwZSk7CisgICAgfQorICAgICpkID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5maWVsZCksIGRUeXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPgorLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpIHsKKyAgICBpZiAoIW9iamNweShkLCBzcSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNyLnN0YXR1cyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPnZhbHVlcywgc3IudmFsdWVzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ6OnZhbHVlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMgKmQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMgJnMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lOworCisgICAgc3dpdGNoIChzLmRvbWFpbikgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6VklERU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6QVVESU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6SU1BR0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6T1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkNvbXBvbmVudDo6ZG9tYWluX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbj4oCisgICAgICAgICAgICAgICAgcy5kb21haW4pOworICAgIH0KKworICAgIHN3aXRjaCAocy5raW5kKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJDb21wb25lbnQ6OmtpbmRfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5raW5kKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kPigKKyAgICAgICAgICAgICAgICBzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5yYW5rKTsKKworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlOworCisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaXggPSBzLmFsaWFzZXMuc2l6ZSgpOyBpeCA+IDA7ICkgeworICAgICAgICAtLWl4OworICAgICAgICBkLT5hbGlhc2VzW2l4XSA9IHMuYWxpYXNlc1tpeF07CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcykgeworICAgIGQtPm5hbWUgPSBzLm5hbWUuY19zdHIoKTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OklNQUdFOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46Ok9USEVSOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQ29tcG9uZW50VHJhaXRzOjpEb21haW4gIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbik7CisgICAgfQorCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpERUNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6RU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDb21wb25lbnRUcmFpdHM6OktpbmQgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMua2luZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmtpbmQgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6a2luZF90PihzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6cmFua190PihzLnJhbmspOworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlLmNfc3RyKCk7CisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmFsaWFzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZC0+YWxpYXNlc1tpXSA9IHMuYWxpYXNlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQzJQYXJhbUZpZWxkVmFsdWVzIC0+IFBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGlmICghb2JqY3B5KCZkLT5wYXJhbU9yRmllbGQsIHMucGFyYW1PckZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyUGFyYW1GaWVsZFZhbHVlczo6cGFyYW1PckZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT52YWx1ZXNbMF0sICpzLnZhbHVlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJQYXJhbUZpZWxkVmFsdWVzOjp2YWx1ZXMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyUGFyYW1GaWVsZFZhbHVlcyAqZCwgY29uc3QgUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGQtPnBhcmFtT3JGaWVsZCA9IEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5wYXJhbU9yRmllbGQpOworICAgIGlmIChzLnZhbHVlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBkLT52YWx1ZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCk7CisgICAgICAgIGlmICghb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6OnZhbHVlcy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgICJUd28gb3IgbW9yZSBGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3RzIGV4aXN0IGluICIKKyAgICAgICAgICAgICAgICAgICJQYXJhbUZpZWxkVmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAiT25seSB6ZXJvIG9yIG9uZSBpcyBhbGxvd2VkLiI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyU2V0dGluZ1Jlc3VsdCAtPiBTZXR0aW5nUmVzdWx0Citib29sIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19DT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5mYWlsdXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZmFpbHVyZSA9IHN0YXRpY19jYXN0PFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZSk7CisgICAgfQorICAgIGlmICghb2JqY3B5KCZkLT5maWVsZCwgcy5maWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KCZkQ29uZmxpY3QsIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJTZXR0aW5nUmVzdWx0Ojpjb25mbGljdHNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1lbW9yeSBmb3IgQzJTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmYWlsdXJlCisgICAgc3dpdGNoIChzLmZhaWx1cmUpIHsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX0lOREVYOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6UkVBRF9PTkxZOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9WQUxVRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAoKmQpLT5mYWlsdXJlID0gc3RhdGljX2Nhc3Q8QzJTZXR0aW5nUmVzdWx0OjpGYWlsdXJlPihzLmZhaWx1cmUpOworICAgIH0KKworICAgIC8vIGZpZWxkCisgICAgaWYgKCFvYmpjcHkoJigqZCktPmZpZWxkLCBzLmZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJigqZCktPmNvbmZsaWN0cy5iYWNrKCksIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2V0dGluZ1Jlc3VsdDo6Y29uZmxpY3RzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoUGFyYW1EZXNjcmlwdG9yICpkLCBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4ocy5pbmRleCgpKTsKKyAgICBkLT5hdHRyaWIgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPFBhcmFtRGVzY3JpcHRvcjo6QXR0cmliPj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0QXR0cmliKHMpKTsKKyAgICBkLT5uYW1lID0gcy5uYW1lKCk7CisgICAgY29weVZlY3Rvcjx1aW50MzJfdD4oJmQtPmRlcGVuZGVuY2llcywgcy5kZXBlbmRlbmNpZXMoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBDMlBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAqZCwgY29uc3QgUGFyYW1EZXNjcmlwdG9yICZzKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGREZXBlbmRlbmNpZXM7CisgICAgZERlcGVuZGVuY2llcy5yZXNlcnZlKHMuZGVwZW5kZW5jaWVzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBQYXJhbUluZGV4JiBzRGVwZW5kZW5jeSA6IHMuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGREZXBlbmRlbmNpZXMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHVpbnQzMl90PihzRGVwZW5kZW5jeSkpOworICAgIH0KKyAgICAqZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdD4ocy5hdHRyaWIpLAorICAgICAgICAgICAgQzJTdHJpbmcocy5uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgc3RkOjptb3ZlKGREZXBlbmRlbmNpZXMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KFN0cnVjdERlc2NyaXB0b3IgKmQsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIGQtPnR5cGUgPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBkLT5maWVsZHMucmVzaXplKHMubnVtRmllbGRzKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNGaWVsZCA6IHMpIHsKKyAgICAgICAgRmllbGREZXNjcmlwdG9yJiBkRmllbGQgPSBkLT5maWVsZHNbaSsrXTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC50eXBlID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+PigKKyAgICAgICAgICAgICAgICBzRmllbGQudHlwZSgpKTsKKyAgICAgICAgZEZpZWxkLmV4dGVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzRmllbGQuZXh0ZW50KCkpOworICAgICAgICBkRmllbGQubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzRmllbGQubmFtZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byYgc05hbWVkVmFsdWVzID0gc0ZpZWxkLm5hbWVkVmFsdWVzKCk7CisgICAgICAgIGRGaWVsZC5uYW1lZFZhbHVlcy5yZXNpemUoc05hbWVkVmFsdWVzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNOYW1lZFZhbHVlcykgeworICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlJiBkTmFtZWRWYWx1ZSA9IGRGaWVsZC5uYW1lZFZhbHVlc1tqKytdOworICAgICAgICAgICAgZE5hbWVkVmFsdWUubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzTmFtZWRWYWx1ZS5maXJzdCk7CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS52YWx1ZSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPigKKyAgICAgICAgICAgICAgICAgICAgc05hbWVkVmFsdWUuc2Vjb25kLnU2NCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5leHRlbnQsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEZpbmQgb3IgYWRkIGEgaGlkbCBCYXNlQmxvY2sgb2JqZWN0IGZyb20gYSBnaXZlbiBDMkhhbmRsZSogdG8gYSBsaXN0IGFuZCBhbgorLy8gYXNzb2NpYXRlZCBtYXAuCisvLyBOb3RlOiBUaGUgaGFuZGxlIGlzIG5vdCBjbG9uZWQuCitib29sIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJhZGRCYXNlQmxvY2sgY2FsbGVkIG9uIGEgbnVsbCBDMkhhbmRsZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGhhbmRsZSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2soCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKTsKKworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorYm9vbCBfYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnBEYXRhLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghYnBEYXRhKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoYnBEYXRhLmdldCgpKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoYnBEYXRhLmdldCgpLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcG9vbGVkQmxvY2s7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBidWZmZXJQb29sU2VuZGVyLT5zZW5kKAorICAgICAgICAgICAgICAgICAgICBicERhdGEsCisgICAgICAgICAgICAgICAgICAgICZwb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgYnVmZmVyIHdpdGggQnVmZmVyUG9vbC4gRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRCYXNlQmxvY2sucG9vbGVkQmxvY2socG9vbGVkQmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyUG9vbERhdGEgdW5hdmFpbGFibGUgaW4gYSBibG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgfQorICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRToKKyAgICAgICAgLy8gRG8gdGhlIHNhbWUgdGhpbmcgYXMgYSBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBDMkZlbmNlIC0+IGhpZGxfaGFuZGxlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdExpbmVhckJsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5tZXRhLCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj57ICZkUmFuZ2VJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkNvbnN0TGluZWFyQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdExpbmVhckJsb2NrOjpmZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShzKTsKKyAgICBpZiAoIWFkZEJhc2VCbG9jaygmZC0+aW5kZXgsIHMuaGFuZGxlKCksIGJwRGF0YSwKKyAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYmxvY2sgZGF0YSBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SZWN0SW5mbyBkUmVjdEluZm87CisgICAgQzJSZWN0IHNSZWN0ID0gcy5jcm9wKCk7CisgICAgZFJlY3RJbmZvLmxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QubGVmdCk7CisgICAgZFJlY3RJbmZvLnRvcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC50b3ApOworICAgIGRSZWN0SW5mby53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC53aWR0aCk7CisgICAgZFJlY3RJbmZvLmhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5oZWlnaHQpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJlY3RJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyQ29uc3RHcmFwaGljQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdEdyYXBoaWNCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXJEYXRhIC0+IEJ1ZmZlcgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGZpbGxzIGluIGQtPmJsb2Nrcy4KK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmJsb2Nrcy5yZXNpemUoCisgICAgICAgICAgICBzLmxpbmVhckJsb2NrcygpLnNpemUoKSArCisgICAgICAgICAgICBzLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayYgbGluZWFyQmxvY2sgOiBzLmxpbmVhckJsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgZ3JhcGhpY0Jsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2Nrcy4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKERlc3RpbmF0aW9uIGluZGV4ID0gIiA8PCBpIC0gMSA8PCAiLikiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5pbmZvLCBzLmluZm8oKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyOjpkYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMySW5mb0J1ZmZlciAtPiBJbmZvQnVmZmVyCitib29sIG9iamNweShJbmZvQnVmZmVyKiBkLCBjb25zdCBDMkluZm9CdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgLy8gVE9ETzogQzJJbmZvQnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAodm9pZClkOworICAgICh2b2lkKXM7CisgICAgKHZvaWQpYnVmZmVyUG9vbFNlbmRlcjsKKyAgICAodm9pZCliYXNlQmxvY2tzOworICAgICh2b2lkKWJhc2VCbG9ja0luZGljZXM7CisgICAgTE9HKElORk8pIDw8ICJJbmZvQnVmZmVyIG5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZyYW1lRGF0YSAtPiBGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5idWZmZXJzLnJlc2l6ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzQnVmZmVyKSB7CisgICAgICAgICAgICAvLyBBIG51bGwgKHBvaW50ZXIgdG8pIEMyQnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgQnVmZmVyIHdpdGggZW1wdHkKKyAgICAgICAgICAgIC8vIGluZm8gYW5kIGJsb2Nrcy4KKyAgICAgICAgICAgIGRCdWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgICAgICAgICBkQnVmZmVyLmJsb2Nrcy5yZXNpemUoMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmJ1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5jb25maWdVcGRhdGUsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcidzIGltcGxlbWVudGF0aW9uCisKK0RlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkKKyAgICA6IG1SZWNlaXZlck1hbmFnZXIocmVjZWl2ZXJNYW5hZ2VyKSwKKyAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQoMCksCisgICAgICBtTGFzdFNlbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpLAorICAgICAgbVJlZnJlc2hJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpIHsKK30KKwordm9pZCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2V0UmVjZWl2ZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtUmVjZWl2ZXJNYW5hZ2VyICE9IHJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBtUmVjZWl2ZXJNYW5hZ2VyID0gcmVjZWl2ZXJNYW5hZ2VyOworICAgIH0KKyAgICBtUmVmcmVzaEludGVydmFsID0gcmVmcmVzaEludGVydmFsOworfQorCitSZXN1bHRTdGF0dXMgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSB7CisgICAgaWYgKCFtUmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAoIW1TZW5kZXJNYW5hZ2VyKSB7CisgICAgICAgIG1TZW5kZXJNYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGxvY2FsIEJ1ZmZlclBvb2wgQ2xpZW50TWFuYWdlci4iOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWdpc3RlclNlbmRlciAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCA9IHJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnBvc3RTZW5kKAorICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkLCBicERhdGEsICZ0cmFuc2FjdGlvbklkLCAmdGltZXN0YW1wVXMpOworICAgIGlmIChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gcnM7CisgICAgfQorICAgIGlmICghYnBNZXNzYWdlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgb3V0cHV0IHBhcmFtZXRlciBmb3IgQnVmZmVyU3RhdHVzTWVzc2FnZS4iOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAvLyBiYXNlQmxvY2tzIGhvbGRzIGEgbGlzdCBvZiBCYXNlQmxvY2sgb2JqZWN0cyB0aGF0IEJsb2NrcyBjYW4gcmVmZXIgdG8uCisgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4gYmFzZUJsb2NrczsKKworICAgIC8vIGJhc2VCbG9ja0luZGljZXMgbWFwcyBhIHJhdyBwb2ludGVyIHRvIG5hdGl2ZV9oYW5kbGVfdCBvciBCdWZmZXJQb29sRGF0YQorICAgIC8vIGluc2lkZSBiYXNlQmxvY2tzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gYmFzZUJsb2Nrcy4gVGhlIGtleXMKKyAgICAvLyAocG9pbnRlcnMpIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGJsb2NrcyB0aGF0IGhhdmUgdGhlIHNhbWUgImJhc2UgYmxvY2siIGluCisgICAgLy8gcywgYSBsaXN0IG9mIEMyV29yayBvYmplY3RzLiBCZWNhdXNlIGJhc2VCbG9ja3Mgd2lsbCBiZSBjb3BpZWQgaW50byBhCisgICAgLy8gaGlkbF92ZWMgZXZlbnR1YWxseSwgdGhlIHZhbHVlcyBvZiBiYXNlQmxvY2tJbmRpY2VzIGFyZSB6ZXJvLWJhc2VkCisgICAgLy8gaW50ZWdlciBpbmRpY2VzIGluc3RlYWQgb2YgbGlzdCBpdGVyYXRvcnMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGNhbiBiZSByYXcgYmVjYXVzZSBiYXNlQmxvY2tJbmRpY2VzIGhhcyBhIHNob3J0ZXIKKyAgICAvLyBsaWZlc3BhbiB0aGFuIGFsbCBvZiBiYXNlIGJsb2Nrcy4KKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+IGJhc2VCbG9ja0luZGljZXM7CisKKyAgICBkLT53b3Jrcy5yZXNpemUocy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiBzV29yayA6IHMpIHsKKyAgICAgICAgV29yayAmZFdvcmsgPSBkLT53b3Jrc1tpKytdOworICAgICAgICBpZiAoIXNXb3JrKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay0+aW5wdXQsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cworICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXb3JrIHdpdGggbm8gd29ya2xldHMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmNlbCB0aGUgd29ya2xldHMuCisgICAgICAgICAgICBoaWRsX3ZlYzxXb3JrbGV0PiAmZFdvcmtsZXRzID0gZFdvcmsud29ya2xldHM7CisgICAgICAgICAgICBkV29ya2xldHMucmVzaXplKHNXb3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgc1dvcmtsZXQgOiBzV29yay0+d29ya2xldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzV29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXb3JrbGV0ICZkV29ya2xldCA9IGRXb3JrbGV0c1tqKytdOworCisgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICAgICAgZFdvcmtsZXQuY29tcG9uZW50SWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzV29ya2xldC0+Y29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHR1bmluZ3MKKyAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmRXb3JrbGV0LnR1bmluZ3MsIHNXb3JrbGV0LT50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGogLSAxIDw8ICJdLT50dW5pbmdzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgICAgIGRXb3JrbGV0LmZhaWx1cmVzLnJlc2l6ZShzV29ya2xldC0+ZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTnVsbCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGsgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1trKytdLCAqc0ZhaWx1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0Lm91dHB1dCwgc1dvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+b3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cyBwcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay0+d29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgeworICAgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgICAodm9pZClzOworICAgICpkID0gQzJGZW5jZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkxpbmVhckJsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJMaW5lYXJCbG9jazo6bWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkxpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJMaW5lYXJCbG9jay4KKyAgICAqYnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsCisgICAgICAgICAgICBmZW5jZSkpOworICAgIGlmICghKCpidWZmZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxpbmVhckJ1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJHcmFwaGljQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2Jvb2wgY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SZWN0SW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJHcmFwaGljQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmVjdEluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyR3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVHcmFwaGljQnVmZmVyIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCdWZmZXIgLT4gQzJCdWZmZXIKKy8vIE5vdGU6IFRoZSBuYXRpdmUgaGFuZGxlcyB3aWxsIGJlIGNsb25lZC4KK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgKmQgPSBudWxscHRyOworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5ibG9ja3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEJsb2NrICZzQmxvY2sgPSBzLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoIWNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpsaW5lYXIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBpZiAoIWNyZWF0ZUdyYXBoaWNCdWZmZXIoZCwgYmFzZUJsb2NrLmdyYXBoaWMsIHNCbG9ja01ldGEsIGRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OmdyYXBoaWMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjp0eXBlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmZvCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjppbmZvLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gYzJwYXJhbXsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbSkucmVsZWFzZSgpfTsKKyAgICAgICAgaWYgKCFjMnBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBhcmFtIGluIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCpkKS0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihjMnBhcmFtKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQorYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxDMkZyYW1lRGF0YTo6ZmxhZ3NfdD4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6Om9yZGluYWwuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCdWZmZXIsIHNCdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6YnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGRCdWZmZXIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5jb25maWdVcGRhdGUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHBhcnNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmFzZUJsb2NrIC0+IEMyQmFzZUJsb2NrCitib29sIG9iamNweShDMkJhc2VCbG9jayogZCwgY29uc3QgQmFzZUJsb2NrJiBzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om5hdGl2ZUJsb2NrOiB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHNIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKHMubmF0aXZlQmxvY2soKSk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKnNDMkhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUqPihzSGFuZGxlKTsKKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhzQzJIYW5kbGUpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6bmF0aXZlQmxvY2suIjsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBvb2xlZEJsb2NrOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrKCk7CisgICAgICAgICAgICBzcDxDbGllbnRNYW5hZ2VyPiBicCA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJwLT5yZWNlaXZlKAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICZjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlY2VpdmUgYnVmZmVyIGZyb20gYnVmZmVycG9vbCAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0U3RhdHVzID0gIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhjSGFuZGxlLCBicERhdGEpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6cG9vbGVkQmxvY2suIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBCYXNlQmxvY2sncyBkaXNjcmltaW5hdG9yIHdpdGggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ1bmRlcmx5aW5nIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZ2V0RGlzY3JpbWluYXRvcigpKSA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLCBjb25zdCBXb3JrQnVuZGxlJiBzKSB7CisgICAgLy8gQ29udmVydCBCYXNlQmxvY2tzIHRvIEMyQmFzZUJsb2Nrcy4KKyAgICBzdGQ6OnZlY3RvcjxDMkJhc2VCbG9jaz4gZEJhc2VCbG9ja3Mocy5iYXNlQmxvY2tzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmJhc2VCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtCdW5kbGU6OmJhc2VCbG9ja3NbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5jbGVhcigpOworICAgIGZvciAoY29uc3QgV29yayYgc1dvcmsgOiBzLndvcmtzKSB7CisgICAgICAgIGQtPmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29yaz4oKSk7CisgICAgICAgIEMyV29yayYgZFdvcmsgPSAqZC0+YmFjaygpOworCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0KHMpCisgICAgICAgIGRXb3JrLndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgV29ya2xldCYgc1dvcmtsZXQgOiBzV29yay53b3JrbGV0cykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICBkV29ya2xldC0+Y29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8YzJfbm9kZV9pZF90PigKKyAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQuY29tcG9uZW50SWQpOworCisgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICBpZiAoIWNvcHlQYXJhbXNGcm9tQmxvYigmZFdvcmtsZXQtPnR1bmluZ3MsIHNXb3JrbGV0LnR1bmluZ3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0Ojp0dW5pbmdzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZEZhaWx1cmUsIHNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6OmZhaWx1cmVzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZEZhaWx1cmUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQtPm91dHB1dCwgc1dvcmtsZXQub3V0cHV0LCBkQmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6Om91dHB1dC4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHNQcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay53b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgICAgICAvLyByZXN1bHQKKyAgICAgICAgZFdvcmsucmVzdWx0ID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNXb3JrLnJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYikgeworICAgIC8vIGFzc3VtaW5nIGJsb2IgaXMgY29uc3QgaGVyZQorICAgIHNpemVfdCBzaXplID0gYmxvYi5zaXplKCk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYmxvYi5kYXRhKCk7CisgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisKKyAgICBkbyB7CisgICAgICAgIHAgPSBDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoZGF0YSArIGl4LCBzaXplIC0gaXgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICBpeCArPSBwLT5zaXplKCk7CisgICAgICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHApOworCisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2VQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuIFQgaXMgYSBjb250YWluZXIgdHlwZQorICogd2hvc2UgbWVtYmVyIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEMyUGFyYW0qLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgY3JlYXRlZCAodGhpcyBvbmx5CisgKiAgICAgICAgIGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBfY3JlYXRlUGFyYW1zQmxvYihoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwgY29uc3QgVCAmcGFyYW1zKSB7CisgICAgLy8gYXNzdW1pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnN0CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcC0+c2l6ZSgpOworICAgICAgICBzaXplID0gYWxpZ24oc2l6ZSwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShzaXplKTsKKyAgICBzaXplX3QgaXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE5FVkVSIG92ZXJ3cml0ZSBldmVuIGlmIHBhcmFtIHZhbHVlcyAoZS5nLiBzaXplKSBjaGFuZ2VkCisgICAgICAgIHNpemVfdCBwYXJhbVNpemUgPSBzdGQ6Om1pbihwLT5zaXplKCksIHNpemUgLSBpeCk7CisgICAgICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCkgKyBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgJigqYmxvYilbaXhdKTsKKyAgICAgICAgaXggKz0gcGFyYW1TaXplOworICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKGl4KTsKKyAgICBpZiAoaXggIT0gc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgbmV3IFQgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLiBUIGlzIEMyUGFyYW0gb3IgaXRzIGNvbXBhdGlibGUgZGVyaXZlZCBjbGFzcy4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIG90aGVyd2lzZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcmFtcy0+cmVzaXplKHBhcmFtUG9pbnRlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29weVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgcGFyYW1Qb2ludGVyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10ucmVzZXQocmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKS5yZWxlYXNlKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKyAgICByZXR1cm4gX2NvcHlQYXJhbXNGcm9tQmxvYihwYXJhbXMsIGJsb2IpOworfQorCisvLyBQYXJhbXMgLT4gdXBkYXRlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBudWxsIG91dHB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleDJwYXJhbS5maW5kKHBhcmFtLT5pbmRleCgpKSA9PSBpbmRleDJwYXJhbS5lbmQoKSkgeworICAgICAgICAgICAgaW5kZXgycGFyYW0uZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgcGFyYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGZhaWxlZCB0byBwYXJzZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBpbnB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlY2x0eXBlKGluZGV4MnBhcmFtKTo6aXRlcmF0b3IgaSA9IGluZGV4MnBhcmFtLmZpbmQoCisgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKGkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIgbm90IGZvdW5kLiBTa2lwcGluZy4uLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWktPnNlY29uZC0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gc2l6ZSBtaXNtYXRjaDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuc2l6ZSgpIDw8ICIgdnMgIiA8PCBwYXJhbVBvaW50ZXItPnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChpbmRleCA9ICIgPDwgaS0+Zmlyc3QgPDwgIikuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIEJ1ZmZlclBvb2wgUmVzdWx0U3RhdHVzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykgPDwgIi4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KK3NwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgZm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKKyAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQorICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc0lucHV0KSB7CisgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29yay0+aW5wdXQsIHByb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgICAgICBpZ2JwLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oKTsKKyAgICByZXR1cm4gaGdicCA/IGhnYnAgOgorICAgICAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KGlnYnApOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIG51bGwgcHJvZHVjZXIuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOworICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoaW5nIGJ1ZmZlcjoiCisgICAgICAgICAgICA8PCAiIGJsb2NrIGRpbWVuc2lvbiAiIDw8IGJsb2NrLndpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2NrLmhlaWdodCgpCisgICAgICAgICAgICA8PCAiLCBncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkKKyAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCisgICAgICAgICAgICA8PCAiLCBmb3JtYXQgMHgiIDw8IHN0ZDo6c2V0dyg4KSA8PCBncmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpCisgICAgICAgICAgICA8PCAiLCB1c2FnZSAweCIgPDwgc3RkOjpzZXR3KDE2KSA8PCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpCisgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgICAgPDwgIiwgc3RyaWRlICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCkKKyAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gIiA8PCByZXN1bHQgPDwgIi4iOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIHJldHVybmVkIHNsb3QgIyIKKyAgICAgICAgICAgICAgICAgPDwgKmJxU2xvdCA8PCAiLiI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKSwKKyAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7Cit9CisKK2Jvb2wgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrLCBwcm9jZXNzSW5wdXQsIHByb2Nlc3NPdXRwdXQpOworfQorCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmICghZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3Qgb2xkR2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBvbGRJZDsKKyAgICBpbnQzMl90IG9sZFNsb3Q7CisgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCBidWZmZXJxdWV1ZS1iYXNlZCwgZG8gbm90aGluZy4KKyAgICBpZiAoIV9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgZGF0YSwgJm9sZEdlbmVyYXRpb24sICZvbGRJZCwgJm9sZFNsb3QpIHx8CisgICAgICAgICAgICAob2xkSWQgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIHRoZSBibG9jaydzIGJxSWQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlc2lyZWQgYnFJZCwganVzdCBob2xkLgorICAgIGlmICgob2xkSWQgPT0gYnFJZCkgJiYgKG9sZEdlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbikpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6IgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgb2xkSWQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IG9sZFNsb3QKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKGRhdGEsIGdldEhnYnAoaWdicCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGF0dGFjaCB0byB0aGUgZ2l2ZW4gaWdicCwgd2hpY2ggbXVzdCBub3QgYmUgbnVsbC4KKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYnFTbG90OworICAgIHN0YXR1c190IHJlc3VsdCA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssIGlnYnAsIGdlbmVyYXRpb24sICZicVNsb3QpOworCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBmYWlsIHRvIGF0dGFjaDoiCisgICAgICAgICAgICAgICAgICAgPDwgIiB0YXJnZXQgYnFJZCAiIDw8IGJxSWQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gYXR0YWNoZWQ6IgorICAgICAgICAgICAgICAgICA8PCAiIGJxSWQgIiA8PCBicUlkCisgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IGJxU2xvdAorICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgX0MyQmxvY2tGYWN0b3J5OjpBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBkYXRhLCBnZXRIZ2JwKGlnYnApLCBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcklucHV0KSB7CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoaG9sZEJ1ZmZlclF1ZXVlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pLAorICAgICAgICAgICAgICAgICBmb3JJbnB1dCwgIWZvcklucHV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Nzc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjM3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7InhhYWMiLCB4YWFjfSwKKyAgICAgICAgICAgIHsibXAzIiwgbXAzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJ2b3JiaXMiLCB2b3JiaXN9LAorICAgICAgICAgICAgeyJvcHVzIiwgb3B1c30sCisgICAgICAgICAgICB7InBjbSIsIHBjbX0sCisgICAgICAgICAgICB7Imc3MTEuYWxhdyIsIGc3MTFhbGF3fSwKKyAgICAgICAgICAgIHsiZzcxMS5tbGF3IiwgZzcxMW1sYXd9LAorICAgICAgICAgICAgeyJnc20iLCBnc219LAorICAgICAgICAgICAgeyJyYXciLCByYXd9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5kZWNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RydWN0IG91dHB1dE1ldGFEYXRhIHsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIHVpbnQzMl90IHJhbmdlTGVuZ3RoOworICAgIH07CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9MaXN0IG9mIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIG91dHB1dCBzaXplIHRvIGNhbGN1bGF0ZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXRhRGF0YSBtZXRhID0ge21UaW1lc3RhbXBVcywgcmFuZ2VMZW5ndGh9OworICAgICAgICAgICAgICAgICAgICAgICAgb0J1ZmZlck1ldGFEYXRhLnB1c2hfYmFjayhtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgeGFhYywKKyAgICAgICAgbXAzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIGFhYywKKyAgICAgICAgdm9yYmlzLAorICAgICAgICBvcHVzLAorICAgICAgICBwY20sCisgICAgICAgIGc3MTFhbGF3LAorICAgICAgICBnNzExbWxhdywKKyAgICAgICAgZ3NtLAorICAgICAgICByYXcsCisgICAgICAgIGZsYWMsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICA6OmFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+IG9CdWZmZXJNZXRhRGF0YTsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGJpdFN0cmVhbUluZm9bMF0pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGJpdFN0cmVhbUluZm9bMV0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEluIGRlY29kZXIgY29tcG9uZW50cywgb2Z0ZW4gdGhlIGlucHV0IHBhcmFtZXRlcnMgZ2V0IHVwZGF0ZWQgdXBvbgorLy8gcGFyc2luZyB0aGUgaGVhZGVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtLiBDbGllbnQgbmVlZHMgdG8gY29sbGVjdCB0aGlzCisvLyBpbmZvcm1hdGlvbiBhbmQgcmVjb25maWd1cmUKK3ZvaWQgZ2V0SW5wdXRDaGFubmVsSW5mbygKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgLy8gcXVlcnkgblNhbXBsZVJhdGUgYW5kIG5DaGFubmVscworICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlc3sKKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfRE9OVF9CTE9DSywgJmluUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IGluUGFyYW1zW2ldLmdldCgpOworICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb21wTmFtZSkgeworICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJuYjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcndiOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDE2MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmdzbTogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDApIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6eGFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyJ9LAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiJ9LAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8iLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiJ9LAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsICIifSwKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiIn0sCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFtbGF3LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAorICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLCAiIn0sCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCA6IHB1YmxpYyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKKyAgICBpZiAoIXN0cmNtcChtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKSkgeworICAgICAgICBBTE9HVigiRU1QVFkgSU5QVVQgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSAlcyBtVVJMICAlcyAiLAorICAgICAgICAgICAgICBnRW52LT5nZXRSZXMoKS5jX3N0cigpLCBtVVJMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgdWludDY0X3QgZXhwVHM7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIC8vIFVwZGF0ZSBTYW1wbGVSYXRlIGFuZCBDaGFubmVsQ291bnQKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBpbnQgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOworICAgICAgICBpbnQgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKKyAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT46Oml0ZXJhdG9yIGl0T3V0ID0gb0J1ZmZlck1ldGFEYXRhLmJlZ2luKCk7CisgICAgICAgIEVYUEVDVF9FUSgqaXRJbiwgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgZXhwVHMgPSAqaXRJbjsKKyAgICAgICAgd2hpbGUgKGl0T3V0ICE9IG9CdWZmZXJNZXRhRGF0YS5lbmQoKSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cFRzLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICAgICAgaWYgKGV4cFRzICE9IGl0T3V0LT50aW1lc3RhbXBVcykgYnJlYWs7CisgICAgICAgICAgICAvLyBidWZmZXIgc2FtcGxlcyA9ICgodG90YWwgYnl0ZXMpIC8gKGFjICogKGJpdHMgcGVyIHNhbXBsZSAvIDgpKQorICAgICAgICAgICAgc2FtcGxlc1JlY2VpdmVkICs9ICgoaXRPdXQtPnJhbmdlTGVuZ3RoKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgICAgICAgICBleHBUcyA9IHNhbXBsZXNSZWNlaXZlZCAqIDEwMDAwMDBsbCAvIG5TYW1wbGVSYXRlOworICAgICAgICAgICAgaXRPdXQrKzsKKyAgICAgICAgfQorICAgICAgICBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKTsKKyAgICAgICAgLS1pdEluOworICAgICAgICBFWFBFQ1RfR1QoZXhwVHMsICppdEluKTsKKyAgICAgICAgb0J1ZmZlck1ldGFEYXRhLmNsZWFyKCk7CisgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJlYW1JbmRleGVzLCBDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygwLCAxKSk7CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICBzaXplX3QgaSA9IC0xOworICAgIGRvIHsKKyAgICAgICAgaSsrOworICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGlmIChJbmZvW2ldLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2ldLmZsYWdzIC0gMSk7CisKKyAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaSArIDEpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZW5jb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QgblNhbXBsZVJhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG5TYW1wbGVSYXRlKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG5DaGFubmVscyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBmYWlsdXJlcy5zaXplKCkgPT0gMHUpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSwgYm9vbCBmbHVzaGVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgZnJhbWVJRCA9IDA7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gc2FtcGxlc1BlckZyYW1lICogbkNoYW5uZWxzICogMjsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPQorICAgICAgICAoaW50KSgoKGZsb2F0KXNhbXBsZXNQZXJGcmFtZSAvIG5TYW1wbGVSYXRlKSAqIDEwMDAwMDApOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvdW50LCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5zaXplKCkpOworCisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBBTE9HVigiRW5jb2RlVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDk2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBudW1GcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV1IiwgbUZyYW1lc1JlY2VpdmVkLCBudW1GcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGlmICgobUNvbXBOYW1lID09IGZsYWMgfHwgbUNvbXBOYW1lID09IG9wdXMgfHwgbUNvbXBOYW1lID09IGFhYykpIHsKKyAgICAgICAgaWYgKCFtQ3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGJ1ZmZlciBtaXNzaW5nIik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1Xb3JrUXVldWUgRW1wdHkgaXMgbm90IGV4cGVjdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdGVzdCIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSBtV29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSA8IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDk2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDMwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgblNhbXBsZVJhdGUsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc3M2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisKKworI2VuZGlmICAvLyBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY0NmVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBDb21tb25VdGlsIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU2OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwyMiBAQAorIyMgQ29kZWMyIEhhbCBAIDEuMCB0ZXN0cyAjIworLS0tCisjIyMjIG1hc3RlciA6CitGdW5jdGlvbmFsaXR5IG9mIG1hc3RlciBpcyB0byBlbnVtZXJhdGUgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0TWFzdGVyVGVzdCAtSSBzb2Z0d2FyZQorCisjIyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCBpcyB0byB0ZXN0IGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+CisKKyMjIyMgYXVkaW8gOgorRnVuY3Rpb25hbGl0eSBvZiBhdWRpbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIGF1ZGlvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKKyMjIyMgdmlkZW8gOgorRnVuY3Rpb25hbGl0eSBvZiB2aWRlbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIHZpZGVvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzYyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbiIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvLyBUZXN0IHRoZSBjb2RlY3MgZm9yIE51bGxCdWZmZXIsIEVtcHR5IElucHV0IEJ1ZmZlciB3aXRoKG91dCkgZmxhZ3Mgc2V0Cit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJ3b3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSB7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG51bGxwdHIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworfQorCisvLyBXYWl0IGZvciBhbGwgdGhlIGlucHV0cyB0byBiZSBjb25zdW1lZCBieSB0aGUgcGx1Z2luLgordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpIHsKKyAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgY3NkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdQYXJhbS5wdXNoX2JhY2socGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgIT0gQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgeworICAgICAgICBmcmFtZXNSZWNlaXZlZCsrOworICAgICAgICBlb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgICAgIGF1dG8gZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKGZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIGZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIEFMT0dWKCJXb3JrRG9uZTogZnJhbWVJRCByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICAgIChpbnQpd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICB3b3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhMjkwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7CisKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXhlZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlLmg+CisKKyNkZWZpbmUgTUFYX1JFVFJZIDIwCisjZGVmaW5lIFRJTUVfT1VUIDQwMG1zCisjZGVmaW5lIE1BWF9JTlBVVF9CVUZGRVJTIDgKKworLyoKKyAqIEhhbmRsZSBDYWxsYmFjayBmdW5jdGlvbnMgb25Xb3JrRG9uZSgpLCBvblRyaXBwZWQoKSwKKyAqIG9uRXJyb3IoKSwgb25EZWF0aCgpLCBvbkZyYW1lc1JlbmRlcmVkKCkKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisgICBwdWJsaWM6CisgICAgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGZuID0KKyAgICAgICAgICAgIG51bGxwdHIpCisgICAgICAgIDogY2FsbEJhY2soZm4pIHt9CisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZSBjYWxsZWQiKTsKKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpZnJhbWVJbmRleDsKKyAgICAgICAgKHZvaWQpYXJyYXlJbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKAorICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcik7CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUyk7CisKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCk7CisKKyNlbmRpZiAgLy8gTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MTNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgwM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9jb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIENvbXBvbmVudCB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSWYgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBmYXRhbCBmYWlsdXJlLCBpdCBpcyBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAvLyBmcmVlTm9kZSgpIHdpbGwgbm90IGdvIHRocm91Z2guIEluc3RlYWQgb2YgaGFuZ2luZyB0aGUgYXBwLgorICAgICAgICAgICAgLy8gbGV0IGl0IHBhc3MgdGhyb3VnaCBhbmQgcmVwb3J0IGVycm9ycworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1Fb3M7CisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCisvLyBUZXN0IEVtcHR5IEZsdXNoCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIEVtcHR5Rmx1c2gpIHsKKyAgICBBTE9HVigiRW1wdHkgRmx1c2ggVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgLy8gRW1wdHkgRmx1c2ggc2hvdWxkIG5vdCByZXR1cm4gYW55IHdvcmsKKyAgICBBU1NFUlRfRVEoZmx1c2hlZFdvcmsuc2l6ZSgpLCAwdSk7Cit9CisKKy8vIFRlc3QgUXVldWUgRW1wdHkgV29yaworVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBRdWV1ZUVtcHR5V29yaykgeworICAgIEFMT0dWKCJRdWV1ZSBFbXB0eSBXb3JrIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXVlaW5nIGFuIGVtcHR5IFdvcmtCdW5kbGUKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZ3b3JrTGlzdCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX05FKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBSZWxlYXNlIEFQSQorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVJlbGVhc2UpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgUmVsZWFzZSBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBDb21wb25lbnQgRG9tYWluIFR5cGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworCisgICAgLy8gQ29uZmlndXJlIENvbXBvbmVudCBEb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqIHBvcnRNZWRpYVR5cGUgPQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3BvcnRNZWRpYVR5cGV9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KK30KKworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBpc051bGxCdWZmZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSBBTE9HRCgiVGVzdGluZyBmb3IgbnVsbCBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgZWxzZSBBTE9HRCgiVGVzdGluZyBmb3IgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RJbnB1dEJ1ZmZlcigKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwgZmxhZ3MsIGlzTnVsbEJ1ZmZlcikpOworCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRJbnB1dHMsIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCB3b3JrLAorLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgc3RhdGVzCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNjRjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfbWFzdGVyX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgTWFzdGVyIHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMk1hc3RlckhhbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworfTsKKwordm9pZCBkaXNwbGF5Q29tcG9uZW50SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcExpc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBjb21wTGlzdFtpXS5uYW1lIDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmRvbWFpbjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmtpbmQgPDwgIlxuIjsKKyAgICB9Cit9CisKKy8vIExpc3QgQ29tcG9uZW50cworVEVTVF9GKENvZGVjMk1hc3RlckhhbFRlc3QsIExpc3RDb21wb25lbnRzKSB7CisgICAgQUxPR1YoIkxpc3RDb21wb25lbnRzIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29kZWMyQ2xpZW50IE5hbWUiOworCisgICAgLy8gR2V0IExpc3Qgb2YgY29tcG9uZW50cyBmcm9tIEhJREwgQ29kZWMyQ2xpZW50IGluc3RhbmNlCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjb21wb25lbnQsIG51bGxwdHIpIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2CkBAIC0wLDAgKzEgQEAKK8rKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS0tPT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PD87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0REQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc8Oz46PTo6Ojg4Ojs7ODg6Ojs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PjtEPD06PDw5ODo5Ojo5Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vLzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra2tvb29nZ2dnZ2dnZ2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vc3Nzc3Nzc3N3c29vb29rU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjM7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2NkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqLh4GCgoKCgoKCgYGBgX+R09PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe6+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTVE1DREREREREQ0NDREM/XdHT09PT09PS0tLS0tLS3+rr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1hRSUlJSUlJSUlISEhIRGDQ09LS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFhYmJiYmJiXoysqampqampqampqamqo2dhYmJiYmJiYmJiYmJiXFRUVFRUVFRUVFRUVVFr0NLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs3MzMzOz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXFxsbGy8zLzMvMzMzMzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy8rKysrKysrKy8vKysvLzdXV1dbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9LUz8/S1NXUz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NDR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbV1tbW1tbW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmszPzs7Ozs7Sq5zP0NO5n9HQnIKEisjPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1tXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9Wyl5i1tpO4ua+i0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3DnaKmq9KRfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COTY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmKrUz8/P0b+YoJuyrciGma3V0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT4/Pjo4RUA/Qjs3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZiq1M/Pz9O0mZaquKTbo5it1dPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+g2KGYrdXVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWodmhmK3V1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PTo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmanaoZiu1s2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpu02qOYr9jCn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tPT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SazNihma3asqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNXUsYTD1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR0tHD1dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f39/g4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxEREREPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FRERFPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QTw7PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29va2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBRD8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW2tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm4uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU0Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6vs7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfnJ2hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLW0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZmamZeXl5eXlpmbmJmZmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW2tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2uq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iZmpucnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2sq6qnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKampaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWlqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnJyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alpKWkpaWmqKinqKelpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmbnKGko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKKioqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fn5+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnZ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5uanJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ycnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5iZnJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52doKGio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+dnZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qbmpuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KTk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cmpubm5uamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pjs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucm5ubnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz1DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnZ+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPj4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7Pzw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8/QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9OTk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPj9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg5ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBvcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFEXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFLzhbbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PS2+heEF7d2NiUFBaR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0tLS5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGC/1qZDe4yAdU9tjnVSZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XUF5lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPD48OTk8QUJFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLOybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkKKXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6OhpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNgHdydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BCPkM9Ozk+OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqidiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoainpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoF2eHl4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs+Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloaSnp6GfnZ6Wk5ygl5mSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ6dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ojw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1XoyMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5M1uTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMzNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCPDg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKKnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJeXnJufnqOcnpaYl5OWnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojs7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbOrqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOMlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmlqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjMysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmlqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvBw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1paWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnZ6WnKOgoaKko6SinpqZm5ubnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VUTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg6PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Odn6JVkxvpMvUxba/v8C/urq9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnJ+eo6CmmXl6eYBzcGZlZ2RrZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8PDxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3aoOQmG+pyMjH0cGvvb24ubu7vri1sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbCnpqWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2joJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs7QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj06OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm2uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1RMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e1uLa2vLu5trS4urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLWzs764ubi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJO9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y2tbfBvbu8wMO7v8K/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBub69xL/Av8LIvcfGxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7nDvr65wL3DxsLKzsfGvbrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gYFRJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC7wru5tLu7w8PBzdDKxL21vLu5v7m6tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6dsLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PD86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9vsC4yL6roaGhprnBycW4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsC7yKy8rbq4n5ORm6O3tLC0tLW8ub65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u667u5SPztzm4tG4mpKGf52tr66zure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7Cms7ma6OPb1dfVz7qJdWpsmKynr7azsrq1u7u7tbi2sLXEsr68vry5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennauivcurqLXKz8/LmXRrbHKgpKqtrqewrK+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiarrNaOEt5qsXKxqKAhZKIiJ6jqaigpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJU0ROQz04ODc1Ojc8PTo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aXjKx9MlJoVnSvtbGejJqiopuWnaOin56koKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45hZGKArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUlYugY16Gh3RajKOZm5idoaSnpp2en6CcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzYFtecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpSPiG6Hur+jY2eTh5SRjp6joqainZ+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fWV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD07Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODU1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko11lfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZaWmYh6pMfW1Z9PbH+JgIOUmpibq6OhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmpePd5/K2rKyZ0Zmenh/g4F7irWvprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZilnaCak3CGvbJTinV5cWVpamVeUGusuqy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR05HQ0dOPT5MPjU8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqaKsoJKCe4iDeoGQpYdzWktfWklAp8G1ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoV1xRRlVIREpQST9GQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg7Ojk7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKSioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamptJF5jIeHlqOkpohibmuRroBMRLfEv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tLu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oj8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKutsqdzdnlubGyChHuFWVZ5jMCnYW7MxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb6+v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaSalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqG3tZmXb2VmXE1Wg4BwkHpob1+0p2yf08/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoaqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdm5SUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2DrJiLmmlXY1hfZHCAbX6Pck9zm5mAxtDRws/T1tjV1dLLyc7Qy8bN0snS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz9DGx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoaNi45iT1xUXGBRZl5YZVpNand5h9XR0MvQzdPX1tPV0M/S09HJ09HH0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHRyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0f3txa2VUR0lRUEdFPUpQXF91W3PV1NDJzszS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19dXGJtcm5tcXFycXdpT36NalFYS1dPS2BAS1tSbWJ20dLOxs3MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzszQxcfBuLm9xMK9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWlucGZ9i3pmZ1tKVl1jPEFWS2Fpd87NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp2g5GSfWhoVFdmUEJFXFZXXXnKxL/Cv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH+SnY5zZVpbU0FCRU9SU1aRwre4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbW1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWtyiaKSf2ZZUVFTTkA7R0xwoLOusrKysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xurawt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhnanWRj4NtX1NYZF1PRERdlZijpq2qqKqnsqy0r7Gnraarsrq5tcK5ubmvqrS5urPBua/Asb28u7W7x7nDtq2qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DAvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcPGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqeId+b2hcY2xpcXOElJePkp2kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Ozu7ezvK+4ubWyu8Gywa+lqaOrsbOzqL2qq6irrK61tKaorqGksKmzpqeorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG16d3FxaHR/f2hrk5qQjYaYm6SgoJ6jo6WlrJ6bmqOlq7Cvtramr6umqbOrs7mwtbWttrmysLq6sbaloKSgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGFgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmaXZ4dG98g3xSZ42VioqAlJmcopmcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqagqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubqwtry7uquzsrmzvbS3srG1tL+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRtenJud35nPWWMkoaKgpGZmqKbl5qhpKCimp2fmZesrKytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezr6mtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnJwa3J7UDlbfY2GjIWMmJaamZKcnaahnJ2lm5qYqaStrqmaoaG2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpacmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsa+wr6+nqKeyrbG0sLu0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbW1lbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncGlubjkuMEyAiY2HipOYlpqRm5qjoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGtq7WeoJ2VlamhopStsbGfoqOenpmbk4ugk5GTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk7Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhra2EuHytMdYSKhYiOmpOakZeboZ6poqGhoaKgmqeoopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in56XmZOKnZGNkpOVkJiYk5yho5ykoaKVoKKkpZujq6WipKqkq62lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9iaWpiPSs9TG6Ah4OHiJKTm5WVmqSkpqSopKekoJajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvo624paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozo6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNuc1NEUFtgfIJ9iYaOkJmYlJmmpKKqqKWtoaWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgamlmbl9uXGp/eIh/ioqQk5GXo5aapaOiqJuklZ2imZCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW8tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEQ/OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSU1BRVFFTVVFOTUtLU1dXVldXV1daXGFlWV9cbF9eeG+DeoSAi4mLlpuKlZefnqCWo5OemZOKhJeZi3OMgn2NlpWFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6io46JmqCho6SborSvrK+tn5imuKalsKGxrpyxu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraehppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlmYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTk9OT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaV2ltZWRFT2mIeY1+hZWQho6Mm5WalJWUkYyUiH6SiF47Vm57ipOJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6QmJqZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVFJibmNFODd5jYmHdYCNhoCFiJaJlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEiomVhJuNgoSSm5aenZSko6ippaWem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4qUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZlxUYGdXWFBKiHyMgGx3f3t3f4eOfo+Zi454g41+c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFMUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iXlxhVWV+jZKJinNgcnlwc3mDi3iAmJJ+boSNenR5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNiIBtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLS4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeomPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXFxbV1Z3l5u7emtvW3NwaHZzgot1eIiDbGmJj3Zyd2hofoFxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRTWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRVlJQmHpXkF9ob112aWd5dIWEcX2DgXFqlo9ycXpoaJyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2RjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhQRl2lqZdmcW5kdWZrfHt/fHZ/goJ2b5yRcXd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKHlZGdpKeer5WltKmtsa7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRntpdHJybXZmcIGBdnh/fnuIenOelnd8hH+DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQEREP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWTkZfd31xf3F0anWIhXV3hIJ6kYN0nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhJGph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhIeRjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZpV1haYX+He4p4fHl9iox5gISMfJWSf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaUExOV1JRSVBKRE5HQ0pEQ0BEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVV9ed2NiZ2yPj4KPiIuDhoiTg42LmYecnI+fpqKhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc6P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFdaYF3bXp1kpCOnJuZkpmQnJCXmqSao6acpainqLOWqr2qtMbItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5p3en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktQT0lKTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeNfXuTjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWl+iXKMgpWbnaq0sJ2npaejpLCnrbKurqq4r7G8m7HDqrjJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZDRkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLjQ+Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd9i5h/pZumoKe3wLylrsCzqK+8r7S6sryyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZN9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NkFCNzY0MC82Q0hDUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09eip2nnqusuKuvuMXEsbfBurCwvrS1vrG8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCilpuikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6NhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfYqDgouEln14enVmUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVRgX0xST0RBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXY+osa+1ssG3s7fFybe5v7q1s7m4tbyyuLDEX3OwpLGanaq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjqLG0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGNfWWNgamdTWGFWUlVJRUVNSkA+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeoGKgpd+dH16bGVwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0ubHBurW1x8i3tLi0t7ixtbOyrbS1mGN0p5ytcF6irJuXoKKbpJ6qpZSfn5CTjpWYmKiepp+empmDpJ2tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeW2BjWmRjUVxgU1FKQ0FFRkU8QEY/QUhCP0M8OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWlfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGDc3yKg4V7iXSBioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVlZVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrPCrbWvt7myr8LEs663r6+5qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE5QQUJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnKPkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHZscHh+cXpteHNtaYFxbWNqbXB4aXd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstamxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PWzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYVRfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp0hoWKd2x3cH1+f6GenqGMjJiTk4uMk4+VhXmFj5CNi4mIkIZ+gntxfoCBh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuBc3JpcHF6eXJ6vsuafYuxhHZyhHZnYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn52fpqSprreppbKhoaygoq2hprGeiKaak5KRiY6NiIGTiGqVooyZhIGGfpGDg5OXrYuVjZSZjoaSkZ6XqLCioaGlpKnJzc/Iw8zR1dLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVltUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCioCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9goh3f3qGkZWAg253cG12f3Z4fHSGfHpth3Z0b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6Swo6OxnqGknJ+on6Kxm4WdkZGSkIqKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIuakquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdTXFhGR0tJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoSJgYd8eIWWlomOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qcqJ6gq5qhmZidpJ2fq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmYaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycrMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaPdYJ0dYF+dICDb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWm493cGVPZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlZmWlaSblp6VnZKRlqKdmKqVkJCJjJGCi4OIiIGFj5GdmpmIhYuBhZd6iImfl5CIjYmLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsTNytHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzk1NTU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn9zfpKekZ6CkHuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSlI2cmZKTj5WMi5Sem5OflJCNjY+Kfo6NjYqDiJKWmZ6eiIuUkZ2RgYp/pZiIhI2BhYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WcoZudlJF/jIiAmIiAnJJviKiFeqGLfJGNg4iEnH2akImMo6OgkKSvoIqQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmZuOlJWQipGThX+Kh5GMiomclpihoYaSnZWfiomIjZuQg4eOf4KHhqSFjJGymJ2SlZehop+ZkpydqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfW2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Sg25td4t4eX56gXyGe3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXc4qyjYSokoSZk4WZjKKVn5iSiJqeo5OpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZiZjo+TkoaTloN+j4uZh42QqpaWoqGImJ6WmoiOh5eXiYSOjIF/h4+liY6TqJqXk5eZoZmfmZOdm6OztaajvMK+yMXFycjJwsvUzc3UqdLR1tXW2NrU0tnOhXWDa2ZhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX2IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6SdmJCol6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko6GgIWGiJGXk4uKk5KGk5eFg5CPm3OQmLKVlqOgh5uak4+KkIqWmoiKlo2GfYyYnoqQkJyamZOZmJ+UoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjWGNZUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6e22Fhnl8hHiAhIF9cHh8fXxvcox5fYF7eIaLiYaEk6i8ramzvbClrrO0qaOisK2KmrWeo7mllayjl6mtuKako5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieo6uSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46VjIqMlpiRm5mzlpSqnYqblJGMkJGLmJqJkZ2PiomVn6GOlY2XmZ2SnJielKGglJydpq6ooqSzuKvCyMS1ur27xsjIwtChxsnNzcTX1tDK1KNzfWxfXVZiU1FIRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoBzh4d8gYl1gYqDfm19fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO3jKiyrq69q5u6o6itubirp6aioaOjqq+ysaudnKOZm5iXnqKlpZKjua6ov7usrbK5paOnfYiGna28sIKLi4qQg4+DkY56gYaQjI2bh4eNloyKlJaTkJmWm6eZsJmQqpyOmo+RjpWQj5WWjpCgkIiVm6OslZaPlJyelKCdm5ifoJSan6inpKKjsLOmwMbDsLC7tsXFw7/Np8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYWQioFufnuBfnF+gXqUepKUlZiQk5aotMbJwMLMwsO5yL26sKu5u5iytrmywK6lwKOrsLy9qq6ro6Oep6yvtbGqm6CqnKKclp+vs6eMo7q6tcG8q6icsqSjqJSEjqrEw6SCi46Gh4SGlZSMeoOMkI6RoIuLk5COh5efl5KYlJaln66ci6mbjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZqkn5qgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmFk4+BcoB7jX93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprLO8vqqwqqSlo6yuta63tqCfrp+mo5ijs7ypnKi8waO2t6+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjZGPnZ+RjpKKjouTopeWmpSToZ2pnpCkmYuOj4+Vloh8jpWSkaKalKCinLamkJ+XpaSjpZ+eppielZebpaOoqKKyrKi7v8OvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFxZXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6QnY2Wjp6SiYp/iJ6ShHeFf5R+f5CIiZCAlqCarqekmMS+yMTIxtLNzs3LvMK4sLq8tL3Lu8PCt7a8rbS/uryur6ihqai2rq+qsrianqyiqKKdq7e3qqWvvsSxvbmzp6q0s62ulpWlramgkY6SscWnlI58kZV9h5GYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi4+Onohaj5aXkpakmWaZpJ+zpZajlausq6icn6aXmZaYlaKkqKaetaupurzCtKa0tcvBuKq2rLO7uK6ouLq8t4RvcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeolYyQg4alkoiBh4KahIOVkJCTjpqhn6++rqHIvsXFyMfOzs/Syr68trG7u7y/z7bEvri5t7OztrO4tKynnKusuaupqK+wmKOupaikpbXAsKustL7DucC4s6e4tLeyr5WkrbCwpYuTlKCNc8GZfJaZhI6WmouwlZmZlJGRmZikopSempWZp5yaoJ+YioyPlZ1fSpacmpSZpZdUlrCfr52fpZWvr62mm6GmlJOZmI6doKahmbSpqrO8u7ursLLHwLilq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUZNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlXPDpCQ0A9UkVXU3RiVkZIqpeZn6GorpiRl4eKp5aOiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjMzse/u7OvurnAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+uLKywrC3vKyjrrWtuqaImpalm3W+n4SYnI6SmJqLrpagm5qWlJmen6idpp+YmamZoKadl4+MkJ2CbXWSopqVnKKfkK6yoquWqquYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOmqKWmnJytqamNZmlkYlRNTkhJT0pWTD1MRE1JSkBDRDxRVTxBQUJFTzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NntmVzw6PS4uU2FMVkh+ZV5IRqyUm6Gfu66YlJ6LkqqbkZKTiKqNh6KejKOtlKOktse9tMG7wsLIycbCzsjCvrqyr7m1wcPKtsaywby1u6ypra2xpKOZqrW7p6qnrKqdqK+opKurvruorb20t77HvLa1uMCwvcCzqrW2rL+mj6KWkKCfu56Jmp+Zlp2dj7aeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqG1r6Wlk7Ksmqutn5+lpKuSlpWghJCen5yVqKShobO0uratqLWysp2do6Wal5WZqqGeeGRgYmBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6SensOsm5ekl5iom5WZmo6qlpWoppWsrZmhq7fFwbu/uMHCwMjEv83HvL66srC4tL/DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2/sLe3x7e0ubi/sb7BtrSytbC+pJajlZKak62fkKGipKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqylnJezp5qwqaCbq5+ijpqWoIWOoZqckqWkmpersbayq6WqraycmKCgko6QlqmflGlmXGNfUUpIS09NSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57FrKCeq52crZ+Rop6WpKCmqquXt7GjqrO2xcK9wLa/wbzJwr/KyLa4trSxtLS3wsa3v7G4tbq2oKetq62fnp+lpMGloaquoKSprbCipqi9taWxvLe2tsSys7e6vrLDwLe4rbS1taOcpJSRk6CsnpihnKioqqKawqyonautmpqdmKWfvaGcpJeqq6uloJiNmp+SnYiOV3+WnqWhoLmrp5OZt6Ofs6KhnLGYoZCblp6Cj6CXl46io5WQpa6yrKmioqWklZWdmIuPkpOkn4ljZ1xlYk5KS0tPRkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1FTUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6foZiew6elorOgm7Gmkqmjn6Oframrnbyxqay1ssjDwcOzwsO9x8S9xcq9sLG2rrG1sL/FtbqxsLq2rZupsKqrnJ6moajBrZytsZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq2qoqWVlJOiq6Cfn5qnqq6vr7uxpZ+pqZiYl5Kho7igoKORrq+rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco7CboJ2wkaGVmZWbgZKilpCOoKCTi6WssKWmop2gnpKSmpOGi5KNnJ+AZGhdaWdLSk1KU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTU1JOE5kXExFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDt2XV4/W1VfZ3JAODxIlndlQTSfpJ6bn8Kno6mxoKO0qZSxqqaipLKsram7s62wtLTHv8TDtb/EvsrFtsHJwrastamxuKzAxLS4r622uqWZq7Ksq5mhp5itu7ScqLCbrJ+utLKoq7qyp7m0t7K5waq3s8O9tMWnvq6tt7WpqKyhlpWRpaOiopeXpK63rbG0tp+eqKSZlJSTo6C2oqSlla2xsaWopKCdmpmZlZeooJ+Zop6vs6KmjZivmqWtmJugp5OekJaam4aXoJSNkJ2ek4uoqauhp6CanpaNj5mQgoaWiZWfemVrXm1rTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2FdQklTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW/paiurqCptamct6+ro6q0trGwuLewt7e4xbzDx728w8LIwbrCxsK7qralrbuuwcO4uKuusryjla6xrrOXpqiRqrqpoaewnaqgr7Szq6q2tay7rLOyuresubDCur6/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6qfmZaSl6aftqikoqKvsLOrsaaqn5ufn5udpZ2hmJ2jtLCcn5GUppuhqpyWpKKYm4yXmpSWl56UiZGbmZSOqainn6ObmZuTh4+Zi32Ml4aPmmxpbmJub1hRUlpUQUNEVUA7OklBNzpYUGReUFdXRVlfXk1MU05eTEo/WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2VAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKGqr6qisLeopLOyq6Gstb2us7m9u723tsHCv8nDucTDwcG5xb7BubC2qKy3sry/v7Wqr7K4n5esramvmKmpjqe7nqWts5+rorGws6yqtbO1vK2vsbWssLWywLrFt6u9r7G3rK2porGlnqWonqOWj5ifsqmyqamymZ2nm5qUjKCmpLSup6KsrK2wp7KqsKmim56oo56UoZmcqLepmJqTkp+an6Kgkq2hm5uIl5qMnpqdlIuPl5eal6alo6CdlpaWk4CQlYR7j5OEjJdnbXJocXNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUhbX15OTVNYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MT1gVl84KUMzWVVcaEs1jHpmTEClmqCkrLWjrKilrq21qK6yuKansLfFt7G3v8HCtrW6xb7LxLnDwbvAusW4wbqztKyqure7u761q6+xt5mZqKysrJ2tq4+rvZ6rr7GjqZ+xrbOvrraxubaqra+yqLawtLq8yrKqtbSxtLCvp6Gzn5qorJ+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy5o5iUkY+ZnaGZmJWuoqCXg5abj56dmZeRipSTnpqloqOhmZaTkpV7jJCFeo2Lg4uTbG55b3Z9YUZgalpJSFpcPXtKR0U2QWNUaVtNXGFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2srejrLO3ybu1u7zAvrW0t8PAzMe8w724v8DAuMC9sr2uqLq6uLfDt6yusrqWl6evraiksqqUr7ukrLKyp6ejsrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp6fp7Gfo5SbmJSxnqebn6mNqaOdnJWXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVj4+MmZ2imJGZqaWimYaUmJGenJiXl4mXkJeaqJ2koJKWkpCVdoSQhnuGg4SMjG5xeHZ8gFxMZWxcS05jXT5ie0dJOEdoV2VbTF5iTVlaV1RYVWpdUFBIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNxakxFRJGYpK2krK2qpaOwsbOptq+1n6u0uci6rsK9w7izsrXCw87EwMK+tb7BwLu/vbTEqau6sbe4wLywrbS0nqGnsa6mprGlnbG1rKmysKuoqbW6rLWytauzrKqrqaypua6ysMe/uKS5r6mtraanrbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoqpygmpuTpLSZj4qOiJGjoZaPlZ+jl5aHkJWVnpuZlpWImJOVmaedoZ+Nk5GOkHd+j4R8fX6HiopydHN/fn1cU2NuX05ZZ1xGRJZbRzpNblhiW05hYk9WV1ZXVFloXlFTTWNbW1VLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoaivpKais7Ows7SvsKCrrb3Mu67BvcextK60wsPRxMW/wrO/wsO8v7i9xaitt6y0ub3AsayzrqKkp66qqKWwo6mwqq2qsa6urKuzu6e2sLKps6mrpqWkrrqsqrHDubSruampqK2pp7GlqaSjramoop6boqyVpJ2XnpmsnaKnqKGspqOtrLexsKCpoqCqrrCsnZ6nqKmao5iZkKGomIeEj4uLn6GQjY+Yn5OSiImTl6GdlpmWh5eTk5elnJ2djJKQjYl/f4iEe3eAh4WHdHRyiXdsX1lgbmNRc3JcSzuEfEY+V3VYYVlPZFxOVlZVV1FcYl9TUE9oWVdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQU5GlZasp6CpsZynqLC1rLe0raqkq6q9ybyxv7nDr7Gts8TDzc7Dv8C0wMPEusG0ycSsr7eus7rAvrSvr6ynqKqxqaeosaWzrKqvra2xrrKts7uluLOsq66nq6CjnrG4q6qturaktbWkqqesrKqtoKinp7Cxo6aloaGslqqhk5ugpp6koqqjrKKeprG2rKyhpaKaqaquqpyhpaSkmaCZlpCYnpSCg5CJhZ2hjYyQjpySlI6Fj5qlm5OSm4yTkpKUo5qcmouPi4t8hoGCgXp1gYOBf3V4iqKGeGpeYG5mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVUtPaVdWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQ0pJRJaQr6Shqq+XqKettaq1sKqkq6qovMHAubq0vLWmsq/EycvRv8G7uL/Aw7rCusLErrK1srS8wb2zsq+trK2ntqqmra+qt62nsLCusau1qra2p7W3q6ykqamcpJ60s6mopLO0n7Wtoaqoqqisp5+rrKm4tampqqmhqaCtm5GqoZ2gpKOmo6qdnKa0rqekqaKjl6Smp6qcoqSjoJqYoJGPj5mOf4iNh4SenomGjIyRkZOPhYmXo5qOjZuRkpCPkqCYmpeNi4R/dIaCf354dYN/e3h+f4ecj3BxZmdxeFxhdIhqT12YVkhteVVlVlNkUE1WVVVRT1hbYlZJUGpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JbDhSRjuVjK+gpKqrmamjra6ytK+ppa+pqLu/vMGysLmtoravyMfH0MC/vbu8w767xMK/v6+ys7K2vrzCsbK0q7SppbWppa2ysreuoqy0sa+xuau4rqmut6yqnqqroKOhtq2poZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqGop56nm5mpsKminquhoZKhoqOnmJmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJKekpOQjZGdlZePi4aHeHSBgHx0d3mAe3V0e2uCh6R2aV5lbIF1Z4iMfFJWb15LeHNUZFNSX01NU1pnTk1XWWVZR1NpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WUQzj42xoKSlqaOkoqyms7KwqKSwp6q4vsG8sam5qqeusMnGx9DDvsC+ub/Avcm8wbixsLWyury5wLO0vKy5rKO0pqarsLW3saWmubSss7uvvKWtrbarrZypr6SfpKyqqJyeqrKks6iaq6eqpKidoqmnqr2qtLCunamkoK6cmrOjlqWcpaSfpZqaqKulnpqooZuRm6CknZmXqaqSmZqSkIuDj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWTo46UkYuRm5OWh4p/gHF6eX18aHZ8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGFQUllMTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07Rl1AKo2RsJien6ikoqGrpLaxsaSpsKatucG9trGkuayoqLDCyMjMwre9v7W4wbnItsK1tbO1sr25ur22r7m2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6upp6Gpm6OooK28p66wrqGqoqSunp6tppifmqGinJ+bmaOqopqaoqSVlpSfoZablqWsjJ+RkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKOLkpGIkJmQlIGJfXlrfXZ4eGJ6enFvcXR4a4J1a4JnY2dibnOObWJqb2BvQFx5bFVeTlFSS0pNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62hr6+orLjDu7SuoLmvq6i0usfKx7+4wb2vtL+3xLfDs7C6sbLAtru+t6q5uL6qpLWnqKmvrLivp5i5u6OtvrS0oK23taemp7CzoJ6lpqegpJmerKeonqCqr6egppaiqJ+xuJ+ksa+gq6GspJymp6iam5yfo5Wcm5qdqaaWm56okZiTmZ2TmZahqpGbio6Qh32Hf4KOfXyhjY2JeoSOhoyOjYaKk5qOiJWfiZGVgoyXjZJ9hXxzcHxxc3RfeHdpbnFxcGuAdGV6bGdlZGJmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXEZPPVJaZ0gqPzBdXDUolZummJuVrJ6doaOgtqqvo7Szqam5xbezrqC3ra2ssLXFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1p6eqr6qxrqSXu7Wjqrq1r56xuK+ppaevsZuhpKCko6CWm6+loZ6iqK+hoKGSo6Sit7ChprGrn6ujrpidqqWon5ibnaSTmZuanaWpmZubpZWUl5WcjpOYoqmikYqLkIZ6hH6Ei3qOl4qOh3uDiYSKjo+GkJOYjI6VmYuPl36Gl4yQeoF7cHJ3bm9zXnd3ZGxsbGtqhW9ncmlqZWldZHOBYFtrdmlaSn9eW1lOT0tISFNWRzM4Xl9sUEVZVlplTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobapraC7t6WsvcW0sK+jtrCsrK60w8O8s766trCzubi6t7qvrsCzs7mvv8C3rL26taWisqmmqLGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CxpJmepKmonKGfkqSgpLippKeup52koaiToKmioaGZm5yfkpmblp+iqpuamKCUkZWXmo2Tk6SppJCJio+GeoR7hIV8nY2Ki4d7goWIiYqRhpeSkouQlJSNjpR6g5eQi3d+fGx0cmxrc2B3dGhoamdncIdoaGhkZmlqYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1FWFVfYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGhbSldHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequramrMPBuLGso7aup62utr+/vLLBtrCtsra2uLa2raq9s66ysby+t6+8u7Gln7WppKSzpqitnZzAqqekr7OprLW7nqmprLClmJ2pnaakkZilrKGYnaSpoZuhm5afnae1prCqrqCgnZ2hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZiLjpibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeHkYSXlI+Oj5GRkYyTeoOVj4Zzfn5meW9qamtldHNrYmdkZHaBY2VmZmVqamNrcltfWV1sY2FOaVhaYFZKR0hLTVNXPjlebGhIRFZUXVtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpW0xaSlZiZkA6M0JoSCU1mqOgj4yroZaWoJaksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7K4s6mrubGvrrO1urWwuL2spp60qZ+gsKKorZuiv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio98gnOBgYqYhYd9iYqGhouNi5OFlZuTko6PkZaOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gmJmZ2pubGdqamluXWxscnBgVGNpY2ZaSUZNTU9YUVBVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Zk6GaqbGvnri/taC0wbu+urGmt7CnraS3uLe2rLuurKqrt6qzt66msrWyrqmwtbWwsrW5pqiftKecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSVmp+bkJukqququ6CnpKCYmpmdoY9ropaZnHCClZmjgHWSqaeelJSekImYmoCWiqKQeYeUjYNtan93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVFVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qsqqO9xa6pt8K3vbytp7ewpKqit7OxsrC5rKmmrLSlr7Sjqbe1tainq7ayrbSts6Gon7KpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dqKmktrCko6KclpiXl6OIoY6Smoagh5KcoH+lf6aqnpKSmpGIhHN4jY6FiKF2iY1pl4lmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcW+IWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU3MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeWg52rnZiYnZ+qqaeqv8Ousbq8t8C/qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyqK2dqaCwp5+jopifoZqtspOjpaW1vaatp6uqrKiloJ+Yn6ajmZiloqOYnKSolpOim5OTo6WmobikpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytaa7kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFzlHOaoaqQV09XYk9WTkZVW1hRUFONXVdbUUFdRFBORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYunk4GnqZ+XnJ2lrLGosMK9srXAtba+waums6ysqKaus6mutrOmp6W0pae3rZyzsbWrpqSnsK2ssKapnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZuamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5eWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tPWGBcV1Y7TotPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTQuLjUzLysvKC4wLjo2LyckMjAzQi8+O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLG3usGmqLCqrqior66jsLqvo6StsqOpt6eesrKwo6Whqayuq6+mpp2ioa+aoZuWlJaam6yklZqhnrOzoqyco62toJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4OgjoOwdnefcWxsbHyLTqRYSGJimX5jaKZfeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSlxlWVxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YtMC45NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCVh7OmpqGvqaiyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns62jqrSjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUmJ2soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mdoqmbppqcm6Khl5ORkpOcg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFRXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCos6ijm5ydqpWYl5WWk5agqZyZlqetsKmjn4+toqiWnZWboKWgmKGgoaCaoaGnmp6hnpSYmqagnKeVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPy8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKksa2jq7ytprSmp7W6vLK6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CSoaeflZOlqrCmopeTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlZuhnZyllZ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmxl7TCrqiyqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKKkmpKQpq2vpqGWmamgoo6QoZmnpJ+VmaSonZyknqycoZyfjJOfmp2hmZmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkheQjI/OKOemZrBq5e0wq6rrKmmtLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi1q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5ien5CMjKmwsKeel5uopqCMkaOXp6qmlJeop56eoKKtpKGeoYyToZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtTPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGcssCvraurp7ept661v7S6r663tqrAtaipoJulo6Gckampp7SisqetqaCXnKefpKu4naKsmpWYjqOilYydoJuYnJ+Rk5SrtrGomZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOQmKKWoJuWnJahk5ypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYerfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYGZnY214b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5qJueo72hl7LDsK2pqqyxprevtsOwuLCtuK6twLCro6Kdo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn5Ckn5KMnKKel52akZWTr7myrJaYpKinlJCWpJyjrJ2Qn6irnpqfqKKzn6OljqehlKKbnZiVo5iPr5+RlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbZ0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZFpUZmBjXmNRZ2dwbHVDTlFMQzpaTT9LMjsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKieoaLApZa1xLSsqqisqqm5rrDFrbOyrbWmtLisqaGhpZ6gnZmTqqOsqqW1p6afm5Wgo52spLyloKmWk5uQoZuSj6GnoZKdl5SYlbK1t62ZnqSkoouSkaWbpKqblaikpZuZoaimp6SqoZKtnpeknpiXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgZqVlGVeYGJwmYhpcot9hpVna39ydHh9f2JceHSBaFBdboN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtYZmNfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2oqylrqentLGsx6uvsqqzor2wsKWfoqedo5uZmaumrqOktKmkm5iVoJqmrai9p6iklJOalZ+ZkpakqaiQnpGQmJ2ws7+sm6eep6KIk5Gpmqejm5qqoKOZmqOnrKOgrKObsZuUp6CXlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNh5iWjoqMmJaHlJWLhJOUkomOk5SZlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWLioFxgnh5dnWJf3yJanOBdIN1ZXZ9d2tvem1fZF1waE1ZWmZqX1dab3ltbWZVT0ZSOU5ZTVJPKCs6S0I2MzU9QEE6OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6Gzo8ChpLKyt6CppbKnpa+0qseqrK+ks6TAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6qo5WRmpeemJKToZ6eoqeTkpqpqLPEsJqrnaufj5aWqJ2qnJyfq5igmpuipK+noqaooK+Yl6edmZmgnp2cr6CcoKWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYGZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GBiWt1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWt7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLShubC/rKuvsrGgqqeyraKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52ZmbClrb6gq6KQkJ2ZmZSRlaGcl6idhJ6srKO0yLSgqqSrl5WXmqadqJqeo6qTnp+doKqvqqakrKOvm5+goJiknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpF/iIJtd4F4f3NueYR0domHjoN8aodZXmx1ZV1ziWlre3BrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2loLq8uq+stLGqpaitrrCmraywu7CopqOsrbCerJafo52imZmmqpyto6WnqLKunpSij6KvpbW4pa2ijo2ZoJmTkpugmZmllnylr6OotcW4paKnr56clJ6inqOboqiokZ6gnaGqsKuspKuhqpunn6efq5agm6Wvo5abqJWfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558lpiJncC9gZadnYycwcF8gnyTjZrDwH5spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUYmdgeGRfZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6iwrq2lsrOuqaSlpa+rnqqYmqKfnJqqpqGdq6KkqKSktKScopKlrau3s6etopGQmJylkpCgoZicn52Ip62lrK7BwLGhqa6plpKenaGZoaKpo5KgoJ2erK+rrqekpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1leod2dmt8h259hZCRfm2DkGBxbHBoYF95ZVxxZ2pkZ2BSVFJXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrpbKqq6qiq6auqZ+mm5mlmJyir5+gn6ino6WgnrCrmp2Vpq2rsKqoq5+UkZqfpJKPn6WXnqejn6+mrbGpwMezqKmxrpaSnZuhl5+oqZ6UoJ+dna2wqayrnKiopaKrkquylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYudfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmWFb2F3bnJviYqSjoNuk5JmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOfnKKOo6KirK62rqixpaippq2qqqeho52ZopWfpaufoaWfqKiinp2wrJealqmnrquopqeel5SZo6GSlKGtm52no6+tpa62q7rOsa2mrquWlZydopierauclqCZnZ+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJCUoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoGWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6prKKnpamqqqikpqCbpJ6dpqeno5yrmaKsoaOfr6GdmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23ybK1qquplpGcnKKYn6WznJmglJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSpqZCSm42AnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ6SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraykopuyuKyqoKWaqKSpq6qnn6ammKqjoK+rnqWgrJqeqaWdp7WeopeTqaq1saybpJyglI+lrJGanKejoaqnrqKmqKqxtcOys6qsqJOJl5ykmqGjrqWXoZWZnKWmrZyxnq6pp5+rorasoLC4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycICaYLx9UlV0jpKjlnt+lJOMdntzh4BxXW1ueHJqgm9bZF9qb2NlXUtNUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SquKquoJugrLKzpZ6glaWtra2qp5ymp5ujqKGzr6Opp7KgmKiklKK1oqKVl6KptLijm6Gco5KPobGZnpynpqGisK6dpqmjtrPFsK2prKmRh5Ccp5yipJyllp6YmZqmpaucsaKvpaaYr6S7raG1taycnLOwtq+wpJWcrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF+n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq29vry5tJ6Wp6SttaGhmJWjp6atq6yZpqOfpqGhtqijqaewo5Sro46lraOdkJmaqrOzpJyjnKiRlJeun6Cep6SdqJ22mqOrpLatxLCpq6mijISOnKKgpqKVmZmcmZuZp6aoma2or6Olm6ymvayUvK+snaGusLepsKSYp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGpwhpldYFuMoG2VkaaZgpWPmo58fISagGtugGN/dG6AemBnZnFvaWhnQ1phWz1LVTNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcG2wLOemqygrbelo46bpKKgsLCrn6Wgnq2Zn7mho6ugr6maraGQq6iklombkK2wrKaepZutl5iPrKGhnaWhmqWdr5miqae3qsGvpaiknouAjZuan6aekpSYmpSbmqalppuqrK2kpJ6pqL6llsGqqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIWmmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ9Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1ia2hybmdmZVBVZFxBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqp+koZ62maG0qKqsnrCtnqucla+noY6Im4+vq6imoaWZrpKYj6iZop2ln5qko6aaoaOqs6q9r6Sonp2OfYublaCgmY+RmZuSmpipoKOaqa6opaWipKi6np/EpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRfta9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxmbWtjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BQ0VHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraalsqadi5ilwKq4sqiiwKeos52fsp26qJ+ur6WmlZSwq5eMgpuRrqWirKCjnKqfl4qjk6eep5yboamkmaCirK6quq2oo5uXknyImZGlm5KOkJeZj5iTqZqhmaqpoaqnoKOqup2ow6KfrKGpsLKoraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqikm5ivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGhtY0tkWEprWjtRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREZIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XLvrern8GtrqSiqa2guqOkrqytpY2WrqmPi4WWlqyepqqgnaSjoJGLpJOnmamal6Sropefp6aosLurrJqbkpJ8hJeNpZiNkZCYlI6YlaiVoJmpo5uwpp2iq7mfr7+no7Gkqq6vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+WhoGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkXRrkXdyjHh4fXpqbWZlcGVVYFlAaltIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xaV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn6C1sZCNrMi+xru6q6Omn52nn7KqpLennam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiaoba7p6qZmpCNfIGVi6CUipWRlpCPlJemkaCbqaCctaOdpqq2p67AraK1pK2trqqnprC2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5GXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoaOkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9dJd0fIyAc3yAam9mX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY1ODk9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQkJ2ktb2wra2jpJt8n6SzpaaxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqpqpjZqpkJ+5tqSlmZyNiHmBk4uak4qUkZOQjZKXo42fn6ien7iif4OutaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKmraqjZZ2fknN5mpdxgZmpmG1/o6iKZZymnZKXmJaMk52Rhp6bkZaEk4iQkJKJhXdqjoZ2hXB6hX9/YGiHipORilp1lJBnaI+Pc3yonJxme5uKhXqZaoaMhHB6gGtxZmB3cGxraVxmZmJjcVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ipq2lkpWrt7Gzp5usqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56Mq5milaehnY6Xkp2Fdq2PiaecqpKZpIqcu7OnoJmYi4h1d5KNlpOJk5GQlIyQlKGPnKGnmZyxlYGMm7Scs4ySjbmln32nonmgrLR/jY2lnoOLhpCxqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qHnIGXp4OCe52zeoqGoZialZiWgpGXl4SbmmN6h5GFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjoeGmmuQjodseXxycWhmeXBqbGtcZWxqZ3VdXklUTFJARTYuW1VVNykhMDk+Pjc0MzQ2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWVFIOUVMOz5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqapppmTr8nAsqKXqKq3n5GFn62cp6KgjpC+npqNn5qgkH2GjpmXh6ucopagoZGNk4qFgJKnjYejnqWVmZ6HoLqxp56bko6FcHaQiZWQipSPj5uLj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIugnaWnkpjCgH+riJihcp6AmqV+l4WVs4GhfaGUoZCYl4GPlJyLmZKMfYWTh46WkoqDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhZqBj5GJjJpxkJWGanl2fHhoaXZxaGhsXmRwbWduWWdHXVFNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYl5qbVxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6ealaCjpaylmKasuaSwgaKpnaaenYqUvJqTjaGSno96hJaWkYermZubmqKFjox3mpyPn5CIn6WcmJqZiKO5raSZnI2MfmJtj4qTkI2QjI2XjJCSoI+UoKCZoad+oaeHrZ2fla2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZduX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm52dGxqcF9rcW5sallpT11YRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eY3ZgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgY2RjYWNqa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6jmZihoqWtrqGesLakqZOioaCnnJqOmbSakIuejJWLdYGUko2Kp5WVmZ6ffpOFhaylh5uQi5qqmZubkommsaehlZqIiYBpboiHi46OiYuNkouQk6OMlJ+fm6Gkf5OBj6Kgk6B2nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZq0l3N9mJ+zdXRcnrKDa2NwdXhyaXBZa210c2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tK2soJqinaSkpq+dnLOvrZSZopuhpZqblZ6rm4uIknmLhXGBlo6KkKCPkpSemH2Rio6ooYeXjoqSpJWdm42Mqailno+Xh4R+anuGfn2PjYKLkJCJj5Shg5een5yfnouJd5yYoYyfcaGKhqmHmqONlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfnNpdKuDn4N0qmiVml2bhXaFnmeqa4C4Zlyob4GcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRb6iaXql/ebxsf6pcjoRdtGhdb3J7eGxqXHFrenpkYGdYYkJRRk83V0RSbzVLW1tfTlpEQDE1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlYl5iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGwrJ6mnJypoJ+vnJ6yqa6fmKWcoaCZl5ago5mGiY1qiYBye5eIi5aWg5GUmZB6i4SVpJyKlY+GjZ+Tnp2JkKmjoJqMkoqAgGmBhnh/lox6iI6OiI+Wm3+Top6foJOYcmifiZ6Oi3CSjICphpedoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXlVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWR2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mysqmao4ycrJydqpWiraWjqZCgn52bmpaYoZ2WiIeJd4aCb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGcho+qnJuVi4uKfINshIVxgaGLeIWNiIeTmZZ8k6OfnaKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkX+jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn2Gm3B7e5hsnH14mHNuqaRnYWZ6coGFbGhmZW93eGlhY1NcZ1JSYkhYSlVhWFRcZmtcZVFFQ0tNSktCS0U4T0BRTlhTWU9TUWBmZWpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiGe3B9hGh9j4OVm4F3kY6PiW9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAboGfhneAkoaImaOXepSiopmfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpOYi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtueHmYapp8dplzUUV9s19qd2x6iGdraGN1dnFvV19UWWlRU2lKV01ZVFZeaWxvVmdXTUtBSk1LSEtPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq+1oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIJphIWRg4yFnY16jYyXp5SEmKqYjJGLgol6gH2LeHCQoYZ5gpWHiZaglX+UpKablZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11b4hiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallrVlFSRlZdTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnYnBnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafjICYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJmbc3WJfpB7ZYOGlIqJlZqCfImImKiSgaOtkYaQi4KKfoCAjnJpj6aEfYeTjYmYoI+Hk6mlnIimeJWbfqWIloqxl52Pgq6WnqR2k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZuffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3irkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66MtnV4vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlcYFtndWVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkZG5zZFJrZ2hvbHJqZmlhX15cYWtibGx6b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqDmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Zk3R0hnKRg25/i5GHhZSPfXyDh5mnj4Cnp4+BjomFlXaCh5JubIupgIOLlI6JnJ+JjJOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJidoIN7fYlrjIVbeXlyenFpbn6SinKAdYGPlJRxh4SDZYx/YIGAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWMp5l9dHuVaomIcIF2fYd3bm5pjXR6fJh4hVxsWHmPaW94c3NweHhwXWyHb2poV1tgV11ma2RXY1VfUmBweXlta3dnamtrd31yc3VzYW92YnR7gnh1eYJ2f4CAgXmLhYN+e25/bGR5bl5WbmdpdWt4amlpZVxgWmNpZWxxdG5aW2JsZGxseW5obG9hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90coRxlYV7fJGLhoaQhXl+gImbpY58qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIyapp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xpXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqWThGWLjYNud4uEcYaPenFoaWZ9hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x+c3x5dWRudWhtfH52enx7eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGptYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4SGioF7gYWNnKGRg6iiiHiOl4mVioucl4SDea2CkZialYqenYiIoKmeoaGjioeTm5yimZWpoKaknpGahZOLeXaMjYOnfn+SkJOUnbKmm5WfkI2xkpeDpIuMlJqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yRiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6jj4KEjIaCjJCMfYeMi5GEem6Fhn56mWtzaWF0i3F+e3d3cHd1gl1eb4dobmFfWl1dU2lxVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBeH99f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZ3JxbVZebHRtaHl6cWdpa2SMh5y4npahoJeUmJmUmKSgnnyAmqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRzipCGkpGLnJF9jXqqhI6TmJePnJaHhpuknqGZnIWCkpqZmI+Zpp+knJuPlX6Oh3R6hY2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2LiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOQg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8e3FweoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJugIJ9b2lsbmheeoBofn13dnd1fHhdYHF+bnVhZFtdX1JnblRmXF5ia2l3e39ybG1ka2pogX9sdIJsbXVwenCGeW6HgHaCgH2FdnGCjYh+e3x8f3yCi2Boe2p1aWmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop6SkZWYipqfn597eZ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaFh32Qg5GdnZOKqZ2BcYuLjJKGoKGJhYx8p5GJkJOYlJaTeIyinp+dlZh+gJCamJKLmqKgopiVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakYmSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKNf4OGh49peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouBlKOSioSPeoaGh4R2g4SJiXxodH6BenxybWxoX35zaX12dnV+c4FrX2F0d3F4ZWRZX19Sa2lWZlpgYWhqd3qCcmdsZGxoZoCBa25+aG9ybH95h3tsjIFzgYF+gnR2go2Gf3x7f4F+f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgY2ji4malnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gcf3CLgZGThaWbiI2Jg6aVhZOMl5iSkneRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4VxiJSAkoJsiYSCgYqFZnZve4WRmIx8kniLh3t/hnt6cH13iIR4go6HiZaflIGCinaIg4OCd3yDiod4Ynp6f3V/eGhtZmJ/amt4dHV3fnJ9ZGRhc251c25hWmFfW21lU2RZYWFpa3Z6h3Jja2NtZmh9gmxpdWlucGmAfYJ6bpCGcn+Dg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXuYnoyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5aZjqWjmYBzh3uTkommj4yOipKgkYSSkJWXkYuBjpeempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaThJV4cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgoqSoY94g4F0iYd9gHR1gomFcWN8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGplamNod4duZ21pa21ogX17eG+QiHOAg4V9dIGGiXuDfXqChH19jnJ5inh4bWyHa2hfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ8gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnpSnnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6Jh4uRm5KOjIxthJCPkYiemaGglpSIlY9shpeCZYSYjpN6iYSQinCWm5Sjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+Gko+TcXWBfIKDiX1mcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLk6aLeoZ7fYqEd35xcIGHhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtRWFllY2dxcoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZvjoV0gYKDfHWCiIZ4hXx4hIV6f4l3fot7e3N4gmprX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoaabhouLgY+ch5OddoKslpOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26KdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlZ6ZopaYeYp/gIyInJ2Kj4aSmJaFiZWakJaLi4uNi5uJjY+CbYmLkJCJnJahm5aThJaGaIKhgWWEm4mQfouDi4F3k5mTn5KRiYiUjH59jpd7kIyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYN6Z3NudYCZjnqHhHmTkHl1h3Nvh3qEiniJhICGjJmhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXFrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJWThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyhHuDooSUg5aUmZ2Tm3mSe4OMkqOZk46JlZmShIeXmoyTioiNjoacg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPj4yLj4x3epGQeo6KjJKWjHyIfIBrdmtva2xte39hen6QmIJ3e4J4g419emh0bHOGlYp9h4V7ko5xeYNvdot5h4t4h3x/iY6cm4N7enaBinx2cGpsgoR7YXlxb21zdFZfcGNyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hoB1dn6MeXuFgXiIg3OGhX+MjIN7epR4ZnFrg2CIfW9va3pgam51f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHNSTYLfyJLWkntwdYV3haKElXiWkpqdkZp8lHOFkJ6hkpOQiZOclIZ/l5aIjI2HkIyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4ehhJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXt/bXxlcm9rbXt6XIF6kZCBe36AgIePe3tpc2pzio6IgIWEfJSKbH5+bX+JfYqGe4N4f4ySmJiJfHV3g494cm1ncYCFbmt1cGprdm5UX3BlcFpgbXN5aGxrY2d5c3FxZGB4YWBWbGBfd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ+i3N/hn97iX9yiYiCkIqHfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e413c3eKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4VwbW9/c2VleXF9bXl9amhrY6Sawdyu8KBybHaFd4alh5NvmJKXopacgpJyhouil4iNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNm5qYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLj4mOi4qEiW17lYF9iIWJkY+GdoV9fmt9ZHh2a295c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYGCf4qVhGuAdW2Gj4COgnyBeH2Nk5CXj3Ryd4eMdXNxZ3V6hGN1bnFja3doU2FyaGxWYG91emFzZGBpf3Fzb1tkc2FiV25bXnlOTU1lZ2Jed3SKblxdZXlfYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol7dIuJiJaGi39+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYeMaXeAinJ/nIaYp5yjkoR9cYyUeHmMnoWGoY2PfJaNgJqIhHtzeHB0anCCbGptfXVfYXl3e3F1e2dgZHzr2rXJw9yHcmx0g3eLnYuPa5qRkZ6WlIKJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYODiY6NgnGGfn9xd2h2c2p1eGxajX2ShIZ+goWChYuDd2Fya4eBjomAfn6Qj3xtgWt3hI2EkIF6gHt9jpCOlIdtcHmMhXRrcWtyeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGFdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5X15kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WCfX+Id3aKho+YgYyCe5N1bHd2eXiTdG54e31YeoZxf29neHeSgmR2hoZwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lnbXh4XGB5e3txcYBpYWdhf9W2j5Gmd25xeH1ylJKOiWybkIqdk4yHe2mHi5iGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDenCHgJWZjpOSgId0goR0gX6IkZuehpWPn36IYn+Th4WJhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46CkIGGf32GgIWJgHBfcW+Ee42KgHt+kId6cINleYGIhYqBeoR8fZGMj5GCbW55i351bW5qbHx/ZGlsa1pud1lTanNpYlFjc3htY2ZeWmuFb3VjXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BbY2x3ZWVdXVpsbWNtanR3h39xcH98fXR4hniFgn2AiHV5iYGSlXyIhnaIgG94eXuDk29ue4F3XoN/dIJtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIuOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB+ZWNnZ1edj19ydJe+xYV4cpaLkYB0mY2HnpSNiXNqiI+VgHuUi4GEm4x8ioZ9fIiMfpKHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloWSjZ2AiGZ9k4KBhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCjIB6g4KEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhomEgXeCen6Uio6LfG1reoh8dnRvaGh+eGVdcmNZcXRUVG9zaWJOaHV5Z2FeXVhwgXB1WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4KDcW9+e390dYN6g4J8goZ2fomBlpB4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfYx2anmZj4CDi4OWmIp5j5ZveXNxbGpkYHR7aV9mcntbYXN9emZwemFlZI6xsndLY1ql29KYc3yTjZJ6gJeNhpqSjYdvbIWSkXl5k4aAhJmKfIeAeXiIioOUf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5OJko+UhYhwepKEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2HhIx9eHmBhXuDa1xvfHJ/hoOIfISHeohxgG1vgoWNgoJxg3d/loqMgnZsbH2EfnZ6ZWhqf3JhWnhcWnJuT1hydGdgS253dWJeXFtZdn90cFhnXmdrcmBvT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/iG9sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fm9yfHuTcG+Bf3hnkYqCoZidkoOGZ4eEcGd6l4p/gIWCmoqCfI2NaXhybGxmX2Fvem5fY3B5XWRsg3pgcHZfZGXV676LMzo+jI+Ac3qHi5GPeIWZjoCUj41/bm2FjIt1fI9/hYKViXyDeG52hoWClXZth4RrdHt1ZXmDhKeMg46LgnxtfnJ0gniEmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3dheYSCcmRxaX9udnJ1g52NgoGHgHR2foBzgXBba3xzd4iBiXqGf3yIeHlwaoaCjoKIcIB3fZOIiX1zbWp1gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXFeXFtaXXaAdmpaYltoZm9kak5YZ1I+X2ZcXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugHt9gX+Ce3aCgoyThXCAi254fYB7e4iTiYBpe35qdHxyhntzd35/jHp4hH58a4uMg5udloyCgG2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGJsdWFocIl6YXNzXmJkm6CQbl02W7C2dWuBi3+UiHeImYh1kIyKd3BthYKGdHmJeIl9k4h6f3NndYd9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8j4pxfH6GfGl+bWuAe3lqeneCh4FyX3eCfnJkcmh2g251fIaWk4J+g4FweHp8dX9tV219dXOJgIV2hnWBiXp3cmyHf45/g3F9e3yQhod5bW1obIKBdG5caGZ1clJcfE9dcl1PXHNwZFZLdHlrWFpZWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin19cH9+fIF/gnt3gICKjIRxe4dvcneDf3uJjY+Ean57bnh5dot3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWKknl+fIKSgIB+i4NwcnBjZl5YZ19wcGBhaHFmam+JdGFzb1thY2p2e3+/nailyrlyh4Z0lX56iZWEdZKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeH+SaHGDdmZ2dWNqfISInoJ/fo6NfHF9coJ3fY+OgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9Z2B3h31ranRofIFqdoGNkpZ/fH9/cn13fHV/YlV1e3Fyh4GBe4Jwhol3d29ugYCLfXx3fHpzjISAdGdwZ2uIgXFvXWhjdG9MZndNX29WVVp0bmJRUHV5Y1NYWF1icoN0XWJcaWVlZGxlUVxxSURlYlxkcl9deGhVV1Z4XltmbmlXbF5hamdlb25pcHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHeDc253goJ+iYuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWHjZF6f4B8ioaEd4+AZ3BuYGVcWGVabnNhYWFxbWxoiW5gc2lYXmNtgHep2qnIh4izc4t6cY93fYmRgnuUi4B1dHV9dn9vcH9uhXSUhnh1bGB5gHiHjWRxgm5ndW1bbX2BkJOAgHiSkXx3emyFc32PioNylYqRj4iGhnt/hm51d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y358aHWHj46XfXaBd3KAe31ugFpWcXxvc4GFfX93a4iGc3hqc36Cgnx5e3d6cYl/enJmcmRsi4Nsc1pqYHZmSW9vTV1jWFdWeW5iUFN1d1pRVlheYXOFcF1hY25lZF5vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn93eH13gYSBfHV9g4iIg29xf3VxdX6FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXFmV1xja398ys6HuqJrbm+MbnOGc36GjIB7koV6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZHmAeGl1eWeCd2h1iIyPln5ziGtwf4B5bn1dV298bHJ9iHqAbW6JgHB2ZnZ+f36AdHpveXKFendwZHFgbYyBa3JXa195XUlwbE5YVl9UVXxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZZHFIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6UinV/e3h+eYOIgHV0f4aFjoNwb3t4d3V6hoWGjIZ6fH91i399hoSEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSi3CFhYJ6g3VjbmpZYFpdXlRoc2VhWWRycmeBcmFrZVdaX2l/eL6ue6C3bmN1iGl2fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV/cJmScH92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNh5eAcYxobHuDdW11YlttempyeYl6gGV0hn1tcGd0fXZ9fnB6anl5f3d2b2RrYGyKfWxtVWpgeFZMbG1QU1BoTll9aGJPVXZsTVFUVV9od4RnXmFxaWdgV2pdXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312dIKIgJWDbnN5e3tzc4WGiIiEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dqdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1aXFtUZXFlX1hjc3VpdnBlZWNXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bXmIfGdsd2ZqZFVXc3COpnyEe3aWj3N7cXp4bHl5j4N1l3yIhoSHhH11cXNtaHVdbWlgbHVkZ2dpem97cllngXZ1aHCAeIJ2YneFi32Wgm+MbG58gXFmc2VganhmcHWIeXxhdIN2aWtwc3lveXhye2V9fX12dW1iZGBshnxsalVpYnJUTGtsUE1PcEhefGZhTlZ1ZUtPU1hibHh/Zl5nc2tlYFdkWGNyXkxMbFhkYlVUVnRXTVl3ZVpfbGFcW2RlX3ZnbWJwanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdnSRgHyBlY6BhYR8foyGen6Adnqjpop5iYaFbHV9fHaEg417b4ZzeoV9goN1b2ppZVZdW1taU2NvZVtZYXR7amhtaGBhWF5aaYBpbG+AaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnhuaW9mZl1VWG9oj6h2gXp8kI14dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNydGpvgX56eGJ3hYV5kYZ0iXNwen9yY3FoW211ZG9xhnp3YXJ/cGdpd3Nxa3d2c3Vignl8dXRvY2JhbHx8a2tVaWJnVExuaVBIU2tGYnlmYk1Ucl5KTlVaZm14e2ZfbnJqZF1WYVZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZmB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4Rxc3R+enZ0hYiQfoF9kWxzlYF8g5+Ff4d9gX+GgoCKe3aEq59/eoiIhWxxgnt2gYCCdW+Ibn2AdIqAanBuZWRYX1paWlVia2dcWl91gmlebWxcYVdbXGuBZXJ0fWprXm14d2l2eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCnbn53gIuNeXBue2V3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX2x1ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB5c3Z+dGFwbFhwcWFub4J6c2NxgGxhbHluaWh5eHNwZIRzeHhzb2NgY2xzfWlrVGheX1VMdWRRSFZiSGN3ZmJMVHFZS01YWWlsd3tlZW5yZ2NaWF5ZeGdVSl1kWGlZWUlXZlBJY3lbXl9tW15dYmRef2lqYG90eW1vbnaDl3lygYB9f4mMhn52doZ4hox9c3V1gnl6eoKMjn1/hYlqdJeBe4udfn6GeoB7fnyGiXNxj62Me3yHj35mcYl7dH59d3Nwhmx8fm2QemNwcGJlXmVWWllXZGZsYF1ddIVoWHBtW15YWlxse2Nxd3ZuY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3VmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpGh4dIKFkHdsbXhmdmx7g3l0h3KBeX15gGlmd21hZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOEk4CJhIl7d3BzfXJheGNZbm5gbm9/enJlcYBkXm11aGNmd3pybG2Bc3F7cXBhXWRsbnxlaVNnWVpVTnpgUktaWUhjdWRhSlVuVUtNWldqbXN7ZGxtdGNhWVpcYnhdVExkXllqVFdIWWFOSGt3WV9hblxcX2JjXIVpaGJueHptb2p2gZB5bYJ+gIGSiISBd3WJdIuGdHJ2doF4fX1+jI+Bf5N+cHiWg32Zk3mAgXd5fn9ziIRzcJmhe3t/iZV5ZXWJenN5d2x1cH9seXxwknNecG9haGJsVFtaV2lkbmZcXHKJZVNybltaWVdgbHZjanVra19bb3VybnV1dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fXCAXGFjXlNaYVxkkp5lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmJbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiICGdnRrcHxsZndXW2lsYW9wfndzZW99W2BvcGJeaXB9a2pyfXBvdmluX1pka2x6YWZTZlVYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhXFpYWm1xWFNRZ1dXalRVRlpdT0lzdllgY25jWWFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG6PhnFudnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBc3+BcIeDdm+il3N7hoyHe2Z3i29ufHBneXJ7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21dVlhVZmlzaGN1ZWVeW3B3b3F2dnpsiH1/fYh3j3NjZGtvYVxubWNzeIdrWlRWYWJ2e3tvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFteV2JkWWJ1ZVVgYW1kYXFdXH5vaGlzcXRxdXdsbYWVg4p9hnJzZ298b3FvUlplaWRvcX50cmJsdVVicWpaXm5ke2RrdHtwcXFobF5YY2lqeF5lU2RVV1FWb1hSV1RQSGVzYGJGWGtPSVhUV25pZXxpbHlrYlddVlx1ZVRTWGlSWmdVVElbWlBOeXdbX2VtaVpiYV9ej25iZ2t5dm5vaXZ2f35sg4B9hph7f4eBin9rk4hyZ3OAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2lUYF9VZ2BtcFxebo5oTWlsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7f3ecenlrYWVsbV5gb2plcXl+Z1pVV19rdnp5boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKfIhucWZwe2xxbGFYX2dmbXF/cnJeaWxTZXBkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT1xPUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVX1VedlxVU2FoT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHFzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPiJGbhIB7jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp8fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fX1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJOTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6PjYyNjY2Oj4+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4V3ZWdmZmZoXENEREREQ0dkaGdnZ2dna29ubW5ucUorLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyOLhodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoKCg3JdX19fX2FSNDU1NTU0OVxgX19fX19lZ2dnZ2dqPBgcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYqKioqKiomFg4ODg4ODhYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5CNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo2NjY2NjY6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYmJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd3eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWHjYmQiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z3e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMiY+Hjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEioyIjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjYuNjI+Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgICAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqLh4eJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Pj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj5CQkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhYWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkVFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BAQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BAQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtAPz08PTw8QD09PDw+Oz08PT5BQEJBQEBAQkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnl7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4+Pj09Nzk/PT0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09Pk5TVVJMQ0BAPz5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFHZmhsaGFfT0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJSVdqamhpaGZnT0RHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NU213cGltb3FlS0pJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1Ucnh4cm5vb2xNR0lHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpISUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNSlt3eoJxbm1tbEtDQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHJydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SkpHW2doamZpc3pxQz07OjxBQUA+PDk5ODw8PDs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVZkamxhZWx4gGU3OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYplYm9wbGhrcW14UTM4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk4NjY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hxdXZwcHVwam5LNDg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAgICAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoh2eHd2eHJtbUo4Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjYJ1eHt4cnFqSEFBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjH94e3p6a1dMSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkRGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ6Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH55endZTlNNS0tJSkpKSUVEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyOiXp6dV1RVE9MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMjI2NhHl6dF5RUE5OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyNdnZ4bVRTUE1MSUdESEtITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5/ZGdtWVhVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VEZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvYWNvZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gYCAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmpZPltbWlVSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9dHNbXl5dVFVTV1dWW1t1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUU9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIqAal1dXltWV1VYVFNYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BOTUtKRUM/QDtQUFpaW1NTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gX1gVVlbVlRXVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6alhbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpwc1pOT1FRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1ZVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFgUEhCRUVERERBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl1cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQz08PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBQTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVFQkJDPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSUNGPzo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn59e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTUtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRUNBOz08PDo9RzY2NzdEbXB0dnl7e318fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3t7fXt8e3l8ent+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFdXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEZDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUlBST1NPT1BMTU9NTE1NTk9OW1dLTVFPR0lIQ0lKTExLRkZGRT9CQz48Qkc/Qj9BZHBzdnp6e3t8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0pGREhIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hJR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pFSUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtMSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRkdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDRUVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0lISU9SUlNOUmZmZnJvc3h2e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NFR0lJR01RSkZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09NT05PT05KSklMUlVVU09XZGBgbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86Pj1AQj5AQURHSkZJRklIRkZHRENCQUFGRkNCQkNERUVHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MT05PT01OT0tLS09VV1ZVU1hfXlxpYW5qbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJra3JNR0dGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtJUU1KS0hISUVGSEhFQ0lKSUtMS1BTTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWNqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERkNERkVGSkVFSUdDR0hGSEdFQ0ZLSkhOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhISElEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tJTUtKS0xITEtMS0pOS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVtdXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QkFGQ0VFRUlGRkVHRkdIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTVBMUFBRVVZXT0tWVVRSU1FSTE9SUlFWWlpdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2Zrb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTVRVVFJRUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ2xvc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRTw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdjaGhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxIS0xLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkI/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpKTlBPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFREVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUUtHS0pKTkpISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjY2dgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXV0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFpQSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlWXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkNHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQEhGS0lLTEpMSkhGRElGREZHRUZKSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdJS0pKSURGS0tLRUZJSk5LTktITE5HR0U+R0dLSUtMSktLSUdESURDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdIRkdISEZHSUdIR0hLSUxEREtLTk1MS0hKSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19jaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0tJSUdESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYWZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0pMS0lKR0VKTlFRTk9PTU5MTUhLQURCQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBgZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUEhLS0tLTk1VTk9KSktHR0tQU1NOUE9OT05OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYF9hYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTR0pPSklPTVJQTE1MTE9SVVJPT0lLTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZlteYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01PU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdsd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVMTUdKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUFRQUFBRS0hneGxjeHJtW0xOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Jydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWFXbkxxcF5GaHlXdlRLaHl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ3VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NcWmRcYW1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWW11cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNTWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFNaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xaWllYV1xaXFtgXl9bXl5hYF9iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WW15qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFpZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltZWlNPU1FWVlZUT1dSUlpSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFlbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVltYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllUV1RXW1paW1lYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXVVSWFdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFphZWJmZmVeYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZVWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VYWFtaX2BcX1lZXFxdXl9cW11ZW2BhXmBkY2RlZWViWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fW1peXV5eYV1bW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFddXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZWZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVNWFdcaGlraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3p6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7enp7fHt7fHx9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPTxL2+v76+wKKKjIyNjY6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OXTzMzMzMzPqo2Pj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDg4KCgoKCgoJ+fH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5eXl5eXl5ent7e3x8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18ent4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXt5e3h8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9enl7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGBfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIioiGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoKBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHN0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcXBxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcm9vbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJwcHBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXBufIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxb3KYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJh4eJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgIGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQioqKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJudnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4OEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgIGBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOPlZiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4eFhoaGh4iRk5GQjpCOkZGMiYiFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIiHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4F/f3+BgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4ODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4OChISFhIODg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoODgYucmqGaioKCgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGJkpCMlqOjj4GCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhYWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgpOUlpiSl56ciYGCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SEi5mUmpmXlpWShISEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhISRlYOJlpiWlZSIhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhZ2TgYGYmZiYlouFhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hYWIoaCbm5+eko2QioeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAiJqgmpqjopuMgYyKiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uUoZeWmZ+fm5iLi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgoODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGVk5CXmJOYmpeNh4eHiIeHiYeHhoiHhomJhIOEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKDg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCRjo+QjpOYmYqDhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoWQjYyPlJeUhICCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp7e4iPjY2Pj4Z/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fH1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4uPjZCGfn5+fn9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf31+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIp/f39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g5CNlYyBgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7h4iUlYSDgYKDgYCCgIKBgYOCg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goeRhIOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp9gYd/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSMgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp6e3+CgIGBg4KAfn1/f3uIkXx8jpaAfX5/goaKhYODhIOCg4yJf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4ODhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4GBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgYCAfX59fn9+i4SBh359fHx/foKCf318fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX59fXx7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn5/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7fHt7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX1+fXx7e3t8e3x8e3p7e3p6ent+fYKGiIeIioqLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCCg4OBgICBgYCBf4CBgoF/f35/fn6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x7fXx7ent7eXp6eXp7fn+Dg4SIiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYCBf3+Af4CBf4CAgYKBgYSDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enp5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgYCAgoSBf36Bf31+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fn6Afn1+foCAfoF+f4B/f3+Af31/f39+f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOEg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX2AgH+BgIGBgICAgYF+foB/gYCAgYGAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgX+Af35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B+fHp7enx7fIKBf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEg4KEg4GDgYCAgX9/f3+AfH19foB9fn9/f399f3x+fn6Bf4F/f35/gH+Bg4KDgH9/gYGBgoGBgYCAgYCAgH+AgYGBgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f31/gHx/f319gYCAfn19f35+goCBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSBhISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fX9/f4GAgX9/fH6AfoCBgoOBgICBg4WCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIWDgoOEhIOCgoKDgYKCgX+BgX2AgH6AfX59fn+AgH9/f39+fH6Af4GAgYB/f31/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf31/gX9/gIKCgIGDgoSFhoSAfn18fXx8e3l2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R1hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoKBgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fX19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHt7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9/f4B/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fX59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4F/f39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgYGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBf4CAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+Bg4J/gIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx9fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGBf4KDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCgoODhIOBgoKDg4ODgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4KCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiISFhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhISGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4aFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIRqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhYSGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6Bf397f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSFeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgX9+fn9/f3p+fXx+fX9/fn2AgYODgIKDgYKEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoaDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4GBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t9fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4SEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fH59fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIh4eGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J+f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhISGhoeGhYSDhYWGhoaGhoWGh4aGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn5+foB+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaFh4WFhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDgoJ9gYGAf4OBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aHh4WEhoWFhoWEh4SEhYSIhoaIhYWEgoWFhoWGhoeEhoaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5/gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhYSFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgISAfIF/fX6Cfn6AfoB+f319fn1+e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeGhISEgoWDg4aCg4WFhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+AhH98gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHt9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaHhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX6BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx7fH5+fX+AfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B+f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4WFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fX+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn1+fX+AgICGg4SFhIWChIKChIKBgIKAfn1+f35/foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeGhYWEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af3+Af4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb28vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbV1tbW1tbX1tbX2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ68lYicnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuyrsHJmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquKTWlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+ks5/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uVodCKkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmarR26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2rkqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SdsaSlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNadko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3OTg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBwcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFFXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVRiUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFMDhZbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSm+heEF7d2RhUFFbR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDA1qZDe4yAdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkaOXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqmdiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbKsqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpMvUxba/v8C/uru9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQmG+pyMjH0cGvvb24ubu7vre0sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm1uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e0uLa2vLu5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLaztb24uLi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y0wMHAvbu8wMO6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBucK6xb/Av8LIvcfHxsW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7u3tMG5wL3CxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC9rKvAs7u7wb7Ays7KxL21vLu5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9v6WVw7S2tb2+vs7MzMK4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsKggae2qrC+wrrSycjDsbC0tLW8ub66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u66/n3J6o42TnJ+lw8K/vayqr62yure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7CmtKF5hKeXkY+Qjo6ZsLSlqKmuwbWzsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennaequsXL08CkkJSXgoOgoKSlvMSsrqewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiYzubh4d/VxqeRiXltcZehqcGmqKihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2rqKamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aVm9vPxsbMz8y/m31samV7pcaql6Kin5+loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPjs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUk66cY3KQtMbHx6t8aWluZpS1i5uen6GcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzX1pecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpehSy1IWoizwsGrgHGDiYN4fZSinp+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko1xlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZWchFJrf2lglK+unoOBnZ6jmn+qqqWhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVocnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmHxrkKKLXnCZmI+LjZ6jpaent7WwprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3ZebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZiln5GBgLPKypNig4WGj4iVoKOhrry+uKy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqqWNfoGw1NKxdGFze4N4jZaZlaXAwL61ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamtkH1wpNWUe4dLWnB0cYKDeniTvcjCv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKuuro6FZoOof3x2X2JgZGloY1tSdsDKxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb+/v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqK2spd0fXx6en55e5KEZVxQbGlaPG7Oz9DEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2OTo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2EpJmGZXx4d3+Pl5yQaWhmZKildT+k2M/Rws/T1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoSQhl5fXllXcYN9fFxTcVWKt4ljz9XS0MzQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHSyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0hn5PT1JKUW97bH5sU3JakqyCkdDV1NDJz8zS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5tcXFycnZxVE9OTVxhdWZ6hXZZZ4OMdJ7M0tHNxs7MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzczQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltcnFdSkNNTl1bYHFiSF1vZ1aRxs3NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MTFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWl3g2BGREhHQj9NTFFUZ15Ol73HxMDCv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH5xW01JRzhGP0NTSlRkWJSvv7i4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt0gW1YS0NOVzk6TUZIW1SVorOws7KysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8XAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQURGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhoand7X09RWUU5OEZJREphn5ekp66qqKqnsqy0r7Gnraarsru5tcK5ubmvqrS5u7PBuq/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcLGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqemxPWltEQDs2Oj1NipqRlJ+kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Szu7ezvK+4ubWyu8GywK+lqaOrsbOzqL2qq6irrK61tKaorqGlsKmzp6eorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8XDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG13XUxKVlZRUT5Cep2RjoeZnKWgoJ6jo6WlrJ6bmqOkq7Gutramr6umqbOrs7mwtbWttrmysLq6sbaloKWgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVma3JXUGBnb2pafI+WjIuClpqcopqcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqafqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubuwtry7uquzsrmzvbS3srG1tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRvbGV0fG9KT4KQlIqMhZOam6Obl5mipKCimp2fmZesq6ytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezrqmtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFxdnlgPkxgco2JjoiOmJebmZKdnaahnJ2mm5qYqaStrqmaoaK2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpabmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsbCwr6+nqKeyrbG0sLy0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncG90UjEsKT94jo6JjJSYlpqRm5ukoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGuq7WeoJ2VlamhopStsbGfoqOenpibk4ugk5GTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhvbkkrHylFb5ONh4qOm5ObkpeboZ6poqGioaGgmqepopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in5+XmZOKnZGNkpOWkJiYk5yho5yloaKVoKKkpZujq6WipKqkqq2lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9ia2pKOy89SVyHjoWJiZOUnJaWm6SkpqSppKekoZajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvpK64paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNwbE1CT3Rsa4SAi4ePkZqZlZqmpKKqqKWtoqWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKexvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgaWpmbGR1dmF7fIuBjIuQlJKXo5abpqOiqJuklZ2imJCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW7tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSUlBRVFFTVVFOTUtLU1dXVldXV1daXGFlWmBbbnhldnKFeoWBjImMl5uKlZegnqCXo5OemZOLhZeZi3OMgn2Nl5WFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6jo46JmqCho6SborSvrK+toJimuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraihppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaWGlxa2ZGUGmJeo5/hZaRho6Mm5WalZWUkYyUiH6SiF47Vm57i5OJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqJ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVVNkbGNGOTh6joqIdoGNh3+FiJeKlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTk1NVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZl1WYWlaWlFLiH2NgGx3f3t3gIePfpCZi455g419c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iYWBjVmiBjpKJi3Rgcnpwc3qEjHmBmJJ+b4SNenV5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXF5gXFl5mZy8e21wXHRxaXZzg4x2eYmDbWqJkHdyd2hpf4FxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRV1VTm3tYkGBqcF53amh5dYaFcn6EgXFqlo9ycXppaZyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhPR16mqphncm9ldmdsfXyAfXaAgoJ2b52Scnd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGZiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZOHlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRnxqdXJybndncIGCd3mAf3uIe3Oel3h8hH6DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtcZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQERDP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWT0dgeH9ygHJ0a3aJhnV4hIN6koN1nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhZKph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQT9DQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs7yzl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZrV1laYoGJfIt5fHp/i4x6gYSMfZaRf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaT0xOV1JRSFBKRE5HQ0pEQ0FEQ0I8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pOVl9femRjaG2Qj4OQiouEh4iUg46LmYecnI+gp6KhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFeaoR4b3t2k5KPnpyak5uQnZGYmqSapKecpqmnqLOWqr2qtcfItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktPTklJTEZHTUNITUZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuTjo6Kn5KXnZabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWqBinONg5ecn6u1sZ6opqijpLCorbOurqq4r7G8m7HDqrnJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldob1h5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVNW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd+jpqAppyooKi4wb2lr8GzqbC9sLW6s7yyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYWJXeXRxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NUFCNzY0MC82Q0hDUVtPUVVXVVxXT19VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09ei56on6ytuaywucbEsrjBu7GxvrS1v7K8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6OhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgouEln14enVlUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVNgX0xTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZCqsrC2ssK3tLfFyri5v7q2s7m5tbyyuLDEX3OwpLGanqq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGRfWWNgamdTWGFWUlVJRUVNSkE+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+dH16a2VwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0urHBura1x8i3tLi0t7ixtbOyrbS1l2N0p5ytb16irJuXoKKbpJ6qpZSfn5CTjpWYmKiepqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeWmBjWmRkUVxgU1FKQ0FFRkU8QEY+QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmampoYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrTDrrWuuLmyr8LEs663r6+6qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXm5WWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpmWlFdWE5QQUJIRUJIO0FDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscHh+cXpteHNtaYBwbWNqbXB4aHd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstaqxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXk5uRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PXzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuAc3JpcHF6eXJ6vsuafYuxhHZyhHZoYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn56fpqSprreppbKhoa2goq2hprGeiKaak5KRiY6NiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSZjoaTkZ6XqLCioaGlpKnJzc/Iw8zR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVlpUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZWAg253cG12f3Z4fXSFfHpth3Z1b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6SwoqOxnqGknJ+on6Kxm4WdkZGRj4qKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIubkquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFhGR0tJRUU9Ojc6QEBCOkdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtvfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qdqJ6gq5uhmZidpJ2eq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaOdYJ0dYF+dICEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlpmWlaSbl56VnZKRlqKdmaqVkJCJjJGCi4OIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJOflJCNjY+Kfo6NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk6Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WboZudlJJ/jIiAmIiAnJJuiKiFeqGLfJGNg4iEnH2akImMo6OgkKSvn4qQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyOlJaQipGThX+Kh5GMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGymJ2SlJehop+ZkpydqLO5raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX56gX2Ge3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXcoqyjYSokoSZk4WZjKKVn5eSiZueo5OqsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZmajo+TkoaTloN+j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztaajvMK+x8XFycjJwsvUzc3UqdLR1tXW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6WdmJCnl6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKXk4uKk5KGk5eFg5CPm3OQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjV2NYUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox5fYF7eIaLiYaEkqi8ramzvbClrrO0qaOisK2KmrWeo7mllaykl6mtuKalo5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieoquSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46UjIqMlpiRm5m0lpSqnYublJGNkJKLmJqJkZ2Pi4qWn6KNlY2YmZ2SnJielKGglJydpq6noqSzuKvCyMS1ur28xsjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoByh4d8gYl1goqDf219fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO2jKiyra69q5u7o6itubirp6aioaOjqq+ysaqdnKOYm5iXnqKmpZKjua+ov7ysrbK5paOnfYiGna28sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCem5ifoJSan6inpKKjsLOmwMbDsLC7tsXEw77Mp8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlZiQk5WotMbJwMLMwsO5yL26sKu5u5eytrmywK6lwKSrsLy9qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqrEw6SCi46Gh4SGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZmkn5qgm6CUmJ+mpKWnpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nusC9vMS4rMGprbO8vqqxqqSlo6yutK63taCfrp+mopijtLypnKi8waO2tq+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYuPj4+Vloh8jpWSkaKalKCinLamkJ+XpKSjpZ+eppielZebpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFtaXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6PnY6Wjp6SiYp/iZ+ShHiFf5R+f5CIiZCAlqCarqekmMO+yMTIxtLNzs3LvMK4sLq9tL3Lu8TCtra8rbS/uryur6ihqKi2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tl5WlramgkY6SscWnlI58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKjI+Pnohaj5aXkpakmWaZo56zpZajlqutq6ecn6aXmZaYlaGkqKaetaupurzCtKa0tcvBuKq1rLO7uK6ouLq8t4RwcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeoloyQg4alkoiBh4Kag4OVkJCTjpqhn6++rqHHvsXFyMfOzs7Syr67trG7u7y/z7bEvre5t7OytbO4tKynnKusuaupqLCwmKOupaikpbTAsKustL7CucC5s6e4tLeyr5WkrbCwpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YioyPlZ1fSpacmpSZpJdUlrCfr52fpZWvsK2lm6GllJOZmI6dn6ahmbSpqrO8u7ursLLHwLimq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiRl4eKp5aNiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjNzce/u7OvurjAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaImpalm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJ2CbXWSopqVnKKfkK6yoquWqqqYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTkhJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FMVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvrqyr7m1wMLKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvbuorL20t77HvLa1uMCwvcCzqrW3rL+mj6KWkKCfu56JmqCYlp2djraeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqC1sKSlk7Krmqutn5+lpKqSlpWghJCen5yVqaWhobO0uratqLWysp6co6Wal5WZqqGeeGRgYWBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5WZmo6qlpWoppWsrZmiq7fFwry/uMHCwMjEv83GvL65srC5tL/CyLbAsLy3urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0ubi/sL7Bt7WytbC+pJajlZKak62fkKGipKKinpC9pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqymnJezp5qwqKCcq5+ijZqWoIWOoZqckqWlmpersbayqqWqraycmKCgko6QlqmflGlmXGNfUUpIS09MR0VESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa5tbSxtLS3wsa3v7G4tbq1oKesq6yenp+lpMGloKquoKSprbCipqi9taWxvLe2tsOys7e6vrLDwLe4rrS1taOcpJSRk6CsnpihnKioqqKawayonautmpqdmKWfvaGcpJeqqquloJiNmp+SnYiNV3+WnqWhoLmqp5OZt6Ofs6KhnLCYoY+blZ6Cj6CXl46io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYk5KS0tORkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gmkqmjn6Oeramrnbuxqay1scjEwcOzwsO9x8S9xcq9sLG2rrG1r7/Ftbqxsbq2rJupsKqqm5+moafBrZussZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq6roqWVlZOiq6Cen5qnqq6ur7uxpZ+oqZmYl5Kio7egoaORra6rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco6+bn5ywkaGVmZWbgJKilpCOoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7s62wtbTHv8TDtb/EvsrFtsHJwrWstamwuay/xLS4r622uqaZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyp7m0uLK5waq3s8O9tMWnvq6tt7WpqKyhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKCdmpmalZeooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZm4aXoJSNkJ2ek4upqauhp6CanpaNj5mQgoaWiZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW+paiurqCptaqdt6+ro6q0trGwuLewt7i4xb3Dx728w8LIwbrCxsK6qralrbutwcO4uKqtsryjla6wrrOXpqiRqrqqoKawnaqgr7Szqqq2tay7rLOyuresubDCur2/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaaqn5ufn5qdpZ2hmJ2jtLCcn5GUppuhqZyWo6KYmoyXmpSWl56UiZGbmZSOqamnn6OcmZuTh4+Zi36Ml4WPm2xpbmJub1hRUVpUQUNEVUA7OklBNzpYUGReUVdXRVlfXk1MU09eTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKCqr6qisLeopLOyq6Gttb2vs7m9u723t8HCv8nDucTDwcC5xb7BuLC2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1vK2wsbWssLWywLrFtqu9r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7KqsKmim56no56VoZmcqLapmJqSkp+ZnqGgkq2hm5qIl5qMnpqdlIuPl5eal6amo6CelpaWk4CQlYR7j5ODjJdnbXJocXNfR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbX15OTVNYY0pLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcaEs1jHpmTEClmZ+krLWjrKikrq21qK6zuKansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyqure7ur61q6+xt5iYqKyrrJyuq4+rvZ2rrrGjqZ+xrbOurrWxubaqra+yqLawtLq8ybKqtbSxtLCvp6Gzn5qoq5+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy4opiTkY+YnKGZmJWuoZ+Xg5Wajp6dmpeRipSTnpqlo6OhmZaTkpV7jJCFe42Lg4uTbG55b3Z9YUZgalpJSFpbPXtKR0U2QWNUaVtNXWFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2s7ejrLO3ybu1u7u/vrW0t8PAzMe8w723v7/BuMC9sr2uqLq6uLfCt6yusbqWl6euramksqmUr7ukrLKypqeisrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp+fp7Cfo5SbmJSxnqebn6mNqaKdm5WXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVjo+MmJ2imJGZqKShmYaUmJGenJiXl4mXkJebqJ2loZKWkpCVdoSQhnuGgoSNjW5xeHZ8gFxMZWxcS09kXT9ie0dJOEdoV2VcTF5iTVlaV1RYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpaKwsbKpt6+1n6u0uci5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLywrLS0nqGnsa+mp7GlnbG1rKqysKuoqLW6rLWytauzrKqrqaypua6ysci/uKS5sKmtraaorbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inaOoqpygmpuTpLWaj4mOiJGjoZaPlp+jl5aHkZWVnpuZl5WImJOVmaedoaCNk5GOkHd+j4R9fH2HiopydHN/fn1cU2NuXk5aZ11GRJZbRzpNblhhW01hYk5WV1ZXVVloXlFTTWNbW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoaivpKajs7Ows7SwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6yzub3AsayyraKkp66rqKWwo6qwqq6qsa6urKuzu6e3sLGosqqrpaWjr7qsqrHCubSsuampqK2pp7GlqaSiramoop6boqyVpZ2XnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mapJiZkKGomIaEj4uKn6GQjY+YnpKSiImSlqGdlpmWh5eTk5elnZ2djJKQjYl/f4iEfHd/h4WGdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPZFxOVlZVV1FcYl9TUE5oWVhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1ramkq6q9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaeosaWzraqvra2wrrKts7ult7OsrK6oq5+jnrG3q6qturaktbWkqqerrKqtoKimprCxo6eloaGrlqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlpCYnZOBgpCJhZ2gjYuQjpyRk42Fj5qlm5OSm4yTkpGUo5qcmouPi4t8hoKCgXp1gYOBfnV4iqKGeGpdX25mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVktPaVhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Xqaittaq1saqkq6qpvMHAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsq+trK2nt6qmra+qt66nsK+usaq1qra2p7S3q6ykqaqcpJ60s6iopLO0n7Wtoaqoq6irp5+rrKi4tamqqamiqJ+tm5GqoZ2gpKKmoqqdnKa0rqelqaKjl6Smp6qcoqSjoJqYn5GPj5mNf4eMh4SenomGjIyRkZOPhYiXo5qOjpuSkpCPkqCYmZeNi4R/dIaCf354dYN/e3h+f4edj3BxZmZwd1xhdIhqT12YVkhteVVkVlJjUE1WVFVRT1hbYlVJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+ppK+pqLu/vMGysLmtoravyMfI0MC/vbq8w767xMK/v6+ys7K1vbzBsrK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhtq2poZ+usqC0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqCop56nm5mpsKiin6uioZKhoqKnmZmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJGekpOQjZGdlZiPi4aGeHSBf3x0d3mAe3V0e2uDh6R2aV5la4B1Z4iMfFJWb15LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKOlqqOjoqyms7KxqKSwp6q4vsG9sam6qqeusMnGyNDDvr+9ub/Avcm8wbixsLWyury5v7O0vKy5rKO0pqarsbW3saWmubSss7yvvKWtrbWrrZypr6SfpKyqqJydqrKjs6iaq6eppKidoqmnqb2qtLCunamkoK6cmrOilqScpaSfpZqaqKqlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWToo6UkYuRm5OWh4p/gHF6eX17Z3Z8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGJQUllLTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJien6ikoaGrpLaxsaSpsKatucG9t7GkuayoqK/DycjMwre9v7W4wbrItsK1tLK1sr25ur22rrm2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbCjnKWpqaOdm6Swpq+gn6qpp6Gpm6OooK28p66wrqGqoqSunp6tppifm6GinJ+bmaOqopqZo6OVlpSgoZablqWsjJ+SkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKSKk5KIkJqQlIGJfXlrfXZ4eGJ6enFvcXR4aoJ1a4JnY2dhbnOObWJqb2BvQFx5a1ZeTlFSS0lNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62ir6+orLjDu7SuoLmvq6izusfKx7+4wb2vtL+3xLbDsq+6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oK24taemp7Czn56lpqigpZierKeonqCqr6egppeiqJ+wuJ+ksa+gq6GspJymp6iam5ueo5Wcm5qdqaaWm56okZiSmZ2TmZahqpGaio2Qh32HfoKOfHyhjY2JeoSNhoyPjYaKk5qOiJSgipGVgoyXjZJ9hXxzcH1xc3NfeHdpbnFxcGuAc2R6bGdlY2FmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdXDUolZulmJuVrJ+doaOgtquwo7Szqam5xbezrqG4ra2sr7XFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevsZuhpKCko6CWm6+moZ6iqK+hoKGSpKSht7ChprGrn6ujrpidqqWon5ianaSTmZuanaWpmZubpJWUl5WcjpOXoqmikYqKkIZ6hH6Ei3mPl4qNh3uDiYWKjo+GkJOYjI6VmYuQl36Gl4yQeoF7cHJ3bm9zXnd2ZGxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFNWRzM5Xl9sUEVZVllmTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobaqraC7t6WsvcW0sK+jta+srK+0w8O8s766trCzubi6t7qvrcCzs7ivv8C3rL26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CypJmepKmpnKKfkqSgpLippaeup52loaiToKmioaGZm5yfkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWIiYqShpeSkouQlZSOjpR7g5eQi3d+fGx0cmxrc2F3dGhoamhncIZoaGlkZmlpYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1EV1VeYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequranrMPBuLGso7aup62vt7+/vLLBtrCusra2uLa2raq9s66ysLy+t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmprLClmJ2pnaakkZilrKKYnaSpoZuhm5afnae1prCqrqCgnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrYmdkZHaBY2VmZmVqaWNrcltfWV1sY2FOaVhaYFZKR0lLTVNYPjlfbGhIQ1ZUXFtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJWksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7O4s6mrubGvrrO1urWwuLyrpp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd9iYqGhouMipOFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZaSUZMTU9YUVFVYWWAVUFXU1lURklGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvnri/taC0wru+urGmt6+nraS2t7e2rLuurKqrtqqzt66msrWxrqmwtbWws7W5pqiftaecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSWmp+bkJukqqupu6CnpKCYmpmdoY9ropaZnHCClZmjf3WRqaeelJSekImYmoCWiqKQeYeUjYNtaX93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qsqqO9xa+pt8K3vbytprewpaqitrOysrC5rKmmrLSlr7Sjqbe1tainq7ayrbStsqGonrKpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dp6mktrCkoqKdlpiXl6OIoY6Smoagh5KcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ6qqaeqv8Ovsbq8tsC+qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyp62dqaCwp5+jopifoZqss5OjpaW1vaatp6uqrKikoaCYn6ajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytae6kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFdRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ2lrLGosMK9srXAtba+waqms6ysqKaus6mutbOmp6W0pae4rZyzsbWrpqSnsa2tsKaqnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZyamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICUeHlqpzdKr1xYU2xkW0tPWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLK3usGmqLCqrqior66jsLqvo6StsqOpuKeesrKwo6Whqayuq6+mpp6ioa+aoZuWlJaamqullZqhnrOzoqyco62soJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSltkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCViLOmpqGvqaizrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUl52soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mcoqmappqcm6Khl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFQXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaeap7itoq+xn7O0sKCknp+mqbCos6ijm5ydqpWYl5WVk5WgqZyZlqetsKmjn4+toqiWnZWboKWgl6GgoaCaoaGnm56hnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKlsa2jq7ytprSmp7W6vLG6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CRoaaflZOlqrCmopaTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlJuhnZyllZ2VmaKelZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmwl7TCrqizqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgoo6QoZmnpJ+UmaWonJyknqycoZyfjJOfmp2hmJmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F8gmuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkhfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi0q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkaOXp6qmlJeop52eoKKtpKGeoYyUoZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t4f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtSPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZMXjgxQzimnJuevKGbssCvraurp7ept661v7S6r663tqrAtaipoZulo6Gckampp7SisqetqaCXnKefpKu4naOsmpWYjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOPmKKWn5uWnJahk5ypnJSPqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWZnY213b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qqquxprevtsOvuLCtuK6twLCro6Kdo6Gcm5Coo6mypLSlrKSelZqqmKasuJyhrZiUn4+knpKMnKKdl52ZkZWSr7myrJaYpKinlJCWpJujrJ2Qn6irn5qfqKO0n6OljqehlKKanJiVo5iPr5+SlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpbTT9KMzsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Srqqisqqm5rrDFrbOyrbWms7erqaGhpJ6gnZmTqqOsqqW1p6afm5Wgo52rpL2moKmWk5uQoZqRjqGnoZKcl5SYlLG1t66ZnqSkoouSkaaapaqblaekpZuZoailp6SqoZKtnpeknpeXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBdbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2o6ylrqentLGsyKuusqqzor2wsaWfoqedo5uZmaumrqOktKikm5iUoJqlrae+p6iklJOalZ+ZkpekqaiQnpGQmJyws7+tnKeep6KJk5GpmqijmpqqoKOZmqOnrKOgrKOasZuUp6CWlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiWjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVT0ZSOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKyt6CppbKnpa+0qseqq6+ls6TAp7OgnaOknKOVlZ+qpqyiorarn5iWlZ+XramkwJ6ro5SRmpadmJKUoZ6eoqeTkZmop7PEsJqrnaufj5aWqJ2qm5yfq5ihmpyipK+noqaon66Yl6edmZmgnp2br6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWx7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLSgubC/rKyvsrGgqqeyrKKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52Zma+lrb6gq6KQkJ2ZmZSQlaGcl6ichJ6rrKO0yLSgqqSqlpWXmqadqJqdo6qUnp+doKqvqqakrKOvm5+goZeknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJueIJ4f3NueYR0domHjoN8aodZXmx0ZF1ziWlrfHBrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq8uq+stLGqpaitrrCmraywu7CopqOtrbCeq5afo52hmZmmqpyto6WnqbKunpSjj6KvpbW5pa2ijo2ZoJiTkpqgmZmllXymrqOotMW4paKnr56clZ6inqOboqiokZ6hnaGqsKyspauhqpunn6igrJagm6Wvo5abqJSfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3eQg46BdXmAf3lxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6mwrq2lsrOuqaSlpa+qn6uYmqKfnJqqpqGcq6KkqKOktKScopKlraq2s6etoZGQmZykkpCfoZiboJ2Ip62lrK7AwLGhqa+plpKfnaGZoqOpo5KgoZ2era+rrqikpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1le4d2dmt8h259hZCRfm2DkGBybXBoYF95ZVxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbSrpbKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6rsKqoq5+UkZqfpJKPnqWYnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp6UoJ+dna6wqayrnKmopaKrkqyylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYydfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmSGbmF3bnJviYqSj4NukpFmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SUlARDw+PUBGRUNFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOgnKKOoqKirK62rqixpaippq2rq6aho52YopWfpaufoaWfqKiinp2wrJealqinrquopqeel5SZoqGSlKCtm52no7Ctpa21q7rNsa2mrquWlZydopierqyclqCZnp+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoKWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6orKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKYn6WznZmhlJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSoqZCSm42BnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ2SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramyrKylopuyuKuqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7WeopeTqaq1saybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylmqGjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2ZraawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycYCaYLx9UlV0jpKjl3t+lJOMdntzh4BxXW1ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SruKquoJugrLOypZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO1oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5Ccp5yipJyll56ZmpqmpaucsaKvpaaYr6S7raG2taydnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF/n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhHQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq2+vry5tJ6Wp6SttKGhmZSip6auqquYpqOfpaGgtqejqKewo5Sro46kraOdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqKVmZmcmZyZp6aoma2or6Omm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGtwhpldYFuMoG2VkaaZgpWPmo58fISZgGtugGN/dG6AemBoZnFvaWhnQ1lhWz1LVDNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6marqGQq6iklomakK2vrKaepZusl5iPrKGhnaWhmqWdr5miqae3qsGvpKmjnouAjZuan6aekpSZmpSbmqalppuqrK2kpZ+pqL6klsGqqaGgqrC3qauknbKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIanmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ8Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFtBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTk9RUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqZ+koZ62maG0qKqsnq+tnqubla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qko6aaoaOqs6q9r6SnnpyOfYublaCgmY+RmpuSmpipoKOaqa6opaaipKi7np/FpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRf9a9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraWlsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WmlZSwq5eMg5uRrqWirKCjnKqfl4qjkqaep5uboamkmaCirK6quq2oo5uWknyImZGlm5KPkZiZj5iTqZuhmaqpoaqnoKOqup6ow6KfrKGpsbKnraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqiknJivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHqAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XKvreqn8GtrqSiqKyfuqOkrqytpY2WrqmPi4WWlqydpqqgnaSjoJGLpJOnmamal6Sropeep6aosLurrJqbkpJ8hJeNpZeNkZCYlY6YlamWoJmpo5uxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+VhYGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn5+1sZCNrMi+xru6q6Omn52nn7Gpo7annam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiZora6qKqYmpCNfIGVi6CUipWRlpGQlJemkaCbqaCctqOdpqu3p67AraK1pK6trqqnp7G2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5CXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoWPkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9c5dze4yAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQj52ktb2wra2jpJt8n6SypKWxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqZqqjZqpkJ+5t6SlmZyNiHmBk4yak4qUkZSQjpKXo46fn6ien7ijf4OvtaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKnraqjZZ6fknN5mphxgZmpmG1/oqmKZZymnZKXmJaMk5yRhp6bkZaEk4iPkJKJhXdqjoZ2hXB6hX9/YGiHiZORilp1lJBnaI+Pc3yonJxme5uKhXmZaoWMhG96gGtxZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56MrJmilaehnY6Xkp2Fdq2PiaebqZKYpYqcu7SnoJmYi4l1d5ONlpOJk5GQlI2QlKGPnKGnmZyxlYCMm7ScsoySjbmln32nonmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qInIGXp4OCe5yzeoqGoZialZiWgpGXl4SbmWN6iJCFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuW1VVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVtiYWhmWVFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkH2Gj5iXh6ycoZafoZGNk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSPj5uMj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIygnaWnkpjCgX+riJihcp6AmqV+l4WVs4GhfaGToZCYl4GPlJyLmZKMfYWTh42WkomDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYV5pbFxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvJmTjaGRno96hJeWkYermZucmqKEj4x3mpyPn5CIn6Wcl5qZh6O5raSanIyMfmJtj4qTkI2QjI2YjJCSoI+VoaGZoKd+oaeHrZ2flq2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYKUkoyKppWVmJ6ffpOFhaykh5uQi5qrmZubkoimsaehlZqIiYBpboiHi46OiYuNkoyQk6ONlJ+fnKGkf5OBj6Kgk592nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tKytoJqinaSjpq+dnLOvrZSZopqhpZmalZ+rm4uIkniLhXGAlo2JkKGPk5SdmH2Rio2ooYeXjomTpJWcm42Mqailno+Xh4R+anuHfn2QjYKLkJCJkJShg5eeoJ2fnouJd5yYoYyfcaGKhqmHmqSNlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0RSbzVLW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKSboaCZl5ago5mGiY1piIBye5eIi5aWhJGVmJB6i4SVpJyKlI+GjZ+Tnp2JkamjoJqMkoqAgGmBhnh/lox6iY6OiJCXm3+Uop6foJOYcmifiZ6Oi3CSjICphpidoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyfn9vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mxsqiaooycrJycqpWiraWjqZCfnp6bmpaYoZ2WiIeJd4aBb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGbhY+qnJuVi4uKfINshIVxgaGLeIaNiIeTmZZ8k6SgnqKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhYSlVhWFRcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiFe3B9hGh9j4OVm4F3kY6Pim9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAbYGfhneAk4aImaOYe5Sio5mfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpKXi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtud3mYapp8dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2lKV01ZVFZeaWxvVmhXTUtBSk1LSEpPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq60oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY6JjIFphIWRg4yFnY16jYyXppSEmKqYjJGLgYl6gH2LeHCQoYZ5gpWHiZagln+UpaeblZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallsV1FSRlZcTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJibc3SJfpB7ZYOGlIqKlpqCfImImKiSgaOtkYaQi4KJfoCAjnJpj6aEfYeTjYmYoI+Ik6mlnIimeJWbfqWIloqxl52Pgq6WnqR1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaSlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66NtnV4vo2kk1qDp46rYXVzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlbYFtndGVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhX15cYWtibWx7b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Yk3R0hnKRg25/i5GHhpSPfXyDh5mnj4Cnp4+BjomFlHaCh5JubIupgIOMlI6JnZ+JjZOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJieoIN7folrjIVbeXlyenFpbn6SinKAdYGPlJNxh4SDZYx/X4GAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWNqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11na2RXY1VfUmBweXlta3dma2trd31ycnVzYW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5WbmdodWt4amlpZVxgWmNpZWxxdW5aW2JsZGxseW5oa29hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90c4RxlYV7fJGLhoaQhXl+gImbpY98qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xqXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCJjqWThGWLjYNud4uEcYaPenFoaWZ9hXuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH52en17eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGpsYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4OGioF7gYWNnKGRg6iiiHiOl4iUioucl4SDeayCkZialYqenYiIoameoaGjioeTm5yimZWpoKaknpGahZOLenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZGbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6kj4KEjIaCjJCMfYeLipGEem6Ehn56mWtzaWF0i3F+e3h3cHh1gl1eb4dpb2BfWl1dU2lyVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBd39+f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZnJxbVZebHRtaHl6cWdpa2WMh5y4npahoJeUmJmUmKSgnnx/mqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRyipCGkpGLnZF9jXqphI6TmJePnJaHhpuknqGZnIWCkpqZmI+Ypp+knJuPlX6Oh3R6ho2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOPg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8fHFxeoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBofn13dnd2e3hdYHF+bnVhZFtdX1JnblVmXF5ia2l3e39ybG1ka2pogX9sdIJsbHVwenCGeW6HgXaCgH2FdnGCjYh+e3x8f3uCimBoe2p1aGmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop+SkZWYipqfn597eJ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaEh32Pg5GdnZOKqZ2BcIuLjJKGn6GKhYx8p5GIkJOYlJaTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakImSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKMgIOFho9peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouClKOSioSPeoaGh4R2goSJiX1oc36BenxybWxoX35zaX12dnR9dIBrX2B0d3F4ZWRZX19Sa2lWZlpgYWlqd3qCcmdsZGxoZoCBa25+aG9xbH95h3tsjIFzgIF+gnR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgI2jiomalnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gbf3CLgpGThaWbh4yJg6aVhZOMl5iSkneRnJ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4Vxh5OAkYJsiIOCgImFZnZve4WRmIt8kniLh3t/hnt6cH13iIR4go6HipeflIGCi3aIg4OCd3yDiod4YXp6f3V/eGhtZmJ/amt4dHR3fnJ9Y2Rhc251c25hWmFeW21lU2RZYWFpbHZ6h3Jja2NtZmh9gmxpdWhucGqAfYJ6bpCGcoCDg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXqYnYyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5WYjqWimIBzh3uTkYmmj4yOipKgkYSSkJWXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaTg5V3cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgouSoY94g4F0iYd9gHR1gomFcWJ8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGpla2Nod4duZ21pa21pgn17eG+QiHSBhIR9dIGGiXuDfXqBhH19jnJ5i3h4bWyHamhfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ9gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnZSmnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6JiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5Wjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+HkY+TcXWBfIKDiHxmcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLlKaLeoZ7foqEd35xcIGGhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtQWFllY2hycoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZwjoV0gYKDfHWCiIV4hXx4hIV6f4l3fot7e3N4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabhouLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26LdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlJ6ZopWYeYp/gYyInJ2Kj4aSmJaFiZWakJeMi4yNi5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEm4mQfouDi4F3k5mTn5ORiYiUjH59jpd7kYyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYJ5Z3NudYCZjnuHhHmTkHl1h3Juh3qEiniJhICGjZqhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcYuAdX+DgXl2gIuAeIV/eIiGd4OFfIaLf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJSThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyg3qDooOUgpaUmZ2Tm3mRe4OMkqOZk46JlJmShIeXmoyUi4mOjoacg4+Je3KLhYqOh5yan5qVk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPkI2Lj4x3epGQeo6LjJKWjHyIfIBrdmtva2xte39hen6Ql4J3eoJ4g4x8emh0bHOGlYt9h4V7ko9xeYNvdYt5iIt4h3x/iY6dm4N7enaCinx3cGpsgoR8YXlxb21zdFZfcGJyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWBzVFFPXWdlXnlwiX1gXGlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hYB1dX6MeXuFgXiIg3OGhX+MjIR8epR4ZnFrg2CIfW9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHJSTYLfyJLWkntwdYR2haGElHiXkpmdkZp8lHOFj56hk5OQipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4eihJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXx/bXxlcm9rbHt6XIF6kJCBe32AgIaOenppc2pzio+JgYWEfJSKbH5+bX+KfYqFe4N4f42TmZiKfHV3g494c21ncICFbmt1cGlrdW5UX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ9i3N/hn97iX5yiYiCkIqIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KBybHaFd4akhpNvmJKWoZWcgpJxhoqil4mNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNnJqYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLkImOi4qEiGx7lYF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYKBf4qVhGuBdW2Hj4GOgn2BeH2OlJGXj3Ryd4eMdXNxZ3V6hGN1bnFja3doUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXlOTU1lZ2Jed3OKblxdZHleYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol6dIuJiJWGjH9+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUeHmMnoWGoY2PfJWNgJqIhHtzeHBzanCCbGptfXVfYXh3e3F1e2dgZHzr2rXJw9yHcmx0gneLnIqPa5qRkJ6WlIGJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p1d2xajXySg4Z+gYSBhYqCdmFya4eBjomBfn6RkH1ugWt3hI6EkIF6gHt9j5GOlIhtcHmMhXRrcGtyeYJhdWpwXWx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WDfH+IdnaKho+YgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2j5Gmd25xeH1xlJKOiGubkIqdk4yHe2iHipmGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCHgJWZjpOTgId0goR0gX6IkZudhpWPn36IYoCTh4WIhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46Cj4CGf32GgIWJf3BfcW+Ee46LgXx+kIh6cINleYGIhYqAeoR8fZGNj5GCbW55i351bW5ra3t/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BcY2x3ZWVdXVpsbWNtanR3hoBycH98fXR4hniFgn2AiHV4iYGTlXyIhnaIgG94eXuDk29ue4F3XoN/dIFtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIqOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB/ZWNnZ1edj19yc5a9xYV3cpWLkYB0mY2HnpSNiXNqiI6VgHuUjIGEm4x8ioZ9fIiMfpOHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloaTjZ2AiGZ+k4OBhoSKiXKCfmd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCi4B5g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhYmEgXeCen6Vio6LfG1reol8dnRvaGh+d2VdcmRZcXRUVG9zaWJOaHV5Z2FeXVlwgXB0WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGpzd4KDcW9+e390dYN6g4J8goZ2fomBlpF4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCi4KWmIp5j5ZveXNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql29KYc3ySjZF5f5eMhZqSjYdvbIWSkXp5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5KKk4+UhYhwe5OEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2GhIt9d3mBhXuDa1xvfHJ/h4OIfISHeohxgG1vgoWMgoJxg3d+loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnNuT1hydGdgS253dWJeXFtZdX50b1hnXmZrcV9vT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/h29sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3hmkYqCoZmdkoOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2Fvem5fY3B5XGRsg3pgcHZfZGXV676LMzo+jI+Ac3qGipCOd4WZjn+Ujo1/bm2FjIt1fI9/hYKViXyDeG52hoSClXZth4RrdXt1ZXmDhKeMg46LgnxtfnJ0gniDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udnJ1gp2MgYCGf3N2foFzgXBba3xzeIiBinuGf3yIeHlwaoaCjoKIcIB3fZOJin1zbWp2gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXBdXFtaXXaAdmpaYltoZm9jak5YZ1I+X2ZdXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugXt9gX+CenWBgYyThXCAi254fYB7e4iTiYBpe35qdHxyhntzdn5/jHp4hH58a4uMg5uel4yCgW2Nfmxpf4+OfH6Ag5SCf32KiGt1cWdpY1tjZ3NvYGJsdGFocIl6YXNzXmJjm6CQbl02W7C2dWuBin6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251fIaVkoJ+g4Bwd3p8dX9tV219dXOJgIV2hnSCiXp3cmyHf45/g3F9e3yQh4d5bW1obIKBdG5caGZ1clJcfU9dcl1PXHNwZFZLdHlrWFpaWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnt3gICJjIRye4dvcneDf3uJjY+Ean57bnh5dop3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWJknl+fIKSgIB+ioRwcnBjZl5ZZ19wcGBgaHFmam+JdGFzb1tgZGp2e3+/nailyrlyhoV0lX56iZWEdJKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeX+SaHGDdWZ2dWNqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3h31ranRoe4FqdoGNkpV/fH9/cnx3fHR/YlV1e3Fyh4KBe4Fwhop3eG9ugoGLfXx3fHpzjISAdWdwZ2yIgXFvXWhjdG9MZndNX29WVFp0bmNRUHV5YlJYWF1icoN0XWJcaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlXbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ9dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdpCAZ29uYGVcWGZZbnNhYWFxbGxoiW5gc2lZXmNtgHep2qnIh4izc4t6cY92fYmRgXuUi4B1dHV9dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW1bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGFieIZ6aHV2Y358aHWHj46WfXaBdnKAen1tgFpVcXxvc4GFfX93a4iGc3hqc3+Cgnx5e3d6cYl/e3Jmc2Rti4Nsc1pqYHZmSW9vTVxjWFdWeW5iUFN1d1lRVlheYXOFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn92eH13gYSBe3R9g4iIg29xf3VxdX6FgYiNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXBmV1xja398ys6HuqJrbm+MbnKFc36GjH97k4V6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXmAeGl1eWeCd2h1iIyPln5ziGpwfoB4bn1dV298bHN+iHqAbm6Jf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JXa195XUlwbE5YVl9VVnxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZY3FIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOIgHVzf4WFjoNwb3t4d3V6hoWGjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSim+FhYJ6g3VkbmpZX1tdXVRoc2ZhWWRycmeBcmFrZFdaX2l/eL6ue6C3bmN1iGl1fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV+cJmScX92c4BsfoCPhnGUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNhpeAcYxobHuCdG11Ylttempzeol6gGV0h31tcGd0fXZ9fnB6anl5f3h2b2RrYG2JfWxtVWpgeFZMbG1QU1BpTll8aGJPVXZsTVFUVV9nd4RnXmFxaWdhV2ldXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312c4KHf5WDbnN5e3tzc4WGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dpdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1bXFtTZXFlX1hjc3VpdnBkZWJXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bnmIfGdsd2ZqZFZXc3COpnyEe3aWkHN7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97cllngXd1aHCAeIJ2YneFi32Vgm+Ma257gXFlc2VganhmcHWIeXxhdYN2amtwdHlveXhye2V9fX12dW1jZGBshnxsalVqYnJUTGtsUE1PcUhefGZhTlZ1ZUtOVFhha3h/Zl5nc2plYFdkWGNyXkxMbFlkYlVUVXRXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36XhW5ydHx7dHGFhY+CgXqLdnSRgHyBlY6AhYR8foyGen6Adnujpop5iYaFbHV9fHaEg417b4ZzeoV9goN1bmppZVZdW1taU2NvZVtYYXR7amhtaGBhWF5aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnluaW9mZl1VWG9oj6h3gHp8kI14dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV5kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGdpd3Nxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIU2xGYnlmYk1Ucl5KTVVaZm14e2ZfbXFqZF1WYFZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhb3B2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxyg3t2gYCCdW+Ibn2AdIqAam9uZWRYX1paWlVia2dcWl92gmlebWxcYVdbXGuBZXJ0fWpqXm14d2l1eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCob353gIuNeXBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB4cnZ+dGFwbFhwcWFub4J6c2NxgGxhbXpuamh5eHNwZIR0eHh0b2NgY21zfWlrVGheX1VMdWRRSFdiSGN3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2dVSl1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gnl6eoKLjX1/hYlqdJeBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYl7dH59d3Nwhm18fm2QemNwcGJlXWVWWllXZGZsYF1ddIZoWXBtW15YWlxse2Jxd3ZtY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3RmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpWh4dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlld21gZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOElICJg4l7d3ByfXJheGNabW5gbm9/enNlcYBkXm51aGNmd3pya22Bc3F7cXBhXWRtb31kaVNoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVExkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5bYJ+gIGSiISBd3WJdIyHdHJ2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmhe3t/iZZ5ZXWJenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbmZcXHKJZVNybVtZWFdgbHZjanVqal9bb3VybnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fnCAXGFjXlNaYVxkkp9lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiH+FdnNrcHtsZndXW2lsYW9xfnhzZW9+W2BwcGFeaXB9a2pyfXBvdmlvYFpka217YWZTZlVYU1F4XVNQWlJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIaBn4l1gYCBdH+CcIeDdm+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21cVldVZmlzaGN0ZWVeW3B3b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYWJ3e3xvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXdsbYWUg4p8hnJyZ257b3FvUlpkaWRvcX50c2JtdVVicWpbXm5lfGRrdXxwcXFobF5YY2lqeF5mVGRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35tg4B9hph7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2BtcFxebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gb2plcXl+Z1pVV19rd3p6boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKe4hucWZwe2xxbGFYX2dnbXF/cnJeaWxTZXFkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT11PUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPh5GbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWGioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+Pz9BQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0/QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtERDw8PTw8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6O0xSPT09OTo/PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08T2hLQDw4PEE/Pj5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFQbl5UUEhBQ0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSVRoZ2VfYFhGTU1GRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NXGloamViZ1phTklJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1mdm9oa2lsbmFHSEhHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNTmx4dm5tb3FwUT9EQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SklSdHqDd3BtbG5WOz87OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVlrb3pubG9xc082OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYpnZGpsY2VpdYFzPDQ4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4dzcW9mZ3ByfWU0Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYd4c25vc21xYTk6Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoR3dXlyb29dQkJBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjYF7e3ZzcVZLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH96e3ReT1JMS0tJSkpKSUZEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUJDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt6cFxRUk5MTktKS0lLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2NhHp6eGRQT01OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMdnd0cVVSUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5+ZGBoXVdVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvX15vZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmlZPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9c3NbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpvc1pOTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf316e4B/g4KFhoeChoaGgYSBhoWGdmFeT0dBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e319fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0tGQ0hIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDREVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01RSUZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09MTk1PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87Pj5AQj5AQURHSkVJRklIR0ZHRENCQUFGRkNCQkJERURHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUNFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtMS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSEhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVVRSUlFSTE9SUlFWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAREE/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSkxISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTVRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dKR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSEdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSUhESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU1MTUhLQURBQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MRkdYTEdISkhHTUxRUEhLS0tLTU1VTk9KSktHR0tQU1NOUE9NTk5OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTSEpPSklPTVJRTE1MTE9SVVJPT0lMTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVNTUhKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVVRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF9jXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWFdZWV1iWl5XWFtcW1xcW1pcWlpfX2BgZGJjZGViZFphZWNmZmVdYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VXV1tbX2BcX1hZXFxdXl5cW11ZW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtbXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFhdXV9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZmZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6e3t7e3t6enp6enp6enx9fXx8fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPYWiUqKioqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDhHhzc3Nzc3N9hISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9e3t9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJqdnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5GQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4eLh4KCgoGAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4GAgYCBgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4KHiIKChIODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDgoyRgYGEhYSDhIOCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOBjpuJg4ODg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGOnaGloJGEgoOEgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDg4uSj5mmpZeEioiCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SGj5SVkpigoJiUhoOEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhIeYl5uYlpmYmpOGhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWDjJuJjZmZlpSTjYeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hoSWmYB9kZiYl5WPiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAi5+hk42am5eVko2JiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uVo5yboaGfkIKKi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGTlZagoZuUh4mIh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58en+PlJmbmpqVjoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoOPkY6Vl5iPgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDg4OCfn1+f4CAgYB+fX19fX59fHp7e4aMjZGUloV/f3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4mNjZKJfn9/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIqCf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9+fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g4+LlJSCgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl6h4iPloeDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goSNh4KChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYN/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7e3+CgIGBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx8fH19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foKGiIeIi4qLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fn6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgYCAgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Af4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDhoWBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoSEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf31/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgICAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6e31/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4KDhIOEhIWDhIWGhIWGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1+fX9/fn2AgYODgIKDgYKEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiHh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGiIWFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYGAf4OBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKBgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIB/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fXx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpYGRTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tbT0tLT09PT09PU1dTU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb29vLy8vLu/0tLS09PT09LS09TT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamosNLS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0tXT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/O0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0q2Dg5XP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpMqbvLiZtbOgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ6zpo2BjcaemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1mKOKq9a6mKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaqu4qtq5ulsZmWsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o5GNpZyWp5CZhJ2To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWoqi0qp5/oKmFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmavP2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2nkaGenpmolpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6ScuKSro57DoKukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNmpj5Cs18KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC/1tLVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD46OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6empaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTg5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Oz06Ojs3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCSkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qampmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7OTo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6enp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9rlqWVn3+Jf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxZcX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9Oz86ODw5OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xxlIaCS19wcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULzA9eId3d0BEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVNdSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI2CdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueKCjmpVlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6jRopqzqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPyLCap69rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26RzLuUk6SWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBDQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRYn7a9pqeaiHdrcW94eXt+ho6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuVhoaGfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUURpeGtudG5rZWVZV11YXGNqamlmYWmKtcHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmnnZSGcl5RVEtEW2VeY2plYWBoWVRYU1ZZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5sXl9lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJiaWNgW2NfV1JPUFBWgLS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdUVneat8C7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQl2+qycjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI5+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSVSnvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjkN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwHlSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urJwY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGhfXNrrcjFxL/Awb/Lx8PAyMC6wb/Ds7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMK1rK60tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM60doCzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5F+wMTDvry/u7u4tsHCtcG6gKCwrK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJWcpZahcK7JxMC9v7mzrrK8uq7BfnCiq6asur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaLoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLCipXKly8K/ubq1rqWss7CppFSAlqGepa22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4h49vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/GdoOqnppkp7+4tbKxra2fpKanpYhJg4+ZmJmfqa24q6qqnqSppKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3t5WMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vZCisqujcquwqautq6OooJ2enaRvSnuGiYiFj5uoraOio56rr6Gjqaihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU5AUnhxUElJS2abgVlFUq67sayzr66srba2srS1r6mmn5qbnZ6mqJ6gqKmfoaeWm5WnemJubHuDfoCIm6ifnp+huqSlnaOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSl9JU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52olJqVoLWeg36NkYuDenuMmZ2cp6qSqpyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx8ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOeeE9uS0tiZXRzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlcPaw7q2oZGMjIRza3qZn7GBm6uhn6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx49XU0lkpFxlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYlqrh3dXV0bmhioqLdWZgjryhcqquq6aisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemZ29tbK+w8TBsZSAeGxpYY20cYa3uLawp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnZ6WnZesl09ag6O3vLaif25laGlygV+qur2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmZ+ZrGZBUlp6o7K3qIJoYWhxcGCBx76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqioKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ipJtsb3tqYYOmrqZ/Zmh5iIx+s8fEwsfBwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpK2NdHyilWVmlJ6ZeWh8kJ2iqcHNy8bIxMXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqKxiHKPuMWbYnuKhXRxiJShpaW40czMzc/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2Fn4VphLXXl2psdnJ4d4OQm5ubttTT0s/Sw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Buc4KJZmyntWh8Y19ldHB4iIqJiqfV09PR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzc/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfX2FgXmBgX2BlbXBwbWptb3N1gGheg5iKg1lMWmdicXhyamiX1MzV1NHKz8zT1tLR1c3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGBeYF9eXGJtcm5tcHBycnZzZ2lwcWRYUFFXWGFiXFdLp9DJ0tLOxs7MzdTLztLMytbW0MzQ08vM0NHTys7R1dLV1sq/ysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltdW5lcXNyeHBWT05UeXdVbsHAw87Ox8XHzcrRx8rNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWpzX2V8hoVoV1pOVqCWZZu6trvHxcHDwMPIycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobnJbbXBvWUtdXnmhiW2gsa6twLm5u7m4wMHBw729uLy+uMPJxMbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt2d2ZgaGBGZmJ3gW9el6qoorSxtLOysrO7tLuwtq+zrrG6wbvAxLy/urSyur7AuMe4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhoanhwU2VuZF1XYl1MWpmmopimqK+rqauosqy0r7Gnraarsru5tcK5urmwqrS5u7PBua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdseVlSaGNFS1pTPl2Yn5qTlqCmq6Kmoaqoq6qvoqWeqay0tbC8uK+3r6ituLSzu7ezvK+4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5yQkZFRERGU0lelpyTkIqbnqWhoZ6kpKalrJ+cmqOlrLKwtransKunqrSrs7mwtbWttrmysLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbWYzNUI9NUdDbpWaj42El5ydo5udnaKkoqadmqGanqqurLG0o6ipqauspLS4rLavrLK0rrO1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVxUjE6NC84Ql5jjJaNh5WcnaWcmJujpaGjm56fmJitrK2usaCkoq2rp6G1sLGxrKivsqe6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZ3BQUT8sMSskOmullYmQmpmcmpOenqeinJ2mm5qZqqausKmboqK3qaGgrqi1qqanrbCkt7Ckt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFgYV9fYGJocGhKMSIcJkpJf5aLjpWal5ySnJyko6GkpZ2bnqWeqq6ln6CitqehoaKos6Klp6WvpbGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV5fYWppRzo0LzppfHCEi4yQnZWck5icop+po6KioaKhm6iqo5mdo7CpoaCdpKqeqKKerKyqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKWoKKkpZujq6WipKqkq62lrrKppqWnprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFlcW1tcXFxdXF9ia0s1QkJSfYZ3e4qLi5WVnZeXnaSlp6WppailoZekrKKUmKStqJ+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJmNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmZjVVhsbXyBeoCCjYmRk5yblpunpaOrqaauo6aXnaqelJSjp6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkI3NTg4OTs5Ojc6Ojc8PTo7Pz46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganBqcGV3fXiDfY2Cjo2RlpOZpJecp6SkqZyll56jmpGNnqGZlpaFhJGao4+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1daXWFnX2NecnhzfHSHfYeDjouOmZ2Llpmhn6GXpJSfmpSMhpiZi3ONgn2NlpaGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQno6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaFxeW2x1bWlHUmuKfJCBh5eSh5CNnZablZWVko2ViH+TiV87V297i5OJgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWFjWlZocGVIOzp7kIyKeIKPiICGiZiLlZWJkYaEk4V4iH9gSlFud4qRg36EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTk1NVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZT1FTU1VaaGZcZG1cXVNNioCPgm95gXx4gYmQf5CZi496hI1+dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXVlNVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5obWloWWuDj5SLjHZidHtydXuFjXqCmJJ/cIWNenZ6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVJPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWFnY158nKC9fG5yXnZzand0hY13eomEbmuKkHdzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqyzv6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRV1hXnX5bk2JscmB5a2l7doeFc3+Fg3Jrl49ycntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlQSF+prZpqdHFneGhtfn2BfneBg4N3cJ6ScneAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozk/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlJDSH5teHV0cHlocoOEeHqBgHyJe3Sfl3h9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkVMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqWRoKugsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4FzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUEhie4F0gnR2bXiLh3Z5hYR7k4R1npeGho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtMTU9XYFdsWFpbZISLfo17fnyAjI57goWNfpeSgJ6flpOamaWtkpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdnVmf5SOhoiIhoeHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOV1JRSFBKRE5HQ0pEQ0BEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi8wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9he2VkaW+TkoaTjI2GiYqVhI+MmoidnZCgqKOiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITEtNTlJea4Z5cH14lpSSoJ+clZySnpGZm6WbpaidpqqoqbSWq76rtcfItsjQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktPTklJTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTU5RWWuCjHSPhZmfoa23s6CpqKmkprGprrSvr6u5sLK9m7LDq7nJy7fDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqI+csYuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTg7PDVDOz1GS0lGSFFOUFd/j5uBqJ6qo6q6wr+nsMK0qrG+sba7s72zwLW7uqK4xai1yMe1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqssLWisayxtbu2tK20n6anoqaZqK+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejKCqoK6uu6+yu8jFs7nDu7Kyv7W2wLO9r7Z0sLOlusSjr8a4sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1hVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVFZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZGrs7G3s8S5trnHyrm6wLu2tLq5tbyzubHFYHSxpLGanqq9qaWoq6qjorK1oauon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGw8XMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhY2NfWGNgamdTWGBWUlVJRUVNSkE+R0Q9S0E9QkA9Rz47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+c316a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr21u7PCvLe2yMm4tbq1t7iytrOyrbW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxtX2JeWmBjWmRjUVtgU1BLQ0FFRkU8QEY/QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XErrawubqzr8LFtK64sLC7q7Kwpaq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYBwbWNpbXB4aXd8fsu+wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZastquypa+0qau7v7CqtKakuKarrZ+rtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1NDU0c7Hw9TRxs3S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafYuxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hprGeiKaak5KRiY+OiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlth3Z0bn12hHR4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCon6Kxm4WekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFdGR0pJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6gq5uhmpiepJ6fq5mKmouQkY2EfIeHg4WLjp+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09rb1dDa2tHWyNTLlnx+a2tdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkvNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36Fh4B3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQgomOlpmWlaSbl56VnZKRlqKdmauVkJCJjJGCjISIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnKmmpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NbZ2tvX2trZ2M7bxoh9fGpsaGJWWVdXTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV5hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJSglJCNjY+Lfo+NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLiYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUE9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyPlJaQipGThoCLiJGMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGzmJ2SlJehop+akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWVlDQUlDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIyRk4iEiYiFlZmaj4+UkoaTloN/j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZSdm6OztKajvMK+x8bFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKYlIyKk5KGk5eGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Vn5uhsa2jpLi/tMTHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBjV2NYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzUyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox6fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqmygomJjJSGkHyOjXyDhY2PlJSIh5KWi46VjYuMl5iRm5m0lpSqnYuclJGMkJKLmJqJkZ2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra69q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCdm5ifoJWbn6enpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKd3ZlX11iXk9MQ0xARUc/QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrmywa6lwKSrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjpaPkZCUlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprbO8vaqwqqSlo6yutK63taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYyPjo+Vloh8jpWSkaKalKCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsG/mnF8ZFtaX15MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGaraekmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8TCtra8rbS/ubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi46OnYhaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RwcV1bVldQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCTjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7bEvre5t7OytbO4s6ynnKusuaupqLCwmKOupaikpbXBsKuttL7DucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YiYuOlJxfSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcmhfXVFSTEZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnaCao6S1ybWpx7zExMnLycjMzse+urOvurjAwc21yLvBuba6sq+vs7SnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJyCbXWSopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTUdJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvruorb20t77HvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCYlp2djraeqJulopqboJmnpLGgmp2lnKepnJeTjpObipaJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobO0u7atqLWysp6co6Wal5WZqqGeeGRfYWBMSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/uMHCwMjEv83Gu765srC5tL7DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0uLi+sb7AtrSyta++o5ajlZKak62fkKGhpKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWlmpersbayqqWqraycmKCgko+QlqmflGlmXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaquoKSprbCipqi9taWxvLe2tsOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonautmpqdmKWfvaGcpJerq6uloJmNmqCSnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXlo6io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gnkqqjn6Oeramsnbuxqay1scjEwcOzwsO9x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKqqm5+moafCrZytsZypoq6xqqSovbemtbu9r7fErbOzwr+yxrO6t6u0tq2qoqaVlZOiq6Gfn5mnqq6ur7uxpZ+pqZmYl5Kio7egoaORrq6rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilo+OoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTHv8TDtb/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyprizuLK5waq3ssO9tMWnvq6tt7Wpp6yhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKGdmZmalZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaWoJWMkJ2ek4upqauhp6GanpaNj5mQgoaViZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i4xb3Dx728w8LIwbrBxsG6qralrbutwcO4uKqtsryjla2wrrOXpqiRqrmqoaewnaqgr7Szqqq2tay6q7OyuresuLDBur2/psOqsLauqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaern5qfn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl52UiZGbmZSOqamnn6OcmZuTh4+Zi36Nl4aPmmxpbmJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qisLeppbSyq6Gttb2vs7i8u723t8HCv8nDucTDwcC5xb3BuK+2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1u6yvsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7Krsamim56opJ6VoZmcqLapmJqSkp+Zn6Ggkq6hm5qIl5mMnZqdlIuPl5eal6amo6Cel5aWlICQlYR7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjY+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKikrq21qa+zuaansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5iYqKurrJyuq4+rvZ2rrrGjqp+xrbOurrWxubeqra+yqLavs7q8ybOqtbWxtLCvp6Gzn5qorKCllZaambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5meraebl56amay4opiTkY+YnKGZmJWuoZ+WgpWZjp6dmpeRipSTnpqlo6OgmZeTkpZ7jJGFe42Lg4uTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWNUaVtNXGFLXFxaUlJSYmFMS0VgYWFRTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe8w723v7/BuMC9sr2uqLq5uLfCt6yusbqWl6eurKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6ssqe4r7WzxMW2qbW1q7Cuqqejtp+fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Cnra+0rKSYoayonJydnJSquZyVj4+MmJ2imJGZqKShmIWUl5GdnJiXl4mXkJebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcS09kXT9ie0dJOEdoV2VbTV5iTVlZV1VYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpqKwsbKqt7C1n6u1ucm5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysKuoqLW6rLWytau0raqrqaypua2ysMe/uKW5sKmtraaorbGlpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inKOoq5ygmZuSpLWaj4mOiJGjoZaPlp+jl5WGkJWUnpuZl5WImJOVmaecoKCNk5KOkXh+j4V9fH2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpNblhhW05hYk5WVlZXVVloXlFTTWNaW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoamwpKejs7OwtLWwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6y0uLzAsayyraKkp66qqKWxo6qxqq6qsa6urKuzu6e3sLKpsqqrpqWkrrqsqrDCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mao5iZkKComIaEj4uLn6GQjY+YnpKSiIiSlqGdlpmWh5eTk5elnZ6djJKQjop/f4iFfHd/h4WHdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPY1xOVVZVV1FcYl9TT09oWFhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaapsaa0raqvra2xrrKttLult7OsrK6oq6CjnrG3q6qtubaktbWkqqesrKqtoKimp7GxpKeloaGslqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjpyRk42Fjpmlm5OSm4yTkpGUo5qcmouPi4x8hoKCgXp1gYOBfnV3i6KHeGpeX25mV2WHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPalhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+YqKittaq1saqlq6qpvcDAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsa+trK2nt6qlrbCruK6nsK+usau1qra1p7S3q6ykqqqcpJ60s6iopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqqiqZ+tm5GqoZ2gpKKmoqqenKa0rqelqaKjmKSmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyRkZOPhYiWo5qOjpuSkpCPkp+YmZeNi4SAdIeCf354dYN/e3h+f4idj3BxZmZwd1xhdIhqT12YVkhteVVkVlNkUE1VVVVRT1hbYlZJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+qpK+pqLu/vMGysLmtoravyMfH0MC/vbq8w767xMLAv66ys7O2vbzBsbK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhta2ooZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6ifrJmPsKKYoqCop56nm5mpsKmin6yioZKhoqKnmZmpppiYmZ2Pi4eViH2OhoSFpJeGg4SNh5CQkoWGlqGXiJGdkZOQjZGdlZiPi4aGeHSBf310eHqAe3V0e2uCh6R2aV5la4B1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKSlqqOkoqyms7KxqKSwp6q4v8G9sam6qqetsMnGx9DDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO0pqarsbW3saWmubSttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaq6eppKidoqmnqb2rtLCunamkoK+cmrOilqSbpaSfpZqaqKqlnpqpoZuRm6CknZmWqaqRmZqTkIuCj4V+kIOAiJ+Ph4F/jYiSkJCFgpWblIaToY2UkYuRm5OWh4p/gHJ6eX17Z3Z8e3Vxcn5qhnmFiGRfZ2NyhXttZ3ldXlZCV3ttVGJQUllLTE5wdF1JWltoWUZWZ09DPktPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJifn6mkoqGrpLaysaSpsKatucK9t7GkuaypqLDCyMjMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yis6aqqq60trOom7m7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6qpp6Gpm6OooK28p66xrqGqoqSunp6tppifmqGim5+bmaOqopqZo6OVlpSgoZablqasjJ+Sj5GMgoqAgI+Be5qVjYp9gIyHkZCNioWTmJGGk6OKkpGHkJmQlIGIfXpsfXZ4eGJ6enJwcXR4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlqyYn5eno6Gfp6O3r62ir6+orLjDu7SuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oa24taemqLCzoJ6lpaegpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynp6iam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjY2JeoSNhYuOjYWJk5qOiJSfiZCVgoyXjZF8hXx0cHxxc3NfeHhqb3FxcGuAc2R6bGdlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaOgtquwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevspyhpKCko6CWm6+loZ6iqK+hoKGSo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3uDiISJjY+Fj5OYjI6VmYuPln6Gl4yPeoF7cHJ2bm9zXnh3ZWxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZaUm6qco6GiobapraC7t6WsvsW0sK+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6yZoqecpKWUl6CxpJmepKmpnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWHiIqShZaSkouQlZSOjZR7g5iPi3d+fGx0cmxrc2F3dWhoamhncIZoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSnmZyenaO0rKequranrMPBuLGso7aup62ut8C/vLLCtrCusra2uba2raq9s66ysby/t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmqq7GlmJ6qnaakkZilrKGYnaSpoZuhm5afnae1prCqrqGhnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFd4GCgZ2Hi4OJfoCFiIeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBY2VmZmVqaWNrcltfWV1sZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJaks7Gisr22obHFvLuysaO3rKqtqbi8u7qtwLGurq62r7O4s6mrubGvrrO2uravuL2spp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdp6mln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rLuurKqrt6qzt66msrWyrqmwtraws7W6pqmftaecnaigp6uap72XrKSusLa1rK2fsa2wqaKbnKOrqJuUm6ajnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqKQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrC5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7KpnaGjmaSlmKu5k6Wlr7O3ra6lqa6rrKWhnpyhp6ablqClpJubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2io1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19NRVJWVlFRUldVZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ+qqaeqv8Ovsbq8tsC/qqW3sKispbK0rq6ytamopbCtpbSym621trWmp6iysKyyp62dqaCwp5+jopifoZqss5OjpaW2vaatp6uqrKiloaCYoKajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ucxXpytae6kHuAbZaxq7B5aGxYsa5uZWm8krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK9srXAtba+wauntKysqKaus6mvtbKmp6W0pae4rZyzsrarpaSnsa2ssKaqnaajr6Kgn52VmZ6crauTnaKfs7qjqqmira6loZyamqKnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9bKGQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqiosK6jsLmuo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+aoZuWlJaamquklZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaeyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqeqsaewp6Wdnp6ulZ6ZlJSUl52soZmZpKi1r6Kqj6qoqpudlZegpaeZnp2jn5ufo6WjlZuel5mcoqmbppqcm6Kgl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITXFQXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCotKijmpydqpWYl5WVk5WgqZyZlqetsKmjn4+to6iWnZaboaWfl6GhoqGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZ5RRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdKOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsa2jq7ytprSmp7a7vLK6vra2tLm4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mamaedlZOXl5CRoaaflZOlqrCmopaTraCmkpSgm6SlnpSapaehmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kes6yfn6irnpSntauor7GqrbOjm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZinpKCUmqWonZyknq2doZyfjJOemp2gl5mblpeioJSXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5Vtkl2rW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVzdKm5ZYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubmxsLS5qLqzn6+knaSmpp6TqbCpr6m0q6muoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSWpqqnlJipp52eoKKtpKGeoIyUoZifn5Gdl5yVnqGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFtSPj1ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r662tarAtaipoZulo6Gckampp7WisqetqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSll6OsopGWq7Gjn56mq7GZoaKPmKKWn5uVnJahk52pnJSPqpmH1JKau3Oww4DDhn3Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1lcWkNAQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6Keo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJujrZ6RoKirn5qfqKO0n6KkjqeilKKanJeVo5iQr5+SlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfYeGjIeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc5Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Ssq6isq6m6rrDFrbOyrbams7erqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZKcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SqoJGtnpeknpeXl52ej6+ok5uloY1qfWmbpXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pem4lgY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaWfoqedo5uZmaumrqOktKilm5eUoJqlrai9p6iklJOblZ+ZkpekqaiQnpGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6KasZuUp6CWlJ2fnZawpJegp5ibkJycoaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiVjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVUEZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWnn66Yl6edmZmgnp2cr6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEkJ6IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCanVkemZgamVjZGZrWWx7b2lrXVNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFNFtHNTwsQLSgubC/rKyvsrGgqqayraKss6/Er6mqorGtu6Kzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqaWjq6Kvm5+goJiknpyenK6jmJ6nkpaVm5Gjl5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8aodZXmx0ZF5ziWlrfHBrZF9STlhJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCeq5afo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmllXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKqgqpunn6egrJagm6Wvo5abqZSfm5mRo5WcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+qnquYmqKfnJqqpqGcq6KkqKOktKScopKlrau3s6euopGQmZylkpGfoZiboJ2Ip62lq67AwLGhqa+plpKfnaKZoqSqo5Ogop2era+qraejo6ihpaWdrKiRo5qorKmanKebqp+UlqOUn6GVm3/OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGBybXBoYGB6ZFxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9N0A+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6ssKqoq5+UkZqfpJKPnqSXnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqShqqmdoqWkn66fkZill56Zk5ORl6BxhYyXdYWohnGxfZ5yrH+in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qh6KMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmSFbmF3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpaippq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZoqGSlKCtm52npLCtpa21q7rNsa2mrquWlZydopmerqycl6Canp+ps6urq5usq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ97mZeFemaAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnw8nW1L+hmaunoK+inrC0sK6prKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLWvrqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepmVmniqyXSZpJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqaq1sqybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylm6GjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp+XiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaaYr6S7raG2taycnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqapJyVip99mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknKMiq2+v7y6tJ6Wp6SttaGimZSip6auqquYpqOfpaGhtqejqKewo5Sro46kraKdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqOWmZqdmZyZp6anma2or6Olm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJF9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWthaCVqqCil4afgZqVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhnQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYGFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaWgmqWdrpiiqae3qsGvpKmjnouBjpuan6aekpSZm5WbmqalppuqrK2kpZ+pqL6klsKrqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SnlZqBrIqEsIWmmqShopGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFumI+onIyYkpqafHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBgYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop2knpmjo6WZoaOqs6q9r6Snnp2PfoublqGgmI+RmpySmpipoKOaqa6opqaipai7np/FpqOnn6mzs6qso526q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpquRf9a9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaeppuaoamjmaCirK6quq2oo5uXk32ImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqup6ow6KfraKpsrKoraeeuKWsrJlzdqqluIZkiaBwaK6Ri5FubnekkJmfgXWumZRwj4txlaiknJivpHNtbWxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epamgnaSjoJGLpZKnmaiZl6OroZedpqaosLurrJqbkpJ8hJaNpZiNkZGZlY6YlqmWoJmqo5yxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVrKeNk5OMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4R+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaujn5innp6SlKOXqJqnmZSmoqWRm6eZora6qKqYmo+MfIGUi6GUipWRlpGQlJimkKCbqqCdtqOdpqu3p67AraK1pa6trqqnp7G2n6y6mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qenp6clqyek5qim5SQlquajpmZl5GWn5GIoZ6WlYaSjZGOlYuBfmWLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjlJ+ZpIWJm4p9c5d0fIyAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJjYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomco4+tnaKVqJ+gkpaZm66LqJWPqJqqjZmpkJ+5t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKurnSiu6GxnnZ3nqivuJN0q6OeiYCrf2RcYnagj6WfhJh9bZKznKOnraqjZZ6fknN5mphwgJipmG1/oqiKZZymnZKYmJaNkpyQhp6bkZeEkoePkJKJhXdqjoZ2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3yonJxme5uKhXmZaoaMhG96gGtyZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVVVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ2Rf4mIm56Mq5milaehnY6Wkp6Fda2PiKebqpKYpYqcu7SnoJmYi4l1d5ONlpOKk5GRlI2QlKGPnKGnmZyylYCMm7ScsoySjrqln32noXmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qInICXp4KBe5yzeoqGoZialZiWgpGXl4SbmWN7h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyGj5iXh6ycopafoJGMk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0ma2KyoeprIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVs4GhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXOPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJeWkYermZubmaGEjox3mpyPn5CInqWcl5qZh6O5raSanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2flq2PnZyckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmqmZubkoimsaehlZqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6Kgk592nJWPp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS3tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGAlo2JkKGPkpSdmH2QiY2ooYeXjomSpJWcm42Mqailno+Xh4R+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoYyfcaGKh6mHmqSOlaWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0NSbzVMW1tfTlpEQTI1MTw6N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ+Tnp2JkamjoJqMkoqAgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ6Oi3CSjIGphpidoaWepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn56bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkaGbc5CQgYmalqGbhY+qnJuVi4uKfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSNnZx7pZZ6qYCUmo+Jnpp7p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoqWPpqmhmquLm5mZlJmTkqGYjoeFe3B9hGh9j4OVm4B3kY6PiW9/hY6SkmyXk3yJkpSll4OPq5uUkouGiXmDdoiAboKfhneAk4aImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmY6FgJmPeqSAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Ole3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZtud3mYapp7dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOmjaaon56nhJuYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY15jYyXppSEmaqYjZGLgYl6gH2LeHCQoYZ6gZWHiZagln+UpKablZWDZm54nGyiZHtxpXebmHBmpoCUiXqkep+Wg5dznneBipWXj7lukYqiYn2YoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii256fXNyZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVYteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNsZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fp42jopyko4GWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfIiHmKiSgaOtkYaQi4KJfoCAjnJpkKaEfYeTjYiZoI+Ik6mlnIimeJWbfqSIlouxmJ2Qgq+Xn6R1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OHhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ+foulnnaffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp3bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6aKnKaeq56FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlHaCh5JubIupgYOMlI6JnZ+JjJSpop+Of3STl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4CAi3d1c5R1b3lubYdsg4ZedWd3jmV/gISMqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5oa29hjZO3qKaJoKKapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+WlIeOiomNcoN8j31+j4R7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6Jlq2nj5Klj3dvm46BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqaUhWWLjYNud4uEcYaPenFoaWZ8hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWVudWhtfH53enx7eXqAgH5vhYmEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3lvaGpsYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmJiYaHinN+gYx2hYuChJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4iUioucl4SDeq2CkZialYqenYeIoameoaGjioeTm5yjmZWqoaemn5KahpSLenaNjYOnfn+TkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOGkYt8iZ6Eh4yQiYmBhYSQd3x6dJqgiYaKnYmEk359ioB/dG5yhIF9doWFiY6lkIKFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0i3F+e3h3cHh1gl1eb4hpb2BfWl1dU2hyVmRdXWJtaHZ8fXRvcGVraml/fW55gHJqcHFsZ4F7coKAeH99f4R6bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2WMh5y5npahoJiUmJmUmKShn3x/mqyPn46GoJ2MnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4ODj36Ah4SFfIeFj5yfk4isoIRzipCGkpGLnZF9jXuqhI6TmJaPnJeHh5uknqGZnIWCkpqZmI+Zpp+knJuPlX+Oh3R6ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdIyZgYOPg4eFf4WElW55dnSSooqMhZqEhIxzf4l8e3FxeoaCeneIjYORpo+Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBpfn13dnd2e3hdYHF+bnVgY1tdX1JnblVmW15ia2l2en9ybG1ka2pogX9sdIJsbHVwenCGeW6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qfn597eJ+nkZyLh6WVjJmZenuNhn2JkYSMgoKDbnyAeXOBhX6Lkn1raH2Cl4mBiI17fYaEhnyPgpCdnZOJqZ2BcYuLjJKGoKGKhYx8qJGJkJKXk5aTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakImSlpt+k5J+h46BdXSCcXdhfoGOhnGLl32JjHKMf4KFho9oeHJ4jJiRj3+WfoiJcoGGe3tvd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWlqdnmCcmdsZGxoZoCBa25+aG9xbH95h3psjIFzgYF+gXR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJuefHeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V+i5F4Z2N9hpeKgoqLeHyAjYN5loKWmZiOl6Gbf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlo2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpWZfpiNfIiNgXZxfm57ZIB8i4Vwh5OAkYJsiIOBgImFZnVve4WRmIt8k3iLiHt/hnt6cH13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW21lU2RZYWFpa3V5hnJja2NtZmh9gmxpdWhucGqAfYN5bZCGcoCDg350fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuUh3+EhnR8fot/fZiGl5WYjaSimIBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqHiI+Jb5eem6SUlouMnouGgZGcf5KSlYaZiHuKioF5cnpsdWx8f4t+bYWTg5V3cIOEfn6LgGVyaXt/lpeDfo10kIeCeIZ9dHZ+fISAe4GLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ2YHBsdm5vXFxgXl5rXlFeWWNhaW50e4psYGpla2Nod4duZ21pa21pgn17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZl+eK+ZjZd9n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4JyeoCHeo+SiZOSnZOmnZWCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5WjlJOJi5mMgX+Qnn2SjpKMmY57ioWHc3N2bHFudXyKdG+HkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SKhoGLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3FleV5vbHNtclhbX2BibFtQWFllY2hycn+IZ11qaWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dXSBgICgh5KLlJ6YopWYeYp/gY2InJ2Kj4aSmJaFiZWakJeMjI2Ni5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEnImQfouDi4F3k5mToJOSiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0hI+Zi3F3gXWCiIN5ZnJudYCZjnuHhHmTkHl1h3NviHqEinmKhICGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbXZhcG9rcW1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarZ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgaqUhoJ3f3Zxg3qDoYOTgpWUmZ2Tm3iRe4OMkqOZk46JlZmShIeXmYyUi4mOj4acg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5GYkJyPkI2Mj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39hen6Pl4J3e4J4g4x9eWdzbHOGlYt9h4V6k49xeYNvdYt5iIp5iHuAio6dnIR7enaCi3x3cWpsgoR7YXlxb25zdFZfcGJyYmBtb3pxaXBmZ3N1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbGcpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFvhXRwcoRwa2l3boNufX1tdHJSTYLfyJLWk3twdYR2haGElHiXkpmdkZl7lHOFkJ6hk5SRipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjIqcm5yak5F4jHRlho+Fa4eihJGIloOGY4yRmY+Wi5eMjIqKcXqUiHuOiIqTkYl5hXx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR4gI2TmZiJfHV3g494cm1ncYCFbmx1cGlrdm9TX3BlcFpgbXN5aGxrY2d4cnBxZGB4YWBWbF9fd1FOTGJnY116cop2Xl1ldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3N/hn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KFzbHaFd4akhpNvmJKWopacgZJyhouil4iOlouQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SOnJqYmI2OdYl1bISHiXyJooORiZyEhV6Lk5iLkImPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFja3hoUmFyaGxWYG91emFyZGBpfXBzb1tkcmFiV25bXXlPTUxlZ2Jed3SKbl1dZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPa5qRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuPi4WOgH91eIOEcoiCk5yWlJeEi3WGfW6CgIeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4eBjomBfn6RkH1tgWt3hY6EkIF7gHt9j5GOlIhtcHmMhXRrcWxzeYJhdWpwXm14YVJlc2lmU2Bxd3VhcGBdaINxdGtYaGljaVluV1x2TUtMZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIdIWDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG9xeH1xlJKOiGubkIqdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCGgJaajpOTgId0goR0gX2IkJuehpWPn36IYoCTh4WJhYuNgICDZ3yQgH5/goyPkH5tg3yCdGxtd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pveFpTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcYBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9ycYB8fXR4hniFgn2AiHV5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB/ZWNnZ1edj19xc5a9xYV3cpWLkYB0mY2HnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gXF1hoGelYaUjoGBcX6Gc4J5h5WbloaTjZ2AiGZ+k4OBhoSKiXKBfWd9i3t5f3+Hi499aYB8g3ZmcHl4c3d0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaWh+d2VdcmRZcXVUVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXmtuYXFQWmxSRFRoYlpsb217cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcm9+e390dYN6g4J8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5eMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEkoyCfm59gXSBdoOZl5KKk4+UhYhwe5OEfoSDiYNvgXhogIV4cn9/g4qHfGV8foN1Y3FzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWMgoJxg3d/loqMg3dtbH6Ef3Z6ZWhqfnJhWnhbWnNvT1hydGdgS253dmJeXFtZdX5zcFhnXmZrcl9vT1hpUz9ZZ19bcWtneXJcW1lsZVpjcHlfaF1eZWxoZmxpcnh/h3BugH2BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1gY295XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIaZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg46LgnxsfnJ0gXiDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udXJ1gpyMgYCGf3R2foBzgXBba3xzeIiBinuGf3yId3lwa4eDj4KIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltoZm9jak5YZ1I+XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtaGpraXB4fo5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1+jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3iImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251e4aVkoJ9goBwd3p8dX9tV219dXOJgIV2hnSCiXp3cm2IgI5/g3F9e3yQh4d5bm1obYKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmlOQWJkXGB3YV11blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGiEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5dop3fXh/gYd/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4BqdoGNkZV/fH5+cXx3fHR/YlV1e3Fyh4KBe4Fwhol3eG9vgoKLfXx3fHpzjISAdWhwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlWbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4foCBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW5bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAe31tgFpVcXxvc4GFfX93a4iGc3hqdH+Dgnx5e3d6cYl/e3Jnc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWntjUlZddltbZ2xiVmtgYG5mZmxwaHB2eI90a46Ndn92eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIB4iodkcYBqanFjWG17hpyJg4Fyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXqAeGl1eWeCd2h1h4yOlX1zh2pvfoB4bn1dV298bHN+iHqAbm6Kf3B2ZnZ/gH6AdXpveXKFenhxZXJgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3FIQWldYWdfXFV7Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue6C3bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9Z2trW1ZveIukgYV/cJmScX92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdYaNhpaAcItna3uCdG11Ylttempzeol6gGV0hnxtcGd0fnd9fnB6anl5f3h2b2RsYWyJfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxqSkVsW2JlV1lUeVpOV29rWV1sZVxaZWNedGZsZXFnc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd1dYWGeIKFend0dm5renBhaGtnhnSNhG5nXl98bnmIfGdsd2ZqZFZXc3COp32Ee3aWkHR7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFlc2VgandmcHWIeXxhdYN2amtxdHpweXdye2V9fX12dW1jZWBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxMbFhkYlVUVXNXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dXGFhY+CgXqLdXSRgHyBlY6BhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV11aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXt8kI54dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGhqeHRxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIUmxFYXlmYk5Ucl5KTVVaZm14e2ZfbXFqZF1WYFZwb1dKVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVZaW2uBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR1dmZoaWFXVlloZJCob393f4qOenBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGxhbXtwamd5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWRRSFdiR2N3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2ZUSV1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKLjX1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWXBtW15XWVtse2Jxd3ZtY1xudHVodndyb4Z5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoGBc3xhYmlcVFheY2SQpWl5dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlmd21hZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNZbm5gb3B/enNlcYBkX252amNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVEtkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIuGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybVtZWFdgbHZjanVqal9bbnRybXV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF+fnCAXGFjXlNaYVxkk59lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYW9xf3hzZW9+W2FxcWJfaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVeWnB2b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3e3xvhFxjXmNUW2BaY5eVY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn90c2JtdVVjcmtcXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3aAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gbmplcXl+Z1pWWF9seHp6boJeYV1oVlhgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dmbnJ/cnJeaWxTZnFlVmJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI56bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgpV4qLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSqVhUcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+IgoODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi4+KipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4aLioWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiNiYSGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiHiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH18fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJuc2phWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW51cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJobG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh6fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1xpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGlVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BBQD8/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08QVNEPzw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUBZYUdDPT1ARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSWpmUU1FQ0dGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOaWdbW1ZMSE5NSElISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTVZlZGJgZWBOX0lHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNY2ppaGNmaGdfQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SU1tdW1qaWlpa0k6PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9mUXV4dG1tbm9sRDc4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYptdnyEcW9wb25LMjY4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hyc3xycW5vbkQzNjg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHh4iIioqMi4qLjYVsaGxveX1mPjs7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNj39mbG95fl5FQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjXlwcm92XUtMSEhIRUZIR0VDQUBDRURDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMjIyMjXxzcnBYTFJMS0tJSkpKSUZEREdIR0RERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyNinl3dW9jUU5MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhYWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjIyOhXl8eHJZTk1OTEpJRkpJRktJR0tKSUpHR0dLTE5MTUhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMeXJiXVtQUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSEpKTEpMRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI1/YFxXV1dVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NTE5HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjItuX1ttZEhVU1NSSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hyYWhYPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh4enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhoWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x8cnNbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJWU1ZUV191eICFhISFhoaGhoeHh4eIiIiIh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3pvc1pNTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFeT0ZBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZGRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0pHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hIR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0tHQ0JJSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHREdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZISEdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTU5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LRElMS09NT05PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz09Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUU1BST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gYl5cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTUlFSTE9SUlBWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTlRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MTE1HQ0NBRDw/RUVFQz1BQUNCQ0NEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BvampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZDR0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUhISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUhHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpNSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dXZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZDR0VCRUhJRkdISEZGSUdIR0lLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX11eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0pNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSWl1dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSU1QRUZJSktOTExJS0xJSUhESEtRT01NUExMSktISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNDRkdCTUhCS0tPT05MRk1GR0lKSEdMTE1PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OSEtGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoOEgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUtFUlZMS05JS1JYV1FNT09MUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOTE9IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3NydXl+gXN1em58fXl4cm5OS1N1TkNCRlBPSEpLSUtQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5VTGxgdnVraXV7em1+eGt8cFxeXmJbXmFkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ2xtcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlJRS1FNS0xQU1VTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVU1RVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBOTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2RgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUUxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXVFZaWFxdW1tdVlNNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlWV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU9SWlNSUVRSVFVUS1JXVltZWlNPU1FWVldUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWlVaXlhfXllcWVFXUllZWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmhoYmZpY2VeYmJjYWBgX11dWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXmFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6enx9fX19fHx8e3x8e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPYWiUrKysqJWOSjY2MjI2Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExsbGxsUXZaRkJCPkYx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4cG9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISDhHhzc3Nzc3N5fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXx7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH16e357d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fH18fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF0naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnNzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpiyoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgX5+n6uklqSbm5agn4Z/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDi5eal5aYoJqdnZ2ampiQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4eLh4KDgoGAgICAgYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f4CAgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgIKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KFgoGEhYSDg4OCg4OEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5OQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOChZODgYOFg4OEg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKRlIGBg4OCg4ODgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDhpaVkIyCgoOEhIODg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIOEhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDhISLmaCqqJuKhI6Jg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SEhYqTmKClpJuNloeFhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYaGhoeGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhISGlZeVl5+fnp2Sh4iGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eGhoaFg4OEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYycm5qXmpybmY6HiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3p/mZeKlJmZmJWUjImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yalX+BlpiXlZONiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXj4yYlpiXk4mHh4eHiIeHiYaHhoiHh4mJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoKan5yYjYqLg4SEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYegnpqMh4iAgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEg4KDg4OBfn1+f4CAgYB+fX19fX59fHp7eo+bl5aSiX6Af3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6e46XlZeGfn5/fn5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/f39/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f5CQj5GRf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9+fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5go2Jj5aHgYCAgYB/gX+AgICBgYKCgH6Afn9+fn9+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhYSCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoGCgoKAf359fX1+foB9fX19fX19fX18enp5eXl7iImHh4iDgYKDgYCCgIKBgYODg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXl8goKEhYOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYJ/gouEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5enx/gH2Gk4ODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEhIWFg4SEg4OEg4SFhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7fYCCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OCgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx9fX19fX18fXx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx+foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42LioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4B/f39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXx9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fX19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGDgYCAgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoB/gICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoKBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/f3+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYGCgYCBgX2AgH6AfX59fn+AgIB/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+Af3+BgoGAf36AgX5/gIKCgIGDgoSFhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn18f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOBgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXx8e318e3x8fH18fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH18fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/f39/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fH14eHV4eHl7fHx9e3t8fHx9fn9/f39+fX1+gH9/gYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpydnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIGAgYGBgYGDgH+Bg4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WDgoOCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOBgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fXx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRxeHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SAgoOCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgYGAgH99fXx8fXt2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGDgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+BgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgn2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4SEgoOCgoGDhIOEhIWDhIWGhIWGfYR6fX5/g3uFg4GEg4F/fX5/fn6Cg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f35+gX+AgH59gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SEg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoB/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhIWEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFhISEg4KBfn9+e3x7fnx8fX5/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhoSGhoSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fH18fXt8fHx8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIhoWHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fn18fXp6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhISCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLmwi4uLioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6OllVNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0dzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaueY2FiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs7Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0c3Mzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzs3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zPz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3FpKCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuzp52HnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZeckJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Uq5p+o5KKrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7Nzw/QDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uYiqGarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlm5uapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpyvnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Saz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNbMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR1Mq91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eXlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs4Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1FThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFdQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5NUGOGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn5qlKWVnX2IgF9yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3ttUXWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndXTktyk4aDTV9vcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULy89eId3dkFEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVReSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI6DdU9ujnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueaGkmpVlTF94bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6jqnRopqzqFhMrZNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6KihXd+fXLOxq+Zpq9rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urI6Gg26RzLyUlKWWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0tZ+HeWRYn7W7pqeZiHdrcW94eXt+hY6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SPcmZSRIuVhYWFfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yuo5WIdFlaUURpd2pudG5rZWVZV11YXGNqamlmYWmLtsHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmmnJOFcl5RVEtEW2VeY2plYWBoWVRYU1dZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vItpN0Y1VQT1RIPl5sX19lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWFiaWNgW2NfV1JPUFBXgbS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVpdZWxlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9GXWJhamBaWFdUVneat7+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVmVhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pd4CKVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4KQl2+ryMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2R9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI1+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSUSXvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjUN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwXhSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urFvY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGgfHJsrcjFxL/Awb/Lx8PAyMC6wru5s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLhtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMC0s660tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2zdoGzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5B+wMTDvry/u7u4tsHCtb+6tK2urK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJacpZWhca7JxMC9v7mzrrK8uq67tLOlqqasur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLChpXKly8K/ubq1rqWss7GmsrConaCepK22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYOqnpljqb+4tbKxra2fpKemoq6mnJWYl5meqK24q6qqnqSopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vI+hsqujcqywqautq6OooJ2dpZqFn5SQlJaOlp2nraOio5+hpqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmZmVaU5AUnhxUElJS2ecgVlFUq67sayzr66srba2srS1rqimn5qbnZ6mqJ6gqKmfoaeWn5FVgZ6RjI6Ui5WZoqefn6GioaWlnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBKVI5gY2KArrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olKNVVoeVj4uMlJCWmqCnnp+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXKed09uS0tjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJqTOmSEjYyLjpeUmZ6iqZ2hoJymp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0llo1tlfm9yXVFrY1tkX11rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KjgD1kgIF7eX+UmJ2jo6eepqufp66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aeoINqY2Zwenh1foybpqmrpbWyn620t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZ62q39nf4Z9dXl7gZ20rrPBmKm3uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmaC81bmVhYiMhXpxcGyAqbvEnJC5w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhth5+z29S8q5yJhouCcmhdXZDOtnOtx8XFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbXCRu8PHxMC3loOChIRyYFeFuYCA0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcm9se4hnjq22taGOfXp6a2hlcYRfutTR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1xcXB5UVl8mKSjln5vamNmamZdk9jR0tPU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcHBubHFvdYBjWneSm5mFaWFfY2ljeczUzc/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucXJ2fGBdgJSYimdZWV5tdZfH1M7L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucXFycXd3W2eHj4piVVlqgpGds83OxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NHTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFxbWlteGhVeIN8W1Rpf5Kbn67Fxr/BxM7Ox8XHzcrRx8rNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWtxX2Vvalhcd4KRl5eit7q6uLvIxcHDwMPIycjIycfBxcvFx8rNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYm5xbmlmZ2tpbnZcWlpcYHN+hoaCkq6vsa+uwLm6u7m4wMHBw729uby/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBrZGNpamp1cEhPXFloc29pZJOlpqqoo7WxtbOysrO7tbywtq+zr7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhnanlfQ1BMXFxWUnOhmp6mopqnqa+rqauos621r7Gnraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWl1jbW1mZGRkZWdseFE9RUxYX1qXpZadn5uVl6Gnq6Kmoaqpq6qvoqWeqq21trG9uK+3r6ituLSzvLezvLC4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5zRkRkgXBdlJmHnK6WkoycnqahoZ+kpaalrJ+cm6SlrLKwtransKunqrSrs7mwtbWutrmzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbGtZe3lfVFxEXmKTpJGHmJ2epJudnqKkoqadmqKbnqqurLG0o6ipqauspLS4rLavrbO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVvZllYSDIhIlxYX46UiZadnqWcmZujpaGkm56gmpitra2usaCkoq2rp6G1sLGxrKmvs6i6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFROjMhGitolI94kYyRm5mdmpSfn6iinZ6nnJqZqqausKqboqO3qaGgrqi1qqanrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJpaT0zLTJOf42TjJOOj5abmJyTnZ2lpKKlpp6cnqWfqq6ln6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWtYND9NdISKiYySjI6RnpWdlJmdo6CrpKOjoqOhm6mqo5mdpLGpoaCdpaqeqKKfrayqqa6toqKilZiimpyQrKmwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFldW1tcXFxdXF9jaEBScYd7hYaFj4qMjJeWnpiYnqWmqaaqpqilopikraOUmKSuqaCcmZugn66ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmVxeXZ/c4CFgYmEj4uSlJ2bl5yop6Ssqqevo6aYnquflJSjqKadl5GPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganRscml7gnyGf4+Ej46Tl5WapZidqKWkqp2ml56kmpGOnqKal5eGhZKbpI+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFpZGhjdnx2fneJfoiFj42Pmp2Ml5qioKKYpJWgmpSMhpiai3ONg36Ol5aGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpywu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaF9jYHF4cWtJU22LfZGCiJiTiJGOnpeclZWVk42ViX+TiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrayYp7Ojqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBlXlttdWlKPTt8ko2LeYSQiYKHipmMlZSJkYaElIV4iH9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqGpnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1Vaa3RkaHFgX1VPjIOQhHB6gn15goqRgJGZi496hY5/dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5xenBrXG6GkZWMjHdjdX1zdXyGjnuCmJJ/cIaOe3Z6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PS1JPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWRtaWJ/n6O+fHB0X3d0a3h1ho54eoqEbmuLkXhzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFpaoIFdlWNtdGF6bGp8d4iGdICFhHNrmJBzcntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlRSGCqrpxsdXJoeWluf36Cf3iChIR4cZ+Tc3eAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVJDSIBvend2cXppc4SFeXuCgX2KfHSgmHl9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUUlkfYN2hHV3bnmLiHd6hoR9lIV2n5iHho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPRkM/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XYFhtWFpcZYaNgI98gH2BjY98g4aOf5iTgJ+gl5SamaWtkpm7sae7x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSFBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9hfGVlanGVlIiVjo+HiouWhZCNm4menpChqaSiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTkxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlJebId6cX55mJaVoqCdlp2Tn5KanKacpqmdp6uoqbSWq76rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU9RWWyDjXWQhpygo6+5tKCqqaqlprKprrSwsKy6sLK9m7LDq7rJy7jDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGgq6GkqI+csYuVo6a3upugoq+SopyhnY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lGSFFOUFeAkJ2Cqp+tpay8xMCnsMO1qrG+sba8tL2zwLW7uqK4xai1yce1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6anoaaaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejaGqoa6wvbCzvMnGtLnDvLKyv7W2wLO+r7Z0sLOlusSkr8a5sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKSvqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZKstLK4tcW7trrHy7m6wLu2tLq5tr2zubHFYHSxpLGanqq9qaWoq6qjorK1oKuon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgrLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr62u7TDvLi3yMm5tbm1t7iytrSzrrW1mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyb3BvMHAxMTFyr7HzbKjurC0rpqrt7uYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEY+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XFr7exubuzsMPFtK+4sLC7q7Kwpqq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uypa+0qau7v7CqtKakuKarrqCrtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZCOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOg4eFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6hrJuhmpiepZ6fq5mLmouQkY2EfIeHg4WLjp+Zk4iEh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnx9a2pdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQg4mPlpmWlaWcl5+VnpORl6KdmauVkJCKjJGCjISIiIGFj5Gdm5mJhoyBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGlrZ2FWWVdXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCSk42cmZKTkJaNi5WfnJSglJGNjY+Lfo+OjYqDiJKWmp6eiIyVkp2RgYt/pZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHpua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiLkpKLk5OTjouPioeWmpyPlJaQipGThoCLiJGMiomclpiiooaTnZagiomIjZuQg4iOf4OHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amhfX1pVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIySk4mFiomFlpmaj4+Uk4aUl4N/j4uZh42QqpeWoqKImZ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2ZgYF9RS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiNlIuLk4+HgIaHiJKYlIyKk5OGlJiGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBiV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomJjJSGkHyOjn2Dho6PlJSIh5KWi4+VjYuMl5iRm5m0lpWqnYuclJKNkJKLmJqKkp2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxfXFVhU1FIRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWm6easZqRq52Omo+SjpWQj5WWjpCgkIiVnKSslJaPlJyelKCdm5ifoJWbn6inpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnVkX11iXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeoOMkY6RoYyMlJGOh5egmJOZlZaloK6djKqcjpaPkpGVlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltfbVROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4uTo5mXm5SToZ6pn5GlmoyPj5CVloh8jpWSkaKalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZX15MTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTj5OUkqWdk52Zk6ChoZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKusuaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmouxlZqZlZKSmZilo5WfmpWZqJyboaCZioyPlp1gSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyrtLWrqqetrJmkrqalqay6v6irt7e+wcC+t7Kyw7C3vayjrrStuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqeoKmep6CYmamZoaedl5CNkZ2DbXWTopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1MRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypraywo6OZqrW7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7eeqJylo5qboJqnpbKhmp2lnKepnZiUj5Sbi5aJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobS0uratqLWysp6co6Wal5WZqqGeeGNfYV9MSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLXAsLy2urenpKurraGhm6urxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSytbC+o5ajlZOak62fkKGhpKKjnpC+pKidqKucnKCbpp+9opiknqKpq6CdlY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWkmpirsbWxqqWqraycmKCgko+QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS1taOdpJSRk6Ctn5ihnaioqqKawqyonautmpqdmKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXl46io5WQpa6zq6mioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKmqm5+moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u1tq6qoqaVlZSiq6Gfn5mnq6+vr7uxpZ+pqZmYl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilpCOn6CTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+eqKSZk5STo6C3o6Slla6xsaWppaGem5malZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaXoJWNkJ2elIupqaqip6GanpaNj5mQgoaViZWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO4uKqtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLiZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl56UiZKbmZSOqamnoKOcmZuTh4+Zi36Nl4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7Sqr7K4n5esraiumKmpjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqqzqaqymZ2nm5qUjKCmpLSup6GsrK2xp7Orsamjm56opJ6VoZqcqLapmJqSkp+Zn6Ggkq2hm5qIl5mMnZqelIuPl5eal6elo6Cel5aWlICQlYR7j5OEjZdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKilrq21qa+zuaansLfGt7G3v8LCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurrWxubeqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCllZaambGiraClr5ahpJqZko2ipaeyqaGmsayqtaWusLSvo5mdraebl56bmqy4opiTkY+YnKGZmJWuoZ+Xg5abjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFLXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe7xL23v7/BuMC9sr2uqLq5uLfCt6yusrqWl6evrKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKem5WXpaWkt6eisLOrp7Cnra+0rKSZoayonJydnZWquZyVj4+MmJ2jmJGYqKShmYaVmJGdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcSk9kXT9ie0dJOEdnV2ZbTV5iTVlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm5rsG8w7izsrXCw8/EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1raqysauoqLW6rLWytau0raqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoq5ygmZuTpLWaj4mOiJGjoZaPlp+jl5aHkZaUnpuZlpWHmJKVmaecoKCNk5KOkXh+j4V9fX2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpObVhiW05hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamwpKejs7SwtLSwsKCrrb3Mu67CvceytK60wcPRxMa/wbK+wsO8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqqrpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnqKnqKGspqOtrLawsaCpo6CqrbCsnZ6np6mao5iZkKComIaEj4uLn6CQjI6XnpKSiImSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfHeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY+V3VYYFlPY1xOVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8PEzs7Dv8C0wMPEusG0ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLult7OsrK6oq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKeloaGrlqqhk5ugpp6ko6qjrKKeprG2rKyipaOaqauuqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZyRk42Fjpmlm5ORm4yTkpKUo5qcmouPi4x8hoKCgXp1gYSBfnV3i6KHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Yqaittaq1saqlq6qpvMDAubq0vLWms6/DycvRv8G7ub+/w7rCusHErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7S3q6ykqqqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmiqZ+tm5GqoZ2gpKOmoqqenKa0rqelqaKkmKWmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyQkJOPhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeCf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlNjUE1VVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpaqsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMLAv6+ys7O2vbzBsbK0q7Sppbappa2zsrivoq20sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCopp6nm5mpsKmin6yioZKioqOnmZqpppiYmZ2Pi4eViH2OhoSFpJaGg4SNiJGQkoaHlqGXiZGekZOQjZGclZiPi4aGeHSBgH10eHqAe3R0e2qCiKR2aV5la4F1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqOko6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO1p6essba4sqWnubWttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rtLCunamkoK+cmrOilqWbpaSfpZqaqKqlnpqpoZuRm6CknpmXqaqRmZqSkIuCj4V+kIOAiJ+Ph4F/jYmTkJGGg5WblIaToo6UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfZ2NyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yitKaqq661t7SpnLm7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qVjIl9gI2IkpCNi4eTmJGHlKSKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLWnqKqvrbivqJi4vKStvrS0oa24taemqLCzoJ6lpaehpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjYyJeoSNhoyOjYaKk5qPiZWgiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xua+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3qCiIWKjY+GkJOYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW5mcmlrZWhdZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGqrbGfmb+1pKe0taiesrypqKWpr6yZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo2Uk6SopJCJio+GeoR7hIZ9nY2Ki4d6gYWIiYqShpeSkouQlZSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLGso7aup62ut8C/vLLCt7Cusra2uba2raq9s66ysby/t667u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqmqq7GlmJ6qnaakkZilrKKYnqSpoZyhm5afnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiYqLiXmFd4GCgZ2Hi4KKfYCFiIeGkYSXlJCOj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBYmVmZmZqaWNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqysaO3rKqtqbi8u7qtwLKurq62r7O4s6mrubGvrrO2uravuL2spp61qp+gr6Oprpuhv6Cwo66xr7eutZ6tr62topmdp6mln5Wap6WfmaSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko+QkZeOkH+AjY6Db4F/ZnltZ2tpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsc3BgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rbuuraqrt6qzt66msrWyrqmwtraws7W6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKejnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiGa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrG5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7OpnaGjm6WmmKu5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9iJ50h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+qqaeqv8Ovsbq8t8C/qqW3sKmspLK0rq6zt6qopbCtpbSym621trWmp6iysKyyp62dqaCxp5+jopmfoZqss5SjpaW2vaatp6uqrKiloaCYoKajmZmlo6SYnKSplpSim5OSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVOMXFdbUEFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK+srW/tba+wauntKysqaaus6mvtrOnp6a0pae4rZyzsrarpaSnsa2ssKaqnaaksKKhn52Wmp6crauTnaKfs7qjqqmira6loZyamqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66jsLqvo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+bopuWlZaamqullZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDg6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wdn5+ulZ6ZlJSVmJ2soJmZpKi1r6Kqj6qoqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5h6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYl5WVlJagqZyZlqetsKmjn4+to6iWnZaboaWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ6hqaSxp6ypo5mcmaedlZOXl5GSoaaflZOlqrCmopaTraCmkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5VZR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m0q6quoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj9ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSlmaWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYKMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQXNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Coo6qypLSlrKWelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJykrJ6QoKirn5qfqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjZh8pLu5vZx0erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9dXT0rOlZVJz47PKeeoaK/pZa0w7Ssq6isq6m6rrDFrbOyrbams7irqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZOcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpneHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNwmoppcot9hpVna39ydXh9fmJbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtXZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKilm5eUoJumrai9p6iklJOblZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqKYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpuUoJyNgnqlhW1rfZF8gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glKKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaZk5CcjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgubC/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqpqGcq6KkqKSktKScopKmrau3s6euopGQmZylkpGfoZibn52Ip62lrK7AwLGhqa+plpKfnaKaoqSqo5Ogop2era+qraekpKihpqWdrKiRo5qoramanKibq6CVlqSVn6KWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnuoh4WgdZeTiLNjgquGoY6Ns2qEr3R9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGFybXBoYGB6ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mll5yir5+gn6inoqWgn7Crmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn66mrLGpwMezqKmxrpaSnZyil5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0Q5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52no7Ctpa22q7rOsq2mrqyXlZydopmerqycl6Canp+ps6urq5utq6Wjq5qusaGnq62lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpqCbpJ6dpaeno5yrmqKsoaOfr6GcmpKrpLWvrqCnmp2Vk6aikJqiqKCgppyxpqapsq63yLK1qqyplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhs62hqrOxoZqop62utKGRlKKml5qRe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqau1sqybpZyglI+lrJGZnKijoaqnrqKlp6mwtcOys6qtqJOKl5ylm6GjrqWXoZWZnKamrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopiejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp6YiqSXo6l/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgnBbZGBpb2NkXUxNUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpunpqGisK6dpqmitrLFsa2pramRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaeYr6S7rKG2tq2dnLSxt6+xpZecrp+inYWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmmapJyVip98mJmGh49zr4Klm6KOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBLW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqOfpaGhtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ22m6OrpLasxLCpq6mijISOnKKgpqKWmZqdmZyZp6anma2or6Smm62mvayUva+sn6GvsrepsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWthaCVqqCil4afgJmVgHuSfquAnZqWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKfsLCqn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaahmqWdrpihqKe3qcGvpKmknouBjpuan6efkpSZm5WbmqalppuqrK2kpZ+pqL6klsKsqqKgqrG3qKylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SmlZqBrIqEsIWmmqShoZGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFtmI+om4yYkpqafHqRn39ldX9jhnh0gX1iamdxbmdmZlBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop6ln5qjo6WZoKKqs6m9r6Sonp2PfoublqGhmpCRmpySmpipoKKaqa6opqaipKm7nqDGpqSooKmzs6qtpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoTXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52Rm5KaoHuDk517ZH57ZY9neYJ8YWxma2tjUWJbU2pcP1ViQ00pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaep5yaoamjmZ+hrK6quq2no5qXk32ImZGmnJOPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKosrKnrqmfuaatrZlzdqqluIZkiaBwaK6Ri5BubnekkJmfgXWumJRwj4txlaijmpeupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZmTmqJ+iZGYd2eJeGmPa3mAemVtZGdtY0tlWEprWjpRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpZKnmamal6OqoZaepqeosLurq5qbk5N8hJaOppmOkpGZlY6YlqmWoJmpo5yxpp2iq7mfr8Gno7Klqq6wqauppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVq6eNkpKMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4V+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpqlhImXkHNrkXdxjHh3fXpqbWVkcGVVYVlAalxIY2JQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOXqJqompSmoaSRnKmaora7p6qYmpCNfYGVjKKVi5WRlpGQlJimkKCbqqCdtqOdpqu3p67AraK2pa6ur6unp7G2n627mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqK+Yo6Cco6qenp6dl6ydk5mhm5SQlquajpmZl5GWn5GIoZ6WlYWSjZGOlYuBfmaLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjk5+ZpIWKm4p9dJd0e4yAc3x/am9lX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqJmojZqqkJ+6t6SkmJyNiXqClI2clIuVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKwnnd4nqevuJR1rKOeiYCrf2RcYnagj6WfhJh9bZKznKOnraqiZZ6fknN5mpdxgZmomG1/oqiKZZymnZKYmJaNkpyQhp6bkJaEkoePkJKJhXdqjod2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3uonJxme5uKhXqZaoWMhG96gGtyZWB3cGxraVxmZmJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpart7Gzp5urqK2YdI2esaCoq6eUl7mgoI+cpJ2Rf4mImp6Mq5mhlKehnY6Wkp6Edq2PiKebqZKZpYqdu7SooJmYi4l1d5ONl5OKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmn32nonmgrLR/jo2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWgpGXl4SbmWJ6h5CFj5CSi4NtcI2HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseXxxcWhleHBqbGtcZWxqZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8nAsaKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyFjpiXh6qboJWfoJGMk4mGgJGnjYejnqSVmZ+In7qyqJ6ako6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3N7d52Pp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxkJSGaXl1fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCkpaylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJaVkYeqmJqamaGEjot3m5yPn5CInqWcl5qZiKS5rqWanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprIWjjamZjJp/onWBmZRsgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgWNYUXB3Zm51c2tqb11qcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZiho6atr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGTkoyKppSUmJ2efpKFhaykh5uQipmqmZubkomnsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXRcnrKDa2NwdXdyaW9Ya21zc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARF9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGBlo2Kj6COkpSdmH2QiY2ooIeXjomSpJWcm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGhdbnJ6eGtpXHFreXpkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aVg5GVmJB6ioSVpJyKlI+GjJ+Tnp2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXpV2SGVkYXRyf39vZmBsaXd8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn52bmpaZoZ2WiIeJd4aBb3mVhZGbinuRk5aIcoCIkqGcc5GQgYmalqGchY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnp17pZZ6qYCVm4+Jn5t8p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5dsnHx4l3NuqaRnYWV6coCFbGhmZG92eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbGdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmaqhoqWPpqmhmquLm5mZlJmTk6GYjoeFe3B9hGh9j4OUmoB3kY6PiW9/hY6SkmyXk3yKk5Sll4OPq5uUk4uGiXmDdoiBboKfhniBkoaImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlosrW0xqZzmH16nWucm6t2hZtud3mYapp7dZhyUUV9s19qd2x6iGdraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJiro6Omjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY16joyXppSEmaqYjZKLgYl6gH2MeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbF2Ii256fXFxZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVIteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfImImKiSgaOtkYaQi4KKfoCAj3RpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foqknneffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaW1TV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjIxzhnqIhG+MhH2Zk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdsg4VddWd3jmV/gISMp5l9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHbmpnVltgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6iipuom6qZg4KcjH+XlIeOiomNcYJ8j31+joR7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWDho6YdnKEqYaOkp2QiZ+eiIybp5+fqoOJjpWafn6Jlq2nj5Glj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6mnuCioF1gYWBZ3eKhmpfb3GBdV5xiYCIjaSUhWWLjYNud4uEcYaPenFoaWZ8hHuWW1xraG52W3x5eHZvdHODaF1ui2trYlpaX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmKiYeHinJ9gYx2hYuBhJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKki4iTm5yjmZWqoaemn5KahpSMenaNjYOnfn+SkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYSQd3x6dJmgiIaJnYmEk359ioB/dG5yhIF9doWFiY6kj4KFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0inF+e3h3cHh1gl1eb4dobl9eWl1dU2hyVmRdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKShnnx/mqyPn46HoJ2MnpZ9eZWEfI6ZioaEhIZueYGBc4GHfYmUhG1rfnqXh4ODj36Ah4SFfIiFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJeHh5uln6KZnIWCkpqZmI+ap5+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqEhIxzf4l7fHFxeoeCeneIjYORpY6Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheen9pfn13dnd2e3hdYHF+bnRgY1tdX1JnblRmW15ia2l2en9ybG1ka2pogX9sdIJsbHVvenCGem6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVjJmZenqNhn2JkYSMgoKDbnyAeXOBhH2Lkn1raH2Cl4mBiI17fYaEhnyQg5GdnZOJqZ2BcYyLjJKGoKGKhYx8qJGJkJKXk5aTeI2jn6CdlZh+gJCamJKMm6Oho5mWkJp9jIN3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfoiJcoGGe3xwd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH54h3tsjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V9ipF3Z2N+hpeKgoqLeHyAjYN5l4OWmZiNl6Gcf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnaChl5OVeH6Ol5eNlpudpJ2YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4aRl4t8k3iLiHt/hnt6cX13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW2xlU2RZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYN6bpCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmnuXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEf4mLgGRffYuUh3+EhnR9fot/fZmGl5WYjaSimYBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5efmpGPj3J/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5eem6SUlYuMnouGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lZaDfo10kIeCeIZ9dXd/fISAe4KLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ3YHBsdm5vXFxfXl5rXlBeWWNhaG50e4lsYGlla2Npd4duZ21pa21ogX17eG+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZh+n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Jze4CHeo+SiZOSnZWmnJaCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIySnJKPi4tthJCPkYiemaKglpWIlpBth5iDZYWYjpN6iYSQinCWm5Wjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5e5iTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3Fmel5vbHNtclhbX2BhbFxQV1hlY2dxcX+IZ11paWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOPiKGNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeMjI2NjJyJjpCCbImLkZGKnZahm5eUhJeGaYOigWWEnImQfouDi4F3k5mTn5KRiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudX+YjnuHhHmTkHl1h3NviHqEinmKhYGGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcG9rcW1ZWWJhYm9ZUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ybjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgauUhoJ3f3dyg3qDoYOTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKe3KLhYqOiJyan5uVk3+TfWeEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlIt+h4V6ko9xeYNvdYt5iIp5iHyAio6dnIR7enaCi3x3cWpsgoR7YXlxb21zdFZfcGJyYmBtb3pxaXBmZ3V1aXJsYndlXVdmYWBzVFFPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoeAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1tdHNSTYLfyJLWk3twdYR2haGElHeWkZmdkZl7lHOFkJ6hkpORi5OclIZ/l5aIjY2HkY2Hm36NgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIloOGY4yRmY+Vi5eMjIqKcXqUiHuOiIqTkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR5gI2TmZiJfHV3g494c21ncYCFbmx1cGlqdW5TX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fdlBOTGJnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amhrY6Sawdyu8KFzbHaFd4akhpNwl5GWoZWcgZJyhouil4mNlouQnZaDgZaQhYmPgJGLiZV9hnp1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXhOTUxlZ2Jed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPapmRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuQi4WOgH91eIOEcoiCk5yWlJeFjHWGfW+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hY6EkIF7gHx9j5GOlIhtcHmMhXRrcGxzeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGhjaVltV1x1TEtMZmdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBpYWdhf9W2jpGmeG9xeH1xlJKOiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDe3GGgJaajpOTgYh0goV1gn+JkZydhpWPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcXCEe46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcoBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB+ZWNnZ1edj19xc5a9xYV3cpWLkYB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaTjZ2AiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaGh+d2VdcmRZcHRTVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXWtuYXFQWmxSRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYhwepKEfoOEiYNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xwfHJ/h4OIfYWHeohxgG1wgoWNgoJxg3d/loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnJuTlhydGdgS253dmJeXFtZdX5zcFhnXmZrcV9vT1hpUz9ZZ19bcWtoenJcW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIWZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIyHf3uSiHmAhY6DbIByaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltnZm9jak5YZlE9XmZdXnZmX3VxW1lVb2RaZHF6XGheYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1/jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8kIpxfH6GfGl+bWuAe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tV219dXOJgIV2hnSCiXp3cm2If45/g3F9e3yQh4d5bW1obIKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmhOQWFkXGB3YVx1bVhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3Fyh4KBe4Fwhol3eG9vgoGLfXx3fHpzjISAdWdwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURkYlxkcV5ceGhVV1Z4XlxmbmlXbF5hamdlbm5ocHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjWVxgm5ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11d39taHdlbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4GFfX93a4iGc3hqdH+Cgnx5e3d6cYl/e3Jmc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1VeckdCZl9eZ2ldWntjUlZddltbZ2thV2tgYG5mZmxxaHB2eI90a46Ndn93eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hkcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iHqAbm6Kf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3BHQWhdYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinWAe3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue5+4bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eYuCZXB9Z2trW1ZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeol6gGV0hnxtcGd0fXZ8fnB6anl5f3h2b2RrYG2JfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxpSkRqWmJlV1lVeVpOV29rWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2gH94f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd0dIWGeIKFend0dm5renBhaGtnhnSNg21nXl98b3qJfGhsd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3uIhoSHhH11cXNtaHVdbWlgbHVkZ2Zpem97cllngXZ1aHCBeIJ3Y3iFi32Vgm+Ma217gXFmc2Vga3hmcHWIeXxhdYN1aWtxdHlveHdye2V9fX12dW1jZGBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxLa1lkYlZUVXNWTVl3ZVpfbGBcW2RlX3dnbWJvaXRvcX51dJmBeICBeIB/hoR6fXaCg36YhW5ydHx7dXGFhY6CgXqLdXSQgH2BlY6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV15aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXKAb2dpeHNxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVaZm15e2ZfbXFqZF1WYFZvb1hLVGlYZ19ZTlVsVEtdel9cX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR2dmZoaWFXVlloZJCob393f4qOenBve2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnZkdYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGtgbHpuaWh5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWWltd3tlZW5yZmNaWF5Zd2ZVS11kWGlYWklXZVFJY3hbXV9tW15cYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWHBtW15YWlxse2Jxd3ZtY1xudHVpdndyboZ5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoKBc3xhYmlcVFheY2SQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeX15gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZnODk4CJg4l6dm9yfXJheGNZbm5gb3CAenNlcYBkXm11aGNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMW1dqbXN7ZGxsdWNhWVpcYndcVExkXllqVFdIWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybltZWFdgbHZjanVqal9bbnVzbnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGFjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JecGhhd2FbfHZqanJueHR0dWpygpaEh3+FdnNqcHxtZndXW2lsYW9xf3lzZW9+WmBwcGFeaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWm1xWFNQZ1hXaVRVR1pcT0lzdVhgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZ2lzaGN0ZWVeWnB2cHJ2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjXmNUW2BaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVfYG1kYXFdXX5vaGlzcXRxdXdtbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpbHlrYldcVlx1ZVRSVmlSWWdVVElaW1BOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29nc2tmeGVmXlpydm90fHl0bop7f3ece3prYWVsbV5gbmplcXl+Z1pWWF9seHt6b4NeYV1oVlhgWGSciGJrcIGGfHZranZsW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bWmGjYCKe4htcWZwe2xxbGFYX2dmbnKAc3JeaWxTZXBkVWJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aW9/ZWBVXlRedlxVUmBnUF5iVVRLXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKUk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6NjY6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD8vMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0REQ1hoZmdnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4aJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5COi42FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiIeKjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OSk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f39/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JscWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJucmphWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW11cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJoa29wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2lsbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3Ntbmxqa2hVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHN0cGdUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbHxqPzk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJTFFNTUtFQ0ZHR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk5pWk9QTklHSUhISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hLVnNeVlFLSEhISERHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8UEpZbmVeXVRHQ01GQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SmBiYWFjZVNOWDw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5xaGhnZWdpZmhGNjg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIx4bWxpaGlqWTU2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qKi4l2bW1tbGxVNzg1Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYhybm9vcGVAPjo7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoJycnFxY0dGQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjX5yc3JTS0pLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyMi3t6dF5nXVBLS0tJSkpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt4e29nVU1MTUpKS0hLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2OgnhyVVJST01OS0lJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMc1tWVFFRT0xLSEdDSEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI18XFtXVldVUU5MS0VGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+Mi4tsXVptYkdVU1JRSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dvX2dYPFlaWVRRP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJi4x7cXJaXV1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIuAaFtcXVpVV1VYU1JYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1fU1daVlNWVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3pvcllMTVBQTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTkVARERERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhBQTw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX1xaSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZFRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NzVXb3Bzd3l6e3x9fX19fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXt8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTU1NTExPTlNkTkpMUkhJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49OTk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRURFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTVBMUFBRVVZXT0tWVlVTU1FSTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkZHSUZJRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUVJUWFZNTlRWVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0hKS0lJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENGRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSElFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEpJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09NSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhLS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYCDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUlZMS05JS1JYV1FNT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm9OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUklSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0xQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVVFRVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYWFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXU1ZaWFxdW1tdVlNNVFVVXFxXUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1lSVVVZWVlVV1pcVlNXXlpdXWBcYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWJmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISEhH58fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYGCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgYGBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCb3Jvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgYGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYKCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoZ58cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKepl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1qqyjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiVnIV8fn5+f35+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ukl6Sbm5ahn4Z/fX1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjp+yqKKgmZ2dpqisqKCZkYeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eal5aYoJudnZ2ZmpeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4SIkJOPlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGDgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4OCio+Cg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDg4aYj4KDhISEhIWDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDjZmVkoiEhYSFhYSEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWUm6OropOHhZCHhoeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/iZKdpaamopOQkoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3mJmJecoaCdnZqMiImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e36Sm5mdnpydk4eIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYCVmpmbmpmShYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCWmZmYlZKCgoSEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt7eoaXl5WWj4GBgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp8e4qWlpOEgH+Af3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7ent7fI2MiouXjH1/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5foyNipGPgX9+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5ho6HgoKDgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7hYSCgoSDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYOBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp/goJ/g4uEg4SEhJeXg4OEgX1+gYGCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyAgH2HlIODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8fYGCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoaEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn5+f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXt9fH19fn1+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5/fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gYCAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/gIGAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH5/gYB/f32Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgIGAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIKDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4SEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fX5/g3uFg4CEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGBgIGAgICBgYCAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aGh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9PD46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX19bU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLe909PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6Oiq9PS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaiw0tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0tTT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9PTz8/Q09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0NChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ65npaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1l5+gqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZymoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+lm8fJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uXlJ+VlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PDw9OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlnYaer7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlqCPo5uinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Scvp6ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGUlFLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojs9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNmvjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlRMRkI8PD9GRUdLST02Njc6OTc5Ojs6Oz05Pjk4Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4ODk5Ojw+PD43Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRLSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1NTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOzo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSERFQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw4Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo7ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY4ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4aBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjUzNTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2OT07PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubm4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2PDo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyODk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz5AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzo9PkA/QDpAQkJCPz9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7OwsK2sq6qpqainqKmpqaioqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiYmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTkzNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKinqKilpqiop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD46OkE8Nzw4Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2srKyrqqmopaOkpaampaanp6qopqanp6eoqKenqKinpaSkoqGhoaCfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Ctq6mprquopaWmpqelpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1Njw/PT9BPzw/QkM/QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaOio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj47Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpKSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk4PTs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Oio6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Oj07PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6goaCkp6empaOioaOnpqalo6OmpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqOlpKWlpaWlpaWko6SjoqKioaCgoaCen5+fn5+enp+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manJ2eoaampqWko6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5eYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6OkpaSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2dn56bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6ODY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6Ojo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaXmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqalpaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2en5+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnJ2cnp6en6ChoJ+foKCgoaKjo6SkpKSioaGenJqZl6O3n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZiZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoaChoaCgoaGipqGioqKhoJ6cm5ubmaGplpybm5mcnpqWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJGSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE9PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz48Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKloZ6goaKioqGgpbKtoKCfn56cmZmampyuZnidnZ6bmZqcmZeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOSkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6aTmKyfoJ+dm5qampmqgESBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCfnp2bmpqam5qYmZmYl5eWlZSUk5GRkJCRkpKTk5KTk5SXmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw9OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz86OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ufoqKem5ydnJycnZ6gn2GZqJ+enJqam5yjoU9IhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foKGgnZyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+enJmbmpycm5qamZaWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0JDOTw/Pzs6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPDo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYl5iZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqdqXKKgm5mZm52cr3JKTIahnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmJiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilglN3opmZmp2boKNfV06HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5qcnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWWlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIpcYJObmpudnKOPZVpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+PkI6RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZ6ZXV51lpqcnZ2igWVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bm5ubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDk9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZycnZybm5ubm5yamJmZm2FiYH6Vnpyel3RjVU+Bop6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmZqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpmYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oj06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56dnZ2cmpubnJubm5iZmZ9pXVtjfZycnotpXlBTh5+bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+MkI6Qi4uPj5aIiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoqqxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg6OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRho2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZuampeTdm5mVnmUmJ2JW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo4Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+MkY+LjI+QkZGOk52fkn+ipZimnXRPUGSHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo6QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaKbjHxmkqWTnHuIg2N0gICCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKjiXlsUXOcjYtYcHt8f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3OTo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmXVTS0tzk4WCTF5vcXeJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo9ODg7Ojk6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S4CCiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+DgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GOo4tQMC87eIZ2dUBCW2pugpCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/Ojw4OTU4NzU3OTU6Ojo5PDg6PD06PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5xjQ19LPHh4aWZHMTZXbXKQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZDPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqq6OSXiqfkB8eGViUVZjSl5viqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRT43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidmPC1KVFfZCEeE9tjXhWYoCjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6qppKenmZ2kpaOinmOBu8CufKSjmpdsSVx7cFJ0laOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07QEFBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCip6GmrqamnJ9sg5i5i6zTo5u0rFxNr5pVZZChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Ojh3d+enPRxLCZo61sVqeuZl2HpqCloqGdn6KYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbW2sq2wrY+HgW2Sy72VlaaVdFZtd3Vzf5WmqqekoZ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyuLu8vLq6wrm1tJ6GdmFWnrW7pqeZh3htcnB4eXp9hIyRlpuhpqespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMLIztLQzMi9saONcGVSRIiUhYWFfXhyb2Zla2hrcXNxcXJ0e4upxsa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb5OPZybuuo5WGcllaUURmd2pudG5rZWVZWF1YXGJpamhlYWuPuMHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zNDUyrmmmpGEcFxRVEtEW2ZeY2plYmFoW1VZVFdZWlxZXXmeuLqrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJuJV0YVRPT1NIPl9sX19lY2JfZGJUVldWVFVbeaKusKqoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDn2ZLREdLRD1aZGJiamRhXGRfWFNQUFJch7a6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGwilNHTUU7S1pfZmxnX1xgWVpUT1mHp6y4tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsedcVxIPz9EXmJha2JbWFdTWYChub+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsbGxsCvelVOL1ZUV2hhUk5UerLJyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLCwsPBlUNOeYOOVlB5rc3Txba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68x6Z5bYKRlnK0zMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb+ucGF8kYqL0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqysp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5tqulmI18hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG9ycWVSHzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mxvcPKjUR2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqbnVveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/AwHdRb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbW9gY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0cO6vrzEvre8wL/Jz8fIysnBhXFzpczMy83KxsLDy87BvLi9urBuY2O8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAv8nKwb+7ubGgfHJrrsjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmI98gJvKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1puc3eBn7i4wrqzu7e7vb+6u7uupJqXhpB+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJabpZWgca7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUphjaCsr7a6tbSyrLy5uLW4wb2Ll6+hpXKly8K/ubq1rqWss7Cmr62onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYKonZljqb+4tbKxra2fpKamnKOlnJaZmZqfqa65rKurn6WopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7iztLKwsa2wubi2u7e6vI+hsaqjcqywqautq6OooJ2enZaXoZWRlZePl56orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU1AUnhxUElJS2ecgVlEUq67sayzr66srba2srS1rqimnpqbnZ6mqJ6gqKmfoaeWmpaXjZuSjI6UjJaao6ign6GioaalnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBLVI5hY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olJmUlYqUjoqNlZGXm6Gpnp6foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOdd1BuS0xjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJWdmpSNj4+PkJeWmp6jqZ2goJ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSElLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXVFrY1tkX1xrj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKclqeloZWVlpGWlpSbmZ2jpKifpaOep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1RS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2etrqyvp5+eoqCWkJOboJyZl5KTn5yho5qempijbn2XmaCbop6copyipqutp6uopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ+ZSEePn5+mo66npKygqKu1sLSwsK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52JYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWmdipgkp6jq664r6+ur6+4vLu7uLW4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhsi1c1ZoV8eYCWvLy8sLnBw8LGv77CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbHBsVGBrcHJuc4+uxL7BzM3QyMTI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qe4BkWHd3cm5yf52+z83TyrPR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm+Ee3aAfXRydW90ns/Q05m219PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Bvc4OAe4F5bWloXm2+06N/0tbUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWpsb3N2fXJ5gHJiXFNZo61yq9rP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5ucHFycXZ0b3d5dGNbXHt3iNHUyczNxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NLTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltc3BocnRnZmNdd8LFx8fExL3Bxc7Ox8XGzcrRyMvNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDo6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp1amNiXmJlXajGuL/Bubm4uL3IxcHDwMPHysjIycjBxczGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXWBbWVpcYW5xbWlmZ2tpbndcWFZdYWmqwa21uLCwsa+vwbq6u7q4wMHBxL69ub3AucTKxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpamt3ck9RV2JxmrSrrq6kp6uppLWytbOys7S7tb2xt7C1r7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI+GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhobHtlSVx1h5SoqKijm5+npJuoqbCsqaups621sLKoraess7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmhteWRthJCTm6KlrpqboZ2WmaKorKOnoaupq6uwo6afqa21trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG15eYCHhpOYkZWtpqCYlI6eoKeiop+kpKalrZ+cm6OlrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmbHlzcWpYW29Fe6CflJKJmp6fpZuenqKkoqedm6KbnqqurLG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hYmNjYmJjZGVwalhBIjpxaGmHnJKSjJeenqadmpujpaGkm5+gmZiura2vsqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnqamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYGJjYWFiYGBkZnJEGRxIipSQjpmRlI6TnJqem5Wfn6einZ2nm5qaq6evsKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJqXyU3boeLjo6UkpaQkZicmZ2Unp2lpKKlpp6cn6agq6+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJUX19dXl9cXV1gYWxXXIeDiYeNi42VjpCToJeelZqeo6CrpKOjoqSinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY2Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1tcXFxdXF9ia4OJfYp/iIiHkoyPjpiYoJmZn6anqqerp6mlopikrqSVmKSvqaCcmZugn66ZnKqzn6amn6OjoZWUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2doZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmR6hHqDd4SIg4uHkYyTlp6dmJ6pqKWtq6mwo6eZnqyglJSjqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk1OTVJXWFlYWFdaW1tgaXdwdm1/hX+IgpGGkJCUmJabppmeqaalq52mmJ6lm5KOnqKal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFsaW1ne396gXqMgIqGkY2Qm5+NmJujoaOYpJahm5SNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFtdaWRnZHV8dG1LVW6Mf5ODipqViZKQnpidlZSWk42ViYCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBpZF5xeWxMPz19k4+NeoWSioOIi5qNlpSJkYaEk4V5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTkxNVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVabX1qbXZjY1hSjoaShXF8hH56g4uSgZKZi456hY9/dX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5zfnZyYXGJlJeNjXlkd350dn2Hj3yDmJF/cIaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWVvb2eDpanAfXF2YHl2bHl3ho95e4uFbmuLknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBtZWtrWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtepYZhmGVvdWJ8bWt9eImHdYGHhXNrmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjMzNTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5ud3RpempvgH+DgHmDhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTExMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2RqXklQRz0/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfHl5c3tqdIWGenyDgn6LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoYSKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYV4hnd5b3qNiXh7h4V+lod2oJmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiICCiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtNTVBXYFhvWVtdZ4mPg5F+gX+Dj498hIePgJmUgZ+gl5Sbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMTEtOVl9ifmZma3KYlouXkJCIi4yXhpGOnIqfn5GiqaSjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITExNTlJebYl7cn97m5mXpKKfl56UoJObnaedp6qep6upqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWWyEjnaSiJ6iprG7tqKsqqump7Oqr7Wxsa26sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+So52inY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUVeAkZ6Dq6Gvp66+xcGoscS1q7K/sre9tb60wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60oKeoo6eaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDk2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorCxv7K1vsrHtbrEvbKzwLa3wbS+sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayssaWwqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZKttrO5tse8uLvJzLq7wLu3tbu6tr2zubHFYHWypLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL28vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQUlNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluSt763vLXEvrm4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLuYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhlrXFsLiyuruzsMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZast6uzpq+1qau7v7CqtKWkuKarrqCrtKOOsK2al5iMkJORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbKhoa2ho62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHh4uIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6OxnqGlnaCooKOxnIWekpGRj4uNi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+grJuhmpifpZ6fq5mLmouQko2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9a2pdXFFUVWBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId7dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjoqEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSQmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisK2KmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mSnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mWoKKNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWnKeasJqRq52Omo+SjpaRj5WXjpGgkIiUm6SslJaPlJyelKGem5igoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlJaloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltebFROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5STop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52Zk6CioZyYn5iLjI+QnohakJaXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjM0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqVnKKfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7efqZylo5qcoZqnpLOhm52lnKepnZiUj5Sbi5aJjKSilJyjn6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZq6GeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKmdqaydnaGbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytm5uemKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmZl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ+boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsaWppaGem5malZeooJ+Zop+vs6OmjJevmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GanpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoaW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2ktLCcn5CTppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmZuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Orsamjm56opJ6VoZmcqLapmJqSkZ6ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6Cel5aWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajq6ilrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusrqWl6evrKiks6mUr7ukrLKypqejsrSxsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLW6rLWytauzrKqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamvpKejs7SwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqmqpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLuluLOsrK2nq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7W3rKykqaqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiXo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMHAv6+ys7O2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCop56nm5ipsKmin6yioZKhoqOnmJqpppiYmZ2Pi4eViHyNhoSFpJaGg4OMh5CQkoWHlaCWiZGdkZOQjZGclZiPi4aGeHSBf310eHqAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vK25rKO1pqessba4sqanubWttLyvvKWtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamkoK+cmrOilqWbpaSfpZqZqKqlnpqpoZuRm6CknZmXqaqRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSak4aToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qUjIl9f4yHkZCNioaSl5GHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q6uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcm5qdqaaWm56okZiSmZ2TmZahqpGbio6Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSWmY2Uk6SopJCJio+GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGljZmpqYGtjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLCso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t6+8u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyinJafnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiIqLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdXNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2uravuL2spp61qZ+fr6Oprpyhv6Cwo66xr7eutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKeknZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6Gpn7OqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56fmJCeqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+pqaeqv8Ovsbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqqCxp5+iopmgoZqss5SjpaW2vaatp6uqrKimoaCYoKajmZmlo6SYnKSplpSinJOTo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKosMK+srW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhn7Szoquco62toJ6alqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wen5+ulZ6ZlJWVl52roJmZpKi1r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw8OD06PEM6Rjo6PzY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqitsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZOlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlq7CmopaTraClkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m1q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwsKedl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJufvKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZSbrKqXjJSlmKWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Cpo6qypLSlrKWelZmqmKasuJyirZeUn4+kn5KMnKKdl52akZWSr7myrJaYpKinlJCWpJykrZ6RoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaGhpZ6gnZmTq6SsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNxmoppcot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtYZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpyUoZ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKa3OBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJurnaufkJaWp52qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamZjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSgqqSrl5aXmaWdqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAiIJueIJ4gHNteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ2hnqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kdq6KkqKSktKOcopKmrau3s6euopGRmZylkpGfoZebn52IpqykrK3AwLGhqa+pl5GenKKZoaOqo5Ohop2drK6qraekpKehpqWdrKiRo5qoramanKibq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdZiTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gn6inoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqSXnaejn62lq7CowMezqKmxrpaSnJqhl5+pqZ+VoZ+dnKyuqKyqnKiopKKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCsmp2mo6+spKy1qrrOsq2mrqyXlJucopmerqycl6Canp+osaqrq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqip5+fpZyxpaSosa23yLK1qqyplpKcm6KZn6WznZqhlJ2fpqytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKejn6mnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq6opp+so7esobK4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpumpaChr66cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKupKaYr6S7rKG2tq2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+epqKcp521mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2orqOlm62mvayUva+sn6GvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfZdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfsLCqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqSdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrKykpZ+pqL6klsKsqqKgq7K4qaylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpqafHqRn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYV5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5KaoHuDk5x7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6GYmZmTmqJ+iZGWdmeIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7ernsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKmmKmal6OqoZadpqanr7qsrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+WhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqlhImXj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVFFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xry6q6Olnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWp5mompSmoaSQm6iZobW6qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiX2LlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm62KqZaPqJmpjZmpj565tqSlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJxme5uJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmhYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcurOooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYSVkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZnRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjpC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCZl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5Zwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcGxsallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya2xyc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq6dnLKurJOYopqhpJmblZ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFqeHlkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGwrJ6mnJypoJ+vnJ6xqa2el6SboaCZl5ego5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSjqI+gnp2bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnp17pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5hsnHx4l3NuqaRnYGV6cYCFbGhmZG51eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqLm5mZlJmTkqGYjoeFe3B9hGh9j4OUmoB3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhneAkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRoY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppOEmaqYjZKLgYl6gH2LeXCQoYZ5gJWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlza1lsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlYqKlZmCfIiHl6iRgaOtkYaQi4KKfoCAjnNpkKaEfYaTjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuChpimjn+np4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4KcjH+WlIeOiomNcoN8j31+j4V7mI90coRxlYV7fZKLhoaPhHl+gIeapY58qKKMhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoSJjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX98mIZ9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4iTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4WGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5uln6KanYWCkpqamI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeCeneJjYORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2en9ybG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnKCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqZ2BcYyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCbmZKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcoGGe3xwd3qKgnh4j4uBlKWSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiNl6Gcf3CMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6OmJiOlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hnt6cX13iIN4g4+HiZehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh3+FhnV9fot/fZiGl5WYjaSimYBzh3uTkYmmj4yOipOgkYOSkJWXkYuBj5efmpGQkHN/jZKUiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnoyGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eCeIZ9dXd/fIR/e4KLg4qTo494g4F0iYd9gHR2gomFcGJ8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lsYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Nze4CHeo+SiZOSnZWmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhWZpenV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+IZ11paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi42NjJyJjZCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYGHjZqihnuDdYKLf3d5bmyBhYNfdHVzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgb29rcW1ZWWJhYm5YUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauVh4N4f3dyg3qDoIKTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJGWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt+h4V6k49xeYNvdot5iIp5iHyBio+dnYR7enaCi3x3cWpsgoR7YXlxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2IkYyHm3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqKcXqUiHuOiIqSkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3pocmpzio+JgYWEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBxY193YGBWa19edlBOTGFnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGJiZZ+h3p1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYKBfouVhGuBdW2Hj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBzb1tjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uPioWPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hI6EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2tXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiX2gf4OZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1goV0gn+JkZydhpSPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnRiXGhfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmnyLmnd+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdIiFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB3en2Lh4V7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5jpZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYdwepKEfoOEioNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xvfHJ/hoOIfYWHeohxgG1wgoWNgoNxg3d/l4uNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdnXmZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuUcG+Af3lmkoqCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuHf3uSh3iAhY2DbIBzaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9aa31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMhJudloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh+fZdvcYV9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8j4lyfH6FfGl+bWuBe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tWG19dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLdHlrWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHt0jYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d5cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1dllRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46Ndn92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweHKFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnJRUlRXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3eHeW6VinV/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anh5f3h3b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXVrTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVqWmJlV1hVeVpOV25qWV1sZVxaZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311dIKHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bISGlYFyj4JxhoJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISGeIKFend0dm5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yIhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFmc2Vfa3hmcXWJen1hdYN1aWtxdHlveHdye2V8fX53dW5jZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ0ZEtPVFhha3d+Zl1nc2llX1djV2NxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2RlX3dnbWJwaXRvcX51dJmBeH+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgXqLdXSQgH2BlI6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl9KTVVZZWx4e2ZfbXBqY11WYFZwb1dKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6aGl3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYR9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWGhsdnplZG1xZmNaWF1Yd2dUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmRef2lqYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboZ5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMWldpbHJ7ZGxsc2JhWVpbYXddVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdga3VkanVqal9bbnRybXR0dWuHfX+BfXdvbmxkaXBjW2tyZHR2jnNcV1RjX3B/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYV6MamNlbXp5bG5pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gX+BdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjWRPb21cVldVZmhzaGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmJ2fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYV5ej25iZ2x5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29lcmtmeGVlXVpydm5ze3lzbop7gHece3prYWVsbV5gbmplcHl+Z1pWWF9qd3t6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3uBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWh2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6Ojo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0RERTkuLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU3JxscHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWEg4ODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CNjI+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4eHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYaGh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQkpGRkpKTh4WTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKBkpGRko51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkY+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fX19fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI12bnuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtboN6dHaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJebGxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1lWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bWJuc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW10cmdRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxkb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJVmNna29wbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2lncm5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXWZsbmtvbW1sa2lpa2NSR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Sltpbm5vam9ta2psbGVQR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTo6PUdibnNubmxrbGdUQj9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRkVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxJX3N0cWZSPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1pPjo7Pj0+P0BAQD4/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEFERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0FEX2Q8PT07Oz0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCQ0VIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZT08PTw4Ojs/Pz08PTs8QD09PD09Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTEZGdXdNNzg4Ojs+P1dqQTs8PDo7Oz4/Pz09ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QUBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSklNTUtFQ0ZGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOT1BQTUlHSUdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hKT05PT01LR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8T1hkTElJR0dERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop2b2lTTUA+QT8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5+bGJhUj44P0A3Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYxvYGRlWUFXPTU2NTU4NzM1Njg6ODc2NTY1Njc2Nzc3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYqKiYmKioqKi4qLjIZqZmtpZlE3ODg1NTg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoRrbGtiPzw+Pzk5Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoBtbGBFREZGQkFBQj9AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjXtta09LTUtKR0hIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyNi3htYW1kTU9LS0tJSUpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyMh3l5ZWFPT01MTUpJSkhLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4yNhmlSUk9OTk1OSkhIRUpJRUtJR0tKSUpHR0dLTE5MTUhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMYVRVU1BQT0xLSEdDSEpHTEtHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI59WlhVVVZVUE5MS0VGRkxPTlBXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxqWlhsY0dUUlJRSzs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x+YYqLi4duXWVWO1laWVRRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH17fn9+fX59fX1+fn9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BaXF1cU1VTVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af39/gH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1paXFpVV1VXUlFXVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxeUldZVlNWU1JRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f39+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU5eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3lvclhLTU9QTU9MSktERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTUVARERERENBRVBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhAQTs8PkBAP0A/a1BKYEVGSElFQj9HTE5HTVFVSUFFPj88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNTFRUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0tOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9BQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTktMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxJS0xJSk1NT1BSUEtHQ0tHQ0JJSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREE+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5vcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNFQ0NJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTU9MUFBRVVZXT0tWVlVTUlFRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUFJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21uc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HQ0NBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW5zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTExbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5MTUxGSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFwcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSEhFSExKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTktMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PWFFcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTEtMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERRYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0tQU1VTUVFTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVVpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGFYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFXV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5jXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZbWFxdW1tdVlNNVFVVXFxWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxXVVteXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFpYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xcW1pcWlpfX2BgZGJjZGRiZFlhZmJmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZXGBhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7e3t7e3t9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJiYuNjIyMjI6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyMj5CPj4+PkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISEhH58fHx8fHx8fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3t7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fH18e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoKBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYGCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFvfoJucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeIcHJxcHSagW5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaKDb3JvjZ98b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1nqJ3cXegnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHuJoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5oLSppqmpl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/f39+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvpKG1qqyjf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maWWorGgmaeUfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI2gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJixoZiVnYV9fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqMjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f3+Afn6AgX5/oaullqSbm5iioId/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIGBgYODgYGBgoOChISHj6Gyp6GgmZ2dpqisqaGakYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tsaabmqCbnpycnqGko52UiIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDipeZl5aYoJudnp2ampeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJSOlJiRh4KChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4iMh4KDgoGAgIB/gYCAgICAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CBgH+DiY6AgYKDg4B/f3+AgICAgICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIOEg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOCgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4ODgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDgoOEg4SDg4SEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4OEi4aEhISEhYWEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAg4+XhoWGhYWFhYWGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+BlZaSj4iIh4eGh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qKnaekmIyJi4uIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e32Zp6SimI+Vi4iIiomIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fIGcoJ2dnI+GhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoOcm5yVhIOCg4OEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYmbm5eFgIGBgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp6e42alYWCgH9/f3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4+TkZqPfn5/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5gIyMjIuBf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5f4WAgIGBgoCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx8enp5eXl6gYKCgoWDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYGCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IlYODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4ODgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Bf317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9g4GAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXx+fn9/fn5+fn18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f4B+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+Af4WCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY6Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt8fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISEgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4KDgX9/gYGBgoGBgYGAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx9fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3p2enh5e3t8fX17fH19fX1+f4CBgICAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4ODhIGEg4CDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foWEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnVmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnx8fH1/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4mGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiFhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOEhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fX9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiImIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWFhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhIOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIB/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOFgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAg4WEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CHhISEhISEhISEhISEiGdAREREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiioaHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Oz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztLSz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9KnntDP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9aznqOm1rCgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7QnZqTncCemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5q0wJihnLSYnKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbaZlq25hp6WsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Pz9WlmbatmIGglnibhJ6To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm2rpuoiJx5n6mFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatre1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTGo5eXnaWnlpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZux2J+rpJvQn6ukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCw9XFkI2318KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TR1MfD1dHVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE9Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZlqa5n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCjpqGioaKhoJ6cm5ubmaOmkZybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgprGuoKCfn56cmZmamp2tYXmdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgn6aSla2foKCem5qZmpmre0OBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6foWGWqJ6enJqam5ukn01JhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmadsWqCgm5qam52cr25LTIahnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilhFR0opqZmp2boaFgWE6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoItdYJGamZudnKOOZVpMgKKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ6ZXl9zlZqcnZ2hgGVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYm2FiYHyUnpyelnNjVU+BoZ6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmKBqXFphe5ucnolpXlBUiJ6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSeHNrWHyVmJ6KW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOlZ+fkoCkp5mmmnlVT2SHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaSZi3pijqOSmHOFhWh1f4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foSih3ZqUHGbjYpXbnl7f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmHJOR0lzkoOASlxub3aJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPo4hMMzI7eYR1cj89VmptgZCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5tfRWROPXl3Z2RINTZUbnGPj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa6MS4K2hkB7e2hjUl9xUVtviqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidGjF0qhJgJWMfU9sintaYICjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinmKCuL+qha+jmp13R1eBclJzlKKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ5vgpSziLbWppy4sWJQtKNWZJChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6OjiXd/dXjTu6mTnqhsVaGqaF+Hp6CloqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbS2sqywrZCIf2yYx8SXnKqSdlppc3V1f5KlqaekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyt7u8vLq6wrm0s52EdF5RnbCvpKKRhHduc3F3eHl8gomOlJmgpaespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMPJ0NTRzMe8r6GMbWNSQ4ONfn6AeXVvbWRkaWdqcXJxcXFyeYmpx8e8oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMfb5OPXx7mtopSEb1dYUERhcmdrcmtoY2VYV1xXW2BoaWdkYGySusC/uamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+y8/Uy7mlmI+CblpQVEpDXGZdYWhkYWFpXFRYVVdYWVtYX32huLmrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJupd0X1JOT1JHPV5sYF9lY2FeZGNUVVdWVFVdf6eur6qoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubfEo2pMQ0VKRD1ZYWFkbGRhXGVfWVNQUFVhi7e5rK6lpKOnpKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGzkFZITUY7SVhfaG1oX1xfWVpUUF2Nqqy4tbKsqaOhramsp62frLS0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsijd2BIPz9BXl1ca2RbWFZSXYiour66vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcbGx8K1gV1UL1VZXWxfUU1XhLnKx8LExsC8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHCwsXGnE5SgImVVVSDtc7Sxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68xad8dICRlHW8zsfH0MCvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb6xc2GAkYmKz8S/wMm+sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjZ2pnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5trO2no10hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG7xseWQnzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mwvcPIjEZ2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/Av3dTb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbG5fY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysnBhnFzpczMy83KxsLDy87BvLi9urBvZGO7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAwMnKwb+7ubGgfnNsrcjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhyd3yXvb/GwLnAvL7FxL29uLGwmY9+gpzKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpTUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1wqWHaVpeYE1SW1puc3aBn7i4wrqzu7e7vb+6u7uvpJqXiJJ+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4iqCvtZ1qZWdWWWBJSU1QU2x2hqWwt765srWyu7m8trm+tJWcppehcq7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2Kl7ChpnOly8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05BP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQFyBr7WztbK0r6y7uri2ub/FdYGpnZpkp7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0BTo7mztLKwsa2wubi2u7e6vI+hsaukc6uwqautq6OooJ2enpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaE5AUnhwUElJS2ecgFlEUq67sayzr66srba2srS1rqimnpqbnZ+mqJ6gqKmfoaeWmpaXjp2TjpCWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvWhFUp2CUVdJSmBKVI1gY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJqVlouWkY2Pl5KYnaKqn5+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmt7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6BQQXOdd1BuS0tjZnRzX1pecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaXl5WPkZGRkpqXm6Ckqp6hoZ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5emBiU1ZhSElLS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXFFrY1tkX1xqj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KYmZeXmJSZmJadm5+lpamgpqSep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NbWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SMeVVpcnZ1cGN2dlhXY2BjZ1hXVmetrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemp6XmqKdpKCeo56kqKytqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqeHVebVtSYUlSVkhGVldKQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgo4BugnBgY1hMW1NaTUxQWFJHTExHmKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZmmn6CnpbCppq2iqq22sLWysK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdnp6anZuUk5WUnp6YlIWenaCZq6Orsa+5sbGwsbC6vby8uba4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMm/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qrqOerKi2sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIRUpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKael5yUkZqemZWMioaIhnhsiqWioqursry2w72+srvBw8LFv7/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iSjY+Xl5SPjZCMgoOCdnJwbXCHpayttLjEus3Hy77CzM3NzMfI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwrzDwb+/v7W+s62/wMPDx8XHxK+/ubK4vcTCwrq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkI+Mh4SEiIaDgIGBgHlxcm9reKK2u7m8ysHT0tLIzc7R09HR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXhxa2ViaHJwcnuFioB1cG1xcm+EnK28x9HR19bV0dbN1NbW09PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKyMDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBubHBvdYB3mLjV19bX1tPXz9XU2dTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0tHSyMzNwMvNxtTPzM7JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym5yTfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucHR5dml8qc3U2NjY0cXT0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOztDM0M7OzM/PyMzQ0cvOy8PJx8rNy8zS087T0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucnJ0dXpxYm2ex9XU0KTKz87Tys3OxM3K0tLOxs7MzdTLztLNytbW0MzR1MvM0NHTys7R1dLV1srAysHGzcPIysPNxMbJy8vPy87N0M7UzMbJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFyb2txeXRlbp/PzZuX1snDyMjFxr7Cxc7Ox8XGzcrRyMvNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcrM0MjFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBubmlqbW56Z1WAwKJ5u8/DuL/Curq6uL3IxcHDwMPHysjIycfAxcvGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdETERGUkA1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXmBbWVpcYm5xbmpoaW5tc3lWapR7q8PFwK61uLCxsrCwwbu7u7m4wMHBxL69ub2/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBsZmVsbW97eF5mkse5v7esr66lqKyqpbeztbOys7S7tb2xt7C1rrK7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8vFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbWdlaGtsb35taLq4trOuqKulnKCnpZypqrGsqaups621sLKoraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxkbW5mZWZnaWtweom3r7Sso6KkpJieop6YmqOprKOnoauprKuwo6afqq20trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6uruyvL6/vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2ZrZWNlZGZobHGCpaSqopqZnqGRmqKYlY+foKeiop+lpaelrZ+cm6SmrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbOzsLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11eZGJhZGVlZGhqbIacp6Wilpedk5iflZOJm5+gpZuen6OloqedmqKbn6qvrbG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqagqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCyua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hY2NkZGVmZ2lxiZCCk6uXlpOXnZKTjZmfn6adm5ykpqGkm5+hm5iura2usqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnaamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dWZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYWNkYmJjY2NmaXNzR019kJCSk5qTlpGUnZufm5agoKijnp6onJuaq6eusKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyjoKCTlaGUlpacmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFhYmBhY2RrcmVnboiOj4+WlJiSkpidmp2Vn56mpaOmp5+dn6agqq+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfoqOdnpick4yglJGTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsXEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19eX2BdX19hY2mBj4WFi4mPjY6XkJGToZeelZuepKGspaSko6OinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwm5+in5+XmZOKnZGNkpSWkJiYk5yho5ykoKKVoKKkpZujq6WipKqkq62lrrKppqWmprSmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0lDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1xdXV1eXmFjbIiKfouBiouJlI+Qj5mZoZqan6eoqqirp6mmo5mlr6SVmaWvqaCcmZugn66ZnKqzn6amn6OjoZSUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWFlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVlZWVxcXF1eX2R6hnyEeYaLhY2Jk42Ul5+emZ6qqKaurKmwpKian6yglZWkqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0q66nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS01PUkdOS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWVhbW1xgaXp0eW+Ch4KLhZOHkZGVmJecp5qfqqamq52nmaClm5KPn6Oal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVldYWFdaXWFsbHBqfoJ9g3yNgYuHko6RnKCOmZyjoaOYpJehnJWNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVVRWWFpdaWZrZ3l/d3BMVm+NgJSEi5qWiZKQnpidlZSWlI+WioCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipq2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTU9SVFVYWWBqaGJ1fG9NQD5+lZCOe4aTi4OJjJqNlpSJkoeFlYZ5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuipp2foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVaboFucHhlZVlSjoiThnJ9hX97hIuTgZKZi497ho+AdX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl51gXl0YnOKlJeNjXpleH91d36IkHyDmJKAcYaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamkoZiZjoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWZwcGmFpanAfXJ3YXp3bXp3h495e4uFb2yMknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+lopmVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBsZWxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVtfpoZhmGZwd2N8bmx+eYqIdYGHhXRsmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5weXVqe2twgoCEgHqEhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2NqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfnp6dH1rdYaHe3yEg36LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpodmtSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYd6iHh6cHuOinl7iIZ+lod2oZmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhvWVtdaIuRhZN/goCDkJF9hYiQgJmUgaChmJSbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZmbHSamI2YkZGJjI2Yh5KPnYugn5GjqqWjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8gYKDdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop7coB8nZqapaSgmJ+WoZScnqedqKqfqKypqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3aUiaCkp7K8t6Otq6umqLOrr7Wxsa27sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+SoZ2inY+joauuq7K0oZSkqYiZiJKJlXl6foaAaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeAkp+DrKKxqbC/xsKpssW1q7K/sre9tb+0wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6ano6eaqa+ssbi3uKaataiMpI6Qkp+GeIGFd1tjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorGzwbS2wMvItbvEvbKzv7a3wbS/sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKWwqa29sLy6wcGrmLmnlK2Ol5epiH6DfmxYZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfYqCgYuDlX13enVlUFxkR0VLO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZOut7S5t8i+uLzJzLq7wLu3tbu6tr2zubHFYHWxpLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXNhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4qDh3uLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluTuL+4vbbFv7q4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLqYgHttX2FdWl9iWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYezq6Chn4uZnJmMjJWRmpGFiop+iIaMkIuIfIGDc3uKgoV7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVlaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7bGsLiyury0sMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooNwZV5fX1phWFpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uzpq+1qay7v7CqtKakuKarrqCrtKOOsK2al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cGdfZF9XYVNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmuAc3Jpb3F6eXF6vsuafouxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZKPiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXBlYmFZVVpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCclJ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtAi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4uOi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZl9bU1dSXFdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Cdi36HkoOJhoSJgYd8eIWWloiOg4eFhnqEeHF6e4OGdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKrCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+hrJuhmpifpZ6fq5mLmouQkY2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9ampdXFFUVGBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGLvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKScfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdi4uQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpIeLi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WbopudlJJ/jIh/mIeAm5Juh6iFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhaSGjJCzmJ2SlJehoZ6ZkpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIKEfn+SpqSfpaKXip2QlJeLiqiXcoqxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiY6UqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xvin55fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSRmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc4x5fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqZmYm5SVkZigl5m7u63KoWm2t6qwlZieo6uSl72kXqqzgomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mTnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mVoKKNlY2XmZ2TnJielKGglJydpa6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuKfoByhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKlpZOjua+owLusrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWRj5WXjpGgkIiUm6SslJaPlJyelKGem5ifoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+ws6eMorq6tcG7q6icsqSjqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlZeloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1d3tvXltebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB7jH93hoGCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtLypm6m8waO2tq+rk6+rqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5WUop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQUNLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlV56QnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qaWvvsSxvbizp6q0s62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52ZlKCioZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZjTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKustL7DucC4s6e4tLeyr5WkrbCvpIuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1NDQ6QjM0TldOPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnaCao6S1ybSpx7zDxMnLycjMzse+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7a+wcC+t7Kyw7C3vKyjrrWtuqWIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqUnKOfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJysqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKuqvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7afqZylo5qboJqnpbOhm52lnKiqnZiUj5Sbi5aJjKShlJyin6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZqqGeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKidqaycnKCbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCipqi9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytmpqdmKagvaGdpJirq6umoJmNmp+SnoiOWH+Wn6ahoLmqppSYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+foJiew6ekorOgnLKnkqmjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqaSnvbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmYl5KipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQEhHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utLGnqrqzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6uglpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsqWppaGem5malZeon56Zop+vs6KmjZivmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GZnpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCbn5GUppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVEA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGovKCpr6qisbeopLSxqqGttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLSywLrFtqu8r7G3rK2po7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmcqLapl5qTkp+ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6CelpaWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmqCkq7ajq6ikrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xtpmYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbSwtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpagsKexqayko66ttKi3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusbmVl6evrKiks6mUr7ukrLKypqejsrSwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2jrK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLS6rLSytKuzrKqrqKypua2ysMe/uKS5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mpoamvpKejs7OwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyraGjp66qqKWxo6qwqq6rsa6urKuzuqa3sLKpsqmqpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEe0Y/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKmxqaapsqa0raqvra2xrrKts7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRGJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJaRr6Siqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa6trKynt6qlrbCruK6osK+usau1qra1prS3rKykqaqcpJ6zs6iopLO0n7Wtoamoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjrK6ytK+qpK+pqLu/vMKyr7mtoravyMfI0cC/vbq8w727w8G/v6+xs7K2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuaq4rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6efq5mPsKKYoqCop56nm5ipsKmin6yhoZKhoqOnmJqopZiYmJyPi4eViHyNhoSFpJaGg4OMh5CQkoWHlaGWiZGekZOQjZGclZiPi4aGeHSBf310eHmAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5KeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4vsG9sKi5qqetsMnGyNDCvb+9ub+/vcm8wrixsLWxury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamjoK6bmrOilqWbpaSfpZqZqKqlnpqpoJuRmqCknZmXqamRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSblIaToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3Vwcn5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqOunp6sppifmqGim5+bmaOqopqao6OVlpOfoZaclqasi5+Rj5GMgouAgI+Be5qUjIl9f4yHkZCNioaTmJGHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcHN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfp6O3r62ir6+oq7jCurOtoLmvq6ezusfKx7+3wr2vtL63xLbCsrC5sbLAtru9t6q5uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJympqiam5ufopWcm5qdqaaWm56okZiSmJ2TmZahqpCaiY2Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhpb3BxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xLeyrqG4ra2rr7XFx8C3v8G5sLS9t7+7vrCsvrCzv7G8wripu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpecqqWon5ianaOTmpuanaWqmpubpZSUl5WcjpOXoqihkImKj4Z6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZGxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6t7qvrsCztLmvv8C3rL26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiSn6mioaGZm52fkZmblp+hqpuamKGUkZSWmY2Uk6SopJCJiY6GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dGhoamdncIdoaGljZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqOQjaSmmp2enaO0raequranrMTBt7Gso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t668u7Gln7aqpaWzp6mtnZzAq6ekr7KprLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyim5afnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnZOlnayhl5adk5ONlZeLj5ibqJ+RiImLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdHNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2urawuL2spp21qZ+fr6Oprpyhv6Cwo66wrreutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6p6iftaicnaigqKyap72YrKOur7W1ra2fsa2wqaKbnKOrqJyUnKaknZqpoqSWmp+bkJujqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Ko5mFlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6GpnrOqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZqbp6adk56fl5CdqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqaWgpyrnJiYnZ+pqaeqv8Ousbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqZ+xp5+iopmgoZqss5SjpKW1vKatp6uqrKimoaCYoKajmZmlo6SYnKSplpOinJOSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ6lrLKosMK9sbW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCraelnqOkqrG3rLS9v6+2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhnrSzoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZlqCfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFUNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Sen5+ulZ6ZlJWVl52roJmZpKi0r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqetsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjChnZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlqrCmopaTraClkpSgm6Smn5WapaahmqKfrJmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsX3BtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt764t7G0urSkt7Kfs6yfnqirnpSntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknqycoZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sLW+uLixsLW6qLq0n6+knaSnp52TqbCpr6m0q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6edl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11gcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJueu6GbssCurausp7ept6+1v7S6r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZScrKqXjJSlmKWsopGWqrKjn52mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6GdoqGbm5Cpo6qypLSlrKWelZmqmKasuJyirZeTn4+kn5KMnKKdl52akZWSr7myrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2ZwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaKhpZ6gnZmTq6OsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Byalpem4lgY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFpYZ2NfT1ttdWlxUlBERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqeco5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+sm6eep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKanOBdIN1ZXd9d2tvem1gY11waE1YWmZqYFdab3ltbWZUT0ZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJqrnaqfkJaWqJ2qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipaOm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXFNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSfqqSqlpaXmqadqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAh4Jud4J4gHNteYR0doiIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6ZoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ6inqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99lpiJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRjWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kcq6KkqKSktKOcopKmrau3s6euoZGRmZylkpCfoZibn52IpqykrK3AwLGhqa+pl5GfnaKZoaOqo5Ohop2erK+qraekpKehpqWdrKiRo5qoramanKibq6CVlqSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdJeTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gnqinoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn62lq7CowMezqKmxrpaSnZuil5+pqZ+VoZ+dna2vqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6hnoGlj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJuiYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52mo6+spKy1qrrOsq2mrqyXlZydopmerqycl6Canp+psqurq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUqyFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqiqKCfpZyxpaSosa23yLK1qqyplpGdnKKZn6WznZqhlJ2fp6ytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+Wlp+UgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGSmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKijoKqnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn5yek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpunpqGisK6cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKvpaeYr6S7rKG2ta2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ21mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2or6Smm62mvayUva+snqGvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfr7Cqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqWdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrK2kpZ+pqL6klsOsqaKgq7K4qaylnrKtp6iXda9+kIuchYd9uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmZfHqQn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipKm7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iJGWd2eIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7eqnsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKnmKmal6OqoZadpqansLusrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+VhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqkhImWj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xbu5q6Klnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWqJqompSmoaSQm6iZoba7qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltbywra2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqJmpjZmpj5+6t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcu7SooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo6CImH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZXRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjZC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGZsWGdHXVJNM0U0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcW1raVhpT11ZRjlBNUhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya21zcmZdaV5iTEU9RDZRQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tKytoJqinaSjpq6dnLKurJOYopqhpJmalJ6rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCWh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0NSbzVLW1pfTlpEQTI1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6xqa2el6SboaCZlpago5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+Pi3CSjICph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZGViUV9XXVRXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqiaooycrJycqpSirKSjqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG18cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B5e5dsnHx4l3NuqaRnYGV6cYCFbGhmZG52eGdgY1NcZlFRYkhYSlVhV1RbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqKmpiYk5mTkqGYjoeFe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhniBkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ2XqW16lYegm3SiiHegfpOXi4FwTWajknCah3Oke3l0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUE5sXmlca2lSamhpbGhsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5qXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppODmKqYjZKLgYl6gH2LeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dynneBipWXj7lukYqiYn2YoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmJOOmpCLmJCOinuHcYCIaYuLfJibc3WJfZB7ZIOHlYqKlZmCfIiHl6iRgaOskIaRi4KKfoCAjnNpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+XnqV2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4KGhYaTlZyffKV6cqiVoJZmnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibWp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjJqPhpyRhZKNjI10h3uIhG+NhX6Yk3R0hnKRgm1/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weHlsa3Zma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coRwlYV7fZKLhoaPhHl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoOIjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4F2dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH97dXB0ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4eTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4aGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHV8fHNvcGRrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eXt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZSDe46ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4eroIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZxdWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeDeneJjoORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2eX9xbG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBoe2p1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqJ2AcIyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCamJKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXOCcHdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcYGGe3xwd3qKg3l5j4yClKSSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiOl6GcfnCMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6Ol5eNlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfW57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hXt6cX13iIR5g4+IipehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg390fIOMgYB9eoKDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh36EhnV9fot/fZiGl5WYjaSimX9yh3uTkYmmj4yOipOgkYOSkJWXkYuBj5ifmpGQkHN/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnouGgZGcf5KSlYaZiHuKioF5cXlrdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eDeIZ8dXd/fIR/e4KLg4uTo494g4F0iYd9gHR2gomFcGF8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lrYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+jqJ2KipKFip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYZ/g4Nze4CHeo+SiZOSnZOmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2a3BudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhGVoeXV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6YopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi4yNjJyJjpCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYKHjZqihnuDdYKLf3d5bmyBhYNec3VzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgcG9rcW1ZWWJhYm5YUVRaZmdjdXCEgmJda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHh1gIuAeYV/eIeGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauUh4N4f3dyg3qDoIKTgpWUmZyTm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJuPj4yMj4x3e5GQeo6LjJGWjHyIfIBrdmpua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt9h4V6k49weYNvdot5iIp5iHyBi4+dnYR7enaCi3x3cWpsgoR7YHhxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dX6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfW9va3pgam51f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmYeAjJ+Ai5qUj4WImI+Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2Iko2Im3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx/bHtlc3BrbHp6W4F5kJCBen5/gIaOe3pocmpzio6JgYSEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBwY2B3YGBWa19edlBOTGFnYl16cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGKiZZ+h3p1f4l4h4SOnJqYmI6Pdol0bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh1am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYGCfouVhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBybltjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uQi4WPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGiY2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2cml0d2xajX2Tg4V9gISBhIqCdmFya4iAjomBfn6RkH1tgWt3hI2EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeoZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiXygf4SZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh0goV0gn+JkZydhpSPn36IYn+Th4WIhIqNgICDZ3yQgH5/goyPkH5tg3yCdGttd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnNiW2dfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdImFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoOJiXKBfWd9i3t5f3+Hi499aYB8g3Zmb3l4c3d0bGuPhouCi395g4GEhIBrXnB3en2Lh4R7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWRhXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCfm5+gnWCd4Sal5KKk4+UhYdwepKEfoODiYNvgXhogIV4cn9/g4qHfGV8foN2Y3BzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWNgoNxg3d/mIuNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdmXWZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnR/fW9yfHuUcG+Af3lmkomCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1gYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Uj41/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaX9+eG18e4GKg3hieYSCcWRxaH5udXJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praHB4fY5taoGEf3lugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35qdHxyhntzd31/jHp4hH58a4yMg5udloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6fnNndYh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmIiLhIl8j4lyfH6FfGl+bWuAe3lqenaCh4ByYHeBfnFkcmd1gm51e4aVkoJ9goBwd3p8dX5tV219dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLc3lqWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGiEiX18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKNh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSPiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4h31qanRoe4BqdoGNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHtzjYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh0bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4eFhXt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d6cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1d1lRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI50a46MdX92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfoWAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR5dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY214cWpscXd9fHldZXmAd2l1eGaCd2h1h4yOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweXOFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnNSUlVXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3aGeW6VinR/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+f32Hf3x4dnl2kZOffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hyd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHhlcn1uhHRmdYaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anl6gHh2b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXZsTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlYFyj4JxhYJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISFeIGFend0dW5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yHhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yVgm+Ma217gXFmc2Vga3hmcXWJen1hdYN1aWtxdHlveHdye2V9fX53dW5iZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ1ZUpPU1hha3d+Zl1nc2llX1djV2JxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgHqLdXSQgH2BlI6AhYR9foyGen6BdnujpYp5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnZ1bnpoanlqX2VuaIF3kIRoZVhhdml9hnluaW9mZ11VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hYOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNydGpvgH55d2F3hYR4kIZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVZZWx4e2ZfbXBqY11WYFVvbldKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kGxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6Z2l3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYN9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt+dXVidYaMe4iIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHBZS0xYWGhsdnplZG1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmNef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1+hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZoWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboV5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KAeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR1ZXODk3+Ig4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlRtVUpMWldpbHJ7ZGxsc2JhWVpbYXZcVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJud3ltb2p2gZB4bYN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmienuAiZV5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdgbHZkanVqal9bbnRybXR0dWuGfX+AfXdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJveHRzdGlxgpWDh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWa1FJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYl2MamNlbXp5bG5pdnmGemuEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiClIWBn4l1gX+BdH+CcIeDdm+il3N7houHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdla1NeXFZoYmxsW1xxjWROb21cVldVZ2l0aGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRwdXZsbYWUgol8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYF9ej25hZ2t5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2tmeGVlXVpydm5ze3lzbol7gHece3prYWVsbV5gbmplcHl+Z1pWWF9seHt6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3yBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2bGiGjH+Je4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5wY2hqd3JzbWh2dHmCc4KDeoiOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5KOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeGiYaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiLhoWEhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuEh4SGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5KSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZGRkZKTkpKSk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPkpGRkpKThoWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYKAkpCRko11h5GQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCCkI+Qe3WIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc26Jj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIx2bXqPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtbYJ5dHWAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0YV5kX2JqcGZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGFfbWxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bGJvc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01banJrX2x0c2dRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxjbmtaaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0VJVmJma3Fwbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2hncW5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD1IWVxbXmZsbmtvbW1sa2lpamJRR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Slpobm5wam5ta2psbGRPR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUVgbnNubmxsbGZRQj9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxIXHR1cWVQPjo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpBanxpPTk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/QEFBW2M8PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PlZqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp7e35/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJRkdHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hIRkZERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1S0pGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9oQ0E9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlgQzc1NTU3NjY2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4mKiodmSTU5QDU4ODc0NTc4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qKjINlUFpDOjw9Pjk5Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRISU1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiouLjH1qUz1CREVFQkFAQj9AQ0FAPj0+PkA/Pz9APj89PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLi4yKi3RFQ0dKTEpKR0dIRUZIR0VCQUBDRURDQUJCQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIuLiVpKUE5OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2MjIuMgWxtVU5NT0xKTEpJSkhKRkRHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4uOfWBYUE9OTUxNSkhIRUlJRUtJR0pKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMi4uKX1RUUk9PTktKR0ZCR0pHTEtGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WlhUVFZUT01LSkRFR0xPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxpWVhrYkZUUVFQSjs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dtXGVWOllZWFNRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BZW1xbUlRSVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxdUVZYVVJVU1FRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVdKTE5PS05LSUpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0JARFBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCCgYJrTUc/QDs7Pj8/Pz8+a1BKYEVGSElFQj9HTE5HTVJVSUJFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1JZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQU1NPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTk1OTUtMS0tOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUdDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRGSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQj0/PkFCRkNFQ0NJRENFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUVJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5LTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFSExKR01NTktNTkdMTUlMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tPU1NOUE9OTk5OR0tGYEVEX0xFZmRFTltJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITFBbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FNT09NUVROT1FPS0tOR01PUltaU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU01NSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBLSlFRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVFpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVVNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZaWFxdW1tdVlNNVFVVXFxWUlRWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxWVVteXF5gYV5kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1hXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xbW1pcWVpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7ent7e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJioJFPj8/Pz87m8O+v76+vcrU0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzL2eXl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKDhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19fH17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX18fX14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9e3x9fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFuf4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIiIcHFxcHSagG5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfKKEcHJwjp58bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1nqN4cHignH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZFvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3Nzc3NzcpOqpXyKoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHh5obOpp6mql317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvoqG1qaukf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maSWobGfmKaVfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcm4yfsKGgop6AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJewoJiUnIZ8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6Aoayll6KanJmioYiAfn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChISIkKKypqChmZ2dpqesqaGbkoeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tr6SamqCbnZydnaCkopyTh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDiZWYlpWYn5udnp2amZePiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYWNlJOWmZydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OHj5WNlJiQhoOChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCGmYiMhoKCgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+CiY6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgoGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDg4SDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDhISEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhISEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+AiYWGiIiIh4eGhoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3uChoeJioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3uLjIiLiouKiYiIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXkIiMjoeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoSak5aKg4OBgoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoidjYOCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIGDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp7e4qFgoB/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf35+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4OEg36Af35+fX9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5fpaTg3+Af39+f39+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6enl5gouEgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX18enp5eXl6gIKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh9goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYWEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODg4KBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/f4B9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fIqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31+fn9/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fH17e3t8e3x8fH18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYGAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEg4CDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3yAfnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4SDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoWFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQT03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNT0io2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEiGdAREREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDg8Oj07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19bW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9O4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9Wyl5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7UnKOostGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx1cOGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdTWo5i01NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9SkmbHU1aKZtNTVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDUpJmy1dWimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aSas9XVopq21M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWkmrPV1qOattfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5ux1teim7TasqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9PVsYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TS0tDD1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDs5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojk7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6ubq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ioqaqnpaSjoqKio6KgoqKhoaGgoKGhoqOko6OlpaaosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpqWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKCgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoZ+XkZCQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+dnJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY2ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKPjpabmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuYlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuUmaqcm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZmq2qnpmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCisKehoqKioJ6cm5ubmq55epubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpKWtp5+goJ6cmZmamaaTS4GdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6OieaqkoKCem5qam52oWkmEn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqSkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eqG1vq6KfnJqanJysgktPh5+enpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmqSIVISom5qZm5yeqmRUUYignZ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5yampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmgk2Jim52Ym52bopZmXVGHoZ2dnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZnJllY32cmJudnKSHZ1xRgqKdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqkaGdmiJecnJ6ceWZaVIOinp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn25lYmyGnZ2fkG9jVleHoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ95c3JeeJmcoY5hWVNajp2bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSm5+UeZqooaqUfGJSYJCSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOoJ+OfWKJqZiaboOHa3CIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/jKiNeGlScJ2PjFZteXuCfn+CkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpCgek9DSXaUg4NJV29zd4J7ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCglFM0NDt5hXVyQzhOa2+Ah4qOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPoW5GZFU/enpnZEw8OU1udY2KiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuipJhRdLCRSHuHeG1SaX9ZV3GIkIyYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqayEX7/YrEaSo5qQXWuCe15eg6KhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6imb3q9wKqazKies5pIVoRwUnifqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKinmp2kpaOionKBma6Oyc6ynrCyblO+oFRslKOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKCNfYV7htC9mJeonHJSmqxnY46jnaCgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqCiqKqusbKuq6SpmIh7ap29w6uunol2ZHB4enaHo6Sno6GdoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e2tLO2srCyp4l1Xk6Wn5CPjYB7c3BzcXh8foWSnaGko6Kkm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuytru+v8C/xb+1q5NwZlhHd4BzdXpxbmloYmJpaW92d3h9g42Yo6ispqSZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1usjS2dzVx7qtn5B4XFtPRV5rZWpwaGRiZ1lXXVleZm5ubW1sboGoyMa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMXZ4t/PvbConI14YlVXTUVebGFjamVhYmldVVxXWVpeY2FcY4CpxcC9uKmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca8x8fO0MSrjXtvXFNUVktAXmxlZm5lYl5mYVVYWlhWV1dig6W2u7mrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TCxsnJwKSIWkxISk5IPlpgYmxxaGFfZVxYVVNUUVaAtsOvrKqqqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMfGxMTDuLPBuqB3TEpRST1NVGJqaW5jX19aXFVTWn+arbe0q66lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmZyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb27vpFlVktCSj1eVlhrZ1taWVhWcJCwsau4tbOsqaOhramsp62grLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jIv8bGtqBsS1lBUnJ7gFpSUFNrn77Aur27vLq8rK2mqbu6ubfAs7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcTJwKqNeG+MmZ1TT3GfwtLHxMHEx8G8vrSxsLDCvr7BxsC/uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandsaWZ1b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMLOvHNqhZmXWpHLy83Pxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZmNrZGJrbW9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wsGZgI6ZiH/Sy8TI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLu/wLy7xL26wMS/vb22vsiklGaPzcS/wMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbq/u8O1use3trm7vLi5tbrEyaZCi8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHipzL3Ht7m4rba0t7mztbK6xcqaRoDKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1650gbvIz8LAuK61tbu9t7mxvsPHjkx7zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcXSu0dHMysS1ur/EyL6+tL7AwHtZc8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnJ0pszMy83KxsLDy87BvLi8urFyaWa7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsPApXl2eZzExsvIwcPAwMnKwb+7ubGhgXhxrsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvat9bmhubXKBlZhzeH2Yvb/GwLnAvL7FxL29uLGvnJWDiJzKwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1tudHeCobi4wrqzu7e7vb+6u7uuo56djpl/v8TDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZmdWWWBJSU1QVGx3h6awt765srWyvLm8trm+tZWgq52odK7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZuVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHaMoZhgVENYVUdhalZPRUphjqGsr7a6tbSyrLy5uLW4wb2LmrOmqnSmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BP0pDQUpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBvT0o/ZFlCTneAlGpOQVyCsLWztbK0r6y7uri2ub/GdoSsoJxlqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVV5cUE5IREdNQkdORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BY0FTo7mztLKwsa2wubi2u7e7vJCisaukc6ywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJU0VOQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2ecgFpFU6+7sayzr66srba2srS1rqmmnpqbnZ+mqJ6gqKmfoaeWm5aXjp2Tj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmx7ZGlWUmROSkhHT1NOS05IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFtgcZCxr66ztaqmrKyjm5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGSk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yXFFrY1tlYF5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmXFNaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhYY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqayppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVebVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTUxQWFJITU1HmKyqqaWgn5qSkZSYmJaWloyIi46VnZ2dnJ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW5cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnp2KYldeZWBXTVFHPT9AQ0M/PkJReKmtqaqmn56foqOdnp2anZuUk5WUnp6YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRR0U8Qz5GPD45Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdPRT5JWnxvYkI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZ15aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREE/S4aepZmEoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0srS1dbZ1tjT1tjN0srP0czP0czT0MDJyMvEzM3Mz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxKS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsTJx8/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1c3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMnBycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0pGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeYF9eXGJtcm9vc3R1dnmkv8zV0dbT09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLJysPNxMbJy8vPys7N0M7UzMbJ0M3Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtqqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0Q/OzY4Ojg6OzU3PT1AOzo8PTk8PTk9PTo+Ojw3Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfYGBhYV9fXVtdZ3JycHJzcG1yeaXH087M0M/T1MnEyMjFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jKzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7q9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zYFteXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHLwsLPy83Eur/Duru6ub7IxsLDwMPIysnIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1tbXWBgYmRkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/Iu5jAzMDGwbC2ubGxs7Gwwbu7vLq4wcHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzs3BxcO/vbK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5m46fxMO6wLitsLCmqa2rpbeztbSzs7S7tr2yt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8zFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2xwbmlmam1uc3uKv7+4uLSvqqumnaGopp2pqrGtqqyptK22sLOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8yLnDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BHQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25yhK25sLWtpKOlpZmfo5+YmqSqraSooquqrKuwo6afqq21trG9uK+3r6iuuLS0vLizvLC4ubayvMGywa+mqaOrsbO0qL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+v8W/tcLBx8i3v8DFt8TDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWro5yan6OTm6OZlo+goaijo5+lpaemrqCdm6SmrLKwt7ensKyoqrSrtLqxtrautrqzsLu6sbeloKSgp7GorKm6qqWmp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsrm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ2Tk5eelJmglpSLnKChppyfn6Olo6eem6Kcn6uwrbG1pKmqqqyspbS4rbewrLO1r7O2r7Gqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqusrbCzua+4ubqwtry7uqyzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy1t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKeakJGRmJSYnpOUjpqgoKeem52lpqKlm5+hmpmvrq6vsqGlo66rqKK1sLKyrKmws6i7s6e2oaOfnKOirqOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+qsLKys7ezrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWlZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscO1tr2ttLnBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmZCQjZGTlJyUl5KVnpygnJahoamjnp6onJqaq6evsKuco6S4qqGgr6i3q6enrrGkuLCkt6CjnJmZq6ahmq25sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrG0sLy0urivo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJKOkYmOkJGXlZmTlJmem56VoJ+mpaOmp5+cn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWfoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqmusK+rqKqqs6amq6+0sa68trGwr6CTe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurK5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJVYGFfYGFfYGBiZGl+jo6GjYuQjpCZkZOVopiflpygpaGspaSko6SjnaurpZqfpbGqoaGepaqeqKKfrqyqqa6toqKilZiim5yQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoKKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq2wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl5fX2JkbYmLf42Ci42LlpCRkJuaoZuboKipq6isp6mmpJmlr6SVmaWvqaCcmZugn66anKuzoKamn6KkoZSUm5aWkqmqrZudn6Ghm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJGWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR7iH2GeoiMho+KlI+Vl6Cfmp+rqaavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOS01PUkhOS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1hanx2e3GEiYONhpWIkpKWmpidqJugq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxre6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFqbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFubnJsgIR/hX2Pgo2IkpCSnaGOmp2joqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnY2CiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG9jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWhtaHuBeXFNVnCOgZWFjJuXipORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOWjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBramR2fnFOQT9/lZGQfIeUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+UeHZ2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiVhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNUklMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0VEQ0lOT2hZT1FTVFVaboFwc3pnZlpTj4mUh3N+hoB8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp7aXZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51gnp2ZHSLlZiNjntmeYB2eH+IkHyDmJKAcYePfHd7b2t+rX10kIt/eoaSgX1/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVvcGqGparAfnN4Ynt3bnt4h495e4uGb22Mknl0eWpqgIJxlpGMgX2VgEqTmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYd7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpa2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtfpodhmWdyeGR9b2x/eYqIdYGHhXRsmpJ0dHxqap2OTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY98dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIiMhnpwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9wenZrfGxxgoGEgHqEhYV5cqCVdHiAc3WUhzVxnaidjqGhhKOFdnCHfId8dIyujYmBaGdiam5ybXCDdWlwWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUVNES4V0f3t7dX5sdoeHe3yEg36LfXWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hHpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygmJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjXiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfX2Bf3CBfnpodmxSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktogod6iXl7cXyPi3l8iIZ+lod2oZqIh4+SlKWNralIhq6vrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4iEi3mVnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXltjZFhnZVxUUFBWWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMzMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFlvWVxeaYyShpSAg4GEkZJ+hYiRgZqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY6UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxudnVmf5SOh4iJh4iHoauilomOl396gYh5eXBna3h/fH91bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSUlMTEtOVmBjf2ZnbXSbmY6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkYeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F8npybp6WhmaCWopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF+c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4eJgYCHdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiaGlqLO8t6Suq6umqLSrsLaysa27sbO+nLPDq7rJyrfDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoOFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraKxqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisayxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1tjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU08Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUxLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7GzwbW3wczItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+t7q3uayssKWwqa29sLy6wcGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu8wbu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9SkE9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg42Win6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0lGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTlBKS1BLU1FITEFKRkpPX15iZ2lhl7fHsLmyur21scTGta+4sbC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPL0NTVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQiHyEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CqtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNPU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomIkYZ/gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOloZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuJfoN4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Szn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLR0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOgoeFhnqEeXF7e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ+hrJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg3RUI3NTU0NzkvNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlve3uGgXR6kp6OoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcmJ+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hipGLvKGYlJiZnKmmpq6fqLa/wMC5x8rOzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxFTkM7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5OekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6dmpKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouAppmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcopudlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqdlpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehop+ZkpydqLK5rKa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUxNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Rg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIOFfn+SpqSfpqKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmbj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjn18bX2IeHp+eoGBgn52doCCe2xvi355fHd4fISHi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m5q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJOYlIyKk5OGlJiGhJGQnHSRmbKVlqShiJyak4+KkIqXmomLlo2GfYyZnoqQj5yamZOZmKCVoZ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYF9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramzva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqYm5SVkZigl5m7u63KoWm2t6qwlZieoquSl72kXqmygomKjJSHkXyPjn2Dho6QlJSIh5KWi4+VjYuNlpmTnZq0lpWrnouclJKNkJKLmJuKkp2Pi4mVoKGNlY2XmZ2TnJmelaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDL06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqDfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqaioqSjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY55gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4/R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6ro6OeqKyvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkoJqgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762z7LFvsO8s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcoB7jX93hoGCkHqNoZaompqYu77JyMrC0snKws28wbOtvL+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqqp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu73Bua3CwsK/mXB7Y1tYXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tL3Lu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqaeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhFREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnKuruaupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCvpYuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKehmbSpqrO9vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJOFoIiEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnBwc21yLvBubW6sa+vsrSnpJyqtLWrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrWtuqWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkZ2DbXWTopqVnaOfkK6yo6uVqaqYq6+lpaGlqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66ZlJ6Lk6qbkZKTiaqNhqGejKOslKSktse9tMG7wsLHycXCzsjCvbmyr7m1wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKuqvryorby0uL7GvLa1uMCwvcCzqbW2q7+lj6OXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyin6G1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUZITlFJTURGRkJRS0hBREdBVlJESDxBR1ExO0E3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wnl6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwry/uMDCwMjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pq2+sLe3xra0ubi+sr/BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGplXGJeUEpIS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopukm57FrKGfrJ2crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLa/wbvJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSprbCipqi9taayvLe2tcOys7e6vrPEwLi4rrS0tKOdpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsO+x8S9xMq9sLC2rrG1sMDFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6xqqSnvbemt7u9r7fDrbOzwr+yx7O6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6qxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtcDEvsrFtsDJwrWrtamxuazAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7myuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJSTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemZqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCptaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWo6CXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeppbSyq6Gttb2vs7i9u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2wsbWssLWxwLrFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHl5iMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEtLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbmytayquri7ur61q6+xt5mYqKurq5yuq4+rvp6rr7Gjqp+xrbKurrayuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsayqtaSusLSvo5mdraebl52Zmay4opeTkY+ZnKGYmJStoZ+WgpWZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG55b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaU1NTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAvrSzt8TAzMe8xL23v8DAuMC9sr2uqLq5uLfCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVj4+MmJ2imJGYqKSgmIWTl5GdnJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVWldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKq5sba3wLyvrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2ysMe/uKS5sKmtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mOiJGjoJaOlZ+ilpWGkJWUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2RuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK20wsPRxMW/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qp6Wxo6uxqq6rsa6urKuyuqe3sbKpsqmqpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLawsaCpop+qrbCsnZ6mp6mao5eYkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZesp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CsssTEzs7Dv7+0wcTEusG0ycSsr7eus7rAvrSurqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG2rKyipaOaqauuqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQk42Fjpmlm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJeRr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG1srS8wb6zsa+trKyot6qmrbCruK6osbCusau1qrW2p7W3q6ykqaqcpJ6zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKkl6Wmp6qcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uQkJKOhYiWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+fpaqsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0cC/vbq8w727w8G/v6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq21sa+xuaq4rqqvt6uqnqqroKOhta2poZ+vsqG1qp6op6qjqqGhrK2ova+rrq2hp6efq5mPr6KYoqCopp6nm5ipsKmin6yioZKhoqOnmJqopZiYmJ2Pi4eUiHyNhoSFpJaGg4KMh5CPkoWHlaGWiZKdkZOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46wnqSlqqKlo6ymtLOxqaSwp6q4vsG8sKi5qqeusMnHyNHCvcC+ub+/vcm8wrixsLWyury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbaqrZypr6SfpayrqJydqrKktKmaqqeppKmdo6moqb2rs7CunamjoK6bmrKilqSbpaSfpZqZp6qlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V9j4J/iJ6Ph4B+jIiSkJGFgpSblIaToo2TkYuRmpKVh4p/gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltnWkZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6Sr5ifnqmko6GqpLeysaSpsaetucG9tbCkuayoqLDDycnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgr7S2qayerbGjnKWnqaOdnKSvpq+hn6upp6KqnKOpoK27p66xrqGqoqOunp6sppefmqGim5+amaKqopqao6OVlpOfoZaclqWsi5+Rj5GMgop/f4+AepqUjIl9f4yHkZCNioaTmJGHlKOKkZGHkJmQk4GIfXlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6uYn5eno6Gfp6O3r66ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbCsrC6sbLAtru+t6q5uL2qpLSmqKqvrbmwqJi4vKOtvrSzoa64taemqLCzoJ6kpaihpJmerKionqCqr6egppeiqKCwuJ+jsa+hq6GspJympqmampufopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Qh32HfoKNfHuhjI2IeYSNhouOjYaJk5qOiZWfiZCVg4yWjZF9hXx0cHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7S0qam6xbezrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzsKWYu7akq7q1rp6xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTpKSit7ChprGrn6yjr5ecqqWon5ianaOTmpuZnKWqmpubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYuOln+Gl4yPeYF7cHJ2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUnKqcpKGioLeqrqC7uKWsvcW0sa+jtbCsrK61w8O8s7+6t7Gzubi6t7qvrsCztLmwv8C4rb26taWisqmnqbGrrbGgmb+1pKe1taiesrypqKWpsKyZo6ecpKWUmKGxpZmfo6ipnKKfk6WgpLiopKeupp6loaiSn6iioaGZm52fkZqblp+hqpuamKCUkJOWmY2Uk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYqShZaTk4uQlpSNjZR8g5eOi3d+fGx0cmxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0raequranrMTBt7Gso7aup66utr++vLLBt7Cusra2uLa2raq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAq6elr7KprLW7nqipq7GlmJ6pnaakkZmmrKKYnqSpoZuhnJafnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnJOlnayhl5aclJKNlZeLj5ibqZ+RiImLiHiFdoGCgZ2HioKJfX+FiIeGkYSWlJCOkJGRkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1tfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqLi7urmtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qZ+fr6OprpyiwKCxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkJaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGZaSUZMTU9ZUVBWYWWBVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GaqbGvn7m/taC0wru9urGmtq+oraS2t7a2rLyvrKqrtqqzuK6ms7Wyrqmwtraxs7W6pqmftaicnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekImXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIU2FwdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Ogm6qtqqO9xa+puMK4vbytp7awpaujtrKxsrC5rammrLSmr7Wjqbi2tqinrLayrrSts6Gpn7OqnqCjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6adk5+fmJCeqKmktrCko6KdlpiXl6OIoI6SmYagh5OcoH+kf6WqnpKSmpKIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhpcXCIWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ousbq9t8C+qqW3sKmspbK0rq+ytqqppbCtpbSznK21trWmp6izsK2yp66dqp+xp5+iopmhoZqts5SjpaW1vaasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJSTo6SmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdbUUFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKosMK9sbW/tbe+waqns6ysqaeus6mvtbOmp6a0pae4r5yzsrarpaSnsa6usKaqnaejsKKhn52Wmp6crauTnqKftLqiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnqOkqrG3rLS9v6+2xLK3usGmqbCrrqipr66jsLquo6StsqOouKies7Owo6Wgqq2vrK+mp5+joa+bopqWlZaamqyllpuhn7Szoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqGvqaezrKm7tsKwu8KtuLa/qqytra2mrbGpoK68qqCntKyjq7WkprKzp6Sinqeqsqiwp6Wen5+tlZ+YlJWVl52roJmZpKi0rqKpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqmbppmcnKKgl5ORk5Odg9WTmblwsMF+xoZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKimtKqltKmkvLfBsLnAsbW0urO1p7GvorCypp+ttqiap7mto6+xoLO0saGknp+nqbCotKikm52dqZWYl5WXlZagqJyZlqetsKmjn4+toqiWnpeboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5yfoZiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsKyjq7ytprSmp7a7vLK6v7e2s7m5sqS0s6CxsaKeq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaadlZOXmJKSoaaflZKlqrCmopaTraClkpSgm6Smn5WbpqahmqKfrZmgnp6QlZuhnZymlZ2WmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhZqadq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZNLmZkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwl7TCraizqKmyurezuL65t7G0u7Wkt7Kfs6yfnqisn5SntauosLGrrbSkm6mgn6ihtaamqaKZnZSjoZOSm5iRlKGkmpKQpq2vpqGVmamfoo6RoZmopaGVmaWpnZyknqydoZ2gjZOemp2hmJmblpeioJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9ydF9LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLq0n6+knaSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5eeno+Mi6iwr6edl5uopp+MkqOXqKunlZepp56eoKOtpKGeoo2UoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCvrausp7ept6+1wLS7r663tqrAtaipoJqlo6Gckaqpp7WjsqiuqqCXnKegpau5naOtm5aZjqSilYydoJuYnJ+Rk5SqtrComZScrKmXjJOlmaWto5GWqrKkn56mq7GZoaOQmaKWoJuWnJehk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWkRBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsK2qq6uxp7ivtsSwubCsua6twLGro6Keo6Gbm5CppKqyo7SmraWflpqqmaesuZ2jrZiUoJCln5KMnKKdmJ2akZWSr7myrJWXo6enlJCWpJykrZ6RoKirn5ufqKOzn6OljqihlKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZl6gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+NzA3TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0w7Ssq6isq6m6rrDFrrSxrLamtLisqaGhpZ6gnZmTq6StqaW0p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblqmlpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2FzalpdmolhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydXh9fmJbd3SBaFBcboN9fItrWGt7gnJKSm+GcE50TUVYXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq1o6ylrqentbGsyKuvsamzor2xsaagoqicopuZmaymr6OjtKmlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnpGQmJywsr+sm6eep6KJk5GpmqijmpqsoKOZm6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqMhZeVjoqMmJaHlJWKhJOUkYmOkpSYlJiWmqChmpyUoJ2NgnqlhmxqfJF8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKytqCqprKnpbC0qsiqrK+ktKXAp7OgnaSknKOVlaCqp6yjorarn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEsJqrnaufkJeWqJ2qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCYl4mDj56IeoSQh4aakoiGipaPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXqIcmlzf3t2g4eCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rKuusrGgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6O0yLSfqqSrlpaXmqadqZqeo6yUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saI2YkaN3a2qLmaOemXNsbnqDjYd6WGVehoNebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIj4N8a4dZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8ua+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pq6jjo6aoZmTkpqfmZmklXulraKotMS4paKnr5+elJ6inqOboqmpkp+hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH5spbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpGfoJibn52Hpqykq63AwLGhqa+pl5GfnaKaoaOqo5Ogop6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYKtWqPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hpGRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKsrKqiqqevqaCnm5mll5yir5+gnqino6ahn7Csmp2Vp66ssKqorJ+UkpufpJOPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2vqayqnaiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+q4eGn3aZknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKijn52wrJealqmnrqyop6iel5Sao6GSlKCtm52moq+spKy1qrnNsq2mrqyXlZydopieraydl6CZnp+psqurq5ysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoGWh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKajkJqiqJ+gpZywpqSosay2yLK1qqyplpGdnKGYn6SznZqhlJ2fp6ytpbCbraqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjoK6rnaagrJqeqaWdp7afopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOys6qtqJOJl52lmqGjrqWXoZWZnKWmrZyxnq+pp56so7esobG4r52arqaysrKjk5anopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhqCErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmaqllKK1oqKVl6GptLikm6Kdo5KPobGZnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56YmpqmpKubsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+jnIWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYuWkJttcbJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqChtqejqaexo5Sso46lraOdkJqaqrOzpJyknKmRlJeun5+epqOcp5y1maKqpLarw7Cpq6mhjISOnKKgpqOVmpqcmZuZp6Woma2pr6Olm62mvayUvbCsnqGvsrmqsqWaqLCip5d5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4naCSipSSgXqvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY18fISYgGtuf2N/dG6AemFnZnFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbOfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklombkK6wrKaeppusl5ePrKGgnaWhmaScrpihqKe3qcGvpamknouAjpuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZGFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt+tV2khGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmYfHqQnn9ldX9jhXh0gHxiamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnbOzqZ+joJ61maC0qKqsnq+tnqybla+ooo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKqs6m9r6Sonp2PfYublqGgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRso4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK6quq2oo5qXk3yHmZGmm5KPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iZGWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlZV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTKv7eqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLusrJqbk5J7hJaNpZiNkZGZlI6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY6VhoGlm5iWjouUlIuQhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+dlaKXmpmkhImWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6isKOtn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6iZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qenp2clqudk5mhm5SQlquajpmZlpCWn5KJoZ6VlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaejk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566t6SlmZuNiHmBlIybk4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiol21/oqiKZZymnZKYmJaMkpyShp6akJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGzp5urp6yXdIydsKCoq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2PiKabqZGXpImcu7SooJmYi4l1d5ONlpOKk5GRlIyQlKGPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoZialZiWgpGXl4WbmWN6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo5+ImH+UjIWFmmuOjoZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNikhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isn6iwpqappZmUr8i/saKXqKm1npCFnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopafoZGMk4mGgJGnjYeinaSUmJ6Hn7qyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga6sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5yLmZKMfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKSdhJqBjo+Hi5pxkJSFaHh1fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZTcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7CpqqaalKCjpKukl6aruKOwgaGonaaenYmUvZqTjaGSno95hJaWkYirmZubmaKFjot3m5yPn5CInqWclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoKGZoad+oaeHrZ2glq2PnpydkYWAoIyprYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5d/jHtkaItzmX15lmxdfZdtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJYUG93Zm10c2tqb15rcW1raVhpT15ZRjlBNEhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaykh5qQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxygJqkY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZdaV5jTEU9RDZSQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9eW1pYYGB8ZEhDOExXVVdjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZqhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSo5Scm42LqailnpCXh4V+anuHfn2QjYOLkJGJkJShg5efoJ2gnouJd5yYooyfcqGLh6mIm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbZ5om45vmpl7gIunfXJodKuDnoN0qmiVml2bhXaFnWeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qQbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0RTbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWdYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ6SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9nZp/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRiUV9YXVVXQFpGUWhFU1dcYlheSUQ9Qjg/QTpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGbc5CQgYmalaGbhY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8lKShnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpp2ZgaRvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jc6SPdWuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEbGdmZG91d2dhY1NcZlFRYklYSlVhV1NbZWpbZVFGREtNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamhmaqKmpiYk5mTkqGYj4iGe3B9hWh9j4OUmoF3kI2PiW9/hY+TkmyXk3yJkpOlloOPq5uUk4uGinmDdoiAboKfhneAkoaImqOYe5SjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa1tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpOXi4FvTWajknCah3Oke3p0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9s19qdmt5h2ZraGN1dXBuV19UWWlRU2hJVk1ZVFZdaGtuVmdXTktCSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmaqYjZKLgYl6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dyn3eBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpeW2OhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTVhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinyHcYCJaYuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaOskIaRi4KKfoCAj3NpkKaEfYaUjYiZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqWijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6htqqKBiXaIg3erkaaIa5Gwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDp46rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6adqZ2FjJqPh5yRhZKNjI10h3uJhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/X4B/i3d0cpR1b3lubodshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN6fJh4hVxrWHmPaW94cnJveHhwXWuHbmpnVltgV11ma2RWYlVfUV9weHlsa3Zmamtsd31ycnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl9XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHuWW1xqZ252W3x5eHVuc3ODZ1xti2trYlpaX1tabHFcX2FaX11mdH57dXB0Y2tra3x+c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hVXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChZeKcW+AcpiGg36Sg4SGioF6gYWMnKGRg6eiiHmOl4mVi4ucmISDeq2CkZealYqenYiIoaqfoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJKTnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4yQiIiAhISQd3x6dJmgiIaJnYmEk359ioCAdW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX56mWtyaGF0inF+end3cHd0gl1eb4dobl9eWl1dU2hyVmRcXWJsaHV7fHNvcGRra2qAfW55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXhoOCj3+Ah4SGfYeFjpyek4eroIRzi5CGkpGLnZJ9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2EpXt8jpCRhpiroZ6UnZCOqo2QgJ2MiJOZnoKPl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaFfoWElG55dXSRoYqLhZqEhIxzf4l8fHJxeoeCeneKjoORpo+Fg46Ag4qJineGiYuNfnBsf4J8bmhsbWhfen9pfnx2dXZ1e3hcX3B+bnVgY1tdX1JnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbHVveW+GeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4met5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1qaH2Cl4h/h419foaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcHdhfYCNhnGLlXyIjHGMf4KFho9od3F4i5iRj3+WfYeKcYGGe3xwd3qKg3l5j4yClKWSi4WPe4aGh4R2g4SJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX19Sa2lVZVlfYWhqdnmCcWdrZG1oZoCBa259aG9ybH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N9hpeJgImLeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2dfoGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgXZxfW57ZIB8ioVwh5N/kYJsh4OCgImFZXVue4WRl4t8k3eLiHt/hXx6cX13iIR4hI+IipehlYGDi3aIhIOCd3yDiod4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFjamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyQbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5ytl6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGMfnyDfIGDgXh0eXt0fYGEgImLgGRffYuUhn6EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmXqHiI+Jb5edmqSUlYuMn4yGgpKcf5KSlYeZiHyKioF6cXlrdWx7fot+bYWSgpR4cIGDfn6LgGRxaXt/lpeEfoxzj4eDeIZ8dXd/fIR/e4KLhIuTo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG10e4lsYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4Nze4CHe4+SiZOSnZOmnJaCfYF9joqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAfIGCiHxkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMe4d7fouFd35xcIGHhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8d4V4eX9zc3uGa3Nwem6Ld4CBiG9xW1l+kY2IgH9/d3WBgYCghpGLk52YoZWYeIp/gY2JnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjpqRfIqAg291cGxtb3B7hWlzg46Yi3F3gHWCiYN5ZnJudYCajnuHg3mTkHl2h3NviHqEi3mKhYKHjZqih3uDdYKLf3d5bmyChYNec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWWJhYm5YUVRaZmdjdnCEgmJda25kYmZrkm5gZ2ZgaGuBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbnZtiXeDfoBublVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhJCKfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkoSRgolxg5GYkJyPkIyMj413e5KReo6LjJGWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYRvdot5iIt5h3yBi4+dnYR8e3aCi313cGpsgoR7YXlxbm1zdFZfcGJyYWBsbnpxaHBmZnN0aHFrYXdlXVdmYWByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBscXSKfXZ8hYB1dX6MeXuFgXiIg3OGhX6MjYR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ/l5aJjo2Iko2InH+OgXd6jH6JjIqcm5yblZJ5jHVmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx+bHtlc3Bra3p5W4B5j4+Ben1+f4aOe3pncmpyio6JgYWEfJSKa31+bX+LfoqFfIN5gI6UmZmJfHV3g5B4cm1ncYCFbmt1cGhqdW5UX29lcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cYp1XVxldmFiZWWPZGFmYllpc3Nua3J3jH10eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbn1liH5ucGyAWWxueXl0YXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhoujl4mOlYqRnZaDgZaQhoqQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooORiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gIGGjH95ZXJpf4mOiYGCfouWhGuBdW2HkIGOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjandoUmFxZ2xWX290emFyZF9ofnByblpjcmBiVm5ZXHhOTUxkZ2Jed3OJblxcZHleYGRlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIt7bnRxgVdxenZ5cmV3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGltfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2TiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4yeg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hY6FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmlmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdfYnNzhWpcXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mHgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh1g4V1gn+JkZyehpSPn36IYn+Th4WIhIqNgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SJf3BfcW+Ee46LgXt+kId5cINleYGJhouCeoN8fpKNj5GDbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNiXGhfZGxgblVbcE5IT2dlXGdvcYBtWlxjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAiHV5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIJtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabl4aTjZyAiGZ9k4KAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goGEhIBrXXB3en2LiIV7gI5/fXGAaHiBhoqFg3eCen+Wi46LfG1reol8dnRvaWh9d2VdcWNYcHRTVG9zaWJOaHR4ZmFeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZmSjYZvbIaSkXp5k4eBhJmKfId/eXiJioSVgG+Kh3F0fXtqeYaDpZGFk42Df25+gnWCd4WZl5OKk4+UhYdwe5KEfoODiYNvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHqCa1tvfHJ/h4OIfYWIeohxgG1wgoWNg4Rxg3d/mIuNg3dtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1ycFhoXmZqcV9vTldpUj9ZZ19bcGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+gIWCmoqBfI2NaXhya2tmX2FveW1fYm95XWRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tj41/bm2FjIx1fY9/hYKViXyDeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG9aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1pZXHV/dWlZYltnZW5iaU1YZlE9XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtZ2lraXB4fY5taoGEf3lugHt9gX+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5WCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKeHBthYOHdHmJeIl9k4h6fnJndoh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3lqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKCdW5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlYWWBxgHVhXV1gZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl6f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9MZnZMXm9VVFlzbmJRT3R5YlNXV1xhcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgYJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoizcop5cI52fYiQgXqUi4B1dHV+d39wcH9uhXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVVddYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R+g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoWAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koZ6eXR6dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fXpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhnYV9yZmpocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHx4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHpkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2AeHhzd297d2Vqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZvd4ukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Yltuempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFxaGdhV2ldXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedWZsZXFmc3B0gXhwmYV2f394f3yFh312dIKHgJWDbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlIByj4JxhoJ+goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3Bvcn9ziWVmen9qdXZ0dISFeIGFend0dW5renFiaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cnt5bHp6j4N2l3yHhoOHhH11cXNtaHVdbWlfbHVkZ2Zpem97cllngXd1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHhye2V9fn53dW5jZWFshnxta1ZqY3JUTGtsUExPcEhee2VhTlZ1ZUtPU1dga3d+Zl1nc2llX1djV2JxXUxLa1hkYlVUVXNXTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaYBpa29/Z2xiaXt6a3R1dW+GgnuBfXZ2bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWXBpj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR5kIZziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2dHVignp9dnVvY2NibXx8a2tVaWJnVExuaFBIUmxFYXhlYU1Uc15KTVVZZWx4e2ZfbXBqZF1WYFVvb1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXF0fGlqXW14d2h1eHNuhnx+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4iIgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWd5d3RwZIN0eXl0cWRhZG1yfmprVGleX1VMdWNRR1diR2N2ZWFMVHFZS0xYWGdsdnplZW1xZmNaWF1Yd2ZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlrYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Jxd3VsYltudHVodXdyboZ5f4F6d29vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Ig4h6dm9xfHFhd2Nabm9gb3CAe3JlcYBkXm11aWNmeHpybG2AdHJ8cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidGNgSlVuVUpMWlZpbHJ7Y2xsc2NhWlpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGJueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doJ3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdgbHZkanVqaV9bbnVybXR1dWuGfX+AfHdvbmxlaXFjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3N6entkZnZoXmNbYWhcXndpV2JecGhhd2FbfHZqanJveHRzdGhxgpWDh3+EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFFJUFpWa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgZG1jWGBhYl2MamRlbXp4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZml0aGN0ZWVdWnB2b3F2dnpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5dHVven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5waGlzcXRxdXZrbYWTgol8hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWVVVlBVb1hSV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVlt0ZFNSV2hRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBin5rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpydm5ze3l0bol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJub3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2a2iFjH+JeohtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhib3V6dGpua2pfWGBmaHVdZFdiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddVtUU2BnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpORi5KOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOjYmRiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiY6MiZCIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6Li5CIjYyJjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOjYuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx7e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18e31/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHh4iJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTlJOTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTk5GPk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGRkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOkJGRkZKTf4STkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoR5kJGQkohziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QjXB7kI+Pd3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6OdWyFkIdyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI14bXWOgXR2ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLiHBiZ3hzb3WChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndyXGJpXGJka2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGBjdGxeam5nZGJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aW2tza2FtdG5lWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01bZW9rWmlzdGtSUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlhiaG1ub3BxblNMT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0ZJVmNmZ3FubWhnXVFOTk5PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRUtNTVJfam1obm1tamhmY2NjWkxKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD5FVF1fY2lsbmltbGxqamtqZ15PR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R1ZfbnBxa21ramltZ1hJRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PD1RZXFyc29saFhFQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTk8S257cVZBODo8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PTw7SmxlOTo7PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0E6Rl8+Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTUZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3p8d1c8PT89PT5GaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KDhIODg4B9Xj5AQ0BBPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhIS01MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRlBTUlNTUk9QUFJUZXFxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f39+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCBg4ODg4OFiYuKiYmKioqKi4mKioFHNTY2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5/f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHiIiIioqMiomJjHo+PDo4Ozw9Pjk6Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo6Ojk5OTw/PDxBQkRJSkxLSUtMV29yc3VzdXh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjG9PPj5CREVFQkFAQj9AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouJjGM+REZKTEpKRkdIRUZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKh1ZITU1OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0hIR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE9NT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5TUU9OTUxNSkhHRUlJRUpIR0pKSUpHR0dLTE5MTUhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLYFRUUk9PTktKSEZCR0pHTEpGS09MS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WVhUVFVUT01LSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4xpWVdrYUZUUVFQSTs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGVVOllZWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5b3BZW1xbUlRSVlZUW1p1g1lVfZBhXVhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHxcUVZYVVJVUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3lucVZKTE5PS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTkxMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21xdHd4eXt7fH19fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5NSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lGSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tMTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0pGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREE+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTE5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9PT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZFSUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmhjaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdmcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnZ0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk5NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklJSkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHR1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhLSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BESERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQSk1NSk1SSUhFQUhGSklLTEpNSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JiYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURHS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlaUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0lLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhJUU1MS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGFYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhISEhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1MUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTUhISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVhVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goGDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJTWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWNkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0dLS0lKSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUExNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFdXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllZWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXWJcYGZhZGZkXl9kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGNjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tdX11gX11bYGRdXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dXFpbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4KCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz87m8O+v76+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3t5eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3e3l6e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6end7eXp8eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIWFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93cHBvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcHJ1cHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJ3dHFycnFuiYZucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycIWTcnFxb3uefm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxd6OQcHFxlZ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJznKiBb3uinn5wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGUq5twg6OffnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4d3h4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzcpOxqouVpp17c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh8qa+jsa2vn3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e4+rmaG0pJ+piHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maGVo6+fnKOafn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGZm4mYsKGdnZ2DgIGAf39/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBf5eknZSjm5mRnYh7fX5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6GqK+mnpmdn6appo+FgX9/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChYaNmquvoJujnZ+eoqSqq6WflIeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIOGjJ+rqaCZmaKdnp6fnZ6hoJqQhoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KCho+SlJWXnJyen56ZmJONiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5ORj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgIOIkJWUkJedmpGKhoeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDjJuHkJSKhIKDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoGBiIeNg4KDgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH9/iZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoODgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI+UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX2AgoSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhYWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICFhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHh4mJg4OEg4WEhIWFh4iIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDiIiGhIOCgoOEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWGh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Bg4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoGQhISCgYGAgYCCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp5fIOCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBgH9+gICAgICAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX9/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Mi4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl6gYKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh9g4OEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1/gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhoWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4OCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX19gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt6enyCgIF/f4F9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHp7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISEgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgYOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fX18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn6CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISDgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn9+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHyAfoCAf4GAgH99gX9+f39/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYGCgoGAgYGBgoKCg4B+gYOBf4CBhISBg3+CgoGDgYKCgYODg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgn+BgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChISDg4KAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIOChISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYSEhYSFhISDhIOBgoKDg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXiFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHh4eFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+CfYB8fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/Nk4icnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx173JmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdXSlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZsJ/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1s2Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTNjqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZu0vKOlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCxNWdko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkpGPlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmp6alo6CgoaGfmZKVpJqamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpaSlpaWkpKOioaGdnJqWqaqdm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKmpKOkpKSioaGem5qZqn1+nJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgsbWkoKKhoJ6cm5qaopdQg5ybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgoaeSsaKfn56cmZmam6piTIednZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoJ+qgX2uoqCem5mamqeMTlOKn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eopdZia2enJmbnJ2ralVVip6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm52ibWOeoJmZnJ2hmmlgWIygnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmbonNpf6KYm5yco4tqX1iGoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmal1cGqLl5ydnZt8aF9ch6Gdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZije2xrb4ecnJ6UcGVbX4qhnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn4mLknR+nKCjkXhlVWCQoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmqCmnI1siLGnpHiKhmNhl5ybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaloIh4W2unlpZbdIF8dpSSjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCSqI9rVFBynIqLTl10eICIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/k6h6Oy88eI96eUc6U291gYCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f56ZT09UP3uEbmZOOzVQcHp+hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCkdVOBeFB8lYl5Umh8Ulx1hIqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNn2GN1sBfpq+kpnBxin9WaIaLiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuio5Flv9Ctldu3psCxVF53aVWEkIuYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqrKBc7OvndHFopisrXFqxYdQe5+ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6isjX6ThIrIzrCzqpJ0Rq6xW3CdqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOipaGMg2+YsaOenIeBdGN6jHVtlKSioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKidgWtRjJKAfoJ2dG9wc3R+gJCjoaGfnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKurKupg3BfSG91bnF2a2llaGZncXZ+ipahpKWfoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e1s7a6vbuvlGpjV0hca2ZqcWdjY2VaWmFia3V6foiUnaOmnJ2gmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt77FzdDHwLWmk3deXVNHXHRranFlYGNpWlheWV5lbnBxdHiFmKaup6WYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vNDc4NnKu6+gkXljXF5TQV9sanF3Z2JeZ15VXFxbW15lZGJjbomyycK5oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMDO19jOuqOPfG9dVlhYTD1eYmh0cm1iYWZbV1dYWFZYWF1xkrDFy7q4t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca6xMDHz9LHpoVdT0tPU0w9VldoYmBxaGFfWFpXWFZUXoexxL2ztLaqtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBtp3Hs4xcU1ZQQ1ZTXGFmcGVYW1peWFlnkK+/uramqampqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TEubS/ubvKrnldUE5XfHSQl5ZVVFhXWWGBsLepq7K0rK6lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPDsn1WTHB3l6WdTlFTW3Sgtbeyray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THw8fIsIBgWJGmkkhMbZezwry+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcLFxc3Qx5OLqItFbbnFyc3GxcHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMHFxsnOsYxeacTQx8vPxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNrZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcG/wMmTP5TSzMXI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnOwbu/wLy7xL26wMS/vby4u8DFq0iVzMTAwMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjbq/u8O1use3trm7vLi5tbrDyalMj8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHiqy73Ht7m4rba0t7mztbK6xcmcTYTKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1651grzIz8LAuK61tbu9t7mxvsPHkVR/zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcnSu0dHMysS1ur/EyL6+tL7Av39hdsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnN0pszMy83KxsLDy87BvLi8urB4cWm7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKqytsPApXl3epzExsvIwcPAwMnKwb+7ubKiin91rsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKp9bmhubXKBlph0eH2Zvb/GwLnAvL7FxL29uLGuoJ+Mjp3KwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1waSGaVpeYE1SW1tvdHiDori4wrqzu7e7vb+6u7uuoqKml5+AvsTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4iqCvtZxqZmdWWWBJSU1QVG14iKewt765srWyvLm8trm+tZWltaWtdq3JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmIfHaMoZhfU0NYVUdhalZPRUphjqKtr7a6tbSyrLy5uLW4wb2LnrmrrnWmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBuTks/ZFlCTneAlGlNQV2DsLWztbK0r6y7uri2ub/GdoewpJxmqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV5cUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BYkBTo7mztLKwsa2wubi2u7e7vJGjs62kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2icgFpFUq67sayzr66srba2srS1rqmnn5qbnZ+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bWt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFxgcpCxr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yW1FrY1tlYV5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhXY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVdbVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTEtQWFJITU1HmKyqqaSfn5mSkpSYmJaWloyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW1cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnp2KYldeZWBXTVFHPT4/Q0M/PkJReKmtqaqln56foqOdnp2anZuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD85Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hqZVpbRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYUI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREA/SoWepJmDoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1JETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0crS1dbZ1tjT1tjN0srP0czP0czT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sa+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsPIxs/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2ZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgXmFgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcWkpGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYWBeX19eXGJtcm9vc3R1dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLIysPMxMbIy8vPys7N0M7UzMbJz83Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgYGBhYV9fXVtdZ3JycHJzcG1yeaXH08/L0NDT1MnEyMnFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jJzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7m8qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHIycrPy83Eur/Duru6ub3IxsLDwMPIysjIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fEyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1pbXWBgYmNkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/HvcnFy8DGwbC2ubGxs7Kxwry8vLq4wMHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dnhrZWhgaG9kVl5ZSkZKRkhLQUZCRklAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3LwcO6wLitsLCmqa2rpri0trSzs7O7tr2xt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8vFwMbGu8fLwM7Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15bXV5aW1tdX2xwbmlmam1ucnykxr+4uLSvqqunnqGppp6qrLKtqqyptK22sbOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8x7nDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BGQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWtpaOmppmfpJ+Zm6SqrqSooquqrKqwo6afqq21trG8uK+3r6iuuLS0vLizvK+4ubWyvMGywa+lqaOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcHBx8i3vsDFt8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWrpJ2boKOTnKOal5Cgoqmjop+lpqemraCdm6SmrLKvt7ensKyoqrSrtLqxtrautrmysLq6sbekoKSgprGorKm6qqWnp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsbm5wrPBvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVFlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ6UlJmflJmhl5WLnaChppyfn6Sloqeem6Kbn6uwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqytrbCzua+4ubqwtry7uquzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKebkZKSmZWZn5SVj5uhoaiem52lpqKlm6Chmpmvrq2vsqGlo66rqKK1sLKyrKmvs6e6s6a2oaOfnKOhraOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+rr7Kys7izrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmpGRjpKUlZ2Vl5OWn52gnJahoaikn5+pnZubq6avsKuco6S4qaCgr6i3q6enrbCkt7Ckt6CjnJmZqqahm625sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrG0sLy0uriuo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJOPkoqPkZKYlpuTlJqfm56Vn5+npqSnqKCdn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ihopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGwr6CSe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGBiZGl/j4+HjouRj5GakpOVo5mglpygpaGtpqWlpKSjnaqrpZqfpbGqoaGepaqeqKKfrqyqqa2toqKilZeimpyQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoaKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkZQT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl5fX2JkbYqMgY6DjY2Ml5GSkZyaoZyboKipq6isp6mmpJmlr6SVmaWvqaCcmZugnq6anKu0oKamn6OkoZSTm5aWkqmqrZudoKGhm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJFWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR8iX+IfImNh5CLlY+WmKGfmqCrqqavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnamnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1han13fHKFi4SOh5WIk5KXmpieqJufq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopubk4yOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqGaoKKWlJiYlaKmmo2ZpKepp6GgtLKos7ihnKO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFub3NtgYV/hX6Pgo2Jk5CSnaGOmpyjoqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS3ucHOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWlvanyCenJNV3GOgZaFjJyXi5ORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOVjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQipyIn5iIiJaemqGgl6euqa2oqJ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCt7O9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBrbGZ4f3JPQT9/lZGQfIiUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiUhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFZaboJxdHxoZ1tTj4mUiHN+hoF8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp6aHZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnp+hnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt3ZXWLlZiNjnxneIB2eH+JkH2EmJKAcYePfHd7b2t+rX10kIt/eoaSgHx/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcWuHpqrAfnR4Ynt3bnt5iJB5fIuGb22Mknl0eWpqgIJxlpGMgX2Vf0mSmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpK2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVxfp4dhmWhyeWR+b2x/eouJdoKIhnRsmpJ0dHxqap2OTXmFk4mEjmYxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSWlhZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpCZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9xendrfGxxgoGFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8c4utjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXS0hKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVNES4Z1f3x7dX5sdoiIfH2Eg3+MfnWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfHyBf3CBfXpodmxSWExARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktog4h7iXl7cXyPjHp8iYd+l4d2oZqIh4+SlKWNralIhq6vrouBgJOKgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36AdXVzbVxeXltjY1hnZlxUUFBXWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaYyThpSAhIGFkZJ+hYiRgJqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneHf3t2hHxudnVmf5SOh4iIh4iHoKqilomOl396gYh6eXBna3h/e391bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZnbXSbmo6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F9n5ybp6WhmaGXopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlRRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiqKmqbS8uKStrKymqLSrsLaysa27sbO+nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraOyqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisauxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1pjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU48Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUtLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0wrW3wcvItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ube+t7q3uayssKWwqa29sLy6wsGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUlJZWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu7wLu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuonpWWn5mfrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZl6eepqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTk9KS1BLU1FITEFKRkpPX15iZ2lhl7fHsLiyur21scTGta+4sLC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OIkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPM0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CrtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZeXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomHkYZ+gXtyfn+Bh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Oyn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ6grJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfLycnMy8/JxNLK1NfZ19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR6kp6NoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6KdmauVkJCJjJGCjIWIiIGGkJGem5mIhYyBhZd6iImfl5CIjYqLgn2hipGLvKCYk5eZnammpq6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxETUI7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2LnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkZ2Rgot/pZmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSun4qQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqclpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wcfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYX6Rg29td4t4eX96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfn+SpqSfpaKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5Kpr5+RlJCNjoiWjG6Nt4WaxMixm6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmSDR3WCjn18bX2IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZra+kl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJKYlIyKk5OGlJiGg5GQnHSRmbKVlqShiJyak4+KkIqXmomKlo2GfYyYnoqQj5yamZOZmJ+UoJ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramyva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+wqZqZm5SVkZigl5m7u63JoWm2t6qwlZieoquSl72jXqmygomKjJSHkXyOjn2Dho2PlJSIh5KWi4+VjYuMl5mSnZq0lpWrnouclJKNkJKLmJqKkp2Pi4mVn6GNlY2XmZ2TnJielaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDK06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqCfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqahoqOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUY+QT9BPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6roqKep6yvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLEvsO7s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu7+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqpp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsK/mXB7Y1tYXlxNTU5KR0RESEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tLzLu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqKeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhEREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnauruKupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCupIuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlZxgSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimrKutsrGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnAwc21yLvBubW6sa+vsrSno5uqtLSrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrStuaWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkJ2DbXWTopqVnKKfkK6yo6uVqaqYq6+lpaClqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiaqNhqGejKOslKSktse9tMG7wsPIycXCzsjCvbmyr7m0wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKurvryorby0uL7GvLa1uMCwvb+zqbW2q76kj6KXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyinqG1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUdITVFJTURGRkFRS0lBREdBVlJESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwby/uMHDwcjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pqy9sLe3xra0ubi+sL7BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1dNopukm57Fq6Gfq52crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSpra+ipqi9taWxu7e2tcOys7e6vrHDwLi4rrS0tKOcpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsS+x8S9xMq9sLC2rrG1r8DFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq6qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6mxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtb/EvsrFtsDJwrWrtamxuKzAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7mzuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJWTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCotaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaufr7Szqqq3tay7q7OyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWpKCXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MUk9fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeopbSyq6Gttb2vs7i8u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7Spr7K4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2vsbWssLWxv7rFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHlpmMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8LCtbS6xb7MxbnDwbrAusS4wbmytayqure7ur61q66xt5mYqKurq5ytq4+rvp6rr7Gjqp+xrbKurrWxuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLSuo5mdraebl52Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG95b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaUlNTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAv7Wzt8TAzMe8xL23v8DAuMC9sr2uqLq5t7fCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7Gnra+1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgmIWTl5GenJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKu6sba3v72vrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2xsMe/uKS5r6mtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7O0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+ilpWGkJSUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s/SEmQmqmqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK60wsPRxMW/wbK+w8K8v7i9xaitt620ubzAsKyyrqGjp66qp6Wxo6uxqq6qsK6urKuyuqe3sbKpsqmqpaWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLewsaCpop+qrbCrnZ6mp6mao5eYkKComIaDjoqLn6CQjI6XnpKRh4iRlaGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE1GlZasp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CtssTEzs7Dv7+0wcTEusG0ycSsr7ius7nAv7Surqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq5+jnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG3rKyipaKaqaqtqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmkm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1iVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklIRJaQr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG2srS7wb6zsq+trKyot6qmrbCruK6nsLCusau1qrW2p7W3q6ykqaqco56zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uPkJKNhYeWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0MC/vbq8w727w8HAv6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq20sa+xuaq4rqqvt6uqnqmroKOhta2poZ6vsqG1qp6op6qjqqGhrK2ova+rrqyhp6efq5mPr6KYoqCopp6nm5ipsKiin6yhoZKhoqKmmJmopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGWiZGdkJOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub+/vcm8wrmxsLWyury5wLO0vK25rKO1pqessba4sqanurWttLyvu6WtrbWqrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rs7CtnamjoK6cmrKilqSbpKSfpJqZp6qlnpqpoZuRm6CknZiWqKmRmZmSkIuCj4V9j4J/iJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRmpKVh4l+gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttZ3ldXlZDWHttVGFQUllLS01wdF1JWltnWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfnqmko6GqpLaysaSpsaetucG9trCkuayoqLDDycjMwbe9v7W4wbrItsS2tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgrrS1qKyerrGjnKWnqaOdnKSvpq+hn6upp6GpnKOooK27p66xrqGqoqOtnp6sppifm6Gim5+amaKqopqao6OVlpOeoZablaWsi56Rj5GMgop/f4+AepqUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJmQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJpcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5emo6Gfp6O3r62ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbDsrC6sbLAtru+t6q5uL2qpLSmqKqvrbiwqJi4vKOtvrSzoa63tKamp7CzoJ6kpaehpJmerKionqCqr6egppeiqJ+wuJ+jsa+hq6GtpJumpqmampueopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Ph32HfoKNfHuhjI2IeYSNhYqNjYWJk5qOiZWfiJCVgoyWjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7O0qam6xbayrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzr6WYu7akq7q1rp6wuK6ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6Sht7ChprCrn6ujr5ebqqWon5ianaOTmpuZnKWpmZubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qcpKGioLeqrqC7uKWsvcWzsK6jtbCsrK60w8O8s7+6t7Gzubi6uLuvrsCztLmwv8C4rb26taWisqmnqbKqrbGfmb+1pKe1taidsryop6Wpr6yZo6ecpKWUmKGxpZmfo6ipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5yfkZqblp+hqZuamKCUkJOWmY2Tk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0rKequrenrMTBtrCso7aup66ut7+/vLLBt7Cusra2uLa2rqq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAqqelr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae1pq+qrqGhnZ2hlKCmn6GgmpuZm5KYnJOlnKuhl5aclJKMlZeLj5iaqJ+RiImKiHiFdoGCgZ2HioKJfYCFiIeGkISWlJCOkJGQkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1pfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqbm8u7qtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qqCfr6Oprpyiv6Cxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6W6p66ioZqanZmepJqknZeel5uTmJ+SqJWpp5qTmpqRi5WZjZSUmqimjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkZaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGVaSUZMTU9ZUVBWYWWBVUFWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GZqbGvn7m/taC0wru9urGmtq+oraW3uLe3rbuurKqrtqqzuK2ms7Wyrqmwtraxs7W6pqmftaidnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIUmFvdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Kgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7Wiqbi2tqinrLayrrSts6Gpn7OqnqGjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6edk5+fmJCep6mjta+joqKdlpeXl6OIoI6SmYagh5OcoH+lf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oG+Ih4R+jn1/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhqcXCIWV5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C+qqW3sKmspbK0rq+zt6qppbCtpbSznK21trWmp6izsK2yp66dqqCyqJ+iopmhoZqts5OjpKW1vKasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJOTo6SmobejpKCjmJWSl5OciK+Ql5SJqYuWoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2R/wJy/eYSEeZGEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdcUEFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKoscK9srW/tbe+waqns6ysqaeus6mvtrSnp6W0pae4r5yzsrarpaSnsa6usKaqnaeksKOhn52Wmp6crauTnqKfs7qiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoaGwop+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJydlJmllHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnaOkqrG3rLW9v7C2xLK3usGmqbCrrqipsK6jsLqvo6StsqOouKies7Owo6Wgqq2vrK+mp5+jorCbopqWlZaamqullZuhnrOzoaucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpp+an6GVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXN2U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqCvqaeyrKq7tsKwu8KtuLa/qqytra2mrbGpoa68qqCntKyjq7WlprKzp6Sinaeqsqiwp6Wen5+ulp+YlJWVl52soJmZpKi0rqGpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqibpZmcnKKglpORk5Odg9WTmblwsMF+xYZ81pSbu3yalaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKiltKqltKmkvLfCsLnAsbW0urO1p7GworCypp+ttqiap7mto6+xoLO0sKGknp+nqbCotKikm52dqpaYl5WXlZagqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeji4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsK2jqrytprSmp7a7vLK6v7e2s7m5sqW0s6GxsaKfq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaielZOXmJKSoaaflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoImSmoqif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhpmZdq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZOLmVkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwlrTCraizqKmyurezuL65t7G0u7WkuLKetKyfnqisn5SntauosbGrrbSkm6mgn6ihtaamqaKZnZSkoZOSm5iRlKKkmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZOemp2gmJmblpehoJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6CJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19LVjZKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLu0n7CknqSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2UoZifn5Kel5yVnaGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCurausp7epuK+1wLS7r663tqvAtaipoJulpKGckaqpp7WjsqeuqqCXnKegpKu5naOtm5aZjqSilYydoJuYnJ6RkpSqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOQmaKWoJuWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXioyniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGLbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1lbWURBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsKyqq6uxp7ivtsSwubCtua6twLGro6Keo6Gbm5Cpo6qypLWmraWelpqqmaasuZ2jrZiUoJCln5KMnKKdmJ2akZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqehlKKanJeVo5ePr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZp7gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62YnaSkooqSkqWbpaqblqilpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Fzalpem4lhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydHh9fmJbd3SBaFBcboN9fItrWGx6gnJKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwaKbtbq1o6ylrqentbGsyKuvsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnZGQmJyvsr+sm6eep6KIk5GpmqijmpqsoKOam6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2NgnqlhmxqfJB8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKyt6CqprKnpbC0qsiqrLCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEr5qrnaqfkJeWp52qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipWPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXmIcmlzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rauusrKgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6KzyLOfqqSqlpaXmqadqJqeo6uUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saIyXkaN3a2qLmaOemXNsbnqDjYd6WGVehoJebYuJgXZcaHN3d5KAh4Jud4J4f3NteYR0doiIjoN8aodZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pa2jjo6aoZmTkpqfmZmklXulraKotMS4paKnr56dlJ6inqOboqmpkp6hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH1rpbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpCfoJibn5yHpqykq63AwLGgqa+pl5GenaGZoaOqpJOgoZ6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4d2dmt8iG59hZCRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrprKsrKqiqqevqaCnm5mkl5yir5+gnqino6Whn7Csmp2Vp66ssKqorJ+UkpufpJKPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2wqKyqnKiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+qoaGn3aYknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6OirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKiinp2wrJealqmnrqyop6iel5Sao6GRk6Csm52moq+spKy1qrnNsq2mrayXlZydopieraydl6CZnp6psqqrqpysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoKVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbZuVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKaikJqiqJ+gpZywpqSosay2yLK1qquplpGdnKGYn6SznZqhlJ2ep6yspa+braqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiIegepiWmniqyXSZo5WoqZGTmoyAnImaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGYlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjn66rnaagrJqeqaWdp7WfopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOysqmsqJOJl5ylmqGjrqWXoZWZnKWmrJuwnq6pp56so7esobG4r52arqaysrKjk5amopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWchZ+ErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5OMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmKmklKK1oqKVl6GptLikm6Kdo5KPobGYnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56ZmZqmpKqbsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+inYWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqCgtqejqaexo5Sso46kraOdkJqaqrOzpJyknKmRlJetn5+dpqOcp5y1maKqpLarw7CpqqmhjISOm6KgpqOVmpqcmZuZp6Wnma2or6Olm62mvayUvbCsnqGvsrmqsqWaqLCippd5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4nZ+RiZSSgHmvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5WOmY18fISYgGtuf2N/dG6AemBnZXFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklomakK6wrKaeppusl5ePrKGgnaWhmaScrpihqKa2qcCvpamjnouAjZuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmI+nm4yXkZiYfHqQnn9ldX9jhXh0gHxhamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnLO0qZ+joJ61maC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKpsqm9r6Wonp2PfYyblqCgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRrooFvq4RsnH96srDHg2mrsL2seHeivrxzgJaOppyRm5GZnnuCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK2pua2oo5qXk3yHmZGmmpKPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4mWlphxaWmEh2ZwhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmSmKF+iJCWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTJvreqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLqrrJqbk5J7hJaNpZiNkZGZlI6YlqiVoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnJSQmZOZkY6VhYGkmpeWjouTk4uPhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+clKGWmpijg4mWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6hr6Otn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6eZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qdnp2clqudk5mhm5SQlqqZjZiZl5CWnpGIoJ2VlYWSjJCNlIqAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSl5Sik56Yo4WKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566tqSlmZuNiHmBlIyak4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mZdwgJiol21/oqiKZZylnJGXmJaMkpyRhp2aj5WDkoeOjpKJhHdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3unm5tmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGyp5urp6yXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilKehnY6WkZ6Eda2PiKabqZGXpImcu7SnoJmYi4l0d5ONlpOKk5GRlI2QlKCPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoJeZlJiWgpGXl4SamWJ5h5CEjY+RioNtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmEop+ImH+UjIWFmmuOjYZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpqytq6isn6iwpqappZmUr8i/saKXqKm1npCEnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopWfoZGMkomGgJGnjYeinaSUmJ6Hn7qyp52bko6FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKOchJqBjo+Hi5pxj5OFaHd0fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJaioLCnqKilq5+jt7CpqqaalKCjpKukl6aruKOwgKGonaWenYmUvJqUjaGSno95hJaWkYirmZubmaKFjot3mpyPn5CInqWclpqYh6O5raSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoIyqrYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2mef5JrZ5eFl7eJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJXUG93Zm10c2tqb15rcW1raVhpT15YRjlBNEhEX2s0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaukh5qQipmpmZqbkoimsaehlZqIiYBpboiIi46OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+GqKuDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxxf5qkYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZcaV5jTEQ9RDZRQlpyMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVdjYFplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSjt5mrm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZmhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2noIeXjomSo5Scm42Lqailno+Xh4R+anuHf32QjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6mIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbJ5omo1umpl6gIunfXJodKuDnoN0qmiVml2bhXaEnWeqaoC4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qRbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljX2ZYYkJRRk83V0NSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbWbp4hjlJqrubGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioOVo5yKlI+GjJ6SnZ2JkKmjoJqMkYqAgGmAh3l/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OipICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF4fpi0oqOrqISZfJt9nZp/dKpaXW97lot4nmJMfnt6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRhUV9XXVVXQFlGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqCbc5GQgYmalaGbhY+pnJuVi4uKfINshIZxgaGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp2ZgKRvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdWuQs4xggpiJc6qyp7x/d4Ntfr6mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEa2dmZG91d2dgY1NcZlFRYklXSlRhV1NbZWpbZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamgmaqKmpiYk5mTkqGYj4iGe3B9hGh9j4OUmoF3kI2PiW9/hY+SkmyXk3yJkpOlloOPqpuUkouFiXmDdoiAboKfhneAk4aImaKXepSjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa0tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9tF9qdmt5h2ZqZ2N1dXBuVl5UWWlQUmhJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmKmYjZGLgYh6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpfW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dnWlNtSVlPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinuGcYCIaIuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaKskYaQioKKfoCAj3NpkKaEfYaUjYmZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6lsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDpo2rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtmdGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpmmjn+mpo6BjomFlHaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/XoB/i3d0cpR1bnlubYZshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN5fJh4hVxrWHmPaW54cnJveHhwXWuHbmpnVltgV1xma2RWYlVfUV9weHlsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunmqmYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58p6GLhpCQhZWDho6Yd3KEqoaNkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXd6mnuCioF1gYWCZ3eJhWphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHqWW1xqZ252W3t5eHVuc3OCZ1xti2trYlpaX1pZbHFcX2FaX11mdH57dXB0Y2tra3x9c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN9gYx2hYuChZeKcW+AcpiGg32Sg4SGioF6gYWMnKGRg6aiiHiOl4mVioucmISDeq2CkZealYqenYiIoaufoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJOUnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnYmEk359in9/dW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX16mWtyaGF0inF+end3cHd0gV1eb4dobl9eWl1dVGhyVmRcXGJsaHV7fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDe46ZiYaDhIdueYGAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4ern4Ryi5CGkpGLnZJ9jnuqhI6TmJaPnJaHhpuln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2DpHp8jpCRhpiroZ6UnZCOqo2Qf52MiJOZnoKOl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaEfoWElG54dXSRoYqLhZqDhIxzf4h7fHJxeoeCeneKjYORpo6Fg46Ag4qJineGiYqMfnBsf4J8bmhsbWhfen9pfXx2dXZ1e3dcX3B+bnVgY1tdXlJnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1tiomet5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYONgoKDbnx/eXOBhX6LkX1qaH2CmImBiI58fYaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdHSCcHdhfYCNhnGLlXyIjHGMf4KFho5od3F4i5eRj3+WfYeKcYGGenxwd3qKg3l5j4uClKWSi4SPeoaGh4V2goSJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZoCBa259aG9xbH54h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveoiMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4p/iYKBf3J/e3R2g4V+ipF4Z2N9hpeKgYqMeH2AjYN5l4KWmZeNl6CcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2cfYGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgHZxfW57ZIB8ioVwh5N/kYJsh4KBgImEZXVue4WRl4t8kneLiHt/hXt6cX13iIR4g4+IipehlIGCinaIhIKCd3yDioZ4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyPbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5yul6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGLfXyEfIGDgXh0eXpzfYCEgImLgGRffYuVh36EhnR9fop/fZmFl5WYjaSimX9zh3uTkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmHqHiI+Jb5edmqSUlYuMnoyGgpKcf5KSlYeZiHyKiYF6cXlrdWx7fot+bYWSgpR4cIGDfX6Kf2RxaXt/lpeEfoxzj4eCeIV8dXd/fIR/e4KLg4uSo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG50e4hrYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH18jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId357inx7gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4NzeoCHeo+SiZOSnZOmnZWCfYF9jYqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMeod7fYuFd35xcIGGhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhaX19ha1pQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaIF6d3VvjoV0gYKDe3WCiYV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8doV4eX9zc3uGa3Nwem2KdoCBiG9xW1l+kY2HgH9/dnWAgICghpGLk52YoZWYeIp/gIyJnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjZqRfIqAg251cGxtb3B7hWlzg46Yi3F3gHWCiIJ4ZnJudYCZjnuHg3mTkHl1h3NviHqEi3mKhYKHjZqih3uDdYGLf3d5bmyChIJec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWGFgYW5YUVRaZmdjdXCEgmJda25kYmZrkm5gZ2ZgZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbXZtiHaDfoBubVVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhI+KfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkYORgolxg5GYkJyPkIyMj413e5KReo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYNvdYt5iIt5h3yAi4+dnYR8enaBi3x3cGpsgoR7YHlxbm1zdFZecGJyYWBsbnpxaHBmZnN0aHFrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpFqX2hlW2dwfXBscXSKfXZ8hYB1dX6LenuFgHiIg3OGhX6MjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHBwhXRwcoRva2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ+lpaJjY2Iko2InH+OgHd6jH6JjIqcm5yblZJ5jHZmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3p5W4B5j4+Ben1+f4aOenpncmpyio6JgYWEfJSKa31+bX+KfYqFfIN5gI6UmZmKfHV3g5B4cm1ncYCFbmt1cGhqdW5UX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPZGFnYlhpc3Nua3J3jH10eoaCdXZ+i3OAhn96iX9yiYeBkYuIfH6YdmVzbn1liH5vcGyAWWxueXlzYXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR3cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqRnZaDgJWQhYmQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXByblpjcmBiVm5ZXHhOTUxkZ2Fed3OJblxcZHleX2RlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NndXF5bYt7bnRxgVdxenZ5cmR3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGptfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2SiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5WPh4qGiY2IgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hI2FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdeYnJzhWpbXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdnaKho6ZgYyCe5N1bHd1eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjICBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1g4V1gn+JkZydhZSOn36IYoCTiIWIhIqOgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SIfm9fcW+Ee46LgXt+kId5cINleYGJhYqBeoN8fpKNj5KEbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIFtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1elpgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabloaTjZyAiGZ9k4KAhoSKiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goCEg39qXXB3en2LiIV7gI5/fXGAaHiBhomEgneCen+Wi4+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRnYVpsbm17b1lbXmxjWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBlcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfIZ/eHiJioSVgG+Kh3F0fXtqeYaDpZGFk4yDfm5+gnWCd4WZmJOKko+UhYdwe5KDfYOEioRvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHmBaltvfHJ/h4OIfYWIeohxgG1wgoWNgoNxg3d/mIuMhHdtbX2Ef3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19acGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4J/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+f4WCmYqBfI2NaXhya2tmX2FveW1fYm95XWRsg3pgcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyCeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG5aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1tZXHV/dWlZYltnZW5iaUxXZlE9XmZdXXZmX3VxW1lVb2RaZXF5W2heYGdtZ2praXB4fY5taoGEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h5fnJndoh+fZdvcIZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3pqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKBdG5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlZWmBxgHVhXV1hZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl5f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9LZnZMXm9VVFlzbmJRT3R5YlNYWFxhcIJzW2FcaGVkY2pkUVtxSURkYlxjcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgIJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh5eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoezcop5cI52fYiQgXqUioB1dHV+d4BvcH9uhXSUhnh0bGB6gXmIjmVxgm9ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVlhdYHKEb1xgY21kY11uYlRdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoSAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZodyYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fHpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYGZfXFZ8Xk9WZXBZW2poXVhnYV9yZmtocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHt4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHlkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2Ad3dzd297dmVqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZveIukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Ylttempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFwaGdhV2ldXGtpSkRrWmJkVlhVeVpOV25qWV1sZV1aZWNedWZtZHJmc3B0gXhwmYV2f394f3yFh311dIKHgJWCbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn58bISGlIByj4JxhYJ+goBwZmxnV11bXFtUZXBlX1hjcnVpdXBkZWJXW1tof3Bvcn9ziWRleX9qdHZ0dISFeIGEendzdW5renBhaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXcnCOp32EfHaWkHN7cnt5bHp6j4N2lnuHhoOHhH11cXNtaHVdbWlfbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHdxe2V9fn53dW5jZWFshnxta1ZqY3JUTGprUExOcEhee2ZiTlZ1ZUtPU1dga3d+Zl1nc2llX1ZiV2JwXUtLa1hkYVVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaX9pbG9/Z2xhaXp6a3R1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWG9oj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR4j4VziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2NibXx8a2tVaWJnVExtaFBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vub1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXJ0fGlqXWx4d2h1d3Juh3x+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4eHgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWh5d3NwZIN0eXl0cWRhZG1yfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gXl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Nxd3VsYltudHVodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Hgoh6dm9xfHFhd2NZbm9gb3CAe3JlcYBkXm11aWNmd3lya22AdHJ7cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGFud3lsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdga3ZjanVqaV9bbXRybXR0dGuGfX+AfHdvbmxkaXFjW2tyZHR2jnNcV1NkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J6entkZnZoXmNbYWhcXndpV2JecGhhd2Fbe3ZqanJveHRzdGhxgpWDhn6EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVhgZG1jWGBhYl2MamRkbXl4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIGCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5c3Vven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5vaGlzcXRxdXZrbYWTgYl7hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAe3V/g36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtb3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zrc3VvbXh2a2iFjH+JeodtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGpua2pfWGBmaHVdZFZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIi4eGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uNiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk4qHlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKMi5KRkZKRd4aTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYlyipKQkoBziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj3NwjJCMdHeIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pd2t6kIZ0d4ePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI57ZWuGfnF1ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2heaGVnY26ChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvXnJsXGltZ2Voa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaF5odWxdbXVuZmJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWdvbV9rc3VsWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01WYmhtc3Bwc25SUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRhZWVubW1paFRNTk9QUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tEQ0ZMWmhsaG1sbWlnY1tVUk9OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVBUVVpka21nbGxramppaGlnW0xKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5CSlljaGxrb2xtbGppamtpX1RJRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs6Rk5NYW1wcHRwamtpWEtCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTs7S2Bte3NqW0c9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo5OEJqbUg5Nzw8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD08O0dcOTw8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/PkE8RV49Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLYz08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+DgHp8d1Y8PT89PT5GaXRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B8XT5AQ0BAPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHiIiIioqMiomJjHo+OTg4Ozw+Pjk6Ojs4OTs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFAQj5AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJTEpKRkdHREZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxOTE5KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE5MT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5SUE5NTUxMSkhHRUlJRUpIR0pKSUpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1NTUU5PTUtKR0VCR0pHTEpGS05LS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi418WFdTU1VTTkxLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toWFdrYUVSUVFQSTs7UlNSYHVcVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGRVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBZWltbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE1HTVJVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUExLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRD9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tLTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTU5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2loaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhIUU1LS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1NUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQTk9PV1FcW1tcXF5fYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVFJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OS1N1TkNCRlBQSEpLSUtQT09PTU9aYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0lJSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl1ZXV9eVV5dXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVBYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmRjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZqY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x5e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8ent8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFwcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnJzc3Jxb3p/b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF5e3BycXBxl4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycX2eenBxb4agfG9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcp2fdnB0nJ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwl6yQbn+jn35wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCOsah6iKagfXBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nzc5yzpqSnsaJ2c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4d3eBq52htqaip4R6eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e5KmmaOxoZuklHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19lZ6KlKyenp+agH9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCUo5yUnJuXjpuDf4GAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAfpqyqaObn5+lp5F9fH1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgYSVr6aepZ+fnqSorZ+Rh4F/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChomWprGpnpuln56foJ+jqKijl4eBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OFipmjn5mYmJ2dnqGfm5ydmZOMhYODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYeMkZWYmY2VnZuYlI2HhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYGDi5ach46bmoyHhoiIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKBhIuKko6FhIODhYWFg4SEhYWDgYKAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYGBgIiRgoKDgYKAgIB/gYCAgH+Af36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGBgoKFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiIiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBgoOEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+f4CAgICAgIB/gIJ/gIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fH9/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF+f4B8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7e36Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH9/fH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYKEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoODg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBg4KAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4GChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vLu/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0q2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtcqavLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqrDEooyAjcWdl5WcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzwJ6IrNa6l6GdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbunq5ulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbTBoJ2Wp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1qO0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bJ2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbTJjaGfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qzwqSqo6HDoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9ipj5Cs18KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cG/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpGXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoaCZkZKalpeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWnp6alo6CgoaCfmpOmr5uamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpqakpKOioqGenZqjioebnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKmrqSkpKSioaGem5ufoFuGnJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgqrSwoqOioJ6cm5qaqXBQi5ubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKuTnK6goJ6dmpmaoplTWo+cnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCjoWiXrJ+dm5qbnKpzVl+Pnp6enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enah0aKSjm5ubnJ+ha2JikZ6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qngmyBp5ubnJyikmxkY42fnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmapoR2cJOam5ydnYJqZWWMoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmaaNdXx8jpqdn5Z4Zl9ljaGdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmclZSde3+coqCGjH9gZpGgnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn6mcimttrqqhZ3+LemeXn6Cgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6aliHBfaqSUmFZne318nZybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampepmWdFSHSZg4VPRWB1gJSRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrYQ9Ojx4jHZuUTk1XnaCh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+mKNaXmxQeaGWg1NjakZneIGCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fp2MWZijb7a8sbyCeZp9TnV+hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2geIzczLPWsZ64vGVicmFgiIuOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjIuLiJKKmmizybTI1K+uuqd0i6lqWIiLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6Ganpyjo5NvqZuRwr62sZiNd13KmlWCj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqbOgh5B5lKyUjI99eXJnnZxjeJ2ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epqo54V4ONe3qAcG5rc3Z8fXagqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhqZ58aEtpdG5weGpoZGprbnqElqSjoKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqGjp6Gmrqanp6+EbGJLXXNub3dnYmNlX15qdH6Om6Khn52go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmtsLO1vLKWb2VcR1Z2cnN8Z2FkalpaYGNteH+KmaKioaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qorra4vMHDva+Ze2VkW0BdbG54e2thX2dbWGBeYWZwc3mBk6KonZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuzusbQ2tXGuKiWfWdiY1U9XmpsdnFyZGJjWVdcX11dYWhqa257kqWup6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vdLg4dC6pZKDcmFZW1tPP1dyaV5bbmxeXVdZWFpaWFlZW2Ryhp26yL63oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7zDyM7U0MCjfmFVU1VYUUZJgm56g39eVlhXXFtdWldgfJyyvMDGx7e3t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFyMjFv8WtimVWWFVRSWt1o6yjT1VcX2FcXWyQscS8va6psrertbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TDxsbAsZTEyNK7i2ZVVlFWZqKunU5WV1hbZ4ezt66wrbKmqqqqq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTAtrO+xsiwgFpUU1CZsZFHT1ZZcY6mvLClrbS1rK+lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcDCwsOhblVKjbaFRUtafqGip7Syray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTIy8asc192X0tXlre5wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPGxcjM1MyGSUxXoMnByM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbKzHtHhc7Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcC/wMelSp/SzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4vMDFr0+ZzcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjru/u8O1use3trm7vLi5tbrEyKpQkcm/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmszL3Ht7m4rba0t7mztbK6xcqeUojKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1652hL3Iz8LAuK61tbu9t7mxvsPHk1iDzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3aw0dHMysS1ur/EyL6+tL7Av4JmeMvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V2p8zMy83KxsLDy87BvLi8urB9d2u8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6zbw762vsC+vrqmnKqzt8PApnt5e57ExsvIwcPAwMnKwb+7ubGjkYV6r8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbdtrs69trnAvKp9bmhubXSCl5l0en6avr/GwLnAvL7FxL29uLKupKeSkp3Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d212e3FvalxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoKzvba1waSGaVpeYE5TW1xwdXmEo7i3wrqzu7e7vb+6u7uvoqitnqSBvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4i6GwtZxqZmdWWV9JSU1QVG55iamwt765srWyvLm8trm+tZaqvKuxd6zKxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxgY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmHe3aMoZhfU0NZVUhialVPRUpjkKSur7a6tbSyrLy5uLW4wb2Nor6vsHany8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQl6EsbWztbK0r6y7uri2ub/Fd4q0p55mqr+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dYSkpZeI6DY0FUo7mztLKwsa2wubi2u7e7vZKjs66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PTg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxUElJS2icgFpFVK+7sayzr66srba2srS1rqmnn5qbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OTw5OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t/UVhJS2FKVo5iZWSCr7WqsrSuqquvsLKzraWdkZeTjpegn6KgnKOkn56olJuWl4yXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yp9PQXOYc1BuSkxjZnV0YFxic5Gyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFpmfW9yW1FrY1xmYmBskbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXY2BkaVpaV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJITk5ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz9GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5iSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+MiISDiIeDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bV0tbN1NbX1NPR09TU08/SxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83LyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX1tPW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHLz83T1tLR1c3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNyszS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Ix8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBfX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9w8jJzsXDx8DHzcjEzMvMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vcHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8ws7Dxr6+tcG9xLu9x7vDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MbV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xu7awt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8x7nDtq2qqLCywLa4vbCxp7Gztbu8rK62pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlXV1tBTEtNSkVBQ0BGQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpaWlxlbm9oZmhpa25yga26sLWupaSmppqgpKCZnKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0vK+4ubayvMGywa6lqKOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqaot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhrb3KFqqWrpZ6coKSUnaSal5Ghoqmjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGorKm6qqSnp6insq2gqKefnKSmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVFlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+VlZqglZqimJWMnaGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXklXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRmZmZoaWtyjaeckpOTmpaaoJWVkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5KTj5OVlp6WmJOXn52hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmZiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlRLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgJSRk4uQkpOZl5yVlZufnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGFjZGmAkZGHj42SkJKck5WWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnJ+in5+XmJOJnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxcGBbV1ZWUkZQT0haXE9SSlRMU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXFxdXl5fX2JkbYyNgo+Ejo+NmJKTkpyaopyboampq6msp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK64pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9RTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZakqKedmJCPmp6ul5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVlcXF1han54fXOHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJmZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHRugoaBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVWWVtdampwa32De3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+XioCUiV87Vm98jJSJgIySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBsbWd5gHNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkVEQ0lOT2hZT1FTVFVaboJydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHp6aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgHx/dGZ2fIZsb2hzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmW5od36CbWpkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjnp3iX6JiI5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOKgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOh4iIh4iHoKuilomOl396goh5eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElMTEtOVmBjf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2inZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYaIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEQ8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKeoo6eaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWUF9VSUtLQUA/R0tGRUQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ube/t7q3uayssKWwqa29sLy6wsKsmbqok62Pl5eqiH2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqb36OhICNhG56c3iHYrmhmaKIlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLy3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qqGrjqSotoiBgXNgY2NfWGJgamdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj48SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+c316a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLSkhGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7Wz8nM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9hWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLL0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/iIGGe4dyg5KLjn1xeHVscXh+cXtueHNsaYFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4uMko+WhHmFkJCNiomHkYZ+gXtyfoCBh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI2Hj4B4hJSYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zp6+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlnt9amlcW1FUVF9IQ0ZJSD5BPT03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpORl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHp9gpGJhIV6hId6dX51bXx9hn5zfpKekZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+pjo/Dob2LnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPioeWm52PlZaQipKThYCLiJKNioqclpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMz9fQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfX6SpqSfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiJqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnl6mZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+s8XHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIaLiYWEkqe8ramyva+lrrOzqKOisKyKmrWeorilla2kl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho6PlJSIh5KWi4+VjYuNl5mSnZm0lpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u728xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgU1FHRD89Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLSsq7O2jKiyrq69q5u6pKituberpqaioaOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKebsZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81tDNxMqJdnVkX1xiXU9LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnuCf3F+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762zrLFvsO7s9HJyMG1d3tvX1pebFROSURNS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu76nur++vMO4rMGprLO7vaqwqaSlo6yutK22taCgrp+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOpqKKyrai7wMSvpbO3zMC5rsOzu77Bua3CwsHAmXB7Y1tZXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtPNzs3LvMK3sLq8tLzKvMPBtre8rbTAubytr6igqae2ra6psreanqyip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmWaZo5+zpZajlqytq6ecn6eXmJaYlaGkqKaetqypurzDtaa0tsvBuKq2rLO7uK6ouLq9uINucFxaVldQR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycWdeXFBSTUVRUVBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjKycjMzse+urOvubjAwc21yLrAuLW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC/uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpaClqpOSmZyJlZyinpaxp6qrure9s7Kuvrm2n6OnqKWmnJysqamNZWhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG7w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1u6uprayvo6KYqrS6pqqnrKqdqK+npKurvryorLyzuL7GvLe1uMCwvb+zqbW2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn5+lpKqSlpWghJCen5yVqaWiobS1urWtqLWysp6coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/uMHDwcjEv83Gu765srC4s7/DyLXAsLy3ubenpKurrKGgmqqqxKKlqaymnqyvrKKqqL+4pqy9sLe3xra1ubi+sL7BtrSytK++o5ajlpOblK2fkKGhpaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqaCbq5+hjZqVn4SOoZqbkqWkmpissbaxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57Fq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKmuoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rrS0tKKcpJWRk6Ctn5ihnaioq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OZt6Ofs6KhnLCYoI+alJ6Cj6CXlo2ipJWQpq6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLC2rrG1r7/FtbqxsLq2rZqpsamqmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5mnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKGTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhcaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDFvsrFtsDJwrWrtamxuKzAxLS3rq23uqWZq7Krqpifppetu7WbqLCbrZ+utLKnqrqzp7qzuLK4wKq3ssK8tMWnva6tt7Wpp6yhl5aRpaShoZeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6xsqWppaKempqalZion56Yop6usqKmjZivmaWsmJufppKdj5WYmoaWn5SMkJyelIupqauip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqevr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qralrbutwcO3uKqtsryjla2wrbKXpaiRqrmqoKewnaqfsLSzqqm2tqy7rLOyubesubDBub2+psKrsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWpKCXmYuWmZSWl52TiJCbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhSUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvKGqsKqjsbippbWyq6Gstb2vs7i8ur23tsHCv8nEucXDwcC5xb7BuK+2p6u3sry/v7WqrrK4n5esraitl6ipjqe7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6Gfkq2gmpmHlpmMnZqdk4qNlpeal6emo6CelpaXlIGQlYV7j5OEjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVJoXE5ZXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLajrKmlrq62qq60uaamsLjGt7G3vsHCtbS7xb7MxbnDwbrAusS4wbmztayqure7ur61q66xtpiYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6yp7WvtLq8ybKqtbSxtK+upqCzn5morKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5ieraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpeRi5SSnpqlo6OhmZaTkpZ7jJGFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejq7S3yrq0u7q/vrW0t8PBzce8xL23v8DAuMC9sr2up7q6t7fCt6yusriVl6auq6ejs6qUr7qkrbKxpqeisrOxsrG1sbeyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmJSxnaebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgl4STl5GenJiXloiWj5eaqJ2koZOWkpCWd4WRh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2krK2rpqOwsrOqtrC2n6u1usi5rsG7w7ezsrXCw8/EwMK+tL3BwLq/vbPEqKq5sba3wL2wrLOznaCnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraanrLClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGkJSUnpuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamvpKejs7SxtLWxsaGrrb3Muq7Bu8axtK20wsPRxMa/wbO+w8K8wLi8xaitt6yzuLzBsayyraGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpJ2XnpirnaGnqKGspqKsq7exsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI6XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GpsZyoqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcTEusG0ycSsr7eusrrAv7SurqulqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWjqaisrKqsoKimprGyo6aloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmknJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6Siqa+Yqaittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrrBusLErrG1srS7wb6zsq+tq6yotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irpp+rq6i5tqmpqamhqZ+tm5GooZ2go6Kmoqqdm6a0rqelqaKjl6Wmp6qcoqOjoJmYn5GOj5iNfoeNh4WenoiFi4uPj5GNhYeWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdRRTuVja+gpaqsmaqkra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0MC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWopK2zsrivoq21sa+xuaq4rqqutquqnqmroKOhta2poZ6vsqG1qp6oqKqjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGXiZGdkJOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessba4sqanurWttLyvu6WtrbWrrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rtK+tnamjoK6bmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZmSkIuCj4V9j4KAiJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltoWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycjMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6aqq661t7Sqnbq7qLG/srqgr7S2qayerrGjnKWnqaOdnKSvpq+hn6qpp6GpnKOooK27p66xrqCroqOtnp6sppifm6GinJ+amaKqopqZo6OVlpOeoZablqasi56Rj5GMgop/f4+Be5qUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKyL+3wr6vtL62xLbDsrC6sbLAtru+uKm5uL2qpLSmqKqvrbiwqZm5vKOtvrSzoa63taemp7CzoJ6kpaehpJmerKionqCqrqegppeiqJ+wuJ+jsa+hq6GtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Ph32HfoKNfHyhjIyIeYSNhYqNjYWJk5qOiZWfiJCVgoyXjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLXFx8C2v8K5sLW8tr67v6+svrCzv7K9w7mpu7q4p6i1qKerr6uzr6WZvLakq7q1rp+xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6SitrChprCrn6ujr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6g32DinmPl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmleZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5Xl5tUUVYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra60w8O8s7+6t7Gzube5t7qvrsCztLmvv8G4rL26taaisqmnqbKqrbGgmsC1pKe1taiesrypp6Wpr6yZo6ecpKWUmKGxpZmfpKipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY6GeYR6g4V9nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmleak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqORjaSnm56enaO1rKequrenrMTBtrCso7Wup66vt7+/vLLBt7Cusra1uLa2raq9s66ysb2/uK68u7Gln7aqpaWzqKqtnp3Aq6ilr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImKiHmFdoGCgp2Ii4KJfX+FiIeGkISWlZCOkJGQkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamNrc1pfWV1tZGFOaVhaYFZKR0lLTVJYPjlfbGlIQ1VTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7qtwLKurq62rrK4s6irubGvrrO2urawuL2spp61qqCgr6OprpyiwKCxo66vrbeutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6p66ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnSBgYqYhYd8iYmFhYqMipKElJyTko+QkZaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuurKqrtqqzuK2ls7Wyrqmwt7axs7W6pqmftaidnqihqKyap76YraOurrS1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXWBhio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6GpnrOqnqGjm6WmmKu6laWlr7K2ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+joqKdlpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtpbK0rq+zt6qppbCtpbSznK21trSmp6izsa2yqK6dqqCyqKCjopmhoZqts5SjpKW1vKasp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CjmJWTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYPUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6W0pae3rpyzsraqpaSnsq6usaaqnaeksaOin52Wmp6drquUnqKfs7mjqqmira6loZ2bmqKnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aWkpeSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKnqbCrrqmpsK6jsLqvo6StsqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuWlZaamqyllpuhnrOyoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qqytra6mrbGpoa67qqCntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqpudlZigpaeanpyin5ugo6SjlZuel5mdoqmbpZmcnKKglpORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurO1p7Gwo7Cypp+ttaeap7mto6+xoLO0sKCknp+nqbCptKikm52eq5eYl5WXlZWgqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6agm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m6s6W0tKGxsaKfq6+kl6a5raSxsJy0uKqgpp2hqaSyqKyppJmbmqielZSXmJKSoqeflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7G0u7SkuLOes6yfnqirnpSntauosbGrrbSkm6mgoKihtqemqaKZnZSkoZOSm5iRlKKlmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZSemp2gmJmblpehoJOXkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0nq+knqSnp52TqrCpr6m1rKqvoZihoKalpLqio6uglpuRoqCUk56Zk5een4+Ni6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2VoZifn5Kel5yVnaGVlo6rnI+ubXK0cqmMdoqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW7sK64tqrBtaiooJulpKGckaqpp7WjsqivqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVlxqeV5qYWVnYm14b1lbWUNBQHJAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0I5p5ueobyil7HDsK2qq6yxp7ivtsSxubCtua6twLGro6Keo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5qeqKOznqOljqeilKKanJeVo5iQr6CSlKmehZCZtX+PkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZqjbV0cnF3toxegHp9imiDeW15Y4uscHWFf1lbp2pFZVpUZmBjXmNRaGdxbXVCTVBMRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqWbpaqblailpZuZoKimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmbpXiHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYGNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUk9ERU47SEg9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOZmaKnrKKfq6KasZuUp6CWlJ2fnZexpJehqJmckZ2coqOYpaGanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiWmqChmpyUoZ6NgnqkhmxqfJB8gHWKioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2tvem1gY11waE1YWmZqYFdacHpubWZTT0ZTOU9ZTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrbCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJeWp52qm5ygrJihmpuhpK+moaWon66Yl6ecmZqgnp6cr6CcoaaVl5KYk5+glaKdmKCOlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZido5aak5GejX+OZqGzr4WKhHZ7kop9dnl6b2Z6kYGAiWt1gXmIc2lzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUERfVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqrorKtvKOzm5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqadqJqfo6qTnp+doKmvqaWjq6Kum5+goJiknpyfna+jmJ6ok5eWm5CjmJennJqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIjoN8aodZXmx1ZF1ziWlrfHFrY15STldKZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2wvLGppqOtrrCerJago52imZmmq5yto6WoqbKtnpWjj6Kvpba5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokZ6hnaCqsKqrpKqgqpunn6egq5Whm6WwpJebqpWgnZqRpJadqZeefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJujIFvynp/m3eRg46BdnqBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprCrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOpo5KgoZ2dra6prKejo6ehpqWdraiRpJqorambnKmbrKCVlaSVoKKWnH/OlHh6pIF5lZabX66PXo6ngaKgfaeWm3Srg4CvXmONqnunh4WgdZeTiLNjgquGoY6Ns2qFr3R9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hZCRfm2DkGFybHBoYF95ZFxxaGpkZmBSVFJXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrprKsrKqjqqavqqCnm5mklpyir5+gnqino6Whn7Csmp2Vp66ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+UoJ+cna2vp6upnKeopKKrkqyylqWiqqqdo6akobCgkpmmmJ+Zk5SRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdkWFNcYVlRU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2rqiwpqiqpqyrq6eio52ZoZSgpaufoqWgqKiinp2wrJealqmnrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqKmxopKWo6SZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCo32pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxqY11XYGlYWFVMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK6prKKnpqmqq6mkpqCbpJ2cpqeno5ysmqKsoaOfr6Kcm5OrpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqhs62hqrOxoZqop66utqKSlqKmmJqRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG9bZmpycGWBa15hWWNtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuKyqoKWaqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7WfopeTqaq1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtcOys6qtqJOIlpykmqGjrqaYoZWYnKWmq5uwna6opp+so7esobG5r52arqaysrKkk5enopmejoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KLdXtzhX9xXW5ueHJqgW9bZF9obmJkXUxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6qp52mppqjp6GzrqKpp7KgmKmklKK1oqKVl6GptLmjm6KdopOPobGYnpunpaGir66dpKiitrLEsa2pramRh4+bp5yipJyll56YmZqmpKmar6KupaaYr6S7rKG2t62dnbSxt7Cyppedrp+inYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2UjXh9eY+Cbmp5aXlyboB1XmVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqrS0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISNm6GgpqKVmpqcmJuZpqSmmKyorqOlm62mvayUvbCsn6Kvsrmqs6aaqLGippd5qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmYCsiYWuhZ+UqqGhl4afgJmVgHuSfquAnZqWi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI17e4SYf2xuf2N+dG6AemBnZXFuaGdoQlphWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbSfmqygrbilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKaeppqsl5ePrKGhnaWhmqScrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6mn7Ktp6iXdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZeYfHqPnn5ldX5ihHh0gHxhamZxbWZlZk9WZFxCVV8+Sig+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqS2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iaoZ6kn5mjo6WZn6Opsqm9r6SonpyOfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp66rKurlICpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpx7ZH57ZI5neYJ7YGtla2piUGFbU2pcQFVhQ04pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubK9sqKdrqWlsqadjJilv6q4sqihv6anspyesZy6qJ+tr6WmlJSwrJeMgpuRrqWirKCjnKqgl4qjkqaep5yaoaiimZ6hrK2pua2oo5qXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7Sqr6mfuaatrZlzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCWd2eIeGmOa3l/eWRsY2ZsYktkWEprWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytp42XrqmPi4WVlq2epqqgnaOjoJGLpJKnmaiZlqOqoJacpqansLqrrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2qprairLaViqCopbadiZajmYepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjnNqkXdxi3h3fHpqbGRjb2RVYVlAaltIY2FPWStGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam1p6mRmK2ii4eJj5uolaykn5innp6SlKOXqJqomZSmoaOQmqeZoba7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKyoqLK3n627mJGlpKa2opKep5+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmoh7c5dzeot/cnx/am9kXnBqYVtgWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKKvsqyuo6mmrZ+ntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuaejlJmqnI6Giomco4+unqKVp5+gkpaYm66LqZaPqJmojJipj5+6tqSlmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyn3d5n6mwuZR1q6OeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoCAYWmHipSSi1p1lJBoaI+Pc3ummppmepqIhHmZaoSLg295gGtxZV92cGxraFtnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqK6jpq2kkpartrCyp5urpqyXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2OiKaaqZGXpImcurSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7unoH6nonqirbWAjo2lnoOLhpCxqq+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXl4SamWN5h5CEjo+Ri4NtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+Ui4WFmmuOjoVseHtxcWdkeG9qbGpbZWtqZXRcXklUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWhmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isn6iwpqappZmUrsi+saKXp6m2npCEnaycp6KgjZC+npmNn5qgkHyGjpmYiKycoZWfoJGNk4mGgJGnjIainaSUmJ6Gn7qyp52bko6FcHWQiZWQipSQj5uLj5GfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgrCsgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6Ocg5qBjo+Hi5pxjpOFaHd0fHdoaHZxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq5+jt7CpqqaalKCjpKukl6WruKOwgKGonaWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPno+HnqSclpqYh6O5rqSanIyMfmJtj4uTkI2QjY2YjI+Rn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbVtvjH1nWmCDf2JXUG93Zm10c2tqb15rcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRoLa7q62imZigoqWtrqGdrrajqJOhoKCnnJqOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5qPipipmZqbkoimsaeilZqIiYBpboiIi4+OiouNkoyQkaKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+0dHNbnrKDamJvdHZxaW9Ya2xycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3tK2toJqinaOjpq6dnLKurJOYoJihpJmalJ+rm4uIkniLhXGAlo6Kj6GQkpSdl32QiY6ooIeYjoqRo5Scm42Lqailno+Xh4R+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkJRRk83VkNSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJqrubGvrJ6mnJypn5+vnJ6xqa2dl6OaoaCZlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkYqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbnN9lXCadGukXZV2SGVkYXRxfn5uZmBsaXZ7ZGViUl9XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCumYRUXqCms7mysqmaooycq5ycqpSirKSiqI+enZ2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcn+IkqGbc5GQgYiZlaGbhY6pnJqVi4uKfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm3B6e5hsnHx4l3NuqaRnYWV6cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0r7Ojm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI2PiW9/ho+SkmyWk3yJkpOlloOPq5uUkouFiXqDdoeAboGfhneAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJqQe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t2hZttdniYapl7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVk1ZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+TobKqrq+1oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg41/mKB5dY+IjIFphIWSgoyFnY16jYuWppODmKmYjZGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6euo6mwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJicc3SJfZB7ZIKHlYqJlpmCfIiHl6iRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lIZ4qXOlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnnq2MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3JicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2opq6kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5KHhpOOfXuChpmmjn+mpo6BjoqFlHaCh5JvbIupgIOLlI6JnJ+JjJSqop+PgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d0cpR1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bm1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaLoaKapqSYpZyroqGEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7mI90coNwloV7fZKLhoaQhXl+gIeapY58p6GLhpCQhZSDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+fqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFufqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenFnaGV7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3x4dWRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6dl56YqKOifoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gIx2hYuChZeKcW+AcpiGhH6ThIOGioF6gYWMnKGRgqaiiHiOmIiUi4ucl4WDeqyCkZeZlIqenYeIoaueoaGji4iTm5yjmZaqoaemoJKbh5WNe3eNjYOnfn+SkZKTnLKmm5WekI2ykpeEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGEeW2DhH16mWpyaGF0inB9end3cHd0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH9+f4V7bYKMhnx5eHt9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiUmJiUmKSgnnuAmquOn42GoJyLnpZ9eZSDe46ZiYaEhIZueIGAc4GIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4esn4Ryi5CGkpGLnZF9jXuqhI2SmJaPnJaHhpumn6GanYaCkZqZmJCapp+lnZ2Qln+PiXV7ho2DpHp8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF+g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqDhIxzf4l8fHJye4eDeniKjoOSpo6Fg46Ag4qJineGiYqMfnFtf4F8bmhsbWhfen9ofXx2dXZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbXVueXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZWpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1si4met5qho5+RkZWXi5qfn557eJ6nkZyKh6SUi5iZeXqNhXyJkYOMgoKCbnx/eXOBhX2LkH1raH2CmImAh418foaEhn2PgpCcnZKJqZ2AcIyLjJOHoaKKhYx9qJGIkJKXk5aTeIyjn6Cdlpl/gJCamJKMmqOho5qXkZp9jIN3f4KOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfYCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36WfYeKcoGGe3xxeHqKhHp5kIuClaWTi4SPeoaGh4V2goSJiHxnc31/eXtxbGtnX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZYCBa21+aHBxa315h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjo+Xj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2g4V+ipF4Z2N9hpeKgYmMeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabh4yJg6aVhZOLlpeTkneRnaChl5OWeX6OmJeOlpqdpJ2YkpSaeI2EgneDlo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8kneLiHt/hXx7cX53iIV5hI+JipeilYGCinaIhIKCd3yCioZ4YXp5fXR/eGdtZWF/amp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodWlub2d/fYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Ml4eGn5OXmX14qpyKmXqXnYuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqnj4yOipOhkoORkJSXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl42VlXOMjYlrhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx7fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfoxzj4eDeIZ9dnd/fIWAfIKMg4uTpI94g4F0iYd9gHR2gYmFcGJ8dnpxfW9ib2NkfGNub3ZzeHdzdGF1YG9sdW1vXFxfXl9qXlBdWWNhaG10e4hrX2lmamNod4huZmxpamxngH17d26QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGip6LlZh+d66ZjZd9n5ORlpSId357in17gHZ4f4BwdHR8b4Z9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiZOSnZOmnJWCfYJ8jouSpImOio2Ym42GkZiTlo+KiIySnJKPi4xug4+PkYiemaKhl5aJlpFuh5iDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx4fZmTfYOIc5CJgHOHeW5/fYCFe4WLiIOLlaiMeod7fYuFd35xcIGGhGRpeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtcllaX19ha1pQV1hlY2dxcX6HZl1qaWdiZ3GNbmRpZ2RpaYF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgY+dh5OddYGqlZOOh6GMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgYCghpGLk52YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi4yNjJyJjY+DbYmLkJCKnZahnJeUhZiHaoOigmWFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIg3mTkHl2h3NviHuFi3qKhYKHjZujh3uDdYGLf3d5bmyBhIJec3VzcXB4Wl5xYXBrXnBqfXtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda25kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNg3+XlIOQoHWLoJSShoubjJWOi3pyeHSCcHKFc3F1iGtvbXZtiHaDfoBtblVRgauVh4J3f3dzgnqCoYKTgpWUmZyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4edhI+KfHOLhYmOiJyan5uVlH+TfmiEm4ZnhaCHkYORgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWdzbHOHlYp+h4V6k45xeYNvdox6iYt5iH2Bi4+enYR8enaBi313cGpsgoN6YXlxbm1ydFZecGJyYWBsbnpxaHBmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgHiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXRwcoRwa2p3boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDlHeVkpmckZl7lHOFkJ+hk5ORiZKblIZ+lpaIjY2Iko2InH+OgHd6jH6JjIqcm52blZN5jHVmh5CGa4eihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuNiIqTkYl5hXx+bHtlcm9ra3p5W4B5kI6Aen1+f4aOenpocmpzio6JgYWEfJSKa31+bn+LfouGfIN5gI6UmpqKfHV3g5B4cm1ncYCFbmt1cGhqdW5TX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaBdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW9/c2VleXF9bXl9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqQnZaDgZWQhYmQgJGKiZZ+h3p1f4l4h4SOnJuYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2HkIGPhH2BeH6QlZOYkHRyd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXBybVpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3BzanCBbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaLm4mOapmQkJ6WlIGJcYWJoI6Fi5WKjJiUfI6TiIOJkHuQi4WPgX92eIOEcoiCk5yXlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySg4V9f4OAhIqCdWFza4iAj4qBfn6RkHxtgWt4hY6FkYJ7gHx+kZKQlohucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfH+HdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGaooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2Ryf2lmbXh4XF95e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2uaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh0g4V1gn+JkZydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0d3ZrY42Bj3+FfnyEf4SIfm9ecXCEe46LgXt+kId5cINmeYKKhouCeoN9f5OOj5KEbm55i351bW5sbHt+Y2lsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxnYmp1elpgeHx6bXF/ZWRoZ1edj15xc5a8xIR2cZSKkH9zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5OIdYmFdnZ9gXF1hoGelYaVj4KCcX+Hc4N6iJabloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqNhYqBin95goCEg39qXXB3enyLiIV7gI5/fXKAaHiChoqFgneCe4CXjI+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZY6xsndKYlqk2dCXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSVgG+Kh3F0fXtqeYaDpZGEk42Dfm5+gnWCd4WZmJOKko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foR1Y3BzgGh5cW91mI2Fgop7dniAhHmBalpvfHJ/h4OIfYWIeohygG1wg4aNg4Nxg3iAmIyNhHdtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFbW1lrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2xvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+gIWCmYqBfI2NaXhya2xmX2FveW1fYm95XWRsg3phcXZfZWXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt1ZnmCg6iMg4+Mg31tf3R2gXiEm4+Lj5GSjIuGfnuSh3iAhI2DbIBzaX9+eG18e4GKg3hheYSBcWRxaX5tdHF0gZuLgH+EfnN1fYBzgG5aa310eImCinuGf3yIeHlwa4eCjoKJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pyZUxbc3JlW0pxeHBeW1tZXHV/dWhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaHB4fo5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvYGFsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZhvcIZ9aHd5bmV6iISlh4GHjYp+bn52fn97ipiGgZOQl4iLhIl8j4hxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l7dH1sV219dXOKgYZ3h3WBiXp3cm2If45/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3lrWFlZWmBxgXVgXV1hZ2RoaGZOWmhOQWFkXGB2Ylx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcnBjZl5ZZ19wcGBhaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N3fpCPgneVjZSPh4KIeomJa3h5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3N9YVV1e3FziYOCfIJwhop3d29vgoGLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFlzbWJRT3R5YlNYWFxhcIJ0W2BcaGVkY2pkUFtxSURkYlxjcV9cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd6k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3GAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdpCAZ3BuX2RcWGVZbXNhYWFxbGxoiW5gc2lZXmRtgHep2qrHhoezcop5cI52fYiQgXqUioB1dHV+d4BwcX5thXSUhXh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdH+Qi4NylYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsfllWcnxvdIOGf394a4iGc3hqdH+Cgnx5fHd7coqAfHNndGRti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN1d1lRVlhdYHKEb1xgY21kY11uYlRdckdDZl9eZmldWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVWp0ZGBbaG9wZ4dyYXFmV11ja398ys6HuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7am11Y4R2koF2b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB4bXtcWHB9bHN/inyBbm6Jf3B2ZnZ+gH6AdXtxenOGe3lxZXJgbYyCbHNYa194XUlvbE1XVl9UVXxrYU9UdnNRUlRWXWJ0hWhcYGtqZmJZbmFYY3BHQWhdYGZfXFZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3eHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bWJ0h2l0fHJ6hId7fo2AeHhzd297d2VqbmCHdY6AcmliX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQh3KTh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qCdGx0Ylttemp0e4t6gWZ0hn1tcGd0fnd8fnF7a3l7gXl3cGVsYWyJfm1uVmtgeFZLa2xPUk9pTll9Z2JOVXZsTVFUVV5mdoNmXWFwaGdhV2ldXGxpSkVrWmJkVlhVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZXBlX1hjc3VpdXBkZWJXXFxogHBvcoBziWVleX9qdHZ0dISFeIKEend0dW5renBhZ2tnhnSNg21mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2lnuHhoKGg311cHJtZ3VdbWlfbHVkZ2Zpem97cllngXZ1Z3CAeIJ2YneFi3yUgG6Lam16gHBlcmVga3hmcnaJen1hdYN2aWtxdHpveHhyfGV9fn54dm5jZWFshnxta1ZqYnJUTGlrUExOcEhee2ZhTlV1ZUtPU1dga3d+ZV1nc2llX1ZjV2JwXUtLa1hkYVVUVXNXTVl2ZVpfa2BcWmNlX3dnbWJwaXRvcX51dJmBeICAeIB+hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amhtaGBiV19baYBpa2+AZ2xhaXp5anR1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRoZlhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kI54dW59bXF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2J3hIR4j4VziHFweX9xYnBoW253ZHBzh3t4YXKAcGdpeHNxa3d2c3Vignp+d3VwY2NjbXx9a2tVaWJnVExtaVBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vvb1dKU2hYZ15YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZcXGuBZXJ0fWlqXWx3dmh1d3Juh3x+fnp2c2x6Z2l3Z11kc2h6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBve2Z4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXZjdYWKe4eHgH93cnV+c2BwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIN0eXl1cWRhZG1zfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3lbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9gImMhn52doZ4hox9dHV1gnl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66Me3uGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15YWlxse2Nxd3ZtY1tudHRodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc31hY2lcVVheYmSQpWh5dIKFkHhsbnhmd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR1ZXKDkn+Hg4h6dm9xfHFhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpza22AdHN8cnFiXmVtb31laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doJ4fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFhgbHZkanVqal9bbXRybXR0dGuGfX+AfHdvbmxkaXBjW2tyZHR2jnNcV1NkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHtsZXZXW2ptYnBygHpzZW9+W2BvcWJeaW99bGpyfXFwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmFe2uEfYCFmX2ChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVlhVZ2l0aGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZGtvYV1ubWRzeIhrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SJcmpneW5lcnVxemt5c3Vuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3BuUlplamVxc4B2c2JsdlVicWtbXm5kfGVrdHxxcnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAenWAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2xleGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3R6dGpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5CLipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6GjIWKioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2NiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIeFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OSkpKSkpSSkZSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKTlIOFlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOg5KRkZONdYmTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkY5vf5KRkXx0iZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkHhqhJGKc3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pe2dxjoRydYePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI55XGh1cGRviI6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qKhmRpa1xnamuDhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnduY3VsW2p1bmVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Bnb29mbHJ0amJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGJnanJvcXNtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SX2NlbW5uamhSUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9NTVVja2dsbW1nZVlRT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFRUtSXmhtZ2xtbGpqZmJcVVBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhGRlNbXWFmam5qb21ramtrampmWktKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz9AQ1NeY21sbG53cmppa2hfVE1GRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tCTmJtcHpza2pgS0ZCRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTw6Pk1gdHBjTkM/QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTs6NjhXZkE4ODs8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PDw8OkRZOTw8PT0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8Rl09Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213STg7Oj09QTxLYj08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndONzg4Ojs+PldpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUlye1o6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WHuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUNERURDV3WGh4d+WEdISk1MTk9PTEhHSEhISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7enx9fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbUFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NjY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNTE9JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTkxKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyLi4qNck5SUE5NTUxMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0VCR0pHTEtGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1FTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpVRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpLVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdOSEdAQTw5Nzc2OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25xdHd4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVES01SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJTEpESUlGR0dDQztBQEI+QEBCRURJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDRUVJRUlKTEZJSUdGRkNCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTE9NTk5NS0hISU9SUVNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJDQ0NER0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1DQj5APTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEJBQUM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lKSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8QENCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5uXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBBQkA+Q0ZHQkZDRkVFRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRHRkxIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGS0lKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQkJHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tZWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENRYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTR0pPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNCRlBQSEpLSkxRT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cm1uXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Fha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhRUExOT01NU1JST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUE5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeV1RQWVJWV1dXWF9bZ3JeW1tZXV1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVJTUklITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFpVVFJVU1RVV1hXXVpeYV1bWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZ21zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUVVRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUldWVVdbWVpfXVVYXlxeXVtdYWFeW2JiY2dmZGRiWF9gYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFdWVlZZVFhYVVJSWVdWWl1ZXV9eVl5dXmBcW19fX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcW1pXW1tcWVpbZHFtaGReW1lWVVdRTE1WUk1OUk9RUk9MUFNSVVpVU1BQTFBYV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF5WXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1FOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVlXUE5SWlNSUVNSVFVUS1JWVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl5eZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFlbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF9eYlxgVV1eYmt5dGx9a1pVWVVRUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUVdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFliZmNmZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUFdWV1dXVlNVVFhcXF5gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYF9lY11laWRlaV9mXmNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1gWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NeYWZlWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1hXXFlXXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9en16e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fXx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7eXx9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzdHJxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnBxc3Bvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3F0c3Jxb4aEbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF4g3FycnB3nX9ucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcXahiHBycI+hfW9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb5Wqf3B3oKF9b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwj7GecIGloX1wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCMtqqRm7KmenFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdaCno7OopqV4dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCqJ+jsaObpI96eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fI+jkZOlnKChlnt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19jqCYlpmclpCZgn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCPsaqln6GfoaGDfoGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAg6SuoaehoKCorJ6Ffn1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AhY+nsaScp6GgoKKjq6mcjIKAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoubqaqjnZqinZ+hoJ6foqWhlYaBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4KEh5CYmJaXmZyMlJ+dm5yalIyIhIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KBgYSGjpaXlYePmpyWjomHhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBiJKXjpSak4aHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCgoeSloqEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBgoKGlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf3+Af35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4foGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX59fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH18fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX19gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn99i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt8fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx9fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIi4mFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH+Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3t8e3t8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoKBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYSEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCgH5+foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX98fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf3+Dgn9/gH+Bf4B/fHp7enx7fIKAf4J/f4CAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Bg4ODgH9/gYGAgoGBgYCAgICAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoCAf36AgX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYCAgICAfH9/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH5/gIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoGAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoCAgIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4ODhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEgoGCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4ODhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWGfXeFhISEg4KBfX9+e3x7fnt8fH1/fn19f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH98e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWChIWGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhIaHhYWEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeFh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHh4eFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYiDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhoWGgoODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag397gH19f4J+f4F+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2MmqqpqampqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7WoqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qxz5iHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZs8iZkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbS+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm1v56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatcaWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbPRmpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qw2aWrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9XMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubi4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm4uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlJqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpSZmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkKGsl5ebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmp6Wlo6CgoaGfmZmalpibmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpaWkpKOioqGdnJyiaombnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKltqmjpKSioaGempmlgVaOm5qamJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgp6qwqKChoJ6cm5qdolldlJqbnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKaigKuln56dmpmZp39VZpWcnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgoKCfqnd2raKenJqanKRrYWmVnJ+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaiMaYyrnJubnKCXbmlrlp2dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qjkXl1n5yanJ2giGtpa5KfnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZqao5R4fIWYmpyemX1qZ2ySn5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmqCci56AfpignIWNgWZtlKCdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqcp6GRcWWmrKFogY15a5efnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYoa2Sd2VmppeaWGd9f3idnqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6eleE5KcJuEhFJEYXiCnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampermU43PHSSfXBTPzZheo6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrXNUcFd8sKmZWmduSGt9iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+lqRchZt8ysWxxZ1+nXpQeIKCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpKRcs/XzdWmnLm8a11yXWeAhY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gnyZd5rRvcfTx8G0nHelqGNiioqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLiJKMm2+ippW5rKKhiYV2YciLWoiKiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoJ2Ek3yPpY2Fi3d1cGyml2GBj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nln5YcoZ5eYBta2l1eH94eqChpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpqKerqYVwUmB0cXJ6aWZiaWtwfIWiqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKjsJhwaU9WeHZ0fGhhZGZfX259iqCkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCjp6Kmraewsql8aWNJUnN1eIFoYGNqWltia3WDkZ2hoJ2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmttbq8vayKbWdhQlpucH1+bmFfZltZYWFocHh/jZqgoaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qnrrnBxszFt6WOcmhpWj9TcG9xbHRoYWFaWF9jYWJqcXZ7jJ+nnZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKq0v87Z2866q5yIb2BhYlNDSnlrYGJtbFtbV1pZXVtaXmNmZmh3j6Wvp6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vM7a3dTApIp2ZV1ZWlxTSkNtapSelFZUWFddXF1dWFVXW2l+larBx7q2oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9wMbO0c23knVkW1laV1NJVW+qs6ZOVV5hYl9fX2Z3kKe6vsHFxbS2tqmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsG+vMzEsJFvXFVYU1BTobWbTllbXV1gbY6qusG1uamnsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZK/v87OvJVpWFdaTJm5k0xUWVdgf6a8sKarrLKmqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAt7O8wca+qXlYVVGKt4ZMU1VdhKCmt6+lrbS0ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e9lmxSWmlaUVJklKufprSyray4tbKsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGyc7KnFZIT1Brrbu3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnL0dOkUkxgsMfAyc3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbIzopJk87Mx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcDAwMWqTqTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24vMDEr1OczMTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEyapUk8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmty73Ht7m4rba0t7mztbK7xcqfVYvKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1692hL7Iz8LAuK61tbu9t7mxvsPHlFyGzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tL6/v4VqesvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLi8ua+CfG28yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uqzbw762vsC+vrqmnKqzt8PApnx6fJ/ExsvIwcPAwMnKwb+7ubGjmIp+sMjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtrs69trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGvp6yXl53Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x2e3FuaVxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoKzvba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uvoqyyoqiCvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6GvtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZavwLC1eKzKw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2Np8KysnanysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FeI64qZ9mq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSkpZeI6DY0FVo7mztLKwsa2wubi2u7e7vJKks66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjk7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE0/U3hxUElJS2idgFpFVbC6sayzr66srba2srS1rqmnnpmbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t9UVhJS2FKVo1iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXSYcVBuSkxjZnV0YF1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFlmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1dfX19PX0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrNwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Jx8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDJxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9x7vDurS9xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7Gztbu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaSnp5qgpKCanKWrrqSooquqrKuwpKafqq20trG9ua+3sKiuuLSzvLi0vK+4ubWyvMGywa6lqKOrsbKzqL2qq6irrK61s6WorqGkr6mypqiorqaot6yxsre6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXV1hQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGorKm6qqSnp6insq2gp6afm6SmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVVlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnKCin5+XmJOKnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxb2BbV1ZVUkZQTkhaXE9SSlRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbYyNgpCFjpCNmJKUkpyaopyboampq6msp6mmpJmlr6WVmaWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK63pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dmJeVhIB2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han54fnSHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJiZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWViHyDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHVvg4eBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3h0ZFdNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH54fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdampwa36Ee3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk390b2BcT1NSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d+c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bmdfXUhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hiXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjXp3iH6JiY5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOLgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT06ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh6eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnpuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2hnZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoiShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKenoqeaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtLQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ubi/t7q3uayssKWwqq29sLy6wsKsmbqok62Pl5eqiX2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNhG56c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDln13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLHr565qqGrjqSntoiBgXNgY2NfWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttXmFdWl9hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIyJfIGEc3uKg4V7iXSBioeVf3N7eWxtdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NG3r8O8xLmltrrDooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KiouQh3yEgnB/iIGGe4dyg5KLj31xeHVscXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfZF5YYVNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkYh/b3Zya3N9e3Z7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBZVVpUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zpq+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlXt9amlcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX11bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOMlJSUj4uPiYeWm52PlZaQipKThYCLiJKNioqdlpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqmygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlFHRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqq+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdnVkXlxhXE9LQ0xARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO6x7u6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dntuXlpdbFROSUNMS0pJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IycrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6yutK22tqCgr5+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZebpaOpqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9ycTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2ip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaZo5+zpZajlqytq6ecn6eYmZaZlaGkqKaetqypurzDtaa0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcbFyMfOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKycjMzse+urOvubjAwc21yLrAubW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC+uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq6+lpaClqpOSmZuIlJyinpaxp6qrure9s7Kuvrm2n6OnqKWnnJysqamNZWhiYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1uquorayvo6KZqrS6pqmmrKqdqK+npKuqvryorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn56lpKqRlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensKsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEv83Gu765srC4s7/DyLW/sLy3ubenpKurrKGhm6urxKKlqKymnqyvrKKqqL+4pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqKCbq5+hjZmVn4WOoZqbkqWkmpissbaxqqWpraycmKChko6QlamflGplW2JeUEpJS09NSEZDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm53Eq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKquoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJmhnamoq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OYt6Ofs6KhnK+YoI+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZlxlYU1KS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLG3rrG1r7/FtbqxsLq2rZqpsamqm56moajCrZussZyqoq6wqaSnvbemtrq8r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5qnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUl5SagJKhlo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2dcaGZLSkxLU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrFtsDJwrartamxuKzAxLS3rq22uqWZq7Krqpigp5etu7WbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6ysqWppaKempqalZion5+Yop6usqKmjZevmaWsmJufppKdjpWZm4aXn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfemVqXWxrT1FOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qrelrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoKewnaqfsLSzqqm2tqy7rLKyubesubDBub2+psOrsLeuqKqrpp2YmKqhoqCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWo6CXmYqWmZSXmJ2TiJCbmZSOqamnoKSbmJuTh4+Zi36MloaOm2tqbmJublhSUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC5xb7BuK+2qKu3sry/v7WqrrK4n5esraitl6ipj6e7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSonqSXkJifsqqzqqqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6GfkayfmZmGlpiMnpqdk4qNlpeal6emo6CelpWWlIGQlYV7j5KEjJdmbXNocHNfR1lmVkRDTlhEWjlIQjY+XVJoXE5aXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS3wbmztayqure7ur61q66xt5mYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6xp7WvtLq8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5mdraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpOZjZ6cmpeRi5SSnpqlo6KhmZaTkpZ7jJCFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6yusrmVl6euq6ejs6qUr7qkrbKxpqeisrOxsrG1sbiyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquZyVj46LmZ2imJGYqKOgl4SSlpCdnJiXloiWj5eaqJ2koZKWkpCWd4SQh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMK+tb3Av7q/vbPEqKq5sba3wL2wrLS0naGnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGjpSTnZuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa/wbO+wsK8v7i8xaitt6yzuLzBsayyrqGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqoop6boqyVpZ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI2XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcPEusC0ycSsr7eusrrAv7SurqymqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqqhk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCIhZ2gjYuPjZuQkoyEjZmlnJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCYqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS7wb6zsq+trKyotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irp6Cqq6i5tqmqqqmhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeNh4WenoiFi4uPj5GNhIaWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+gpaqsmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWppK2zs7ivoq21sa+xuaq4rqqutquqnqqroKOhtq2ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeViH2NhoSFpJaGg4KMh5CPkYWGlaGXiZKdkZOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NUlpnTkxWWWVYR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46xoKSlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqmoqb2rtK+tnqmjoK6cmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZqTkIqCj4V9j4KAiJ6Ph4B+jIeSj5CFgZSblIaToo2UkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsZmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqqOdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6sppefm6GinJ+amaKqopqZo6OVlpOeoZablqasi56RkJGMgouAf4+Be5qUjIl9f4yHkJCMioaSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6yZn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6sbLAtru+uKm5uL2qpLWnqKqwrbmwqZm5vKOtv7S0oa63taamp7CzoJ+lpqihpJmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Qh32If4KOfHyhjIyIeYSNhYqNjYWJk5qOiZWfiZGVg4yXjZF9hHtzcHxxc3RgeXhqb3FxcGt/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7K9w7mpu7q4p6i2qKersKyzsKaYvLajqrq1rp+xuK+ppaevspuhpKCko6GWm6+moZ+jqK+hoKKTo6SitrChprGrn6yjr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6hH6EinqPl4qNh3qCiISJjY+FjpOYjI6WmYqPl36Gl4yPeoB6cHF2bm90X3h3ZW1sbGtqhG9mcmlrZmleZHSBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Gzubi6uLqvrsCztLmvv8G4rL26taais6qnqbKrrbGgmsC1pKa0taiesrypqKWpr6yZo6ecpKWUmKGypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY+GeYR7hIZ9nY2Jiod6gYSHiYmShZaTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqSnm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBt7Cusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Aq6ikr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GhmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfYCFiIeGkYSXlZCOkJGRkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwbKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqrpyiwKCxpK6wrreutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6qK6ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTko+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9urGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7W1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vb2tp7ewpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKanmKu6laalr7O3ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqepvsOvsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqhopqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKnsMK9srXAtbe+wquns62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2bmqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3q7O9vrC2xLK3usGnqbCrrqipsK6jsLqvpKSusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrOzoqucoq2toJ2Zl6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qautra6mrbGpoa+8qqGntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqZqdlZigpaebn52in5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurK0prGwo7Cypp+utqiap7mto6+xoLO0sKCknp+nqbCptKmknJ2eq5eYl5WXlZWgqZyZlqetsKijno+toqaVnpecoaWhmaKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m5sqS0tKGxsaKfrLCkl6a5raSxsJy0uKqgpp2hqaSyqKyppJqcmqielZSXmJKSoqeflpKlqrCmopaTrZ+kkZSgm6Smn5WbpqahmqKfrZqgnp2QlZuhnpymlZ2WmaKflZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52VoLmwl7TBraizqKmyurezuL+5t7G0u7Skt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWkoZOSm5iRlKKlmpKPpq2vpqCVmamfoY2RopmopaCUmaWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV5xc15KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmpq/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0n7CknqWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56Zk5een4+Ni6iwr6adlpuopp6LkqSXqKunlJapp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo+rnI+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY1xfb3piVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpyeu6GcssCurqurp7epuK+1wLW7r664tqrBtqmpoJumpKKdkaqpp7WjsqevqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmZScrKmVi5OlmaWtopCWqrKjn56mq7CYoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYWx3bllbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueoryhl7HDsK2qq6yxp7ivtsSxubGtuq+uwLGrpKKeo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enk5CWpJykrJ6QoKirn5ufqKOznqOljqeilKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZFlTZmBjXmNRZ2ZwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqabpaqblqmlpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXmZgS1pXZ2NfT1ttdWlyUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqu0o76xsqagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOamqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHWJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11wZ0xYWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVl5KYk6ChlaOel6COlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZieo5aak5GejX+OZqGzr4WKhHZ7kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3VkeWZgaWVjZGZrWWx7b2lqXFJMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp+doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5eWnJGkmJeonZqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoR8aoZZXmt0ZF1ziWlrfHFrY15RTVdKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2xvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjj6Kvpra5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWgnZqSpZeeqpiefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eRg46BdnqBgHlxen+HcXiFjZN5bniUY2ZfeWRgZYJjXnRnbGRiV0tVSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKCWlqWVoaKXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Srg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i3YYOtWaLNbpB1e9p7f5lwfoiSdn5le4h2dmt8iG99hZGRfm2DkGBybHBoYF95ZFxxaGpjZl9RVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrprKsrKukq6awqqCnm5mll5yir5+gnqino6ahn7Csmp2Vpq2ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+VoJ+dna6wp6upnKeopKKrk6yzl6Wiqqqdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaufoqWgqKiin52wrJeal6imrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqeno5ysmqKsoaSfr6Kcm5Oqo7Wwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlaKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG5bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqKm1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtMKxs6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7Okk5enopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KMdntzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpp7KgmamklKK1oqKVl6GotLmjm6KdopOPobGYnpunpaGir66dpKiitrDDsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2Ujnl9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqLO0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLaqwrCpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6KwsrmrtKaaqLGjp5d6qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI58e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomaj66xrKaeppqrlpeOrKGhnaWhmqScrZigqKa2qL+vpamkn4uAjZuan6aekpSampSamqalpZuqrKykpZ+qqL6klsOsqqKhq7K5qq6mn7OuqKmYdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHqPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoaaYrZGYjqiaoZ6kn5mjo6WZn6Oqsqi7r6SonpyOfYublqGgmY+RmpuSmpipoKKaqa6opqajpam7nqDGpqSooau0tayupp67rKyslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKCjm6iel4qjkqaep5yaoaiimZ6hrK2ouK2oo5uXknuHmZKmm5OOkZiYj5iTqZuhmaqpoaqnoaOqu56oxKKgrqOqs7Sqr6ifuqeurppzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlphyaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epqqgnaOinpCKpJKnmaiZlqOqoJacpqanr7qrrJqbkpJ7hJaNpZiNkZGYlI2XlaiVn5iqpJuxpp6iq7mfr8CnpLKlrLCxqq2rpreirbeWiqCopbadiZajmYepmpCUnZKpspmao6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmZeWjouTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjXJpkHdxi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpLS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5uolaykn5imnZ2RlKOXqJqomZSmoaOQmqeZobW7qKuYmY+Ne4GUjKGUipWRlZCQk5elkJ+bqqCctqOep6u3p67BrqO2pq+vsKypqbK4oK68mZGlpKa2opKep5+NqZ+Nkp+jrK+aoKOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmYh7cpZzeot/cnx/am9kXnBqYVtfWG1jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOvsqyuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco5CunqKVp56gkZaYm66LqZaPqJmojJipj5+5tqSlmJqMiHmClIybk4qVkpSQjZKXoo2en6men7ijgISvtaKvr3WkvaOyn3d5oKqxupR1rKSeiYCqf2RcYnagjqSehJd9bpOznKOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lJBoaI+Pc3ummppme5qHg3iYaoSLg295gGtxZV92cGxraFtmZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mJm56Mq5milKagnI2WkZ6Eda2OiKaaqZGXpIiburOnoJmXiol1d5ONlpOKlJGQlIyQk6CPm6GnmZyyloCMm7Wds4ySj7unoH6nonqirraAjo6mnoOLhpCxqq+MipajmnmAi6yGnJ2hp6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWJ5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+TioSEmWuOjoVseHtxcWdkeG9qbGpaZWtqZXRcX0lUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpiXh6qboJSen5GNk4mGf5CnjIainaSUmJ6Gnrmwp52bk46FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgq+sgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWSho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6OchJqAjY6GiplxjpOFaHd0fHdoaHVxaGhrXWNwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkIaqmJmamaCEj4x3mpuOno+HnqSclpqYhqK4rKSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbFtui3xmWmCDf2JXUG93Zm10cmtqb11qcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWjqJKhoJ+mm5qOmbSZkIufjJWLdYGUkoyKppWTl52dfpKFhaujh5qPipipmZqbkYelsKahlZqIiYBpboiIi4+OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZiylXF8l5+zdHNbnrKDamJvdHZxaW9YamxycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7KurZOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GPkZOdmH2QiY2ooIeYjoqRo5Scm4yLqKilno+Xh4R+a3uHfn2PjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeZXKh+eLtqfalbjoRds2dcbnJ6eGtpXHBqeHljYGZYYkJRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56xqaydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJCTmI96ioSVo5yKlI+Gi56SnZ2JjqijoJqMkYqAgGmAhnh/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbXJ9lG+ZcmqjXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl9XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRTXqCms7mzs6maooycq5ycqZShrKWiqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yQkZaIcn+IkqCbc5GQgYiZlaGbhY2onJqVi4uKfINshIVxgaGMeIaNiIeTmZZ8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm294epdrm3t3l3NuqaRnYWV5cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3j4yOiG9+hY+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneAk4eImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGeYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVkxZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg4x/l6B5dY2Hi4Bng4WRg4yFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZaIiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJibc3SIfI96Y4GGlImJlZmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjomYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhH6Yk3R0hXKSg2x/i5GHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlmVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZmxxdW5aW2JsZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYVlaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gYx2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOLm6CQgqehh3iOmImVi4ucl4SDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3cHd0gV1eb4Zobl5eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR3anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2Gn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYaCkpqZmJCapqClnZ2Qln+PiXV8h46EpXt8jpCRhpiqop6TnY+Nqo2RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSooqLhZqEhIxzf4h8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWhfen9ofXt2dXZ1e3dcX3B9bnRfY1tdXlFnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J0bWxVY3F5ZXB6e3Nlam1si4met5qho5+SkZaYi5qfn557eJ6nkZuKhqSTi5iZeXqNhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImAh418foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx9qJGIkJKYlJaTeIyjn6Cdlpl/gJCamJKMmqOhpJqXkZp9jIR4gIOOhqB/foyMj3yYpKKik5mQj6aMjoCakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIuClaWTi4WQe4aGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoJtc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6Xf4yiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgYmMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh4yJg6aVhZOLl5iTkneRnaCgl5OWeX6OmJeOlpqdpJ2YkpSaeI6EgneElo2dfoGJjYxyl6OfopOZjo+hi4qClpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3aIhIKCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R2fXF8YmNhc251cm1hWmFeW2xlUmNYYWFpbHZ5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaIc3RuZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqWnIuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipOhkoORkJWYkYuBj5ifmpKPkHN/jZKUiZ2dnqaYmI2VlXKMjYlrhZePmXqHiJCJb5eem6STlYqNnouGgZKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW1vXFxfXl5rXlBdWGNiaW10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6inh4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9npOQlpSId357in17gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Ym42GkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBth5iDZoWYjpN6iISQinCVmpSjkpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4CAh3tkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFd35xcIGGhGRpeXR1cHxiX3Bha3RecGp7eXlsc3BleF1ubHNtcllaX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6CMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiVhZiHaYOigmaFnYqQfouDi4F3k5iSn5GQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHSBh4J4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYKLf3d5bmyBhIJec3RycHB5Wl5wYHBqXm9qfHtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThouajJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J3f3dzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4iehI+KfHKLhYmOiJyan5uWlH+TfWeEm4ZnhaCHkYORgolxg5GYkJuOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB3gox8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi312cGpsgoN6YXhwbmxydFZeb2JyYF9sbnlxaHBmZ3N0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eVkpmckZl7lHOFkJ+hk5OSipKblIZ+lpaJjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN5jHVmiJGGbIiihJGIl4KFY4yRmY+VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+foWNenpocmpzio+JgoWEfJSKa31+bn+LfouGfIR5gY6UmpqKfHZ4g5B4cmxncYCFbmt1b2hqdG1SXm9kcFlfa3F3Z2trYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uvm6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlouQnZaDgZWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6PdYl1bYWIin2KooOQiZyEhV6Lk5iMj4mOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gH+Ei354ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH+CeX+PlZOYkHVzd4iNdXNwZ3Z6hGN1bnBiaXZnUWBxZ2xVX250eWFyZF9ofXByblpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapmQkJ6WlIGJcYWJoI6Fi5aLjJiUfI6TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWGfm+EgYmGmKGCk4ueg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzdmtajHySg4V8f4OAg4mCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kJKQlohucXmMhnVscGtzeYJgdWpuXWt2X1FkcWlmU2BwdnRgcGBdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqHc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGZooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBpYGZhf9W2jpCmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjYGBio17j419iIR6dHqDe3GHgZaajpOUgYh0goV1gn+KkpydhZSOn36IYX+TiIWJhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0dnVqYo2Bj3+EfXyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KEbm95jH51bW9rbHt+ZGlsalludlpSaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXR4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qemp+GiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWNnZ1edj15xc5a8xIR2cZSJkH5zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1h4KelYaVj4KCcX6HdIN7iZecloaTjZyAiGV9koOAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3Zya2qNhYqBiX54goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqEg3iDe4CXjI+MfW5seol9d3RvaWh9d2VecmNYcHNTVG5zaWJOZ3R4ZmBeXVhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfl5+ZhYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFkZI6xsndKYlqk2dCXcnuRi5F4f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYaEppGEk42Dfm19gnaCeIWamJOLko+UhYdvepKEfoODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BzgGh4cG50mI2Fgol6dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aNg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfnJhWnhaWXJtTlhyc2ZgSm12dGFeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3lgcHZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt0ZnmDg6iMg4+Mg31tf3R1g3mFmo+Lj5GSjIuGfnuSh3mAhI2DbIBzaX9+eG18e4GKg3hieYSBcWRxaX5tdHF0gZuLgH+EfXN1foBzgG9ba310eImCinuGf3yIeHpxbIiCjoKJcYF4f5WKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl5YHN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn52foB8i5eGgZOQl4iLhIl8j4lyfH2FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l8dH5tV21+dnOKgYZ3h3WBiXp3c26JgI5/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeEf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdGBzb1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5COgneVjZSPh4KIeomJbXl5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3R9YVV1fHJziYOCfIJwhop3eHBwg4KLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW1fc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh1bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdX+PioNzlYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGFieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsf1lWcn1vdIOGf394a4iGc3hrdX+Dgnx5fHd7coqAfHNndGVti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgYmxkY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dxYHFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB5bXxdWHB9bXN/inyBbm6Jf3B2Z3d+gH5/dXtxenOGe3lxZXJhboyCbHNYa194XUlvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGppZWJZbmFYY3BHQWhdYGZeXVZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3aHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBcmFrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFsf4GPhnKUh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGh1fnd8fXF7a3l7gXl3cGVsYW2Jfm1uVmtgeFZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFvZ2ZhV2ldXGxpSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxmV11bXFtUZHBlX1hjcnVpdm9kZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bHp6j4R2l3uHhoKGg311cHJtZ3VdbWlfbXVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgW6Lam16gXFlcmVgbHlncnaJen1hdYN2aWtxdXpweXdyfGZ9fn54dm5jZWFthnxta1ZqYnFUTGprUExOcEhee2VhTVV0ZEtOU1dhand+ZV1ncmhlX1ZjV2JwXUtLa1hjYVRTVHNWTFl2ZVpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeICAeIB+hYR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amltaGBiV19aaYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnppa3pqX2VuaIF3kIRnZVhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbHt8a2tVaWJnVEttaVBHUmxFYXhlYU1Ucl1LTVVZZGt3emVfbXBpZFxWX1VvblZJU2hYZl5XTFRrVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXaAgXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paW1ViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6aGp4Zl1kcmd6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXl1cWRhZGxyfWpsVGleXlVMdGNRR1diR2N2ZWBLVHBYSk1YWGdrdnpkZW1wZmNaWF1YdmZTSVxjWGhYWEhWZFBIYnlbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4mLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVpdWVbZ3RmdnaRel9dU2VmaoKBc31hY2lcVVheYmSQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8cnFiXmVtbn1laVRoWVpVTnlgUktaWUhjdGNgSVRtVEpNWlZpbHJ7Y2xsc2NhWVpbYXdcU0pjXVhpU1ZHWGBOR2p2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcVlNkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5B0a2p5bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW97a2tzfXJwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFJJUFpVa2trfGVtb3FhW1pYWWxwV1JPZldWaFNURllcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uEfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SKc2pneW5lcnVxemt5dHVuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5ke2RrdXxycnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWGVTU0hZWlBOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35thIB+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXhib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpgS1htZF94aG59ZGBVXlRddFtUUl9mTlxhVFNKW1lRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5KPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoeIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIyHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjYeFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yPjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSkpSPjpSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk3yGlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPfo+SkZOIc4yTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJB0dpCRkHh0ipGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkXxofZGJdXaJkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6QgGJqin5sdIiPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53XmpmaWNsio6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLhmRvbVtpcmuBhoOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvY3FvYWpzcWVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGNla25zcHJ1bGNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGBiY21vcHBtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01PX2hmbG5tZ2VRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFZkbWZqbW1qZ1xTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHR09VYGhuaGxsa2pqaGRfVk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVNeYmZoam1sc3BqaWpsa2pmWEpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4/P01ZXmptbG55c2pqbGZcUkxFRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o+R1lqb3dwa2lZR0RBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0RYbWxfSEE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzdTYz03ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8RVw9PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj09QTxKYTw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndNNzg4Ojs+P1dpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5GanVNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUpzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZGR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1JTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fX1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pJQEZBQUBGSEVKT0hRUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9BQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRU1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVETE1SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZGRENJSUhLSkdLUk1CTk9NUU9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2ppaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dXZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpgXVVYXlxeXVxdYWFeW2JiY2dmZWRiWF9hYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVlRXXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWJiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8eXx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzdHNzcXB1d29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3Jzc3Jxb5CDbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF2jHVycm99oHtucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXKdlXFxcZWie29wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb4+viW95oqJ6b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwiLKmdoqspHtwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNs6ikprGodnFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdqGho7Smm6R8c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCp5+cp5+jo5J6eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIuhjo+YmpmblXt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1/iKeno52gmpOYgX9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYCNsqepoqChq6aEfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIB/iqmun6mjoKGlqaSMfnx+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+BiJWqr6ScpKGgoaGhqaugjYGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoODhoybpqOdnJqfk5ihoJ6dnqGglIWBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChIyUlpeXmZiHkJ2bm5yYkYuHg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgoOEjJaZlYmSmZySi4eFhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBhI+XlJaZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4SRloiEhYODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYeRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJKAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+Ti5CBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX58fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+BgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKCgYCCgIKBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fnx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY6Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY6Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15d3R0gICCgoKCgoOFg4SDgoOEhISEhISBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHp9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSEgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWFgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX19bU09PT09PT1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLe909PT09PT09PT09PT09Pb4uLi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6Oiq9PS0tLS0tLS0tLS0tPR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tPT0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Mmqqpqampqampqampqaiw0tLS0tLS0tLS0tLT0tLg6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0tTU1NXV1dXW1tbW1tbX2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/Pz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0NChlsvSx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/KnJaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzv5ugqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZssyjoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZmMfJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmzyJyVlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWat7Gar7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbexnpuinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qyyZ2ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9evjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD01NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Njc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLQDs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT5IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUE/Sk8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QUNDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODY3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a3tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3trW1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDQ3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKinqKilpqioqKeop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qopaanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenp6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uanKKgmpaVlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSnaCXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanp6ainp2foaCXmKiilJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmpqalo6CgoaGfmqB0j5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaWspqSlpKOioaGdm6aCYZSZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKktrWlo6SioaGem5yjXWaamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgpqWTsaKhoJ6cm5qnhVVunJmanJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCteoytn56dmpqcpmddcZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCfqY1pnKednJqan5dqZ3Kdm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaSWdH2pnJqbnKKLa2lwm52dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qglnt3kZ2anJ6cfWppcpuenJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmaoKB6ioWQmZ2ekoBrZnOan5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmpugl6B9cpmlm3iOhmlym5+dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZmcq5+KcWCnqZ1heol5dJ6enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn62NcGBpopCTVF95e4WgnqCgn56dn6Ggnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6endEVGbpeAe1A+W3aEnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5apmkxERnCVgnFSRzhgeI6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCVrHVdeF+Dtq+lYnZ+S2p+iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/kqhgjrOMzsOswKWAlXpSeoKBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foqXctDWydetn7qzY2RwWm6Bho2Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2Rf5DNtcLOyL+slHyqrF9oiYyOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLiJKLmHWYoo20qp2eh4JwaM2AYIuLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoZ2KkHqGo4yEiXd0bXaji2aGj4yYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nmX5bZoZ4eH9tamh1dn13hKOhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWqqKeqrIdxVlt0cXJ5aWViaWlwfIujqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmZ6lpaKisJ5xa1JSdnd0e2hhZWZeX298i6CkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqiwsqyAaGZLTnB1d4BpYGJpWl1ia3WDkZ2hoJ2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mttry+vayNbmhjRlVub3x8bmBeZlpaYWJncHh/jpqgoaKYlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7zGy83Gt6aPc2hqXEJOcG50bnNnYmFZWF9jYWJqcXV6jqGonJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKu0wNTd28u5q5uHcGBgYlVGRXVuYF9tbVxbV1pZXVtbXmJkZWh4kqevpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS0t8XS2dbJrpF4Zl1aW1xUTEFraoyYj1lUWFdcXF1dWFVYYHKJobLFw7SyoKeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHHzdDEoH5pXVlYV1NJVGyns6hOVV5hYl9fX2Z6lq+/vr7AwrK1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsC8uczJuZdzXFVYVFFSnLOfTllcXl1gbY6qu8GytqemsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZO/vMvQv5hqWFdZTJK3lk1VWVhgf6a8sKarrrOnqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAuLO8wcW/qXdXVVGKvY9NU1Zbg6Cmt6+lrbS0ra+lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e7jWNRYX9lUFNgjaqfprSyray4tbOrqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGys7CjVJJUFFmp7q3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnM09OWTU1cqsfAyM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsfKzX9Jj83Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcHAwMemTaTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24u8DEsFOezcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3tri7vbm5tbrDyKtUl8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7q0t7O7xcqgVY7Jv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncGtzZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K92hL7Iz8LAuK61tbu+t7qyvsLIlluIzcLCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRud2NnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tb/AwIdofc3Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLm9u7GBem3Ax8TAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bw762vsC+vrqmnKqzt8TApnx6fJ/ExsvIwcPAwMnKwcC8urKlloh5s8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZur869trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGupquWlKLKw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oz0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoK0vba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uupa2yoaWHwcXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZmxvq6zeLDJxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2PrMS0tHenysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iJBuTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/GfpO6q6Joq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vZSntK+nd62wqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxT0lJTGmdgFpFVbC6sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGdEU5x+UFhJS2FKV45iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJuZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTg7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXWZcFBtSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmaGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotXU0pmpFlmfW9yW1JrZFxnYmBtkbWwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVqcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojs5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkQ7Qz5GPD45Nk5+qrKno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIyMrEzMzMzs/Fx8i2v8rA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUy9DU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOztDL0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9xb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJy8vPy87N0M7TzMbJz83Ix8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxfenyhkYuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHaDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2hwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlma25ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubayvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVlbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmJOKnpGNkpOWkJiYk5yho52koaKVoKKlppujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZyjlZugo6GXoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWV9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mfnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiZlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io16kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdampxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhCPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSAjZyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcYB8aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh5eW9na3h+e350bGVeW1teal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSUlLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZGBbZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnpuOkpWYo6KmtrCdkZmoh5aPjYGIbHNzfYB9cmlgXWJgYmhkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKJlXp6fYV/aGFoXGVjXmRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKebtqiMpI6Rkp+GeIKDdlpiZVdmYmJkYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wsKsmbqok62Pl5eqiX2CfWtXZGJZa2VqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lLSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIsJ65qaGrjqSntoiBgXNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36DgIN4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttX2FdWV5hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNwZV5eXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfY11XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4fJ21jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiPg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGfJuIlI+uqpSVmJ+Zp661vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlXt9amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlve3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY+KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WMgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPgIOIhaSGjJCzmJ2SlJehoZ6ZkpydqLK5rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXlhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29teIt4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iJCliY2TqZqXk5aZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyZn4qQkJyamZOYmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlBGRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdXRkXlxhXE9LQkxARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5KZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXlpdbFROSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZugoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Kuvrm2n6OnqKWnnJysqamNZWhjYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsPIycXCzsjBvbmyr7m0wMLKtsaxwLy1uquorayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucopqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEvs3Gu765srC4s7/DyLW/r7y3ubenpKqrrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqaydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpJS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr7KyLa4tbSws7S3wca2vrC4tLq2oKetqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZVtkYExJS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xMq9sLC2rrC1r7/FtbmwsLq2rZqpsKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSU1LU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZion5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBxsG6qralrbutwcO3t6qtsryjla2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnoKSbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC4xb3BuK+2p6u3sry/vrWprrK4n5esraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2VoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6emo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZ11GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6Wmp6qcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWppK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop5+nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiZKdkZOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqZqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIaTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZDWHttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpLaysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQl15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O3r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WdnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiZGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i2qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpuanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Bq6ilr7KprLW7nqmpq7GlmJ6pnaekkZimraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGZnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlZCOkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwLKurq62rrK4s6irubGvrrO2urawuL2tpp61q6CgsKSqrpyiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqJ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+puMK4vbytp7awpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKammKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqgoZqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYm6OplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xmp6crquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ2mp5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqipsK6jsLqvo6SusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZaamqyllpuhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmgpaSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZaQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKikm52eq5eYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKnm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJmbmqielZSYmZKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5iSlKKlmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknqWnp56TqrCpr6q1rKqvoZihoKalpLqio6uglpuRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmpoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm14b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxurGuuq+uwLGrpKKeo6Kcm5CppKqypLWmraWflpmqmaasuJyirpiUoJCln5KMnKOel52bkZWSr7myrJWXo6enk5CWpJykrJ6RoKirn5ufqKOznqOljqehlKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52rpL2moKqXlJyQoZqRj6KooZOdmJOXlLK1t62YnaOjooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fWJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuws6u0o76xsqagoqido5uZmaymr6Sktamlm5eVoZqmrai9p6imlZOblZ+ZkpekqaiQnZGPmJywsr+sm6edpqGIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11waE1YWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlZ+WramlwJ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnKqekJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZiepJaak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3RkeWZgaWVjZGZrWWx7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbCmrb6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlrfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjkKKvpra5pa6jjo6aoZmTkpqgmZmllXulraKos8S4pKKnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopOmrau3s6euopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF5lJabX66PXo6ngaKgfaeWnHSrg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6Whn7Csmp2Vp66tsauorKCUkpufpJKPnqWYnaejnq6kq7CpwMezqKmxrpaSnZuhl5+pqp+UoJ+dna6wp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52wrJealqinr6yopqmel5Sao6GRk6Ctm52mo6+so6y1qrrOsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kcm5OqpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosq23ybK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZuflI+lrJGZm6ejoKmmrqGkp6qwtcKys6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKK1oqKVl6Kptbmjm6KcoZKPobGYnpunpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46kraOdkJqaqrS0pJ2km6eRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6Kwsrmrs6aaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXl1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRYWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmZlgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuYmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6XkZ6Eda6PiKaaqZGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWlFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaSUmJ6Gn7qyp56bko6FcHWQiZSQipSQj5uMkJKfkpehpZaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWiqJKhoJ+mm5qOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmZqbkoimsaeilpqIiYBpboiIi46OiouNkoyQkqKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARF9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7GtrJOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GQkpSdl32QiY2ooYeYjoqRo5Scm42LqailnpCXh4V+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56wqKydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGcc5GQgYiZlaGbhY6pnJqVi4uLfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJmFmamgoaSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneBkoaImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2lJVk1ZVFZdaGtuVmdXTUpCSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaW1loZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6dpmXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlbYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dG90Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaenoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRrammAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXqqhI2SmJaPnJaHhpumn6KanYaCkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqEhIxzf4h8fXJye4eDe3iKjoOSpo+Fg46BhIqJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbGxka2pogYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enJlam1si4met5qho5+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4aHh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaChmJOWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNYYGFoa3Z5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5igmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6GMlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAd3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqSfIqAgm51cGxtb3B7hWlzg46YinF3gHSCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h5b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHOLhYmOiJyan5qWlH+TfmiFnIdnhaCHkYSRgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6MjYR7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHh6jX6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgoWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4WgkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6Pdop2boWIin2KooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEc4eCk5uXlJeGjHWHf3CEgYmGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBio17j419iIR6dHuDe3GGgJaajpOUgYh1g4V1g3+KkpydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpSanJpYlFicndsYmVeWmqDbXNiW2dfZGxgblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXV4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5zaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmSjYZvbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYWDpZGEk42Df29+gnaCeIWamJOLko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aOg4Nyg3iAmYyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViHyDeG52h4WDl3duiIRsdXt0ZnmCg6iMg4+Mg31uf3R1g3mFm5CLj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hieYSBcWRxaH5tdHF0gZuLgH+FfnN1foBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaUxXZlE9XmZdXXZmX3RwW1hUb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6fnJndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn51foB8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOKgYZ3h3WBiXl4cm2IgI+AhHJ+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhXUnRhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJziYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVVlR3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdYCQi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp3dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGf394a4iGc3hqdH+Dg316fHd7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3cGdefIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inyBbm6Jf3B2Z3Z+gH6BdXtxenOGe3lxZXJhboyCbHNYa194XElvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piXn54eYqEZnF9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2x5d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnJ7a3l7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFpTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1aHCAeIJ1YXeFi3yUgW6Lam16gXFlc2VgbHlncnaJen1hdYN2aWtxdHpweXhyfGV+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEhee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTVh1ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeH+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19baYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHVig3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXhmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1Vvb1dKU2hYZl5YTVVsVEtbeV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnhaXmBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXdcU0tjXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5veXl6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0lydFhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVxemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RQSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHZaXmVsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnV1XF5lbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FERERERTkvMDAwMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlZWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OTkpKRkpSIjJSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZCSkZKTkHeMk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQd4mSkZOAdY6SkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJJ5bo2SjnR2jJGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkX9neJKHdXeLkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6PgmFphnpodIqPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53YGtiZ2Rui42NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2RvbltqcmyBhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndwY3BwZGtycWRoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGRlaW1zcHJ1a2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWBhY2xub29rWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QXmlmbG5rZ2NRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFVkbWZqbWtpZlxTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHSU9VYGhuaGtsa2lqaGRfV09OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRFJdYmZoam5sc29qaWpsa2llVUpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PktWXGltbG55c2pqbGZbUUpEREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o9Rllrbndwa2lZR0RCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0Zbbm1gSUE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzhWZD84ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E8RFs9PT07Oz0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxJYDw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTUZGdndNNzg4Ojs+PlVnQDs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRLOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2KChIODg4B9XT5AQ0BBPUlzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg399hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKi4FHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1JTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlBRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUVFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk1MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo4ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJEREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QEBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFSEtGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEdKTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDREVJR0tKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpHSkhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExNTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRUVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLTElMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VDRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJR0ZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVtSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXmJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVddVlRQWVJXV1dXWF9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVtVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZW1dVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXl9eW2BcYFVcXWlqcn1zbGdcVVhXUE9SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFpYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl9cW11YW2BhXmBkY2RlZWZiWWNlZWlnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZnamdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cW15eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmhqZ2NhYlxkZ2BcaWliaGlmZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX15bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGlnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJiYuMjIyMjI2If39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyMj5CQkJCQkIx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV0dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHt8e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3Nzcm9+e29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3VycnJwc5h7b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0lXxwcm+IoHZwcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCUoXVwc52gdnBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxb4mxkW5+pKB2cHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwg7OpfJCvo3dwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNsaerqK+kdHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdZ+iorOlm6N6c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiApZ6apZ+ko496eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fYqikJCXmpeZknt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+hqappJ6gm5WVf39/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCKsaipoqGhq6OCfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gICAiqeun6ijoKGlqaSMf3x+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CBiJaqrqSbpKGgoaGhqaqfjoGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoyapqOdnJqglJmhoJ6dnqGfkoSBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4qSlZiXmZiIkJ2bm5yYkImFg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYKDjJaZlYmRmZySi4eFhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOCgoGBhJCXk5aZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4WRl4mEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZOAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+Nl4KCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJObhYKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSSkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fHyLnI2AgoGBgoKFlJSLgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjI+BgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhoaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHiImIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4ODg4WJiomHhYeFhIWFgoCBhISCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFhoiIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4OFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn5/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fH17enl5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2Pjo2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+AgH9/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJi4mFiJKPjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enp5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4CAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKBgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fn5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgYCAgH1+fn+AfXx+fICAgYCAgICAfIB/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICBgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+AgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4WEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYaGhYWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4WGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOCfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgn1+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqbO09LS0tLS0tLS0tLS2ZE7REREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKSnzdPS0tLS0tLS0dHR0tmUQEhJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM7T0tLS0tLS0tLR0tLZmU1UVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLV1dXV1dXV1dXU1NTV1dDLy8rKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6znqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWroZqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ai5uhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5nIedlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqKPnIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6SlrJuoiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izLa1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nAo5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqKOrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKjJkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKinqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGempubnZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpWXlpqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJaeopKYmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpKWop6ainp2foZ+eqZ+QlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaSlpqalo6CgoaGep3mOj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSrsKOkpKOioaGcopZhkZWZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjqrCroqOioaGemqZzX5eamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoa2SqKWhoJ6cm52fXWSam5manJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCol4Gsn56dmpikiFhmmZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCgo6Rvm6SdnJqapXliZpicm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enp6neYekm5qcnaB4a2aTnZydnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5ucon6AnJmbm52VdWpnj5+dnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmamqp/fYmTnJybiHFoaI6fnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmZiif4aCgpmenIFwYmiOn56dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmXoJubfHqbo5uAh2tlkJ+enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZm6mciGduraqMaIOBbJSfnqCgnp6dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6CmiHRfZZ6Wgldye3qbnJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5WinnRSTW+VhHhJWXB3kZSRjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGPp5VTOUB0iXFnRTpVb4GHhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAiqh5TmhUdIt3ZU9VQ193foCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKgX3WMYn+nnohdhntRa399hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2MlmO51I+9uqm3h3R8aVl/hoqOi42QmZyUlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLh5KJlYKBz8Sc1a2asJ5fgnFUepGJiZCPjY+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZujoZxuj7qkuNGxqK6TbLOnVXSUj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqbCjdI2VfrG8s6uVh12WxGxvnKKhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6iqr5KLdnunl46Pf3pqbZF6b5ajqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOhoauUfFtpkX57gHJva3Nxe3uUnaKioKGfoaGooJyeoaWhoKajop6koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmraenoqynfWxTW3dvcXZrZ2RqZm54gY+eoKGgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaioZ+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mutLe2ubauj2pjT1Zua2tzaGJkYltgZm92gI2bo6WhoaKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqptMLGxsjHv7OmknViYEpPb3FtdGdgZ2dYXVtgZ2xvdX6Jk5ykn6GhmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuywNjh3tXGt6qdkXxnYl9GUmpucXhoYGJpWVteW1xdYWJhYGZ8ob29qKSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1tr/J1dbHrZiOgnVlYGNcQVFsaHV2bWJjZFpZWltYWVtZV2eNtcC/tq6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHI0M2tgGZdWVdcVUJKcWhtZ3JnYV9YW1dZV1RTYo68wri3u7C1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxcHBwL2OZlZVV1JIRHRrYmBvZ1lbWV1bXlhjjLrFvqWlsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZTHyraFXlZUT0diaICLjFZVXWBhXWKDscG5rrKnq6ioqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAtrXJz6NrVVVRU1+YqaVRVlteXmaVwLemq7O1ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7dm5raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPKun1VVFRMj62eTVRXV2iWu7Sxray4tbKsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8XHw8fCi1hRS4awk0lPVWigwb2/uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxMPFx8mndE16sopHTnitzM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMDGy8OTZH1kS4PJycvQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcDAxJNQSXPJzsTI0MGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4u7/FeUmgzcS/v8m/sMG/ure7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEypdNpcjAv7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7mztbK7xcqfUKTJv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJuYFxUSEtLREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K52hL7Iz8LAuK61tbu9t7mxvsPHmFGizsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRud2NnYlxjUUtVSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3ex0dHMysS1ur/EyL6+tL/Aw41Vls/Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V3qMzMy83KxsLDy87BvLi9uruBXYvMxsTAwL/EwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApnt5fJ/ExsvIwcPAwMnKwb+7urKuemx6x8bFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtr869trnAvKp9bmhubXSCl5l1en+cvr/GwLnAvL7FxL29uLGxoIZ7cbzIw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdYK0vbW1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7utrqKfioOvxcPDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR3i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+sq2wqZeUlcfHw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2hsbCko3q/yMK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FjLW/rq1urL64tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vp6wta6vfqywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/U3lxT0lJTGidf1pFVbC6sayzr66srba2srS1rqmlnZmanJ6nqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGZEU5x+UFhJS2FJV41iZWWDr7WqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp5OQXaZbk9tSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWU0pmo1lmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2N3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrKno6OioJ6lq6Wel5yUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzTx76/wMK+x8bCt8PKycPBxr66tbq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjFwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoWepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NHXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysHHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpCLgHpydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIx8rEzMzMzs/Fx8i2v8rA0s3Mz8bKyL/Ew8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czQztTX1tPV0M/S09HJ09HI0NjX2NHX0dfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUy9DU1dbO0tDY2NfYy8jOxMnPzMrMwMrAyMrOztDL0M7OzM/PyMzQ0MvOysPKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZW5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJz83Ix8vFx8HGyszNz9HH0M/NzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8vOwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxbzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxeenyhkYuSloZ6gIWFf3V4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NbXzcrOxcnFx8G5xb2rrqVfZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrEz83Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhXV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrraSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubWyvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxsre6uruyvL6+vsS/tcHBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGoq6i5qqSnp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJagoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clqq6zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6utpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmZOKnpGNkpOWkJiYk5yho52koaKVoKKlpZujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8issbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmaWvqaCcmZuhnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZujlZugo6GYoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpaman62hlZalqKedmJCPmp6ul5moqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoKUfn50io16kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSKgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqinZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3t5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcX98aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLG6xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnqyhprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQamhvg4F0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilYmOl396goh6eW9na3h+e350bGVdWltdal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYmMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZF9bZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnZuOkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYB9cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK0opSkqoiZiZKJlXp6fYV/aGFoXGViXWRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgIuFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayys5iWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKabtqiMpI6Rkp+GeIKDdlpiZVdmYWFjYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkM7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wcGrmbqok62Pl5eqiX2CfWtXZGJZa2VqZVdcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIr565qaGrjqSotoiBgHNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4J4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTuMC4vbfGwLu5ysq6trm1uLmyt7W0rra2mGR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHtsXmFdWV5hWmNjUVtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaGxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3rIy1p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNvZF1dXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKKOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556b2ZeYl1XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3mEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMc29kYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdvZV5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHi5OboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLycnMy9DJw9LK1NfZ19jX1dvX09nb1dDb2tHWyNTLlXp8amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7ibfFpMHJuIKVm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWJiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8e2hqZmBUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hHt+gZGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/DoLyMnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+cmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXlta2ZXYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXJ5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KfkKOuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aWdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqdopKpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpGykWSkzceVjoaHiY+SjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWRfXl5PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqiZra+kl5WVlJCLmJmWoMCOo8m4q5qipa2ZkZqcsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrSeorillaykl6mtt6ako5+ZqZiqo6+wqZqZnJSVkZegl5m7u63JoGm2uKuwlJieoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYqMlpmSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL06JxfGpeW1VfUlBGRD49Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLi4uQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqJdXRjXVthW05LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZifl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXVlda1NNSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmW96Y1lXXFxMTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbizp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINub1tYVVZPRktTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC4s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLmmq6utsbGjobKytKRycGZdW09RTEVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOxwq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Ktvbm2n6OnqKWnnJysqamNZWdhX1JMTUdHTkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsLIycXCzsjBvbmyr7m0wMLKtsaxwLy0uquprayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLe1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUZITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkREnG9iR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/t8HDwMfEv83Gu765srC4s7/DyLW/r7y2ubemo6urrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpHS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xMO9wLa/wrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6atqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6yq6mioqWllZWdmYuPkZOkn4ljZVtkYExJSktORkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcKzwsS9xsS9xMq9sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6atsKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSUxKU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDEvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZeon5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBNTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3t6qtsryila2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepJyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnn6SbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFZXRFleXk1MUk5fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwMC4xb3BuK+2p6u3sry/vrWprrG3n5erraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2UoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6amo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaStsLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrLC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyeo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZl1GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipKKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhc4hpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWopK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiJGdkJOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5KeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIWTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZCV3ttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpbeysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSJkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQV15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O4r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WcnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiJGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLXFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i1qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpyanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdWlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gkn7arpaW0qaqunp3Bq6ilr7KprLW7nqmqq7GlmJ6pnaekkZimraKYnqSpoZuinJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGYnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlY+OkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7quwLKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqr5yiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqZ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+pt8K4vbytp7awpaukt7Oxs7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGkm6anmKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmsprO0rq6zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqho5qts5SjpaW1vKesp6uqrailoaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums6ysqaevs6mvtrSnp6a0pae4rpyzsraqpaSnsa6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqmpsK6jsLqvo6SusqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpqhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmhpqSPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5WWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q+RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKiknJ2eqpeYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mZeji4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOD1WUVpXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJqcmqielZSYmJKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezt7+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5mSlKKkmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknaWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11hcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmqoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm13b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxubGuuq+uwLGrpKKeo6Kcm5Cpo6qypLSmraWflpmqmaasuZ2jrpiUoJCloJKMnKOel52bkJWSr7mxrJWXo6enk5CWpJykrZ6RoKirn5ufqKOznqOljqeilKGanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueo+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qHjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHRCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqaa1qKefm5ago52spL6moaqXlJyQopuRj6KooZOdmJOXlLK1t62YnaSkooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Byalpem4phY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxmopocox9hZVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuwsqu0o76xsqagoqido5uZmaymr6Sltamlm5eVoZqmram+p6imlZOblaCakpekqaiQnZGPmJywsr+sm6edp6KIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11waE1YWmZqYFdab3lubWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqpq2jo7arn5mWlZ+WramlwZ6ro5WSnJeemJOUop+eoqeTkZmop7LEr5qrnKufkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2hzf3p1g4eCa3RkeWZgaWVjZGZrWWt7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWztZ6VlJ2ZmbCmrr6gq6KQkZ2amZORlaGcl6ichJ6qq6KzyLOfqqSrlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaJ3a2qLmKOemXNsbnqEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZefo52imZmmq5yto6WnqbKtnpWjkKKvpra5pa6jjo6aoZmSkpugmZmllXulraKos8S4pKGnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpumn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxi6KIgp99lZiIncC9gpadnY2dwsF7gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO5w7Swr8CpqJSjr6mwrq2msrSvqaWmprGrn6uYmqKfnJqqp6KdrKKlqKWktKSdopOmrau4s6evopGRmZ2lkpGgoZibn52Hp6ykq63AwLGhqa+pl5GenaGZoqOqo5OgoZ2dra6prKejo6ehpaWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF4lJabX66PXo6ngaKgfKeWm3SrgoCvXmONqnqnh4WgdJeTiLNjgquGoY2Ns2qEr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoeSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6WhnrCsm52Vp66tsaqorKCUkpufpZOPn6WYnaejnq6kq7CowMazqKmxrpaSnZuhl5+pqp+VoJ+cna2vp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnaOOo6OirK+2rqixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52vrJialqinr6yopqmel5Sao6KRlKGtm52mo6+so6y0qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kdm5OqpLWwr6Cpm52WlKajkJqiqKCgpZywpqSosa23yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX1+UqYOjiIegepiVmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZyglZClrJGZnKejoKmmrqGkp6mwtcKys6qtqJOJl52kmqGjrqaYoZWYnKWmq5uwna6opp+spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZGLn36alpaKdp6YiqSYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKO2oqKVl6Kptbmjm6KdopOQobGZnpynpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6KupaaYr6W8raG2t62dnbWyuLGzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5uVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tJ6Wp6SttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46krqOdkJqaqrS0pJ2knKiRlJeuoKCdp6Sdp5y1mqGqpLasw7Cpq6mhjISOnKGgpqKVmpqcmJuZpqSmmKyorqOlm62mvqyUvbCsn6Kws7mrtKaaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6eVmICsiIWuhZ+UqaChl4afgJmVgHuSfquAnZqWi6p4nZ+QiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6mklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+ZmIyIsFt9tFukg2vIomSfgHu8WHa0WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsna+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voNro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy5qJ6tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbW1linhvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1lcZ353pl9hcY6RbmVkgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2fopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTkoqPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmJuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqeKZZylnJGXmJaMkpyRhp2akJWDkoePjpKJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62kkpartrCyp5urpqyXdIydr5+oqqeTl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6WkZ6Eda6PiKaaqJGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6CmmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yxeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqeppZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaOTl56Gn7qyp56bko6FcHWQiZSQipSPj5uLkJKfkpegpJaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2UkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkU0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLGqq6ealKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSblZmYh6O5rqWanIyMfmJtj4uTkI2QjI2YjJGSn4+UoKGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8rK6imZigoqWsrqGdrrWiqJKhoJ+mm5mNmLSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmJmakoimsaeilpqIiYBpboiIi46OiouNkouQkqKMlJ6gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinaOjpq6cm7GtrJOYoZmhpJmalJ6rm4uIkniLhXGAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42LqailnpCXh4V+a3uHfn2PjYOLkJCJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRU83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKwrJ2mnJypn56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iI6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1FbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZSiq6ShqI+fnp2amZWYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfINshIVxgaGMeIWNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRgV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhSWU9TUWFmZWpSY3d5d0lGRWNdZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoKSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhniAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2hJVk1ZU1ZdaGtuVmdXTUtBSU1LSEpPQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSVlPXUhYaWlzallrVlFSRVZcTFhTYVVpa193dHp9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6caiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1JXm5udmBbcVlbYFpndGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xla2NVYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eYN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnJCCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIBYcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaXl1mdH56dG90Y2trant9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOifoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gYt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn6SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dU2hyVWNcXGFsaHV8fHNvcGRraml/fG55gHFqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npeioZiVmJmUmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYWDkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIVydGB/g4+GdYuYgYOPgoaFfoWDlG15dXSSoYqLhZqEhIxzf4l8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnRgY1tdXlFnblRkWl5ia2l2en5xbGxka2pngIBsc4FsbHRveW+FeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enNlam1si4met5qhpJ+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58fYaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4KakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5nd3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4WGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xa314hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKRpKWdjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeH2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaGhl5OWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpWZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHuAhXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc250cm1hWmFeW2xlUmNYYGFpa3Z5hnFjamNtZWh9g2xodWhsb2mAfIF5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5ifmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXlrdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogXx6d26QiHOBhIR9dIGGiXqDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ6KipGGip6LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnJOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIB6d3VvjoV0gYKDe3WCiIV3hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCdh5OddYGqlZOOh6GNlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjJ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h4b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVNaZmdjdW+EgmJda21kYmZrkm5gZmZfZ2uBdXFzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdygnqCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHKLhYmOiJyan5qWlH+TfmiFnIdnhaCHkoSRgolxg5GXj5uOj4yMj414e5KQeo6LjJGWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYN7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2g5+Dk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgYWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mei5uvm6CQgoV3iJV+fYqdh4WgkY+FjJiEko6HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoSihZJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boWIin2Ko4SRiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH5+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNf5qIhHtyd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaKmomOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWHf3CEgYmGmKGCk4yegolhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxkpGNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBiY17j419iIR6dHqCenCGgJaajpOUgYh1g4V1g3+KkpyehpWPn36IYX+Th4SIhImNgICDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpTaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgn1/h3V5iYGSlnyIhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmnyMmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8ioZ9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecl4aTjZyAiGV9koJ/hYOJiXKBfWd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5yaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp5j5ZvenNwbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmRjYZwbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXppeYWDpZGEk42Df29+gnaCeIWamJOKk4+UhYdvepKDfYODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4WIfYWIeohygG1wg4aOg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBen+Bf4J/doGFiZeKcYKNcXuGfHp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2MaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSXjX+Tjo1/bmyFjYx1fY9/hYGViHyDeG52h4SClnduiIRsdXt0ZnmCg6eMg4+Mg31uf3R2gnmFm4+Lj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hheYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcoF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbcnJlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHtyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2Fsc2FocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGl4Z0j4yKd3BshYOHdHmJeIl8k4h6fnJndoh+fZdvcIZ9aHZ5bWV5iISlh4GHjYp+bX12f4B8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOLgYZ3h3WBiXl4cm2IgI+AhHJ+fX2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5dop3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SDdJCMiHJycIR7g3N1hnSId5SIeXlxY3eGeYCSaHKEdWZ3dmNqfIOInoKAf46OfXF+c4R4f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJyiYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFlzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4ePgHqTioB1dHV+d4BvcX5thXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13em2GdX+Qi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp2dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGfn94a4iGc3hqdH+Dg316fHh7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtiV1dWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fin97koV6eXR5dXR6am11Y4R2koJ3cGdefIF5i4llcYFqanFjWGx7hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inuBbm6Jf3B2Z3Z+gH6BdXtxenSGe3lxZXJhboyCbHNYa194XElvbE1XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4Z7fY2AeHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2t6d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnF7a3p7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9oTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fISJjoOBg3t+i4N7d3x3d5mdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5qenBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFVXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfGZ+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEdee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTFl2ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBd3+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19aaYBpa2+AZ2xhaHp5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2B2hIR4j4RziHFweX9xY3FoW252ZHBziHt4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXdmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1VubldKU2hYZl5YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ5/eoiHhGxygnl2gYCCdG6Gb3yAdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juhnt+fXl2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKeoeHgH93cnV+dGFvbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnlaXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj62Me3uGkH5mcYh6dH19dnJvhmx7fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4B5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7hHp0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB4eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBfHNlcYBkXm12aWNmeHpzbW6BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXZcU0tjXVhpU1dIWWBOR2p2WF9hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJc4uGc3F2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmhe3uAiZV5ZHWIeXN5dmtzcH9reXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfH+AfHdvbmxkaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5venp6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqaXJvd3RzdGlwgZSDhn6EdnJqcHttZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0hydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9h22PhnFvd3p8dIKCfYuPg4KWdHiClIWBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF6bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpsh32AfIh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVyemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYh7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RPSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rkohyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3pzeWxtcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl7gHece3psYWVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3Zwa3lpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFi36IeodtcWZve2xxbGJYX2hob3OAdHNeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKh455bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQiZCOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OTkpKRk5KGk5STlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkY6RkZKThXyUk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKSfISSkZJ4f5OTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJKCbY2SiXF/kZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkIRnfZKAdH6Qj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Phmhwj3x0e46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI6BXWl2bWV7jYyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLiGdmbV5pZ3SGhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dndxYHRuYXB0amVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Nmbm1dbHVwZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWZqb3Fxc3RlWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05RX2Nlbm9vbmJPUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTVBfaGdtbmxnYVJNTk9PUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tIRklOWGZtaGxtbGpoY1xXVVFPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQlBaW11kaW9pa2xqaWppa2tjUkhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PUxeZ2xrbmtvbWlpamxlVElDREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tHXW1tbnhxaWpoVkhBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pjs6T2lwenNsY0k9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo6QVd0cVg/Nzw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD47O1dfOjo8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E7Rlg7PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTtJWzo8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXdNNzg4Ojs+PlBgOzs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5CXWpBOz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPkZudk06PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8/V3yBXD9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlHSEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Njg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhEQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj9APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDR0ZJTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PUE5KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQkVERElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0dHRkpHREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0hFQ0hJSUhJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RESkVFSkxMSkxMR0dNSUdJS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5LTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0xKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI8QkFCRkRIR0xIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD1DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMS0lLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MS0hKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJTWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd+dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhlfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdXWFJdWVddVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlFXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRYWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVFNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkI67zsvLzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fYCCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h5eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt8e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e3x8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJwcHFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNyc3RzcXODcW9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3dzc3Jvg5Fvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJxkYRwcnCXj25wcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCIpHVve6SQb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcIGvjG2Hp5JwcXBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJxfa6icI+mlXFxcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGCsqmQobGScHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nyc5uqorOnq5VydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHd9p6CjsJ+coYF7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIiml5usoKOiiHp6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+iKCRkJ6blZiPfn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYGGqKmhmp6ZmJR8gIGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GAgpWwpaahn6KqpYl+fX1+f39+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CCh4+hsqqepqGfoKKoq6CUi4SBgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhouaqa6po5ykoZ+ioaCipKOej4KBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4yZnZmamqGbnaKgnJ2ak4iDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYSLlJaZmoySnZualoyGhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOBgoGEkJiViI6amo6Hh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCi5aNk5eMg4KDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKBgpCThIKDgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgIB/iI9/gYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CKkoCCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgI6Yg4KCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KBlZqGgoKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgIuVko6AgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjYmFjYKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Ag4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgIGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+f35/foSSjY2Mj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHt7en1+f4CEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CMjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj4yKiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yHhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4aEhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fH+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS2ZE7REREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tmUQEhJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tLS0tPZmU1UVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU1NTU1dDLy8rKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDOztLUz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dO5n9DRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM2zl5q6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWvoKKnstGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XoceGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKTapJm11NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp232KKZtdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg0taimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpBQ0ZEQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iydTVopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7fQ1qOZttfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRptqimrTZsaSn1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKbasYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR09HD1NLSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0+QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk2Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIQEU9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDxEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysqKagnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhn5aTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoJ6bk5GQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoZ6ptZOQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqSkpKOioaCdraOWk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6qpo6SioaGdo42Km5mZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoqKsr6GhoJ6cmqdzgp6cmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGhoKGhp6Kkn56cmZqgYXyfm5uanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCgn6eWpZ+dm5qek1l5oJubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZ2kjpuenJqapIZYdKGbnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqZpI+QmpubnKR5X2+inZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbnJuampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZmqOOjZWZm52geGlpnJ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZiljYqPlpudnHhqZZSfnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZiWpY+EiZKdnZR3amSPoJ6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYlp+MgIKKnp6JdGhii5+enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeeinl6eZychGxiXo2gnJubnp2dnZ2hoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaLmZOEd3eYnodtYV2Kl5KRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkJGOjZmbiXKQnJyEe3Rkg42Fh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoKAgZKdiHhah5OWbG57c4GHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3KYlHRkT3WLjGBccXODe318ho6Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIiYR/gn59oIdfS0l0g3xaSmFreoSEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLh5KJj554SUJFdHhtVT5MZHOLi42JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZyin6CUYVNbSnRyY1dGRVNsf5CRjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqa+khFaCjVR0fGxcWW1VX3eWn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epo3RqwL1Qf5OHb197a1Zum6GhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhoZtlh8a9Zamhk5decYNdYJecmaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ+ZX421vpvKpJOpdWivcleNm5ufnqCfnp6go52XmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mtsbKvq6OjpG2ClZWoxp2SoYRGrI1YhqGfnZ6lpKWgpLOllZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqnuMG+uba3s66sra+EfXtsrbugnJqAV4OBZ4OooZeepaKZlrC+oJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt8/e3tjNyby3ubqviXhkaqejmpaKe2hrcnZ6h4uFhYR2b424qaOrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1trvD1+DYzsa9uraumnhqUGOUhIOEenJtaGhua2xsa2ZfWneytKq1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9v8TUz7muqaSelIBkX0pcfG5wd29paGJdX15hYF5aVG63sqq0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFyczGoZGOiHxoV1hJU2tlZm5oYmVgWVtYWlpZVWyzuaKmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbAwq+UdG1kWlZXRU5nYmFqZGBnZllaWVhYVGazvLKmqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTHuoBZU1NXVUBPZmRhaWRgZmlbWFdYU2KpuLO1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxMKyeVFLTk89UWNiZW1mX2RoXllXV2Squ6q4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwr2CT01NQE1nXmdramBiYV5cWWSlwbu6vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXIv3xTTkVHb2BhYWxiXF1eW12bx8LEx8G8vrSxsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcOuf1RNSGpjXF9uXVRaWVuSyLe/v8DAuru9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBw7uGVElZXm15gVBQU1aGyMOvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMTBuotXR05/lZJFS1p+uMu+sMG/ure7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2pmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjru+u8O2uce3tbe6vLq5lm5KeJ2RQFqQtrzBvrnGvMK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXisy73HuLm4rbaztrmztrS0hnybiVagv8C+vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1611gr3Iz8LAuK61tLq9t7ixv7+blYGXzcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGYcXWw0dHMysS1ur/DyL6+tL/Dr3xptczFwr7BvL/DzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhXN0qMzMy83KxsLDy87BvLi8url1WLbIxsTAwL/EwMrKw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApXl3ep7ExsvIwcPAwMnKwb+7urC2dla1xsXFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCl5hzeX6avr/HwLnAvL7FxL29uLKvrm5UqcXGw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVpeYE5TW1xwdHiEo7i3wrqzu7e7vb+6u7utr6xsV5zFw8PDvry/u7u4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVG55iaiwt765srWyvLm8trm+sbSob1+KwcPHw8C9v7mzr7K9uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNopdgU0NZVUhialVPRUplkKOur7a6tbSyrLy5uLW4wbq6nH9serzCx8K/ubq1rqWss7GmsK2onqCgpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTkpAZVlCUHiAk2hMQ16DsbWztbK0r6y7uri2ub/Es5+WgnqovLu4tbKxra2fpKannaSlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIR7WEZCUYhYSUpZeI6CYkFVpLmztLKwsa2wubi2u7e6v62xsqqfoLmuqautq6OooZ2dnpeYoZWSlpeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUaE1AVHlxT0lJS2idf1pFVrG7sayzr66srba2srS1rqminpubnZ6np56gqKmfoaeWm5eXj52Uj5CWjpebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZEU6GEUFhJS2BJWI1hZWWEr7WqsrSuqquvsLKzraWdkZeTj5ignqKgnKOkn52olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhWUmRNSkhHT1JOSk5IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/y55OQXWcb1BuSkxjZnZ1YV1ic5Kyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWUktmo1hnfW9yW1JrY1xnYmFtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxmW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2R3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe/sKyxrq2pqrSxsKirqLK2uLO4rbK0pKCdpZ+soaGioaCamJaWn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VebVtSYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dMW1NaTExRWVJIT05ImayqqaSfn5mSkZOYmJaWlYyIi46VnZydnZ6XnpmnoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wry3vrOztaKsoqmosqmqqKeompmemqqnoJmnoJ+fp6ilpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkNSeKmtqaqln56eoqOdnp2anJuUk5WUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6OdrKi2sa2jsKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OioJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLayqrqyrru3v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURUTURDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6WlpOOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19HXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT1tjO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FhX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1c3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMnAyMrNztDL0M3Oy87PyMvQ0MvOysLJx8nMy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFx8HGyszN0NHH0M/OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4OTg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PTg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGx7/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMW/wcfMzMzPwsvMycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb299udHIycrPy83EusDDu7u7ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nCu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAysPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc3Dxr6+tcG9w7u9xrzDurS8xsTCw7fAtra+v7vMw7y2usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRUdLQUVCRkpAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2srqVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMi5tLu3wcK9t7zGwcO8ta6ytbq/tMW3u7WruL2+wL2xu7awtrqzxby3r7u/tbe0xby+wsXAw8XGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6uMm2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a8x7nCt62qqLCywLa4vbCxqLGztbu8rK61pq62rruysaq5sK27rru4u8DAvrnDv8bDxcG8xsLIy7jFx8W/x8PDusTGwrvGyczLs7nDvbuziXN3dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk9OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0va+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK21tKaorqGkr6mypqiorqaot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZga29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLa8sqylr7OtoaORaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBhXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpujmJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqKyrmaCfnpmdn6WamaObnJ6wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6y6urGinqmrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqehmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSsqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZlX2FWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendzZWFcW11YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEs8K/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVSVFJVYGBfYGFfYWFiZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaqeqKKfrqypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwcGBbV1ZWUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+Njk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbm4iBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboaipq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGgm5SQjJmOjJGMko2WlZCeoqGknZujlZugo6GXoqijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTU4Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqmor66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZalqaedmJCPmp6ul5ioqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQU1FMTFdNSk1PUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qmo7GrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXV1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrehnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucnVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjYKUfn5ziY56kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTlJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7Sppqaoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdpraso6CPlZaSkH13fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWtxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIWMfYmBkY2Ql5qYk4uQiZ2In5iHiJaemqKgl6euqa2oqJ6XrbOipq6ZrKuYqLSiqa2jk39zbl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyEiYiVhJuNgoSSmpafnZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+ip6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2nnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS09PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsK2uq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVNTkhOSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woq2qqLWvrqy0v6u8w7+lopqVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqSorp+ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnGHfId8dIyujomAaGdiam5ybXCDdWlwWHVwjpuSd2x/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhKRklHP0JBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepaefr5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjnp3iX6JiI5zi5eQhHpdZHJ0enx3im1oamJ5b4aQgnpvgXd0hHpwdHl4a25pXXaHfYd8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIl7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYOIf4iEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GGgneHf3t2hX1udnVmgJSOhomIh4iHoKuilomOmH96gol6eW9na3h+en9zbGVeWltdal1hZmBZT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsZeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Kfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoiglYaSiY6PlqS1qZuNlaKDh5ODfoBramt8gIGCdGJeZF9bZ2tdbGteV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKqWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYo6KmtrCdkZmoiJaPjYGJbHNyfH99cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKKlnp6fYV/aGFoXGViXWRjXmZnX1pPRElIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6eaqa+tsrm3uKebtqmMpY6Rk6CGeIKDdlpiZVdmYWFjX2BmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gYx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoZ/homFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe4wbW+r7d0sbOlusWksMa5sbOxtKiktbaqsaCilpqikqWwraatrKekmKCstLqiqbK6tbu+zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy6wsKsmbqolK6Pl5iriX6CfWtXZGJZa2VqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3iHYrmhmaOJlZSWk5STjZCWkoeGe4aBjZWKgYSBinp8i4eGfYqDgYqDlX13eXVlT1xkR0VMO1FjYVteU0Y/O0hQRVtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0tMU1pUXpOvuLW6uMm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqu9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfpJSip7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcPIsJ65qqGrjqSntomBgHNgYmJeWGJgaWZSWGBWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWZmZGOl5KWlo6Gh32Gg4yWi3+Df4J4e4uDh3yLeYGKgpd/c316a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLSkhGSEhIR0JJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJ2tcF6irJyYoKObpJ6qpZSgn5CUjpaYl6ifpZ+empmDpJ2spaqwrbewvbnU0c7X0MnM0szPzsrHwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZgHpsXmFdWV5hWmNjUVxgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmpimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+WkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwqLS01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3D0NK4sMO8xLmltrrDooNwZF1dXllgWFlmWlFdV09QQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMm5uXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdHRxdLWxcDOx8fDqL63z556b2ZeY15XYFNdWlBRVVBOSD5ARkFCRTxAQj9FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NXX1cnU2s3J19fRyqzDw8yMc3BjYWBYVFpUXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5SYio2IiIuJfoJ4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuPi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qbkquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eXdvZV5aU1ZSW1dGR0pJRUU9Ojc6QEFCOkdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWXl4mPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1dvX09nb1s/b2tHWydTLlXp8amlcW1BTVF5IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+EfHyEmI6Hi36GhoB3gnlve3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJGKjZGCjIWJiIGGkJGenJmJhoyBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PT08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36AfoB8hXt+gZGJhYV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKScfYmEfYlyjIp+c6aanJiThXuPkIiEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZaNi5WfnZSglJGOjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSvoIuRi4WLgZKGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gX2Ge3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWip2QlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZueopKpr6CRlZCNjoiVi26Nt4WaxMiym6Glm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ+Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3SBaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg+NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCDfGxvi395fHh4fISHi32Ko7Ooo6uzoZanoKWklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5WWlJCLmJmWoMCOo8m4q5uipq2ZkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyalI+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvc416fYF7eIaLiYWDkqe7raiyva+lrrOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZiqo6+wqpqZnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi5CVjYqMl5iSnZmzlpWqnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL1KJxfGpeW1RfUlBHRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgY3BKQIuKf4Fyhod9gYl1goqDf219fXx/cHeHd46ChnuNj4yGjJqrwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaudnKSYm5iXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkZqWnaeasZqRq52Omo+SjpWQkJaXj5GgkYmVm6OslJaPlJyelKCem5igoZWanqenpKGksLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVthW05LQkxARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5antMbJv8LMwcO5yLy6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm6CqnKKclZ6wtKeLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY+RoYyMlJGPiZefmJOZlJemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6pt7XJw762zrLFvsS8s9HJyMG1dXltXVlda1NNSUNMS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHqNoZaomZqYur7HyMrC0snKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6uutK22taCfrp+mopijtL2pm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllYXVxMTE1KR0RDSEJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY6Xjp6SiYp/iJ+ThHiFf5V+f5CIipGAlaGarqakmMO+yMPIxdPNzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdq7e4qaWvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmZaZlaGkqKaetqupurzEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeplo2Qg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKupp6+wl6OvpKikpbTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFFRO0hLSUZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eZoKKor5mQl4eLp5aOiJKFn4iEnZePnqCao6S1yLSpxrvDw8jKycfMzse+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSrqaaurJmkrqWlqay6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrure+s7Ktvbm2oKOnqKWnnJysqamMZWZhX1JMTUdHTkpWTD1NRE1JSkFDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRayVnKGfu66ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLIyMXCzsjCvbmyr7i0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKuqvbyorbyzt73GvLa1t8Cvvb+zqLS2q76kj6OXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjaShlJyjnqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLWys5+coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HDwMfEvs3Hu765srC4s7/DyLW/r7y2urempKqrrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ejlpOblK6fkKGipaOjn5C+pamdqKydnaGbpp+9opmjnqKpq6Gdl42VnpOfh4+FjZKepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWpraycmaChko6QlqmflGlkWmFdT0pIS09NSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqqyXtrCjqrO2xMK9v7bAwrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqyum5uemaagvqGdpJirq6umoZmNmp+SnomOWH+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpq6yq6mioqWllpWdmYuPkZOkn4ljZVtkYExJSktPRkVBRko/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6qkn6Oframsnbuwqay1ssfDwcKzwsS9xsS8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2qoqWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLmgoaSSrq+spaafkqGelZ6PkY6VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+OoKGTi6assKWnopygnpOSm5SFi5KNnJ6AY2ZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZayq6aipbKsrqm7sq2wtbTGv8TEtcDFvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6yhl5aRpaSiopeYpK64rbG1tqCfqKSZlJWTpKC3oqSllq2xsqWqpqGempqblpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6GZnpaMj5mQgYaWiZSfeWVpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaudua+rpKq0t7Gwubewt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSOqainn6OcmJuTh46Zi36NloWPm2tpbWFtblhRUVpVQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHCv8nEucXDwMC4xL7BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8rrG4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+opJ6UoZibqLWpl5mSkp+ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWWlIGPlYV7j5KDjJdmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa6zuaansbjGt7G3vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvZ6rrrGjqp+wrbOurraxubapra6wp7aws7u8ybKqtbSxtK+upqGzn5qoraCllZWambGjraClr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmay4o5iUkY+YnKGYl5Ssn52UgZOZjZ6dmpaQipSTnpqlo6KgmZaSkpZ7i5CFe4yLg4yTa254bnV8YUZgallJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZegsKixqaylo66utam3tLijrLS3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6ytsbmVl6auq6ejsqmUr7qkrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoayom5ydm5SquZyVjo6LmZ2imJCXpqGfloSSl5CdnJiWloiXkJebqJ2koJKWkZCWdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5GZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3wL2vrLOznKCnsK2lprClnrK1rKuysKypqLS5rLSytayzrKmsqKypua6xsMe+uKW5r6mtraaorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmpqSpLSaj4mNiJKjoJWNlJ2glJOFjpSTnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoqmvpKiks7SxtLWxsaGsrb3Muq7BvMextK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzBsKyyraCkp62pqKSwo6qxqq+rsa6vrauzu6e3sbKpsqmrpaWjrbqsqrHCubSsuqioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6mZo5iZj6CnmIaDjoqLn6CPi4yWnI+PhoiRlaCdlpiVhpaTk5elnJ2cjJGQjYp/f4iFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlOY1xOVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6u9ybyxvrfDr7Gts8TEzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Ourqulp6qwqaeosaW0raqwrq2xr7Oss7ukuLSsrK6nq5+jnrC3q6qturaktrWkqaesrKqtoaimprGypKaloaGrlqmglJqgpp6koqqkrKKeprG3rK2ipKKaqKqtqZyhpaSkmaCZlY+YnZSBgpCIhZ2gjYuOjJmPkIuEjZiknJKRm4yTkpKUo5qbmouOi4t8h4GCg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVlRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqmttau2saukq6qpvMHAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsq6tq6yntqqlra+rua+osLCusau1qra1p7W2q6ykqaqco52zs6iopLS0oLauoamoq6isp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6SmpqmcoqSjn5mZn5GOj5mOfoeNh4WenoiFiouPjpCNhIaVo5qOjZuRkpGPkp+XmZaNioN/dIeBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUV1RHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJi8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Gxr7iuoravycfI0cC/vbq8w766w8HAv6+ys7K1vbzBsrKzq7OppbWopK2zs7mvo621sa+xuaq4rqqutquqnqqrn6Ogtq2poZ+vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKiin6yhoZKhoqOmmJqoppeXmJ2PioeViH2NhoWEpJeFgoKMh4+OkYSFlKGXiJGdkJORjZGdlZePioWGeHSBf311eXqAe3R0e2qCh6N1aV5lbIJ1Z4iLfFJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE86V0I0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNDCvcC+ub6/vMm8wrmwsLWyury5wLO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlqSbpKWfpJqaqKqlnpqpoZuRmqClnZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd8enVwcX5phnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RltAKo+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1uLSqnbq7qLK/srqgr7S2qayerbCinKWoqaOenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppefm6GjnJ+bmqOpopqZo6OVlpOfoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTVxebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk9M1FcPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfKx7+3wr6wtL63xLbDsq+6srPAtbu+uKm5uL6rpLWnqKqwrbmwqZm5vKOuv7S0oa64taemp7CzoJ+kpqehpZmfraipnqCqr6egppejqaCwuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhqb3BxcGp/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXFx8C3v8K6sbW9t7+7v6+svrC0v7K9w7mpu7u4p6i1qKersKyzsKaZvLakq7u1rp+xuLCppaevspuhpKCjpKGWnLCmoZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImLj4Z6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZW1sbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5XV5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5ZG04NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGioLiqrqC6uKasvcWzsK+jtbCtra+0w8O8s7+6uLGzubi6uLqvrsCztLmwv8G4rL27taais6qnqbKrrbGhmsC1pKe1taiesrypqKapr6yZo6eco6aUmKGypZmfo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2UkqOopJCJio+GeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhoamdncIZnaGlkZmlqYGpiamdbZXtjYFNzVFxbU0xKR0lPU0AhKmhdakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWdPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8C/vLHBtrGusra2uLe2raq9tK+ysb2/uK68vLGln7arpaW0qaqun53Bq6ilsLKprLW7nqmqq7GlmJ6qnaakkZmnraKYnqSpoZuinZegnae2pa+qr6GhnZ2hlKCmn6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqLiHmFd4KCgpyIi4KJfH+EiIaFkYSWlY+OkJGRkYyTe4OVjYVzfX1meG9ramxndXNrY2dkZHaAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0hLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1m6OfkIusoZiYoJaltLGhsb23obHGvLqxsaS3rKuuqbm8u7qtv7Gvrq62r7O4s6isurGvrrS2uravub6tpp61q6CgsKSrr52iwKCxo66wrreutZ6tr6ytopqdp6mlnpWbqKWfmaSiqZ2aoJuUnJ6sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY98gnOBgYuYhYd8iYmEhYqMipOEk5ySkpCQkZaOkH+AjI2DcIB+ZnltaGtqZ3Fya1xoZGNzgWFmaGpubGdramhtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJKhmo2OsJ2ak6GaqbKvn7i/tqC0wru9ubGmtrCorqW3uLe3rLquraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqa2ap76YraOur7W1rayfsa2vqaKcnKOrqJuVnKejnZqpoqSWmqCckZykq6qpu5+npKCYmZmdoY9roZaZnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQf2eGgGh1aWZXXGhzbk5QamRncoRnX2Rmbm1qXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NlmBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky6MpJmGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukt7Oxs7C4raqnrLSmsLWjqLi2tainrLezrrSts6Kqn7SrnqGknKanmKu6laalr7K3ra6kqa6rrKWhn5ygp6ebl6GlpZubp6edk5+fmJCeqKqjta+jo6OclpeXl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIhHJ4jY6FiKF2iY1pl4hmfXJ4oXCIh4R+jXx/oaCgmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprO0rq6ztquppbGtpbW0nK62trSlp6mzsa2yqK+fq6GyqaCjo5qho5qts5SjpKW2vKesp6uqrKiloaCYoKajmZmmo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoGmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm6CdrquUnaGftLqjqqmira6lop2amqGnn5ebqKCfmJ6np5Gcp5uUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaGeHlkV1nGB+Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZWDrKelnqOlqrK4rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrSzoqucoq2toJ6al6CiqJ2ZnqSfnJqhp6SPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4Gme4KGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKq7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2sopqZpKi0r6Kpj6moqpuelZigpaean5yin5ugo6WjlZuemJqdoqqbpZmcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuhk5ixqKils6qltaikvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqitsKmjno+soqiWnpecoaWhmKKhoaGaoqKnm56hnpWZm6agnKeVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpkZlhBT2tfbGhPVUdJOT1WUltYWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrytprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2iqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq7CmopaTrZ+lkpShm6Smn5SapaahmqOfrZqgnp2QlpuhnZyllZ2WmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfY6ehpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa16vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaVNZUTtCREFMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyurezuL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyvpqCVmamfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52hmJmclpaioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rrammtLC3sLW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjVFpRPj5tbzNCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doZuYnJ+Qk5SrtbCnmZScrKqXjJOlmaWtopGWqrGjoJ6nq7CYoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbKspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKMnKOel52akJWSr7mxrJWXo6enlJGWpJ2krZ2QoKirn5ufqaOznqOljqeilaKanJeVo5iPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4uGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbZ0cnB3toxegHp9imiDeW55Y4uscHWFf1lbp2pFZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6noaqXlJ2QopuRj6KooZOdl5OXlLK1t62YnaOkoouSkaacpqublqikpZyaoaimp6OpoZGtnpeknpeXl52ej7ColJynoo5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx7gnNJSm+GcE51TUVXXWZgTFtYZ2NfT1ttdWlxUlBERU48SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+qKmmlZSclaCakpekqaiQnZGPl5ywsr+sm6edp6KJk5Gpm6mkm5uroKOZmqOnrKOfq6KasJuVp6CWlZ2fnZexpJihqJmckZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11wZ01ZWWZqYFdacHpubGZTT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC5As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAqLShnaSlnKOVlqCqpqyjo7ern5mWlp+XraqmwZ+spJWSnJeemJOUop+eoqaTkZmop7LEr5qrnKqfj5aWqZ6rnJygrJihm5yipK+noqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgamVjZGZrWWt7cGlqXFNMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6grKKQkZ6amZORlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKmvqqajq6Ktm5+goZmknpyena+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaN4a2qLmKOemHNsbnqEjYd6WGVehYJebIuKgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmSkpugmZmllXulrKKotMS4pKGnrp+elZ6jnqOco6qokp6hnaCqsKqro6qgqZumn6ihrJahm6WwpJecq5WhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KIgp99lZiJnsC9gpadnY2dwsF7gnuSjZrDwH1qpbFvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCroKuYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq63AwLCgqa+pl5KfnaKZoaOqo5OgoZ2dra6prKajo6ehpaaeramSpJuprambnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeTiLNjgquGoI6Ns2qErnR9l4e4YYOtWaPNbpB1e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Cj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOT42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+cna2vp6upnKeopKKrkq20l6aiqqmdo6alobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVgb2lpbmZjV1NdYVlSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJialqinr6yop6mel5Sao6KRlKGtm52mo6+so6u0qrrNsq2mrqyWlJydopmfrqydlqCZnZ+psqmqqpusq6SjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGVh65ffKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVMTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKekkJqiqKCgpZyxpqOnsay2yLK1qqyqlZGdnKKZoKWznZqglJyfp6yrpK6araqjoquis66iqrOxoZqpqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4qaxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZmpzcWaBal9hWWRtXF5ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKys6qtqJOJl52kmqGjr6aXoZSYnKWmq5uwnq6opp+so7etobK5r52brqeys7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ+ErH2alGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppujp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa2pramRh5Ccp5yipJyllp2YmZqmpKmar6KupaaYr6W8raG3t62enbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmVkJptcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4anlzboB0XWRkbm1mZ2BKW1lYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKiRlJeuoKCepqOcp5y0mqGqo7arw7Cpq6mhjISOnKGgpqKVmpqbmJuZpqSmmKyorqOlm62nvqyUvbCsn6Kwsrmrs6eaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZSSgHmvXaOBfKanZJ2AfJd0a69dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2N+dW2AemBnZXFuaGdoQ1phWz1LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKefp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamkn4uAjpuan6aekpWampSamqakpJqprKykpaCqqL+ll8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsVt9tFukg2vIomWfgHu7WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmPnX5kc35ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+poo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Oqsqm9r6Wonp2OfYublaCgmZCSmpuRmpipoKGZqK6npqajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwrJeMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5uXknuHmZGmm5OPkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYF6anFpZ4mWlZhxaWmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2Tj6KYmJmSl599h4+VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBojLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epquhn6OjoJGLpJKnmaiZlqOpoJacpqaor7qsrJqbk5J7hJaNpZiNkZKYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkY6VhYGkmZeVjYuTkoqPhoR9Z4p/dIJ2dIeMcadte5SRlJKBgY6QkI+dlKGWmZeig4iVjXJpkHdwi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqyloJmnnp6TlaOWqJqomZSmoaOQm6iZobW7qKuZmpCNfIGUi6GUipWSlZCQlJelkJ+aqqCctqOeqKy3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSJmYd6cpZzeop/cnx/am9kXnBqYVtfWW5jUGBlUFo6R0dFPjI9PjcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj5+5tqWmmZyNiXmCk4uak4qVkpSQjZKXoo2enqmen7ikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJaMkpyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmIipSSi1p2lZFoaI+OcnqmmplleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk5OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qilKehno6XkZ6Fda6PiKaaqJGXpImcurSooJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgpGXloSamWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH+TioODmWuOjYVseHtxcWdkeG9qbGpbZWtqZnRcX0lUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1haWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1npCEnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gn7qyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKmJGLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6KbhJqBjY6FiplxjpOFaHd0fHdoaHVxZ2hrXmRwbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6OvgKGnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYh6O5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onWAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWjqJKhoKCmm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipipmJmakoimsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwc5SIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42MqailnpCWh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeaXal+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU83VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9iYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZyJkKmjoJqMkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVXQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6SiqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfIRshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Fm3B5epdrm3t4l3NuqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYklXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yIkZKkloOOqpqUkouFiXmDd4iAboKfh3eAk4aImaKXe5SipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjICMpI2Wg66hlHa1tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXioBvTGajknCbh3Kke3l0YYOCa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUtBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMhox0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqiQgaKskYaQioKKfoCAjnNoj6WEfYaUjYmYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpyffKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlcYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx7b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZimjn+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpZyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aZpI58p6GLhpCQhZaDho6Yd3KFqYaOkp2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J1gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqeiiHiOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4eTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoB7coKAeH99f4V7bYKMhnx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npeioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYaDjpudkoern4NyipCGk5GMnZF9jXqqhI2SmJaPnJeHhpumn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ6MiZOanoKOl36GjoNvd4VxdWF+go+GdYuYgIOPgoaFfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiIqMfG9rfoF8bmhsbWdeen9ofXt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pogIBsc4FsbHRveW+FeW2HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlam1ti4met5qhpJ+SkZaXi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gZCamJKMmqOho5qXkZt+jYV4gIOOh6B/fYyNkHyYpKChk5mQj6aNkIGbkYmTl5t9kpJ+h46BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfHxxeXuLhHp6kYyDlqWTi4aQfIaGh4V2goSJiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrZGxoZoCBa25+aG9xa354hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmtveYmNnrKRpKWdjpCYj4adoZudfHaloY6YgIyiioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loGVmJaNlqCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6OeoZOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCioZ2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWl9g2xodWhsb2mAfYF5bZCGcYCDg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qp2KmXqXnYuMmJB5e4GLfXyDe4CDgXh0eXpzfYCEf4mLgGRefYuVh3+Fh3V9fop/fZiEl5SXjKShmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5OSlYaZiHyKiYF6cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dniAfYaAfIONhIyUpI95hIJ0iYd9gHR2gYmEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2pmamNpd4huZmxoamxogX17d2+QiHOBg4R9dIGGiXqDfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2Z2Z25sYXlpa317eHBheG2LgJmZqqCjqJ6Ki5KGip6LlZh9d66ZjZd9n5SRlpSId357inx7gHZ3f4BwdHR7b4V9gYCKfnxhXH6QkoaAhIRzeoCGeo+SiJKRnJOlnJWCfoF9jouSpImOio2Ymo2GkZiTlo+KiIySnJOQjI1ug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CVmpSikpKJi5qMgn+Rnn2Sj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiYSMlaiMe4h8fouFeH5xcIGGhGNoeXR1cHxiXnBga3RecGp7eXhsc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GObmRpZ2RpaIF6d3VvjoV0gYKDe3WDiYV3hXx4hIV6gIp3f4t7e3J4g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlZOOh6GNlpOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1l+ko2IgICAdnWAgICghpCLkp2YoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYmLkJGJnJahnJiVhZeIaYSjgmaFnYqRfouDi4F3k5iRnpGQiYmVjn9+kJh8kY2PjZqSfIqAgm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2yBhIJecnNycXB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk25gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIaMf3t2in9qcWN8Y4Z8b3FtdGpob2x2eF9xf3l7dHV0gIJ+pJWarZ6mloWMhH+XlIOQn3WLoJSThoubjJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzgnqCoIKSgpOTmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHOLhYmOiJyan5qWlICTf2iFnIdnhaCHkoORg4lxg5GXj5uOj4yMkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx6iX2CjJCenYV8fHeCjH13cWpsgoN6YHhvbWxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHSKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4ZnJqg2CIfm9va3tgam50f3VfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHdzgHBvhXRwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN2g5+Ck3eUkZmckJl7lHOFkJ+hk5OQipOblIZ+lpaIjY2IkYyInH+OgHd6jH6Ii4qcnJ2blZN6jXZniZKHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqTkYp6hXx+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenpoc2pzio6JgYWFfZWLa35/boCLfouHfIR6go+VmpqKfHZ4g5B5c21ncYCEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY193YGBWa19ed1BOS2FnY116cYl0XFxldmBhZWWPZGBlYlhpc3Nua3F2jH10eYaBdXZ+i3OAhn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WmxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76FzbHWEdoSihZJvlpCVoJWcgZJxhoujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZnNqf4mOiYKCgIyWhWuBdm6IkIKPhH6Ben+QlZOZkHRzeIiNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmBiV25aXHhOTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRxgVdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXeKmoiNaZiQj52Wk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uQi4WPgn92eIOEcoeCk5uWlJiGjHWHf3CEgomHmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6OgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qBfn+SkH1tgmx4ho+GkoN8gH2AkZOQlohvcXqMhnVscWxyeYFgdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hiaVhtVlx1TUtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm9pc3iKfnNzgX56dnqIc4WDfYCHdneKho6YgYyBe5N2bHd1eXiTdG54e31ZeoZxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCneG9xd3xxkpCMh2qZjomckoyGe2mIi5qHgZKRhoeYjXyNjYGBiY17j41+iYV6dHuCenCGgJaZjpOUgol1g4Z2g3+Kk5yfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEfoOHfm9fcnCFe46MgXx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm96jH51bm9rbHt+Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanR3hn9xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xc5e8xYR2cZSJkH5yl4yGnZOMiHRriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4ODcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+HjI99aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCDgn9qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHmDfIGYjI+MfW5se4l9d3RvaWh9d2VdcWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aWBlcntaYHJ8eWdwemFlZY6xsndKYlqk2tCXcnuRi5B4fpWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4uHfGV9foN2Y3BzgGh4cG90mIyFgop7dnh/g3mBalxwfXKAh4WIfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXJgWXdaWXFuTlhyc2dgSmx2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaXhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3duiIRrdXt0ZnmCg6eMg4+MhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBygG9bbH50eImCinuGf3yIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhxWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZlX3RwW1lVb2RZZXB5WmheX2dtZ2psaXB4fY5saYKEf3lugHt9gX+CenWCgYyThXCAi253foB7e4iTiX9oe35qdHtyhntzd31/jHl4hH58a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvX2Fsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmKeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iIWlh4GHjYp+bn51f4B8i5mHgpOQmIiLhIl8j4lxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnOLgYZ3h3WBiXp4cm6JgI+AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQWFkW2B2YVx0bVhYU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx9cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g39+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ/c4R4f5GQgniWjZSPh4KIe4mJbHh5fnVoemlrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJyiYOCfIJwhol3eHBwg4KMfn15fnx1joWCdWlxaWyIgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxkcV5dd2hVV1Z3XlxlbmhWa15hamdlb29pcHd7k25piIx5fnN7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR5gHZvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thXSUhnh1bGB6gnmIjmZxg29ndW5bbX2BkJOAgXmSk314e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdIOGfn94a4iGc3lrdH+Dg316fXh7couAfHJndGVti4NtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG5mZmtxaHB2eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R2koJ3cGdefYJ5i4llcYFranFjWGx7hpyJg4Jzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW99Z2hyYm54cWpscXh9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXN/inuBbm6Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwc3eGeG6VinR/enh+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dXl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl1cm9oeWFqbWBtdmpna2x6d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0fIt6gWZ0hn1tcWh1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZtZHFmcnB0gHdwmoR2f354f3yFh311c4KIf5WCbnN4enpzc4WHiYiEeIB9do9/fYSJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdXBkZWNXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3BiaGtnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNp3yEfHaWkHN8c3t5bXt6kIR2l3yHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXd0Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExOcEdee2ZhTVV0Y0pOU1dgand9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVXNXTVh1ZFpfa2BcWmNlX3dmbWJwaXNvcn50dJmBd3+AeH9+hoR6fXaChH6YhW5ydHt6dHGFhY+CgHqLdXSRf32BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1taU2JuZVtYYXR7amhtaF9iV19baYBqa2+AZ2xhaHl5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3j4RnZVhid2l+hnpvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW252ZHBziHt4YXKAcGdqeHNxa3d2dHdjg3t+d3ZwZGNjbnx9a2tVamNnU0tsaFBHUmxFYXhlYU1Tcl1KTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUtceV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXqAf4eGenl6g36Bk4RxdHR+end0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1paWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Juhnt+fXl2cm16aGl3Zl1kcmd6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnX211ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwcmJxcYR7dWRygGxhbHpvamh5d3RyZoV1enp1cWRhZG5zfmpsVGlfXlRMc2NRR1diR2J2ZWBLVHBYSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYmRegGlqX290eW1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWHBtW19XW1xse2Nwd3ZsYlttc3RndXZxbYV5f4B5d25vdGVpdGVbZ3RmdnaRel9dUmZmaoKBdH1hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp0iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3fGtubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2Rabm9hcHGBfHNlcYBkXm52aWNmeXp0bW6BdXN9c3FiXmZub31laVRpWVlUTnhfUkpaWUhidGNgSVRtVElMWlZpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2t2gZB4bYN+gIGSiISBdnWJdIyGc3F2doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpaV2hjbWVcXHKJZlJybVtaWFhgbHZkaXVqal5abXNxbHR0dGuGfH6AfHdvbmxkaXFjW2tyZHR2j3NbV1RkYHJ/fnKCXGFjXVNaYFxkk59lcnGFhJF0bGp5bG9vent7cYB2f3J6enpkZXVnXmJbYWhcXndoV2Jdb2hhd2FbfHZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXXGptYnBygHpzZW9+W2BwcWJeaXB8bGx0fnJxeGtwYFxlbG17YWdUZ1VXUlB2W1NQWlJIY3NiYEdWa1FJUFpVa2trfGVtb3FgW1pYWWxwV1JQZldXaFNURlpcT0hydVhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gYCBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1NdW1VnYmxsW1xxjGROb21cVlhVZ2l0aGJ0ZWVdWm51bnB1dXpsh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWY2N3fHxwhVxjX2NUW2BaY5aVY25wg4WKc2poem5lcnZze2t5dHVven51X2ZyY1teV2JkWWF1ZlVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxc4B2c2JsdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF5mVGVVVlBVblhRV1RQSGVyX2FGV2pPSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2lRWWZUU0haW1BOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaXZ2f35tg4B+h5d7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Md3hue41gZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX19UZ2Bsb1xebo5oTWlsYFVWU29mc2tleGRlXVlwdG1ye3hzbYh7gHece3psYWVsbV5gbmplcHl+Z1pWWGBreHt7b4NeYl5nVllgWGSciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiZFhlcWNUXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3OAdHNeaW1TZXBlVWJuYXlicHV7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWnV1XV9mbWhYYmFbXo5xY2dqd3Fzbmh2c3mDc4KDe4iNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOQipCNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIiIiJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IjYmQiYuQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MiY+GjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4yJjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjoyNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6ent7fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9fHx9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3x9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOkI+NioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5SSk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKSkZKSg5CTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKSi4qSko16kZKSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZKId5GShHePkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4tuipF6dYyQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+PimiAj3Z1iY+Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2JaXeMdXWGjY2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4BobYFxc4GFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1aGBnYGRpbmdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGZfa2xgamhpZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXGN0bWVxcGVdWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SaHBsYXB1a1RQUVRQUE5OT01LTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRmbG5jb3NyV05OTk9QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJTWFoa3Fxb25ZTE5SVlBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQUtPR0hOYWhmcG9raGNeY2hXSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+QFReWV1obWlubWxqamxsVkZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8RVlmaWtvam1tamprbFdCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PE5pbm9rbWxpaWxVQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo4N0lpb21wbmtrVzw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PEpncndzbFw/PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV0dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/PkdbeXJUQDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj0+QD1nXDk8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdnZNNzg4Ojw/P1NVOTs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89Pj9CVVs6Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPz5aYz47PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXVMQUNFQD8/UHJ2TD9DRUlKSUlNTUtFREZHSEZHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WHiIh/WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVXSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEhHSEZGRkhKSUlJSUhdb29xcnR2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA9PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhYaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk6P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM1Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njo5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozs4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4B/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNCQUJDQj9AREhEQ0VERUVCRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcXR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQEFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT05MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozs9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT05MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LSkpKTU1MT1BOSElLTE9RUVBRT09KSEpKTUpMRkdIR0ZHSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NUkxQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0hHR0hGPkBCPT89PUI/Q0NGVk5GTk9QVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1ZrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JWVlhVVFZUT09NSkxLSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpUU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnt4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hDREhHSEtHREJBREFPUU1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJsTUc+Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVUV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1ST2FXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3R2eHd5ent9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVVRTU9OTElISktJSEZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNWVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fX19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI9WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XV1ZZWVZRUVFPQD47PT9BQkFDQEJFREFAR0hHSEZGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRWVFdXVUxMS0k9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHB0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT01JSklHQ0NDREhKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFua2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETkZBQ0tLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRkpKTEZISUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmZrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD86Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSElGRURFSUpIS0lHSFBLRElNTFBNT05PT05LSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhERUdDQkBCRD1CQT5APTo6PT87Pj5AQj5BQkRHS0ZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS1BTTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj49Oj46QEI+Pz9DRUZERkRESEZERUNERUVHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSVNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2lpaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklJR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNIRUNFRUZHR0dJRkhLSENJSEdJSEZESEtJR0tITUxKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWlxaWVxeXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkI/QEI/PURFRkRDQ0JFRURGQkVGSENESkVFSkxNS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBBQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTUlMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0RJS0xIRkRHS0xIREdIUEtMT0tMV0xJRkVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtMSktLSUdFSURDRERCR0pEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0lIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tNTEpKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0xLTk5VTk9LS0xHR0tQVFNOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUlZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0hneGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f3Bob1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlJSS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVWVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVlROUU5NTlFUUFVRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFdYVVNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWVFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hSVVVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV9iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UU1hTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUVdWV1ZXVlRWVFhdXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWJjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWlpXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVlkZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkI67zsvLzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fICDgoKCgoKAfH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z4e3h5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enp5eXl5enp8e3x8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3t7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8ent4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3l7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4OEhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRfdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB3fHt7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnV9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycnFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeG9wcHJycnJxcXBwcXFxcnJzc3NzcXFycG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNycnJxhXNvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXJyentxcXiWcW9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnB+lnFvg5xyb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcHake26Qn3ZvcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFwdqqIb5mhem9xcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnB2q5VxnaJ9cHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdHqronueon1ydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh4lLKlpKunfnt7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fX+mpqKypKiLent7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX1+hqico6uanpt+f39/fHx9gIOCgIB/fX19fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGNo5OgrZ+hn4R/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIqejJSunJabh31+fX5/f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+Dg4B+iKWimZ+blpyUg4WJjYV/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhIuQlpikrqaim52gp6mhoaCSgX+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChJSpsLCknaKdnp+hoqOfkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgpSfn52ZoZ2doJ+dnZOHh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgo2UlZefnZ6hnpuViIeJiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhISEhIiTlp2Xmp6ckoSDhYWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgouVl4uRnJaEgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4CAf4eSio+ShYGDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBfoKJjIKCgoKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgIqOgIKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhISDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCPjIOBf359fH2MnI2AgoGCgoOAj5OBgoKCgoODgYGBgoOFg4ODg4ODhISCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgYKZmYSBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODhY2NhYKCg4OCg4ODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYWFgoB+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGhIB+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhoaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQjIeGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomKiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFg4SEhYSEhoSEhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICBgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn5+f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4CBfn19f4CBgH9+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gIB/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGChISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBf4KCf4GAgX+Af3+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KEg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHiIiGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eX2BgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpaAfX5/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+DhHx8gYKEgoB/h4N9g4F/goKBg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoGCgICBgYB/i5SQjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WFhoeEhYCGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg4CBgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjYyMj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1/gICEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYaGhoeFgYSRj42KiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeHi4uLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoJ/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99fYB+fH9/iYN/foOQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo6KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCCgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/fn+Af31/f39/f4B+f3+Afnx9fHx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGChIODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+fn9/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXl4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgICAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYGBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foCAgYGAgICAgYKBgIB+gIJ/foGCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoCAf32AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx6d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoOFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICDg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBf4GAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8foB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WChoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeGg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KDhIOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoGEhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3t7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhIGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fXyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXW19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTVybu9vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDP0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF08iUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slMmarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaanl4icnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XosDJmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKbWlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp27s5/Dm9qto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg082Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNXN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jIj6eaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWUjKelqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKihko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPS1LnH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhn5eSk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJeanZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGgmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWkpKOioaGenJuVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6OkpKSioaGem5qZmJmZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5uam5ucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoZ+fn56cmZminZubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6Cfn6CgoKCem5mcsZ6am5ybm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZydpKKfnJqZo6yenJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqbm6mjm5qanKOLnp2dnZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZm5qmopqZm56XdJ6cnZ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZqZo56ZmZuhjmSbnZ2fnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mZmZiYmKGal5qco4JcmKCdnp6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJiilZSbnKN4WpCinZ2enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXopGOnZuhcVuFpZ6enJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaMkp2OiJmVnG9idp6WlZKRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2QkI+LkY+LjI+QkJGOioiWjX6Lio50aGmLiIyFh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJh4SBhoKAgomVkIl6in+FdmpkgoCHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N8jYyEeouEhXNqYIaKeX18ho2Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiGhIiIioR/gn96e4aHfneHgIJvZ1uCi4KEhYqPi42RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjYuLh5KKh4aWiHZsgYV+aGNYf46Oio2JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqGanZyioZWPoYtzbH6YiGVgWYGRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqamnoqWoqayqqa+gnaaRfHuLnZpyYl+Hl5SXn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurquqrKShoqWpp6eoqKmcjXh7lo6WeHBtk52XnqGhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mopKemmZ2kpqKhoKSminpmYY2DhWNwc4udlp+amaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraemnJ2mnHpmVk5+e3lOX2p4mpucmZufnqCfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqusbOuq6KhrJJrUUpJd3RvRVFha5CjnZ2fnZ6koqKhoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Ciqqqnr7e2tbW2s66rr6uCXEhDR3JpZkNGWGZ+n5qcm5aip6WnqZ+jm56hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyuL29vLu6v7SusbyecVBXTURvYV9IRE9gb5WWk5qWo6uotq2io6SrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1trzByMC7vca6ubi8jWFZjnJDbGBfTlJXWmaRn5aipKinoLqmqqu1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9w9TWx8DCvLu6uohWe8KqTm5uZ1FbZF1ciKyop6yii5S1pqu0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMLV4NrKtby8wMCSUIvAv2F9gnldSmlwU3qzuKicgm+WsKOmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PCy9vZyrPBvMDGpVWCoqJwnI+FfEV3jlVrq7CUemNxq7Smqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTNz8O9uLi+xa9jdHtri7eSiJlXe49da5CFcmFajbe1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExcvCq6mtsreecHFtXKS4kIidaGdyaGhqZV5XaKS6tbOsqaKhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XLy6+XmZydjnZwY2CqqoyLlHBgZGdhXVxYVYu7vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx87Dm4aIg3lnX01goZmHjItzZWBeWFdYVWe0ycC8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIyrR+cWpdUVBCXIyCf4J9b2ZbWFRVVVSJwsDAurq9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8LBkl5STUhLQVV2aW5zb2hnXVhUVlNgqcC4ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xq9uSUZESEBNZFlgZ2ZiaGRZU1JbjL+/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpmZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8LXjbq+usO1uce3nGBBQEU7SlxTWGFhYGdoXFJTfrTFvMG/vMS3tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHWqy73HuLm3rbePUEBBOExYU1NdX15laF1TYaHByMPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncWtzZmJtYFxUSUtKREpDQ0c+OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE16xygL3Iz8LAt621rX1PPzhNVVJTXmBbYWJeVYy4vcfLx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKWbnKu0tHMysS1ur+ugkw8TFdPVF9gWVpbVm+3vcDDzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhHBypszMy83KxsLCyb51R0deUFJaYlZRUlyiwr/FwMrJwsPDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7ua3bwr62vsC+vrqmnKqzt8TApXZ0d53ExsvIwcPAv8nLpmxLXVJQVmZOSlmPxMDAwb/Kx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCmJdwd3yYvr/GwLi/vL3Ew7yodGZYVmNwTVuQwMS8vb+/w8K+vse8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVleYE5TW1xvcnaCoLi3wrqzure6vL66vbGNbmZ0hG+Zv8TCvbu+urq4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVGx1h6awt765srWxu7i7tbnAr592eZqtvcPFw8C8v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNoZdfU0NZVUhialVORElkjqGsr7a6tbOxq7u4uLS4wbu7gnWbt7zBxsK+ubm1raWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve292cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9tTUpAZVlCUHiBk2dMQl2CsLWztbK0r6y7ubi2ub/Ct411hK61uru4tbKxrayfpKannaOlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIV7V0VCUYhYSUpYeI2BYUBWpLmztLOwsa2wubi2u7e6vrGsqqSurbiuqaqsq6OooZ2dnZeXoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUZ0w/VHlxTklJS2idflhFWLO7sayzr66srba2srS1rqiinZubm5ynp56fqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZFU6GEUFdJS19JWItgZWaEr7WqsrSuqquvsLKzraWckJaSjpefnqGgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUmRNSkhHT1JOSk5IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMa/y55OQXWcbk9tSk1jZnZ0YF1ic5Gyr66ztaqmrKuim5mUjZCVlpiXm5+hoZudpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotWUktmo1hmfW9yW1FrY1xnYmBskbSwsLispqGcnZqUl5qZj42QlZGLjY2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOLeFRqcXd2b2R3dlhXYmBkaVtbVmetrqyvp5+eoqCWkJOboJuYl5GSn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbVpRYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35ugnBgY1dMW1JaTExRWVJIT01HmqyqqaSfn5mSkZOYmJaVlYyIio6VnZydnZ6WnpqmoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpuIYVdeZWBXTVFGPT9AQ0Q/PkJRd6mtqaqln56eoqOdnp2anJuUk5SUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6Odq6e2sq2isKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLWyqrqyrru3v7u6q7itq6q4urW8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWlmXFRJREA/SoeepJiDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURBRlF3sq+nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjqmVDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzMrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFxsHGyszN0NHG0M7OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBwaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsm9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCtru7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nBu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAycPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXt3cnRmaVphbm1aXFhSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7u9xrvDurO8xcTCw7e/tba+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRUdLQUVCRkpAOTo2NDc4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2rraVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK9t7zGwcO8ta6ytbq/tMS3u7WruL2+wL2xurawtrqzxby2rru/tbe0xby+wsXAw8XGx8vFwMXGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7PCurDAsb68vLa8x7nCt62qqLCywLa4vbCxqLGztbu8q661pq62r7uysKq5sK27rru4u8DAvrnDv8bDxcG8xsLIyrjFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTc1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0vK+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqWot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/w8DAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpuimJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmaCfnpmdn6WamaOcm56wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKivs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV6dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZkXmFWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbCurLSeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendyZWFcWl1YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaqeqKKeraypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbnIiBcoiDe3RpaWpsZ2prbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboampq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMko2WlZCeoqCjnZujlZugo6GXoaijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaedmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xqpF+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio5ydl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoKKWlJiYlaKmmY2ZpKaopqGgtLKnsrehnKK2rKmtpLKyprW8taursaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20t8Cvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmJ+jnpCTmJaFjYKUfn5ziY56kIeTkJCcm5qakZaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTVJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraehppKdpraso6CPlZaSj354fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWMfYmBkY2Pl5qYk4uQiZ2In5iHiJaemqGgl6euqa2oqJ6XrbOipq2ZrKuYqLSiqa2jk350bl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyDiYiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNzdX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXuVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAcmhhXV1KV1BSSEtYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS05PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fX57dm90dIWCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVMTkhNSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo62qqLWvrqy0v6u8w7+lopmVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98c318cXBudW2Cfnd5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSEhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorp6ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnGGfId8dIytjomAZ2diam5ybXCDdWlwWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhJRkpHPkJBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjXp3iH6JiI5zipePg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl4a25pXXaHfId8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GFgneHf3t2hX1udnVmgJSOhomIh4iHoauilomOmH96gol6eW9na3h+en5zbGVeWltdal1hZl9ZT0tOV1JRSVBKRE5HQ0pEQkFEREE7Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoigloaSiY6PlqS1qZuNlaKDh5ODfX9ramt8gIGCc2JeZF9bZ2tcbGxeV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYpKKmtbCdkZmoiJaPjYGIbHNyfH99cWhfXWFfYWdkYGdmW1FFSktQT0lJTEZGTENITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG58YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2jnpCjoauvrLK1opSkqoiZiZKKlXl6fYV/aGFoXGViXWRjXmdmX1pPRElIU05GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6iaqa+tsrm3uKebtqmMpY6Rk5+GeIKDdVpiZFZmYWFjX2BmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe3wbW+r7d0sbOlusWjsMa5sbOxtKiktbaqsaCilpqikqWwraatq6ekmKCstLuiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKawqq29sL27wsKsmbqolK6Pl5iriX2CfWtXY2JZamVqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZWKgYSBinp8ioeGfIqDgYqDlX13eXVlT1xkR0VMOlFjYVteU0Y/O0hQRFtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wLy3tbu7tr20urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfo5Sip7G0p7KzvbbBvtPJydPGwsXMwsrDwL69v7u8t7SvuLe2w7rGvcPIsJ65qaGrjqSntomAf3JgYmJeWGFfaWdSWGBWUVVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLS0hGSEhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqDpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrGwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZf3psXmFcWV1hWmNjUVxgU1BLQ0JFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmlimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+VkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwp7O01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3C0NK4sMO8xLmltrrDooJvZF1dXllgWFllWlFdV09PQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZeMm5uXi42VkZqOfYmLhI6KiouQh3uEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtteHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5uRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdLRxdLWxcDOx8fCqL63z556b2ZeYl5XX1NdWk9QVFBOSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqCLjJmTk4yLk4+WhHmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ2Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NTX1cnU2s3J19fRyqzDw8uMc29jYF9YVFlTXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5OZio2IiIuJfoN4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDxBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGubbGzdLQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eHdvZV1aUlZRWldGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoKJhoWJgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1NvX09nb1s/b2tHWydTLlXp7aWhcWlBTVF1IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEmI6Hi36GhoB3gnlue3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJCKjZGCjIWJiIGGkJGenJmJhYuBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hXt+gZGJhIV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKOcfYmEfYlyjIp+c6aanJiThXuOkIiEaEdwoKSdjIuQkoWJipGSlY+cmpKUkZaNi5WfnZSglJGNjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Ozw2Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZudlJKAi4h/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuPj41bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaSnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGe3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZudopKpr5+RlJCNjoiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ6Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMC+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rPg3OAaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5SWlJCLmJmWoMCOo8m4q5qipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe9tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+krbOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZepo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi4+VjYqMl5iSnZqzlpWrnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzt6vCyMS1ur27xcjHwtGhxsnNzcTW1tDL1KJxfGleW1RfUlBGRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKf4Fzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYmpeXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIiPl42LlZeUkZqWnaeasZqRq52OmY+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVpgW05LQktAREY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm5+qm6GblZ6vs6eLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefmJOZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6ot7XJw762zrLFvsS8s9HJyMG1dXltXVlcalNNSUNMS0pKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHmNoZaompqYur7HyMrC0sjKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6yttK22taCfrp6mopijs7ypm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnZ+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllXXVtMS01KR0RDSUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY2Xjp6SiYp/iJ+ThHeFf5V+f5CIipB/laGarqajmMK9yMPIxdPMzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdqre3qaSvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmJaZlaGkqKaetqupurvEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzg1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEallJyWoZeplo2Qg4elkoiBh4KchIOVkJCUjpqin6++rqHGvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFBRO0dLSEZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eYoKKor5mQl4eLp5aOiJKFn4iEnZeOnqCao6S1yLSpxrrDw8jKyMfMzsa+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSqqaaurJmkrqWlqKy6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrura+s7Ktvbm2oKOnqKWnnJysqamMZGZhX1JLTEdHTkpWTD1NRE1JS0FDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRauVnKGfu66ZlJ6Mk6qbkZKTiaqNh6KejKStlKOjtsa9tMG6wcLHyMXCzsjBvbmyr7m0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKqqvbynrLyzt73GvLa1t8Cvvb+zqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjKShlJyinqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLSysp6coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJabmo+qlpanppWtrJmiq7bEwru+t8HCwMfEvs3Hu725srC4s7/DyLW/r7y2urempKurrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdl42VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbkqWkmpissbayqqWpraycmKChko6QlqmflGlkWmFdT0pHS09MSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqauXtrCjqrK1xMK9v7bAwrvIwr7KyLa4tbSxs7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqWllpWcmYuPkZOkn4liZVtkYExJSkpPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6ukoKOframsnbuwqKy1scjDwcKzwsS9xsO8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLigoaSSrq+spaafkqGelZ6PkI2VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+On6GTi6assKWmopygnpOSmpSFi5KNnJ6AYmZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZWyq6eipbKsrqm7sqywtbTGv8TEtcDEvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlJWTo6C3oqSllq2xsqWqpqGempqalpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6CZnpaMj5mQgYaWiZSfeWRpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaqdua+ro6q0t7Gwubevtri3xL3Dx728w8HHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFtblhRUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaefnKGpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCwMC4xL3BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+oo52UoZibqLWpl5mSkp6ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWXlICPlIV7j5KDjJZmbHJocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa+zuaamsLfFt7G2vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubapra6wp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmau4o5eTkY+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqlo6KgmZaSk5Z7i5CFe4yLg4uSa254bnV8YUZgallJSFlaPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6utsbmVl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoKyom5ydm5SquJuUjo6LmJyimJCXpqGfloSSlpCdnJiWloiXkJebqJ2koJKWkZGXdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3v72vq7OznKCnsK2lprClnrK1rauysKypqLS5rLSytayzrKmsqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmZqSpLSZj4mNh5GioJWNlJ2glJOFj5SSnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoamvpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpaWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnZirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6iZo5iYj6CnmIaDjoqLnqGPi4yWnI+PhoeQlZ+dlpiVhpaTk5eknJ2ci5GPjop/f4eFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzuEfEY/V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Gts8TDzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Otraulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq5+jnrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp2koqqkrKKeprG3rKyipKKaqKqtqZyhpaSjmKCZlY+YnZOBgpCIhZygjYuOjJmPkIuEjZijm5KRm4yTkpKUopmbmouNi4t8hoGBg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SiqrCXqqmttau2saukq6qpvMDAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsa6tq6yntqqlra+rua+osbGusau1qra1p7S2q6ykqaqco52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqSjn5mYn5GOj5mNfoeMh4SenoiFiouPjpCNhIaVopqOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC/vbu8w766w8HAv6+ys7K1vbzCsrKzq7OppbWppa2zs7mvo662sa+xuaq4rqqutqyqnqqrn6Ogtq2ooZ6vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoaCop56nm5mqsKiin6yhoZKhoqOmmJqopZeXmJ2PioeViHyNhoWEpJeFgoKMh4+OkYSFlKCXiJGdkJORjZGclZePioWGeHSBf311eHqAenR0emmCh6N1aV5lbIJ1Z4iLfVJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE86VkI0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHDvcC+ub6/vMm8wrmwsLWyury5wbO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd9enVxcX1ohnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsJmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur63rbm2v62is6aqq6+1uLSqnru7qLK/srqgr7S2qauerbCinKWoqaKenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOpopqZo6OVlpOeoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enFwcHN4aYF0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTV1ebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk8MlBbPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wr6wtL63xLbDsq+6srPAtru+uKm5uL6rpLWnqKqwrbmwqZq6vKSuv7S0oa63taemp7CyoJ+kpqegpZmfraionqCqr6egppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhpb3Bxb2p/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBaWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8K6sbW9t7+7v6+svbC0v7K9w7qpu7u4p6i2qKersKyzsKaavLekq7u1rp+wuK+ppaavsZuhpKCjo6GWm7CmoZ6ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImKj4V6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZWxsbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5Xl5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhELjwyYlYsMpWioZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6uLGzubi6uLqvrsCztLiwv8G4rL26taais6qnqbKrrbGhm8C2pKe1taiesrypqKaor6yZo6eco6aUmKKypZmeo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2TkqOopJCIio6FeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhpamdmb4ZnaGlkZmlqYGliamdbZXtjYFNzVFxbU0tKR0lPU0AhKmleakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWZPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBt7Gusre2uLe2raq9s6+ysb2/uK68vLGln7arpaWzqaqun57Bq6ilsLKprLW7nqmqq7Gll56qnaakkZmnraKYnqSpoZyinZegnae2pq+qr6GhnZ2hlKCln6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqKiHmFd4KCgZyIi4KJfH+EiIaFkYSWlY+Oj5GRkYySe4OVjYVzfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0FmSCU1m6OfkIusoZiYoJals7Ghsb23obHGvLqxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrrS2urawub6tpp61q6CgsKSrrp2jwaCxo66wrreutZ6tr6ytopmcp6mknpWbqKWfmaSiqJ2aoJuUnJ2ssKa5qK6ioZqanZido5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY97gnOBgYqYhYd8iYmEhYqMipOEk5ySko+QkZaOkICAjI2DcIB+ZnhtaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWSBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKhmo2OsJ2ak6GZqbKvn7i/tqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqaybqL+YraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+npKCYmZmdoI9roZaYnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQgGeGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKanmay7laalr7K3ra6lqa2rrKWhn5ygp6abl6GlpZubp6edk56fmJCep6qjta+jo6OclpeYl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIg3J4jI6FiKF2iY1pl4hmfXJ4oW+Ih4R+jXx/oaCgmYB7h550iI52m4psh4GCbWhlY3pscWFUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprK1rq+ztquppbGtpbWznK21trSlp6mzsa2yqK+fq6GyqaCjopqhopuutJWjpKW2vKatp6uqrKiloaCYoKajmZmmoqSYnKSplpSjnJSTpKWmobejo6CkmJSTmJOciK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2lk4CmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm5+drqyUnaGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5qUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKUY21tp21bhKBFaGeHlkV1nGB9Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZSCrKelnqOlqrK3rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZeam62llpuhnrSzoauboq2toJ6ZlqChqJyYnqSfnJmhp6SPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKm6tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2soZqZo6i0rqKpj6moqpuelZegpKeanpyin5ugo6WjlpuemJmdoqqbpZqcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QaWhkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltaiku7fBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqetsKijn4+soqiWnpeboaWhmKKhoaGaoqKnm56hnpWZm6agm6eVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnuFf6Rvm6qma4aEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRTUWpjZlhBT2tfbGhPVUdJOT1WUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2hqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq6+mopaTrJ+lkpSgm6Smn5SapaahmqOfrZqhn56QlpuhnZyllZ2VmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZiK6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyuri0uL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyupqGVmqmfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52gmJmclpeioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFpMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC3sbW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adl5unpp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09iUmtlYmxaY11gcHtjVFpRPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZSbrKmXjJOlmKSsopGWqrGjoJ6nq7GZoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbGrpKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKNnKOel52akJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5yfqaOznqOljqeilaKanJeVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9iWiDeW15Y4uscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL2moaqXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoamnp6OpoZGtnpeknpeXl52ej7ColJunoY5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE50TUVXXWZgTFtYZmNfT1ttdWlxUk9ERU08SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+p6mmlZSclaCak5elqaiQnZGPl5ywsr+sm6edp6KJk5Gpmqijm5uroKOam6OnraOfq6KasJuVp6CWlZ2fnZexpJihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkZOYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZHd9d2twem1gY11wZ01ZWWZpYFdacHpubGZTT0ZTOU9aTVJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwZ6rpJWSnJeemJOUop+eoqeTkZmop7LDr5qrnKqfj5aWqZ2qnJygrJihm52ipbCnoqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWOm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6j4p8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4eCa3RkeWZgamVjZGZrWWt7cGlqXFJMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrb6grKKQkZ6amZSRlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKqvqqajq6Ktm5+goZmknpyena+jmJ+ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaJ3a2qLmKOemHNsbnqEjYd6WGVehYJebIqJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY11STlhKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOco6qokp6hnqCqsaqro6qgqZumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp99lZiJnsC9gpadnY2dwsF7gnuSjJrDwH1qpbFvjIBvynp/m3eSg46BdnqBf3lxen+HcXiFjZN5bXaTY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq62/wLGgqa+pl5KfnaKZoaOqo5OgoZ6era+prKajo6ehpaaeramSpJupramcnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoI6Ns2qErnR9loe4YYOtWaPNbo91e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+dna6wqKupnKenpKKrkq20l6aiqqmdo6elobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJealqinr6yop6mel5Wao6KRlKGtm52mo6+so6u0qrrNsa2mrquWlJydopifrqydlqCZnp+qs6mqqpurqqSjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKajkJqiqKCgpZyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqglJ2fp6yspK6arKqjoquis66iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZWpzcWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKxs6qtqJOJl5ykmqGjr6aYoZWZnKWmq5uwnq2op56so7etobK5r52br6ezs7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppqjp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa6pramRh5Ccp5yipJyll56ZmpqmpKmar6KupaaYr6W8raG3t62dnbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4aXlzboB0XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKmRlJetoKCepqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpqKVmpqcmZuZp6WmmKyorqOlm66nvqyUvbCsn6Kws7mrtKeaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2J+dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrbilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKafp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamjn4uAjpuan6aekpWampSamqalpJqprKyjpKCqqL+kl8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmOnX5kc35ihHh0gHxhamdxbWZlZU9VZFxBVF8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+ooo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuRmpipoKGZqK6npaajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwq5eMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5qXknuHmZGmm5KOkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2VkgI2Tj6KYmJmSl599h46VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epqqhn6OjoJGLpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkI6VhYGkmpeVjYuSkoqPhoR9Z4p/dIJ2dIeLcKdte5SRk5KBgY6QkI+dlKGWmZeig4iUjXJpkHdwi3h3fHpqbGRkb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqykoJmnnp6TlaOWqJqomZSmoaOQm6iZobW6p6uYmpCNfIGUi6CUipSRlZCQlJelkJ+aqqCctqOdp6y3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSImId6cpZzeop/cnx/am9kXnBqYFtfWW5jUGBlUFs6R0dFPjI9PTcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj565tqSlmJuNiXmCk4uak4mVkpSQjZKXoo2enqmenrikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJWLkZyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmHipSSi1p1lZBoaI+OcnqmmZlleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk1OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUEo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56NrJqilKehno6XkZ6Eda6PiKaaqJGXpIiburSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgZGXloSZmWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH6Si4ODmWuOjYVseHtxcWdkeG5qbGpbZWtqZnRcX0hUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1hbWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1no+Dnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6Kbg5qAjI6FiplwjpOFaHd0fHdoaHVxZ2hrXmRvbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYhqK5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onaAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWWfbFtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWiqJKhoJ+mm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipiomJmakYelsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwcpOIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnJizlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRopObmoyKqKilno+Wh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU43VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJyIj6ijoJmLkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoGdbXJ9lG+Zc2qkXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVWQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgIiYlJ+ahI6pnJqUiouKfINshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Emm94epdrm3t3l3NtqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYUhXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6OiW9/hpCTkmyXk3yIkZGjlYOOqpqUkouFiXmDdoiAboKfh3eAk4aImaKWepOipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Wg66hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpGWioBvTGajknCbh3Kke3l0YYOBa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhxUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WnVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqeQgKGskIWQioKKfYCAjnNoj6WEfYaUjYiYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpygfKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlbYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hFtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpJyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqYaOkpyQiJ6eh4ybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J2gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGg36ThIOGioF6gIOLm5+Pgqehh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoF7coKAeH99f4V7bYKMhXx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npaioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXhoODkH+AhoSGfIaDjZudkoeqn4NyipCGk5GLnZF9jXqqhI2SmJaPnJeHh5umn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiJOanoKOl36GjYJvd4VxdWF+go+GdYuYgYOPgoaEfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiImMfG9rfoF8bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pngIBsc4BrbHRveW+EeW2GgHaCgH2EdnGCjYd+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlaW1ti4met5qho5+SkZaXi5qfn557eJ6mkZuKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2Bl4iBiI58fYWEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gJCamJKMmqOho5qXkZt+jYR4gIOOh6B/fYyNj3yYpKChk5mQkKeNkIGbkYmSl5t9kpJ+ho2BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfH1weHuLhHp6kYyDlqWTi4aQfIaGh4V2goSIiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrY2xoZX+Ba219aG9xa314hnpri4FzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmpueYmNnrKSpaWcjpCYj4adoZudfHakoI6Xf42iioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlaCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCiYV2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWh9g2xodGhsb2mAfIF5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamJjdVaDaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDe4CDgXh0eHpzfYCEf4mLgGRefYuVh36Fh3R9fol/fZeEl5OWjKOhmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF5cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dXiAfYaAfIOMhIyUpI95hIJ0iYd9gHR2gYiEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2plamNod4huZmxoamxogXx7d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2V2Z25sYXloa317eHBhd22LgJmZqqCjqJ2Ki5KGip6LlZh9d66YjJd9npSRlpSId357inx7gHZ3f4BwdHN7b4V9gYCKf3xhXH6PkYZ/hIRzeoCGeo+Rh5KRm5KlnJWCfoF9jouSpImOio2Ymo2GkZiTlo6KiIySnJOQjIxug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiISMlaiMe4h8fouFeH5xcICFg2NoeXR1cHxiXnBga3RecGp7eXhrc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GNb2RpZ2RpaIB6d3RujoV0gYKDe3WCiYV3hXx4hIV6gIl3f4t7e3J5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlJKOh6CNlpOQgHR7doV3eH9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYiKkJGJnJahnJiVhZeIaoSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJh7kY2PjZqSfIp/gm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2uBg4FecnNycXB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk21gZmZfZ2uBdXFycIuAdX+DgHh1gIuAeIV/d4eGd4OFe4aMf3t2ioBqcWN8Y4Z8b3FtdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOQn3WLn5SThouajJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHKKhYmOiJyan5qWlICTfmiFnIdnhaCHkoORg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx7iX2CjJCenYV8fHeCjH13cWpsgYJ5YHhvbWxydFZeb2JyYF9sbnlwZ3BmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4Z3Jqg2CIfm9va3pgam50f3RfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN1g6CCk3eVkZmbkJl7lHOFkJ+hk5SQipOblIZ+lpaIjY2IkY2InH+OgHd6jH6Ii4qcnJ2alZN6jXZniZGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenloc2pzi4+JgYWFfZWLa35+boCLfouHfYR6gY+VmpqKfHZ4g5B5c21mcICDbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY194YGBWa19edlBOS2BnY116cYl0XFxldmBhZWWPZGBlYVhpc3NtanF2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WWxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76Fza3WDdYSihZJvlpCVoJWcgZFxhoujl4mOlouQnZaDgJWQhYmPgJKKiZZ+h3p1f4l4hoSNnJuYmI6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlZOZkHRzeIeNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHhNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtzd4t9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRwgFdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXaKmoiNaZiPj52Vk4GJcYWJoI2Ei5aKjJiUfI2TiIOJj3uRi4WPgn92eIODcoeCk5uWlJiGjHWHf3CEgomGmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQlohvcXqMhnVscWxyeIFfdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hjaVhtVlx1TEtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm5pdHeKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHd1eXiTdG54en1YeYVxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNtb2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY57kI1+iYV6dHuCenCGgJaZjpOUgYh1g4Z2g3+KkpyfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyOkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SIfm9fcnCFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm95jH51bm9rbHp9Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xcpa8xIR2cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4OCcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi498aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCEg39qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGYjI+MfW5te4l9d3RvaGh9dmRccWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aF9lcntaYHJ8eWdwemFlZY6xsndKYlqk2dCXcXuRi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qHfGV9foN2Y3BzgGh4cG90mIyFgop7dniAhHmBalxwfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXFgWXdaWXFuTlhyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcHd/h25sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaHhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3duiIRsdXt0ZnmCg6eMg4+LhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4KKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBzgG9bbH50eIqCi3uGgHyIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZmX3RwW1lUb2RZZXB5WmheX2dtZ2psaW93fY5saYKEfnlugHt8gH+CenWCgYyThXCAi253foB7e4iTiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iISlh4GHjYl+bn51f4B8i5mHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnSLgYZ3h3WCiXp4cm6JgI6AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQGFkW2B2YVx0bVhXU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g35+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ+c4R4f5GQgniWjZSPh4KIeomJbHh5f3Voe2lrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJzioSCfYNwhop3eHBwg4KMfn15fnx1joWCdWlxaWyHgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxjcV5dd2hVV1V3XVtlbmhWa15hamdlb29pcHZ7k25piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIjmZxg29ndW5bbX2AkJOAgXmSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdISHf4B5a4iGc3lrdH+Dg316fXh7couAfHJndGVtioNtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R1kYJ3cGdefYJ5i4llcYFranFjWGx7hpyIgoJzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWpscXd9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXOAi3yBbm+Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwcneGeG6VinR/end+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYqDZnF9aGprWlZveIqkgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl0cm9oemFqbWBtdmpna2t5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0e4t7gmZ1h31tcWd1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxZZWNedGZtZHFmcm90gHdwmoV2f353f3yFh311c4KIf5SCbnN4enpzc4WHiYiEeIB9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3FhZ2tnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt6kIR2mHyHhoKGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcneKe35idYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExPcEdee2ZhTVV0Y0pOU1dganZ9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVHNXTFh1ZFpfa2BcWmNlX3dmbWJwaXNucX50dJmBd3+Ad39+hoR6fXWChH6XhW5ydHt6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIWEbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1paU2JuZVtYYXR7amhtaV9iV19aaYBqa2+AZ2xhaHl5a3R0dG6FgXp/fXZ1bnpoanlqX2VuaYF3j4RnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW253ZHBziHx5YnOAcGdqeHNya3d2dHdjg3t+d3ZwZGNjbnx9a2xWamNnU0tsaFBHUmxFYXhmYU1TcV1JTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlIF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1pZWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Fthnt+fXl2cmx6aGl3Zl1kc2h6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwc2JxcoV8dGRygGxhbHpvamh5d3RxZoV1enp1cGRhZG5zfmpsVWpeXlRMc2NRR1diR2J2ZmFLVG9XSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUhXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXh6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrX11dc4VoWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYV5f4B5d25vdGVpdGVbZ3VmdnaRel9dUmZmaoKBc31hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2RabnBhcHGCfHNmcoBkXm52aWNmeXp0bW6BdXN8c3FiXmZub31lalRpWVlUTnhfUkpaWUhidGNhSVRtU0lMWlZpbHJ7Ymxsc2JhWVpbYXZcU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpZV2hjbWVcXHGJZVNybltaWFhgbHZkaXVqal5abXNxbHRzdGqGfH6AfHdvbmxkaXFjW2pyZHR2j3NbVlNkYHF/fnGBXGFjXVNaYFxjkp9lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZXVnXmJaYWdcXndoV2Jdb2hhd2Fbe3ZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXW2ptYnBzgXpzZm9+W2BwcWJeaXB8bGtzfnJxeGtwYFxlbG17YWhUZ1VXUlB2W1NQWlJIY3NiYEdValBIT1pVa2trfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LaWNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1JdW1VnYmxsW1xxjGRPb25dVlhVZ2l0aGJ0ZWVdWm51bnB1dXprh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxdIF2c2JtdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF9nVGVVVlBVblhRV1RQSGVyX2FGV2lOSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2hRWWZUU0haWlBOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaHZ2f35tg4B+hpd7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Ld3hueoxgZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX15UZ2Bsb1xebo5oTmltYFRWU29mc2tleGRlXVlwdG1yenhzbYh7gHece3prYWVsbV5gb2plcHl+Z1pWWGBrd3t7b4NeYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3SBc3JeaW1TZXBlVWJuYXlicHZ7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWXV1XV9mbWhYYmFbXo5xY2dqd3FzbWh2dHmDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMC8sgKSgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwcHBh+qaSkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQio+Mjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4qGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEiYeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpKTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpOTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZGQkZGSjZCSkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+Pj4+Ij5B9jJCQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+OjnuNjHaKj46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIyOc4eKc4WOjI2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4NugoJwf4iFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1cWZtanFzb2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdsZ2lmcm5oZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxlZl5ybF1eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QU2FiWWtkVFFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BZaGhiaWJRT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQ0ZKTWNya2dwalVOTUxNT09PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkA/QEJQbHNtaXNxX09LS1JMSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz49QklCPE9pcG1kcnRmRUpeVEZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7OztBWVE+RWZtaWBwcWlSYWZFRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTpHW1NTY2pqbnFtamhtVD5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODpNY2NpbGpyb21rbGNAPUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT5dbW9wbXFubGtsTzs+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT8+Q0tmcnFvcG5qa108Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg8OUtrcm9wbmtnRzs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXZNNzg5OEpscnJwbVM7PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l7d1Y8Pj89PUpmd21SPT0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BBPkV0Vjs8PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVNQUNFQEBBTnZqSEBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcEJERURDWHWGiIl+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhEQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktHRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozw9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXRzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBREFPUE1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1FRVU9MUlNUV1hUVFhSTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01LSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHBzd3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETUdBREtLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLRElNTFBNT05PT05LSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTUhERUdDQkBCRD1CQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSFNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0NCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0tPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0hJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkM/QEI/PURFRkRDREJFRUVGQkVGSENESkVFSkxNS0xMR0dNSkdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWx2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXW1tcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtLSktLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MS0hKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdISktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tNTEpKR0RKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0tLTk5VTk9LS0xHRktQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f29nb1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWFFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltZWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hRVFVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVtcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV5iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UUlhTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWFlZWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUVdWV1ZXVlNWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWlpeXV5eYVxbW1pcYGFeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW15gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fXx8fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2QRigqKioqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkJQ7FhoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJwcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXFycnFxcXBwcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwdXJwcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXF6cW+Ldm9wcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcY1zc5h4cHFxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnFwl3t2oH9wcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Sfgnukh3F0dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHd3d3d4f6eMiKaQd3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t7fH1+qZKGpZV6e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fHx/fIKrnIqilX19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgICAgIKAmq+op6eVf39/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIWspqWvpp+Cf35/fn5+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn5/gX9+j6mZoqqbo49/gH5/gH+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBg4OCgYGfoZOfpJifmICAhI6Cf4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGDi4uFgZidip2qm52ahIibkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GFlZuMkp2Tna6Zk56fn5qIh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKNpaqsqaOdpZmdpKKdkIeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOTpqihnJ+am56fnpaEhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoSRl5aYnZmcnpyajICAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4ONkpaal5ugnZOEg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mXiISChYaQlpmXnJ+biIGEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhIqTmZWanJCCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGCg4eSjZGOg4GBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgIGCgISJiIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODgoSDgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fn1/g4SDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Ag4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/f4CBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYOCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWCiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GAfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjoyIh4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoGAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkoyMjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjI2OjY2HhIaGhYSEhIOCg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5/foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1+gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIuNi4mHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiYuHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fX9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6PjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhYWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhICAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXW19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVybu9vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slcObvLiZtLOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaafqI6AjcWdmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ajKOJrNa6mKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5m4urrZulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqClpJyWp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg1aS0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNfK2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nDj6Gfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTk6irop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqrjY+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1sC/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyBc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWmpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo57amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJibm5ycoZ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJSZmZiVm6aWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4SMlouMipGci46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomQjpaCjH6OkoyIhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9ho2Zm5CEjHuNio+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHqJlZGQgoVphoWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNm5aLkYh/X4aFiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqCZnZuioZWQm6yRk5uYe1mGj4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hmqCsio6hn3ZZg5mNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKKmpIWGp6N0W3OgmZ2Yn6GiqaegoqKurKuqp62vqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhpZyCgqGicmNmmZ+elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6WSgH6dnXFoX42ioZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGuinx+pZ5valyEpKWinp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66ruYN3fbKmbGlYfqWio5qcnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLh6cnGwr2dmVIGlnp+WlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSud25lrLdrYFKNraWlnZekpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb62qX51aaK2dWBWnLWurqqqp6ynp6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+t6aJfn2Vo4Rtaqq8rK+vtKmqpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DybCWiHuGjJGJeYChuLCfmrCurKStsLSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTEubTAt7S7xcudgnhmdoSGfGx8hqa2qpmit7CmsLu1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysfEw8TCxL64vcq9iW5hU2J9fmlVZ3CNs6qdprSzrLLAtbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMfKzsrJx8jHv8bLpHleTkhUd3VeRFlieae3wL6+uay5wbq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfBzNXXzcvKzsXJvIprUEU/TnBoWD1OXGyVxMzGxrCZusS7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIxsnV29XNycnFyad2WkxXRUpoXVY9SVZje7zQxrCQibnCu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDy9nTyMPCwcaiaUxilWpIYVZYQU1VXmmv1r2TdoW8uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrRwb3P07y0vL29rmxGgL6PSmBXWkRUX1tfosaje2iTw7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2lmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8LWi7q/wtm5oaWvtLh3SYOrjkxoZWNCVXNgV5GfgmxlqMa/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHOpy77czZqPlqKwgU1xfnBXf3hxTlaBZVV4dmtjbsHGxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2Ktwf7zI1N6yhIWPmX1VY2ZWcpmCfm5VdGNaY2JhXIXSx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vcfKysPHydKUbHGt0dDb1JJ2fH90XmJdTpWlg4SJVF1dXFlZWGGq0snHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvG08O6vrzEvre8wL/J0MfIysrAgm5vo8vLz+C4c2prZ2BgV1WooYCDkl5YWVZRVVJ5xsvJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uarbw762vsC+vreimKavs8LAo3RydJnEx8rW14ZXVVFPUEVbn5F5g4lnWlRPTk9WnMnLxsLAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xrVsq828tbnAvKd6bGduanJ/lZZtdHeVvb/GwdWoVUJAPkI5Wol9cX9/aVtTTExOdrfAwcK+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfX1pTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM6xdoCyvLW2waGFaVpfX0xSW1ttbnJ9nbi3wri9u3NENTU5NFJyampzcGRfV0xLXKDAurm3tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLKpoR3iqGvtJhoY2ZVWWBKSk1QVGpzhKOvt765s7aeaDcwNTNGXVVeZGJgYl1PTHa0v7iyrrK8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeIe3aNoZReU0JZVEhibFdQRklji5+qr7a6tbSyrZRQMzExQVBGUVdYWGBgUFyYubq0raWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWdYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI5rTkpAaFhCT3eDlmxMQld+sLSztbK0r66td0wwMD9FO0VWV1FYXVF8sLKxrKyepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWNiYR5VkZBUohXSkpWdoyAYT9Vp7iztLKwsa2wuaR7QC0+WnuXp6KSc1Valausq6OnoJ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmVaE1AVnpuT0lJTGaaf1dFVa+7sayzr66srbW3oGZnk6mnn5qbnqB/d52ep6mfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqmvWRFVaKDUFlJS2FKWIljZmaBrLWqsrSuqqqusK2rsKecj5aRjZaeoKCfmqOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMbAyppOQnedbk9vS05iZnVyYF9mdI2wr66ztaqmq6qinJiSjI+UlZaXmp6ioZucpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxohXUktmol5pfnJ2WVJrY11pZmVqi7SwsLispqCbnZmUl5mYjo2QlJCKjY2TmKKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqONeVVscnV1bWJ1clhZYF9kaV1gWGKsrqyvp5+doZ+WkJObn5qYlpGSnpuho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35vgW5gZFdNW1JYS0tRV1FJUk9Dl6yqqaSfnpiSkpOYl5WUlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5yIYVdfZmBWTU9FPD4/Q0M+PUJRd6itqaqln52doqOdn52Zm5uTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BeZV9QRUU6REBGPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCjoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6q7itq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpYFVORD5KXH1wYkE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIREA/TIqhqZqDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPx8q/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiU0tJREI/RFaz0r2ysKacnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURAR1F5sq6nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RViCqqifmJWXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw9ODc4NTU7PkA9OTw8ODs+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF6SkhDPViMoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1NLV1crAysLFzMLIycPMw8XIysrPys3M0M7TzMbIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PDtaqYpaGZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFBCO0M+OzY3Ojg6OjU3PT1BPDo8PDk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son66VeG9zdYKSmY2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaXH08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrGyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fWiDhKWrk42Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb3B9udHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxfen6kkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvDurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzszBxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraVfZXWGk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7WruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCZW2lxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx7+5uLWwq62nnqKpp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCxqLKztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupaSnp5qgpKGanKWsrqSooquqrauwo6afqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr+/xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbYiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpZ6boaWUnqWbmJGho6qjo6ClpqemraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvcC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RIRUtGPD0/PTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqJ+VlZqhlpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8K7ur2XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaeck5SUm5ibopeWkZyioqienJ2lp6KlnKChm5mvrq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKenKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sLu2ur3AuLOxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5SXl6CXmZWXoJ6hnZagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqqs6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFiZWqAk5OJkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqqyejHJxb2BbV1ZWUkdRT0haW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGHj5COmpOVkpybo5yboaipq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcoKGgm5SQjJmOjJCMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761s6uvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uPiZKNl5GXmaKgm6CsqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefoqy1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOX+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Sio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WIjIaQipeJlJOYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqupLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI6KlJGUnqGPm5yjoqSYpZeinJWNh5majHSNg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTVJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso6CPlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKPgpeGjZ2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuxopqYhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKRfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkRERElOT2hZTlFTVFVaboNzdn5qaVxVj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuViYiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ6dmIynpJOhoJaen6SAcmhhXF1KV1BSR0pYUk9KTE1SSkpKTFBJTFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyGdG90a3FsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV+cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhtfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnaimXl+hoGFmYWbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMyME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1JRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPRElIU09GSExGSkdFRkhBS0VDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKawqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWU0lHRkxRR0NHSUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaKIlZOWk5STjZCWkoeHe4aBjZaKgISBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauon5WWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7SvuLe2w7rFvcPIsJ65qqKrjqWotomBf3JfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3psXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuJfIGEc3uKg4Z7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLizu721scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydHHzM3C0NK4sMO8xLmltrrEooJvY1xcXlhhWFllWlFdV09PQkJIRUJJO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhI6KiouQh3yEgnB/h4GGe4dyg5GLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKyzp7C2qqy8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56b2ZdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoZ+gqKWqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29jYF9YVFpTXFBKR0lKSkA7OjtFQkQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJOZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZvZV1ZUlZRWlZGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeHF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnqLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbY19jX1dvX09nb1tDb2tHWydTLlXl7aWlbWlBSVF5IQkVJST5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uGgXV6kp6NoHaPdYJ0dYF9dICEb4GPgW+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdW6TlpSVj5iQg4qPlpqXl6Wcl6CXn5OSl6OdmauVkJCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYifl4+IjoqMgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNydHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6emhpZGBUV1ZVTUpETkQ7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bXx9hn5zfpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZeNjJWfnZShlJGNjZCLfpCOjouEiJKVmp+fiYyUkp6Rgot/pZmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHhsamRXYFtUUE5HQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22AfoR9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5bgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmiooaSnZahi4qIjZyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzNDMztfP0dSu1tXY2tja2tfW2dqfb3x1aGdcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4WHiZCSjo2TlImFioqGlpqbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ6Wm4mPh5eXioSOjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U2Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+lrbOzqKOisKyKmrWdo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KWi4+VjYuMl5iSnZm0lpWrnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZGjua6ov7ysrbK5paOnfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFpgW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq5tcG7q6mcsqWkqJSFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcalNNSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy9wbOsu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkq+sq6yXhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXnJWUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8K3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJeXkpalmWWYo56ypZailqytq6ebn6aXmJaZlaGkqaaftqupurzEtaW0tsvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e4tLiyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wfm5aaqJycoaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZeOnqCao6S1yLSpxrrDw8fKyMjMzca+urKuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtra+wb++uLKyw7G5vayjrrSsuKWIm5emm3a+oISYnI6TmZqLrpehnJuXlZufoameqKCZmqmZoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvbm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXBzcjBvbmyr7m0wMLKtcaxwby1uquoraywo6KZqrS6pqmmq6qdqK+no6qqvbynrLyzt73GvLe1uMCwvcCzqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FdYF1KSUZITVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJabmo+qlpanppWtrZmhq7bEwru+t8HCwMfDvc3Hu725sq+4s7/DyLW/r7y2uremo6qsraCgmqqqxKKlqKumnquvrKKpqL64pq29sLe2x7a1ubi/sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWmJdTklIS09MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dNopqjnJ7FrKGfrJ2crp+So56WpaCnqauXtrCiqrK1xMK9v7bAwrvIwr3KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9taWxvLe2tcOys7e6vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqallZWcmIuPkZOkn4liZVtkYExJSktPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6ukoKSframsnbuwqKy1scfDwcKzwsS9xsO8xMq8r7G2rbC1r7/FtbmxsLq1rJqosKmpmp2loafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZmJOipLigoaSSrq+spaefkqGelZ6PkI2UnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbaGZKSUxKU0JDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZWyq6eipLKsrqm7sqywtbTGv8TEtcDEvcjDtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlZWTpKC3oqSllq6ysqaqpqGem5qalpionp6YoZ6vsqKmjZeumaWsl5mepZGbjpOYmoWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBOTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+ro6q0t7Gwubevtri4xb3Dx728w8HGwLnBxsG6qrakrbutwcO4uKqtsruila2wrbKWpaeQqrmqoKewnaqgsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mgmZaSl6aht6mloqKvsbSrsqirn5ugoJuepZuhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUlpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCv8C4xL7Bt6+1qKu3sry/v7WprrG3n5erraitlqeojqe7n6Wts56rorGws6yptrO1va2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5qVjaCmpLSup6GsrK2xp7OtsqmjnJ+oo52ToJibqLWpl5mSkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfR1lmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsHCtbS6xb7MxbjCv7q/usS4wbmytayqure6ur60qq6wtZiYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubepra6xp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWvsbWvo5mdraeal56Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipOSnpqloaGgmZaSk5Z7i5CGe4yKg4uSa254bnZ8YUZhallJSFlbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3ybu0u7u/vrS0t8PBzce7w7y2vr/AuL+8sb2up7q5t7fBtqutsbiUl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbizqa6rsqe4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GorrC1rKSZoKyom5ucm5SpuJyUjo6LmZyimJCXpqGfloSSlpCdnJiWloiWj5ebp5yjoJKWkZGXdoSQh3uFgYSNjG5xd3Z8f11MZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6kra2rp6SwsrOqt7C2n6u1ucm5rsG8wrezsrXCw8/Ev8G9tL3Av7q/vLPEqKm5sLa2v7yvrLOynKCnsK2lprClnrK1rauysKypqLS5rLSyta20rKmrqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqlprmlq7S0pKmrqayvtq6inaOoqpufmZqSpLSaj4mNh5GioJaNlJ6glJOFjpSSnZuYlpWHl5KVmaabn5+NkpGOkXd+joV8fH2HiopydHJ+fX5cU2RvXk5aZl1GRJZbSDtObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqmvpKijsrSxtLWxsaGrrbzLuq7Au8extK20wsPRxcW+wLK+wcK8v7e8xKett6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpqWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaOtrLexsaCooqCrrrCsnZ+nqKmZpJiZj6CnmIaDjomLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjop/f4iGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZitp6KqspypqK+2rLi1rqqlq6q9ybuwvrjDr7Gts8TDzs7Dvr+0wMPEusC0ycSsr7eusrnAv7Surqulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq6CinrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp6koqqkrKKfp7G3rKyipKKbqaqtqZyipaSkmKCZlo+YnZOBgo+IhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmYqOi4t8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqistau2saukq6qpvMDAuLmzvLWms6/EycvRv8G7ucC/w7nBusHErrG1srO7wb6zsa6sq6uotqqlra+rua+osbGusau1qra1p7S2q6ykqaqdo52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjmKSmpqmcoqSjn5mYn5GOj5mOfoeLhoSenoiFi4uOjpCNhIaVo5qOjZuRkpGPkp+XmJaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlFiT0xVVFVQT1hbYlVIUGpUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpaqtmaukrK6ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC+vbu8wr26w8HAv66ysrK1vbzCsrKzqrOopLWopKyzs7mvo662sa+xuaq4rqqutqyrnqqsn6Ogtq2ooZ6vs6G0qp6op6qkqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKmjn6yioZOioqOmmJmppZeXmJ2PioeViH2NhoSEpJaFgoKLho6OkYSFlKCXiJGdkJOQjZGclJaPioWFeHSBf311eHmAe3RzemmCh6N1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHCvb++ub6/vMm8wrmwsLSxuru5wbO0u6y4rKO1pqarsba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKulnpuqoZuSm6CknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn99i4aQj5CEgJOblIWTooyUkouRmpGUh4l+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFQUllLS05xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6apqq+1uLSqnru7qLK/srqgr7S2qayfrrCinKWoqaKenKSxpq+gn6qpqKKqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOqopqapKSVlpSfoZablqasi56RkJGMgouAf46Be5qUjYl8fouFjo+MiYWSmJGHlKOJkpKHkJmPk4GIfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3OObWJqcGBwQVx4a1ZeTlBRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wb6vtL63xLbDsa65srLAtbu+uKm5t72rpLWnp6mwrbmwqZq6vKSuv7S0oa63taenp7CzoJ+kpqegpZmeraeonqCprqegppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWm5+okpiTmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjIyIeYOMhImMjYSHk5qOiZWfiZGVgouWjJB9hHtzb31xc3RgeXhpb3Bxb2p/cmR6bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJQSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i2qKaqsKyzsKaavLekq7u1rp+wuK+ppqevsZuhpKCjo6GWnK+moZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaaqmZycpJWVl5WcjpOXoqmhkImKj4V6hH2EinmOl4qNhnmCh4SIjI6EjJOZjI6WmYqPln6Gl4uPeoB6cHJ3b290X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0tIR1JVRjI5Xl5tUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26taais6qmqLKrrbGhm8C1pKe1taiesryqqKapr6yZo6eco6aUmKKypJmfpKipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmaGUkZSWmY2UkqOopJCJio6FeYR7hIZ9nY2KioZ5gISIiIiRhJSTk4yQlZSNjpR7g5eOi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0tKR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBtrGusra2uLe2rKm9s6+ysb2/uK67vLGln7arpaS0qauun57Cq6ilsLKprLS7nqmqq7GlmJ6qnaakkZmmraKYnqSpoZyinZegnae2pq+qr6GgnZ2hlKCln6GgmZuZnJKZnZSlnayimJadlJONlZeLj5iaqKCRiImLiHmFd4KCgZyIi4KJfH+EiIaFkYOVlY+OkJGRkY2Se4OVjYVzfX1meG9ramxndXNrY2dkZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FnSCU1mqOekIusoZiYoJals7Gisb23obHGu7mxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrbS2urawub6tpp61q6CgsKWrrp6kwqCyo66wrrettZ6tr6ytopmcp6mknpWbqKWfmaWjqJ2aoJuUnJ2tsKa5qK6ioJqanpmeo5qknZeemJuUmqCSqJaqp5qTmpqRi5WZjZSUmamnjo2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2CcIB/ZnluaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GZqbKwn7jAtqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ls7Wxrqmxt7axs7W6p6mftqmdnqmjqq2cqcCZraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+opJ+XmpmeoY9ropaYnHGClpukgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2eGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RlRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOhm6qtq6O9xa+pt8K4vb2tp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKenmay7laalr7K3ra6lqK6rrKWhn5ygp6abl6GlpZubp6edk56fmJCeqKqjta+jo6OblpeYl6OIoY6Smoehh5SdoX+lf6aqnpKRmpGIg3J4jY6FiKF2iY1pl4hmfXN4oW+Ih4R+jXx/oaCfmYB7h550iI52m4psh4GDbGhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk0/R19NRlJWVlFRUldUZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yqK+fq6GyqaCjo5qio5yutZWkpKW2vKasp6qqrKiloaCYoKajmZmmo6SYnKSplpSinJSTpKWmoLajo6CjmJSSl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6qvtrOoqKa1pqe4r52zsraqpaSnsa6usaaqnqeksaShoJ6XnKCer62VnqGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5uUnaGmoqCvop+fo5aWkpeRmIWvamqKjap+Z4SVh61kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaGeHlkV1nGB9aHykp4JZX4uraYCVeHpqpzdKr1tXU21jW0tPWF9cV1Y7TohPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK3rLS9vrC2xLK4u8KnqbCrrqmpsK6ksLqvpKWus6Opuames7Kwo6Wgqq2vrLCmp5+jorCbopuXlZeanK2ml5uhnrSzoauboq2toJ6alqChqJyYnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZCWkJmFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknerZ2uxW6x7j4eUdIhxj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaJuW1NraGBMS1xkWFxaQj6weFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAblZ+UiLOmpqGuqaezrKm7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6OinqiqsqiwqKWen5+vlp+ZlZWWmJ6topqao6i0rqGpj6moqpuelZegpKeanp2jn5ugo6WjlZufmJqdoqqbppmbm6KglpKRk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoN8poKTfJh6qnmNnJB7sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1RamhkUEBYZ1pkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltKikvLfBsLnAsba1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZahq52blqetsKijno+soqiWnpeboaWhmKGhoqGaoqKnm56hnpWZm6agnKeUm5qfoZiPkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20uKqfpp2iqqWyqK2qpJqcmqielZSYmJKSo6igl5Klq6+mopaTrZ+lkpShm6Smn5SapqahmqOfrZqgnp2QlpuhnZyllJyVmaKflZmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6dh5mZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraiyqKqyuri0uL+5t7K2vLWkt7OftKyfn6irn5WntquosbGrrrSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpOQpqyupqCVmamfoo+RopmopaCVmaWonZyknq2doZ2gjZSem52gmJmclZeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rbmVPSkOhXFpMdF5iZk1aYV9ydF9KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC4sbW/ubqzsbe8qbq0n7CknqWnp56UqrGpsKm1rKuvoZihoKakpLqio6ugl5uRoqCVlJ6alJieoI+NjKivr6adlpuopp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYW1ZYlxhcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sa+5uKrAtamqoJumo6GdkqqqqLajsqiuqqCXnKegpau4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZScrKqXjJOlmaSsopGXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsSxurKuu7CuwLGspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2bkJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5ufqKKznqKljqeilKGanJeWpJiPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3p9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNQZ2ZxbXVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZazw7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6moauXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoailpqOpoZKtn5ejnpeWl52ej7CplJunoY5qfmmcpniHc36aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunrai+p6mmlZSclaCak5ilqaeRnZGPl5ywsr+sm6edp6KJk5Gpmqikm5uroKOZm6OmrKKfqqKasJuVpqCWlZ2fnZexpZihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dacHpubWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwJ6rpJWSnJeemJOUop+doqeTkZmop7LDr5qrnKqfj5aWqZ2qm5ugrZihm5yipK+moaSonq2Yl6admZqhnp6dsKCcoqaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGclqichJ6pq6KzyLOfqqOql5aXmqedqJqdo6uTnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmJ+ok5iXnJGkmZionZqXZoOSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOboqmpkp6hnqCqr6qro6qfqJumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr6Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqqWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopOmray3s6evopKRmp2lkpGgoZebn5yHpqukq62/wLGgqa+pl5KfnaKZoaKpo5OgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WVoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC3l56RpKqorbOrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq2kqrCowMazqKmxrpaSnZyil56oqp+VoJ+cna6vp6qpm6enpKGrkqy0lqaiqqmdo6elobChk5qnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZBkb3R1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoaWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6u0qrrNsa2mrquWlJydopmerKydlqCZnZ6psampqZurqaOirJuvsaKorK6lmKaqqamxopKXo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mZaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTb215eHdvbGZlZXFwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC0sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZn6SznZqglJyfp6uro66arKmioaqjs62iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk39we3V9e25bZWpycWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramyraylopyyuayqoaabqKaqrKmmoKalmKujn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrZGZnKaioKqmrqGjp6mwtMKxs6qtqJOJl5ykmqCirqaYoZWYnKWmq5qvna2opp6so7esobK5r52br6ezs7OllJino5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3t9k5KLdXpzhX9xXG1ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKpprKgmamklKO2oqKVl6KptLiknKKdo5OQobGZnpympKGir66dpKihtrLDsa6pramRh5Ccp5yiopyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyuLCzp5ier6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jI2Ti3h9eY6CbWl4aXhzbn90XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqaewo5Sso4+lraOdkJqaqrS0pJ2knamSlJeuoKCdpqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpaGVmpqcmJqZpqSmmKunraKkm62nvqyVvbCsn6Kws7mrtKebqbGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkqeZgpSNl4x7e4OXf2tsf2J9dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilpI6bpKOgr6+qn6Sfna2Znrigo6ugr6qarqGQqqmklombkK6wrKefp5utmJiPrKKhnaWhmaScrZifqKa2qcCvpamjnouAjZuan6adkpWampSamqWjpJqorKyjpJ+qqL6kl8OsqqKhrLK6q66noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+om4uYkZaWe3mOnX5kc35ig3d0gHxhamZxbWZlZU9VZFxCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLy9AVVpYV1dXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5uspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrnq+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop2ln5mjoqWZn6Opsqi8r6WonZyOfYublaCgmY+SmpuSmZeonqGZqK6npqajpam7n6DGp6Wpoau0tq2upp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrt0gJaOpp2QnJGXnHmCkZt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9sqKdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajraGknKqgmIujkqeep5yaoKiimJ6grK2qua6oo5qWknuHmZGmm5KOkZiYj5iTqJmgmKmpoaqnoaOru56pxaOgr6Ors7Wrr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2SjqKYmJmRlp58h46VdmaHeGiNanl+eWRsY2ZsYktlWEpsWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6qpoa6epLKpmJK9ssTIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI2YlaeUn5ipo5uxp56jrLqfsMGnpLOmrLGyq62rp7ijrbeWiqGopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmpeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadte5SRlJOBgY+Pj4+dlKGWmZeigoiUjXJpkHdwi3d2fHpqbGRkb2NVYFlAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW3rq6isKStoKC1sZCOq8a9xLq4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5yolqykoZmnnp6TlaOXqJqomZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2pqbK4oK68mZGmo6a2opKdpp+NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clquckpmhm5SQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaQlJSRin2MlpKSmJOhk56XooSImId6cpZzeop/cXt/am5kX3BpYFtgWm1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2mtLuvrKyio5p6naKxpKWwqZabuaejlJmqnI6Giomco5Cun6OWqKChkpeYm6+LqpaPqJmnjJmoj565tqSlmZuNiXmCk4uak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqxu5R1rKSeiYCqfmRcYnagjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmHipSSi1t2lZFnaJCOcnummZlleZmHgniYaoSKgm55f2twZWB2b2traFxmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhsLGsq6mlqK2jp62kkpWrtrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlZKJk5GQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqirreBjo2mnoOLhY+xqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSVkniWaJN0oJp0fZmEoZ2HmH6Si4ODmWuOjYVreHtxcGdkd25pbGpbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKiwpqeppZmUrse+sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2Gj5mXiKudopafoJGNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiJOPiZOPj5uLj5GekZehpJaerIiftIm0mq2Lyoeqroi3hY2wgrCug6mNppmNnXyoj3J7d5yPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6Kag5qAjI6FiplwjZOFaHd0e3ZnaHVwZ2dsXmNvbGdtWGhHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubCqq6aalKCkpaujlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZmYhqK5rqSZnIyMf2Jtj4qSj4yPjI2Yi5CRno6UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2qroakjaqajJp+onaAmZRrgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4SfamWfbFtuinxmWl+Df2JXUG92ZW10cWpqb15qb21salhpT11YRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqySoba8q66imZegoqatraGdrrWiqJKhoKCmnJmOmLSZkIuejJWMdYGUko2KppaVmJ6ef5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHio2NiYuNkouQkqGLlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXmKfYSafaJwcpOIlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHVxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHfn2PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqeqfq6MfXqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnF6eGtpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJusurKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBh3h/lot7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6efp3ywraOiuJd3o7OipICIlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ9lG+Zc2qkXZV2SGVjYHNxfn5uZWBsaHZ8ZGViUl5XXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaCLeIWNiIeSmZV8k6Ohn6OIroZ9tYSOnp17pZZ6qYGWnZCKoJx8p2h2bX6ZdKFzcXyehplwk4OufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294epdrm3t3l3JtqaRnYGV5cICEa2dmZG11eGdgY1RbZlFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJmFmaigoKONpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoeAboKfhniAk4aImaKXepOipJqgibOhoraLeqynpK6lcKmAmo+GgZySfKSAopmGmHKehKOtroqXjICMpI2Wg66ilXa1tbXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt5h2ZqZ2J0dHFuVl5UWWhPUWhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeHCQoYd5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXebmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcoJscGhreHNrb1JYV1ZmWVJtSVhPXUlYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAj3Noj6aEfYaUjYmYoI6IkqqnnYmmeJacfqWJloyymJ6Qgq+Xn6V4lYh6qXSlj4SabqSijJKEjIO7bn2lr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVydHB8dHFian5uaG1TVltVYWFca01dUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOMlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4V5kIuEf3typoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYZ2bWxnjHN5e5h4hFtrWHmPaG53cnFveHhvXWyGbmlnVlpgV1xla2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpS5qaeLoaKapqSZpJyroqGEhJiskp2giZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6XdnKFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5Omj3dvnZGDepJvfqiFcH2VcWtwfIGfjH+TjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYaPem9lZ2R6g3qWW1xqZ252W3t4d3Vuc3OCZlxtimtsYllZXlpYbHJcX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3lvaGptYIuMqrGikKOhmp6el56ZqKOifoOYrY2flIebopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOLm5+Pgqahh3iOmImVi4ucl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbh5aOe3iOjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfYiLiZCBdmyChHx5mWpyaGF0inB9end2b3Z0gV1eb4Zobl9eWlxdU2hyVmNcXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaXl6cWdpa2WMiJ26n5aioZiVmZiUmaSgnnt/mquOno2Fn52LnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJaPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloCQinZ8h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG54dXSSoYuMhZqFhI10gIl8fHJye4iEe3mLjoSTp4+GhI+ChIqKineGiImLfG9rfoB7bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1pdXlFnbVNlW15ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bWxUY3F5ZXB6enJlaW1ti4qft5qho5+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2LkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+jYR4f4OPh6CAfYyMj3yYpKChk5mQkKeNj4GbkYmSl5t9kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLcoGGfH1weHuLhHp6kY2DlqaTi4aRfIaGh4V2goSJiHplcnt/eXpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Ta2hUZFlfYWhqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l/iYKAf3F/e3R2g4V+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZOLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2YkpSbeY+FgneEl42dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXt/hnx7cX53iYV5hJCKi5iilYGEjXeIhIOCd3yCiYZ2X3h3fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2tkUmJYYGFpa3Z5hnFjamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH14qpyKmXqXnIuMmJB5e4GLfXyDe4CCgHh0eHpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoSSkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnONjoprhZiPmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeId+dXiAfYaAfIOMhY2UpJB5hYJ0iYd9gHR2gYiEbmB7dXpxfW9hb2Nke2Jub3ZzeHdzdGF2X29sdW5vXFxfXl5qXk9dWGNhaG10e4hrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJd+npORlpSId357in17gHZ4f4BwdHN7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FuiJmEZoaZjpN6iYWQinCWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHdHN1a3FudHuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgHOIeW+AfYCGfIWMiIWNlaiNe4h9fouFeH5xcICFg2NoeHR1cHxiXnBga3RecWp6eHhrc3BleF1tbHNtc1laXmBialpQV1hlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiYV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdYGqlJKOh6CMlpOQgHR8doV3eH9yc3uFa3Jvem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5aMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaYSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJd8kY2PjZqSfYp/gm52cGxtb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXl2iHRwiXuFjHqLhoOJj5yjiHyEd4KLf3h4b2uBg4FdcnNxcHB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWNg3+XlIOQn3WLn5SThoubjJWNi3pyeHSCcHKFdHF1iGxvbHVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlICUf2iFnIdnhqCIkoSRg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwdox6iYx7iX2CjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYF9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXlwiHxfXWhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgHiIg3OGhX6MjIR7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoiAjJ5/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNwa2l2boNufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQipOblIZ+lpWIjY2IkY2JnICOgXh6jH6IjIqcnJ2blZN5jXZniJGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9ra3l5XIB5j46Aen1+f4aOenloc2tzi4+JgoWFfZWMa35+boCLfouHfYR6gY+WmpqKfXd4g5B5c21ncICEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cnBwY194YGBWa19edk9OTGBnY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pdop2boaIi32Ko4SRiZ2FhV6LlJeKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepKHhXp+f4CFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlpOZkHV0eIiNdXNxZ3V6g2J0bW9iaXZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHdNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh3e3F1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHaHf3CEgYmHmaGDlIyeg4lhg5WPh4mGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoV8f4OAhIqCdWF0bIiBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQl4lvcnqNhnVscWxyeIFfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtVlt1TEpMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipWFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3txcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g3+Kk52ehpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SHfnBfc3GFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkZOEbnB6jH91bm9rbHp9YmhqaVhtdlpSaXJqYlFicnhsYmVdWWqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsW1xjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpGRg5qfm6CGh3Z2lH5tdpSXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGXjZCMfW5te4l9d3VvaGh9dmRccGJXcHNTU25zaWFOZnR4ZmBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2NmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjIafmKCZhYhufYx2aniYj3+CioOVl4l5jpZvenNwbGpkYHR6aGBlcXpaYXJ9eWdwemFlZY+xsndKYlqk2dCWcXuQi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZGEk42Df29+g3aDd4WbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qGe2V9foR1ZHBzgGh4cG91mIyFgop7dniAhHmBa1xxfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmY2NhHhub3+Ef3d7ZWhqfXFgWXdaWHFuTldyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZl9acGtneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2h6lop+gIWCmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3dviYVsdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dheYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygG9bbX50eIqCi3uGf3yIeHpxbIiDj4OKcoF5f5aLi390bmt3gIB1dVxpaXdwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwW1lVb2RZZHF5WmheX2dtZ2praXB3fY5saYKEfnlugHt8gH+CenWCgYyThXCAi254foB6e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn51f4B9jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5sWG9/dnSLgYZ3h3WBiXp4c26JgI6AhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccVxPXHJwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bVhYU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISJknl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIeomJbHh5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3N+YlZ3fXJzioSCfIJwhol3eHBwg4KMfn15fnx1joaDdmlxaW2IgnJwXWhjc25KZXVMXm9WVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1Z3XlxlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goJ+iYuTf3CAfHh5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f398iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxsf1lWdH1vdISHf4B4a4iGc3hrdX+Dg316fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1dWeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG9mZmtxaHB1eI10a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6FgomNint3f3iEfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYeDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyEin57koV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuh3GBiouHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB4bXxdWHF+bHOAi3yBbm6Jf3F2aHd/gX+BdnxxenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBaW2poXVdnX15yZmtncmdwcnaFeG6VinR/enh+eYKHgHVzgIaFjoJwcHt4dnR5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYFtgIKRh3KUiIyHg4iFfXl0cm9oemFqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0Ylxve2p0e4t7gWV0hn1tcWd1fnh9f3J8bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk9oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOV25qWV1sZVxaZGJedGZtZHFncm90gHdwmYV2f353f3yFh311c4KIf5SCbnN4enlycoWHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhoJ+gX9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoB0iWVleH5pdHZzc4OEeIGEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt7kYR2mHyHhoOGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAd4J1YneFinyUgG6Lam16gHBlcmVgbXlmcneKe35idYJ2aWtxdHpweXhyfWZ+f395d25jZWJuhnxta1ZqYnBTS2lrT0xPcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNXTFl1ZFpfa2FcW2NkX3dmbWJwaXNucX50dJmBd3+Ad39+hoV6fXWChH6XhW5ydHt6dHCEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paU2JuZVtYYnN7amhtaV9iV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3J1eI5/d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoXG93ZHFziHx4YnOAcGdqeHNya3d2dHdjg3t/d3ZvZGNjbnx9a2xVaWJmU0ttaE9HUmxFYXhmYU1Tcl1JTVRZZWt3emVebXBpZFxWX1VubldLVGhYZl5YTVVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebWxcYVZcXGuBZnJ0fWpqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt9dXVidIWKeoeGgH93cnV+dGFwbFlxdGJxcoV8dGRyf2xhbHpvamh5d3RxZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1diR2J2ZmFLVG9XSkxYWGdsdnpkZW5wZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB9f4iLhn11doZ4h4x9c3V1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2FlXWVWWVlWY2ZrYF1cc4VpWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJhd2Rbb3BicHGCfHNmcYBkXm52aWNmeXp0bW6BdXR9c3FiXmZub31kalNoWFlUTXdfUUpaWUhidGNhSVRtU0lMWldpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG5gZ2JsVFtaV2hjbWZcXHGIZVNybltaWFhgbXdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZnZnXmJaYWdcXndoV2Jeb2hhd2Fbe3ZqaXJud3NzdGhwgZSChn6EdnNqcHxsZnZXXGttYnBzgXpzZm9+W2BvcWJfaXB8bGtzfnJxeGtwYFtlbG16YWdTZ1VXUlB2W1JQWlJIY3NiYEdValBIT1pWa2xrfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p1aGJ0ZWVdWm51bnF1dXprh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1tmamZxdIF2c2JsdlVicWpbX25lfGVsdXxycnNqbWBZZGpqd15mVGRVVlBUbVdRV1RQSGVyX2FGV2lOSFhUVm5pZHxpa3drYVdcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39tg4B+hpd7f4iBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmltYFRWU29ndGxleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbl9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfGxxbGNZYGhpb3SBc3JeaWxSZXFkVGJuYXlicHZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlb11jR1lpTUlfS1htZGB4aG59ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLy8sgKSgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0dHBh+qaSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQio+LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoWJiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoeFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4yNiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiYqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OKioeHiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cnBxa2xycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZWpmaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxdXmJpYF1eWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUFxXXmxXVVJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQYFddclVPT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0xjVFt0VktQTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDR2ZUVXVTSlBMSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9KY1tVcEtERkhHRkdCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PlVkYl5nT0FFRUZERkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PjxIYm1oZmxgRkM/TENDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3PT04OVVscmtqcGtONUpYPkBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdXN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0NAT0I8WG5xbmxzcVtDY1U9P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT9SWUpSa29rZ3JyZl9qSDs+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6O252R0FiXVxpbmhjcW5rbGY+OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWlE8PD1LTkhIdnZNOFdqaGtuam9xbm1sVjo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUg8X4CDgHp7d1Y7Q2BzdHJvdXFub2BBPz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2WDhIODg4B9XT4/R2h4dXJzcG1sTD5FQkJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R+goKBhH59hHVMQkNDT2x3eHt6cV9FRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERUVDZIKHh4iFXkZJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gIB4gISFg4SJbUFBV3WFiIeHh4mCV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVW2GiIaHhoeIiYh8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoGEhISCgoaGhoSChoWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Bg4OCg4SEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLjIuKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dnd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0NGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTUtSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEtHREFBREBPUE1TZHN0dXVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHF0d3l6e3x9fn19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcnZ3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxcnR5e3t7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHF1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNCQUhKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSkxLTV1SSUhETUdBREtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0hISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkBCRDxCQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS09VV1ZVVFhgXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU9PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVZUUVRRUkxPUVBPVFlaWlxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NHSEhHRkpHQ0dJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJobWdiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0dFS0pHSEpJSUtISkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VoamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDQ0JFRUVGQkZGSENESkVFSk1NS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj8+Q0ZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERURDQUI8QkFCR0RHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkhHSkdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUpHREZHRUZKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2JiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJS0pJSURGS0tLRkZJSk5KTkxITE5ISEY+R0dMSUtLSkxLSUdFSURDQ0VBRkpEQEpMSk9bY1lfXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdJR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmFkZGJYT1FRUltTW11dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1hYldfX1RQTlBRWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tNTEpKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRXT1NUUFBPTlBVVFtYWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUVZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFRT1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUVRQUFBRS0hmeGxjeHJtWktNVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvX19fY2JaXmNkZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT0xLU1NTT1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUU9KSVFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUExOVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lSVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRT1FYVFJRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNRVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpfX2BVYVxhYV1gYl9cYF1jYWNnaWRlYFljYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUU9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUl1YWl1eXGBhYFdiW2NiXmFjX1xiYWJfZGdqZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVZWVlVV1lbVFNWXlldXWBdYmNfWWBbZWJfZGReXmNjYV1lZ2pkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpeXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdlaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFhYWF1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXGJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFVeW2BhXFRVWFBVV1VTVlZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWV1ZWVlNWVFhcXF5gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQV1ZYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXV1ZWFZXW1xgX11fWlpeXV5eYVxbW1pbX2FeYmRjZWZlZmJaZGZnaWdjX2NeYWZlWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVhXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2QRigrKysqJWOSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkJQ7FhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3l7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fX56e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHl5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3x8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7e3p5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgoGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJzcoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Vzc3R2c3Rzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd3dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fYN6hoh5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh4eHl5eXh6enp6enp7e3t8fX58e3t6e3x7kn+Mknl7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fXyahZCaf359f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgH9+gIKBgaKHk5+FgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foCAgICDpomWood+f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5/gH9/f4SojJSjiX6AgH5+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQioqLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgYGCgoF/hamRkKKJfoGBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoWFg4OWq6OhoIeBgoKCg4KDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAg4SBjaypq7ClkoeHhomIh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhISBgoKbqJ2lqqCgi4aJk4uIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEi4qEhaSdlKCil6GVg5GYhoWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKHl5KDmZeOnJ+XnpmRnZKAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOTqZiUlpCgppeYnqGci3+Af3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiIeeq6mfmqGrlpmfnZmHgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLhI+goqCcn6OZnJ2ck4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI+Bh5GSk5acmZucmpODgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19fIKXi4GDg42Qk5eXnJ+ZiYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Lfn+AfYeLfoSEg4SCiY6SjomOnJSDg4KCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYqAi4V9homBf4aFhYWGh4N+fn2Dh4SEg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYOCgX9+goeGhIF/f4CAgICAhISDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/f35+hYKAgICAgICAf4GBhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/fn+Af4CAgICAgICAgYB/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgY2IgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOCg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf39/f35+fn5+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4KDg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgIGBgYB/i5SPjIuOjo2Ih4eFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUkYyMjY6OioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LiYaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIqHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f35/f359g3x8fX18f319fX17fH5+f35+fn9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqIiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/f4B/fnx6fH19fn19fn6Mhn19fnx7g4J9fX18fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/f3+Af31/f39/gIB+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCgoKEgoGBgICCgYCAgoKDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8e3l2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4WHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/f4CAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4GAgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX99foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnh3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYGAgYKBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHZ4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgIGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhYSFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhYSEhYSFhISEhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1+gYB+foGCgICBhIeGg4OGhIWEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR+gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFhISEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4OFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH98e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhoaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn17fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhYaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fX18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J+gIF9foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+fHt6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM3BlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWwpqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2Ym5yHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mpidkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqChrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sju56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iy8WWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jLm5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqqmrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKfPkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp6gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinZubpKGlqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJ6ZmZ+gpqajop6elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6Cqnpmcm6qkoaSfoZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGqsqGkoqOroqWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rt7WksrGwm6KnnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1s7iynra0uX+dqqSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSwrJOxu7lrj7iyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb6zqaWHrsG3YXq+wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+sK+egK28sl5ptsO6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DwrW7lH2qtaVeYaC8u7Ggm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wYd7s8WiYWGGubu2rJujt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwbp9fL/VpmRicrGztKqfp7Syrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMeydHa916RlY2autLe3wL6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPIqmxwstefY2NetcTByMzGxMHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIx8nNyMPIycnFxcPCwqNlaZ/SmmBhXr7Px8vOxLe/v8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDxcTAw8HCwcPCw8GcZGOHx55bXmPEzcXI0MGuvb64ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrSwLvAwby7xb27wcTEo2lkeL2jW1xrxsXAwMm/sMG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8HZirLCu8O1use3trm7wKZ2cnemnWhpgMbAv7vBvrnGvMLAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zRxnagzL3Ht7m4rre1vrGdhYSCk5V7f5nFwL++vby/ycLHyL7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2K1ye7bJz8LAuK+1vr+gjoR9h4SPgYSZsMLCv769vMfGy8rEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi6vcfKycLIydKWb3Cp0tHMysS1u8mviHhwZX15hW9zgIi1xL7BvMC/t8rJxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvH0sK5vrzEvre8wb/Iz8bIysrAhHByos3Ly83KxsXBlXBiWU9sc3tXWGhymb/BwL/EqKTIxMPEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uK7cwr62vsC+vbSelKKrr7++o3Z0d6LQycvIwcPDpnhcTUZBX29wSUVYYX2qxb/BsoiZyMPAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7yK1ssc29tbnAvKR2amdsaG98kZRudHmi0cbIwbi/vYdiTEJBOlRoZEU6TlhoksPAtJBynsi+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wNCpcoO0vba1v56EaFlfXktRWlprb3J9o82+urm0vbR4UEBRZUBLXFlHOUdTXHu8uZxyaay8tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLLoIJ2i6Kws5FmYGVVWV9LSk1PU2xzhKXHu6KjrbiwhEVAcJZRRVJRSzpKUlVsqqF/ZHK2r7K8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaKGeXWNoo5bUkFYVEdhbVlTR0ljjaOqw8aZhJCjsKVCR3uaX0JQUU45U1pSYYt/aV+Jt6Wss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uMKwjn94h45oTklBa1dCT3WFmXBNQ1Z9sLvRrnp2gqGmRkhod1hCWFhbPFZjUlpvaGBfobOepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4s5KMiIN3VUVAVIlWSkpTdYt/YkBZqbmyx8+SZ2yDhEtGU1VJZJGfqZ6Xe1FWXlxXcq+noZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrqnmJmWaEw/YIBqTklJTWeaf1ZHWa26sa/SunJbYWRRRVBwlamlnpqcnp+BVFBTU5Svn6eWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wammvWFCXKN9T1pJS2FLW4lmbXOOr7WpvNKXVU9PUG6isKecj5WRjpeeoo5TSVylpJ2olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8XAyZZOQnada1FxTFBhZ3dwX2BrgZmwsK7Gul0+YJSlnpiSjI+UlZeXm5+mi1ByoJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoZXUk1kn15ufXV5V1FrY15qZ2x4jrSvtMJ/hKGfnZmUl5mYj42QlJCLjZCBiqGdl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOPeVdzdXJ0aV9yblhZXV5kZ1liX2isrquwqKOfoqCWkJOboJqYlpGSnpuhpZuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgon5ve2lgY1dNW1JVSEpPVVBHUlNKmayqqaSfn5mSkZOYmJaVlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjn5yIX1ZfZl9VTExEOj4+QkM+PkNTeKmtqaqln56foqOdnp2anJuTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BgZl5OREU8SkVIPD86Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpX1RMRD5LYIJzZUI9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIQ0BATZCnsJyDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtgUktIRENARli20ryyr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KhWUk/QUNBSVN8sq2mmZSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2dDOT0+R1qDq6efl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLB6S0pFP1qNoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkvszV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK6TeHJ2e4uVmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fGaDg6esk46Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWtfeX+mkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraRfZXSHk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCYW2hxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wbqztLXDrqmwkVxqfpKHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqWop5qgpaGanKWsrqSooquqrauwpKafqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbIiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCcoqWUnqWbmJGho6qjo6ClpqemraCdnKSmrbKwtrensKyoqrSrtLqxtrautrqyr7q6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NjY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlpuilpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaedlJWVm5ibopeWkZyioqienJ2lp6KlnKChm5murq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrStnpqkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZagoamkn5+pnZyaq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqZuZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoJ+npqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6OinKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uQipKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Oio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjYeQipeJlJSYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+tn5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso5+PlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmXhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaen6SAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyFdG90a3FsZGxqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZaKgYSBinp8ioeGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXlhhWFllWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFpTXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlZRWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSVF5IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm6UlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkQ7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bnx9hn50fpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdxoaSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRExCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22BfoV9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPh5eXioSPjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZucsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em6Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYaDkqe7raiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZWanqenpKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZimoK6djKqcjpaPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmZ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknmFjZKQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpalrKigkY6SscWnlY58kZV9h5GYjqmZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqytq6ebn6aXmJeZlaGkqaaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqstL7CucC5s6e4tLiyrpWlra+upYuTlaGNdMGafpeZhY6WmYqxlZqZlZKTmZmmo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuaaInJimm3a/oIWZnY6TmZmKrpehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q76lj6OXkaKfvJ+JmqCZlp6djrefqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FcX11KSEZHTVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpanppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpOblK2gkaGipaOjn5C+pamdqaydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mwqJ+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2crqCTo5+XpaCnqauXtrCiqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWRk6CtoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cjp+Xlo6ipJWQpq6zq6mioqallZWcmIuPkZOkn4liZVpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZyqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZSjrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZayq6aipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5aRpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWsl5qepZGbjpOXmYWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+qo6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurpp6YmKuioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSyq6Gttb2vs7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7WprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEtqu8r7G4q62qo7GmnqSqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqGekayfmJiFlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub61qq2xtpmYp6uqq5usq4+rvZ6srrGjqp+wrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZWambKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqloqKgmZWRk5V6i5CGe4yKg4uSa254bnZ7YEVhallJSFlbPXtKR0U2QWJUaVtNXGFKW11aUlJSYmBMS0VfYGBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lo66utam3tLijq7S3ybu0u7u/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bDt6utsrmVl6auq6ejsaqUr7ukrbKyp6eisrOwsbG1sbizqa6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJSbmZSynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrbC1rKWZoKyom5ydm5SpuJyUjo6LmZyimJCXpqGfloOSlpCdnJiWloiXkJebqJ2koJKVkJCWdoSQh3uFgYSNjG5xd3Z8flxLZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2wL2vq7OznKCnsK2lprClnrK2rauysKypqLS5rLSyta20rKmsqKypua6xsce/uKS5r6mtraaorbCmpKSuo6mcnZuasJmio6KjkKyepKCfoqqmprmlrLW1pKmrqayvtq+jnqOoqpugmpqSpLSaj4mNh5GioJaNlJ6glJOFjpOSnZuYlpWImJOVmaecoJ+MkpCNkHd+joV8fH2HiopydHJ+fX1bUmRvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLzAsKuyraCkp62pqKSwo6uxqq+ssK6vrquzuqe2sLKpsqmrpaWkr7qsqrHCubWruaioqKyqqLGlqqSirqqoop6boqyVpJ2YnpmsnaKnqaKtpqOtrLexsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjYl/foiGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFpPY1xOVVZVV1BcYl5TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZetp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOss7qkuLOsrK6nq5+in7G4q6qtureltbWjqaesrKqtoamnprGyo6aloaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmoqOiop8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtNaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCYq6mttau2saukq6qpvMDAuLmzu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlrbCrubCpsbGvsq22qra1p7S2rKykqaqco5+1s6iopLS0oLWtoamoq6mrp6Crq6i5tqmqqamiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoiFi4uPjpCNhIaVo5qOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJjUE1VVFVQT1hbYlVIUGlUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpautmqulra6ztK+qpa+pqbq+u8CxrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vbzCsbKzqrOopLWppa2zs7mwo622sq+yuaq4rqqutaurnqqsn6Ogtq2ooZ+vs6G0qp6op6qkq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhYSEpJaFgoKLh4+OkYSElKCXiJGdkJORjZGdlJePioWFeHSBf311eHmAe3RzemmCh6R1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsC8r6a4qqeusMnGyNHDvb++ub6/vMm8wbiwsLSxuru5wbO0u6y4rKK0pqessra5s6emu7WttbyvvKatrLWrrZypr6Sgpayqp5yeqrOks6iaqqeppKmeo6moqb2stK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4J/iJ6Phn99jIeRj5CEf5OblIWTooyUkYuRm5KVh4h+f3F6eX58aXd8enVxcX1ohnmFiGRgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6mlpKGrpLeysqWpsKesuMG9ta+iua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6aqq7C1uLSqnbu8qLK/srmgr7O1qqyfrrCjnKWoqaKenKWxpq+gn6qpqKKqnKSpoK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI6AepqUjYl8fouGj4+MioSSmJGHlKOKkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYF0a4NnZGhhb3OObWJqcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+oqrjCubKtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+uKm5t72rpLSnqKqwrrmxqpm6vaSvv7S0oK63taanp7CzoJ6kpqehpZmeraeonqCprqehp5ejqaCwuJ+ksa+hrKCspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfHuhjIyIeYOMhYqMjYWHkpqOiZWfiJGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/c2R7bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwpLSzqKi5xLWxrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i1qKersK2zsaeZvLekq7u2r5+xt7CppaevspuhpKCjpKGXm6+moZ+ip6+ioKKTpKWit7ChprGrn6yirpecqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXoqmhkImKkIZ6hH6EinmOl4qNhnmCh4SIjI6FjZOYjI6WmYqPl36Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUnKqdpaGioLeqrqC6uKWrvcWyr66jta+sra+1xMS8s7+6t7Czubi6uLuurcCztLivv8G4rL26taais6qnqrOrrbKimsC2pae0tamesrupp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLiopKeup56loKeSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6UkqOopJCIio+GeYR8hYZ9nY2KioZ5gISIiIiRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqSnm56enaO1raaquremq8PBtq+so7Wup6+vt8DAvLLBtrGusra2uLe1rKm9s6+ysb2/uK67u7GlnrarpaW0qauuoJ7Cq6ilr7OqrLW7naiqq7GlmJ6qnqakkZmmraKYnqSpoZyinZegnae1pq+qrqGhnpyhlaCmn6GgmZuZnJKZnZSlnayimJaelJONlZeMj5iaqaCRiIqLiXmFd4KCgZyIi4KJfH+EiIaFkYSWlY+OkJGRkYySe4OVjoZyfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FmSCU1mqOekIusoZiYoJaltLGisb22oLDGu7mxsaS3rKquqbm9u7utwLKvrq22r7O3sqaqubGvrbS2urawuL2tpp21qp+gsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJuUnJ2sr6W5p62ioZqbnpmeo5qknZeemJuUmqCSqJaqp5qTm5ySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2NzgWFlaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GaqbKwn7jAtZ+zwru9ubGmtq+orqW3uLe3rLuvraqrt6q0uK2ksbWxrqmxt7axs7W6p6iftqmcnqmjqq2cqcCZraSusLa1ra2fsa2wqqKbnKSsqJuVnKejnZqpoqSWmqCckJujqqmpu56mpKCYmpmeoY9ropaYnHGClpukgHWSqaeelJWfkYmXmYCWiqCPeYaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RVRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOgm6qtq6O9xa+otsK4vb2tp7awpaukuLOys7C5raqnrLSmsLSip7e1tainrLezrrSts6Kpn7SrnaGknKenmay7laalr7O4ra6lqK6rrKWhn5yhp6abmKGmpZubp6edk56fmJCeqKmita+joqOdlpeYl6OIoY6Smoehh5SdoX+lf6aqnZKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk4+Rl9NRlJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWym6y0trSmp6mzsa2yp6+fqqCyqaCko5qio5yutZWkpaa2vaetp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJSTpKWmoLajpKCjmJWTmJOciK6PmJSJqYuXopuFsYCjrJyTmp6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFBORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKpsMK9srXAtbe/wqumtK2tqaevs6qvtrSoqKa1pqe4rZyysLWqpaSnsa6usaaqnqeksaSioZ6XnKCer62VnqKftLqjq6mhra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGmoqCvop+fo5aWk5iSmYWvamqKjap+Z4SVh61kcJ2clJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYCVeHpqpzdKr1tXVGxjW0tPWF9cV1Y7TohPV1YvSFNTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK4rLS9vrC2xLK3usKnqbCrr6mpsK6ksLqwpKWus6OpuKiesrGwo6Wgqq2vrLCmp5+jorCco5yYlZebnK2ml5uinrSzoaycoq2toJ6al6CiqZyZnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5aWqZR+a4GmeoKFiJOUknerZ2uxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNMaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclZ+UiLOmpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKyp6OinqiqsqiwqKWen5+ulp+ZlZWWmJ6topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdoqqbppqdm6Kgl5ORk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3h4R9poKTfJh6qnmNnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh22XiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKikvLfBsLrAsbW1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLOzr6Cknp+nqbCotKmknJ2eqpeYl5aXlZahqp2bl6itsKmjn4+soqeWnpecoaWhmKGhoqGaoqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20t6ifpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5Omq7CmopaTrZ+lkpShm6SmoJSapqahmqOfrZqgnp2QlpuhnZyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraiyqKmyuri0uL+5t7K2vbWluLOftKyfn6irn5WntquosbKrrbSjm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknq2doZ2gjZSem52gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3JdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsWxurKuu7CuwbKspKKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mxrJWXo6inlJGWpJykrZ6RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy3lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOhpZ6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeWl52ej7CplJynoo5qfmmcpniHc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIiOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqagoqmdopuamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCWlZ2fnZexpZiiqJmckZ2co6OZpqKanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMmJeHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLShnqSlnKOVlqCrpqyjo7asoJmWlp+XramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6dsKCdoqaVmJOYlKChlaOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nJ+no6GdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmZ+ok5iYnZGlmZionZqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefpJ6hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6qokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZeeqpiefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9FMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYm6OgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajo6ehpaWeramRpJupraqcnaqcrKGWl6WWoaOXnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4d2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil5+pqp6UoZ+cna6vp6qpm6enpKKrkqy0lqaiq6qeo6emobCgk5qnmqCalJSRl6BwhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkJBlb3R1cGBnbWRfb2lpbmZjV1NcYVpRUUI5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqqSjrJuvsaKorK6mmaarqqqxopKXo6SalJKEpGqkdYl6qXR6snGCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqScG55d3dvbGZkZXFwZntoY11XYGpYWFRLTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqhlJyfp6uro66arKqjoqujs62iqrOxoZuqqK+wtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXkoBwenR8e21bZmpycWaBal5iWWNtXF5YSE1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqaWdprWfopeTqKq2sqybppyglZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl52lm6GjrqaXoZWZnaWmq5qvna2op56so7esobK5r52br6eztLOklJiopJqfjoKdTniagX+feoOjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32ZlpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6KptLiknKKdo5OQobGZnpynpqGir66dpKiitbLDsa2qraqRh5Ccp52jpJyll56ZmZqmpKiarqGupaaYsKW8raG3t62enbWyubGzp5iesKKknoWP0bXDt3mHjoWRk49/pniUoneMoJKEpYGKcaqGhLRucmqZo5uVip97lpiGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2knamSlJeuoKCepqScp5y1mqCqo7Wrw7Cpq6mijISOnKKhpqKVmpucmZyZpqSmmKunraOlm62nvqyVvrCtn6Ows7qstKebqbGlp5h6qJB9fLB3ioGkpYibbLFvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJiVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkaeZg5SMlot6eoKWfmtsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62grrilpI6bpKOgr6+qn6Sfna2Znrmgoqqgr6qaraGQqqiklombkK6wrKefp5utmJiPrKKhnaWimqWcrZifqKa2qcCvpaqkn4uAjpyan6aekpWampSbm6akpJqorKyjpKCqqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2hj4OmlZqBrIqEsIWlmaShoY+EoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkZaWe3iNnH5kc35ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5yspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrna+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop6ln5qjo6WZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuSm5ipn6GZqK6npaajpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpamPftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPm5KXnXqBkJt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajrKGknKqhmIujkqeep5yaoaiimJ6grK2qua6oo5uXk3uHmZGmm5KOkZiYj5mUqpqgmKmpoaqnoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eto3JtbW1linhvbYKZcYB5aXBpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5mRlp99h46VdmaHeGiNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6epLKpmJK9scPIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaanr7qrrJqbk5N7hJeNpZiNkZGYlI6YlqiUn5ipo5uxp56jrLqfsMGnpLOmrLGyq66sqLmkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVqqaMkpKMh5KcnJSQmpOYkI6VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCWmJahg4eTjXFpkHdwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWn5GJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4d6cpZzeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKejlJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJmnjJmoj565tqSlmZuNiXmClIuak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqyu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJWLkpyRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgniYaYOKgm55f2twZWB2b2traFtmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+yppqqpquXc4ydsJ+oqqaUlrmgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlpOKlJGQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqjr7eBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgpGXloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6SiYKDmWqNjIVreHtxcGdkd25pbGtbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5GfkpegpJaerIiftIm0mq2Lyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZg5qAjIyDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdtWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqklqWptqOvf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZmYhqK5rqWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21salhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraGdrbWiqJKhoKCmnJmOmLSZkIuejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RgnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpq6cm7GtrJOXoZmhpJmalJ6rm4uJkniLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHf32PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um56wqKudl6SaoZ+Ylpago5mGiY1qiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBhnl/l4x7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8ZGRhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaGMeIWNiIeSmZV8k6Shn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZlwk4OufaSDpp6agaNvXqhndaNjb6VhnNKQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294eZdrm3p3l3JtqaRnYGV5cH+Da2dmZG11d2dgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJiFmaigoKONpKigmKmJmZiYk5mTkqCYjoiGe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoiAboKfhneAk4aImaKXepSjpZqfibOhoraLeqynpK6lcKmAmpCFgZySfKSAopmGmHKehKKtromXjICMpI2Wg62hlHa1tbXJoXOUioGfYJ2WqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtqtLW0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOQgJepoqKljKWnnZylgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+VpqmclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2YoZWIbXJpq2p1oG1upmCbaIqQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAjnNoj6aEfYaUjYmYoI6Ik6unnYmmeJacf6WJloyymJ6Qg6+Xn6V4lYh6qXSlj4SabqSijJKEjIO8bnylr4KGhYaSlpyffKV6caiVoJZnnn1uq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01dUl1JXm1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYqDmKuanqSJmqWdqZyEjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSrpKCQgHWUl4l/gXmUrqN/gZtxj4Z5kIuEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXFobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUl9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyro6GEhJiskp2giZqmmqiYgoGbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSbgH6Jlq2oj5OmkHhvnZGDepJvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIuMqrGhkKOhmp6emJ6ZqKOifoOYrY2flIebopCllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm5+Pgqahh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaugoqKji4iTnJ2jmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkYSFjYiDjZCMfYiLiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNcXGFsaXV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5eioZiVmZiUmaSgnnt/mquOno2Fn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfoiUhG1sfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqamZCapqCmnZ2QloGRind8iI6EpXt8jpCRhpipoZ2TnY+Nq42RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqFhI10gIp8fHJye4iEe3mMj4STp4+GhI+ChIqKineGiImLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl5ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5uipJ+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2KkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt/joV5gIOPh6CAfYyMj3yXpKCgk5mQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLc4KHfHxweXuMhHp7ko2DlqaTi4aRfIaGh4V2goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Ta2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpqWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iFl42dfoGJjYxzl6KeoZOZjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXyAh3x7cX54ioV5hZGKi5iilYGEjXeIhIOCd3yBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmFeW2tkUmJXYGFoa3Z5hnFiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJyul6aono2Nl4eGn5OXmH14qpyKmHmXnIuMmJB5e4GLfXyDe4CCgHh0eXpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnSOjotshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeAfISOhYyUpJB5hYJ0iYd9gHR2gYeDbmB7dXpxfG9hbmNle2Jub3Zyd3dzdGF2X29sdW5vXFxfXl5qXk9dV2NhaG10e4lrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCjqJ2KipGGip6KlZd9d66YjJZ9npORlpSId357in18gHZ3f4BwdXR7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FviJmEZ4aZjpR6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWNioWNlaiNe4h9fouFeH5xcICFg2NoeHR2cHtiXnBha3VecWp6eHhscnBleF1tbHNtc1laXmBialpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooKabh4yKgZCchpOcdYGqlJKNhqCMlpOQgHR8doV3eH9yc3uFa3Nwem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXqLh4SJj5yjiHyEd4KLf3h4b2uBgoFdcnNxcXF4Wl5wYHFrXm9pfHlwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOPn3WLn5SThYqbjJWNi3pyeHSCcHKEc3F1iGxwbXVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlIGUf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox6iX6DjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYV9sbnlwZ3BmZnN0aHFrYXdlXVdmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcnJ2blZN6jnZoiZKHbIijhZKHl4OGY4yRmY+ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9ra3l5XIB5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMa35+boCMf4yHfYR7g5CVmpqKfHd4g5F5c21mcH+DbGp0b2hqdG1TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19edk9OS2BmY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fImch4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pd4x2boaJi32Ko4SRiZ2FhV6LlJeKj4iOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuBdm6IkYKQhX+Ce4CRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaXZnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25aXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHeIf3CFgomHmaKDlIyeg4lhg5WPh4mGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1tgmx4hpCGk4R9gX6BkpOQl4lvcnqNhnVscWtyeIBfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g4CLk52fhpWPn36IYYCTh4WIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrYo2Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cINmeYOKh4yDfIR+gJSQkZOEbnB6jH91bm9qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpKRg5qfm6CGh3Z2lH5tdpOXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGV9k4KAhYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXiDh4uGhHiDfIGXjZCMfW5te4l9d3VvaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2RmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyUjYWemKCZhYhufYx2aniYjn+CioKVl4l5jpZvenNwbGpkYHR7aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQi5B4fpWLhZmRjYZvbIaSknp5koaAhJiKfId/eHiJioSWgG+LiHF0fXppeYWDpZGEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KDfYODiYNugXhogIR4cn9/goqGe2V9foR1ZHBzgGh4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygG5xhIeOhIVzhHiAmY2NhHhub3+Ef3d7ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZ19bcGpneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBen+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjH6Sjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd29cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RvWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHt9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaFloVzjouKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5cZ2ZzcVFbe05ccFxPW3JwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bFdXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpOCc5GNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4mJbHl5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2dUVlZ3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx1dn9taHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyFin97kYV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z7fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyHhIiFfXh0cm5oeWBqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIx8gWZ1h31tcWd1fnh+f3J9bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk5oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHFlX1hjc3VpdXBlZWNXXFxogHBvcoB0iWVleH5pdHZzc4OFeICEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd0Z3CAd4J1YneFinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpweXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paVGJuZFtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2F3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcV1JTVRZZWt3e2VebXFpZF1WX1VubldLVGhYZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYlZcXGuBZnJ0fWlqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVidIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxYWGdsdnpkZW5xZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BicXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHJ7Ymxsc2NhWlpbYXZbU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB3f3J6enpkZnZnXWJaYWdbXndoV2Jeb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIT1pWa2xrfGZtb3FhXFpYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWm51bnF1dXlrh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFhUVm5pZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29ndGtleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdnNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYGhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZGB4aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4GDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Pj4+Ojo2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8wMDAvPkREREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0cHBwuNzU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIWFhoWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQiZCPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4eGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFPTk1PT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0pOSU5OTE1PTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDRVNCVVBIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9GWUNbVj5FRUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUNdRF5hPkFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj06Q2A+XGtDQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5OTpGZ0BcbT85ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0Q7Pj0+O0ZpS1xtPjo8Pj0/P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdcEI+REY/TWRYXWU+PT07PD4+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6Om53Sjc8OUVaY2BgZEk7PD1EOjs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAW1E8PD1MUElIdndPNzg5VGhtZ2hsYEE7TlE5Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQEV1eUg8YYGEgHp7d1xGPUFlcnRsbXJtT0ZmTzo9PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSXN5a2aEhIOCg4B9YFhRRmJxcnFvdXFgYGlKQEJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBHcHR9goKBg359hHRKU2ZYYXFydHZ8dGttY0lKSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVpc32BfH+EfnmGcUJIZG1sdoGGh4eEdGtWSU1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH94gISFg4SKbUBPc4GFh4eHh4iGZ0pMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goOEg4WHhYeCVmyEh4eHhoeIiYh8UUtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoKEhISCgoaGhYOChYWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Ag4OCg4SEhYWGh4iIiIiJi45mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSEpMV3KDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GT1BQVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceYWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRURJTVBHSUtHSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtLTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSUlMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRDxCQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1CTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSElFQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREhERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGR0VJRUZESUlHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OT0tPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NISEhHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhqbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxNS0xNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMSExMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTElJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUdGSklLS0lMSklGRUpHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkZJSk5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpMSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS05JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JaXWJkZ2lqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUUxOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVVSUlhWVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFNSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FUV1VXWFZUWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWVlVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NXVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x8fHt7e3x8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2Ni4mJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjJCQkJCQkJCNjIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3h5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e319enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn59f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAhH+DgX5/f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f3+Mfo2Ffn9/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/gZeClIx+f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKGnoaXlICCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoqhiJmah4eGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGBi6OKmpyJhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODgoCNo4mXnIiEhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgY2jj5aZhIKDgYGBgYB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjoSBgICFn6apqJeCgoGDhoN/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiYSDhJitp6usoI6BgoSQhIGBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmPhYWJpaGZpaObnomClJWEg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2NnZmThIiflJCfnJSdlZKejoKDgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX1+fIKXk6GdjJOSjZialJmhoZuHgYGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlp+Lfn+AfYeLf4SGlailn5KRlY+JlaCdmYSCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGSoIqAjIV9hoiBgIaJnKGikIN/fn6Clp2RgoODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qQgoSKhYOCgX9/g4iPj4aAf3+AgH+CjoaDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiIF/gIB/hoJ/f4CAgICAgICAg4WEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/f3+AgICAgICAgICAgX9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyIgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4OCgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn9/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WFhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8e3l2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4CDhISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoaCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aHh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NPS09PT1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX19bT0tLT09TU09PT09TU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLe909LS09PS0tLS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6Ohq9LS0tPS0tLS0tLS0tLQ3+vr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSko63S0tLS0tLS0tLS0tPS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaiw0tLS0tLS0tLS0tLT09Hf6unp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS09TV1tbW1tbW1tbW1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0tChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6ooKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaakn5aQobSVhp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2aip2gp5m0v8mXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mZ2lnoygxNKSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp29m8XJlNmto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sixp2TlqO7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izbKbrrOdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7usn5qhnJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTmKGpn6KeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqzjZCl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR1sC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46JiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwMS/wc/Pzserr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMTJzMrSz9POvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPFysfK0M3QzMfEwMPCyc3HxcHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLvIxsjNyMPIycnFxcPCwMW1wsnKyL7Fx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5x9DKxMTAw8HCwcPCw76/obfBwcGgusfMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMvUt7vAwby7xb27wcS/v5KnvcK7eqnAycTAwMrAscG/u7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8Hel37JvMO1use3trm7vb2Km73GtmCVwMXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQy32AuMTHt7m4rre1uL21gJG9yKxWfMDGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uyvb67xLa1uLW3wL7EvMLE1qp0d5DGz8LAuK+1tbvDqnmJv8mdVWa1y8PCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOxuby9sry+vMW4sbe5vsrKyMPGy86Kc3SOzNHMysS1usDEzpdxhcHHkFhal87Gwr/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzPzLy6vrzEvre9vLCvv73By8mxenV6jcbMy83KxsLEy9OEbYK/voZeWHrKxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLbAuMvYvb62v8C/r4V2b3t2hJe0mXF5e4+/x8vIwcPBwMnLc2l7ubR8YVdoxsbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xXJ8wcy8trnDrYdnW2NeUFtfcH9vdnySur/GwLnAvL7GwmVhcq2zdWFWYcHHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5xcp0Z4a1vba2nm5qZ1VfW0lMUVNeb3OBnri4wrqzu7e7vr1hWmSgtHddVGfCw8TDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS1t8fGfHRphaW2mGJTRV9RTWllU0xIUHF4iKGwt765srWyvLq7Z1VXmLx+U1BywcTGxMC9v7mzr7G8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDuYV6bm6OoG9PSUJrUkNce4eHW0ZXiKansLa6tbSyrLy6unRVUIW3gUxUgr/Bx8O/ubq1raWttrGmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ur2RgXdyhX5XRkJXiFFLTmF9h35RQ0+GurKztbK0r6y7urqEZlt4n4FccZe5u724trKxraugra6onaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK/oYeDhH1mTEBVenBMSkxOh6tvVj9zvrmztLKwsa2wurerjoN0haWpqamtrrivqqutrKOorLSnnZeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtaqTjZCbY0VWnXlSV0hRYUl8f2Njd665sqyzr66srbeplY2dpKmkn5ycnZ2nqJ6gqKihqbexn5aXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKq5sp6itVFBep13WGtKVWNpdnVkanqdsrSqsrSuqqupkpSrr6edkJeTj5ignqGgnKSlraepoJqWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigsMG5vXxPS2yqXGp+cXZTXm9hYG1ogJaxr66ztaqnoaGjnZmUjZCVl5iYnJ+iopufraqQl5eXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGfnJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaHDwYBVVmZwfXZtZnpyVF9iZGpsYmxwlLSwsLispqGdnpqVmJqZkI6RlZGMjo6UnKOMdpeampeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqesaWQe22GcGJlV1FcVVdLTlVaVE9fWWy0s6uvp5+eoqCXkZSboJuYl5KTn5yhpJiGbHWdm5+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhooRkWl9pYVZOUEY/P0FERUJHUkxPqLaqqaSfn5mSkpSYmJaVlYyIi46VnZ2eeWGGn5mmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5mBX15mYFJFRTxLPEY8Qj8+QEFNeqmtqaqln56eoqOen52anJuUk5WUnZ6Yln10k6Kaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz43Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can6CJdmphV05EP0xffmxfQzwzNUt7qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhvgp2koqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZcWpgVUlFQEFSjZ6kilBHXo2urKGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXGOpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelGVYUExFREFGXr7Ww6OTo7Ouo56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm9y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtcTENERkRLVXi6uKuvr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8K9xNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KjXkU7QUJJWmyarqyom5SXn5yaoKCem5yZlYl3aWNgX19fX15fX11ibHV0cHBvbHJxdZLEx8XU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjsHNEQEE/U22dsKifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMvA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M7OzM7PyMvQ0cvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppap/YmdiaYedn5uVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeYF9eXGJtcm9vc3R2dnmkvcvV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62Jc4SHocOqloyMl5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBgX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raS1c2N/gLaskI6Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb3B9uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGwsWVleou2kIuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr55caXKXlIuIioR4f4aGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xu7awtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFv765t8m2qrGSXG11kY6GiYl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFfZGVjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKvsC8wbqytLTDrqmwjl9vgJCIjpB7eH2JhXp7hIB3bl5dXFxdX2BfX2RiYmNjYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqSnp5qgpaGanKWrrqSooqyqrauwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0tbu1sK60u62nqpFpaYeEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCboaWUnqWbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmysLq6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrOtn6GQZ2yGhoaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlZqhlpyjmZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6u4ubChnqirp5adkGt9hoZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtxjaidk5SUm5ibopeWkZyioqienJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axuLqssbSunpmjqZ+TmY10gISEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbi5r66vqZuYoKiUkImIf4F9d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYl56ji4hziYh/d25jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkY6Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaumlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6impJmlr6WVmaWvqqCcmZugnq+anKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+snpiZnJSTh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Nl5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdpratop6OlJWRjn54fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298i5SJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmWhZOOioZ9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cXSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjZuNkH52hXd7dW5uaVlLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeoiNiol1cHttdHBpbGpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhYuFdG50a3BsZGtqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0ent3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FOR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+DgIN4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyuLW0rra2mWR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Oxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVVxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4dHt9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jTxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnLy8/Iw9HK1NbY19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQD4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eZnKmmpq6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZKVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dYOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rnI+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUkIyPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ+Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPiJeXioSPjYF/h4+liY2TqZqXk5aZoZifmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qzoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O3jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePmI2LlZeUkJqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKPiZefl5OZlZimoK+djKqcjpaPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY58kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwc22yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wcLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ekl5SclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2drqCTo5+XpaCnqauXtrGjqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpZaSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOhnLOnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaS1qZWyrKeipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnZSMjpmQgoaWiZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6GptaqdubCro6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5qSho6Zi36NloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqr6ujsbippbWzrKGttb2us7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4q62qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWWk4CPlIV7j5KDjJZlbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmmrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub20qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZaamrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bnV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lpK6utam3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJWbmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V8flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5r6mtraaorbCmpKSuo6mcnpybsJqio6OjkayepKCfoqqmprmlrLW1paqrqKyvtq+jnqOoqpugmpqSpLSaj4mNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6urayzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqKyqqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKtpqOtrLixsqGpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiXZsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbPk1GlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xr7Kts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGypKamoaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6SIeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SjqrCYq6mttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlra+rubCosbGvsau1qra1p7S2rKykqaqco56zs6iopLS0oLWtoamoq6irp6Crq6i5tqmqqqqiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gIidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9JazdQRTuVjrCgpaqtmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova6srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhoWEpJaFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3R0emmBhqN1aV5lbIJ1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb2qs6+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK27p62wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI+Be5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3ONbWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8MlBbPSOSmayZn5enpKKfp6O4r66ir6+pq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+isa+hrKGspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfXyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/cmN6bGlmZGFmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9aWTUol52lmJyWraCfoaSht6uxpLS0qai5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG1lcmlrZmldZHOAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYlUsMpajoZeUnKqdpaGioLeqrqC6uKasvcWzr66ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKinMG2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6Uk6OopJCIio+GeYR8hYZ9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnZ2hjZmlqYGliaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKepKORjqSnm56enaO1rKequbenrMPBtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelJONlZeMj5iaqaCRiImLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Te4OVjoZyfX1meG9ramxndXNrY2dkZHV/YWRmZmVqamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanpmeo5qknZeemJuUmqCSqJWqp5uTm5ySjJWZjZSUmainjY2KiY98gnSCgYuYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2Jyf2FlaGpubGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCZraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCckZujq6qpu5+opKCYmpmeoY9ropaYnHGClpukgHaRqaeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRnX2RmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy7laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmZCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6aqnpKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GWF5pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrJyTmZ2VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFcXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cer62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWk5iSmYWvamqKjap+Z4SVh61lcZ2clJmllXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK4usKnqbCrr6mpsK+ksLqwpKWus6Opuames7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uhnrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5WVqJR+a4GmeoKFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1tkWFxaQj6weFdYQSNNaUVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinqiqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaWPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoR9poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp+nqbCotKmknJ2eqpeYl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZikjI+cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrZqgnp2QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iZoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopZ+UmaWonZylnqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVoKGJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adl5uopp+MkqSXqKqmk5epp56foaOtpKGeoY2UoZifoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1qdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Rk5Srtq+nmZScrKqXjJOlmaWsoZGXqrKkoJ6oq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIiQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqquxp7mvtsSxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSnraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mwq5WXo6inlJCWpJykrJ2RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy4lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocH90kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpiXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlZ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLSgnqSlnKSWlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYlKCilqOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziGhqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46Bd3qBf3lxen+HcXiFjJN5bXaSYmZfeGRfZIBiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF94ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil6Cpqp6UoZ+cna6vp6qpm6enpKGrkq20lqaiq6qeo6emobCgkpqnmqGblJSRl6BwhYyXdYSoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XYGpYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyqlZGcnKGZn6WznZqhlJyfp6uro66arKmioaqjs62iqrOxopuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWWNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWfopeTqKq2sqybpZ2glZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl5ykmqGjrqaXoZWYnKWmq5qvna2opp6so7esobK5r56br6eztLOllJeno5mfjoKdTniagX+feoSjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKiitbLDsa2qraqRh5CcppyjpJyll56ZmZmlpKiarqGupaaXsKW8raG3t62enrWyubGzp5idr6GjnoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamSlJeuoKCep6Scp5y1mqCqo7arw7Cpq6mijISOnKGgpqKVmpucmZqZpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqiklombkK6wrKafp5utmJiPrKKhnaaimqWdrZifqKa2qcCvpaqkn4uAjZuaoKaekpWampSamqWjo5moq6ujpJ+pqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5fYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20mKCzqKqrna+tnaubla+poo6Im46vrKmnoqeZrpOZj6iaop6ln5mjo6WZnqOpsqi8r6Wonp2OfIualaGgmZCSmpuSmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amspuesZy5qJ6trqWmlZSwrJeMg5uRrqajrKGknKqhmIujkqeeqJyaoamimZ6gq62pua6oo5uXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCrrKOgp6yfuqOkrayspo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYlI2YlaeUnpeoopqwpp6irLqfsMGnpLOmrLGyq62rp7mkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOPmqeZobW6qKuZmpCNfIGUi6GUipWRlZCQk5elj56ZqJ+ctqOdp6y3p6/BrqO3pq+vsK2pqbO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJqojJioj565tqSlmZuNiXmBk4yak4qVkZSQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6n6myu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrquiZZ6fk3N5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ycr5+oqqaUlrigoI+co52Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSooJmYi4l1d5ONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqirreBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fZmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTlp2Gn7myp56bko6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZiXhqK4raWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipiol5makYelsKailZqIiYBpboiHi46OiouNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3uHf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6PiI+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHidequaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIiSmZV8kqShn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6OFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAk4aImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa1trXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6aEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1td2BbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgYOLlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4Z5kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYSCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1sfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2eX5xa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCFg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOj4pshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9qcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3pyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zeb2JxYV9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqgmCIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR5gY+WmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19ddlBOS2BmY115cYl0XVxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXtlh35vcGyAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5uYmY+Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeX+QlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5YanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXB4bIt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5hpCGk4R9gXx/kpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eHiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY58kIx+ioV6dXuCenCGgJWZjpOUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cYNmeoSKh4yDfIV9f5SQkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRab05IT2dlXGducX9rWltjc2BcY2x3ZGVdXFpsbGJtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfICXjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17bllbXm1jWmNvd2RmXF1gbGpjbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeYWDpZCEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHiAmY2NhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneHBaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2xvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDkISLcoF5f5eLi390bmt2f4B1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjoqJd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qbYGCdW5dZ2ZzcVFbe05ccFxPW3JwZFZLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMh3JycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaWyHgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVtioRtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dldQVVheYXGEb1xgY21lZF5uYlRcckdCZl5dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYR5eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhcX2VfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx+d3hzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyIhIiFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1uhHRkdYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXp4cGZsYm6Jfm1uVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWWFjV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxogHBvcoB0iWRkeH5pdHVzc4KEeICEeXZ0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4J1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucX50dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iYWDa3V8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paVGNuZVtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4anN0dG2EgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bW92dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHg2tygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYVZcXGuBZnJ0fWlqXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbXaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIhqc5eBe4udfX6FeoF6fnyGiHNxj66Me3uHj31lcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB5bYN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3t/iJR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB2f3J6enpkZnZnXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tleGRlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Pj46Oj4+OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLzAvPkRERERERTguLy8wMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHBwcHBwuNzU1NTU2JxscHB0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODg4ODg4WFhoWFhYWEg4KCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQiY+OjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoaHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2HhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFAQENEPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj07PDs4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5Ojs8Pzc9Ozo6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PT9APT09P1E+PT09PEFMO0xCOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RAPTw+QEE/QTtaeU89Q0U+RFg8WU47PDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48Oz1APTk6Om93WTc7OjxHXj1gXDk7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFDX0k8O0ZjZ19Xd3dYNzg4OE1iQmVoPDs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQE98dEZGdYaGhoJ8d1k8PT88U2pHZ2s+Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXZ6cHaEg4OBgoB9WT5AQz5Tb0xkaD07PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBQdHN/g4CBhHx8hW1GQkNEQlJpZHNySUBDRUhJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUdsc32AeX+FgH2Gc0ZDRERNZ32HiIh+WEdIUVBMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B6f4B8goSGhYWLbEBAVneGiIeHh4iCWFJeTkxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLTlx8g4WEhISFhoiAVmyFh4aHhoeIiId+aVZLS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKWoOEhIWAgYWHhoOChYWEhYaGhoeIhol7S0lGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklohYSFhH+Ag4OCg4SEhYWGh4iIiImJjI1mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhYSBgIKEg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaIWDgYGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj52hIGCg4OEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89SoGDgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJVhIKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRVqFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDR0dKW4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNBQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRUNJTVBHSUtGSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSklMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0lJR01QSUZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRURERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGSEVJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUExPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSUhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSERESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVllcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQkNEQkRJREdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhGQUdGSklLS0pMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dKRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUZFRFdVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYVGtUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVhzUWh6bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1taXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVU1JVU1RUWFlXXVpfYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWltfXVZZX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFdXVFJSWFZVWl9aXV9fV19dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VWWFZUWFpUU1FaV1ZcXltfX2BWYlxgYV1gYl9cYF1jYWNnaWRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVYWFhVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl5dZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2FfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9fX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x8fHt7e3t6e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjIyMjI2Ni4mJiYmJiYuMjIyMjI2Ifn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+Pj4+PkJCNjIyMjIyMj5CQkJCQkYt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn18f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4B/f39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39+f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGChYeGh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KGjYOMh4WFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgYKCgYiTgJKIgYKDgYGBgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIKDkYeAf4B/i5qAlY5/goKDg4CAf3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKCg4OCg4mZjIOChIGPnIOYkoKCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIODhYWEg4OBgH+Dj5qPg4WEgpKchJeUhIKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gISQiYOAfnx8e3uMnY6AgoKBkZuElZWEgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/hZuUiH99fXyBgIGViICDgn+PnJKYlIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEm56JfoOBfYmJfoKDg4SCiJ+goZOJgYKCgYSHgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKVoIiCjYV+g4V/f4aGhYWcn4Z+fX1/goOHloyDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4uSgoSGhImBf39+goiGhYh/fH5/f39/iJ2ahISEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISCgYCBhIF/f36AioJ+f39/f39/fn+Fno2DhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgIGMh4B+fn+Bf3+Af3+AgH9/gH6Dh4WGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAg4mFgoCBgoKBgYGBgH+Af39+e3mAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4J/gIKFhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4eHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4GChISDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaBgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f4CBgoOEgYKCg4ODhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SGhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N8goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYF/f32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWEhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/fn+Af3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDg4OEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYWEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhIeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4WGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/PztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9KooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNaynqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3InpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoq2alq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJ2tmIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCjnJ2oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonJG5r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqClppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeczaCrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttfFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkM8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqampqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndWhqaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfBy8vIxszKzsXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8C7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcLDv7++xMvIysvJvLzIyMnNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAv8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxru4zt3Ow8TAw8HCwcPCw769wsDAwcLLw8bMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7tsC3wN6ekMK/wby7xb27wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tLe/utDDfYbKvsO1use3trm7vbm6trvFxcq9ucXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubm5v7/XnXeBqcTHt7m4rre1uLq0t7O7xcbLwbzGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLa1uLe6w7/FvMHOxIB3eZTGz8LAuK+1tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub6+sry+vMS3srqwo6e5s73HzKJ0eXqXz9HMysS1usDEyL+/tb/Bv8bGv8vGw7/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Dc28W5vrzEvrigd2tvcWuAlbiHc35/mcrMy83KxsLEy83Fv7m9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLbBiq3YxL62wL6dfWRaZ1JOWFx2fHR+gp/DxsvIwcPBwMnKyMG7u7Czvb3AxcbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7trrAt2VupsnAtreGYmBmVGRdTk5RVGh0e4ikvr/GwLnAvL7FxMC1urKwrb+5v8PHw8O9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri4y7VtZ2+YtbiEWU5GZkxPdGpgT01YdHqOrLi3wrqzu7e7vcG1nr2usLC2s7nBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uM22eXVlc5yiXk5HVXpMSGZ+lINbQ3WJmauxt765srWyvLm/qoi8s7O3n6i4vcPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7bHs4B5cWyLdlFFR3R/TU5PX4qBcEZSfqa0sLa6tbSyrLy5vp93uby5t3aUvbzBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO3vbmNgnp6eWRLR3t8YU1JUWWnpWFOSnCuu7CztbK0r6y7uMGMb63FuK1cdrm2vLy4trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO/nYeHi4haRHaXcltaSV5gUpFxbm2gwbiztLKwsa2wubi/cmegwrKwp6WxrrmuqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtqmWj5OoT0p9s2xqcV1rXnVxY2Nuh7G5sa2zr66srba3tF2Dpauknp2dnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKmzs6KtlUxUcqZzdH2Mc05ubWVwcG6TqLaqsrSuqquvsLChsaadkZiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigrcG/qFdaeHVucVpfZGJcWVtpbGJmc4Oyr66ztaqmrKujnpmUjZGWl5mZnKCiopydpZ6bpJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnZ6/t3hjcnxmZ2VXWlpRSkdLT1BMVWJfm7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeqaedh2FYZmhcTkpGRD5AQkVCQ0xWT32xrayvp5+eoqCWkJOboJuZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgnn9jZWZYSkJJT2ZSS0FDPkBGSUhfo6qqqaSfn5mSkZOYmJaWlYyIi46VnZ2dnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjoIt3a19SS0NEVn+Lf2hGPTo6OThRhaqtqaqln56foqOdnp2anJuUk5WUnp6YlIadmqGaq6SssrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2ir6aho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGRzk1Oz43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can591aV5USkZERmezxMGNXVBJQk97qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqurs7y2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyXaldOS0lISFN90cu0k5yOgpavraGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3NxbnGOpaywub3Fu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyek1xNQ0ZJSVlmkrqsjYO0ubGso56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlycnBseKbBysrFysHT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyca/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ5eSD5ERVdmhqyfnqGtq6OcnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB2cG5xc2+Iw8/NyNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3Lz8bJyL/Ew8fOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGpcEdFRUhihLzEqquqm5SXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHVzcXBvbHJxdY+9ycXU1tfX19PWz9XU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdHLztDAxsPIxs7N0dHRyMzNwMrMxtPOzM7IxMrHx8jMytTU0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjr4Jia2p6nMK/rqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3mcq/0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMysvS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp5Z7iIypzc6xm5qVlJabnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvcvV0NXT09jWzs7Uy83Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7iysr6xu8PDtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFhYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK54ZYODus6qlI2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JxcXJzcW5yeaPF0s7L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raSwZmZ8jNGrkI6Nlo+Gg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299t9DHycrOy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKypF1qc6a4joqSl4Z6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvco/FvMnEy7/GwbC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwra/tbW+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3AxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr5JdbnaokouIi4V4gIaGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J4nLzLv8K6wLeusLGnqq2sp7i1t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL65t8m2qrCIXnGBl42FiIl7eH6GhnZ3gXxzaF1dXV1fYF9gZGFfY2VjX19cW15cXV5aXFtdX2twbmlmam1ucnukxr64t7Svq6ynnqKqp56rrbOtqqyptK63sbKprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsHHyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmwjGhshJKHjo97eH6KhXp7hIB3bl5dXFxdX2BfX2RjYmNjYmBfXVpbWlpdWlpaWlxkbm9oZ2hpa25xgay4r7StpaSnp5qgpaGanKWrrqSooqyqraqwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaVxhb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766ybfBw8G0tbu1sK60u62nqY1pYIaEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmVnZWhqb3KFqaSqpZ6boaWUnqSbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbakoKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PBvb+1uLy9vrzCx8TCw77AxKCDeHFsYWZfa29gVFleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKGNZG+HhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4ecqJ+VlZqhlpyimZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrK1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vcC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLe+t7LBtLG7u6u4ubChnqiqppeekGZ+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKeck5SUm5ibopeWkZyioqmenJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a1oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbq2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smoduf4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5WXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6CinJmZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mp6eyrbG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tLu8tLi5r66vqJuYoKeTkIqAfIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLWeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xaq3t722vbq6tbKrrKaYl56hi4hzhYd+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVFJVYGBfYGFfYWFiZGqAk5OJkI+Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqGilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZVUkdRT0hZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaqklJmam4d/cYiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHj5GPmpOVk5ybo5yboampq6isp6impJmkr6WVmaWvqp+cmZugnq+anKuzoKWmn6KjoZSTm5aWkqmprJqcn6GgmpSQjJmOjJCMkY2WlZCdoaCjnZujlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQjw/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWon5WWl5WGeXSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqKedl5CPmp6ul5ioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThomNg4+LkpWRoJ6ho5iVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopuclpaTgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ2omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6snpiZnJSShnqCbV9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5iajHONg36Nl5aGkZqQlI6Oe5mPnIyCiX+JmJ+jnpCTmJaFjYOUfn50io56kIeTkJCdmpqakZWQnY6io46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRktKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdprWrop6OlJWRjn12fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTiV87Vm98i5SJgIySjJCGhnOKhZaBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uPiZyIn5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqKijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxaminZiDlJuvoZiWhZOOioZ8cnVdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+Ud3V2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6ivraq1vLa3t7PBu7anuci4tqiotbaqsrymnZaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c251cHSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW5uaFhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFVYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6TjY98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWVdZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2Ziam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGBfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHF0ent3im1oamJ5b4WQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1tdVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGTh3qFdmt/jJGCfYqEjox4g4BzoYSLfXyBfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqcdG18gYaHfY5oZ2h4fm6Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzc6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8OTg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYOhlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbISBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUZCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3aVkquyiI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg2PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6O3xai2yce1vrm0qKO0rbGxm5mSmp+Jp6+rpZR2n6SXoauxs5iWqq2orra7srqsr7Wisauxtbu3tK61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hIeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWkr8a5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSAinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlZJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7m2uLmyt7W0rra2mGR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0FFRkQ8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHta+5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/h4GGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfn+Bh3mEdYWTkYl/b3Zya3N8fHZ8c4F3cWuAc3Job3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1dlZFhla1NYXVxgY11jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWqVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzc/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4c3t9g4d3f3qHkZaAg254cG11f3Z4fXOFfHlth3Z0bn12hHV5e521jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKOxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xe4Fxg4eBbo56dHd8fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46TkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIuGe5uIk4+uqpSVl56Ypq61vamtvcbLyMnLy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXR5kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhpd6iIifl4+IjYqLgnyhiZCLvKGXk5eZnKelpa6eqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DCoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6Rgot/pZmIhI6ChoSApYaKi7iYnZGVlqGmoJ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dIOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhYCLiJKNiYqdlpmjo4aSnZahioqIjpyQg4iPgIOHhaSGjJCzmJySlJehoJ6Zkpydp7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gXyGfHt3hoR/c3CFgnp1dnZ0hIKEfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjISnkYSZk4SZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4iPh5eXioSPjIF/h4+liY2TqJmWk5aZoZifmZOcm6KztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHin2Ko7Ono6qzoZann6WklpWuooOQuJWSs5mMoaCMpJuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJKYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIqXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vnpuhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmbWdo7ikla2klqmtt6akop+ZqZipo6+wqZqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KXjJCVjYuMl5iSnZm0l5arnYublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyrq68qpu7pKitubirpqaioaOjqK+ysaqcnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEwq2ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3IyMrB0snKwsy8wbOtu76nub+9vMS3rMGprLK7vaqwqaOlo6yts622taCfrp6lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK+yMPHxdPNzs3Lu8G3r7m8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzDtKaztcvBuKm2rLK6uK6ot7q9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLuqsLLHwLilq6utsbGjobGytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpPSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwcy2yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMC6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrunrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OXkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Snl6SfnsOsm5ekl5mpnJaamo+qlZWoppWtrZmhq7bEwru+tsHCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+3pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpSclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opijn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlYlZMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMO9v7W/wrvIwr7KyLa4tbSws7O3wca2vbC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9taaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmZ+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTZ6foZiew6elorOhnLKnk6qkoKSfrKmsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/EtbmwsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbamt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfo5+boMOopKqyoaO0qZWyrKeipLKrrqm7sqywtbTGv8TDtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrqyp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnpaMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaqdubCro6q0trGwubevtri4xL3Dx728w8HGwLjBxsG6qrakrbutwMK3t6qssbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5uTh46Zi32LloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKujsbippbWzrKCstL2us7i8ur22tsDCv8jEucTBwMC4xL3Bt6+1qKu3sry+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4rK2qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWXk4CPlIV6jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub60qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtbCvp6GzoJqoraCllZabmrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4opeTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bXV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVEpEmZagsKixqa2lpK6utai3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6eisaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1rLGuqqejtp+fp7KgpJScmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNyakpDQ5CZpa6lra6rp6SwsrOqt7C2oKu1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5sKmtraaorbCmpKSuo6mcnpybr5qio6OjkKyepKCfoqqlprmlrLW1paqrqKyvtq6jnqOoqpugmpqSpLSajomNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZaRztObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s8R0iPm6qqoqmwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqK2qqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKspaOtrLixsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiHVsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRaPkxFlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGyo6aloaGslqqhlJqgpp6koqukrKKfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOCgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6OHeGpeYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGP0hGRJaSr6SjqrCYq6mttau2saulq6qpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqmra+rubCosbGvsqy2qra1p7S2rKykqaqco56zs6iopLS0oLWtoKmoq6irp6Crq6i5tqmqqqmiqaCsm5KpoZ2gpKKmo6mdnKa1rqimqaKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuVjrCgpautmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsKmjn6yioZOio6OnmJqopZeXmJ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6Smq6OmpKymtLKxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVwcH1ohXiEh2RgZ2NyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RFg+Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVl5Sfopablqasi56RkJGMgoqBgI+Ae5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXJ4aIBzaoNnZGhhbnOObWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8Mk9aPSKSmayZn5enpKKfp6O4r66ir7Cpq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+jsa+hrKGspJympqiampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32Hf4KOfHyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bwb2l+cWN6bGllY2Fmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJyWrKCfoaSht6uxpLS0qqi5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpn5eanaWTm5yanaaqmZycpZaVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsa2log21mcmlrZWhcY3OAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYVQsMpajoZeUnKqdpaGioLeqrqC6uaasvcSzsK6ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKim8G2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGVkpWWmo6Uk6OopJCIio+GeYR8hYV9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdlb4RnZ2hjZmhqX2hiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGROJzKepKORjqSmm56enaO1rKequbeorMPAtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelZSOlZeMj5iaqaCRiIqLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Se4OVjoZyfX1meG9ramxndXNrY2dkY3R/YWRlZmVpamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kw6CypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanZmeo5qknZeemJuUmqCSqJarqJuTnJySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnhuaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCYraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCdkZujq6qpu5+opKCYmZmeoI9ropaYnHGClpukgHWSqqeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRmXmRmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmJCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6ernpOSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrZ6Ump6VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflJrY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cfr62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWkpiSmYWvamqKjap+Z4SVh61lcJ6dlJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWaHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK3usKnqbCrr6mpsK+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uinrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d/lJaXqZR+a4GmeoGFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinaeqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaiZn5yjn5ygo6SjlpufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yalqWQjZyNpHuOhqOCpYJ6rHmPnVWve4l+n2q5Wrl3hoN8poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp6nqbCotKmknJ2eq5eZl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mpikjI+cjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2hqqSxp6yppJqcmqmelpWYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrJqhn56QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioOog5mZoYmSmoqif5KYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfY6dh5mZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSUnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYyCp4aWoKGKl5eIo4KRh5SqfICLnXlvsVqng4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifn4+NjKmwr6adl5uopp+MkqSXqKunlJepp56foaOspKGeoY2UoZifoJKdl5yVnqCVlo+rm4+ubXK0cqmMdoqmc7R5dLOAkqSikpyNiaSHj3a4b4x7i6Jra7ZZoYZll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpKu5naOtm5aZj6Wjlo2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKjoJ6nq7CYoaOQmaKXoJuWm5ehk5ypnJSRq5mH1JKau3Oww4DDhn7Vlpy4eIiQmIyXiYyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2pqquxp7mvtsWxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirZiVoZCloJONnKOemJ2akJaTr7mxq5WXo6inlJCWpJykrZ6RoKirn5ufqaOynqOljqeilKGanJeVpJiPsKCSlaqehZCZtYCQkYy4lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWeDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssqqesq6m7rrDFr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56rpL6moaqXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vb7Aum6Sg3GUhmByalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxmolocox9hpVnan5xdHh9fWJbd3SBaFBcboN8e4tqWGt6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwaOatLq2oqylrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrKi+p6mmlZSblaCZk5ilqaeRnpCPmJ2wsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlJ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWhufXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpuUoJ2OgnqlhmtpfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGltabAqLSgnqSlnKSVlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZipp7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYk6CilqOel6COlpSLio2Ol62PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZk5GdjX+NZqGzroSJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopammpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKK0yLOfqqSrlpaXmqedqJufpKuUnp6cn6quqaWjq6Gtm5+goZilnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpqPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFebIqJgHZcaHN3d5GAh4Jud4J4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6gnZ+qr6qro6qfqJumn6egrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwcF7gXuRjJrCv31rpbFvjIBvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kcq6KlqKWktKOdopKmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2dra6orKajoqegpaWdramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaGgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2mErnR9loe4YYKtWaPNbo91e9p7f5lwfoiSdX9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gn6ino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kqrCov8azqKmxrpaSnZyil6Cpqp6UoJ+cna6vp6qpm6enpKGrkq20lqWjqqqeo6emobCgkpqnmqGblJSRl6BwhYyXdYWoh3GwfJ1yrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuv1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqqfoqWfqKiin52wrJealqinrqyop6mel5Sao6KSlKGtm52mo6+so6y0qbnNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpGBgUqyEf66CmnaugaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XX2lYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOosay2yLK1qqyplZGcnaKZn6WznJqglJyfp6uro66arKmioaqjs62iqrOxoZuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ6UgdK4tLjJgIGyXl+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWGNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwMa5raiyrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWeopeTqKq2sqybpZyglZClrZGZnKejoKqnrqKjp6mwtMKxsqqtqJOJmJ2kmqGjrqWXoZWYnKWmq5qvna2opp6so7esobG5r52br6eztLOklJiopJqfjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKihtbHDsa2qramRh5GcppyjpJyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyubGzp5iesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1laGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamRlJeuoKCep6Scp5y1mqCqo7WrwrCpq6mhjISPm6GgpqKVmZqcmJqZpqSmmKunraKlm62nvqyVvbCsn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqKChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvZ2doQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKLySmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqmklomakK6wrKafp5utmJiPrKKhnaaimqWdrZifqKW2qL+vpamknouAjpuaoKaekpSampOamqWjo5moq6ujpJ+pqL6kl8OsqqOhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbWZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20l6CzqKqrna+tnaubla6ooo6Im46vq6imoqeZrpOZj6iaoZ6ln5mjo6WZnqOpsqi8r6Sonp2OfIualaGgmY+SmpuRmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8rq2slYGpkqOvjpuAhqSXmI+AgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRrqajrKGknKqhmIujkqaeqJyaoamimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mVlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCsrKOgp6yfuqOkrayspo6WramQjIWVlqyepaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMGopLOmrLGyq66sqLmjrriWiqGopbadiZail4apmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmZOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJjpynlqukoZmnnp6TlaOXqJupmZSmoaOPmqeZobW6qKqYmpCNfIGUi6GUipSRlZCQk5elj56ZqJ+ctqOdp6y3qK7BrqO3p6+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZiYlpCVnpGIoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJipnI6GiombopCunqOVp5+hkpeYm66Lq5aPqJqojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKvr3WkvqOyoHh6oKuyu5V3raSfioCqfmRcYnafjqSdg5d+bpOznKOnrquiZZ6fknN5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhZ2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqaUlrigoI+co52RfoiIm52Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSnoJmYi4l0dpONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqjr7eBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6tq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopafoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePomueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4uTkI2QjIyXi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ef5KFhqykh5yRipiol5makYelsKailZqIiYBoboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh5x7gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3qGf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6Oh4+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd2o7Oio3+IlHidequaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGZsaGhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Ccc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIeSmZV8kqShn6OIroZ9tYSOnp17pZZ5qYKWnZCKoZ19p2h2bX6Zc6BzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpnaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa0tbXJoXOUioCfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dJhxUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVcZ2tuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJr6eEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecl3Bnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oGxupmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2SnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6WEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiUoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOro6CQgHWUloh+gXmUrqN/gZtxj4Z4kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlrjIVbeXhxeXBobn6SiXF/dIGPk5NxhYSCZYx/X4F/i3d1c5R1b3lubodthIVed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxmjHN5e5h4hFtqWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9wd3lsanZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjZSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWlke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZmN5g3qWW1xpZm52W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH17dG9zY2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iSm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgoiRiWt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmuBg3x5mWpyaGBzinB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV7fHJucGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1rfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqg42Sl5WPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG15dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG5rfYB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2en5wa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt/eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnpri4FzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOjopshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2llamNod4dtZmxoaWxogHx6d26Qh3OBg4R9c4GGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5COkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKj5GKnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2xtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9rcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3lyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyZn5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eGd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zdb2JxYF9sbnlwZ3BmZnN0aHFsYXdlXVZmYWByU1BOXGZlXXhwiHxeXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6OjoR2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZKblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6UiZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR6go+VmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlfa3F3ZmtqYmZ4cnBwY193YGBWa19ddk9OS2BmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2jHx0eYaBdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5ucGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l3hoSNm5qYmY6Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2tVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOKbVtcZHheYGRlhV9jYl5YanJrbmtydox9c3eEgXh3e4lxg4R9foh7dIuIiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcWhmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWhbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNygX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY18kIx+ioV6dXuCe3CGgJWZjpKUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GEfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJSPkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJpYlFicnhsYWVdWmqDbXNiW2dfZWxfblRab05IT2dlXGducYBsWltjcl9cY2t3ZGVdXFpsbGNtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3Bte4F3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYmFdnd9gXF1hoGelIWUj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en2NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaGFOZnR4ZWBdXFhugG9zWWVhXmpuYHBPWWtRRFNnYVprbm18blpbXmxiWmNvdmNmXF1gbGljbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeIWDpZCEk4yDf29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2OhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneXFaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiJeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYGViXyDeG52h4SDl3dviIVrdXt0ZXmCg6eLg46LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF0gZqKgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZW5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgYyThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjouJdnBshYOHdXmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmZ1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccFxPW3JwZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMiHJyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnYF/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Rne39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHR+d4BwcX9thHSUhnh0a2B6gnmIj2Zxg29ndm1bbX2AkJN/gHmSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Yn16Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFtiV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kY15uYlRcckdCZl9dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX52eH53gYOBe3N+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmLjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hZuIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHJYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVyf4eFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x8i212gHljg4eXhnOSi2+FhYF5gnRjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveImjgYR/cZmTcYB4dYJtgIKRh3OViIyIhIiEfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXt4cGZsYm6Jfm1tVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KJf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxof3BvcoB0iWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4F1YneEinyUgG6LaW16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f394d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoR6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSQf3yBlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYnN7aWhtaWBiV19aaYBqa2+AZ2thaHl4anN0dG2EgXt/fXZ1bXtoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6h3gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXWxyX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4Ryh3FveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bnB3dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYB7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdcWl51gWlebmxcYVZcXGuBZnF0fWlpXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR1c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1wbnaDmHlygYB8f4iLhn51dYZ5h4t9dHV1gnh6eoKMjn1+hIhqc5eBeoqdfX6FeoF6fnyGiHNxj66Me3uGj35mcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFhdYmOQpWh4dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldmxgZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dW9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2t2gZB5bYN+gIGSiISAdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg3yZknmAgHh5fX90iINzcJmie3t/iJV4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdjaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2jnNbV1NkYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGp5bG9wenx7cYB2f3J6eXlkZXVoXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6DdXJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i25ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUWmBZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVveX51XmZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBiX5rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tld2RlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHh+Z1pWWGBreHx7cIRfYl5nVlhfV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcGZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh455bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipGOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aIhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYaFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk4Ojw8Pj07Ozo4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs7ODc4OTs6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT07S2VAPT0+PTw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QD89Pz1reFQ9Q0U/PkA9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD88PD1ATUxGSHd1WTc8Oj09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkBJblA7PWSBgn51enZTNzg4Ojw+Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1d7eVJlhIODg4R8eFI8PT89QkZBRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAWXR3e4KBgYN8gIN7TD9AQz9KUj1NRzw8PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQT9SdXN+gHuAhHt+hmJAQ0NFPk9bTG1oSUBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZrdX5/eYKEhYWGfUpERkRCY36FiIl+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR114f4KDhISGhoeNakFCVnSFh4eHh4eCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTFh/hIWFgIOGh4l9U22Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKXoSEhYR/gYOGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklqhoWFgoCDgYKCg4SEhYWGh4iIiImJjI5mREM9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWeGhYJ/gIOEg4KCg4SGiYqLjIuKiYqLjIlePzc2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaoSBgIGCg4ODg4OFiYqKiYmKioqKi4mJioJINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUF7hICCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89UIOCgYKEhYSFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJZhYKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouJi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERV6GgoOEhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKXYaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlFjgoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1FRUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VRUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE1SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQPkBWVVlbY2BWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp0g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkA/Pz8+a1FKYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1ldHR2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTEhISktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l9e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxKTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkdLTkhESERJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGRktOT0tGSEpGRURESUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHSkZKR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFLSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TkhIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl1cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS05NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTElMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRUpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSkhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpKT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTUtMU1JMR01MSE5KSUhOSEpKSUhOT01OTEpNTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNEQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBFSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZBTEhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLSktLTk5VTk9LS0xHR0tQU1NOUE9OTk5PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdzUWh6bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5NSlN0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUVVVVlNaUU9TUldVVFlWVFlVU1JVU1RUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFJSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VXWFVTWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNYWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZUlNZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZXWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlRWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtaX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pYW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWFhXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1tgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXFxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFxeW1hdW15fYWNiYWFdYltiZGFfY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3d6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x9e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx9e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAf39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39/f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoWFhYWGhoeGhYaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoeCgYKCgoGBgYKBgoKDgYGAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYGGmoiAf4CAgH+AgoGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoGDhIKCgoGBhY6djIOChIKBf4CCgYKCgYKEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChoWEg4F+fXyAk52Ng4WEg4eFgYCBgoOCgoSDg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIWUi4V+fH19fnuNn4uBgoGBi4t/hoSCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hp6Xh31/gH6LhYCRhIGDgX+PkoGTi4CBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEnKCIgYyCfYaFfYKEg4SCgZSYgomIgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGUn4WEiISHgYB+foWFhYSFjoV9fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4iQgYKBgoV/f359goeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgICAiYR/fn1/hYF/f4CAf39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpGRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgIONhoOAfn6Af39/gICAgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgICBhYSCg4KBgYKBgYGBf3+Af39+e3qBi4yJioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgYSFhIKCgoKCgoKAf359fX19f358enyPjImLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4OFhIOEg4KCgoOBfn1+fn5+fn59fX59fX6Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgYSDg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Cg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIODg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgICBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KCgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXp8fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHem19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERAXNLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/Pz9HTz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K4n9HRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdWyl5i4upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3MnaOosdGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwsWIm7bV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8vXpZu11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjU1aKatdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCewteimbXU06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/aopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp602aOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecy9eim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbVsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PTk7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfn5+fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0E+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmZeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZyanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqraioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxop+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKShn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopqYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7G+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLWzv8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBy8vIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJvLrV1snMyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxrnKypzBxsPAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq7tsC52pt+vMK+wLy7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbi9ycqDhKXHusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3ube6u7q7v9Gpe3+Jur/Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyYnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wtrmyvb67xLa3t6aYp6antsTIjHl+hbnJz8LAuK61tby+uLqyvsTEysXBysPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwutHTtLu+vMW6tI5uaHBja3mfrHt7goW70dHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Syxtm8vbvHrY54Y2JqTlJaYH55f4WJvMrMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLi9aXe9zr+4r29ZYmRTbGdTUVFbc32Ej7vDx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7trvBwHRpfau+tnBWSlZqSVqBd3NUUGZ8hZq8vb/GwLnAvL7FxL29ubKwrri3v8PHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJDQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5yb96d2l/qZdWT0p3dE1RbHmDe1BUgomht7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMjAg35zcZNsT0hciWhPT0+Brn1dS3ikqLGyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fEu4yDe3h+YUlgjGpeUU9ega6OXlBOe7a2sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4usGbjIWJflNNiJ54alpWbF51h25veqW8trG0tbK0r6y7uri2usDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO8qpCNlppMVYq9ZHuCiWdie2pibXagvriytLOwsa2wubi2vri7v7Kysq6xrrmvqqutrKOooZ2enpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrCkmqSdTGB+j3lseX1jYWprdHltgqS3sq2zr66srra2s7y1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKm0v7Ozb2GFb2lpV2NdXlNUWWNhXHF7oraqsrSuqquvsLK1raWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpsPDkFV1bmZvZldbUUhFR0lMS05hZXuzr6+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp27soN9YV9tYVRIRlFLSURJR0VKVVlcpbKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopueo6ehf2doX1RHSVZ9fmhTR0NCRkxQU4qxrqyvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhj3dqW1FKRkxxoKegbE5FQkA/QlSDoKuqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHlnXFJNS0pSjdnZwI91ZFZJRFORrKitqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJ5uVk5MTk1WZ6HQu6CXuKaQiZiuuK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVYE5GSkxWa36nuKqGjNTWxr+3qJ+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelFxKQkhMaHmpuKGQf7HLu6+pop6cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKJsSkpMVXWizdK7oaSzqqOcnJygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGsgWVydpCz0dvRva+pmZWYoJyaoKCem5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1eVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGloYKKkrTS0tXCraagl5aYmpucn52YnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp4FsiIfA1cywm5uWlJebnp6fnJSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vcnR2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKxqaH6T1tCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0c/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWlX213qtSqkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxczIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKylV5wd7i0j4uTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4Zgc4OwkoyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL66uMm1qbGGaHOTnoyGiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFfZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqqyptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fOwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmviWtjiZOIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RiYWNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62oqIpjZ4uEiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmyr7q6sbakoKSfprGnq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKKNYXuHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtru7uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnqiqppeeiWWDhYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgm5murq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lpJilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smn1ogIOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkuLCkt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqetsrClq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r66vqJuYoKeTkIp0e4B8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrrKaYl56ii4hyfYh+dm5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Geraypqa2soaKilZijm5yQq6mwm5+in56XmZOJnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdQT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLTE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJmam4h+cIeDe3RpaWlsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6QhJGHkJGPmZOVk5ybo5yboampq6isp6impJmlrqSUmaWvqZ+bmZugnq6ZnKuzoKWmn6KjoZWTm5aWkqmqrZqcoKGgmpSQjJmOjJGMkY2WlZCdoaCjnJujlZugo6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhTVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqairt7asu8q7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSWl5WGeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKman6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThomNg4+LkpWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqbl5aSgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVhcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omqGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCan6KVlJiZlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZnJSShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qYk4qPiZyIn5iIh5aemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH2KiZWLjZGSlouEioiVhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjICUg3yBj5iVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaWFdUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWf25pbm9uWFVXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXltZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKyoqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHN0ZWdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3NybFtdXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3GDnp+RnH92hYWKj4iQaWhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH96gol6em9na3h+en5yamReWlpdalxhZl9ZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCjqGflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gIGBc2FdY15aZmtca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp4en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJaPjoGIbHNyfH98cWhgXGBeYmdjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKynqLSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiZiZKKlnp6foV+Z2BoXGViXWRjX2ZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLO/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq6orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebtqmMpI6Rk6CHeIKDdVlhZFZlYWFjYGFlX1pVSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxWT15VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6CfGpXYmFYamVqZVdbY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNz9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAinp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu8wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oauonpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBf3FfYWFcV2FfaGZSWGFWUlVJRUZOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLSkhGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6t7m2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSgn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXV9bWF1hWWNjUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHta+5sLC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1hmWlFdV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaYFwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW09QVFBOSD5BRkFCRTxAQj5FRT4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yMk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWuAc3Jpb3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbiqpbSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2ZhICFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlth3Z0b312hHV5e521jDxBi8alfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZGR0pKRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoOJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eBbo56dHd9fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+grZyimpmfpZ6frJmLmoyRko2FfYiHg4SLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy9DJw9HK1NbY19jX1dvX09nb1s/b2tHWyNXLlXl7aGhbWVBTU11IQ0VJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgm+ShHR8gYV6doZ7ibfGpMLJuIGWm493cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYyBhpd7iIifl5CJjYqLgnyhiZCLvKGXk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NbZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A9Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKScfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvoIuRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNiYqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqfb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjISnkYSZk4SZjKKWoJmTiZqdopKpr5+RlZCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmWk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSs5mMoaGMpJuvo6SdmJCnlqeZrK+kl5WWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmbOWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdo7ikla2kl6mtt6ako5+ZqZepo6+wqZqZnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnYuclJKNkJKMmZuKkZ6Qi4mVn6GNlI2Ymp2Tm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FQz48Q0FCOD84NzU+Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2i6eyra68qpu7pKitubirpqaioaOjqK+ysaqcnKSYmpeXnqKlpZKkuq6pwLytrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydkp+dm5igoZSanqempKKksLKmwcbDr7C6tsXEwr7NpsfDx8O81dHNxMqIdHNiXFlfW01KQkxARUc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrDxKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoJikn5qgm6CUmJ6mpKampK+tpcDEwq6ot7XJw762zrLEvsS8s9HKyMK1dXltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3HyMnB0snKws28wbOtu76nur+9vMS3rMGprLO7vqqwqaOlo6yts622taCfrp6lopijtLypm6i9waO3t7CrkrCtq6yXhpqqpqWRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOalaCinLWmkJ6XpaOipZ6dppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmW15YVhXXFtLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipB/lqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWwv8Sxvrmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysqqebnqaXmJeYlaGkqKaftqupurzDtaaztcvBuKm2rLK6uK6ot7q9uIJsblpXVFVORkpTTks/QUdEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbe4t7KxtbO4s6umnKuruKqop6+wl6OvpKekpLXAsKqstL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqylmqCllJOZmY6cn6eimbSpqrO8vLyqsLLHwLilq6utsbGjobGytKRwbmZcWk5QS0RQUFBRO0dKSUdIQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZePnqCao6S1yLSpxrrCw8fJyMjMzca+u7OuubjAwc22yLrBuLW6sK+vs7Smo5uqs7SqqKatrJmkrqWkp6y6v6irtbe/wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq6lpJ+lqJKSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMYmVhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqKZqrS7pqmmq6qdqK+no6qqvrunrby0t73HvLe1uMGxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmWj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmaurnp2ko6iRlZWgg4+enpyVqaSiobS0urWtqLWys56coqWal5WYqqGed2BcX11KSEZHTVFJTUVGRkJSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5ekl5mpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqsraCgmqqqxKKlqKumnquvrKKpqL+3pq29sLe2x7a1uLi/sb/BtrSztK++o5ejlpSclK6gkaKipaOjn5C+pamdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylnJWyp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lo8GloKqtn6Spra+ipqe9taWxvLi2tsOys7e5vrLDwLe4rrO1taOdpZWSlKGuoJminamoq6Oaw62pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZiew6ilorOhnLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrLOzwr+yxrO6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7yypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSco66anpuukJ6Tl5SagJGhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+boMOopKqyoaO0qpWzrKeipLKsrqm7sqywtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrmyp7qzt7K5wKq3ssK8tMWnvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqaSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWVnpSMj5yelIupqaqhp6CYnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaudubCro6q0trGwubevtri4xb7Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tq27rLOzuresubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWlpyTiJCbmZSOqaimn6Kbl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKGpvaGqr6ujsbippbWzrKCttb2us7i8ur22tsDDv8jEucTBwMC4xL3At6+1p6u3sbu+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqquzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5iFlZeLnZmbk4qNlpeal6akoqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakramlr662qq+1uqemsLfFt7G3v8DBtbS6xb7MxbnCv7q/ucO3wLixtKupura6ub60qq2xtZiYp6yqq5usq46rvZ6rrrGjq6CxrbOurrayubeqra6xqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako2ipaeyqaKnsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5yTgZOYjZ2cmpWPiZSTnpqkoaGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkq7S3ybq0uru/vrS0t8PAzMi7w7y2vb+/t767sLytp7q4t7bCtqutsbeUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqa6rsae4r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpaWlt6eisrSsp7KnrbC1rKWZoKyom5ydm5SquJyUjo6LmZyil5CYpaGelYORlZCdnJiWlIeXkJeappujoJKWkJCVdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1uci4rsG8w7ezsbXCws7Fv8G9tL2/v7q+u7HDp6m4sLa2v7yvq7OynJ+nsa2mpbClnrK1rKuysKypqLS5rLSytay0raqsqKupuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6KjkayepKCfoqqlprmlrLW1paqrqKyvtq6jnaOpqpugmpqSpLSaj4mOh5GioJWNlJ2glJKFjpKSnZuYlZOGl5OVmaaanp+MkpGOkHd+jYV8fH2HiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrb3Luq7Au8extK20wsLRxcW+wLK9wMK8v7e8xKest6yzuLzAsKuxraCjp62qqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaGnqaKspaOtrLixsqCpoqCrr7Csnp+nqKmZpJiZj6CnmIaEj4qLnqCPi4yVm46NhYeQlaCdlpiVhpaTk5ekm5yci5KQjYl+foeFfHd/h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9yLuxvbfCr7Css8TDzs7Dvr+0wMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq6CinrC3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqukrKKfp7G3ra2jpaKbqquuqZ2ipaSkmKCZlo+YnZOCg5CJhZ2gjIqOi5iNj4qDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gISCfnR3jKSIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ub+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+rubCosbGvsqy2qra1p7S2rKykqauco560sqiopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6mdnKa1rqimqaKjmKWmp6qcoqSjn5mYn5GOj5mOf4eNh4WenoeEioqNjI+MhIaUopqOjJqRkpGPkp+WmJaLioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT16ZVkhteFVkVlFiUE1VVFVRT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuVjrCgpauumqylra6ztK+rpa+pqLq+vMCwrritobavycfI0cC+vbq8wr26w8G/v66ysrG1vLzCsbGzq7OopLWppa2zs7mwo662sa+yuqu5rqqutqyqnqmsn6Kgtq2ooZ+vs6G0qp6op6qjq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsamjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iMfVNYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6SmrKSnpKymtLKxqqSwp6q4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmeo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4KAiJ6Phn99i4eQjpCEf5Obk4WTooyUkouRmpGVh4h+f3F6eX58aXh8enVwcH1ohXiEiGRhaGNyhXptZ3ldXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLO1sb24ur62rbm2v62hs6aqq7C1uLWrnry8qLLAs7qgr7O1qqyfrrCjnKWoqaOenKWxpq+gn6qpqKKqnKSooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqKqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5qVjYl8fouGj46MioSSmJGHlKOJkpKHkJmPk4CIfHlrfXZ5eGN7enFwcXJ4aIB0aoNnZGhhbnOObWJpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8M09ZPSOSmayZn5inpKKfp6O4r66jr7Cpq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegp5ikqKCwuJ+jsa+hrKGspJymp6mampufo5WdnJqdqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfHyhjY2IeYOMhImMjIWIkpqOiZWfiZGVgouWjJF8hHtzb31xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9gW3Jqck1NfmhYWk1QTEpIUFJQSU5cX25URFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJ2WraCgoaSht6uxpLO0qqi5xLWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaewspugpKCkpKGXnK+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaarmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6Ei3qPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3OAX1prdWlaSX1dW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcSzsK6ita+srq+0xMS9s7+6t7Czubi6uLuursCztLivv8G4rL26taais6qnqbOrrrKim8G2pai1tamesruqp6apsKyZoqecpKaUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpqclqCiq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV9nY2Ki4Z5gISHiIiRhZWTkoyQlZSNjpR7g5eOind+e2x0cmxsdGJ4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPAtrCsorWtp6+vuMDAvbHBt7Gusre2uLe2rKq9s6+ysb2/t667u7Gln7arpaW0qauuoJ/Cq6ilsLOqrLS6naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6KgmZuZnJKZnZSlnq2jmJeelZSOlZiMj5iaqKCRiImKiHmFd4KCgp2Hi4KJfH+EiIaFkISWlY+OkJGRkY2Se4OVjYZzfn1meG9ra2xodXNrY2dkY3R/YmRlZmVpamNpcVleWF1tZGFOaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE7M0FmSCU1m6SgkYytoZmYoJaltLGisb63obHGu7mwsaO2q6uuqbm9vLutwLKvrq22r7O4s6iruLGurrS2u7avuL2tpp21q6ChsaWrr5+kw6CypK6xr7ettZ2tr62uo5mcp6qlnpWbqKWfmaWip5yaoJyUnJ2tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUm5ySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYmEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnluaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaWZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+prqW3ube4rLuvraqrt6q0ua6lsrWxrqmxtrawsrW6p6iftqmenqqiqq2cqcCYraSusLa1rKyesa2wqqKbnKOsqJuVnKejnZqpoqOVmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielZWfkYmXmYCXi6CPeYaTjINtaX53g3FshouGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYRmXmRmbmxpXl9fiZCEhmhPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi82NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6qtq6O9xa+pt8K4vbytp7awpqukuLSys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra2kqK6rrKWhnpygqKebmKGmpZubp6edkp+gmZGeqKqjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOSm5KIhHJ4jI6EiKF2iIxpl4hmfXN4oW+Ih4R+jXt/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJysnZmZnZ+rqqiqv8Ousbq8t8C+qqS3saqsprO1rq+ztquppbGtpbWznK21trSlp6izsa2yp6+fqqCyqJ+ko5qipJyutZWkpaa2vaasp6mqrKimoqCZn6ajmZmmo6SYnKSplpOinJWTo6WmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ+XnJ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrSop6a1pqe4r52zsbWqpaSnsa6tsaaqnqeksaSioZ+XnKCfr62VnqKftLqiqaigra6lop2bmqGon5ibqKCfmJ6np5Gcp5uUnaGno6Cwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKelnqOkqrG3rbS9vrC3xLK4usKnqbCsr6mpsa+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZibna2ml5uinrSzoaqboa2toJ6al6CiqZyZnqSgnJmhp6SQnaObmKGfrJ+mpqCboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZR+a4GmeoGFiJKUknerZ2qxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1U5KGXlCpbWNxfoeAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqGuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WlprKzp6Oinaeqsqiwp6WeoJ+vlp+ZlZaXmJ+topqapKi1r6Gpj6moqZuelZigpaian52jn5ygoqWjlZuemJqdo6ubppmbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+utqibqLquoq+xoLO0sKCknp6nqbCotKmlnJ2eq5eZl5eXlpehqp2al6itsKmjn46soqeWnpecoaWhmKKhoqGaoqKnm56gnpWZm6agnKeUm5qfoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOfrLCkmKa6rqSxsJy0uKqgpp2hqqSxp6yqpZqdmqmelpWYmZOToqegl5OmqrGmoZaSrJ+lkpShm6Smn5WbpqehmqOfrZqgnp6QlpyinpyllJyVmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQVRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgtKyfoKirn5WntqyosLGrrbSkm6mgoKihtaamqqOZnpWloZSUnJmTlqOlm5OQp6yvpqCVmKmfoo+RopmopqCVmqapnp2knqydoJ2gjZSfm56gmJmclpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQiJSqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljo+MTAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGknqWnp56TqrGpr6q1rKuvoZihoKako7mio6uhl5yRoqCVlJ+alJmgoJCNjKmwr6adl5qnpp+NkqSXqKunlJeqqJ+foKOto6CdoY2VoZifoJKdl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5cp09iUmtlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qqoJumpKGdkquqp7WjsqiuqqCXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOlmaWso5GXq7KkoJ6oq7CZoaKPmaKXoJuWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGtaVltqel5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaKeo6Gcm5GqpKqypLWnraSflpqqmaasuJyirpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZykrZ6RoKirn5ygqaSznqKkjqeilKGanJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3p9iWeDeW15YouscHWFf1lbp2pFZFpUZmBjXWJRZ2dxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/pZa0w7Ssqqesq6m7rrDGr7W0r7intbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnaSkoouSkqabpaublqikpZyboqmmpqOooJGtnpainpeXl52ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboN8e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdWlxUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSktaqlm5iVopumrai+p6mmlpSblaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gqmqikmpurn6OZm6OnraKfqqGZsJuUpqCXlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1ZHd9dmtwe21gY1xwaE1ZWWVqX1dZb3ptbWZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqSlnKSVlqCrpqyjo7esoJmWlqCXraqlwJ6rpJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6qnJygrJihm52ipa+moqSnnq2YlqadmZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeWZgaWRjZGZqWGt7cGlqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCmoqGdmZeopaimpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqedqJufpKuUnp+eoKquqaWiqqGtm56foZilnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iIj4N7aoVYXmt0ZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZefo56hmpmmqpuso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4pKKnr56elZ6jnqOco6mokZ6hnqCqr6qroqmfqJulnqegrJahm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYmqKgnJuqp6Kcq6KlqKSktKSdo5Omrqy3s6evopKRmp2lkpGgoZecn52Hpqukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ6dra6prKWjoqagpKWdramRpJupraqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ5lZabX66PXo6ngKGhfaeWm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2mErnR8loe4YYKtWaPNbo91e9t7f5lwfoiSdX9le4d2dmt9iG5+hZGSfm2BjmBxa3BmYF94ZFtwaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqorbSrprKsrKykrKawqqCnm5qmmJyisJ+hn6ino6ahnrCsm56Wpq6tsauorKCUkpufpZOPn6WXnqijnq6kq7Cov8azqKmxrpaSnZyil6Cpqp+UoJ6cna2vp6qpm6emo6Grkq20lqaiq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYWoh3GxfJ1xrH6hn4Klj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkI9lb3R2b2BmbWRfb2lpbmZjV1NcYVpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXVxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6OhrK62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin52wrJeblqinr62op6mel5Sao6KSlKGtm52mo66so6y1qbnNsq2mrqyWlJydopifrqydlp+ZnZ+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpF9gUquEf66Cm3augaeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb255eHdubGZlZHFwZntoY11XX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+inrC1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kdm5OqpLawrqCpm52WlKejkJqiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqgk5yfp6uro66arKiioaqis62iqrOxoZuqqK+vtqOTl6SnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXSZo5WnqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn5we3V9em1cZmpycWaBal5iWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylopyyuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdprWeopeTp6q1sqybppyglZClrZGZnKejoKqnrqGjp6mwtMKys6qtqJOJmJ2kmqGjrqSWoZWYnKWmq5qvna2opp6so7esobK5r52br6eztLOllZiopJqfjoKdTniagX+feoSjfIKkhIenn5yek4S4fHx5uYJ+zMXCtniboZCLn36alpeKdp6YiqSYo6h+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGJdXpzhH5wXG1ud3JqgW9aZF9obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJyhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6GptLmkm6Oeo5OQobKZnpynpqGir62dpKiitbHDsa2qramRh5GcppyjpJyklp6YmZmlpKiarqGtpaaYr6W8raK3t62enrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmqZo5yViZ98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIySi3h9eY2BbWl3aXhzbn90XWRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqbO0pJ2mnamSlJeuoKCep6Scp5y1mqCqo7arwrCpq6qhjISOm6GgpqKVmJmcmJqYpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqaCiloWfgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWfmttfmJ9dG5/emBnZXFvZ2doQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qZraGQqqmklomakK6wrKafp5usmJiPrKKhnaaimqWcrZifqKa2qL+vpamknoyAjpuaoKaekpSZmpOamqWko5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqaqZdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OnlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgLFsZ26Zl4yIsVt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJWWe3iNnH1kc31ig3d0gHxhamZwbWZlZU9VY1tBVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCunaubla6poo6Im46vrKimoqeZrpOZj6iaoZ6ln5qjo6WZnqKpsqi8r6Sonp2PfIublaGgmY+SmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmJCBgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srDHg2qrsL2teHeivrt0gJaOppyPmpCVnHmBkJp5Ynx6ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRr6ajrKGknKqhmIujkqaep5yaoaiimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWWGd2iNanl+eWRsY2ZsYktkWEprWTpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvraqnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJeNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMKopLOmrLGyq66sqLmkr7iWiqGopbadiZaimIepmpCUnZOqs5mbo6ygspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4t/dIJ2dIiMcadtfJWRlJOBgY+Pj4+dlKCVl5aggoeTjHBoj3Zwind2fHpqbGRkb2NVYFlAaVpHYmBPWitGPSsmITc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01PUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLu4qqKlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqukoZmnnp6TlaOXqJupmZSmoaSQmqeZobW6qKqYmpCNfIGUjKGUipSRlZCQk5elj56ZqJ+ctqOdp6y3p67CrqO3pq+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMhnWGdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyWoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1iUGBjUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7uvrKyhopl6naKwpKWxqZabuKailJmpnI6GiombopCunqOWp5+hkpeYm66Lq5aPqJmojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSehJd+bpOznKOorquiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2hnF8hoGAYWmIi5WTi1t2lZFnaJCOcnqkmJhkeZiGgXeXaYOKgm55f2twZV92b2traFtmY2Jib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqeTlrigoI+cpJ2RfoiImp6Nq5qjlKeino6XkZ6Fda6QiKaaqJGWo4iburSnoJmYi4l0dpONlZOKlJCQlIyPk6COmp+mmZyyloCMnLWdtIySj72noX6nonqjr7iBjo6nn4SLhY+xqa+MiZajmnmBi6yGnJ2ip6qoh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeYFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5yGmH6RiYGCmGqNjIRreHtxcGdkd25pbGtbZWppZXJbXklUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWVthYWhmWlFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKCVpai1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopWfoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWPiJOQipSPj5uLj5GfkpafpJaerIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqeg6CYgZl/iouDiJhvjJKEZ3d0e3ZnaHVwZ2dsXmNubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilaOptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZuamaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4qSj42QjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaGSfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWsrJ+crbWjqJKgn5+mm5mOmLSZkIuejJWLdYGUkY2KppaVl56ef5KFhqykh5yRipiol5makYelsKailZqIiX9oboiHio6OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RenZmzlm97l56zdHJbnrKCaWJvdHVxaG9Ya2xycmVcaV5iS0Q9RDVRQVlxMjxSRl9KUj08Mzk1Ojo2RDs7QElQP1RNTlFARF9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjaS4ta6toJuinKOjpKybmrGtrJOXoJigpJmak56rm4uIkniLhXCAlo2Kj6CQk5Sdl32QiY6ooYeYj4qRopObmoyLqKikno+WhoN9anqGf32PjIKLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2tpW3FpeHljX2VXYkFQRU43VkJSbTRKWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJynn52tmp2wqKudl6KZoZ+Ylpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlI+Fi52RnJuJj6ijoJmLkIl/f2mBhnl/lot6iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX5uZWBsaHZ8ZGNgUV5WXVRWQFlFUWdEUldbYlheSUQ9QjhAQjpJRThMRFdBVlFbVkRGYlxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaGhraZOdgbGumYRTX6Cns7mzs6maooubqZybqJKhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgIiYlJ+ahI6onJqUioqJe4NrhIVxgaCLd4WNiIeSmZV8kqShn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ5+p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRenG9+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+Ea2dmZG12eGhfYVJbZVFRYklXSVRfV1NbZWpcZFBGQ0tMSktCSkU4UD9QTVdTWE9SUmBmZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36pr7K1sLOjnJiFmKegoKONpKigmKmJmZeYk5mTkqCXjYiFe3B9hGh9j4KTmoF3kY2OiXB/hpCTkmyXk3yIkJGjlYOOqpqUkoqFiXmDdYiAboKfhnd/koaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHFuVl5UWWhQUmhJVUxYUlZcZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRnY2pmb21laW1lopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko2Ig3lqeYZlg4x+l6B5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl5f3yLeXCQoYZ5gJWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VvY2aIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXJqcYFtcGhreHNrcFJYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfX9/jnNpj6WEfIWTjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaUl5ygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVxc297dHFian5uaGxTVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY2AjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOrpKCQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJieoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3lvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cXBvd3hvXWyGbmlnVlpgV1xla2NVYVVeUV9wd3lsanZlampqdXxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ybmp6Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaCaHmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZbHFbX2BZXl1mdH17dG9zY2traXt8cXt4dGRtdGhsfH51eXx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeq2CkZiZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlJqfiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLnouFlH9+jIGBdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiI+BdmuBg3t5mWlyaGBzinB9enZ1b3d0gV1eb4dobl9fWlxdU2hxVWNbW2FsaHV7fHJucGRramh/e214f3Fpb3BsZoF7coGAeIB9gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXuAmaqNno2Fn5yKnpZ8eZSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXuqhI2Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GRind9iI6FpXt8j5CRhpiqoZ2TnI+Nq42RgJ6MiJKZnoKOl36GjYJveIVxdGB/g4+GdYuXgIOPgoaEfoWDlG55dXSToouNhZqEhI10gIp9fHJze4iEe3mMjoSTp4+GhI+Cg4qJiXaFh4mLe25rfX97bWhrbGdeeX5nfHt2c3V1e3dcYHB9bnVgY1tcXlFmbVNlWl1ha2l2en5xa2xka2pngIBsc4BsbHRveG6EeW6GgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enNlam1ti4qfuJqho5+SkpaXi5qfnp17eJ6lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHKAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIp5x/cIuKi5KGoKGKhYx8qJKIj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joR5gISPh6GAfoyNj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfYCNhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxxeXqMhXp7ko2DlqaTi4aRfIWGh4R1goOIh3lkcnt+eHlwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZYCAam1+aG5xa313hnlri4FygYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmN1e3tyYmpveomNn7KSpaWcjpCYj4adoJqcfHakoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqWbh4yJg6aWhZKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5Sceo+Fg3iFl42efoGKjoxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x8cn94iod5hZGKi5iilYKEjHeIhIKBdnuBiYV0Xnh3fHN9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaDaXFuYHlnbGJqdnBmeXx6cWBybIaGkJ2ul6aono2Nl4eGoJOXmH13qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefYuVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SNjopshpiQmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlqdWx7fot+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dniAfYaBfYSOhYyUpJB5hYN0iYd9f3N1gIeDbWB6dXlwe29hbmJke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2llamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXJjh2hxb2V3aG5sYXpoa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JviZmEZ4aaj5R6iYWQinCWmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXyLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW5/fYCHfYWNioWNlaiNe4h9fouFd31wb4CFg2Nod3N0bnpiXm9ganRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoVzgIGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdvbGV7Ym6AeXZxbHd3in+jmKKooaabh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4Wjg2eGnYqRf4uEi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2ttb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiHuGjHuLh4SJj5yjiHyEd4KLgHh4bmqAgoFdcnJwb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJdam1kYmZrkm1gZmZfaGuBdXJycIuAdH+CgHh2gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3BsdGpob2x2d19xf3l7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoKMkqSak46IlZiShIaWmYyTi4mPj4iehZCKfHOLhYmPiJyZn5uWlICUf2mGnIhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox7iX6DjJGfnYV8fXiCi312cGlrgYJ5X3dubGtxclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZmYGByU1BOXGZlXXhwiHxfXWhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIR7eZV3ZnJqg2CHfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+DmoiAi55/ipmTjoSIl42Oj4R2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIJ1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoiZKHbImkhZOIl4OGY4yRmI6UipaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen1+f4aOenpoc2tzi4+KgoWFfZWMbH5/b4CMf4yIfYR6gpCWmpuLfHd4g5B5c21mcH+DbGl0bmdoc21TXm5kcFlfa3F3ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn96iH5yiYeBkYqIfH6YdmVzbnxlh35ucGuAWmxueXlzYHZ6e412cneKd3mfi5uum6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eJi32LpIWSiZ2FhV6LlJeKjomOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFjH55ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmJ0bW9haHVmUmBwZ2tVX250eWByY19ofXFybVpicmFiV25ZXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3e4lxg4R9foh7dIuJiJaGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWR3eYaMaXaAiXJ/nIeYp5yjkoR9cIyUeHmLnYSFoY2OfJWMf5qIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GFgomHmaKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdmJ0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpORl4lucnqMhnVscWtyeIBfdGluXGp1YFJkcWhmU19wdnRgb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW9qdHeKfnNzgX56dnqIc4WDfH+HdneKho+YgY2Ce5N2bHd1eXmTdG54en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJWPkZOEbnB5jH91bW5qa3p9YmhqaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsbGJtaXN2hn9xbn98fHR4hniFgnyAh3V5iYGSlnyJhnaJgW94eXuEk3Bte4F3XoN/dIFtaXpzlHNncoh9cpKRg5qfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8iZidmIeUjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccWJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGpja2lzdoGDcG1+fH90dYN7g4J8goV2fomBlpF4g4p0gYhyeXh+jZBvb3yBcWmBeXp+bWx8dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHR7aF9lcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRjIVua4WSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYWbmZSLk5CUhYdwe5KCfYKDiYNugXhogIR4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2NhHhub36EgHd6ZWhqfHBfWXdaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtocXd/h25rf36AdW+Ce4CBfoN/doGFiZeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4qDoZmckoKGZ4eDb2h6lYh9f4SBmImBfI2MaXhya2xmX2FveG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjIt1fY9/hYKViXyDeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHV3g3mGnJCMkJGSjIuGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dheYSBcWRxaH5tdHF0gZuLgH+FfnJ1fYBzgXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1lvZExacnJlW0lwd25cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi254foB7e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzj4uJdnBthYKGdHmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn52gIF8jJmHgpOQmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4FyYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXN/fX+TiYl6bm5qboKCdW5dZ2ZzcVFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWWhNQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5CMiHJycIR7gnN1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dmNqfIOHnoF/f46PfXJ/dIV5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhsf3lzaXp2gIJ9aGB3h31qa3Rne4BpdoCLkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZHVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2pkUVpwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fnmCgYF8dn2DiIaDcHeDcm52goN9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHV+d39vcX9thHSUhnh0a2B6gnmIj2Zxg29ndm5bbX2BkJR/gHmRkn15e22HdoCQi4R0loqRjoeFhXt/hWx0dn9tZ3ZlbXt1bWp2d39/fGBieIV5aHR1Yn17Z3SGjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXl7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH13gYOBe3N9g4iHg29xf3RxdX6FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hpuIgoFzl5R3f3xtiHGBiouHcZeOkIiFi4N7eX5xcXB9ZmhxYm14cWprcXd8fHlcZHmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1ye3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZvd4qjgYR/cZmTcYF5dIJtgIKRh3OViIyIhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkVrWmFkV1lVeVlOVm1qWV1sZVxaZWNedGZtZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN4enpzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk39yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHR8c3x6bXt7kIV2mHyHhoKGg3x0cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ1Z3CAd4F1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpwenlzfmZ+f395d25kZmJuhnxta1ZqYnBTS2hqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39+hYV6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgot5boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2thaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9njqh3gXp8kI55dW9+b3J1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2lvgH55d2B3hIR3j4RyiHFveYByY3FpXG93ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0trZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFVubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR/eXZ0hYiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gICBc26Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXWt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ4b3qNfHaOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3JrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVlxdGJxcoV8dWRyf2xhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x8dXFuhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2JwdnZsYltsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtbnlnd218hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3BhcXGCfHNmcYBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSiISBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN4dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqal5abXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGp6bW9we3x8cYB3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZqaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGttYnFzgXpzZm9+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1FPWVJJY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIuPg4KXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5ue29md3B6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5waGlzcXNwdHVqbYSTgYh7hXFyZm59cHJvVFtmamZxdIF3c2JsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRVlNQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmt5dW5vaHZ2f39sg399hpd7f4iBin5rk4hyZ3SAe3WAg32Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHxwZnhyeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmd2RlXVhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3ltXHdxbHppdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB+bGZrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYiNfnyKiI56bpCKdGxzgnR/f4iFhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ucUosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2drPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHhoeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiMiY+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gICAf39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fXx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISUdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tKSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZDRkZER0lIQz9AP0BBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAgH+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTs3ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc6OkA/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT8/Pj09amk+PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlJSUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9CREQ/Pj0+PkBAPEp4c0w9Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRUo/PDtSb21nZXhzSDg8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNemM9V4GFhoaCeXJGODg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1Z3e2d9g4KDfoJ+dkc9PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0VAV3V0f4F9goN5gYVyREBAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBOdHJ+fXiChYGDhl89Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4CBgYSFh4aIhEtDRURDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1hzgYSFhYOFiIiNZT9BVnSHiYeHhoeCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSliChYaEgYKGiIp8VGyFh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKY4aGhoOBg4KEhIODhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aEgYOGgIGCg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGg4F/gIOEhISDg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFcoWAgIGCg4OEg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUaAhICDhIWEhISEhomKioiHh4iJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89VIWDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJdh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWGHg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKX4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9APkBAQ0ZKSlBng4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlFRUE1OTUtKR0ZDR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTUtSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/gICAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJbXE97Tk9PTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRExRT2FXUlhRUFNTUlVbT09RVlBNSkNGPjo5NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTElISktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg5R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fX1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9OTUlNTElLTExLR0ZGRUQ8QUE+O0BFOzw4OVRxcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPSEpIQ0lLTUxKRkZGRT9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEtNTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpLREdCPT49Ojo6O0FCPz1CQ0NDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETUZCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVOSENHTUxOTVBNTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lHSFBLREpNTFBOUE5PT05KSklNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj9AQj9AQkVHSkZKR0lIRkZHRUNCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBQT05PT0xLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk9QTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1IR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PU1RPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF5oZWNgZGVoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vc3N5TklIR0lEQUNIRTxARUNFPTg6Pj4+PT1BQj0/PkFCRkNFQkNHRENFRUZHR0dJRkhKSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY11cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF3cXVNSUtISkVCRUdFPEBHRERAOTw+QEA/P0JCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQUFAREFAQj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gYGFhYWBiZGViY2liZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRENBRDw/RUVFQz1BQUNCQUNFQUNEQUFFR0NIR0hHRUpGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxLTEdEQUBEPj5ERUZDQENBRURERkNCRUdDQklGQ0hKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRUVGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFREBBQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTU1GSk5ISUtKSUxKSkpLTU1OTk1NS05NTVtyb29ucHBsa05QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTklMS0lKTUlLSUpLT1BPTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZOSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tLTk1MTEhKSkhKRz9HRk5KS0tMS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJXXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkZIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9EQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNFQERDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFtcXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERWXklHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURAQkNGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpeXmFhZWZjaGRrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0dYTUhISkhHTkxRUUlMS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYERDX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2FUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09MUVROT1FQS0xPR01QUlpaVFFRT1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJiWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmNkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkRCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU9QVVRYWFhbW1VTU1dbV1hXWk9TVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU5TUlhVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWVtgXlZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZZVFdXVFJSWFZVWl9aXmBfVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VXVltcV1FUV1VXWFZUWFpUU1FZV1ZcXltfX2BVYVxgYV1gYl9cYF1jYWNnaWRmYFpjYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUlRWVlhZU1RZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15VVU5WV1deW1hRVVVYWFhVV1lbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVXVlNUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWV9aWVNUVlpZWlZYWVxWVVpdXF5gYV9lZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWU1lYWF1eWF1bVV5fWF9fWFxWUllUWVpaYFhbVFZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWV1VVltcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVlVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlRWVFhcXF9gYF1gXVdgXlteXFteWFZYWFtbX19bXldYXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYWZlWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVtfXlpZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2NiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6ent6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+waGKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCg4ODg4N/fHx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3d6eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXp6ent8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8enx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JycXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYGDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOBhoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH59e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f4CAgIGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4CAf4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoOCgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn59f39+f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhYaGh4eHhoaGh4eGhYSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBho2CgoKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKCgYKPm4WAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICBgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKBgH9/hZabiISChIKBf4CCgYKCgYKEgoGBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFhIODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhIOBgIKDioiGgH19fXt/l5yJg4WEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYSEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCAhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaZkIZ9fn5+h36NnIWBgoCBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4ODg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9+hp6dhoCJgH+HgYCMgoGDgYCAgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoKDgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICDmqGIhYmDg4GAfYGEg4SDg4ODgoCAgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSCgoSHfn59fYSFhYSFhH99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aMgoB/gIWAfX17goeGg4B/fn5+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgH+EjYR/fX2AhoF/f4CAf39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4CAgYWEg4OBf4CAf39/gICAgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CDhYOBgoKCgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEg4OFg4OEg4KCgoOBfn19fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OFgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICBg4ODg4OCgn99fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKAfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foGTkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyAg32Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXt9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+enx7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH+Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX57fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgIF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f35+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGCgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKBgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fn58fX+AgICAf39/fn59fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXt8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fX+Af39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoCAgICAgH1+gH2Ag4J7fn57e317enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgIB/gYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhIODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgYKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eXZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp7fYB+f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4WAfoKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4F/fX5+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn1/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhISGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SEhYOFhYGAg4N/fn+Af3+Ag398gH19f4J+gIF+foF+fn59fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4B/fn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYWGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn5+fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+fHt6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYOBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgoOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdGZrJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3ElIicnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwr/JmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8zSlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjZr5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCew86Lk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/P26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCrkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqefsaSkqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwc7DysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJus7TyMjNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu+wcfBxcPTianPxMTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbezrrq7tr7MtoSe0ry/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK63tbi/z5uBirXBusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube4tK24sra9xcWHgYCfxL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+xtrqxvb67xLa3nH53gnSEk8Gse4GCnMnGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owu9Tau7q+vMaynXdjbGRQW2F9j3qFhpnLztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Sistu/vL26fWRvYGBzW1RVWGx8hoibyMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLfBb2+wzcG0elpKZGNLcH5uYFFZeIKLoMXCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru/x31vdqS/m1VST4NnT1x8gYNsRmuCkKzDvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5x8iCf25/pXNRTGKVX1FRVY6Wdk5li5yuuLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMfIioN4dI1hTGKKcVxPVmSwundWUH6vsLKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDw5GIf395VlGOlGttVmVwZ5R+cW1eh7yzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucOikImQfkpemMN0gYqQXXZ8aWp0irS7tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK7r5SQnZZMYo2UdnCAemNqbHN+enOeurmytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrSmnaqOV4FvbmpcaF9dVlleZ2NpgJe4sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmxwLevaHh4a3NoWV5QSkhKTFFPWmtuoraqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpcTDjmBlY3JjVExGXUlQRk1LS1NeXXy2r6+ztaqnrKuinJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp25sYV6Z2pjVkhQXo57bFNLR0dOVFRkq7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueo6eafWxdVExJVYOqsZ9oUEZDQ0dNXpSwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGhhm5gVVBOT1yr4Nq6j3ViU0hCTYuZmquqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHRZUk9SUl11uNK6oKm5noR5ia7Eo6itqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJxmUElOUF11jbK9qYei3NbO1NnItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyUXUtFTFN1hbO2pJKJxePc0cS1pp+ZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmNKSU1cfqrR0Lags9PMuq+oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKV3XWdog7DS2trWyrqyqqOenZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGqiYGSr87U2drPvK+om5aYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGmlXuTksXW0tXCraahmJWXmZqdoJ6ZnJ2SfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppnZpf5TT1s2wnJuWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFysvMz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Sooahkb3yo2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfLy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raacXm93utCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxMvFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwLTDvrKyjWBygb+wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7rLw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8C4xb2rr35kdZC1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL64t8m1qbCCbXGXmo2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61r7uysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvr+8wLqys7TDrqmuhmhkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62op4dfcY6DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsn6KKYYKHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNn6Gjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadgmWChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyioqidm52lpqKmnKCgm5iurq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6SmndpgYOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWXoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqets7Clq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r6+vp5uYn6eSj4pweoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrq6WYl52hiodxfIh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkI6Uk5SdlZaXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOjJGMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAc2hgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWfm5pbm5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3tycG9sYFtcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHJzZmdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3Nxa1teXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gol6em9na3h+eX5yamReW1tdaVxhZl9ZT0tOV1JRSVBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+Bc2FdY19aZmpca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cWhgXGFfYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFgoaJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKyoqbSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9ZmBoXGViXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rbS/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhhZFZlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbS0wLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BempXYmFYamRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFfYWFcV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXWBbWF1hWmNiUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1pmWlBcV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW05PU1BOSD5BRkFCRTxAQj5FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSW09KR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZFRkpJRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy8/Jw9HK1NbY19jX1NvX09nb1s/b2tHWyNXLlXl6aGhbWVBTU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJuIGWm494cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiZCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiZKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eXdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvn4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqeb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdopKpr5+RlJCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqpmYnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnJm0l5WrnYuclJKOkJKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FRD48Q0FBOD84NzU/Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5paSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr7NpsfEx8O81dHNxMqIdHJhW1lfW01KQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrExKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762zrLEv8S8s9HJyMK1dHhsXFhbaVJMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nusC+vMS3rMGprLO7vqqwqaSlo6yts622taCfrp6lopijs72pm6i9waO3t7CrkrCtq6yXh5qqp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWmkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMSvpbO3zMC5rsSzu77CuK3Cw8LAmW15YVhXW1tLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8tLzLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypZailqysqqebnqaXmJaYlaCjqKWftqupubzDtaaztcvAuKq2rLK6uK6ouLq9uIJrblpXVFRORkpTTks/QkhEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7y/z7bEvbi4t7KxtbO4s6umnKuruKqop6+wl6OupKekpLXAsKustL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfr5yfpZSvrqulmqCllJOYmI6cn6aimbSpqrO8vLyqsLLHwLilq6utsbGjobKytKRwbWZcWk5QS0VQUFBRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK+vs7Smo5uqtLSqqKaurJqkraWkp6y6v6irtre+wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura+s7Ktvrm3oKOnqKWnnJytqamMYmVgX1FLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqOYqrS7pqmmq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7CrmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKKpqL+3pq2+sbi2x7a1ubi/sr/Bt7WztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaymnJayp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXt7GjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lpMGloKqtn6Spra+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtaOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbyxqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSbo66anputkJ6Tl5SagJKhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+utLKnqrmyp7qzt7K5wKq3scO9tManvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWWn5SMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLevqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWl52UiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbippbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SprrG2nperraitl6eojqe7n6Sts56rorGws6yptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ksra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5eFlZeLnZmclIqNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlr662qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytayqura6ub60qq2xtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurrayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5uSgJOYjJ2cmZaRipSTnpqloqGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2up7q4t7bCtqutsbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbG1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SquJyUjo6LmZyil5CYpaGdlIKSlo+cnJiWlYiXkJeap5yjoJKWkJCVdoSQh3uFgYSMi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q/vLLEqKm4sLa2v7yuq7OynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLSytay0raqsqKypuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOpqpugmpqSpLSaj4mNh5GioJWNlJ2gk5GEjpOSnZqYlZSHl5OVmaebn56MkpGOkHd+jYV9fHyHiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e8xKest6yzuLvAsKuxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sbKpsqmrpqWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+nqKmZo5iZj6CnmIaEj4qLnqCPi4yWnI+OhoeQlJ+dlpiVhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalo+YnZOCg5CJhZygjIqOjJmOkIuDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gIOBfnR3jKOIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+qubCosbGvsq22qre2p7S3rKykqauco56zs6iopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mZoJGOj5mOf4eMh4WenoeEioqOjZCNg4aUopqOjJqRkpGPkp+WmJaLioN/dIaBf395dIN/enh/gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra6ztK+rpbCqqbq+u8CwrritobavycfI0cC+vLq8wr26w8G/v66ysrG1vLvCsbGzq7OopLWppa2zsrmwo663sq+yuau5r6mttqyqnqmsn6Kgta2ooZ+vsqK0qp6op6qjq6GirK2ova+srq2iqKigrJmQr6GYoqCop56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoSDo5eFgoKLho6NkYSEk6CWh5CckJOQjZGclJePioaFeHSBf3x1eHmAe3RzemmBhqN1aV5la4F1ZoiLfVJYcF1KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsL0tnOjQ4Xz1hZD9GMUNQW1srSE45VUE0kY+yoKSmrKSnpKymtLKxqqSxqKq4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0p6essra5s6iovLWttbywvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeppKmeo6mnqb2rtK+unamkoK6cm7KjlaScpaWfpJuaqaulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4J/h52Phn9+jIeQjpCEf5Obk4WToYyUkouRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXlsZnhdXVVBVnptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9GakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLK1sb24ur62rbm2v62hs6eqq7C1uLWrn728qbK/s7ugr7O1qayfrrCjnKSoqqKenKSwprCgn6upqKKqnKSooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5mUjYl8f4uGj46MioSSmJGGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnONbGFpb19vP1t4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhZMTNTPWVfREw2S1dlTyo8M09ZPSOTmayZn5inpKKfp6O4r66jr7Cqq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSoqaqwrrmxqpu7vaSwv7W1oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6ehp5ikqKCwuJ+ksa+gq6GspJymp6mampyfo5WdnZqeqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfXygjIyIeIOLhYmMjIWIkpqOiZWeiJCUgouWjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2BmhX5fWnNqcUtMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MjxmZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKirsK2zsKeavrelrby1r56wt7CopaewspugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGrnqyjr5icqqWpnpibnqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6EinqOl4qNhniBh4SIi46FjZOYjY6WmIqOlX6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI5Xl5sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcWzsK6ita+srq+0xMS9s7+6t7Czubi6uLqursCztLivv8G4rL26taais6uoqbOrrrKjnMK2pqm2tKmesruppqapsKyZoqecpKaUmKGypZmepKmpnKKgk6WgpLmopKeup52loaiTn6mioaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV8nI2JioZ4gIOHiIiRhZWTkoyQlZSNjZN7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXpjYVJzVFtbU0xJR0lPU0AhKWleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPBt7CsorStp6+vt8DAvbHBt7Gusre2uLe2rKq9s6+ysb3At668vLGln7aspqW0qauuoJ/DrKmmsLOrrLS6naiqq7GlmJ2qnqelkZmmraKZnqSpoZuinZegnae2pa+qrqGhnp2hlaCmn6KgmZyanJKanpWmnq2jmJeelZSOlJiMj5iaqKCRiImKiHmFd4KCgpyHi4KJe36EiIaFkISWlY+Pj5GRkYySe4OVjYZzfn1meG9ramxndXNrY2dkY3R/YmRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPjlfbGlHQlVTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE7M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6irubKvrbS2u7avuL2tpp61q6ChsaWrr5+lw6Cyo66xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaWjqZ2aoJyUm52tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUnJySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGltq+prqW3ube4rLuvraqrt6q0ua6ls7ayr6mxtraxsrW6qKmftqmen6qiqq2cqsGZrqSusLa1rKyesa2vqqObnKOsqJyVnKejnZqpo6WWmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielpagkYmXmYCXi6CPeYaTjINtaX53g3BshoqGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYNmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrbSmsLWjqLi3tqmnrLazrrSts6Kpn7SrnqKknKeomq28laelr7O3ra2kqK6qq6ahnpygqKecl6GmpZubp6edk5+gmZCep6qjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6EiKF2iIxpl4hmfXN4oG+Ih4R+jXx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJyrnJmZnZ+rqqiqv8Ovsrq9t8C+qqS3r6qsprO1rq+ztquppbGtpbWznK21t7Wmp6izsa2yqK+fqqGzqaCkpJqipJ2vtpWkpqa2vKasp6mqrKemoqCZn6ajmZmmo6SYnKSplpSinJSToqWmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ6XnZ2lrbKpscK9srXAtbe+wqums6ysqaivtKqvtrOop6a1pqe4rp2zsrarpqSnsq6tsaaqnqeksqSiop+XnKCfsK2VnqOftLmiqaihra6kop6bmqGon5ibqKGfmJ6np5Gcp5uUnaGmoqCwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYCUeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKaln6OkqrG3rbS9vrC3xbK4usKnqa+rrqmpsa6ksLqwpKSus6Opuames7OxpKWgqq2wrK+mqJ+jorGdpJ2YlZibna6nl5uhn7Syoaqboa2toJ6al6CiqZ2ZnqShnJmhp6SQnaOal6Cfq56mp6CboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFiJKUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGnta2jq7WkpbOzp6OinaeqsqiwqKWeoJ+vlp+ZlZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5eZl5eXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrLCkmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmelpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyWmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWloZSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5yRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmkmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWto5GXq7KjoJ6oq7CZoKKPmKKXn5uWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpbVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5p5qeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaOepKGcm5GqpKqypLWnraSflpqqmaasuZ2jrpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZ2krZ6RoKiroJygqaSynqOljqailaGZnJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZVpUZmBjXWJRZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKeeoaG/pZazw7Ssqqesq6m7rrDGr7W0r7intbitqaOipp+gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnqSkoouSkqacpauclqmlpp2boqmmpqOpoZKtn5ejnpeXmJ6ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6ooKihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaeRnpCPmJywsr+sm6eep6KJk5Gqm6ikm5usoKOam6OnrKKfqqKasJuVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1xwaE1ZWWVqX1dZcHpubmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6rnJ2grZihm52ipa+moaSon62Yl6admpqgnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3l1g4iCa3RjeWZgaWRjZGZqWGt7cGpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLOgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqeeqZygpKuUnp+eoKquqaajq6Ktm5+goZqlnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYRzdoiJj4N7aoVYXmt0ZF1ziGlrfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6qro6qgqJumn6ihrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+Hb3eFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZecn52Hpqukq62/wLGhqq+ql5KfnqKZoqSqo5OgoZ6dra6prKajo6agpaWdrqmRpJupraqcnaqcrKKWmKWWoaOYnH/OlHl6pYJ5lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4d2dmt9iG59hZCSfm2BjmBxa3BmYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSqpbKsrKykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpugpZOPnqWXnqijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qpm6emo6Grkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkY9lb3N1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62rqixp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrJiblqinr62op6mel5WapKKSlKGtm52mo66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmZjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb254d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK6prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kem5OqpLawrqCpm52WlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquro66arKiioaqis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiaCWlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5WoqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6Se3CXkn5wenR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaWbqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglpGmrZGZnKejoKqnrqGipqmwtMKys6qtqJSJmJ2lm6Kjr6WXoZWZnKWlq5qvna2opp6so7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4fHx5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSZpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjlnt9kpGJdXlyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Oeo5OQorGZnpynpqGir66co6eitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iarqGtpaaYr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph9i4ySi3h8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnamSlZeuoKCep6Scp5y1mZ+po7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaeZgpSNlot6eYGWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWimqWcrZifqKa2qL+vpamkn4yAjpuaoKaekpSZmpSamqWjo5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4yIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omoqXkJWWeniNnH1kc31hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCtnqubla6poo6Im46vrKimo6iZrpOZj6maoZ6ln5qjo6WZn6Kpsqi8r6Wonp2PfIublaGgmZCRmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmI+BgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srHHg2qrsL2teHeivrt0gJWNppyPmpCVnHmBkJp5Yn16Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqhmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXl5iQlZ58h46UdWWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6OjoJGMpZOnmaiZlqOqoJacpaWnr7qrrJqbk5J7hJeNpZeNkZCYlI2YlaeUnpeoopqwpp6irbqgscKopLSmrLGyq66sqLmkr7iWiqGopbadiZaimIapmpCUnZOqs5mboqugspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4uAdIN2dIiMcadtfJWRlJOBgY+Pj46dlKCVl5WggoeTjHBoj3Zvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp6TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+ctqOdp624qLDCrqO4p6+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaKwqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyVoIOGl4Z5cZVyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7quq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJioj565tqSlmJuNiXmBk4yak4qVkZSQjZKWooydnqien7ikf4SwtqOxsHSkv6SyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSdg5d+bpOznKOnrauiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2h3F8hoGAYWmIi5WTi1t2lZFnaI+OcnqkmJhleJiGgXeXaYOJgm55f2twZV91b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqa2jp62kkparta+xpZqqpquXc4ucr5+oq6eTlrigoI+co52RfoiImp6Nq5qjlaeino6Xkp6Fda2PiKaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPk6COmp+mmZyyloCMnLWetY2Sj72ooX6nonqjr7iBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5uGmH6RiYGCmGqNjIRqeHtxcGdkd25pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKGWp6i1no+DnKucp6KgjZC+npmNn5qgkH2FjpmXiKudopWgoZKNlImGgJGnjYainKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GfkZafpJaerIiftIm0mq6Lyoerrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2drXmJubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilqWptqOvf6CnnKWenYmUvZmTjaCRnZB5g5aWkYermZuamqGFj4x3m5yPn5CInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZegoaWsrKCdrrWjqJGgn6CmnJmOmLSZkIuejJWLdYGUkY2KppaVl56efpOFhqykh5uQipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvdHVxaG5Za2xzcmVcaV5iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJuinKOjpa2bmrGtrJOXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Scln2RiY6ooYeYj4qRopObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2poW3BqeXliX2ZYYkFQRU43VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNHVD9ZUlldPkRiXVZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mnJynn56ump2wqKudl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVl455ioSWo52JlI+Fi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX1tZF9raXd8ZGRhUl5WXVRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRFdBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZycqZOhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5WHcoCJkqCccpGQgIiYlJ+ahI6onJqViouKfINshYVxgaGMeIWNiIeSmZV8kqSgn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+EamZmY252eGhgY1NbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UD9QTVdTWE9SUWBlZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKONpKigmKmJmZeYk5mTkqCXjoeFe3B9hGh9j4OTmoF3kY2OiXB/ho+TkmyXk3yIkJGjlYOOqpqUkoqFiXmDdoeAboGfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdmt4h2ZqZ2J0dXFuVl5UWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmb2xlaWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko6Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6mXjJGLgIl6gH2KeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXNrcYFtcGhreHNrb1JYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5COinuHcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKskIWQioGKfYCAj3Npj6WEfYaUjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVyc297dHFian5uaGxTVltVYWFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNjI10hnqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY6BjYmElHWCh5JvbIqogIKLlI6JnJ+JjZOro6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cnFvd3hvXWyGbmlnVlpgV1xka2RVYVVeUV9wd3lranZlampqdXxxcnRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW5qKaLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm56Oc5WLiHF0a4J2c4BZcm6GkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZa3FbXmBZXl1mc317c29zY2traXt8cXt3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHVvdWdrZ2RdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrChkKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiIaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iOl4iVi4udl4SDeqyBkJeZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlZufiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiY+BdmuBg3t5mWlyaGBzinB9end2b3d0gV1eb4dobl9fWlxdU2dxVWNbW2FsaHR7fHJucGRramh/e214f3Fpb3BsZoF7coGAd4B9f4R6bYKMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNno2Fn5yKnpZ8eZSCe46ZiYaEhIZteIGAcoCHfoiThG1rfnmXhoSDkH6AhoSGfYeDjZqckoeqnoNyio+FkpKLnZF9jXqpg42Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GSi3d9iI6FpXt8j5CRhpiqoZ2TnI+Nqo6SgJ6MiZOanoKOl36HjoJveIVxdGB/g4+GdIuXgIOPgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qKinaFh4iLfG5rfX97bWhrbGdeeX5nfHt2dHV1e3dcYHB9bnVgY1pcXlFmbVNlWl1ha2l2eX5wa2xka2lngIBsc4BsbHRveG6EeW6GgHaCgH2FdnGCjYh+e3p8f3uCimBpe2t1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXt/eHKAhX2KkHxraHyAl4iBiI58foaEh3yPgY+am5GIp5x/cIuKi5KHoKGKhYx8p5GHj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIKbkYmSl5t+kpJ+h46BdXSCcHZgfYCNhXGKlXyIjHKNfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4V1goOIiHplcXp/eXpwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9xa313hnpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmJ1entxYmpveomNn7KSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N8hZeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqabh4yJg6WVhJKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5ScepCGg3iFl42efoGKjoxzl6KeoZKYjo+ijIyDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIOCdnuBiYV1YHd3fXR9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBjamNtZmh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGoJOXmHx3qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefIqVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqnj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SOj4pshpiQmXqHiJCJb5edmqOTlYqNn4yGgpKcf5KSlYaZiHuKiYF6cXlqdWx7fot+bYWRgpR3cIKDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9gHN0gIeDbWF6dHpxfG9hbmNke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2plamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpImNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JvipqFZ4aaj5R6iYWQinCWmpShkpKIi5mMgoCRnnySj5KLmY57ioSHdHN1a3FudXyLdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wb4CFg2Nod3N1cHpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGZiZ3GObmRpZ2VqaIB6d3RujoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ6Kj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnpGQiImVjn9+j5d8kY2PjZqSfIp/gm92b2ttb3B7hWlzg46XinF3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwiXyHjXuLh4SJj5yjiHyEd4KLgHh4bmqAgoBdcnJxcHB4Wl5xYW9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJda21kYmZrkm1gZ2ZfaGuBdXJycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoOMkqSak46JlZiShIaWmYyTi4mPj4iehZCKfHOLhYiPiJyZn5uWlICUf2mGnYhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoF3g4x8eWd0bHSHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGlrgYJ4X3dvbWtxclVecGJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOXGVkXXhwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV3ZnJqg2CHfm9va3pgam10f3RfdH14hnh0c4V8eaGQmrGcpo6Din+DmoiAi55/ipmTjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkneUkJibj5h7k3KGkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoipKIbImkhZKIl4OGY4yRmI6UipaMjYqLcXuUiXuOiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen5+f4aOenpoc2tzio+JgYWFfZaMbH5/b4GNf42IfoR7g5CWmpuLfHd4g5B5c21mcH+DbGh0b2doc2xTXm9lcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdWVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eKjH6LpIWSiZ2FhV6LlJeKjomOi4qEiWx7l4J9iIWJkI+GdoV9fWt9Y3h1aW14c1eIepGGhXp+f4CFjH55ZXNqf4mOiYKDgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmFzbG9haHVmUmBxZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXd3fIhxg4R9foh7dIuIiJaGjH5+l3JndXF5bYx7b3RwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSFoY2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcYaJoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYV8gIOAhIqCdmJ0bIiBj4qCfoCTkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscWtyeIBfcmhuXGp1YFFlcmlmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKho+Ygo2Ce5J0a3d1eXmTdW94en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F5cnNub2RyfmlmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGemiIi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+CZn2RgH5/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH91bW5qa3p9YmdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlnyJhnaJgW94eXuEk29ufIF3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiY+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXKBfWZ+i3t5fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94goCFg39rXnJ4en2NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuaGd8dmNbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpF4g4p0gYhyeXh+jZBvbnyBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSLhJmRjIVubIaTkXp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYacmZSLk5CVhYdwe5KCfYKDiYNugXdogIV4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop8dniAhHmBa1xxfnKBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36EgHd6ZWhqfHBfWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoN/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGh6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYKViHyCeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHR2hHqHnZGMkJKTjIqGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgXBbbX91eYuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1pwZExbcnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgI2ThXCAi253foB7e4iSiX9oe35qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFsc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn51f4F9jJmIgpSSmYiKhIl8j4hwe32Ee2h+bGqAe3ppenaCh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG+Ad3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm5qboKCdW5dZ2VzcVFaek5cb1xPXHNwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t2jHlrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnoF/f46PfXJ/c4R5gJKRg3iWjpWOh4KIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qa3Rne4BpdoCLkJR+en1+cHt2e3R+YlZ3fnNzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWhicm5KZHVMXm5VVFpzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4d7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHR+d4BwcX9thHSUhXh0a2B6gnmIj2Zxg29ndm5bbX2AkJR/gXmSk355e2yHdoGRjIR0loqRjYaFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjo2Ve3SAdXF/enxtf1lWdH5wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqX3VkSG5uTFphV1ZWeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnWDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV7amx1Y4R1koF2b2ZefYJ6i4llcoJranFjWG16hpuIgoJ0mJV4f3xtiHGCioyIcpiOkIeEi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGaBdmd0h4uOlXxxh2pufYF5bnxdWHJ/bXSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmtaX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6AcmliXn94eYuEZnF+aGprWlZvd4qjgYR/cpuUcoF5dIJugYKSiHSViIyHg4iFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWNhpZ/b4tmanqDdW10YlxvfGt1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxaZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JwhYJ+gX9vZmxnWF1bXFtUZHBkX1dicnVpdW9lZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW5renFiZ2tnhnSNg21mXl99cHuJfmltd2ZpZFVXcm+Np3yEfHaXkXR8c3x6bnx7kYV3mX2HhYKGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2VgbXpnc3iKfH5idoN2amtxdHtxenl0fWZ+f395d25kZmJuhnxta1ZqYnBTS2lqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn90dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8e3WDgox6b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXJ6aWhsaF9iV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4NmZVhid2l+h3tvaW9nZl1VWG9oj6l3gXp8kI55dXB/cHJ1eY5/eJV1hoJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9yY3FpXHB4ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0tsaE9HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFZubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygnp2gX+BdW6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl50gWlebWtcYVZcXGyBZXF0fWlpXGt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KAYmJUZXBngoV3d2ZoamBXVllnY4+ob353gIuOenBxfmh4b3mMe3ePcoR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLc2NQR1ZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcoh6dH18dnJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1ccoRoWG9tWl5XWlxse2Jwd3ZtYlpsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaReV5dUmZma4OCdH1iY2lcVFhdYmOQpWh4dIKFkHhtb3poeG17hHt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3FicXGCfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNxbVpaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGt6bW9we3x8cYF3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1JQWVJIY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPbm1cVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvVFtma2ZxdIF3c2NsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZXxwZnpzeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmlsX1RWU29nc2xmeGRkXFhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiZmZmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkY+Pj5CPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLi4aOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDo2ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5Ok4/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTtGeV87PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DREQ/Pj09QElIQ1h5b0M+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRU5AOkBlfn54cndvPjk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNe2ZAa4eEhIOCenA/OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1V1eXGBgYKCfISAckI9PT89PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXV0gX98g4N8hYVoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBMc3N/f32DhYaGh18+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4GDhIWGh4eJhEtERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1h0goSGhIKFiIiNY0BCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSluEhoeDgYOGiIl9V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZYeHhoGDhYCBgoOEhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aDgIOEgIGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdoV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUiCg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88V4aDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWOIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUU1LTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSkNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QUEhLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTUxOTVBNTk5NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lHSFBLREpNTFBOT05PT05KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIRENERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNGQkNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURHQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExNS0tISUNFQUVDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkNCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2RlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bXFxbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVlcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1pYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWl5WV1pbW1taW1lbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNWVFhcXF9gYF1hXVdgXlteXFteWFZYWFtbX2BcX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmJhXWBYY2RiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8ent9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7en15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKFhIODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCAjYyBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKBgIOWloOAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKEhIJ/fX18h5qYhoSChIKBf4CCgYKCgYKEgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYODi4iFfnx8fX5/mZqGhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaakYZ8gn+Cin6QmoOBgoGBgoKBgIKCgoKBgoODgoGBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hZ2ehYOLgICFgIGJgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICCmaGHhIWIh39/foGEg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKQnIOAgIGBfn59fYSFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aLgYB/g4uBfX18g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCf3+Fh4SBf36BhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/goWCgoSCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CEhIOBgYGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KBg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgYKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhYSEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYSGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0tTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/O0dXU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR062Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrcuauriZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp68ooyAjcWemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrKCIrNa6maGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUorGorZumspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJrBop2Vp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCexKe0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qombDO2sGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCnkaGfoJmolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeet6Sro57DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmnj4+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1b+/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMjJx8XJx8jHv8XHxMTHyMrTz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwsnBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvHvdTTx8jNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxM2/kMvGxcTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbizrrq7tr/Rn4jAzru/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBQEM9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK23trjEy4yFm8i9u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube5uLC6tLm8ybqDhYa1xL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7mxvb67xLa4pYeAi3uOnMWjfIOFscvGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6OwuMnTtrq+vMa0onhlcmVVYGaHjX2Hh6rOztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs7/LyNu+vb28gWp2YGd2XldWXHOAiYuozMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLXGkHHB08C0fVtMb2FQfH91YlZgfoaRqcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru70pdyg7XCm1hUVo1iUmSAhIVtSXKGl7TCvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz5DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wteYf3KLrnZST2yZWlJVWpqUd0xujqK0uLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucPVnYl9eJVgTmqNdV1RXWy6tXVUV4+4tbKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAyp+JgX2AWFiSj2dxYHdyepd3bmtfi72zsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucWrlYmMeExmoMN9hpuQXX95bHV5ibG6tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO7t5aToIpNaJKTdm95cmhpa3aBd3ilvLiytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsremnaiTWIBwc21ka19ZV1hbYl9sgZu5sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmwwLGzfHh2cnRlV1ZPSUlLTk9PXGtwprWqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamhpsfEpmFmaXJgUk9KcFVWSk9KTFReXYG3r6+ztaqnrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnpy7vH1vaWphVEpXcJyLellMRkdOVFRorrKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk9PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueqauWfWtdVE1NXJ3Ey6lvWUxFQ0dNYZiwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGjim9fVVJRVWnA49K0nYdvWUpFVJGYnauqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQ0ZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjondZUlFUVmiDwMyzmLHIsJSKmLnFoqmtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQSD9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoZ1oUEtQUWmBnLW6p4ez4NvW29rItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVXUxHTlh+k8C4pJCY1eTb0cS0pp+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0dLVztPJvcC/w7vGxcjF0tTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmFKSk5mirrX07+vwNTLua6oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTW2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKR1XWdtjbzY3NrWy7qyqqOdnZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6Osin+Ts9LV2trPvK6om5WYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czRzdTX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGlnICUlsfY09bCraahmJWXmZudoJ6ZnZ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp39sgZTT1s2wm5uWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKpob32n2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWiX294udCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKykV9ygL6wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4NjdY+1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL66uMm2qrCBa3KZnI2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKvr+8wLqytLTDrqmuhmtkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWlxkbm9oZ2dpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqvo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbK0qL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DEt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0tbu1sK60u62op4hgbY2DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+lpaelraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGoq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S4tL7Aq7W7saukrrKsn6GLYYCHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypaapuK2ipqafqKyrmZ+gnpmdn6WamqOcm52vqaunqqusrbGyuK+4ubuwtry8uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadhWaChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyjoqidm52lpqKmnKCgm5iurq2usqCloq6sp6K1sbKyrKivsqe6s6a1oKKem6OiraOiqrWqoqOmnaamo5aZnpeZmp2gmpeenJybrKGrp6Okpq2rs7SqtbCzq7K5tK+pr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6RmnppgYOEf3hvcXRxaWZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoZ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqets7Clq66ysbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrry7tbu8tbi5r6+vp5uYn6eSj4pyeoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZqgZaTlYySlJSbmZ2Xl5ygnKCWoaCmpaSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu6tbKrq6WYl52hiodxe4d+dm5jYWZpaGZnamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtaWVpbV1VYV1RUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlZaXpJmgl5ygpaKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKKkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHkJGPmpOVk5ybo5yboKipq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CsqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tqyrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhJOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc2MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpuNkH52hXh7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4SSeoiNiop2cX1udHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5aXmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAhYuGdW91bHBsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFVUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCdIeMhXlwc3Fub2RwZl9URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWChGyViId7dXh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKS0VLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXI9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4FzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhloqOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+Lm5uknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Jf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIaEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYKAiYyKhJKFgoaIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhoiFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqatrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BemlWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5mfrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7y8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWFcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpZ+fmpmDpJ2spKqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Iz7Sku7C1sJusub2afnhrXF9cWV1hWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5WWh56Zppusr6ivp7O01NTV1tLLz9PVztPPzcXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltcXVhgV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxWX1JdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjHzc/IwsvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XU1lSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVZFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlYyGe5uIk4+uq5SVl56Ypq62vaitvcbLyMnLy8/JxNLK1NbY19jX1NvX09nb1tDb2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19TVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYuUkZ2Rgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk7Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Vm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmeo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKNkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE9FQz48Q0FCOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLStq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKics6WkqZSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJKPiJegmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSERMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gtq6yXh5qpp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu7/CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8K3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1tK6ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK7uK6ouLq9uIJrbVlWVFRNRUpTTks/QkhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5Wlra6upYuTlaGNdMGafpeZhY+WmoyxlZualZOTmpmlo5Wgm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKytsbGjobKytKRvbGVbWU5PS0VPUFBRO0hKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqKatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoamfqKCZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJytqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqoraywoqOYqrS7pammrKqdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wkk6+rmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56co6Wal5WZqqGedl5bX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylm5Wxp5mvp5+aqZ6gjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGloKqtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqppOYtaOfsqGgm66Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORkVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaMmLObo66anputkJ6TlpOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq+ysqerpqGem5qblpion6CYop6vsqKmjJeumKSrl5mepJGbjZOWmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurpp6YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6OwsbSrsqirn5ugoJuepZ2il52js7Can4+TpZqgqZqUop6VmImTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKqjsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sts56rorCws6uptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqWpoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+oo56VoZmbqLWpl5mRkp6ZnqCekKuel5eFlJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpuSf5KXjJ2cmpaQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpaCdlIKRlY+cnJiWlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLOytay0raqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqZlZOHl5KVmaebn56MkpGOkHd+jYV9fHyHiYhwc3F+fX1cU2RvXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sLKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvrfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0rqqwrq2xsLSttLukt7KrrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6qotqqmrq+qua+osbGvsq22qre3prO1q6ykqauco56zs6iopLS0oLatoKqoq6msp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dxeFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCxrritobavycfI0cC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zsrmwo622sbCzuqu5r6mttauqnqmsn6Kgta2ooZ+vsqK0qp6op6qkqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2OioeUiH2NhoSEpJaEgYKKho2MkIODk6CWh5CckJKQjZGclJePioaFeHSBf3x1eHmAe3RzemiAhqN1aV5la4F1Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6i5qqausMnHydHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeqpKmdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSnKGlnZiXqaiSmJqTkIqCj4V+j4J/iJ6PhX59i4aQjY+Ef5Kak4WToYyTkYuRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj06RFg/Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKWwprCgn6upqKKqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWl5Sfopabl6ari56RkJGMgoqAgI+Ae5qVjYh7fouFjo2LioORl5CGlKOJkZGHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1dlTyk7Mk9ZPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOun7ivq6i0u8jLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmfrKipnqCqr6ehppijqKCwuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpmTmZ6TmZahqZCaiY6Qhn2Hf4KOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJCVgouXjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbazrqC3rK6tsLXGyMG3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImLj4R6hX6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsxYFQsMpajoZeVnKmdpaGjobeqr6C6uaasvcWzsK+jta+srq+0xMS9s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio6FeYR8hYV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqX2hiaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enqS1rKequreorMPBt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At668vLGln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqelkZmmraKZnqSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSOlJiMj5iap5+RiImKiHiFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrY2dkY3R/YWRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkE6M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2tpp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWgmaWjqZ2aoJyUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY97gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoY2Fyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGmtq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6qKmftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WWmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGI8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppycp6eek5+gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrq9t8C+qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+fqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSql5SinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6op5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCraeln6OkqrG3rbS9vrC3xbK4usKnqbCsr6mpsa6ksLqwpKSus6Opuames7Owo6Wgqq2wrK+mp5+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WkprOzp6Oinaeqsqiwp6WeoJ+wl6CalZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygo6WjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrK+kmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmdgRU9rX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1iZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5uRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmlmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7KkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Ouu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoKiroJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/ppazw7Ssqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpdmolhZIeOlWtggJVjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKywtKy1o76xsqego6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6mknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhZiVjoqMmJeHlJWKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Plq2Pe5WbgpKBiamohYCYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLGgrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZicoJ2Hpqukq62/wLGhqq6qlpKfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ6lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFxxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLkowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKsraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnJyil6Cpqp+VoZ6dna6vp6qom6amo6Cqkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBFRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPCg9MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZucopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqhlJyfpquroq2Zq6ihoamis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ+VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGYm6aioKqnrqGjp6mwtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWchJ6DrH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1j5Gjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnZumpKGir62dpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iZraGspKWXr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT9AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoJ+dpaOcp5y1mqCqo7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ynvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioCkpYicbbJvoIetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiJOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZgpOLlYp5eYKWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6wrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5moq6uio56pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnqybla6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIublqGgmpCRmpuRmZennqGYqK2mpKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZKmm5OPkZiYj5iTqJmfmKmon6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppiOkZCYlI2XlaeUnpeoopqvpp2irLmfsMGopLOmrLGyq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiXmBlIybk4qVkZSQjZGWoYydnqienrejf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm55f2twZV92b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrigoI+cpJ2RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmZuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRqeHtxcGdkd21pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNlImGgJGojoeinKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rsIekjaqajJp+o3aAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpeeoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlZCGi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6Uo5+gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8k6SgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF3kY2OiXB/ho+SkmyXk3yIkJGjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UorOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/i5KHhpOPfXuBhJekjX+lpY2AjYmElHWDh5JvbIqogIKLk42InJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyPiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Pc5WLiHF0a4J2c39Zcm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoF7coGAd4B9f4R7bYKMhnx6eHx+eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnpZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1sfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8j5CRhpipoZyTnI+Nqo6SgJ6NiZOan4OPl3+HjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l2eX5wa2xja2pngIBrcoBsa3RveG6EeW6GgHaCgH2FdnKCjYh+e3p8f3uCimBpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXmNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+ampGIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXt7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHx1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCUlpWNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjoxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2c3N0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF5bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmJB4e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpOWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2Fub3Zyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZmxoamxngHx6d2+Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId317inx7gHZ3f4BwdHN6b4V9gYCJfXthXH6PkYZ/g4RzeoCGeo+Rh5GRnJKkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2SkJOMmY97iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGp6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZl1paGZiZ3GNbmRpZ2VpaIB6d3VvjoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3R7doR3eH9yc3uFa3JveW2JdoCAhm1wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoGaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHpwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8Y4Z8b3BsdGpob2x2d19xfnl7dHV0f4J/pZWarZ+nloWNg3+XlYOPnnWKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9sbVVRgauUh4J4gHZygnmCoIGRgZOSmJuRmniReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQe46MjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZlXXhwiHxfXGhyYmJlZpFpX2hkW2dwfm9rcXOKfXZ9hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW50f3RfdH14hnh0coV8eaGQmrGcpo6Din+DmoiAi55+ipmSjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZOIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYp6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYp0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn96iX9yiYeBkYqIfH6YdmVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmchoSfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH6LpIWSiZ2FhV6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6OgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn36IYX+Th4SHg4mNf3+CZn2RgH5/goyPkH9tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi459aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fpSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYdwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxfnOBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBf4N/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnV/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGd6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3dviIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGfnuShnd/hIyDa39yaIB+eG18fIKKhHdieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphwcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5dZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5deGhVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGtrWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tmanqDdW10YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6Jfm1uVmpfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYV3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbntnc3iKfH5idoN2amtxdXtxenp0fWZ+f395d25kZmJuhXxtalZpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx4Y3OAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx8a2tVaGFlU0prZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB6aGthb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JthXt9fXl1cmx5aGl4Zl1lc2h6d5KBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUlXZVFIYnhaXV9sW15cYWRef2lqX250eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbaHVmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3FicXGCfHNncoBlXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWldpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXlNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWVJIY3RiYEZValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaFNURlpcT0hydFhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIF3c2NsdlVicmtaX29mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNQSGRzX2FFWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ej25hZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybYh7f3acenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo5xYmdqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkZCPkJCPj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipCLi5CJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiIWJi4aIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhoeHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiOiISGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTo3Ojw8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5O0s7OTo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgYCBgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTpNelI6PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz49QEhHQF56aT0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpLS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFREg/O0BjfHt1c3hsOTk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBFc2I/a4WEhISBeWw7OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP010em2AgIOBe4N+cEA9PT8+PT5DRD88PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhtb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VATnN1gH57g4N8hIRoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBJcnN/fn2EhYWFhl0+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARURmdoCEhYWFh4eJgkpERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1l5goWHhIGGiYmMYUBCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGCEh4iDgYOHiIl7V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZIeHhYGDhYCBgYOEhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aCf4ODgYGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdYV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUeBg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSkxMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88VoaDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWSIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVRwdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4CAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9MSk1MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTktMTUxMTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zb3V0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKSktJSUxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFudnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZJR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMR0ZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eHhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRURUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUhISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NPUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlN0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFRS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUUEtPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXUlNTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VXVltbV1BTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGRgYWBhY2VfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmllZ15dZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWlNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVlYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taW1lbWVleX2BgZGNkZWViZFphZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVlVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlNWVFhdXF9gYF1hXVdgXlteXFteWFZYWFtbX2BbXlhYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBkZF9SWFlQWFZYWFhXVldWXV5eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZWdnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YV1lbWllXWllgXmFiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxmaGhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2RhY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlX2ZnaWhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6ent4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdyc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e316e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhoWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWIh4eHhoaIh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoOEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgoGBj4iBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYOCgISZkYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIJ/fn19iJuVhYSChIKBf4CCgYKCgYKEg4GBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYOCiYiFfnx8fX6BmpiEhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gIOXkYZ9gX6CiX6SmIKCgoGBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/g5uehYSKf4CEf4KJgoGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBmKKHhYSJhn5+foGDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSAgIGBfX19fYWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aOgoB/hYyBfX19g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OBf4CGhoOAf3+BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/g4aDgoOCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISCgIGFhIOBgoGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgoKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+f4B/fX9+fX6AgoODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqIi4mFiJGOi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIOBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fH19fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhIWEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGgoSEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWChIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB9fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KDh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhoaIhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeHh4iGhoSGhYOEg4ODg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeHh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4aGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhYWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNXAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImpzOo6CLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZu5qHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoL6ZkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJu+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZChrKCarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qom6CapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp+vnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbLkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkBCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4bnlqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3NiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvIu7rIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxMjGx8nDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1paWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq8tsfUucu+wbu/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbfTwJjUu7+8u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLe7vcHEube3trW5ubm60rSMuMPCwr7Ht7m4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wuLuyvb67xLa1uLa4wMDFu82ohJXCy8nGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Oxub2+srq+vMW4sbi4tsO5v8PEn4SLucrMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzCvc3EvbvEv7mxlYqOeoiVrZeFjK7GycjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vMbI28K1v7ywjGpxcVhiZniJio2owcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru8vbrSssHJtrSSdHloYn5pW1pccIqPqbvBvb7GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC30LamxraOZ1Jubk9zi393Xll+krG5t7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/tsm0lrGhZ1hVi3BTXXqCh4BNaJi1trKyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbvGspOehVhTZ5xmUldXkql+WFqnw7mzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ure7z7mYk3JSZY58ZlRibaW9hmNTdp67trG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO1uce+oJJkUouZcnp5i3KCknVwdW2iwbiztLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrLAvqycVl6UxJWBmJJmdXV2gH59r7+4sayzr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqnvcm1pFZkhZN+aXRsZ2Nma3VxcJCus7OqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqulqbGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHTlJOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamin7TPwKxdeHV4dGRpWVBPU1JXV2B3hqm1rq+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp6pzc2Zb3p2dGNTTVRIUElQTUxVZGeItbCwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVExTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopuepMqwaGprc2JSU1WFdWpTT0pKUVZZY6evrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGsmHhua2BUTFh6qrCgbFJIRUdMUVaNq6qqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby2vbOztaKsoqmosqmrqKeompmemqqnn5mnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoJ+IbWBVUFFbot3gw41wW0tEQERhlrCtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sqyisKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Uc2JXU1RZbbPcxrCrrIxtVVuBrLCmo6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7q6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXlxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZudiV9TUVVZboe1xbOUntjKrKOwrKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb6/vrW+s62/v8LDx8THxK6+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHh0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5ydm3xTSk9SZ4OitrKlia3Mu7Gso56cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydHZoY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoaVxTkVNVXeTxcqunKOxqaKcnZygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0snP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8XJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZvY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6GseE1JTl6Et9vVuK2qmpSXn5uboKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdLLztDAxsLHxc7N0dHRyMvNwMrMxdPOzM7IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKKjs4tbZW2Jt9fGr6afl5WXmZqdoJyZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3Oy87Ox8vQ0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dW9wbmthZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2po7ObeIqnztSzm5uVk5ebnp6enJSWmJWIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz8zIx8vExsHFyszNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBya21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKujiI2SuNSslI2NmJWQlJKRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfM0MTFx7vHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO1kmiAiMSukI2Ol4+Gg4SEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsW8vMDDxczFxbvAysLFx9LEwMi/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvuYJifo+2j4qSl4d6gIWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/tbW9v7vMw7y1usi6v77Lw8HFwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rrK5vZXaPk4uIioV5gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tL2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29v72xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL65uMm2qq+jZWl1jI+GiIl7eH6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK62sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4va+wp7KztLu8q621pq61r7uysKm5sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvsC8wbqytLXEr6qvm2Fsf5GIjo97eH6Khnp7hIF3bl5dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6mut7S0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqWot6yxsre6uruyvL2/vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w765yrfBw8G0try2sa+1vK6oqZdlb4iDiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+lpaelraCdm6SmrLKvtrensKuoqrSqtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S3s7/ArLa8sqylr7StoKKUbHiFhoaBfHl1c29ta2ppcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqayspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6y6urGinqmrp5edkHF/hYZ/eHJucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgmpiurq2usqCloq2rp6G1sbKyrKivsqe6s6a1oKKem6OiraOiqbWqoqOmnaamo5aYnpeZmp2gmpednJybrKGrp6Okpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqtsrWvn5qjqqGSmY15f4OEf3hvcXRxaGZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn56pnJqaq6evsKqbo6S4qaCfrqi2qqanrbCkt7Ckt6Cim5mZqqagmqy4sKKhpJyin5+TlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tbu8tbm5sLCxqpyZoamVkImMgYB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCmpaSmp5+cn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhoZStsbGfoqOdnpibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu7trOtraiZmJ+ji4hziYh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl5ygpaGtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9xMmssbjCtbzBvLS1q6ymlZmbm4d/coiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHkJGPmZOVk5ybo5yboKipq6isp6ilo5ikrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmprZqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJujlZuho6GXoaijoqiroKuvo623paOjoqytqqirr7K3sr21s6uvmIRzc2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8PIsay4v7e8vru0t6eqoJaWmJWFeXSAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivo6ian6yhlZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cXJiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba3vL7Bw7GwsrittLS7tLalpJ2cl5aSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52nmaClm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXnJGRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmYyZpKaopqGftLKosrehnKK3rKqtpLKypbW8taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsub20t8CvramxnqauurCwoZubnZWThnqCbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZaim5WNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+inpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqCho6OborSvrK+sn5iluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4r7SwycS3ucHOxb6zrLrBq63Draiip5KdpreupaKQlpeTj313fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjZyXi5SQn5idlZSWlI6WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOWjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZmDlJyxpJ2aiJSQjId8c3VdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiFlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpaOf4qUqZeYjX+OhIR9d3FuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3uBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpyPlIF4iHp9d3BwaVhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeomPjI14cn9vdnFsbmtYS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OSkNITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6q7wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAho2IdnB2bXFtZmxrWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dWp5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIRkJBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaOlJmLjYV5hJCYlI2QjI+GcYeCdIeNiHtxc3FvcGZxZ19URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqCVc3iAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdW5jdoN+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltaqusa7BsrvBxpaPjJSQgIh9boGQkomDioePhXWChGyViIl8dXh4bXdud2RpXklQRz5ANzQ0ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwc3p3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CBfnpodmtSV0xARTIxMTI2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3F5dmhta192fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4l+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYaEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gYl6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGZ4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6GgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiaiZKKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hHaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqq2orrW7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hoiFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiqiX6Be2pWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWnpifrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRTUVBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvbnU0M/Xz8nM0szPzsrHv7/Cyr3BvcLAxcTFyr/Iz7Sku7C1sJusub2afnhrXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pOm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5SWh56Zppusr6ivp7O01NTU1tHLz9PVztPPzMXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltbXVdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuQnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PjU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8fHZ8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjIzc/HwcvQ09HU087TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE1Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVVFRkpJRUU9Ojc5QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRWT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlIyFe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/IxNLK1NbY19jX1NvX09nb1s/b2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWIiIGFkJGenJmJhYuBhZd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19SVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuPkI5bg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjooaTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuoYOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6ShiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrWdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJieo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKOkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE5FQz48Q0FBOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLOsq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSofoiGnK29sIKMjIuQg4+DkY96gYeQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQktARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSENMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB7jX94h4KBkHqNoZaompqYur3HyMnB0snKwsy8wbKtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu77CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8G3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZR9iJGZkKqZmJOTj5KVk6Wdk52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK6uK6ot7q9uIJrbVlWVFRNRUpTTks/QUhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4Kcg4OVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5alra6upYuTlaGNdMGafZaZhY+WmoyxlZualZKTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGVbWU5PS0VPUFBRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZKFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqaatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaIm5imm3a/n4SZnY6TmZqLr5ehnJuWlZufoamfp6CZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfuq+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsHGyMXCzcjBvbmyr7i0wMLKtcWxwby0uqqoraywoqOYqrS7paimq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6KYkaKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52lnKiqnpmVj5SbipaJjKSilJ2inqC0r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl5bX11KSEVGTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8DCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKkqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaylm5Wxp5mupp6ZqZ2fjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCTo5+WpZ+mqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGkn6mtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaGdpJirq6ymoZmNmp+SnomOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKOframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrJussJypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaeekqGelJ6PkI2VnZqinqezpqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtb/EvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Grqpefppetu7Sbp7CbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKuhl5eSpqWiopiYpa+4rrK1tqCfqKSZlZWTpKC3oqSllq+xsqeqpqGem5qalpeon5+YoZ6vsqKmjJeumKSql5mepJCajZOXmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKawnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJudpZyhl52js7Can4+TpZqfqJqUop2Ul4mTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBv7+4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sss56rorCws6uptbS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqSpn6SXkJmfs6qzqqqzmp2nm5qVjqCmpLSup6Gsra6xp7OtsaqknJ+oo56VoZmbqLWpl5mRkp6ZnZ+dkKqdlpeElJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G2vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6uqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZWamrKjraCmr5ehpJqako6ipaeyqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpqSf5KXjJ2cmZWQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbiyqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJSbmZWxnqecoKqOqaOem5aYpqWlt6eisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpZ+dlIKRlY+cm5eVlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5CZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsC7w7eysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynKCnsK2mpa+lnbK1rKuxsa2pqLS6rLSytay0rKqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvo6mcnpybr5mjo6Kjkayeo6CgoqqlprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqYlJOHl5KVmaebn56MkpGOkHZ+jYV9fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrb3Muq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6a2sbKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSirqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6mwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesq6qtoaimprGypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6uotqqmra+qua+osbGvsq22qre3prS3q6ykqaqco56zs6iopLS0oLatoKqoq6irp6Crq6i5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dweFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCwrritobavycfI0MC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zs7mwo622sbCzuqu5r6mttqyqnqmsn6Kgta2noZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOioqOnmJqppZiXmZ2OioeUh32NhoSEpJaEgYKKho2MkIODk6CWh5CckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqN1aV5la4F0Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjM4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6e5qqausMnHyNHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqepo6mdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSm6GknZiXqaiSmJqTkIqCj4V+joJ/iJ6PhX59i4aQjY+Ef5Kak4WToYyUkouRmpGVhol+gHJ7eX18aHd8enRwcHxnhHiEiGRhZ2NxhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj06RFc+Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjua2oqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKSwprCgn6upp6Kqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWlpSfoZabl6ari56RkJGLgoqAf46Ae5qVjYh7fouFjo2LioORl5CGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7e3FwcHJ3Z39zaoNnZGdgbXOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy8zJiw6JDQxQmhZMTNTPWVfREw2S1ZkTyk7Mk9YPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmerKipnqCqrqegppijqJ+wuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpiTmJ6TmZahqZCZiY6Phn2HfoKOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJGVgouXjJF8hXtzcH1xc3RgeXhpbnBwbmh9cWN6bGllY19lhX9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFdaUmdPSExFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNioqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9YVzUol52mmZ2WraCgoaSht6uxpLO0qqi5xLWzrp+3rK6tsLXGyMC3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGWm6+moZ6ip6+hoKKTpKSit6+hprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5ScjpOXo6ihkIiLj4V6hH6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2logm1lcmprZGhbYnN/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVENUXWhFLjsxX1MsMpajoZeVnKmdpaGjobeqr6C6uaasvcSzsK+itK+srq+0xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpSWmo2Tk6OnpI+Iio6FeYR8hIV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhnaWdlboRnaGhkZmhqX2diaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGJOJzKepKOSjqSmnJ6enqS1rKequreorMPAt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At667u7Gln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqekkZmmraKZnaSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSNlJeMj5iap5+RiIqKh3iFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrYmdkY3R/YmRlZmVpamNocFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BkRyU1m6SgkYyuoJmYoJaltLGisb63obHGu7mwsaK2q6uuqbi9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2spp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaSjqZyan5yUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY57gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKvn7jAtqC0wbu9ubGltq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6p6mftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WVmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl1fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8K4vb2tp7awpqukt7Sys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppybp6edkp6gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOIhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+eqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSplpOinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6lk4Gnqp+XnZ2lrbKpscK9srW/tbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6np5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSoZWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa6ksLqvpKSus6Opuames7Owo6Wgqq2wrK+mqJ+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+7qqGnta2jq7WkprOzp6OhnaeqsqiwqKWeoJ+wl6CalZWXmZ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW2OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyhmyXh19TtbTIhoCJfGOkM0Kddl1RaWhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCjnp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+j5+kfrB2g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB2c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi6inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W0tKKysqOgrK+kmKa6rqSxsJy0uKmgpZ2hqqWxqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKSnoJWbpqeimqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXWhgRU9rX3FtVlVNL2VjaVNZUTtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3n52UoLiwmLPBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mfn6ihtaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6GcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qbu1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLmio6uhl5uRoqCVlJ6blJmgoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZuZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7OkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivtsSxurKuu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoairoJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolynsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoKG/pZazwrSsqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKWtqqa1qKifm5ago56spL6moaqYlZyRopuSj6GooZOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6RgnGUhV9yalpdmolhZIeOlWtgf5VjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xc3l9fGJbd3SBaFBcboN8e4pqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqkm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6iknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqampCWgmhufHF2kJeUkYSKtKmNhZiVjoqMmJeHk5WKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop6eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Olq2Pe5SbgpGBiqmohYCYloqEjp+Ie4OQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroSJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rautsbKgqqayraKss7DFsKqso7KvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzx7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iMbGhqepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLCfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWdhq1od7nEuHGSoaN7ppiZc6qCfMvAwLtxiqKHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msravqqamprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGfoZiboJ2Hpqukq62/wLGhqq6ql5KfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYF5lZabX62PXY6ngKGgfKeVm3SrgoCvXmSMqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKtraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qom6amo6Cqkqyzlqaiqqqeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1NcYFpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCc9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Oira62r6mxp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKoq66mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCHoJqHpF9gUquEf66Cm3WugaaGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqjn4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpqCbpZ+dpaempJysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquroq2Zq6ihoamisq2iqrKyoZuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkiIegepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOCoI6Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKarrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGZnKejoKqnrqGjp6mvtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esoLG4sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV0jpGjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWvrq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnpynpaGir62dpKiitbHDsa2qraqRhpGcp52jpJ2ll56YmZmlo6iZraGspKWXrqW7rKG3t66dnrazubGzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnIiTkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2Jzsrhod4+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqSdp5y1mqCqo7WrwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ymvayUvbCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoIetfKGPg6iWmYCsiISuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4nZ+OiJOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2UkKaZgpOLlYp5eYKWf2psfmJ9dG5/eV9mZXFuZ2doQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5mnqquio56pqL6kl8OsqqOiq7O6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzf3xgaWZwbWZlZU9VY1xBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBgYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnayblK6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIualqGgmpCRmpuRmZennqCYp6ympKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6trqWnlJSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqJmfl6ion6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eGRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOpurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspY2WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppeNkZCYlI2XlaeUnpenopqvpp2irLmfsMGopLOmrLGxq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHlpa2Rkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq6isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRl6yji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCMe4GUjKGUipSRlZCPk5elj56ZqJ6btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+aW5kX3BpYFtfWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiHmBk4ybk4qVkZSQjZGWoYydnaednrijf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm54fmpwZV91b2traFxlY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrifoI+co52RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGXo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmJuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjY+Si4NucY+IeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRreHpwcGdkd21pbGpbZGppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNk4mGgJGojoeinKOTl56Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkuLGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZmYhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rr4ekjaqajJp+onWAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipipmJmakoelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwcpKHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKekno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpacoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXmjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlY+Gi52RnJuJj6iioJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6ToZ6gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJMf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV5iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTXqGntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYUlXSVRfV1NbZWpbZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF4kY2OiXB/ho+SkmyXk3yJkZKjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHGehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUU9sXmhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5Zyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCDdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3WJfZB7ZYOHlYqKlZmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R1hnKRg21/i5KHhpOPfXuBhZeljX+lpY2AjYmElHWDh5JvbIqogIKLlI6JnJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYJ9e25/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450c4RwlYV7fZKLhoaQhXh+gIaZo4x7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Oc5WLiHF0a4J2c39Ycm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe310fnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gIOKm5+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZlIqenYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHiPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgoiRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoB7coGAd4B9f4R7bYKMhXx6eHx9eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfYiThG1rfnqXhoSDkH6AhoSGfYeDjZudkoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8jpCRhpipoZyTnI+Nqo6SgJ6NiJOan4OPl36GjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l1eX5wa2xja2pngH9rcoBsa3RueG6EeW6GgHaCgH2FdnGCjYd9e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUipiZeHqNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+bm5GIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyMj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHt1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam19Z25wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjYxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB4iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2cnN0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmI94e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpSWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2FubnVyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZWxoaWxngHx6d2+Ph3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXFjh2hxb2V2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpSIdn17inx7gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmY57iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+Bf4GHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGl6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZV1paGZiZ3GNbmRpZ2RpaIB6d3VvjoRzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+imKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3N7doR3eH9yc3uFa3JveW2JdoCAhm5wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0f4J+pZWarZ+nloWNg3+XlYOPnnSKn5OShYqajJWOi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSmJuRmXiReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQeo6LjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbXlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZkXXhwiHxeXGhyYmJlZpFpX2dkWmhwfm9rcXOKfXZ9hYB0dX+MeXuGgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW10f3RfdHx4hnhzcoV8eaGQmrGcpo6Din+DmoiAi51+ipmSjoSIl42OjoR2c3ZzgHBvhXNwcYNvaml2bYJufXxtdHNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZKIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYl6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3B4ZmtqYmZ4c29wY193YGBWa19ddk9NS2BmY115cYp0XFtldWBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdmVzbnxliH9vcGuAWWtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV+fImch4SfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp8amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH2LpIWSiZ2Fhl6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmuBdm6JkoORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhwenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmKnYOEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3CGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4V9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpLZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WCfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J2jpt9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn3+IYX+Th4SHg4mNf3+CZn2Rf35/goyPkH5tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05ITmZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcYCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi499aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18bllbXmxjWmJvd2RmW11gbGljbGlzdoGDcW5+fH90dYN6g4J8gYV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeHp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aXiYjn6AioKVl4l5jpZvenNwbGpkYHN6aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYhwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxf3OBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoJ/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKFZ4eDcGd6loh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGf3uShnd/hI2Da39yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaU1XZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2praXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyAgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoYltiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH5sWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5cZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWVOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ji4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZl9vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJvXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tjUFtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIWDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWDdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmIj2ZyhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfHNndGVui4Rtc1ppXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCa3JXal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpncmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x8i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGprWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p2Wmd9fHhlcn1thHRldYWMhZV/b4tmanqDdW11YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6JfmxtVmlfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pc3VzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYZ3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenl0fWZ+f395d25kZmJuhXxtalVpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3ZmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anNzdG6EgXp/fXV1bnpoanlqX2VuaIF2kIVnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21bbYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx5YnOAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx9a2tVaGFlU0prZ09HUWtFYHhnYU1TcVxKTVRZZWt3emVfbXFpZF1WYFZubldLU2hXZV5YTVVrVEpceV9bX2tdXVtjZWB5aGthb291bm94dXqYfXeAgXqAgIeFenh5g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JshXt9fXl1cmx5aGl4Zl1lcmh6d5OBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dGVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUhXZVBIYnhaXV9sW15cYWNef2lqX250eG5vbnaDl3lygYB8f4iLhX51dYV4h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJuhmx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbZ3RmdnaSel9dUmVma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVx3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3BicXGBfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWlZpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2mFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZm9+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWFFIY3RiYEZValBJUFpVamtrfGVtbnFhW1pYWWxwV1NPZldXaFNURlpcTkhydFhfY21jWGBgYl2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl8h22PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIB2c2NsdlVicmtaXm9mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlOSFdUVm1oZHxpa3drYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmx5dW5vaHZ2f39sg399hpd7f4eBiX5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnlyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybIh7f3acenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNeaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo1wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh455bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhoaGhoWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTk3OTs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5OTk4ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PT9APjxNTDk8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DRERBPj0+QEE/PmpvQj0/Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGREA8PD1ARERFbXlJNjo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAQVhAPlt4fHt5eVM3Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQT9GeFhjhISEg4J7Xzs+PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0p0eICBgoF7g4FoP0FAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFATHN8gHuCg36FhVk+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVKcH1/fYOFhoaHaEFFRURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSE1yf4OEhIKFh4iKVUFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGeAhIaDgISIiYxwTm2Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKU4CFhoKAgoSGh4OAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpdhYWEgIKFgIKCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWCGhIF+gIKEg4KCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCXoSAgICCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOjxqhoGCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+RXqEgYKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QENQgYODhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPjxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERlaDgoOFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCR0dKWYSCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZJSVBggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FER0pMVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GTU9QVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1daWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVU1VUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1TZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZlJRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3p7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9APzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUWFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48Qkc/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTE5OV0tMTktMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSE1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtHSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUZLTUhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9REVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VCRElGQ0ZFQkVHRUVGR0VJTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVtfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01NTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWWltdXltcXmBgYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93SkxMS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJITk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkVGQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0hJTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkNHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KR0hOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0FFQ0hJTUlGQ0ZKTElHRkpNS0ZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFeXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2RjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2FiYWBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RSUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUVRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVWWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcHd5f2NcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1dWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWW1tWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeXGRgYWBhY2RfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVVVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deWldRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVVNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taWllbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNVVFhdXF9gYF1gXVdgXlteXFteWFZYWFtbX19bX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXlxfWVpeXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9fXl9bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYCAgX58fHx8fXyBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4e3d5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGChIGCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SBgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYiRgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKChIKCg4KCi5iHhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChIWEg4F/fnyIm4uDhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCDjYV+fH5/f3+Zj4GCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIOWin2Af4KKf42NgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAgpqNgouCgoOAf4SDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKCmIyEhYeHfX9+gIaFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFhIOSiIGBgIR/f359hYeGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhIaDgYCEjIJ+fX2BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISDg4KAgYWEg4KAfn6Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCDhYOCg4KBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OAgYWEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4KEhIOEg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICBg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIJ/gIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB+fYB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4GBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgYKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/Oz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz8+il8rSxpKr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNeooKugzpmtmrPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3CnJWQobOVhp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbq52fp5m0wMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoMOioIygxdORmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjal8XJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCgtqCUlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonYufr7OdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqOQopqinJyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo4Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqedvp6poKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Nzo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmujpGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1cG91tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc2Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2dna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Nzk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29rb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2trZ2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29vb3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2tra2trb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/Pz9AOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ycnJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2cnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnJ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lSWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mpqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqaop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israahop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoKWorKempaWjo6eklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d3B9eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yjp6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2JsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqWnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclYyHkouYmJWanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkE9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKx8a/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmSiZWRl5WUmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eHp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL63vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWJqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbeyr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL7DwLrEwr7HuLm4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLSysbHysnGz8LBuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysLN2cjLycjMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbG18er1MXEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL66wMrCxtPAlMLDv8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e8trnBurq4uLXEwcTJuYydvLnBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4wLa1wLO1srKqrqa3ua+Lj6+2uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q2ttHAssC3sJ2QjH53io6fjIyltbOyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLnSzLC/rKGAbH1tYGdpeoqOpbezsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v7y+1cWyqYF4fl9sh2pjXmF6kam9trG0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7y/ws29oIBkWoRdVoWKjHxhW5Cvxrm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDo6QD08PDtAPkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6uMjFs4djWWuWXFdkeImLeUqCt8a5sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelraqota/Lx6ZzV12Ej1dWYWaypXZQaLe+trOqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamioK2owsaZYlp/inZlZHp1r6N2Zl93m6+0rq+ztaqnrayjnJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp6lpL3DlVZom5d0i5mJb4x+dX15eqKqs7GwsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopufoaHCyJFRc6W0gISGeGlwcXuDeH+oqbCurqywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ6empqSmZ6coqKfx82PVHaKinNvamBbXVxeZWFujaCqqKqsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmqqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjoMbRk2F8enloYFdMSUtOUE9RXGuDqq+uqaqmoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJibn6Cbn6DEyIdxeHZnVlJSbldXTk1ER2GNrK6mo6OioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxr66tLq6tLu3sLayqrqyrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqGcnqGinpuas51rbHBoVVBcfKaVeVJNZ5SurKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGx8rIzr/I0czHxcfFwbzDwL6+vrW+s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoJ2jn5ydmayVcm1jV05SaLTT06SNpLOupJ+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLNztPMxcfJysHGy8bIyMW/w7OzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKSsmHpmWFNSWHfT17+yr6ednJ2gpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2v8q/0czLz8XJx7/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKrtY9nWlRVVmiTua6kmpWYoJyaoKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/KzdLLzs+/xcLHxc7N0dDRyMvNwMrMxdPOy87IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7QwLzMyba+rqaqqKGksbR/VVBTUmWTraafmJaYmpudoJ2ZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNxMnPzMrLv8m/x8nNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHPz8q9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLGqrK2qpbGpbU1KTliSoJuVlJecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBwaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1sLWooauqrWFIRFGLm42MmJWQlJKRlpaWkIt8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTCyMDHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCt7y8rqWzp7NkSUuCmI6Nlo+Gg4SEgn6FhX9zYFxeXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXEv7Oxt6u5dVd5loyTl4Z6gIWGgHZ4dXJwX1pbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb+9ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr29tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G6x76trrKusIZ4kY2Ki4V4gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tb6yt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8fLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwcC7ucu4rbCxr5d/j5CGiYp7eH6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sbKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8XFw8PKwsnKv8C9wru0trbFsauwrqp8dpOIj5B8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq20trG9ua+3r6iut7S0vLizvK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkr6mypaeoraWot6ywsre6uruxu72+vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yre+xL+7yrjBxMK2uL63srC2vrCqqqqdboODiIuAe36Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaimrqCdm6Slq7KvtrensKynqrSqtLqxtrWutrmxr7q5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMq4vMa5tMW4tMDCrri+tK6nsbexo6Omj3SGhoaBfHl1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloqiem6KbnqqwrbG1oqmqqaurpLS5rbewrLO1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnIubm/uLPCtbK9va68vLSkoauuq5mgn4p/hoZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqKmnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2gmpednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGwMW3wsDHzrfAxL60urqzwLezuryvtbexoZ2nraOXnZiLf4SEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaq6evsKubo6O3qqCfrqi2qaanrbCkt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4wczHxcLDvca4yMyywcPCrr28try9trq7s7O0rJ6cpKyXlI2RhYB9d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2NiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6agqq+mn6KjtqigoaKotKGlqKWwpbCtrLWeoJ2VlKmhopStsbGfoqOdnZibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsbItsbEs8LAxqy4uL63vry9uLawsKucm6Omj412i4d/dW5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVVJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpqSkoqOinKqrpZmepbGpoKCdpauep6Gera2pqa6toaGilJejm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdQT0haXE9SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/Gyc27wcrMyLXKvbG+xMqusrnDt73Cvre3rrCpmZ6gn4qFdYiDe3RpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq6Zm6qzn6Wmn6KjoZSTm5aWkqmprZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirr7K3sr21s6uvmIRzc2hbWFhTVVFFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asu8q7tr+szMfGucHOz8i0xby3u8TJsq65wbi+wL22uaqupJqcnpqJf3d/dndubWhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJOSk5WnqqWamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLWwubXAsa2xq5F9cXJiVlNWTlJJRlZQUlJMTFhNSkxOUkdNSkFDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DLsbi4vL7BxLKxs7mutra9trmnqKGinp6YhYZ5amdsbnFucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyWlpaIopqak4uOi5CapKeclZWXm5CSh5SOjIGLjX+QipKSkqGan6KVlJiYlaKlmYyZpKaopqGftLKosrehnaK3rKqtpLKypbW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPGxre6w8rMxrOtu761uMGwrqqyn6iwvbKypJ+gpZ2bi3+KcF5fZnJwdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQlI6Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY55kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwycS3ucHOxb6zrbvCrK7ErqmjqJOfqLmwqKWVnJ6bloJ9hGdXVl9nZmlnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjJCGhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfYmBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMfCt7O9z7+5r6+2w6irxqqknpqElZ20pp+ejJqXlI2BeHteUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCu7aousi4tqiotbaqs76on5aPgIuVq5makIOUioqDfXZ0Wk1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2cnKSd2h1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmdgXFxKVk9RR0pYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe6sqqdnaypqLOwopuSj5WBj56RloR7jX+CfHZ1blpLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuwp6ybj5acpamloZiakIaTeoqRjo96dYJyenZwcW9aS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpJedjYSLlKGhmZmRlIt0jnqBh46KeHN5b3Vwam5uW05FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYV5hJCYlI2QjI+GcYeCdIiOiXxzdXJxcWhyamFURklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rXlpcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgIh9boGQkomDioePhXWChGyWiYp9d3l5bnhweGZqXklQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYWMfn6Cf3CAfnppd2tSV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1pcXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGRe3KEnp+RnH92hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8gH+AcmBcYl5ZZmpca2teV0tHT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYKCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hYiFioeRenluXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCssrqiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6CemlXYWBXaWRoZFZaY1lWVElHR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4aBjZWKgISBinp8i4eGfYqCgYuElX14eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qjorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0A+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNtc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Gg4yWi3+Df4N4e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop+iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eGxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762ssTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaaYpZWKk5OIkYmPkJKem6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PVztPPzMbDytC/ysnLydLIzc3D0dK4sMS9xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wLGrtaaluKesrqCstKSPsa6bmJiMkZSRhI+bgY2mkZyJg4uEiomEioOUlZiXlJuRm5eZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PWzdLRxdLWxsDOyMjDqb+40J14bGRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmGkJCNi4qIkYd/gntyfoCCh3qFdoWTkYl/b3ZzbHN8fHd8c4J4cWuAcnJpb3F6eXJ7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqaaqsbmrprSjoq2io62hp7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OWrIuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8yKcW1iX15XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBg253cG11f3Z4fXSGfHlsh3Z1b312hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+jo6aypKWzoKKlnqGon6KxnIefkpKTkYuOi4aDj4R+nJuMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzl5qbp5ynvcPFubbFzdLQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUVVQWVVFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKgoh9eYWXl4iPg4eGh3qEeXF6e4SGdnqGjo2deoxwfG9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WanCtoySgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpmfpZ6frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yNlYyGe5uIk4+uq5SVl56Ypq61vKitvcbLyMnLy8/Jw9HK1NbY19jX1dvX09rb1tDb2tHWydXMlHd5Z2daWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChH6EfH2EmI6HjH6Gh4B3gnlue3uHgnR6kp6NoXaPdYJ0dYF9dICEb4KQgm+ShHR8gYV6dod8ibjGpcPJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VoY19TVlZVTUtETkQ7PT08OTo8Pjk+QTY+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af398hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9gYmFfH6Re5CpjpDDoLyMnKOcfYmEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWRWXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f31/e4h7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAi4d/mIeAnJJuiKmFeqCLfJCOg4iEnH6akYmNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWUkIyPioiWm52PlZaRi5OUhoCLiZKNioqdlpmjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKWiZ2QlJeKiqeXcoqyjYSnkoSZk4SajKOWoJiTiZudoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmomPhpeXi4WPjIF/ho+liI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzoZann6WklpWuooORuJWRs5qMoaGMpJuwo6SdmJGnlqeZrK+kl5SWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOhsKyKmrWdorilla2kl6mtuKeko5+aqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkXyOjn2Dho6PlJWIiJOWjJCWjYuMl5iTnZm0l5arnYuclJKOkZKMmJuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVNdUE9FQz48Q0FCOD84NzU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKiyra29q5u7pKitubirpqaioqSiqa+ysaqdnKSYm5iXnqKmpZKkuq+pwLytrbK5pqSofoiGnK28sIOMjIuQg4+DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKjsLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo0PkE9PTU8Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6uutLCpm6Cqm6Gblp+wtaeLo7q7tsG8rKicsqWkqJSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ew66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmGlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtu76nur+9u8O3rMGprLO7vqqwqqSlpKyus622taCfrp+lopijs72pm6i9waS3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tLzLvMPBtra7rbO/ubyur6igqai2ra6psreanqyip6Geq7e4qqWwv8Wxvbmzp6q1s62ul5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56zpZahlqysqqebnqaXmJaYlaCkqKWftqupubvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhHRzk1Rk07Pjg9QEouMzIwMjVCNTVQV048TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Rg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7y/z7XDvbi4t7KxtbO4s6umnKusuaqpp6+vl6OupKekpbXAsKustL/DusC6s6e5tbizr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZUlrCfr5yepJSvrqulmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK6vs7SmpJuqtLWqqaatrJqkraWkqKy6v6irtre+wr++ubOyxLK5vayjrrWsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRE5KS0JDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvbmyr7i0wMLKtcWywby0uqqora2wo6OYqrS7pqmmq6qdqa6no6qrvryorby0uL7HvLe2uMGxvsG0qbW3q76lj6KYkqKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqC1r6Wkkq+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFITUVGR0JSTElCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfEvs3Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+3pq2+sbi2x7a1ubjAs7/Ct7WztK++o5ejlpSclK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7KyLa4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvLm2tsSytLi6v7PEwbi4rrO1taOdpZWSlKGuoJminqioq6Oawq2pnqytm5uemaahvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinLKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbamt7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOppKqyoaO0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Krqpifppetu7Sbp7CbraCutLKnq7myp7qzuLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eSpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7o6Odoaa/p6ivr6GptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC5qbakrLuswMK3t6qssbqila2xrbKWpaeRqrmpn6awnaugsLSzqqq2tq27rLOzubesuLDDu76/psOrsLeuqaurpp6YmauioqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG2nperrqiul6aojqe7n6Sss56sorGws6yqtrS1va6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWpn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKDi5ZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakraqmr663qq+1uqensbfFt7G3vcHCtbS6xb7MxbnCwLq+ucS3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvZ2rrrKjq5+wrbSurbayubiqrq+yqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKjraClr5ehpJqako6jpaezqaGms6yptaWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V6io+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tLmkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7qjrLGzp6ijsrSxsbC1sbi0qq6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqKOenJaYpqaluKeisrWsp7GnrrC2rKSZoKyom5yenJSpuJyUjo6KmJuil4+YpZ+dlIKRlY+cm5eWlYiWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra6rp6Wxs7Sqt7G3oKu1ucm5rsC7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1q6qxsq2qqbS7rbSytay0raqsqK2pua2yscjAuKW6sKmtraWorrCmpaOvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW2paqrqK2vtq6jnaOpqpugmpqSpLOZjomNh5ChoJSMlJyfk5GEjZKSnZqYlZOHl5KVmaebn56MkpGOkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqmxpKmls7SxtLWysqGsrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe2sbKpsqmrpqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpKyVpZ6YnpmsnaKoqqKspqOtrLixsqGpoqCsr7GsnZ+nqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhYaPlJ+clZeUhpaTk5ekm5ycipKQjYl+fYeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKGqs5yqqrC2rbi1rqulq6q9ybuwvbfCr7Gss8TDzs/Dv76zv8LDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLukuLOsrK6nq6CjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKslqqhlJugpp6koqulraKfp7G3ra6jpqKbqqutqZyipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmoqOi4p8hYCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaVdWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqy2saulrKqpvMDAuLizu7Wmsq/EycvRv8G6uL+/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3prS3q6ykqaqco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqaCsnJKqoZ2gpKOmo6qenKe1rqimqqOjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+Mg4WUopmNjJmQkZGPkp+WmJaLioN/dIaAfn94dIN/end+gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlVVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zMzEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrChpquumqulrLC0ta+rprCqqbq+u8CwrrmuobevycfI0MG+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zsrmwo622sbCyu6u6r6mttqyqnqqsn6Ogtq2ooZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnp56nm5mqsamjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSDo5aEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5LeHNTZVNRXk1NUllmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEuLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1srSE05VUE0kY+yoKSnrKSno6yntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr6wvaasrLWrrZypr6Sgpa2rp5yeqrKks6ibq6epo6mdpKmoqb2stK+unamkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joJ/h52PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVZBV3ptVGFQUlhLTE5xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UsZmfoKmmpaCqpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7G1sb23ub21rbm2v62hs6erq7C1uLWrn728qbPBtLygr7O1qqufrbCjnKWoqqOem6SwprCgn6upqKGpnKSooa27qK6wrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaWWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mUjIh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvQFt4a1VeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTmayZoJinpKOfp6S4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwbW2oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6egppijqaCxuZ+jsa6gq6GspJymp6mampufo5WdnZueqaaXnKCokpmUmJ6TmZahqpGaiI6Phn2Hf4KOfXygjIyIeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrckxMfmhYWk5QTEpIUFJQSU5cX25TRFdaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol52mmZ2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rva+0v7C8wripu7q3p6i1qairsK2zsKeavrelrby3sp+wt7CopaevsZuhpKCkpKGXm6+moZ6jqK+hoKGTpKSit7ChprGqnqyjr5icqqWpnpianqWTm52bnqermp2dpZaWmJSdjpOXoqiikIiLj4V6hH6Ei3qOl4qNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajoZeVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjnMG2pam3t6uesruppqWor6uZoqecpaaUmKGypZmepKqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52gkpudl6Ciq5ybmaGVk5WWm46Tk6OnpI+Iio6GeYR8hYV8nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZXpjYFJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKOSjqWmnJ6enqS1raiqureorMPAt6+sobWup6+vt8HAvbLBt7Gusra1uLe1rKq8s6+ysb3At668vLGln7aspqa0qauuoaDDrKmnsbSsrLS6naiqq7GlmJ6qnqilkZmmraKZnaSqoZuinZegnae2prCqrqChnZ2hlaCmn6KgmZuanJKanpWmnq2imJeelZSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkY3R/YWRlZmVpamNob1leWF1sZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI3ODVceU4yPkhpWkxaSlZiZkE6M0BlRyU1m6SgkYyuoJqYoJeltLKjsr63obHFu7mwsaK2q6uvqbm+vbytwLKvrq62r7O4sqerubGurrS2u7awuL2tpp61q6ChsaWrr5+lxKGzpa+yr7ettZ2tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa6qK2ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gnSCgYqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGRAQTFJZEMnNJOim4+PsZ2blKGaqbKwn7nAtqC0wbu9ubGltq+prqW3ubi5rbuvraqrt6q0ua2lsrWxrqmxt7axs7W6qKmftqmen6qiqq2cqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknZmpo6WVmqCdkZyjq6qpu5+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamRmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnZOgnKqtq6O9xa+pt8K4vb2tp7awpqukuLSztLG5raqnrLSmsLWip7i2tainrLazrrSts6Kpn7SrnqKknKeomq69lainsLS4ra2kqK6qq6ain5yhqKecl6Gmppybp6edkp6gmZCeqKqjtbCjoqOclpiYmKSJoY+SmoehiJSeoX+lf6esnpSTnZOIg3J4jY6Dh6B1iI1pl4hmfXN4oG+Ih4N+jHx/oaCfmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFxnXz1LMVVgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSlp6izsa2yqK+fqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amoLako6CjmJWTmJOciK6QmJSJqYuYpJyGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrOop6a2pae4r5yysrWqpaSnsq+usaaqnqeksqSiop+XnKCfsa6Vn6OgtLqiqaihra6lop2bmqKqoJibqKGfmJ2oqJGcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9Znujp4JZX4uraYCSeHpqqDhKr1tXVG1jW0xPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa+ksbqwpKSvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGdpJ2YlZibna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJmhp6SQnaObmKGfrJ+lpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXq5V+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKZgeXF1UpOGXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg5Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAyO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfBqqytr66nrrOqoq+8qqGnta2jq7WkpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZqdlpigpambn52jn5ygoqWjlZuemJmdoqqbpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyik5mxqKils6qltKekvLfBsbrAsra0vLO2p7Kxo7GzpqCvtaibqLquoq+xoLK0saGknp6oqbCptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GaoqKnm56gnpWZmqWgnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5ikjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQk5UX2VQNUc9YU02Mi6inZGlr6ykqrusprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrK+kmKa6rqSxsJy0uKqgpZ2hqqWyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrZqgnp6QlZuhnZyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLiwmLPBrKiyp6qyuri0ub65uLO2vbamuLSgta2goKmrn5WntqyosLGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5eIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi9qru1oLGln6anp56TqrGpr6q1raqvoZihoKakpLqio6yhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5qopp+NkqSYqKuolZipqJ+foKOto6CdoY2UoJifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6WjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9sa+6uazBtqqroZ2npKKdkquqp7WjsqiuqqGXnKigpau5naOtnJaZkKWjlo6eoZyZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5KXq7KkoJ6oq7CZoaKPmKGXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmSmYyXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivt8Wxu7KuvLCuwbKspaOfpKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ6RoKiroJufqaSynqKkjaahlKGam5eWpJiPsKCSlamfhZCZtYCRkY24lXiCk5u1d25sb3NueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZ2dxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYVc4Kk9dXT0rO1ZWJz06PKadoKG/ppazwrSrqqisq6m7rrHGr7W0rrintbmtqaOjp5+gnZiTrKStqqa1qKifm5ago56spb6noaqYlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpauclqmlppyZoKinpqOooJGsnpejnpeWmJ2ej7Cpk5ynoo5qfmmcp3iJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKyws6y2pL6ys6agpKqdo5uZmaynrqSltaqkm5iVopumram/qKmmlpSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6ikm5usoKSamqKnrKKfqaGZr5qVpp+WlJ2fnZexpZmiqJmckZ6co6SZp6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWVlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ2grZihm5yipa+moaSnnqyYl6admZqhnp6csKGdoqeVmJOZlKCilqOfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6grKORkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqKajq6Gsm5+goJiknpyfnLCkmZ+ok5iXnZKlmpipn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jn6ScpKqokp6hnqCqr6qqo6qfp5umn6egrJahnKWxpJecq5ahnpuTpZeeq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrWvqqanpbGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZoqSqo5OgoZ6drK6orKajoqWgpKWcraiRpJupraqcnqqdraKWl6WWoaOYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnR8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyBjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqCnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2up6qom6alo6GqkqyzlqWiqqqepKimobGik5qnmqCalJSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGMkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKipqJqqqKOiq5uvsaKorK+mmqesqqqyo5OXo6WalJGEpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmYaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J1aIyMl46BbJmRbm14d3dua2ZkZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+qraOop6qrq6mkpqCbpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqroq2Zq6ehoaqis62iqrOyopyrqa+vt6SUlqOnmJuSfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe3CWkX1venR8em1bZWpycWaBaV5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKalmKqjn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpGmrZGZnKejoKqmrqGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqpqunKympZ6so7esoLK5sJ6cr6eztLSmlZiopJugjoKdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8ko+Ic3pyhH1wXGxud3JqgW5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2mppqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQorGZnpympaGir62dpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6iZraGspKWYr6W7rKG3t66enrWyubK0qJmesKKknoaP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGfpaGgtaeiqaewo5Sro46kraSfkJqaqrS0pJ2mnKmSlJeuoKCepqScp5y1mqCqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOmmKqmrKGkm62mvayVvrCtn6Ows7qstaicqbKlqZh6p5F9fLB3ioCkpYicbbJvoIete6GPg6iVmoCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6t4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOMlYp5eYGWfmpsfWJ9dG1/eV9mZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmaScrZifqKW2qL+upKmjn4yAjpubn6aekpSZmpSZmaSjo5mnqquio56pqL6kl8Osq6OirLO6rK+oorSwqquZdq9+kIqchYd8uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaShopCEoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmomWj5SVeniNm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEtJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6lnpmjoqWZn6Opsqi8r6Wonp2OfIualqGgmZCRmpuRmJaonqCYp6ympKSipKm7nqDGp6Wpoqu0tq2vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+JppuapaqRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuOmY+Vm3iAkJl5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5uaoKiimZ6grKypuK2no5qXk3uHmZKmm5OPkZiYj5eTqJmfl6ion6mmoaKru56pxaOgr6Ors7WrsauivamwsJt0dqqktoVliZ9vZ6yPio9tb3ekkJqggXWwmpZwkI1ylqejm5iupHJtbWxlinhubYKZcYB6aXBpZomWlZhxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpePlJx8ho6UdGWGd2eManh+eGRsY2ZsYktkWEprWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPIvrSpnr+rrKOgpqufuqOkraytpY2WraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJeOppeOkZCYlI2XlKaTnpenopqwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbaciZahl4apmpCUnZOqs5mbo6yhs5ejoZ6hopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck6CUlpSfgYaTi3BnjnZuiXd1fHlpa2Rkb2NVYFlAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xbq3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqykopqonp+TlaOXqJqpmZSmoaSQmqeZobS5p6qYmpCMe4GUjKGUipSRlZCPkpekjp6ZqJ6btaOdpqy3qK/CrqO3pq+vsK2qq7W7orG+mpKmpKa1opGdpp6NqZ+Nkp+jrLCboaSyqbCZpaGdpKuenp2cl6uckpmim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5KgkZqUnoOGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsruuqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCun6SXqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiHmBk4ybk4qVkZSQjZGWoYudnaednrijf4OvtaKwr3SkvqOyoHh6oayzvZZ3rqWgioCqfmRbYXafjqSdg5d+bpOznKOor6ujZZ+glHR6mpZwgJiol2x+oqiKZZ2lm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+Ncnmilpdld5eGgHaXaIKJgm55fmpwZV92b2traFtlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppqqXc4ucr5+oq6eTlrifoI+cpJ6QfoiIm56NrJqklaiino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+Nmp6lmJuyloCMm7WdtIySj72noX6nonqksLmBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWHmXelm3qHm4GXpoKBe5yyeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmCnZqFmH2RiYGCmGmMjIRqeHpwcGdkeG5pbGpbZGlpZXJbXUhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8r6CVpai0nY+DnKubp6KgjZC+npmNn5qhkHyFjpmXiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPj5uLjpGekZWeo5WdrIiftIm0mq6Lyoirr4m3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaok5nCgn+riJihcZ6AmqV9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZrWGdHXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PD5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ+ipKqilaSptqKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2JtkIuTkI2PjIyXi4+Rn46SnqCZoah+oaeHrZ2glq6QoJ6dkYaCoI2sr4ekjaqajJp+onWAmJNrgat0Tat4h42dkpuoqIKqq36EoXt6p2mef5JsZ5eGl7WInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdoTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZefoaWsq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkYyKppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaGMk52fm6Klf5OBj6OhlKB3nJaQp4OiqICGqq2FpXmLfYSafaJwcpKHlnuejHlth5uLmZGcqZuPh518gqJzdqZmnn53pF6Ye32Sc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2xycmRcaF1hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqinKOjpKubmrGsq5KXoJigpJmalJ6rm4uIkXiLhXCAlo2Jj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uGfn2PjYOLj4+JjpOfgpacoJ2gn4uJd5yYoo2gcqKLiKmInKeRmKmrf66MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3BqeXhhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aXhJKVmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46Vmn+ToZ6gopOYcmifiqCPjHCSjIKpiJmgpKqhqH2wraSiuJd2o7Oio3+IlHideqqafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdZt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHZ7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maooubqZycp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5R8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnpGLop19p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl2jZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Da2dmY252d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkQ4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjYiFe3B9hGh9j4KTmoF3kY6OiXB/ho+TkmyYlHyJkZKjlYOOqpqTkouFiXmDdoeAboGehneAkoWHmKGWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZySfKSAopmGmHGehKKtromXi4CMpI2Wg66ilHa1trXJoXSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXantps7W0xqZzmH56nWqbmqt0gpptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWGdPUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU5sXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bko2Ig3lqeYZlg4x+lp95dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl5f3yLeXCPoIZ5gZSGiJaflH+UpaeclpaEZ254nGyiZHxxpXicmHBop4KYjHyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnJpqmt1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjG97f3NyZKVueKJkZqdomHKLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlVlWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnBnUGpoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5CNinuGcYCIaIuKfJeac3SJfZB7ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfX9/jnNpj6WEfYWTjIeYn42HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4h5qXSlj4SabqWijJKEjIO8bn2lr4KGhoeUl52gfaZ6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf42nn3effYWklZ2gaZqHdatmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpVYGBcakxcUl1JXmxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnhkY25zZFJsZ2hvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Xk3N1hnKRg21/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42InJ6JjJOqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyEgHtyp4xxfX16l5abhI14e35+iJSVk4p3kZmgoYR7fYlrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCgoaOqpx+dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cXBvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9wd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOioiNcoJ8j31+j4R6l450coRwlYV7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Xd3GEqoWNkZyPh56eh4uaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2DjIycnJ+Oc5WLiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKJkKeVhmaNj4Nud4uDb4SMeG5kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mc317c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPjoSofn+SkZKTnLGlmpSdkI6yk5iEpoyMlpygiZGbgomSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImHipGmkYSGjoiDjJCLe4aJh46AdWuBg3t5mWlyaGB0inB9enZ1b3d0gV1db4dobl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob29sZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg4yRl5WOm5aGhpumoKKanYaDkpqZmJCapqCmnp6QloGSi3d9iI6EpXt8j5CQhZiqoJyTnI+Nqo6SgJ6NiZSan4OOl36GjoJveIZxdWF+hI+GdIuXgIKOgoaEfoWElG55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mMj4STp4+GhI+Cg4qJiXWFhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1haml1eX5wbGxjampngH9rcn9ranNueG6EeW6GgHaCgH2FdnGCjYh+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKi5KGoKGKhYx8p4+GjpKXk5aSd42joKGdlpp/gZCZmJOMmqKho5qYkZt+joV6gYSOh6B/foyMjnyXpKCgkpmQj6aNkIGbkYmTl5x+kpF9ho2AdXSBcHZgfYCOhnGKlXyHinGMfoKFhY5oeHJ5jZmSkICXfoiLc4KIfX1yenyMhXt6kY2DlqWTi4WRfIWGh4V1gYKFhnlkcXp+eHlwbGlmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZFheYGdqdniBcWZrY2xnZX+Aam19Z21wan13hnpri4FygYF9gXR2go2Gf3x6gIF9f49pcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialnh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6WTg5GKlpeSkXaRnaGhmJSYen+Ol5aOlpqcpJ2Zk5SbepCGhHmFlo2dfYGKjYtyl6KeoJKYjo+ijIyDl5iDk5aaf5eMe4iMgHZxfW16Y4B8i4VwhpN/j4Frh4KBf4mEZnZvfYiTmY5+lHiMiX2AiH18coB5ioZ6hJGKi5iiloGDjHeIhIKBdnuAh4N0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3V5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkIqmj4yOipKfkIKQj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI6VlnSOj4tthpiPmXqHiJCJb5edmqKTlIqMn4yGgpKcf5OSloeZiHuJiYF5cXlqdWx7f4t+bYWRgpN3b4KDfX6LgGVzan2Bl5iFf450kYmEeoh+dniBfoeBfYONhY2UpJB5hYJ0iYd9f3J0f4WBbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9rdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfYB8jYmRo4iNio2XmYyFkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJl5FvipqFZ4aZjpR6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmo97ioSGc3N1a3FudXyLdG6GkI2RcXSAfIGCiHxlcW16fpuUfoWJdJGLgXSJem+Bf4KIfYWMioWNlqiNe4h9fouFd35wbn6DgWJnd3N0bnpiXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2RpaIB6d3VvjoRzgYGDe3WCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doR3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyHnJ2Jj4aSl5WDiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhpiIa4WkhGeHnYqRfouEi4F3k5iRnZGQiImVjn9+j5h8kY2QjpqSfYuAgm52b2ttb3B7hmlzg46XinF3gHSCiIJ5Z3RvdoKbj32KhXqVknp3inVxinyHjXuLhoSJj5yjiHyEdoGLgHh4bmp/gH5ccXJxb294Wl1vYG9qXm9pfHpwbW1qbXdgcG9qcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYZ/d4eGdoOFfIaMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCb3KFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKLkaOak46IlZiRg4aWmYuTi4iPj4iehZCKfHOLhYiPiJyZnpuWlICUf2mGnYloh6CIkoSRg4lxg5GXj5qNj4yLj413e5KQe46MjZKXjXyIfIBrdmlta2xsen9ieX2OlYF2eoF3g4x8eWh1bXWIlox/iYZ7lJFyeoVxeI57i417iX6DjZGfnoV9fXiBi313cGhrgIB3XndvbWtxclZdbmFxYV9tbnlwZ3BmZnR1aHFrYXdlXVZlYGByU1BOW2VkXXhwiHxeXGhxYmJlZpFpX2dkW2hwfm9rcXOKfXZ9hYF0dX+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqbm5yalZN5jXdpiZKIbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYqSkYl6hXx+bXxlcm9ra3l5W4B5j46Ben5+f4aOenpodGx1jJCKg4aFfZaMbH5/b4GMf42IfoR7g5GWm5uLfHd4g494c2xlcH+Ca2l0b2doc21TXm5kcFpfa3F4ZmtrYmd4c29xY193YGBWa19edk9NS2BmY115cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdXZ+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Fza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY6PdYp3cIeJjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWJkY+GdoV+fmt9Y3h0aW14c1eIepGHhXl+f4CFjH55ZnRrgYuPi4SDgIyXhmyCdm6JkYORhX+Ce4GRl5OZkHR0eIeMdXNxZnR5gWFzbW9haHVmUmBwZ2tVXm1zeWByY2BpfXFyblpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh3fIhxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjHWHf3GGgoqImqOElY2fhIlhg5WPhYiGiYyHgIdofZR/fYOEiY6NgnGGfn9yd2d2cmhzd2tajH2SgoV8gIOAhIqCdmJ0bYqCkYyDf3+TkX1ugmx5h5CHk4R9gn6Bk5SRl4lucnqMhXRscGpxd39ec2huXGl1X1JkcWhmU19vdnRfb2BdaIJxcmpXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX56dnqHc4WDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKTgYl1hId3hICLk56gh5aQn36IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH5tg3yCdGttd3VzdnVrY42Bjn+FfnyEf4SIf3Bgc3KGfJCOg31/kol6cYNme4SLh42EfIV/gZSPkZOEbnB5jH50bG5panl8YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiW2dfZG1fblRab05ITmZkXGducYBrWltjc19cY2x3ZGVdXVpsbGJtanN2hn9xb398fHR4hXiFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj15xcpa8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCJdYV8ipmemYeVjpyAiGZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3ZzbGuOhYqBin94goCFg39rX3J5e36Oi4Z8go+BfnKBaXmEiIyGhXmEfYKYjJCMfW5te4l9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR4ZWBeXVlvgG9zWWVhXmpuYHBPWWtRRFNnYFprbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8goV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniYjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndKYlqk2dCWcXuQio93fZOKhJiRjIVua4WSknp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEkoyDf29/g3aEeYabmZWMlJGUhIhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGh4cG91mY2Gg4p8dniAhHmBa1xxf3OCiYaKfoaJe4lygW5xhYePhYVzhXqCmY2NhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dGBdXFpZdH1zb1dnXWZqcWBvTldoUj9ZZl5ab2pnenFaWllrZVpjcXlfaFxeZWxoZWtpcXd/h25sf36AdW+Ce4CCfoJ/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjIt1fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH1ugHV3hXqHnZGNkZKTjIuGf3uShnd/g4yCa39yaIB+eG18fIGKg3dheYSBcWRxaH5tdXF1gZuLgH+FgHN1foFzgW9cbn91eYuDi3uHgHyIeHpxbImEkISLcoN6gJaLin90bWt3gIB0dFxoZ3ZvWFZ7UllwZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW5jaU1XZlE9XmVcXXVmYHVwWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5saYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iSiX9oe31qc3tyhntzd35/jHp4hH18a4yNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnaFlYVzjoqJdnBshYKGdHmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIgpSRmImLhIl8j4hwe32Ee2h+bGuAe3ppenaBh4ByYHeBfnFkcmZ0gm11e4aVkYF8goFvd3p9dX5sWXCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiIl6bm1qboKBdG1cZ2RycFFaek1bb1xPXHJvZFVLc3hpV1laWmFxgHRgXV1gZmRoaWZOWmhNQGBjW2B2YV11bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N6gnN1h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3mWjpWPiIKIe4iIa3h5fnRnemhsf3lzaXp2gIN9aGB3h31qa3RneoBpdoGMkZR+en5+cHx3fHR+YlZ4fnNzioSCfYNxh4p3eHFwhIKNf355fn12joWDdmlxaW2IgXBvXWdhcW1KZXVLXW1VVFpzbmJRT3N4YFJYWF1hb4JzW2FcaGVlY2tkUVtwSUNjYFtjcF5deGhVVlV3XltlbmhWa15haWdlbm5ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeEcm13g4J9iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RbWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d39vcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn14e26Id4GSjYV0loqRjoeFhXt/hGx0dn5tZ3ZlbXt1bWp3dn9/fGFieIV5aHV1Yn17Z3WGjo2Ve3SAdnGAe31tf1lXdX9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfXNndGVui4Nrc1ppXnRkR21tTFphV1ZWd21iUFJ0dldQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJe2JubVthWlthVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV8amx1Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzlpN2fnxvinGCi42IcpiOkYmFi4N7eH1xcW98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlHtxh2pvfoB5bnxdWXN/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfXpyZnNhbouBanJXal52W0htak1WVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGtqZmNZbmFZZHBHQGdcYGZfXFV6XU9VZHBaW2poXVdoYF5yZmtncWdwcneGeG6VinR/end+eIOHf3Vyf4aFjoNwcHt4dnV6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1pdXVRncmRgWGRxcmaBc2JrZVdbYGp/eL6ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqbmCHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmScYB5doRugYOTiXOViI2IhImFfXh0cm5oeGBqbWBtdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ+b4xna3qDdW10Yl1xfWx1fYx7gWZ1h31ucWh1f3h+f3N9bHt7gnt4b2VsYm6JfWttVmlfdlVKaWpPUU5oTVh7aGFOVXVqTFBUVV9mdYNmXmBwaGdhV2ldXGxoSkRqWWFkV1lUeFlOVm1qWV1rZFxZZWNedGZsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnV11aXFtTZHBkXldicnVpdXBlZWJXXFxpf3BvcoBziWRkeH5pdHV0coGDd4CDeXZzdW1renFiZ2tnhnSNg25mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkHR8c318bnx8koZ3mXyIhoOGg310cHFsZ3RcbGhebHRkZ2Zpem97cllngHZ1aHCAeIJ2YneFi3yUgG6Mam17gnFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenp0fWZ+f4B5d25jZmJuhnxsalVpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2llYFZjV2NwXUxLalhjYVVUVHNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNucn91dJqBd3+Ad39/hoR6fHSChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBpa3CAZ2tgaHl4anN0dG6EgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvaXBnZl1VWG9njqh3gXp8kY55dXB/cHN2eo+AeJV1hoOAhYh2anF1Z2huW2xkXW1yX2dhanhoe21bboJydGpvgH55eGF3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5YnOAcGdqeXRxbHh4dXhkg3t/eXdxZGRjbnx9a2tVaGFlUkprZ09HUWtFYXhnYU1Tcl1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bm94dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVZcXGyBZXF0fWlpXGt2dWdzdnJthXt9fHh1cmx5Z2l4Zl1lcmh6d5OBY2NUZXBngoV3d2doamBXVllnY4+nbn53gIuPe3Bxfmh6b3qNfHePcoR9f3+GbmR1cmRoaFxrYVxvb1xnX211ZHpoXXSAb3JrcXt9dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V9dWVygGxhbHtvaml7enVyZoV2e3t2cWViZW1zfmlsVGddXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmZVSlxjV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG5vbnaDl3lygYB8f4mMhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlWY2ZrX11ccoVoWHBuW15XWlxse2Jwd3ZtYlpsc3NndHVwbIR4fn94d25udGRpdGVbZ3RmdnaSeV9dUmZmaoOCdH5iY2lcVFheYmOPpGh4dIOGkXhtb3tpeG58hXt1iXOAeHx4f2hkdmxgZmBeal9cc2tZZV1vb2J6ZVt3fGtubm93eHN0ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm52aWRmeXx1bm+CdXR9dHJiX2Zub31kaVNnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xjXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGc3F3dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFtaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bm9we3x8cYF3f3N6enpjZXVoXWJaYGdbXnZoV2Jdb2hhd2Bbe3ZpanJud3NydWhxgpWDhn2DdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcWFfanF9bGx1fnNxeGtwYVxlbGx6YWdTZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFgW1pYWWxxV1NPZldXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmnyChHl8h26PhnFvd3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1ZnYWxrWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYV1ubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZYpWVY25wg4WKdGtofHBmc3dzfGx6dHVven51XmVyY1teVmFkWGF0ZVVfYG1kYXFdXX5waGlzcXNwdHZrbYSTgYh6hHFzZ29+cXNvVFxna2ZxdIF3c2NsdlVicmtaXm9mfWVtd31zc3NrbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3dqYVddVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaHZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU29nc2xmeGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nV1hfV2SbiGJrcIGHfXhsa3luXHdxbHtqdnNub3uAclhpbV5ZXVViY1dkcGNTXmFoYWJsWmB+a2Zrc3VubXd2bGmFjH+JeYdtcWZxfW5zbmNaYWlpb3SCdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWtgWWFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59Y19UX1RddVxUU2BmTl1hVFNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmd2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmako+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeHjIeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKh4aOhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeIh4yIiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo5OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0FAPzw7Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPzw7S0c4ODo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+OTdkbDs4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQUA/QEA9PUZJSmt5TTw+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fX5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RCQEBDW0FRdH2BfXtcP0BAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA/QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBvcXBydXR3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFCQEFvY3+EhYKDfmk/QkNFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZDSnaAgoGEe4CFdERERURDV3WGiYp+WEdJSkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSUlRdoF8gISBg4hwRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDQ0RGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSlV4gX6ChIaGh4NVTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKWH2DhISBg4eHiH1/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSUtRdoSGhH6BhYODhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJTEhxhoWBfoGDgoOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNES3uGhIGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1NfoSCg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ozk5OTw/PDxBQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo5Oz8/QUp9g4KEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PTw+QERDVYKDhIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0lJRkdIREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BP0JDR0VohIOFhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCRkZLSnWEg4WFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0RISFBbf4SFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A5Ojw4PT47PUE+P0FDRkhKVHGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUZJSU5UeIWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VWUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PUI/QkNGVk5FTE5NUVZ7hoSFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDR0VERUxYUk1TVFNWWHyGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1dZWFpZeIWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWVpugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjU3OTU8Qj1mdHR2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1lUVFhRTFhZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5MSUhDP0E6OTg4OTc4ODQ3NTc4NTg5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTUpMUkhJSkZBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xIRENKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFREJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSklNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUFCRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZJR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hfXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0JCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCQ0lGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpMRklISkhFS0tMTE5PU1RPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXVpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdKSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRRUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXRydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGVnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViY2ljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3Sk1MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGREdKR0dKRklMSElKTUpNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGViYWNpbmljaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhKSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkNDQ0JFRURGQkZGR0RESkVFSkxMSkxNR0dNSkhKS0dLSklKSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3BNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURDSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hJTUlLSkpLTk9OTk1MTk1MXGhkdV1scVdsTlBRblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSEhOSEpKSUhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b250c3Z0SEtISkNFRUVAQD5DQ0FGQ0hKTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aam9gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVERkFAQUVEQ0dCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1enl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpIRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0JKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eHl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdIRERAREFISUE/SUpHUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSUlHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JRU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1BRWVNeXFxdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VKTlFRTk9PTU5NTkhLQURBQ0RGRENBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVtdXGFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUhISkhHTUxRUUlMSktLTk1VTk9LS0xHR0tQU1NOUE9OT09PSExGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/anR1dV9hdl9ZY1xcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSaHxlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFSS0dneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp+bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHl9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRqaGhlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT05OUUlSbUhpd0tgZHZ1VVdsT25se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWhmZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9QSkhRTlBVTEtLUlNSUlRQVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZ2VjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVlRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVVFOVVNOUE5MUVBLSVFRS1FNS0tPUVRSUVFTU0lJTU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFhXXlpfYV1cW1pdXWBjXF1iYmRnZWVlYllgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hUUU5VUE5RTktTUE1OVVNOUk5NTlFTUFRRU1RVTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NVV1VUWVVWWVRSUldVVlhcWVtgXVZZX11eXVxdYGFeW2JiY2hmZWViWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPV1VQT1RQUFFOTVFRT1JYU1JRT01PU1VOV1FUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZZVFdXVFJSWFZWW19aXmBfVl9dXmBcXGBgX19aYmJkaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU05OUlBSUk9MUFNSVVpVVFBQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ddX1tfX2BWYlxgYV5gYl9cYF1jYWNnaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5f2NcW1ZWWVJOT1dTTlFSUVNUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1xWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRTVVVUS1JWVVpaWlNPU1JVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZW15VVU5WV1deWldRVVVYWFhUVlhbVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ15dZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWlZRUVRcVFRUVVVWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWWBaWVNVVlpZWlZXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZlYl9kYV9hYWJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFlYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZXFpYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhaWV1iWV5WV1pbW1taWllbWVlfX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXVxdXV1bWlxYWl9hXmBkY2RmZmZiWWNmZWhnZF5jYV9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWVlQV1ZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFVXW1tgXl1fWVleXV5eYFtaWllbX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYGZlWmhpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YVllbWllXWlpgXmFiYmBhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gYGBgYGAgX58fHx8fHx9fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3d6enp+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x8en16d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7fH15fXl3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp8fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKCgoKBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjImHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDgoODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKChIKCg4SCg4WFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIKIjoOFhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCBg4KBgIGBf4qZhYGCgoGBgoKBgIKCg4KCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gICAg4GAf357gZiMgIGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgIGJg35+f4J9j5WCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhYSDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGBgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBg4+DgYF/ioSDkoWFhISFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhIWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISEg4ODg4SFhIKFkoKKhoWCgX6ChoeGg4F+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4eSgoaEh35+f3+FhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDh42BgX+Hgn5+foCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4SEhIGAgYuFgH+AgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDgYCDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYKAgoODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiIhoWDgoKEhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoeDf4GEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH+Bg4SDg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+f359foOEg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISCgoOEgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgoSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaHhYWFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHh4iGh4eHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIWEf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4GAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx8e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt8fXp9fn5/gICDh4mJiYqIi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35+fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYB/gIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt8enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH6AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4KBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3p5dHF1bndwdXpydnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enNweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4WFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYGBgoKDg4aDhIOGhIGDiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4GCg4SFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/f4KKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf39/f4SEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4F/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4OFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDfoODfYF9fn59foKDgXx/gH1/gH59fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2d3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fH19fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhIaGhYSEhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICBe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFhoWEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYeGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHiIaGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYWCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af3+Ag397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaEhYOFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgICCgn99fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7O0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8W0nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q4n5qTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GdqJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnp+blq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigaCYm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuahZ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03a0sKacir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCVppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYwqKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh87GkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Bv8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE9Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7iztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7jAsK+1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcK+2MC0sbSyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHD0NK0yLS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v725vsC0v7u8uri+wrzCydXJl87EtLK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxu8W8wcvNwo6nybm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDs6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3uLi7tK+0rLCvpJywtreNibW6sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxr73KsqaorZWLjXZwf4SfjIWht7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqW91KuinZyAbIF0YWNlcoOKm7e1r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqSfwM+pknx3gV5rkXVvZV9ukKC+tLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnsLHmXhjYYpcV4KLkIhsUompw7Otraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6fp56coZ2empqSmZ6coaKgn6fJuYhhWnaXWlhhbZCPfk50tMazp6qsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3pLCmn56dnZeYlZmem5yjn52u0apzWWSMiVhbb2m3rXZaWaC6s66uqaumoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+drM6eYF+Ih3d4hYd1no1ycnOUsK6npKSioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpybnq3JmFZvn5l5kpx/a3p6jaayqqCanZyfnpqXmJeSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqa3zJFUeaCkentuZm+RqbGspJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSqw86KWHqGhG5ocZCur6WdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtc/Pj2R7fW9ulK2tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbTRx4xvdnGEqayhmJaYmpudoZ2anJ6TfXFlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxxKFtbG6QoZyVk5ecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7m9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFlYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dXZ2tvYzM3PyNbVxcO3sLWpoq2suLyhb22Omo2Ml5WQlJKRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3G0NXV2drb2NDKz9DS1MnEuLy8rqW2qr66oXeJlo6Nlo+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83OzszVz9XZ2NnQzNPOztDKw7bEv7Syuq++toh9lYyTl4Z6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0MbV1NbXzszQxsvHycS8yL+usLa0t6+CjI2Ki4V4gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7IysnLycrEz83Sz8/GycTJxMK+u8y6rrK3tLKrjJCGiYl7eH6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTGwMXFw8PKwsnLwcK/xb63ubnHs6+0tq+tppGJj5F8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre6uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzL+8yre+xL+7y7jCxMO3usC6tbO5wrWxsrOnqZODiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu4vMa5tca5tcDDsLrBt7KrtLu2qqyupZuEh4eBfXp1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMjBx7y8xcTPv7rIubnAubTDtrK9vrC+v7iopLC0saGoqZ6IhoeAeHNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwMa3wcDIz7jCxb60u7u0wLi0u72xt7q1paGss6qgp6SUfISEgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvsa4ycyzwsPCr729t72+t7u8tbW3saKhqrOenpabhoB8eHJqbXJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8bFtMPAx6y4ub+4v72+ubiytK+goKqtlpZ/kYd/dW5kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvMyLbKvrK/xcqus7rEuL7Dv7m5sLSvnqOop5SOfYuEfHVpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiprJqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmIRzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLPz8e0xby4vMTKsq66wrm/wb+4u6yyqZ+ipqKUin2Bd3hvbmhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5WnqqSamZmdnZaNjIyUhomNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLSwubXAsa2xq5F9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DKsri5vb/CxbOytLqvt7e/uLuqrKeqpqahkJJ/a2dtbnJucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5Cao6ablZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGftLKosrehnaK3rKqtpLKyprW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNxrStu762ucGxr6uzn6mxvrS1p6OlrKamlYqXdl9gZ3NxdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsKGwrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr6zrbvCra/Fr6qkqZOgqbqyqqiZoKWkoYyHkmxXV19oZ2lnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C5r6+2w6isx6uln5qEl561qKGgkJ+dnJiMg4hjUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrers76ooJiQgYyWrJuckoaZkJKMh4CAX01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqSAcmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrSwo5yTkJaDkJ+SmIZ+koSKg35+eGBLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYaTe4uSj5F8d4Z2gHx4eXhgS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY10j3uCiI6LeXV7cXp0cHR2YU9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIcoiDdomOin10dXN1dGx2bmVVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCCdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW2WiYt+eHl6cHpye2ltXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWdfW1pdU1tmXldRVVlcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4F0ooWMfn6CgHKCgHxreGtTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1tdXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ+hqWIiYCDiIZ5iIt/dYZ4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlH1/koaTln+KgJKbjoSBgoyLgoqOhICKf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8f3+AcmBcY15ZZmpcbGteWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpJ6gJGJkZJ9ioWZkpGDgICLjYmGkYeFiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW2BeYWZjYGdnXFJFS0tQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGCdFhgY1VlYWFiX2BmX1tUSkRFTFZRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6Be2lWYWBXaWRpZFZbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qkorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfXFeYWBcVmFeZ2VSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwbu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JJRUNJO0FEPkFIPz9BNztEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluKesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40J14bGRcYVxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqKeqsbmrprSjoq2io66ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yKcW1iX15XUlhSW1BKR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUlVQWVVGRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdnqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09rb1tDa2tHWyNXMlHd5Z2ZaWU9SU11IQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VnY15SVlZVTUtETkQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWNVXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZWVbW1ZSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6WmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9ZmFcXF1OSVRZQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mLlo6HfYyYnomQkJyamZOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVJdUE9FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKf4Fzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqqebnqaXmJaYlaCkqKWftququrvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhISDk1Rk07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKustL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqylmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6irtre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq6kpJ+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby0uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFJTUVGR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUA+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5uemaagvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLq0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy3uqWZq7Krqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKSdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6qssruila2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNEVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG3n5errqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKCjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6insbfFt7G3vcHCtbS6xb7MxrnCwLq+ucO3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq+yqLWvtLy9yrOqtrWxtLCvqKKzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaSk5V5io+Fe4yKg4qSam14bXV7YUVgallJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VeYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqqmktqCgp7GhpJScmZWxnqecoKqOqaOenJaYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5eap5yjoJKWkZCVdYSQh3uFgYSMi21wd3R7flxLZWxcS05jXD9ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1rKuxsq2qqbS7rLWzta20rKqsqK2pua2yscjAuKW6sKmtraWprrCmpaOvpKmcnpybr5qjo6Kjkayeo6CgoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqYlZOHl5KVmaebn56MkpGNkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe3sbKps6uspqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpK2VpZ6YnpmsnaKoqqKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhIaPlJ+clZeUhpaTk5ekm5yci5ORjYl+foeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLykuLOtrK6orKCjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKsl6qhlZugpp6koqulraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmYqPi4t8hoGBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvSv8G7ucC/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3p7S3q6ykqquco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+LgoWUopqNjJmQkZGPkp+WmJaMi4R/dIeBfn94dIN/end+gYidj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0ta+rprCqqbq+u8CwrrmuobevycfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zs7mwo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+vs6K1qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnqJ6nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSEpJaEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaGeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwsLSxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mdpKmoqb2stK+unaqkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+j4OAiJ6PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspmgoKmmpaGrpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6xrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Be5qUjYh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65srO/tLq9t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsa+hrKGspJymp6mampufpJWdnZueqqeYnKCpk5mUmJ6TmZahqpGaiI6Phn2Hf4KOfXyhjI2IeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrcktLf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rvbCzvrG8wripu7q3p6i1qairsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKGXnK+noZ+jqK+hoKGTpKSit7ChprGrn6yjr5icqqWpnpeanqWTm52bnqesm52dppeWmJSdjpOXoqiikIiLj4V6hH6Ei3qOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmpaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGzppmepaqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6CjrJybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZntjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqureorMPAt6+sobWup66vt8HAvbLBt7Gvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qauvoaDErKqnsbSrrLS6nqiqq7GlmJ2qnqilkZmmrqOYnqSqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq6jmJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkYnR/YmRlZmVpamNnb1leWF1tZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vbytwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+yr7ettZ6tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa5p62ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Fyf2BkZ2pubGZqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+PsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ubi5rbuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSztLG5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK6qq6ain5yhqKecl6Gmppycp6edkp6gmZCeqKqjtK+joqOclpiYmKSJoY+SmoehiJSeoX+lf6esn5STnZOIg3J4jY6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCgmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amobako6CjmJWTmJOciK6QmJSJqYuYo5yGsYCkrp6Vm5+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqihra6lop2bmqKqoJibqKGfmJ6op5Gcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ+elZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6ZoBpeGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGco52YlZidna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/lJeXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAgIiQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6moqpudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3ybl6eQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKikvLfBsbrAsra1vbS2qLKxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqiXnZicoaeimKKho6GboqKnm56gnpWZm6ahnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5mmjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlsK2lqrutp7Wlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+mk5ShnKWnoJWbp6eimqOfrpqhnp6QlpyinpyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOng5qao4qSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDMzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBraiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbKrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoaKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9srC6uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZuZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5qforyimLHCsK2pqqyxqLmvt8WyvLOvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqqmaasuZ2jrpmVoZCmoJONnKOfmZ+akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeWpJiPsKCSlamfhZCZtoCRko24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdXaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGsLa0r7intbmuq6Sip5+gnZmUrKStqqa1qKifnJago56spb6noaqXlZyRopuSj6GoopSel5KYlLK1tq2YnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4loc418hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyK2xtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iWopumram/qKmllZSblqCak5ilqaiSn5CPmJywsr+sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJeHk5WKg5OTkIiNkZSZk5mXmqChmpuUoJyOgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+ipLGxt6CpprOnpbC1qsmsrrKmtabAqLShnqWmnKWWlqCrp6yjo7esoJmXlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDsJqrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCdjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsaytpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlZ2Zma+mrr6grKOSkp6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iYnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbKrqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKKvpra5pa6jkI+aoZmTkpugmJmmlnulrKKotMO4paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrawq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevo5KSmZ2lkpGgoZeboJ2Hpqukq62/wLGhqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfqt6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5Wao6KSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKepqZqqqKOhq5uvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaajkJqiqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqqoq2Zqqihoamis62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpCmrZKanKejoKqmraGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqZmunKynpZ6ro7esoLK5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgW9aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQobKZnpumpaGirqycpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6eYraGspKWXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzboB1XWRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraSekZqaqrS0pJ2mnKmSlJeuoKCepqScp5y0maGqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOll6mmrKGkm6ymvayVvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6p4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOLk4l4eYGWfmpsfWJ9dG2AemBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmqWcrZigqKW2qL+upKmjn4uAjZubn6aekpSZmZOamqSjo5inqqqio56pqL6kl8Osq6OirLO7rLCoorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmoqWj5OUeXiNm3xjc3xhg3hzgHxhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6ln5qko6WZnqOpsqi8r6Wonp2OfIqalqGgmZCRmZqRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuPmY6UmneAkJl5Ynx6Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5yaoaiimZ6grKypuK2no5qXk3uHmJKmm5OPkZiXjpiUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivKmwsJt0dqqktoVliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpeOlJt7ho6UdGWGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY2VraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7g5WNppeOkZGXk4yXlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbadiZaimIapmpCUnZOqs5mbo6yhtJejoZ6hop2hpKGVq6eMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck5+UlpSegIaTi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeQl6yji4iJj5ynlqykopqonp+TlaOXqJqpmZSnoaSQmqeZobS5p6qYmpCNe4CTjKGUipSRlY+Okpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mpKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKqenp2cl6ydkpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZuVnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajk5epnI6GiombopCun6SXqKChkpeZm66LqpaQqJmojJiojp64tqOlmJuNiXmAkoybk4qVkZOPjJGWoYucnKednrejf4OvtaKwr3SkvqOyoHh7oayzvZZ3rqWgioCqfmRcYnafjqSdg5d+bpOznKOor6ukZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXqjl5Zkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62lkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI6bpJ6QfoiImp6NrJqklaiino6XkZ6FdK6QiaaaqJGWo4ibubOnoJiZi4l1dpKNlpOKk5GQk4uPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnpqEmH2RiYGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpai0nY+DnaucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5SdrIiftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ6ipKqilaSptqKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKh+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZafoKWrq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbaF1iTEQ9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqhm6KjpKubmrGsq5KXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhX2ZXYkJQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5qnn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIjJaXhJKUmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNgUV5XXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maoouaqZucp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVioqKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVJbZlBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkoqFiXmEd4iAboGehneAkoWHmKCWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilHa1trXJonSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWWhPUmhJVUxYUlZcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelX+TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlZmWVNtSVhPXEhYaGhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn46HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpWYWBcakxcUl1JXWxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5Oqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cnFvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5WMiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mcn16dG90Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh42AdWuBg3t5mWlyaGB0inB9end2b3ZzgV1db4dnbl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfYeThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumoKKanYaEk5qZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSan4OPmH+HjoNweIZxdGF+hI+GdYyYgIKOgoaEfoWElW55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mNj4WTqJCHhI+Cg4qJiXWEhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wa21ja2lngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhHyJkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5GIj5KWk5aSdoyjoKGdlpp/gpGamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqTl5x+k5N+h46BdnSCcHZgfYCOh3KKlnyHinGMfoKFho9oeHJ5jZmTkICYf4mMc4KIfX1yenyMhXt7ko6El6aUjIaRfIWGh4V0gYKGhnlkcXp+eHlwbGpmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xoZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goR9iJB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYeoCPmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAj4Frh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5ioZ6hZKKjJmjl4OEjHeIhIKBdnqAh4R0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegm5KQknSBjpKUiZ2dnqeZmI6VmHWPkItthpmQmXuHiJCJb5edmqKTlIqNnoyGgZOdf5OSloeaiXyKioF6cnprdWx7f4t+boWSg5N3b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iYd9f3J0f4aCbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2plamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfanJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZSRjY1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R6iYWQinCWmpOhkpKIi5mMgn+Rnn2Sj5OMmo97ioWHdHN2a3FudXyLdG6GkY6ScXSAfIKCiHxlcW16fpuUfoWKdZGLgXSJem+Bf4KIfYWNioaOlqqOe4h9fouFd31wbn+EgmJnd3N0bnpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2pqX3Fpc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2Lj5GEbomLj5GKnJahnJiWhpiJbIalhWeHnoqRfoyEjIF3k5iRnZGQiImUjX5+kJh8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3inVxinyHjXuLh4WKj5ykiXyEdoGLgHd4bWl/gX9ccXJxb294Wl5wYW9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWN9Y4V8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlZiSg4aWmIuTi4iOj4iehZGLfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIkoSRhIpxg5GXj5qOj4yLj413e5OQe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g418emh1bXWIlox/iYd7lJFyeoVxeI57i417iX6EjpGfn4Z9fXiBi313cGhrgIF3XndvbWtxclVeb2JxYV9tbnlwZ3BmZnR1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGlxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFrhGCHfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH9/cIGNgI6JfoR7g5GWm5uLfXd4gpB5c2xlb36Ca2l0b2doc21TXm5kcFpfa3J5Z2trYmd4c29xZF93YGFWa19edk9NS2BlY1x5cYp0XFtldWBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhZFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5OZkXV0eIaNdnNxZnR4gWFzbW9haHVmUmBwZ2tVXm10emFyY2BpfXFybltjcmFjV25aXHdNTUxjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qIm6OElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6OgnGGfn9yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRl4lvcnqMhnVscGpxd39ec2huXGl1X1JkcWhmU19vd3Vgb2BdaIJxcmpXZ2ljaVhtV1t1TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGneG5xd3txkpCNh2qYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hICMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIfnBgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkZOFb3B5i390bW5panh8YWdpaVhrdVpSaXJpYlBicnltYmVeWmqDbnNiXGdfZW1fblRab05ITmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoV8ipqemYeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFg39rX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjpGMfm5te4h9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR5ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2tCWcXuQipB4fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeEeYedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9f4R1Y3BzgGl5cG91mY2Gg4p8dniAhXqBalxyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo6OhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dWFeXFpZdH1zb1dnXWZqcmBvTldoUj9ZZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoOWjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHV3hXqInpGNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIGKg3dheYSCcmRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2JeXtybYmEkYWMc4J6gJeMi390bWt3gIB0dFxoZ3ZvV1Z7UllwZExacnJlW0lxeG9cW1tZXXR+dGhZYltnZm5jaU1XZlE9XmVcXXVlX3RvWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iTiX9oe31qc3tyhntzd35/jHp4hH18bIyNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFloZzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHaBf3Jkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WMg4d4iHaDiXt5dG+KgZGChnN/fn+UiYl6b25qboKBdG5dZ2RycFBaek1bb1xPXHJvZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWmhNQGBjW2B2YVx0bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uKjY+Dan57bXd4dop3fHiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpODc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3qXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h35ranRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96fn12j4aDdmlxaW2IgXFvXWdhcW1JZHVLXW1VVFpzbmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUVtwSUNjYFtjcF5cdmdVVlV3XltlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+ioyTf3CAe3d5eoGLdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aOgHqSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Id4KSjIV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIV6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnl8dIuCfnNodGVui4Nsc1ppXnRkR21tS1phV1ZWd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgomOint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubVxiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX57kYR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi4yIc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlH1yh2pvfoF5bn1dWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3JYal52W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNZbmFZZHBHQGdcYGZeXVZ7Xk9VZHBaW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVyf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR7fox+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoORiHSWiY2IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx8gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxuV2pfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmFxaGdiV2ldXGxoSkRqWWFkV1lVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSChHt+i4N7dnt3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CEeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kYZ4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngHZ1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXxsa1ZpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2NwXUxLalhjYVVUVXNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNvcn91dJmCd3+Ad39/hoV6fXSChH6XhW5zdHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1VWG9njqh3gXp8kY55dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx9a2tVaGFlUkpsZ09HUWtFYXhnYU1TcV1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bnB4dXqYfXeAgXqAgIeGenh5gn6Bk4RydXR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nb353gIuOe3Fyfmh6cHuOfXiQcoR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfmpsVGhdXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x9dHZ1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4foB4d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFheYmOPpGh4dIOGkHlucHtpeW58hnx2inOBeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2Zubn1laVRnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xkXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ3doJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH+AfHZvbmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcnGFhJF0bGx7bnBxe319coF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx6YWdUZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFiW1pYWWxxV1JQZ1dXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26PhnFud3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZY5WVY25wg4WKdGtofHBmdHh1fW16dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ29+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqd19nVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3drYlddVVt0ZFNSV2lSWWZUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7gHecenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nVlhfV2SbiGJrcYGHfXhsa3luXHdzbXtqdnRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcWZxfW5zbmNaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRdZVZhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBVX1RddVxUU2BnT11hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj46OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSHhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4aGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4qKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1c3J2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgICAgYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A/PT5BQD0+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QEA8Q2NEQEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pj0+PDxHe1s+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hERkhEQD48Oz5AREVEQEFGQlFlbnB5cUVERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHVWVhfoWFhYB6VEFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLS0peeoCDg4F8g35jTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS2R/gX6DgX2EgnuAhoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSEtLZn9+fYKEg4GChISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dIS0dqgIKCgoOCgoOCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUJERWaCgoKBg4ODg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOj1DU4GDg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj8+QT9ZhIOEhYWFhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PDs9P0NCQGeFhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/PzxAPkFARUJOfoOEhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDs+QD9BPkFARERIQ2qFgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APj8/QkNGRUxXfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD07PUE9PkBCREZHUW+Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT1AQkdGQEVHRUpRd4aDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkJGVk1ES0xJTlJ6hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxSUlBTVXqGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZYVlhXd4WEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RTVldXV1ltgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+a1FLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0JcXU97Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ01SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+REVDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXltYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZOTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxMTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUpGREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0VFSkxMSkxNR0dOSkhKS0dLSklLS05MTU1MTElMTUxbc2JkcF5sbFVNTmVzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTWlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkFCPT9ARUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JJSEZKREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRURUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQEZFQlZVRVxUXlNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlMSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5OSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZZVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFVTWFpUU1FZV1dcX1tgX2BWYlxgYV5gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVdXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1tbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXV9jZF9SWVlQV1ZXWFdXVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXF1YV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllaWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbW1hYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzM2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eX+DgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHh5eXl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH19fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn19fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4eCgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCkoyCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaGg4KBfn+RmYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhYiCfn1+fYWcjIaGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OJioCAfoWKf5OPhIF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDgoqKg4iCg4WAhISAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODjomGhouDf4CAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SQh4GCgoKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYiDgoKCg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoeCgYKEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH5/hISDg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59fYCEhIKDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGDhISBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOCg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4eAfYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42Ojo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGOi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYSBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5dHF1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7enp7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhIOEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOCfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gX19fHx9gH99fIaDhoaGhoaEhIKFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0M/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dG4oNDRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Szlpi6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q8n6OostGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv8eHmrTV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3ao5i11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvA16GYtNPTr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWq9ihmLTT06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5PToZm11M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ6k2aKZtdfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYv9ehmrPZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8vWsYPF1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU0dDD1NHSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3rqmqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr65vMHBy769ycTAwMrAscG/u7i7vrq1t7O4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u+v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDs6QD08PDs/PkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbq7v723sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4Oz9AQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW51ce1s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLesudmzu621r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK3prXUmcG3srGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCfoqCir6+ssLGqqKqyyZamyLCuraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ6empqSmZ6coaKgoJ2hpK6dn6mso56XhXuMkbGUiLWvqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+do6bOo5uloIl2g3NiaGt9h4Ohs66uqaunoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWen6GdnJibn6CboJ+fl6Kw0auUjoiBYnGObGJdYHigsa+npKSjoJ6lq6ael5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKcus6ihm5jh19Xh4iPj5ywqqGanZyfn5mXmJiSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmcbClWtcapdbVHGbsLOtpJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsmp/PtIFaXH2Ra5CurqWdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaWl0qhqWnWVo62tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWxr82hWmSfrauimZaYmpudoZ2anJ6TfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxtr7Ml1qQopyWk5ecnp+fnZSWmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XHysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLfJzZeImo6NmJWQlJKRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr25zsmhlI6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/ttKzkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubS7k42Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLW0m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szDxsLF0MfOwsTHwMbGxMTLwsrLwcPAxr+4urrJtrO5urOxqZGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS4u8G7t7W7w7aztbaprZSDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6OfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLEsbvDubOttr24rK+xqZ6Eh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7O+v7G/wbmqprG2s6SsraOJhoeAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy1wbm1vL6zuLy3pqOttq2jq6iWfYSFgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6+uL6/uL29t7e5s6Sjrbehopqfh4B9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usC6wL6/u7m0trKio62xmZuDlIiAd29kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLvFub/Fwbq7s7axoKarqZeSgYyEfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLs6+7w7rAwsC6vq+0q6GlqaaXj4CBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrSytbuwuLnBur2tr6msqKqllZiCa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CapKeclZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGgtLKns7ehnaK3rKmtpLKyprW7taursaOIeHFsXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysay0oaqywLa3qaanr6mqmZCfeV9gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKulqpShq7y0rKubo6inpZGOmm9XV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKqtyKyloJuFmJ+3qqOjkqGgn5yRiZBmUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFh36KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEdKTkxNVEtRUU9GSEM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestL+poJmRgY2Xrp2elYmbkpSPi4WGYk1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEzNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrOwo5yTkJeEkqGUmoiAlIaLhYGCfWJLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FocYB+jnBDioSCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnJqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6epsa+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYeUfYyTkJJ9eYd4gn57e3xiS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6CbGljbHmFkJKGa3NsfG5ye4ZobXB/c42JhIV6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY11kH2DiY+MenZ8cnt2cnZ5ZE9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26TjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIc4iEd4qPi351dnR2dW13cWdVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSdmx/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3pxcG9rXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW6Xiox/eXp7cXtzfGpuXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjXp2iH6JiI5zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4J0ooaNf3+CgXODgHxreWxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZmd4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxalpcXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoV0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CNlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn5/cV9cYl5ZZmpcbGteWEtIT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5J6gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdnXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSkRFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ/gI17v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AeWlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfXBeYGBcVmBdZ2VSWGFWUlZJRUZOS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFhfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bWRbYFxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzU5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcW5hXl1XUlhSW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRtY1tXUVRQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eFh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09nb1s/b2tHWyNXMk3Z4Z2ZZWE9SU1xHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4d2VnY15TVlZUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVpaGRVX1pST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZWVbW1ZSVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6VmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ako+KkIqXm4mLlo6HfYyYnomQkJyampOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJKPiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HJyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SMj42Vo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77CuK3Cw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5OWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKystL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmrKutsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlZugoaiep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJytqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5WZqqGedV5aXVxJR0VGTVBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk5LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUxKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKuzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSrs6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpUQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+vrSorrG2nparrqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkp6ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLq+ucO3wLmxtKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQipSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vr6/t768sbytp7q5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5iap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cS05jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7Kxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmtraWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fH1cU2RvXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLO+wcK7vre7xKest6yzuLzAr6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6moqK2pqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaQlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDur+zyMOrrretsri/vrKtraukp6qwqaeosaW0rqqwrq2ysbSstLyluLOtrK6nq5+jnrC3q6qtu7elt7akqqesq6qtoamnprGypKeloaGsl6qhlZugpp6koqqkraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8G7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoq6irp6CrrKm5tqmqqamiqqCtm5KqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaEioqNjY+LgoWUopqNjJmQkpGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLvBsbGyq7OopLSopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6qjqqGirK2ova+srqyiqKigrJmQsKKYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYGLho2MkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5ka4B0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mepKmoqb2stK+tnaqkoa6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6wraCro6Svn5+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh8fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLu+t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsK+hrKGtpJymp6mampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrG8wrmpu7q3p6i1qairsa2zsaibvrimrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hoKGUpKSit7ChprCrn6yjr5icqqWpnpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR31dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepaGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGyppmepampnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIiRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qquvoaDErKqnsbSrrLS6nqipq7GlmJ6qnqilkpqmrqOYnqWqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1tZGBNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OUROPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p62ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+OsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppycp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ11MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CjmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCraelnqOkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnq+ol5yin7Szoaqboaysn56al6Cjqp2ZnqWhnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6wd1dYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl5+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVxKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhmJOnq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOnm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6Kcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+RlJWrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0cqNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCsK2pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp6yjpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6VlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqukq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPRDVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqaiin56wrJibl6ior6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqqqKOhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5efKhVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqOsoaSfr6Kdm5OqpLawrqCpm5yXlaajkJqip5+gppyxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqihoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXVxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7WfopeTqKu2sqybppyglpClrZKanKaioKqmraGjp6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKumpJ6ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmamklKK1oqOVl6KqtbmknKOdo5OQobKZnpumpKCir62cpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGsoqSXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maGqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKCjm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eWBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqho56pqL6ll8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLFsZ22Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKG9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYk42XlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZOqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZSQjZGWoYucnKednrijf4OvtaKwr3SkvqOyoHh7oay0vZZ3rqWgioCpfmRcYnafjqSdg5d+bpS0nKOor6ykZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgY2RjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOTh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfGlFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkouFiXmEd4iAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilXa1trbJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWp4h2ZrZ2J0dHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiFlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uaGxTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1sfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yOhpuFhY51gIx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4KIfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5i4Z6hZKKjJmjl4OEjHeHg4KBdXl/hoNzXnd3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmqKTlYqNnoyGgZOdgJOTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3Jzf4WBbF95dHhwe25hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpShkpKIi5mMgn+Rn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgXSIeW6AfoGIfYWNioaOlqqOe4h9foqFd31vbn+DgWJnd3N0bnphXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZGQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3iXRwinyHjXuLh4WKj5ykiXyEdoGKf3d3bWp/gH9ccXJxb293WV1vYG9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfHOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qOj4yLj413e5ORe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIlox/iYd7lJFye4Vwd417i417iX6EjpGfn4Z9fXiBinx2b2hrf4B3XndvbWtwclVdbmFxYV9tbnlwZ3BmZnN1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGhxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIKNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Ba2l0b2doc2xTXm9kcFpfbHJ3ZmtrYmd4c29xZF93YGFWa19edU9NS2BlY1x5cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbG9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjV25aXHdMTExjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuJiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5ec2huXGl1X1JkcWhmU19wdnRgb2BdaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGl5cG91mY2Gg4p8dniAhXqDa1xyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBsTldxc2ZgS2x3dGFdXFpZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uIgX2JeHpybYmEkYWMc4J6gJeMi4B1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XmVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4eSiX9oe31qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXp4c2+LgZGCh3N/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFxgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan57bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p3eHFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHlsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgYmNint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVxf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR8foyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kY56dnF/cHR3epCBeZZ0hYOAhYh2anF1Z2duW2xjXW1yX2dhanhofG1bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1TcV1KTVRaZWt2e2VfbXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcYR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1zfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJvhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4fn94d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2iXOAeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d3ByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGt0b35reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319cYF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZVa1BJUFpVa2trfGVtb3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fWx6dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlPSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygY2LdndseoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtpdXRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2dsPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHiIeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKjYiQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IiIyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHh6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdXh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHSEVEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6PTxAQkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBREVDQD1IREFERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FBQ0ZKSElGSEhKSEZBQF9oREJBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMS0xIVF9ocXtXTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLTExgWGd/hIaEfnl/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT215g4SDf4CBhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hQdYKBgIKCgoODg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERU12gX+BgoODgoOFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxETniCgoODhISEhomKioiHh4iJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49QEBPf4KDhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFBP2KDg4WEhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4/PzxAPkFAREFNf4OEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz9BPUBARENHQmqFgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT5APj8/QUJFREtWfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs4PD07PUE9Pj9BREVGTm6Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT5AQkdGP0RGREhNdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkNGVk1DSktITE95hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxRUVBSU3qGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZXVldWdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1RTV1dXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaW1NTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f397eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0JBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0eHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NER0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1lgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QkFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFzb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0RESkxMSkxNR0dOSUhKS0dLSklLS05MTUxMTElMTExbc2JkcF5sbFVNTmVyXWdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHBxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURHS0pLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRURAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSUNFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlLSktLTk1VTk9LS0xHR0tPU1NPUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVVZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVVRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSVFVXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV5WV1pbWltbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXlhYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2FfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzQqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5eX+DgoKCgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl4eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnt5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4ODgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4OEg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4GCg4ODgoKEhIODg4KChIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYGBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CBgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGCgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoeNh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhIOBh5mMhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KFhoKAfn5+j4l/f39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODg4qGf4GAhYGAgIKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WEj4KFg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaDgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIWRg4SDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaBg5CEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEiJKRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf32AhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fICDg4KDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCf4GDhISBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBgoODgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWFgICDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHiIiGhoeHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhISFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNi4yOjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MjIuMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLioqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgX+Af35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChICDgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgoCAgX5/gH6AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICBgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXl7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgYKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fXx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYGBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSEhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4iGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIeGhoeFhYeDhIWEh4aGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoKEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag397gH19f4J9gIF+foF+fX59fX97f3x7enl6enl6enx5enp7e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tHtzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZo0KSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaePS4wMDAwMDAwMDAwMCposqurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamro0s8Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKycrKysrKysnJycnJyc3T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn08iUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Ccq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6u1lYecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv77ImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3TlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvEsp/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWrdCLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TK26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCbkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiMydkY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbu1vL23sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLets7Gvsa61r6+ztaqnrayjm5mUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK2pq+zq6mqtLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpKGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PUI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCgo6Cir6+sr7GstqiusbCoprGuraywp5+eoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ2empqSmZ6coaKgoJ2ioJ+en6mrp6ypqrSsq6zKwKSrqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+dpJ6bnZyloqSjoqqwrKao1LSlrK+uqaunn56eoaKdnp2anJyUk5WUnp2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubn5uenJ+lpqWgo8i0sq6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKgn5KZn5mSmpifmY+JorGzqKCanZyfnpqXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmqCavqOSjpaMgouaqbCqo5+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NXT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+8wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5anr8usjI2Ri5mvr6adnZ2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/Dw8jOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaear8TGpYaGoK+snJWYoJyboaKfnJ2alYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWyo7fLu5uUqquhmJaYmpudoJ6ZnJ6TfnFlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxuKq7zq+jnpyWk5ecnp+fnZSXmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAycHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLmvv8qhl46NmJWQk5KRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr24t8Osko6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/triwkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkVKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubSukY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLa1m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtMSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTHwMbGxMTLwsrLwsPAxr+5u7rJtrO6u7SzqpGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS5u8K8uLa8xLe0t7mssJWDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usG7vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLFsbzEurWut766r7G0raGEh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7PAwLLAwrurqLO4taavsKaKhoiAeXNucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednJycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy2wrm1vb+0ub25qKSvua+lr6yZfYSFgHlwcnRxaGVkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6/uL/Aub6/uLi7taWlrrmkpp+iiIB9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usG7wb/AvLq2uLSkpa+zm5+Hl4iAd29kYmdpaWZnaWdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQq6iwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLzGusDFwry9tbizo6iurJqWhI2DfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGGkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcn6GgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLtK+7w7vBw8K8v7G2raSorKmbk4OBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLfoyQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKefo6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrWztryxubrCvL+vsauuq62omZ6Fa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKiclZWXm5CSh5SOjIGLjYCQipKSkaGan6KVlJiYlaKlmYyYpKaopqGgtLKnsrehnaK3rKmtpLKyprW7taursaOIeHFsXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysa21oau0wbi5rKipsaysnJOje15gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCin+KmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3d7eio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKymqpSirL22rq6dpaqqqJORnnBXV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZOdlIOWjpCPg4Z9knhyb4WNfomAkI2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2op56XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKmtyKymoZyFmaC4q6WmlKOioZ+UjJNnUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaOem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEZLTkxNVEtRUU9GSEI8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestb+qoZqRgo6Yr56gl4udlJaSj4iKY01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cWdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qq7SypJ2VkZeEkqKVm4qBlYeNiISFgWRLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm1sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6ipsa+xq7y4rLu+ubOtqJuxp62ckJadp6umo5qckoeUfY2UkZN/eoh4g4B9fn9kSkZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42IhIV6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5WWmZeel4yDiZ+RipKNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKjmZqTlo51kH2EipCOfHd9c3x3dHd7Zk5FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH59g3RmZXR+hIOFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaJhoCQh3VpaW5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY+RjZKJc4iEd4qPjH92d3V3dm94c2lURklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqSdmx/e3xtcW1wf3pzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3lwb25qXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iQh3aDhW6Xiox/eXp7cXt0fGtvXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGEmYSbnGGGqp+dioKQjXp2iH6JiI1zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXd0hHpwc3l3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1bnFyZWZfW1pdU1tmXldRVVhcVkdKS0RMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEkI55g4J0ooaNf3+CgXODgX1semxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoKFcYSFR2uAd3F5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnFwalpcXFtjY1hnZVxVUFBXWVBETExGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxgZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CMlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn6AcV9cYl5ZZmpca2teWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5F5gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdmXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0dFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNk9rInZZzVpeIj4icj3yGjI+KinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSURFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRYmRXenVxgZR9hIaTdoZ+gIx7v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AemlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlWWndqcH+PhIGOhW56cniHYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu4tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfW9dYF9cVWBdaGVSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afXdpW15aWFtfWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamlpYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOmp6NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEon9sYVpbXFdfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5GLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW08zU2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcG1gXl1WUldRW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXRsYltYUVNQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrJyimpqfpp+frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NbY19jX1NvX09nb1s/b2tHWyNXMk3Z4ZmVZWE5RUlxHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uGgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKilpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4dmRmYl1SVlVUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KdkZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2Mm6ScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhYSApIaKi7iYnZGUlqGmoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVoZ2NUXllST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGOg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5bg6KRgo2fk5WMhoiMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZGRaWlZRVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGxkGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKKImZ6VmomPhpeYioWPjYF/ho+liI2TqJqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWlqShh52ako+KkIqXm4mLlo6HfYyYnomQkJyamZOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo66wqpqZnJSVkZefl5q7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJKWjJCVjYuNlpiTnZm0l5WrnYqclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paSofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q6tsG8rKmcsqWkqJSFjqnEw6SCi4+HiISGlZSNeoONkY+RooyMlJKOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HKyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXmFjZKQnp+Tj5SMj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqKalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77BuKzCw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbO/uryur6igqai2ra6psrebnq2ip6Geq7e4qqWvv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9h5GZkKqZmJOTj5KWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpqK+vmKOvpKekpbXAsKystL7DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI6WmoyxlZualZKSmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmq6utsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+urOuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlJqgoaiep5+ZmqqZoaeemJCNkZ2DbnaSo5qVnaKdkK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJutqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNhqKfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wcLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KXkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKShlJ2inaC1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5SZqqGedV5aXVxJR0VGTFBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/DyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk1LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVpLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYVZLopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7S3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawqypnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJbTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKnk6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r77EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaOTr6+spaefkqGelZ6PkI2VnpqinqezpqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUtKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwbSrtaiwuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKempqblpeon6CYoZ6usqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTU9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC5qbakrLutwMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesubDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSss6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpVQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sby+vrSorrG2nparraiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLSywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkZ2ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLm+ucO3wLmxtKypura6ub60qa2wtZiYp6uqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtK+up6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YEVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLitCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y2vb+/t768sbytprq5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKQlI+cm5eWlYiWkJiap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cSk5jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5r7a2v7yuqrKxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmsrKWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnJqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fHxcU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLK+wcK7vre7xKest6uyt7u/r6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6mpp6ypqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaPlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmJRc3FcSzuEfEU/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKsraukp6qwqaeosaW0rqqwrq2ysbSstLykt7OsrK6nq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6koqukraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8C7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoqqirp6CrrKm5tqmqqamiqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaDioqNjY+LgoWUopqNjJmQkZGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLWopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6mjqqGirK2ova+srqyiqKifrJmQsKGYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYCLho2LkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5kaoB0Z4iMfVNYcF5Kd3NTZFRRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzuqy4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKiaqqepo6mepKmoqb2stK+tnaqkoK6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAVnpsVGJQUVhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upp6GpnKSooa27qK6wraCro6Svnp+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh7fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1BRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLq9t6i5t72qo7Soqaqxrrqxqpy8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqrqagppijqaCxuZ+jsK+hrKGtpJympqmampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKfmhYWk5QTEpIUFJQSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9YVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrC8wrmou7q3pqe1qKirsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hn6KUpKSit7ChprCrn6yjr5icqqSonpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OHi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR3xdW1hPTkpISFJVRjI6Xl5sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxXlMsMpajopiVnamepqGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G3rL26tKWis6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZo6ecpaaUmKGzppmepampm6GglKWfpLmopKetpp6loaiTn6mhoaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIeRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysL3At668vLGkn7aspqa1qauvoaDErKqnsbSrrLS6nqipq7GlmJ2qnqilkpqmrqOYnaSqoZuinZegnae2pq+praGhnp2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1sY2BNZ1daYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BjRiU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxaGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p66ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFgU2JoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIY0InNJOinI+OsZ2blKGaqbKwn7nAtqCzwbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxtraxs7a7p6mftqmdn6qjqq2dq8OZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknZmpo6WVmqCdkZyjq6qpup6npKCXmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0M3RFRnXUpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2E8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom6++lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppybp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ11MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVfNzAojaaXhJ2snZmZnZ+rqqiqv8Ousrq8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CkmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5XYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+tsaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ2oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXU2xjWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWCraelnqOkqrG3rbS9vrC2xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnrCol5yioLSzoaqboaysn56al6Cjqp2ZnqWhnZqhp6SQnaObmKGgrJ+lpqCaoKGVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1NrZ19MS1xjWFxaQj6wd1dYQSNNaEZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGoj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hYN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyikpixqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijno6soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rum6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpJqdm6mflpWYmZKTo6qhmJOnq7CloZaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2ToLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqOZnpWlopSUnJqSlqOmm5SQp62vpaCUmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe4CLnXlvsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RklfQzE9N6KcmZm/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOi6mwr6adlpqnpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHSTmH+yaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpyduqKcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+Rk5Wrtq+mmZObrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn7Vlpu4eYmRmI2XiYynh3mitnR9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrZmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGam5eVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolynsG7vJl6gbKocIB0kbmDe4aGioaNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrOrqqisq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnqOkoouSkqacpaudlqmlppyaoamnpqOooZKsnpeinpeWmJ2ej7Cpk5ynoo9rfmmcqHmIc36bjnV6ZYd7vr/Aum6SgnGUhV9yalpdmolhZIeOlWtgf5RjbZt2YpRrgJqVlGVeX2Jxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKGfqqKarpuVpqCWlJ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeTkIOJtKmNhZiVjoqMmJaHk5WJg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5mrnKqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio6Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhYWakYaFiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6UlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJiknpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5qZ4yXkaJ3a2qLmKKemHJrbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnYycwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGNeZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvqqanpbGroKuYm6KgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScraiRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtrKykrKawqqGnm5qmmJyir5+hn6ino6Whn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq2jq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6Wlo6GqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6iqqK6rq6aio52ao5Wfpqufoqagqaijn56wrZiblqinr6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqpp6OhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5ee6hVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKsoaOfr6Oem5OqpLawrqCpm5yXlaajkJqip5+gppuxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqehoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKaqrKmmoKakmKujn66rnaahrJqeqaWdprWfopeTqKu2sqybppyglpClrZKanKaioKqmraGip6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKympZ2ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaWvrq6ppp2lpZqjp6CyrqKpp7KgmamklKO1o6OVl6KqtbmknKOdo5OQobKZnpumpKCir62co6iitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGso6WXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGepqGgtaeiqaewo5Sro4+kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maCqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKGkm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBvZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46apKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqhop6pqL2kl8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrIqEsIWmmaOhopGFoFtsaoGzYH+te3qCgLFsZ22Zl4uIsVp9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylo6SipKm6nqDGp6Wpoay1t66vqKG9r66ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpipL+9fX6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtlamliUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKrup6pxaOhsKSrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9ub3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomVlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2VsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYlI2XlaaTnZanopmvpp2irLmfsMKopLSmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZKqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjYuSkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqJ+MkZ+jrLCaoaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjI+NlYuBfmaNh3WHdnmIhHScaoeRlZWSiX2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kXnBpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZOQjZGWoYucnKednrejf4OvtaKwsHSkv6SyoHh7oay0vZZ3rqWgioCpfmRcYnafjqOdg5Z+bpS0nKOor6ykZZ+glHR6mpdwgJmpmGyAo6iKZZylnJCXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV91b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrifoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmAi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGoJeZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkeG1pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOpZZnlKR5tIyfn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1gYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgap0TKp4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnudjHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSiIGAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpwMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkXiLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIi5x9lZ+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbTRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFkfGlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG5xYGRlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHiceqqZf6KPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhplvkoKtfKODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFFQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqZqTkouFiXmDdoiAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi3+MpI2Vg6+ilXa1trXJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15pdWp4h2ZrZ2JzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJentUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7ltj4qiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FmYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYKHlYqJlpmCfIiFlqaQgaGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bXylr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uZ2xTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkY25zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e319iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gHmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYgoGbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6CLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Rjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH5vhYmEe31zfnlyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiHg36Sg4SGioF6gIOLmp+PgqaghniNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdj42xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJyio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZipoJyTnI6NqY2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yNhpuFhY51gYx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1hamh1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/b4uKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmPkKaMj4GbkomUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4OJfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8c39qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KdoJKYjY+hjIuDl5iDk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY1+lHmMiX2BiX18coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9fop/fpeElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmaGTlYqMnoyGgZOcf5OTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeYh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbF95dHhwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXVteXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGinqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+RhpGRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpOgkZGIipmMgn+Sn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgnWJem+Bf4GIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXW9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmRpZ2VpZ4B6d3VujoVzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZCQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknt3inVxi3yGjXuLh4WKj5yliXyEdoGKf3d3bGl+gH9ccXJxb293WV1vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmFda21kYmZrkm1gZmZfZ2uBdHFyb4uAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J4gHZygnmCoIKRgZKRl5uRmHeReoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qNj4yLj413e5ORe46LjZKWjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIl4yAiYd7lJFye4ZxeI57i417iX6EjpGfn4Z9fXiBinx2b2hqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZnN1aHFsYXdlXVZlYGBxU1BOW2VkXHhwiHteXGhxYmJlZZFpX2dkW2dvfm9rcXOKfXZ8hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZWLjImLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIGNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Baml0bmdoc2xTXm9kcFpfbHJ3ZmtrYmd4c29xY193YGFVa19edU9NS2BlY1x5cYp0XFtldWBhZWSOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5OagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbW9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjVm5aXHdMTExjZWFddnOKbVtcZHheYGRlhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWMf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyTkYGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiFiIyGgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl1X1JkcWhmU19wdnRgb2BcaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX57dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4OZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkIqFe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4iMf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdqaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXFlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmRnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5VvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKCiINugHdogIR4cn+Ag4qHfGV9foR2Y3BzgGl4cG91mY2Gg4p8dniAhXqDa1xyf3OCiYeKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaV3BsTldxc2ZgS2x3dGFdW1pZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWlhrZVpjcHlfaFxeZWxoZWtpcXd/iG9sf36AdW+Cen+Cf4J/doGEiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKVjH6RjIt/bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2IeXtybYmEkYWMc4J6gJeMjIB1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XWVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWBgY2ThHCAi253fYB7e4eSiX9oen1qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnN/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFwgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan17bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRf39+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx3hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4l4eXFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hcIJzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x0eoWNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhXt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH52gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYKHgHVxf4aFjoNwcHt4dnV6hoWHjIV6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F4gYR6fYt+d3dydm97dmVqb2CHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt4cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF9dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeHZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJthXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR8fYyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR8gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa2+AZ2tgaHl4anN0c22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1Tcl1KTVRaZWt2emVebXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXZ/gXmAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH6GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6Gbnx/c4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d29yfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+f4GTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZValBJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGppdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlOSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg399h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygY2LdndseoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenhrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFmZ3RcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKCeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGkpSUlJSUlJCPj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46Mjo6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYuGjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKi4aOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dDREVDRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMSktJSEZFR05HT2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS05MS01MSElPcHCAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT1FUT1hsc3qBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hLVHBlfIOEg4KCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkRdfH+CgoKCgoKFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP2aDgoODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEd4ODhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REZJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4+Pzs/PUA/Qz9LfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz5APD8/Q0JFQGiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT0/PT4+QEFEQ0lUfoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD06PT88PT5AQkRFTW2Eg4SEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDk/PT0/QUVFPkNFQ0dMdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QUFFVUxCSUpHS015hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVEREtXUUtQUE9QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lKT1NSUVVWVlZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1NSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaWlJTUU9SUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7enZ5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx5eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBQUlFQTU1OTEpMS0xOT1BRTE5OTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZKTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktLTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE9Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QD9CRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A9PD06Ozo6QERBP0JDRUVJRkpKTEZJSUdGRkRCO0JDQz4/QkNDREdMTkhLTkhESERJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFRUJCQUVAREI+Pz46Ozs9Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdERUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRENCQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJHQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSEtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmhjaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhJSUdISkZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0NES0RESkxLSUtMR0dOSkhKS0dLSklKSk5MTUxMTElNTExbc2JkcF5sbFVNTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLR0dLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKT1BRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZESEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURHS0pKREVJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVDREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJhYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGJhZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmFkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9OVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBJS1F/UUl8WVlyc1dQbUhxbm9hVlJycXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdmBZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZ2tRck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fW9+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym93UWRkSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofGlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUFFTUklJTU5PUVJQUFFUVlJYV1xXU1NRUVVVVlRaUU5SUVdVVFlWVFlVU1FVU1RVWFlYXlpfYV1cWlpdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1VZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1FUVFFRUVZXVVlaW1lTVVJUWFdXWVtTT1JUV1VUWVVWWVVRUVdVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNSWE1PUFFUWFVUVFNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYGNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVRUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNXUVNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV1VVlpbWltaWllaWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYaXFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6eXp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3p8en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn1+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKAgYGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaFg4WDg4SEhIWFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoWFh4eGg4B+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhoeHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFh4OAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoWEg4SCgYGBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4WDiIiDgYGBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOKjYKCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIeGg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf31+g4ODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB+fX59fH1+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjY2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGTkYyMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNjIyOjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH6Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyKiIqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fX5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChICCgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH5/fH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoWGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCposqurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyc3T09LS0tLS0tLS0tPS0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1dbW1tbV1dbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9GdkLmcvLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6yspo6AjcafmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GeqKGJrNa6mKGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnaSqrJulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6tpJyVqJCahZ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWraezq59/n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TI2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCXj6Cfn5iolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybrKWrop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8+pjo6t2MKPjbvV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1L+/1dLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ozw5Ozs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY0Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXVlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSUdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BP0pCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtq6mur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2s7S1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTExCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2srSrsrSuqquvsLKzrqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpKWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqa6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJqakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSpsa+imZydnqGZm5uamJmblJWblpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir6+sr7Gstqetsa2mprCuraywqKCfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmZ6coqKgoJ2in5+en6msp6ypqrSrq62rpaWrqKqsqqWgnpmSkpSYmZeWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKeompmdmqqnn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZyloqSjoqqvrKepo6ChrK6uqqunoJ6eoqOen56anJyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8bEvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6/uLK4vMTBwbq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzyMTLysrOxcq/vr+8wcfEzMzIycDDv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSsm5aployWjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0s3Lz8XJyL/Dw8jOzM/Qz8zKyM64t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLFsrapoqWmoaKrtaeasaCYnYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdTOy87IxMnGxsjMytPT0dXP0szSwbnFsqWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqrMOnqamhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzs/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0tHP0Mq9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp564trW1raWtrr60scDZ0tfa3NfPzcvE09DCwrKrra6sprOyuauyvMaioZyWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rEx8DFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaKZlpGVlpKLlI2akZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzc3QydbWxcS4sraqpK6submxssSslo2NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/GusS+xsm9wsfJzsTCx8DHzcfDy8rLz8fDw8/IxsHFyMO+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/scHKx7q9qrGyp6Wdop2YkJqQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3H0NXW2drb2NDK0NDS1MrFur6+sKi3q765uLOlkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz83W0NbZ2NnQzdTOz9DLxLjGwba1vLHAtrqtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcG9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73LxMHFwsbIxsjG0MbCzMiyx8rDzs3BxcPAvbO3sLOoqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cfW1dbYzszQyM3IysW+ysGytbq3uravkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wzu77AuMe5tLu2wMK8uL3GwcO8ta6ytrq+tMW3u7WruLy9wL2wuravtrqyxby2r7u/tLa0xb2+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwsO3w769trm+x7+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/IysbKxsTAvc+9s7i9ube2m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxq7W5u7TCurC/sb29u7a8yLnDt62qqLCywLa4vK+wp7GztLu8q621pq62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8TDusTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szExsHF0MjPw8THwcbGxcXMw8rMwsTBx8C6vLvKt7S7vbW1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RiYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6iuuLS0vLizvK+4ubWyvMGywa6lqaKrsbKzqLyqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yri/xcC8zLrDxsW6vMO9ube9xbi1uLuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSttrmysLq5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVlfSE5oT1RIRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8e7tsPGs73Fu7avuL+7sLK2sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLO1rrO1rrCqn52eo6KypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKurrCu7XFuLXAwbPBw7usqbS5t6ews6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKivs6e6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrG3sLq2ub2/t7KxlIV5dWVfZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LnDx8C2vL22w7q2v8C1ur66qaawurCnsa+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnZuaqqavsKubo6O3qqCfrqi2qaanrbCkt7Ckt6Cim5iYqqahmqy4sKKhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb+/ucDBub/Aubm8t6emsLulqKCkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbGtrLWeoJ2VlKmhopSssbGeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcW11YTkxRR1JhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK7wsDBvbu3ubWlprG1naGJmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCcpKqdp6GerK2pqK6toqGilJejm5yPq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Hu8HHw72+trm0pKqvrpyZh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmJugnq6Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcoKGgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOjoqytqqirr7O4sr21s6uvmIRzc2hbWVlSVVJGWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTU3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xLzCxMO9wLK4rqWqrqqdl4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1dXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJKSk5Wnq6WamZqdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q66nsLSwubXAsa2xq5B9cXJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72yurvDvcGws62wra+qm6KIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKeclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVlJiYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy0w7m6ramrs66unpanfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCPmpyioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCKmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyY1ZNUk9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMG4r7Swysa5usLPx7+1r73Dr7HHsq2nq5Wkrr+3sK+fpqysqpWUonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpGPg4Z9k3hyb4WNfomAkI2Pl5mYk4qPiZyInpeHiJaemqGgl6evqa2pqJ+XrbSipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBurG1sMnDubS/z8C6sbG4xKuuya6no52GmqK5rKanlaWko6CWjpZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ4iH9gSlFueIqShHyEjImEf39ufn+Ud3V2eISNmXBRjYiKh3x+eJR2aHeFiH6KiJWKjZCSlouEioiUhJqMgYSSm5aenJSko6ippaOem7CroaSkkKaqlqGqnKKmqIh0bGVeW0hRUVJNSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5t6mqt7ittsCqopuSg4+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho+AdX94c251cHSNjoF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ2WkpiGk6OWnIuCl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZudnqKdlo2KpJuPnZeOlpiPdm1sZWJaWFhUUUpTVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6ipsa+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkZWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2VgEqSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfm1obW5uV1VXVFFRWk9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voqyqqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qTl492kX6Fi5GPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmpF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nZFdRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6yn6a6rquysMOyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3Z5d294c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3lwb25qXlpcXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7Bs7vBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cnx0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+dioKQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bnFyZWZeW1pdU1tmXldRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKugsamvwLK7xrqWj5GUiHqGdmuAjJKDfouFkI55hIJ1ooaNf3+CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUktphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIh62wr4qAgJOKgouChJGph4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd35+cnFwaltcXFtjYlhnZVxVUFFYWlFETExHT0lERkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpehnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WIiYGDiIZ5iYuAdYZ5X2NXTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxfao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQfHKEnp+RnX52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZWPhomIiImIoqujlomOmIB7gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFNRSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+Lm5qknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKcjoSBgoyLgoqOhICLgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbnWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKowcOuyK94upSafIyhnpiEk4WCj6Gfk5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramt9fn5/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgIGLjYmGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4J9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8nRz76boHBpq6mfhJOShZyhmpqap5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkpqoiJeQjoGIbHNzfH16bmZeW19eYWdkYGdnXFJFS0tRT0lKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGkJCPgoOAiYyJhZOFg4aJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jEv7elo7CyrK2qo4uWmIWmpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN8ZV5mWmNgXWJjXmZnX1tPREpIVE9GSUxGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGBc1hfYlVkYGBiX19mYFtVSkRFTFZRSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRYmRXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XUF9VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6SupLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AemhVYF9WaGNpZFZbY1lWVElIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eCjpaKgYSBint8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby9wby4try8t761urPGYXWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+wLy8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG9dX19dVV9daGVTWWFWUlZJRUZOS0E+SEU9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Wi3+DgIN5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVVLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7t7q2ubm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDpJ2spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr7BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW15aWFteWGJiUVtgU1FLQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXlpZVEhLT1BKS1FMVFFITEFKR0tQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OJkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbXFdeVlhkWU9cV05RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4b2RbYWBLUFJVTllfUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaisr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXN7vsuaf42yhHZyhXdpYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoaSkZ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8yJcG1gXl1WUldSWk9KR0pJSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXZ5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWzoKKln6GpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4OqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRsYltXUVNQWFVFRkpJRUU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5GejH6HkoOJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgnFuYz1eaHJwcXBueHeCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk4+uq5SVl5+Ypq61vKmtvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V4ZmVYV05RUlxHQkVJST5BPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4F3hqKQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCWn5OSl6OemquWkZGLjpODjIWJiYGGkJGenJmJhYuBhpd7iImfl5CJjoqLgnyhiZCLvKGYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hXt+gpGKhYZ6hYh8dn51bX19h350f5KekZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZKOjpGMf5CPjouEiZOWmp+fiYyUkp2Rg4x/ppmIhY6DhoSApYaKi7iYnZGVlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZeSjJOUhoCLiZOOioqdl5mjooaTnZagi4qJjp2Qg4iPgIOHhaWFi5CzmJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29td4t4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eWmISAj4uZiI6QqpeXpKKImZ6WmomPh5iYioWPjYF/h4+liI2TqJqXlJaYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fIWHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlZmGhJGQnHWRmLOWl6Whh52ak4+LkIqXm4mLlo6GfYyYnomQkJybmpOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7raiyvbClrbOzqKOhsKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq3uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNlpiTnZm0l5arnYqclJKOkZKMmZuKkp6Qi4mWn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbStq7O2jKizra29q5u7paiturirp6aioqSjqa+ysaudnKSZm5iXn6KmppKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcXBfWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrsLy9qq6ro6Oep6uutLCqnKCqnKGclp+wtaiMo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+djKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOgoJikn5qgm6CUmJ6lpKampK+upsDEw66ot7bJw762z7LEv8S8s9HKyMK0cnZqWlVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaompqZur3HyMnB0snKws29wrOtvL6ou8C9u8O3rMGprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2uLCslLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qn5GlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpaOipZ6dppielZebpKOpp6KyrKi8wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p3X1ZVWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPNzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psrebnq2jqKGeq7e4qqWwv8Wyvrq0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlqurqaebn6aXmJaYlaGkqKWftququrvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1hVU1NNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qin6++r6HHvMTEx8bOzs7Syr67trG6u7y+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+vmKOvpaekpbXAsaystL/DusC6tKi6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boaCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSurqulmqCllJOYmI2coKeimrSpqrO7u7uqsbLHwLmmrKutsrKjobKytKRta2NaV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKosJmRl4eLqJaOiJOFoIiEnZePnaGbo6W1ybWpxrrCw8jKycjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubSzxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqq2jo5+kqJGRmZyHlJ2inpaxp6mruba9srKuvrm2oKOnqKWmnJutqamLYGNfXk9KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlZ+Mk6uckZKTiauNhqGejKOtlKOktsa+tMC6wsLHycXCzsjCvrmyr7m1wcLKtcWywby1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbyorb21uL7HvLe2uMGyvsG0qrW3q76lkKOYkqKgvZ+JmqCZl56ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5eJjKSilJ2inaC1r6Wkk6+rmaqqnZ2jo6iQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXlxJR0VGTVFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJabm4+qlpWnppWtrJiiq7bEwry+t8HCwMfEv83Gu725srC5s7/DyLW/sLy2ubampKusraGhmqqrxaKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjn5C9pKmeqKydnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylnJWxp5mupp2ZqZ2fjZiUnoOOoJqbkqWkmpirsbWxqqWqrqybmKCgko+QlaielGVfV2BcTkhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCTo5+WpKCmqayYtrGiqrO2xcS9v7W/wrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6quoKWpra+ipqi9taaxvbm3tsSztLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqioq6Oawqypnqyum5uemaagvaGdpJirrKymopqNmp+TnomOV3+Wn6WhoLiqppOYtaOesaCfmq6WnY2Yk5yBjp+XlY6ipJaQpq2yqqmioqWllZWdmIuPkZKknolfYlhiX0tISkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6foZmexKilorSinbOok6uloKOfrKmsnbuwqKy2scfFwcKywsO9xsS9xMm8r7C2rbC0r7/EtLmxsLm0rJmosamqmp2loafCrZussZyqo66xqaSovbant7u+r7fErbSzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6QkI2VnpqinqezpqaMmLOboq2anZuskJ2TlZKZf5Ghlo+Nn6GUi6arr6SmopygnpGRmpOFi5GNm51/X2RaZmRKSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoqS1qpazraehpLKsrqm7sq2xtbTGwMTDtcDEvsnEtb/IwrSrtaiwuay/xLO3rqy2uaWYqrKrqpifppetu7SbqLCbraCutLKnq7mzqLq0ubO5wKq3ssS+tceov6+utrWpp6yhmJeSpqWiopiYpa+4rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblpion6CYoZ6usqKmjZeumKSrlpmeo5CajJKWmIWVnpSMj5ydlIuoqaqhp6GYnpWLjpmPgYWUiJOed2JnXGppTU9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7pKOdoqa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6mssbqilK2xrbKWpKeRqrmqn6axnaugsLSzqqm2tq29rbSzubitubHDu7+/psSrsbevqaurp5+YmauhoqGRmKKxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ugoJuepZyil52js7Can5CTpZqfqJmUop2Ul4iTlpKVlpyTiJCamZSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjYxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKqsKyksriqpra1rKCttb2vs7i7ur63tsDCv8jEucXCwL+4xL3Bt6+1p6u3sry+vrSorrG2nparrqiul6aojqe7n6Wss5+sorGws6yqtrS1vq6wsbWssLSzwbvGt6y9sLG4rK2qo7KmnqWqn6SXkZqgs6qzq6qzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKudlpeElJaKnZick4qNlpeal6alo5+dlpWXkn+PlIV7jZKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BLTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelraqmr663qq+1u6emsbfFt7G2vcHCtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZiYp6yqrJurq4+rvp6srrKjq6CxrbOurrayubiqrq+xqLWvtby9yrOqt7WxtK+up6G0oJuoraCmlpaamrKiraCmr5ehpJqak46jpaizqaGms6yrtqWvsrWvpJmdrKeamJ+amau3o5eTkY6XnKGXlpSqnZqRf5KXjJ2cmZaQipSTnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqq2mpK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb+/t7+8sb2tp7q5t7bCtqussbeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaijtqCgp7GhpJScmZWxnqecoKqOqaOem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCck4KQlI+cm5eWlYiWkJiap5ykoJKWkZCVdoSPh3uEgYOLimxvdnR7flxLZW1cSk5kXD9ie0dJOEdnV2VcTF5jTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5Gapa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OxnKCnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnZybr5qjo6Ojka2fpKCgoqump7mkrLW2pausqa2wtq6inqOpqpugm5uSpLSZjomNh5ChoJSMlJyfkpCDjZKSnJqXlZOHl5OVmaebn56MkpGNkHZ9jYV8e3yGiYhwcnF9fH1cU2RuXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpamls7WytbaysqGrrr3Muq3AusextK20wsPSxca+wLK+wMK7vre7xKest6yyt7zAr6uxrKCjp62qqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypqLKmqqSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeUhpaUk5eknJycipKQjYl/foeFfHZ+hYSFcnFwiHVrX1lgbmJRc3FcSzuEfEY/V3RYYVpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKtraukp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6quoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6jpqObqquuqZ2ipaSkmJ+blo+YnJKBgo+IhZyfi4qOi5iNjomCi5eim5GQmouTkpGTo5mbmoqOi4t9hoGBg3pzf4KAfHJ1i6SHeGteYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtOaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsaajrLGYq6qttqy2sqymrKqpvMDAt7iyu7Wmsq/EycvRv8C7ub++wbnBucDErbG1sbO6wL6ysK6sqquotqqmrq+qubCosrKvs623qre3p7S3q6ylqaqcpJ60s6mopLS1oLeuoKqoqqirp6CrrKm5tamqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6imqqOjmKWnp6qcoqSjoJmYoJGOj5iNfoeMh4OdnYaDioqOjY6LgoWUopqNjJmQkpGPk5+XmZaMioN/dIaBf394dIJ+eXZ+gIedj29yZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJi8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrrmuobawyMfI0cC+vbu7wb26wsC+v66ysrG1vLvCsbGzq7OppLWopa2zs7mxo664srCyu6u6sKqutquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OomJqopZiXmJ6PioeViH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXNzeWd/hqR2aV9la4B0Z4iMfVNYb15KeHNTZFRRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnrKSnpK2ntbOyq6Wxp6q4vsC8r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essra5s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6meo6moqb2stLCunaqkoa6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WTooyUkYuRm5KVh4l+f3J7en58aHh8eXRvcHtnhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Svn5+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjYh7fYuGj42LiYSSmJCGlKOJkpKHkJqQk4GJfXlrfnZ5eGN8enBvb3F2Z4BzaoRoZWdfbHONbGFpb2BvPVp5a1VeT1BRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPmVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaOfqKS4sK+kr7Cpq7jBubOtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srO/tLq9t6i5uL2qo7Soqaqxrrqxqpy8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qPiZWeiJGVgoyXjZF9hXxzcH1xdHRgenhobW9wbmh9cWN7bWllYl1lhX5fWnNqcUpJf2lYWk5QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaSiuKqxpbS0qai5xLWzrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbCzvrC8w7mou7q3p6e1qKirsa2zsaicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GUpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqOlomNhniBh4OHi42FjZOYjY+WmYqPl36GmIyPeoF6cHJ3b290X3l3ZGtra2hngm1lcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZ1tIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiprqG7uKWsvcSzsK6ita+tra+0xMS9s766t7Czubi6uLqurb+ztLivv8G3q726tKWis6uoqrOsrrKjncO3pqm3t6ufs7uqp6aor6uZoqecpKeUmKGzppqepampnKGglKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycmqKWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSOjpR7gpePi3d/fGx1cm1sc2J5dGhmaWdlbYRnZ2hkZmhpXmViaWZZZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6WnnJ6enqS1raequrenrMPAt6+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLS6nqipq7GlmJ2qnqilkpqmrqOZnqSqoZuhnJignae2pq+qrqGhnp2hlaCmn6KgmZyanJOanpWmn66jmJeflpWOlZiMj5iaqKCQh4qKiHiFd4KCgpyHioKIe3+EiIaEkISWlY+PkJGQkYyTe4OVjoZzf31neXBra2xndXNrYWdkYnN/YWRlZmVpaWJmb1peWF1sY2FNZ1dbYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoJqZoJeltLKjsr63obHGu7qwsKO2rKuuqbm+vbutwLKvr662rrO5s6erubGvrrO2u7avub6spp61q6ChsaWrsKCmxaGzprCzsLettZ6srqyuopmdp6qmn5Wcp6agmaWjqZyan5yVnZ6tsKa5p66ioZqanpmfo5qlnZefmJyVmqGTqZetqJuUnp2UjZWajpWUmKenjY2KiY57gXSCgouYhYZ8iYiEhIqMiJKFk5ySkZCQkZePkH+BjY2DcIJ/Z3luaGtqZ3Fya1toY2Fyf2BkZ2tua2ZqZmRsXG1tdnFhU2JoY2VaSUdMTU9ZUVBWYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2blKGbqbOwn7nAtqG0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2lsrWxr6mxtraxs7a7p6mgtqmdn6qjqq6dq8SZr6awsbe1rKyesa2vqqKbnaSsqZyVnKeknpmqo6WVmqCdkpyjq6qpup6npKCXmpqeoY9ro5aZnXGDl5ylgXaSrKielZeikoqYmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQgGeIgGh2aWZYXWl0bk5QamNmcYJmXmRmb2tpXVxeiZCFiGhPS0M4RVRnXUpIUFBVVkxIU2FwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxTmE8Ky+OpJqIlbGbnZOgnKuuq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKicl6Gmppycp6idk56gmZGfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1iI1pl4lmfnN5oG+Hh4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVReNy8ojaeYhJ2snZmZnZ+rqqiqv8Ovsrq8uMG/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaikmpmno6WZnKWqlpOjnJWUpKamobako6CkmJWUmJSciK6QmJWKqoyYo52GsYGlrp6Vm6CXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5YYU9WTkZVXFhRUFKLXFdbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaWzQxIY+nlIGnqp+XnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5r5yysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6ShtbqiqqigrK2kop2bmqOqoJibqaGfmJ6oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elpuol3GuoaR+d7p8bKGPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraH+ReHpqqDhKr1tYVG1jWkxPWF9cV1Y7TohQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraeln6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6Oquames7Kwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoaqboaysn56al6Cjqp2ZnqWhnZqhqKSQnaObmKGgrJ+lpqCaoKGWlZGXkZqGtZu1eYaqmraZd4ezm7d/lJeYrJd/a4GmeoGFh5GUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbmNxfIaAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YtMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kota2jrLalpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6Cwo5uapKi1r6Goj6mnqpudlpigpqman52joJygo6WklpuemJqeo6ubpZqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2yXh19StbTIhX+JfGOkM0KddVxQamhkUEBYZllkYUpITWtKW1NPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLquo7CyobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpmirJ6bl6musamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoJiQkpWQnYiybmi1cauIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1g5HS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe6rqSysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKqhmJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaKelZmWkpuFrHx4qHajj4uHqXCui4SohJqao4uTmouifZKXh66Ef4KzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2Un7exmbPBrKiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWntqyosbGrrbSkm6mgoKiitaemqqSZnpWlopSUnJmSlaSnm5SQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpWfnJ+gmJiclpehoJSYkaadh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFeq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTZKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6KdmZi+rZizwq6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+UqrGpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ6alJihoZCOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4umdLR6dbSClKaklJ2NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1pRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpucuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurp7ajs6iuqqGXnaigpau4naOtnJaZkKWjlo6doJuYnqCRk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaKXoJuWm5ehk5ypnZSQqpmH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qfobujmLHDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOemJ+akZaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5ufqaSynqOljqeilaKanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsG7vJl6gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeW15YouscHWFf1hbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/p5azwrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyZoKinp6OpoZKsnpeinpeWmJ2ekLCplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpdmolhZIeOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwqSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OamqKnrKKfqqKarpuVpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVjoqMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5F9gHWJi4Jygnh5dnWKgHuJanOCdIN1ZHd9dmtwemxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkZmoqLLDr5mrnKqej5aWqZ6rnJ6hrZihm5yhpa+moaSonqyZl6admZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohoCXloqEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kIGAiWt1gXmIcml0f3l1g4eBanRjd2VfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua+/rautsbKgqqayraKss7DGsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhZ2qrKO0x7OfqaSqlpaYmqeeqZygpauUn5+cn6quqKWjq6Gsm5+foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYJebIuKgndcZ3N3d5GAh4JveIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2ln7q9uq+ss7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnulrKKotMO3paKnr5+dlZ6jnqOdpKqokp+gnZ+qr6mqo6qep5umnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN7ppiYc6qCfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1rpbJvjYFvynp/m3eRg46Ad3mBgHlxe4CGcHiFi5N5bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84lqK5w7Swr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ2crK6oq6ajoqWfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfaeVm3Srg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKuWaPNbpB2e9t7f5lxfoiSdX9le4h2dmx+h259hZCRfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6cm62upqmom6amo6CqkqyzlqWiqqqepKenorKik5unm6GblZSRl6BxhoyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiIqQj4Nsj45kbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5afpqugoqagqKijn56wrZiblqinr6yop6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnZ2psaepqJuqqKOhqpuvsaKoq66mmqerq6uzpJOYpKablZKFpGqkdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIyLl46BbJiQbmx4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwrqCpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKW0nZqhlJuep6upoq2aq6ihoamis62iqrOyopyrqbCwuKWUl6SomZ2SfKpsnoSIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5yRe2+VkH1ueXR8em1bZWpycWaAal5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKqjn66snaahrZqfqaWdp7Wgo5iUqKu2sqybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXoZWXm6WlqZmunKumpJ6ro7asobG5sJ6csKi0tLWmlpmppJuhj4KdTniagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jpGilnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GyrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJ2ll56YmJilo6eYraGsoqSXr6W7rKK3tq6enrazurO1qZqfsaKln4eP0bXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2Vip99l5mHh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod4+TpJd9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKjmZWjqaetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2mnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOWmpqcmJqXpaOll6mnrKCjm6ymvayVvrCtn6OxtLuttqmdq7SlqZl7qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBuZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySm4SpxsO2wbSfmq2grrmmo46ao6Ogr66pn6Oena2Znrmgo6ugr6qarqGRqqmllomaj62wrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZmpOZmaWjopinqqqho56pqL2kl8Otq6OirLO7rbCpo7WxqqyZdq9+kIqchYd9uq2JmGSwjGWWrX2hj4Onl5yCrYuFsIanmqSiopGFoFxsa4KzYH+te3uCgLFsZm6Zl4uIsVp9tFykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl46nmYiVjpOUeXeMm31jc3xig3h0gHxhamZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Im46vrKmno6iZrpOaj6maoZ6lnpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpuSmZeonp+Xp6ylpKSipKm6n6DGp6apoay1t66wqaG+sK6ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2teXiivrt0gJWNpZqNmY6Umnd/j5l5Ynx6ZIxneYF7YGtla2phUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqems6adjJelv6m2r6ehv6amspuesZ25qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkZiYj5eTqJielqinnqimoaKrup6pxaOhsKSrtLWrsqyjvqqwsJx0dqqkt4VliZ9wZ6yQio9ubnelj5qggXaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvboOZcYB6aXBpZ4mWlZdxaGmFhmdwhmRdimNpb1pdZ354pmBico+ScGZkgI2SjqGWlZeOk5t6hY2TdGSGd2iManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrayspo6WraqQjIWVl62fpqqin6SjoJGLpZKnmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZGYlI2XlKaTnZanopmvpp2irLmgsMKopbSnrLGyq6+uqrymsLmXi6GppbWciZaimIapm5CUnZKqtJmbo6yitJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo6ckp6UlZOegIWTi3Boj3Zvind2fHlpbGVkb2NVYVhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam0paeRmKyji4iJj5ynlq2koZqonp6TlaOXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6rrLa8o7G+mZKmpKa1opKdpp6NqZ+Nkp+irbGaoaSyq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYuBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGRl5GfkJqTnYKGl4V4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBkT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKKxpKaxqZabuKWilJipnI6GiombopCvnqSWqKChkpeZm66LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednrejf4OvtaOwsHWkv6SyoHh6oq21vpd3rqWgioCpfmRcYnafjqSeg5Z+bZS0nKOor6ylZqChlHR6m5hwgZmqmWyAo6mKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKJhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnaI+NcXmhlpVkeJiFgHaXaIOJgm55f2pwZV92b2trZ1xlY2Fhb1JZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4udr5+oq6eUlrmfoI+cpJ6RfoiImp6NrJqklaeino6XkZ6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6no3ulsbqDjo+nn4SLhY+xqa+MiZaimnmAi6yGnJ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlZiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJp0e5mCnJqEmH6RiIGCmGmMjIRreHtxcGdkeG5pbGpcZGlpZXJbXEhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eppZmUrcW8r6CUpae0nY+DnKucpqKgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOp5iNnXyoj3J7d5yOppZolaR5tIygoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+Yl4COlJyJmJKLfIWTho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmNubGZsWGVGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6ipKmhlKOptaKvf6CmnKWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x3m5yOoJGInqOblpiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjquajJp+onaAmZRrgat1Tat4h42dkpyqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jHtkZ4tzmX15l2xdfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q66imZafoKWrq5+crbShp5Ggn5+mm5mOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqykh5yRipiomJmZkYelr6ailZmIiYBpboiHi46OiYuNkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OjqYCGrK+HpXqLfYSafaJwc5OHlXuejHlth5yMmpKdqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOSiIGAtqhkgca4fHCVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJvc3VxaW9Ya2tycmRbZ11hTEQ9RDVRQVpwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJigpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLkJCJjpOegZWbn5ygn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfXqgmXmjk3iAc5eIjJx9lZ+HnI6anaeIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnYJzqmeUml2bhXaFnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmVWYUJQRU83VkJSbjRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtkY2loZ2tplp2JqracqIljlZysu7Kwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJ2JlZCGi52RnJuIj6ihn5qMkYqAgGmBhnl/lox7iI2OiI6VmX6SoZ6gopOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPnp2YiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp+c6paXW97l4t4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9saHV7YmNfUF1WXFRWQFlFUWdFUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTXqGntLqzs6iaoouaqZubp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B+p2h3bX6Zc6BzcXydhZhvk4KtfKOEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqKPdWuPs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+DbGhmZG11d2ZfYVJaZVBRYUhXSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS36pr7K1sLKjnJiEl6agoKKMpKefl6mJmZeYk5mTkqCXjoeGe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYOOqZqTkoqFiXmEdoiAboGfhneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUi4KfYJ6XqW15loegm3Whh3egfpCWi4FvTGajknGbiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdmt4h2ZrZmJzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1LSEtOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2JsKiFZUCUobOsr6+1oqKPf5anoqGji6SmnJumgpqXlo2XkJCbko6Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG1vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6JjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlFSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZqhoYCVmJONmo+Ll5COinyGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiUoJZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian5uZ2xTVVlVYGBca0xcUlxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZ2lhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJapqp6op66jmYiBlqmZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhX6Xk3N1hnKRg25/i5KHhpSQfXuChZekjX+lpY2AjYmElHWCh5NvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1xfX16l5abhI14e319iJSVk4t3kZmhooV8f4lrjIVcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh3dJR1cHpvb4lvhYZfd2l4jmeCg4aPqpx/dH2XaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbWlnVlleVlxka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdpdWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giZmmmqiYg4Gbi36WlIeOiomMcoJ8jnx+j4R7l450coRwlYZ8fZKLhoaPhnl+gIaYo4x7p6CKhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOokXhxn5OEfJRwf6qHcH2VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiHF0a4N2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyDjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNj4Nud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Rtc3KDZlxtimtrYllYXVlYa3FbXmBZXl1lcn57c290Y2pqaXt8cnp3dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqKOhfYKWq4yflIeaoZCklX97mIR8kpmJiIaGinJ9gIt2hYuChJaKcm+AcpiHhH6Tg4OGioJ6gISKmp+PgqaghniOl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaroqinoZOciZmQfXqQkIapf3+SkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdg4mSimx9jnd3ZoOGkYt8iZ6Fh4uPiIiBhYSRd3x7dZukioiLoIyHln+AjYOBd3F1hoV/eYmIi5GnkYSHjoiDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXt/mKmNnYyFn5yKnZZ8eJSCe46ZiYaDhIdteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkYapnoNyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iY+Fp3x9j5CRhZipoJyTnI6NqY2SgJ6NiZSboISPmH+Ij4RweYZydWF/hJCHdoyYgYOPgoaEfoaElW56dnWUpIyOhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+Cg4mJiHSDhoaJem1qfH97bWhrbGdeeX5nfHx2dHZ1endcYHB9bXRgY1pbXVBmbVNlWl1hamh1en5wbGxjampngH9rcn9ranRud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t2aGmDZWpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ylkJuJhqSTipiZeXmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh32PgI+bm5CIppx/cIuLjJKGoKGKhYx8p5CHjpGWkpWSd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWPiKKBfo2NkHyXpKCgkpmQkKWMj4GckYmUmJx/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9oeHJ5jZqTkYCYf4mMc4OJfX1yenyMhXt7ko6El6aUjYaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Bam19Z25wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGlsYl9xVnRvbG5geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbfHWjn42Xf4yhioialnd7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSYen+OmJePl5qdpZ6alJWde5KIhXmHl46ff4KKjo1zl6KdoJKYjo+hjIyDl5iDk5aaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZvfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9f4p/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqBj5igmpKQknSAjpKUip2dnqeZmI6VmHWQkYtth5mQm3uIiZCJb5edmaKTlYqMnYuGgZOdf5OTloiainyLioJ6cnprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI50koqFeol/d3mBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbGB6dHlwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22LgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY6JiIySnZOPjI1uhJCOkYmemaKhmJeKl5Nwi5uGZ4iaj5R6ioWRi3CWmpOhkZKHiZiMgn+Sn32Sj5OMmY98i4aIdHN2a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcW16f5uVfoWJdJKMgnWKe3CCf4KIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXm9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7e3N5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadICplJGNhqCMlZOQgHN7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaMi42OjJ2KjpGEboqLj5GKnJahnJmWhpmJbIelhWiInoqSf4yEjIF4k5iRnZGQh4iUjX9+kJl8kY2QjpqSfYuBhHB2cGxub3F8h2pzg4+ZinF4gHWCiYN6Z3NvdoKbkH2JhXqVk3t4inVxi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9ccXJxb293WV5vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Zrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eMgHt3in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7dHVzf4J+pZabrZ+nloWMg36XlYOOnXSKn5OShYqajJWOjHpyd3SCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKRgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXOLhYiPiJyZn5uXlYGVgGqIn4loiKGIk4WShIpxg5GXj5qNj4uKjo13e5ORe46LjZKXjXyJfYFsd2pvbGxte39ien6PloF3eoF4g419emh1bXWIl4yAiYZ8lZFye4ZxeI57i457iX6EjpGfn4Z9fXiBinx2b2dqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZ3R1aHFsYXdlXVVlYGBxUlBOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10f3RfdHx4hnhzc4V8eaGQmrGdpo6Cin+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJl4OGY4yRmI2UiZaLjImLcHqViXyOiYuUkop6hn1/bXxlc3BrbXt6XIF5kI6Be35/gIaPe3ppdWt0jJCKg4eGfpeNbX+AcIKOgI6JfoR7g5GWm5uMfXd4go94cmxlbn2Baml0b2doc2xTXW9kcFpfbHJ3ZmtrY2d4c29wY193YGFVa19edU9OS2BmYlx4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkYqIfX6ZdmVzbnxlh39ub2uAWmtueXlyYHZ6e412cnaKdnqfjJyvm6CQgoV4iJR+e4ich4SekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkeHB8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi52Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkpCGdoZ+fmx9ZHh1am96dFiIepGHhnp/f4CGjX96ZnRrgYuPi4SEgY2Yhm2Dd2+Jk4OShX+Ce4GRl5SbkXV0eIeMdHJwZXN3gGBzbW9haHRmUmBwZ2tVX250eWFzY2BpfXFybltjcmFjVm5aXHdNTUxjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyikoR8cIyUd3iJnIOEn42OfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6fhIlhg5WPhYiFiIyGgIdofZR/fYKFio6PgnKHf4Byd2h2cml0eG1ajH2SgoZ9gIOBhIuDdmJ1bYqCkYyDgICTkn5vg216iJGIlIV9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl0X1FkcWhmU19wdnRgcGBdaIJxcmpXZ2ljaVdtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp9iZmIiXuff4OZf4J5cXRub2RyfmhmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHi5mGgZKRhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoH+IYX+Th4OHg4iMf3+CZn2RgH5/g4yPkX9tg32DdWxtd3V0d3ZsY42Bjn+Ff3yEgIWJgHFgdHKGfZCOg32Akop6coVne4WMiI2FfIV/gZWQkpSFb3B5i390bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqDbnNiXGdfZW1fb1Rab05ITmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFtaHpzlHNnc4d8cpKShJqfm5+Gh3V1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1elpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+HjI99aYF+hHZncHl4c3d0bGuOhYqBioB5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmEfYKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fIB0dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYx2aXeXjn6BioKUl4l5j5VvenRxbGlkYHN6aF9lcXpaYXJ8eWdxeWBlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koeBhJiKfIZ/eHeJioSWgG+LiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZGVhYhwe5KCfIGCiINugHdogIR4cn+Ag4qIfGV+f4R2ZHFzgGl5cW91mY2Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX1yb1dnXWZqcWBvTldoUj9YZl5ab2tnenFbWlhrZVpjcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fW9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYx+bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hnyIn5KNkZOUjouHf3uShnd+g4yCa39yaIB+eG18fIKLg3hieoWCcmRyaX5udXF1gpuLgH+FgHN2foFzgnBcbn91eYuEi3uIgX6JeXtybYmEkYWMc4N6gJeMjIB1bmt2gIB1c1tnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW9kak1XZlE9XWVcXXVlYHVwWllVbmNZZHF5WmhdX2dtZ2lraXB3fY5taYKEfnlugHx9gX+CeXSBgY2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHp4hH18a4yNhJueloyBgGyNfWtofo2Len5+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdm9shYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CHjYp+b4B3goN/jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCiIFyYHeBfnJkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnOAfn+UiYp7b25qbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoamdtbGhwd3yTbGiEinx8cH5+e4GAgXp2f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/god/g359em2FjIiZo42Eg3t1i3hrbISHkHh+e4KRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknx3hpKCc5CLh3Jyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB4iH1ra3RofIBpdoGMkZR+en9/cXx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbmhWa15haWdlbm5ocHZ6k21piI14fXJ7fnmCgYF7dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZXmRugHep2qnHhoeycYh3b4x0e4WNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbX2AkJN/gHmRk355fG6Kd4KTjYV1l4uSj4eFhXt/hGx0dn5sZ3ZkbXt2bWl3d39/fGFieIZ6aXV1Y357Z3WGjo2Ve3SBd3GAe31ugFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnp9dIuBfnRodGVui4Nsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVmpfYG5lZmtwZ3B2eI50a46NdX52eH53gYSBe3N9g4iHg29ygHRxdX6FgomNint3f3iDe3yGh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fXpdZXqAeGp2eGaDd2d0h4yOlH1yiGpvfoF5b31dWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWtncGdxc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoNwcHt4d3Z5hoaHjIZ6fH90i359hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/d76ue6C2bmFzhWhze3F4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4RvgoOTiXSWio6IhYmFfXh0cW5oeV9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXRldYWNhpZ/cIxna3uEdW51Yl1xfWx1fYx7gmd2h35ucWl2f3l/gHN+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHBmcnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdn17bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWJXXFxof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXV9dH58b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Ma217gnFndGZhbnpnc3iLfH5jd4R3amxydntxe3p0f2d/f4B5d29kZmJuhXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+ZV1nc2lmYFZkV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJvaXRvcn50dJqCd3+Ad4B/hoR6fXWChH6XhW5ydHx6dXGEhY+BgHqLdXSQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3V8enWDgYt6boRzeYR9goN2b2ppZVZdW1paU2JtZFtYYXN7amhtaWBiV19baoBqa2+AZ2tgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnGAcXR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56d2F3hYV5kIZ0iHJveYByY3FpXXF4ZXJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt2emVebXFpZF1WYVVubldLU2hXZl5YTVVsVEpceV9bXmtdXVpjZWB5aGxgb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtzlYF7gp+Gfod9gH6GgoCKe3aEq59/eoeHg2tygXl1gH6BdG6GbnyAc4qAanBuZGRYX1pZWlRhamdbWl91gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBogoV4eGdpamFXVllnY4+nbn53gIuOe3Fyf2l6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3Jrcnx+dXZidIWLfImIgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2deXFRLcWJQRlVgR2J2ZmFLVG9YSk1YWGdrdXpkZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYnhaXV9sWl5cYWNefmlqX250eG1wbnaDl3pygYB8f4mMhn11dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZma4OCdH5iZGpcVFddYmOPpGh4dIOGkXlucXxpem58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZHODkn+IhIl7d29yfnNieGRccXFicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFhUTXZfUEpZV0hidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNR2l1WF5gbFtbX2JiXIRpZ2FueHltb2p2gZB5bYN/gIGTiISBdnSIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeWg3yZk3mAgHh6foB0iIN0cJmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3Bxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWhxgpWDh3+FdnNqcX1uZndYXWxuY3J0gXp0Z3B+W2BwcmJga3J+bW11f3NyeGtxYVxlbG16YGZSZVRXUVB1W1FPWFFIY3NhYEdWa1FJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXl4bHBpdXmHe2uDfX+EmnyDhHl8h26Ph3Jvdnp9dIKCfIuPg4KXdHiClIWBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2p0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXZrbYSTgYl8hnFzZ3B+cXNvVFxna2ZydYF3dGNtdlZicmxbX3BnfmZtd35zdHNrbmFaZGpqd15lU2NUVVBUbFZQVlJQR2RyX2FGWGlPSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5hZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+He3+GjHSBhnN9gnZupItygY2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmFjH+JfIltcmdxfW5zbmNbYWlpcHSCdHNeaW1TZXFlVWNvY3tkcnd8d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyPh5GbhYB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlJCPj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj42LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIWJioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSJhoaHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeOiISFiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiISKkI+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MioqOio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgYCAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9/f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERUVDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dCREZERENBVnSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktJSEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01NSUZKVmyBhoWEhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREFDRkhJSEhIS01MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS09VZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZFZnqDhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo6Ojo8ODk4OTk4Nzc6Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEQFF/g4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEdoODhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw7Pj4+Pzs/PUA/Qz9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJTEdHR0ZIR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo+Pz5APT8/QkJFP2iEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj4/PT4+QEFEQ0lTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTU5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdnZ4ent4eHp6fHx+fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PT5AQkRETW2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0dDSEpHTEpGS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDtAQTs9PDg/PT0+QEVFPkNFQ0dLdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFFVUxCSUpHSkx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEtQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVVWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdPSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnd1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lHQkFCQD9FRkVIRExvcHZ6eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0xHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0dDRDtBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGS0NGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDREZMTkhKTkhESERJTE5NSElMR0ZGSUlMTktKSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1d3ZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz46Ozs9Oz0/REI/QUNGR0tGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURFSUlIS0lGSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWdxcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHS0ZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYW5qbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoaGdrZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQkJHQ0NERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVVlaWVxaWlxfX15gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpJR0tLTUxKSk1LTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQkNEQUFFR0NHRkhGRUlGQ0dKR0dKRklMSElKTUpMS0dLSUhLS05RS1JRTFNNSk5NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpJSUtHSkpPS01LSUxISk1LWmZKZFxLbFJHTk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1VgeHZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkZGR0RESkRESkxLSUtMR0dOSUhKS0dLSklLSk5MTExMTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3FOS3J5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURCSEhHREVLSEdLTU1JTExGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUVFMSE1NSE5KSUhOR0pKSEhOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19kW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUUtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHREVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmRfWl1gY19ZX2JbYF5bVVlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRUlEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREBHSEE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYUFJSU1xUXF1eXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUExMS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYl1iYldfX1RRUFFSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhMQkRBQ0NGREJBQ0RATEhCTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXWGRWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUE9OT09PSEtGYEVEXkxEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFVUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUUtJWnhdVHhkaFhRU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cl9gYGJiW2FhaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFTTEhneGxjeHFtWkpMVHlwdW11Ym52UGRkSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnblh1dWp2dXCAYXNofWlseHxvX19fY2JcXmRlZmlqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dPVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW58bHF2dXheX19iXl1fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhfWnB6e19genNjcm94cWhkfGlye11US2xfdnVsanZ8e21+eWt8cF1eXmJbXmJkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NTWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VRUldbV1hXW09SVFdXWFFdWFZdVVNPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSlJRS1FNSkpPUVRSUFFTUklJTU9QUVJRUVFUVVFYV1xXU1JRUVVVVlRaUU5SUldVU1lWVFlVU1FVU1VVWVlYXlpfYV1cW1pdXWBjXF1iY2RmZGVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFJSUVZWU1haW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVVRUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2dmZWViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1FYVFFRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFdVWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNkaGdlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlRTWE1PUFJVWFVVVVNVWFdbXl1cW1ZST1VWVltbVlFTVlVWWFRTV1pTU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVVZWVFdaWF1eXFxeVlNOVFZWW1tVUVRUVldYUlNYW1NSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFZcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFVYWFhTVlhbU1JWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWF9ZWVJUVVpZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxXV1dWVlddWE9VXFleXV1UU1hTV1VTUlNXUVNWVFhYWF5eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tdX19aX1xWX19aXV5ZXlZTWVhZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl5eXt4bm9vcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHl7enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH18fXx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx4e318fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgIGBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKCg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgIGBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4OChIKBgoaFhIWEg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiYiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoOFhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SEhYWDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4OCg4WJiomHhYeFhIWFhISGhoOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFh4iIhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICCgoKAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgYB/f4GCfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX5+fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foCAgH9/gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhYOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoOCgoKBgICAgYGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bf39+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgIGAgYB/i5OPjIuNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEhIODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp8en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfn6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg4CCgoKCg4KDgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYODgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt8enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgYF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f399fXyAgICAgH9/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fX1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYeFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fwd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4KCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEf319fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYWFhIF/goR/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4GEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFhIWFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYaGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn2BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB+fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+gIiHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhYaGhYWDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaGhoWEgoOCg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYOCgoKCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGh4WGhoeHh4eFhIaFg4GBgYCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGiIWFhIOFhYeFh4aHhYaGh4aGhoSDhIWCgIGAgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYGAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx+fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaChIWEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8PClLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q+pKCLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GbuJuHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7CbkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6qq6+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuZlqKarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA0YWVpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ+gn5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYw6erpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh83NkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTo8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njc3ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc3Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5uLOysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHExLu7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZl5KTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaWn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmemqqmn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqyrru2vrq6qretq6q4urS8rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2v8m/0s3Lz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGVlIyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7apqKihqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzc/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm56jp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuyzrmrn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOyszMz83Ty8XIz8zIx8rExsDFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2bkZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzMzPydbWxcS4sraqpK6submwttWhlY6NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsbIzsTCx8DHzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q766t8GukY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8rDv8O7ycbIusfGxMrAvcHLxsXDvcW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qwkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe5tLu2wMK8t73GwMO8ta6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2r7u/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwrKynnqKqp56rrLOtqaups662sLKprqassry6tsO5urqxqrW5u7TCurC/sb29u7W7x7nCt62qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+4r6iuuLS0vLizvK+3ubWxu8Gxwa6lqKKssbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSstrixsLq5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKeusqe6s6a2oaKemqOiraKhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56onJuaqqavsKubo6O3qqCfrqi2qaamrLCjt7Ckt6Cim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCtrLWeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2toqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6Wmn6OjoZSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZSloZ6SkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlpWHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpyioaOYpJahm5WNh5iajHONgn2NlpaFkJmQk46Oe5mOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQn5edlZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHiJaemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QU1JSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPREpIVE9GSExGS0dGRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5dX15cVV9daGVTWGFWU1ZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLSkhGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW11ZV1tfWGJiUVthVFJMQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbW1ZeVlhkWU9cWE9RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtUXlFcWk9PU1BPST5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIcG1gXl1WUldSWk9KR0pKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNsYltXUVNQWFVFRkpJRkY9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJxcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZmVYV05RUlxHQkVJST5CPj04Oj5APD5IPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4J3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGkJGenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9QD49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dn51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZOWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZOOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJKOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyra29q5u7paitubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+cjKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLws29wrOtvL6our+9u8O3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qnpGlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTEx8bPz87Syr+7trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIiEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+amqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzsjCvrmyr7m1wcLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG0qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC1r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/DyLW/sLy3ubampKusraGhmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pKmeqKudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylm5WwppmvpZyZqJyejJiUnoOOoJqbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY6ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilorSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS9xMm8r7C2rbC0r7/EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6PkI2VnpuinqezpqaMl7Kboq2ZnJqsj52SlZKZf5Ghlo+Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwrSrtaiwuay/xLO3rq22uKWYqrKrqpifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6usqKmjJetmKSrlpidoo+ajJKWmIWVnpSMj5udk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js7Can5CTpJmfqJmToZ2TloiTlpKVlpyTiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksriqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+4xL3Bt6+1p6u3sry+v7SprrG2nparrqiul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKqclZaElJaKnZick4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZeYp6yprJurq46rvp6srrKjq6CxrbOurrayubiqrq6xqLWvtby9yrOqt7WxtK+upqG0oJuoraCmlpabmrKiraCmr5ehpJqak46jpaizqqGms62qtqWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t7+8sbytp7q5t7bCtqussbeUlqauq6ijsKmUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLKnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5kXD9ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLDp6m5sLa2v7yuq7Kxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2fo6Cgoqump7mlrLW3pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaabn56MkpGNkHZ9jYV8e3yGiIhwcnF9fH1cU2RvXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKast6yyt7zAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStrLiysqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaTk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRc3FcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMLDur+zx8Oqrretsri+vrKtraqkp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4uTkpGTopmbmYqOi4t9hoGBg3pzf4KAfHJ1i6SHeGtfYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbnBucDErLG1sbO6wL6ysa6sqquotqmmrq+qubCosrKvs623qre3p7S3q6ylqaqco56zs6mopLS1oLeuoKqoqqirp6CrrKm5taqqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqQkZGPkp+XmJaMioN/dIaBf394dIJ+eXZ9gIedj29yZ2Zwd1xhc4hrT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqymrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wsC+v66ysrK1vLvCsbGzqrOppLSopa2zs7mwo664srCyu6u6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXNyeGZ/hqR2aV9kaoB0Z4iMfVNYb15KeHNTZFNRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essre6s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6ido6moqb2stLCunaqkoK6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyVkYuRm5KVh4l+f3J7en58aHh8eXRvb3tmhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGspbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sr24ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Sunp+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBvb3F2Z39zaYRoZWdfbHONbGFpb2BvPVp5a1VeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srPAtLq9t6i5uL2qo7Soqaqxr7mxq5y8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppijqKCxuZ+jsa+hrKGspJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYl1lhX5fWnNqcUpJf2lYWk1QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWiuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbC0v7C8w7mou7q3p6e1qKirsa20saicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGtramdngmxlcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqurb+ztLmuv8G3q726tKWis6uoqrOsrrKkncO3pqm3t6ufsryqp6aor6uZo6ecpaaUmKGzppqepampnKGflKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGhmaWZjbYRmZ2hkZmhpXmViaWZaZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLW6nqipq7GlmJ2qnqelkpmlrqOZnqSqoZuhnJignae2pq+prqGhnZ2hlaCmn6KgmZyanJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBra2xndXNrYWdjYnN/YWNlZmVpaWJlb1leWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGu7mwsKO2rKuuqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spp61q6ChsqWrsJ+mxaGzprCzsLeutZ6trqyuopmdp6qlnpWbp6agmaWjqZyan5yVnZ6tsKa4p66ioZqanpieo5qlnZefmJyVmqGTqZetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iYiEhYqMiJKFk5ySkZCQkZePkH+BjY6Cb4J/Z3luaGtqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXFhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7nAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqmdn6qjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKeknpmqo6WVmqCdkpyjq6qouZ6npKCXmpqdoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hPS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKquq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKebmKGlppycp6idk56gmZGfqKqjs6+joqOclpiYl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX97h550iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqv8Ovsrq8t8G/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaijmZmno6WZnKWqlpOjnJWUpKamobako6CkmJWTmJOciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5rpyysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6Shtbqjqqihra2kop2bmqOpoJicqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Okq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6OquamdsrKwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoauboa2sn56al6CjqZ2ZnqWgnZqhqKSQnaObl6GgrJ+lpqCaoKGWlZGWkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6CwpJybpKi1r6Goj6mnqpudlpigpqmbn52joJygo6WklpufmJqeo6ubpZqcmqKgl5OSk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2uWh15StbTIhX6IfGOkM0Kddl1RamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLqupLCxobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpijrp+cl6iusamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoZiQkpWQnYiybmi1cqyIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4ZhlohdWcqdb8CAdE1LtVNVxmRWUmpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKuimJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaOflpmWk5uFrHx4qHejj4uHqXCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5eIal2vd5Wfj3dsNXnIrrNgRFVvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWotqyosbKrrbSkm6mgoKiitaemqqSZnpWlopSUnZqSlqSonJSQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpSfnJ+gmJiclpeioJSYkaeeh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFtNdF1iZk1aYV9ydF9KVTVKmpFYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+Tq7KpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yWnqGWl4+snI+ubnK0dKmMd4umdLR6dbSClKakk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOtnJaZkKWjlo6eoZyZnp+Rk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaGXoJuWm5ehlJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaSfmZ+akJaTr7mxq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKljqahlaGanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyboamnp6OpoZGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpem4lhY4eOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fIpqWGx5gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OanKOnraKfqqKarpuUpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOCdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkJioqLLDr5mrnKqej5aWqZ6rnJ6hrZihm52ipa+moaSonqyYlqWdmZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaSqlpaYmqeeqZygpauUn5+dn6quqKWjq6Grmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+aIWKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJveIJ4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGnr5+dlZ6jnqOdpKqokp+hnqCqr6mqo6qeppulnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKqBfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+Ad3mBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ6drK6oq6WjoaSfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h2dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6dnK2upqmom6Wlo6GqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhYyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnp6psaeoqJuqp6OiqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKWznZqhlJyep6qqoq2aq6egoamisqyhqrOyopyrqbCwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXopWYnKWlqZmunKympZ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaavrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJyll56YmJmlo6eYraGso6SXrqW7rKK3tq6enrazurO1qZqfsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOVmpqcmJqYpqOll6mnq6Ckm6ymvKyVvbCtn6OxtLuttqmdq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmpsfmJ9dG1/eV9nZXBvaGdoQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgoqugr6qarqGRqqmlloqbkK6xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinqqqhop6oqLykl8Otq6OirbS8rbCpo7Wxqq2ad69+kYuchYd9uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgLJsZm6Zl4uIsVp9tFukg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl42mmYiVjpKTeHeMm3xjc3xig3d0gHxhamZwbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iZrpOaj6maoZ2knpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp6yko6SipKm6nqDGp6apoay2t66wqaG+sK+vl4KqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2seXiivrt0gJWMpJqNmY6TmXd/j5l5Ynx5ZIxmeIF7YGtla2piUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAurK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqinnqimoKKqup6pxaOhsKSstLassqyjvquxsZx1dqqlt4VliZ9wZ6yQio9ubnelkJuggnaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCWlZeOk5p6hY2TdGSGd2eManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkraytpo6WraqQjIWVl62fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrK+uqrynsbqYjKKppraciZaimIapm5CUnZKqtJqcpK2itJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkp6UlZOdgIWSi3Boj3ZviXd2fHlpbGVkb2RVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp6TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56atKOcpqu3qK/Cr6S4p7Cwsq6rrLa8o7K/mpOnpKa1opKdpp6NqZ+Nkp+irbGboqSzq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpGfkJqTnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqJabuKajlJipnI6GiombopCvnqSWqKChkpeZnK6LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednbeif4OutaKwsHWkv6SzoXl7oq21vpd4r6ahioCqf2RcYnafjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McnmhlpVkeJeFgHaXaIKJgm55f2pwZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4ucr6Coq6eTlrmgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPkp+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MiZaimnmAi6yGnZ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZXFaXEdTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmUrcW8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjZCdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsV2RGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6ipKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi46Qno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xraFdmTV1YRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZafoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuOkaCLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtycmVbZlxhTEQ9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOegZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUJQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX6SoZ6goZOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V7YmNfUF1WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKOEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211d2ZfYVFaZVBRYUhWSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKefl6mJmZiYlJmTkqCXjYeFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkoWHmKCVeZGhopmfibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdHBtVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJumgpmXl46XkJCbko2Hg3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6So6ablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3Nqb1FWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaafin+WqZydo4uhoZqhoYCVmZSOmo+Ll5CNiXuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWTjIeXn42GkKilnImmeJabfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ21TVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmYiBlqmZnaKJmqScqJ2EjJqQhpyRhZKNjIx0hXqIg2+NhX2WknN0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Imp2Ii5KqoqCPgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmlnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roqCDg5aqkJ2fiJmmmqiYg4Gci36WlIeOiomMcoJ8jnx+j4R6lo50coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh52choqaqJ+gqoOJjZWbf36Kl62okJOokXhxn5OEfJRwf6qHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoNud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKKhfYKWq4yfk4aaoZCklX97mIV8kpmJiIaGinJ8gIt2hYuChJWJcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeZk4mcm4aHoaqfoaKji4iTm52jmZaroqinoZOciZmQfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x6dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHN7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXp+l6mNnYyFn5yKnZZ8eJSDe46ZiYaDhIZteIB/coCHfoiSg21rfnqXh4SDkH6AhoSHfIeDjZudkYapnoJyio+GkpKLnJF8jXupg42Rl5WOmpWGhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpipoJyTnI6NqY2SgJ6NipSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW96dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhY+BgomJiHSDhoaJeW1qfH97bWhrbGZeeX9ofHx2dHZ0endcYHB9bnRgY1pbXlFmbFNkWl1hamh1eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeHmMhXuJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpSRd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWQiaGBfo2Nj3yXpKCgkpmQkKWMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9qeXJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQfISFhoR0gIGFhXhkcHp+eHlwa2pmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnd6hYd+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZaRkHWRnaGhmJSXeX+OmJePl5qdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KdoJKYjo+hjIyDmJiElJebf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZ3dwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnZ3fHN9dmZrY2B+amt2c3N1fXB7Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnFleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqAj5igmpKQkXSAjpKUip2dnqeZmI6Vl3WQkYtth5qRm3yIiZCJb5edmaKTlYqMnYuGgZOdgJSTloeZiXyLioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWZ0an2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ8f3FzfoWBa2B5dHlwfG5hbmJke2Jub3ZzeHdyc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4ibkJV7ioWQinCWmpOhkZKIipiMgn+Sn36TkJOLmY98i4aIdHN1a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEd31ubX6DgWFmd3N0bnphXm9ganReb2p6eXlscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4uTgI2EjIF4k5iRnZGQiYmUjX9+kJl9ko6QjZqSfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9bcXJxb292WV5vYG9qXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx3eF9xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShYqajJWOjHpyeHSCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLj413e5ORe4+MjZKXjHyJfYFsd2pva2xte39ien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fXiBinx2b2dqf4B3XXZubWtwclVdbmFxYV9sbnlwaHBmZ3N1aHFsYXdlXVVlYGBxU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Fqg2CHfm9va3tgaW10gHRfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqViXyPiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5uMfXd4go94cmtlbn2Bamdzbmdoc2xTXW9kcFpfbHJ3ZmxrYmd4c3BwZF93YGFVa19edE9NS19mY1x4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh39ucGuAWmtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4J+ioeKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeMdHJwZXN3gGBybG9haHRmUmBwZ2tVX250eWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6ghIphg5WPhYiFiIyGgIdofZR/fYSFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlvcnqMhXRrb2lwdn9dcWduXGl0X1FkcWhmU19wdnRgcGBdaINxc2pXZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXuff4OZf4J5cXRub2RyfmhmbHZ2W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKRhoaXjHuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH6BhIyPkH5tg32DdWxtd3V0d3ZsY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFb3B5i350bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqEbnRiXGdfZW1fb1Rabk1HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYmlzeVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmot7ioZ8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5gICIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgW9zWmViXWpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYt1aXeXjn6BioKUl4l5j5VvenRxa2lkYHN6aGBlcHlaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koeBhJiJe4Z/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZKWhohxe5ODfYKCiIJtgHdogIR4coCBg4qIfGV+f4R2ZHFzgGl5cW91mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX5zcFhnXWZqcmBvTldnUj9YZl5ab2tnenFbWlhrZVljcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eG58fYKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cbn91eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bmt2gIB1dFtnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE9XWVcXXVlYHVwWllUbmNZZHB4WWhdX2dtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjYp+b4B3goN/j5uJhJaTmYqMhYl8j4hwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251e4aWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRucVZqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4iIa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoGMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbWdVa15haWdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnt/hGx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358Z3WHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnp9dIyCfnRodGVuioNsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVWpfYG5lZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNint3f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinOFjI6JdJmQkomGi4N8eX1wcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2d1iIyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ6fH90i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4Rvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXRldYaNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2f3l/gHR+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkXR9dH58b359k4d4mn2Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneGi3yVgW+Ma217gnFndGZhbnpnc3iLfH9id4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+Zl1nc2lmYFZkV2JwXExLaldjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njqd3gXp8kI55dnGAcXV4e5GBepd2h4OAhYh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kIV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhHx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt3fGZebXFpZF1WYVVublZKU2dXZl5YTVVsVEpbeF5bXmtdXVpjZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3aEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3JrcXx+dXZidYaMe4iIgYB5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZzZ4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGdrdXtlZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYXdaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31lcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOPpWh4dIOGkXlucXxqem99h312inSCeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk3+Ig4l8d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldpbHF8Y21sc2NiWlpbYXdcU0tjXVhpU1dHWWBNR2l0WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHJ2doJ4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIN0cJmhenp/iZR3Y3SGeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+e3ZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gHN6enpkZXVnXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3J/bW52f3NyeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpVa2trfGVub3FiW1pYWWxxV1JQZlZWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Jvdnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYeCdW+hlnN6houGemR2iW5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBndXh1fW17dXZwen92X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol8hnJzZ3B+cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH50dHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygI2LdndseYtgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyAc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjICKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxTUmBmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1EREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlJSUlYqFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46PjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yLjY6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4aHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4iGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS01UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkVKYniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP12Eg4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9Ed4KDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFgoSDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSkhIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZW1xZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXd1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESERJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRURDQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1qbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQz1APkFCRkNFQ0NHRENERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkZCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRUlMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Vfd3ZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RESkRESkxLSUtMR0dOSkhKS0dLSklLSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOS3F5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHREVLSEdLTU1KTExGSk5ISktKSUtKSklLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSE5KSUhOR0pKSEhOT01OTEpOTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eZGNiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSU5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJWVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYV1iYldfX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTkhMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXV2NWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSEtGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9wgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRSUFFTUklJTU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlVSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF5ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXllZVFhdXF9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5fWlhWW15cXGFhX11bYGFiZmJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5ent9fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgYGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIaGhYaGhYWFhYSFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYODg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOGhYOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaEhoSChoaCgIWEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fX18fH2Af4CAfoB+foGUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goGCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBg4OAf4KBhYODhIGBg4CCg4GBgICBgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYSFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaGhoWEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIaFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0s+hlsvRxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8WqoKufzpmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6uxn5WPobSVh52dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gep52fp5m0v8mWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7WkoIufw9KRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvFmcXJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A9PD09QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuXn6KVlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDs7OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03mbsLOdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8+PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haKCo5uinZyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyasqCpoKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BQ0JAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiM+wjZGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8OT0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1cC91tTTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD1CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo8Pjs6ODo7Pz8/QkJBPkE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY7PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5Ojw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT4/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw/Qj86ODc3Nj0/P0A9QEA/Pz09Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj08P0A/PDU2NzY8Pj8+PEBAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQT8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQ0BDQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo7PD47PT07Pjw6Ozg5Ojg5QUFCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCOzk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz07Pz06OTk6PDk7RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2O0RBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Njg1OEA+QDs8OTw7PD46Ojs5Ojs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg6ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3NzY2Njg3ODQ7Pzs+PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg2Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2NzU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc2Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODYzNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzg2Mzc2Nzo2NjY1OT4/Ojw/Oz85Ozo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTw/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3ODc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc4OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs9Pjo7Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRURLUE48OTg4NjU1Mzk1NjY3Njg3OT46PT46PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+Oz08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODU3NjY6PT88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBODw7Njo1NjUzNDY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6eoKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eWlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ycnJycnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpeXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXkpSUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZyam5ubm5uZmJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb64trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5uam5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrOvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/Ojw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4Ojo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBRQD87Ojg6ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTL0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxcm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhYmNjamJmY1pZWVxZUU5FPTs4Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwcq/scK/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njo6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G7u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozo2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs6Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm+urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1u7a5xLi0vLa6vcG8u762v8G/vL+6wMvCx8jAv7y8wMXCx8vIwcPAwMnLwsC7u7C0vL3AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+ytLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLaqr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFvru/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGsq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZGYkJaVmJafmJuZm6OZl5SVmp2gnaeopaCjo6Gjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/NzQ5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKeonqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSkqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlXFNaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmdmqqmn5mnoJ+fp6ilpJ6dqqKinpufqKClp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopicm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREFEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Wvs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijoqGknqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUM/QUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ+lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jBwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qretq6q4urS8rq24oqWinqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6on56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk9Pjw8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8Oj1BP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwL6+vrW9s62+v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9PD0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHR19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czP0MzSz7/HxsrDzMzLzs/Fxse2v8m/0szLz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0NDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazpLaqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jNw8jOzMnLv8i/yMnNzc/K0M3Oy87Ox8rP0MrOysLJxsnMyszR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzNDw9ODY4NTU7PkA8OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuxtqmjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vM0NHTys7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvN0NHGz87NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa25oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6tuLvBxcmhl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qsXd1sexkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vK/Yw3V9koyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq603BWjo6Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9vblYf5KGiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+5uLWwrKynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxqrW5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vbetd5OJj5B8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquprKqwo6afqq21trG9ua+4r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuvspKEiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKOFh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE9QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8tayrsaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09KRkxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLT0xNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkIqMZE1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYWFgmRLSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB+fn9iSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dHd5ZE9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94cmhVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvX0pQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1remxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIl7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWhmZp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqekh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W/v7+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ7hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrm0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCMiZKOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1vi397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnZSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaSzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq2+q5u7paetubirpqaioqSjqa+ysaqdnKWZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywa6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC+u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUlISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr+7trG6u7u+z7bEvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra+upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjCvrmyr7m0wMLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pamdqaudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05eUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqZqZmJOio7igoaOSr7CspaefkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalZaUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzo6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmam6mgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE9ZXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6srrKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaizqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWkJiap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2bsJqjo6Ojka2fpKCgoqump7mlrLa2pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rquxr66ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvs623qri4prS2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm5taqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKifrJmQsKGYoqGoqJ+onJmqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKho6MkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRXk1NUlpmTk1WWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWsrZypr6Ogpa2rqJyeq7OltKiaq6epo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eRjY+Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKSooa28qK6xrqGro6Svnp+tppefm6GknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp5bFVeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJf2lYWk1QTEpIUFJRSU9dX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saicv7imrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKkncO3pqq4t6yfsryqp6Wor6uZo6ecpaaUmKGzppmepampnKGflKWfpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZSTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFBzVFtbU0tJR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Cusra1ubi1rKq8s6+ysb3At668vLGkn7aspqa1qquvoaDFrKqosrWsrbW6nqiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJegnae2pa+qraGhnp2ilaCmn6KgmZybnJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlIQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGvLmwsKO2rKuvqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spZ61q6CisqWrsJ+mxaGzprCzsLeutZ6sr6yuopmdp6qlnpWbp6agmaWjqZyan5uVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuVmqGTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaGxqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7jAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqqeoKqjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKaknZqqo6WWmqCckpyjq6qpup6mpKCXmpqeoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXGl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2rq6Whn5yhqKebmKGlppycp6idk56gmZCfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98iJ50iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqvsOusrq8t8G/qqS4saqsprO1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqqClpZuipZ6xuJWmp6e3vqasp6mqrKeloZ+ZoaijmZmno6SYnKWqlpOjnJSTpKamobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbi/wqumtK6uqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqels6WioqCXnKKgsq+Wn6Shtbqjqqihra2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksLqwpaWvs6OquamdsrKwo6Whqq2wrK+mqKCjorGcpJ6ZlpmdnrCpmJyioLWzoauboa2tn52Zl6GjqZ2ZnqWgnJmhp6SQnaOal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Goj6mnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKglpOSlJOdhNWTmblxscJ/xod91pScu32cl6iSjp2NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLfBsLrAsre1vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpSZm6ehnKeVm5ufoJiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlp7a7vLK7v7i3tby8tKa1taOzsqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaKelZmWk5uFrHx4qHejj4uHqnCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhtq6goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpalopSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclpehoJSYkaeeh6l+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKimtLC4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5yVnaGVl4+snI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurp7epuK+1wbW9srG7uKzCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk5ypnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62qqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKirn5yfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4uGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlppyboamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fItqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysn6OanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKmtabAqbShn6WmnKWWlqGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWPm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpauUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaN4a2qLmaOfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCgrZehpJ6impqnrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqokp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKmwr62msravqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OgoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G0qKuplZGdnaKZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mop2zuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmeq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchYd8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm31jc3xig3d0gHxhamZvbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLassqyjv6uyspx1dqqlt4VliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYF6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCTcGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkplV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKppraciZejmIapm5CUnZKqtJqcpK2itJiko5+io56ipaKWrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd2fHlpbGVkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dl62ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am9kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoXl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6hpKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVvn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yMmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0Q9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6OaoqCZlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYOpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhsaZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhndOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkYWHmKCVeZKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKOtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3igfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboOLd21kZWN6gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeYk4mdnIaHoaqfoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo6Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHR7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkoapnoJyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChoaIeW1qfH97bWhrbGZeeX9ofHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXhkcHp+eHlwa2pmXn5zaXx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheX2dpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlp+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+amt3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSTloiain2LioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohqX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GlqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn36TkJSNmpB8i4aIdHN1a3Fvdn2MdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp7eXlscnBleV5ubHNtc1haXV9haVpPVldkYmdwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVidW+EgWFda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZOSmJuRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe4+MjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBwU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Jqg2CHfm9va3tgaW10f3RfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyOiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGFVa19edE9NSl9mYlx4cIl0XFtldWBhZGSOY2BmYlhpc3RubHF2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbn1lh39ucGuAWWtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlxb4RvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVXm5zeWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnKJbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt7bnRwgFdwenZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJaNgJqIhHxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxc2pYZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnRub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkXGZucYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEk29te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVi4GEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SDcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxbGpkYHN6aGBlcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4iem5aNlZKWhYhwe5OCfYKCiIJtgHdogIV5coCBg4qIfGV+f4R2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdrcmBvTldnUj9YZl5ab2tneXFbWlhrZVljcHleZ1xeZWxnZmtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZ4aDb2d5lYh9foSCmIqBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eW58fIKLhHdieoWCcmRyaX5udnJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV+dGhZYltoZm9kak1XZVA9XWVcXXVlYHVvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cWdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjYp+b4B3goN/j5uJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXGBd3WNg4d4iHaEiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgHRgXV1gZ2RpaWZOWWdNQGBjW2B1YF11bFhXU3RgWmRvcldqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f352j4aEd2pxaWyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSUNjYFtjb11dd2hVV1Z2XVtlbmhWa15hamdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7aHSFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnx/hWx0dX5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoKEhX98fnp9dIyCfnRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXKEb1xgY21lZF5vY1RccUZCZV5dZWddW3tiUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50a46Ndn92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSDeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWGx6hZuIgoFzl5R4f31vinOEjI6JdJmQkomGi4N7eX1xcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2h1iYyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN0hWldYGxqZmNab2FYYm9HQWdcYGVdXFZ7Xk5VZXBZW2poXVdnYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYeNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2gHl/gHR+bXt8gnt5cWZsYm6JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoNmXmBxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4SHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ3YneGi3yVgW+Mam17gnFndGZhbnpoc3iLfH9jd4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d+Zl1nc2lmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5GBepd2h4OAhoh2anJ1Z2duW2xkXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kYV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhXx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVVaZWx4fGZfbnFpZF1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR+enZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1xnX210ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZmRaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRodGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem99h312inSCeX15gGlkdmxgZl9eaV9ddGtZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHF2doF4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gXR7entkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3N/bW52f3NxeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpWa2trfWZub3FiW1pYWWxxV1JQZlZWaFNURVlbTkhydVhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXh1fW17dXZwe392X2ZyY1tdVmFjWGF1ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH5zdHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhrYlddVVt0ZFNSV2hRWGZUU0dZWU9NeHZbX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZGBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1ERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlZWUlYqFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46NjY6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yLjY6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIeHi4aJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhoaOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WGh4yJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6JhoaGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6Ni4qMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/f3+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn1+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8+P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlMTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERERDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkNDVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxHUmB8hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+PDo8Ozw7PDw6Ojw4Ojo7Ozk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pk93gYKDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA+Tn2Cg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQUBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9MfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmeDgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVdVdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTExIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPklNRlVvdXV2dHR2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QEBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTkhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGR0tOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZJR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhES0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHRENEREZHR0dJRkhKSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIRkhGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmljaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lGQkhKSUdISkZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RES0VFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkZDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBsa01PUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVdsTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSERGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5bY1leXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYldgX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTklMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSExGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09MUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUFRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWhiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlJKS3JvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1tbXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVlJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cW1pcXGBjXF1iY2RnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTktNT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FTVFVPTk5RVFZVUlNSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aYmNlaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1FUUVJZT1FTU1ZbVVZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhTVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYl1gVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZYW1laWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWldUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19bXldYXFxcXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eXt9fHx8fHx8fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6enp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH18en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn18fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fX18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp6e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgoGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgIGBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgoCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR0d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKBgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhYWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoKDg4OCg4OEgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFhIOEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDgoSEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iIiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiJiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhISFhIOCgoKCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGhIKCg4SCg4SFgoGCgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoWBhIWDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWGh4iHhoCBgYWDg4SFhIeIhYOBgICBf4GMhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358f4eDg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+gYODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoWDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYKAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn5+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIyLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgH+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgX+Af35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAf31+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4GCgoKBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhISDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeGhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhIB/gYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX59fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwgoOTzdKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4m7C3nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4nFnpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjTvpihnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pK2cobSZlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6mQm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmsK6fgJ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEnIK4r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ+Zp5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgwaKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdjFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXS1MfD1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXNjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TFycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVpqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJSQjI6PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJaVn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosamqqKenmpmdmqqmn5mnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBnV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/T08zKwsXGxsrHzr/I0MvGxMbEwLvDwL6+vrW9s62+v8LDxsTHw62+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMzdPNxMfJycDGy8bIyMW+wrOzx8TLysrOxcm/vb+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR0tTU0s/Rw9DT1tfV1tLLyc7Qy8bN0snS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnDy8vLzs/Fxse2v8m/0szLz8XJx7/DwsfOzNDQz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HH0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHHxc3M0NDRyMvMwMrLxdPOy87IxMnGxsjLytPT0NXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzc/K0M3Oy87Ox8rP0MrOysLIxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vLz9HTyc7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtamYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6submxssChl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHwsjIws/Avby/sMHKx7q9qrCyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q765ubOlko6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTCysnBwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8W/w8TFx8vFwMbGu8fLv8/Jx8PGwcO3w769trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLKzsLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVtbW1xYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xgnpya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIR5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaSrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGjpZujq6WipKqjq66krbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKefo6y0q62nsLSwuLXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFpZWVlcXF1haoB6f3aJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn5ziY16kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUtLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eho7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WMfYmAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ6WrbSipq2YrKuYp7Ohqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtPSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFh36JiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7GroaSkkKaqlqGpnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyip52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2cnKSd2d1hISEhHqViYiKjIuAf4OKjH+Tg3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgn5WdnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ7c4ytjYiAaGZiaW1xbW+DdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6Jh45zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIh4mIoaujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4SCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Ql6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mehJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrrO1opWmqomaipKKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CGeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/uLq4uq2tsaaxqq6+sL28wsOsmbuola6PmJiriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVlT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6Weo5Oip7CzqLGyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5SWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBKUFJVTlleUF1dTVFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQm5iZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnqLh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYaIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoJ3haGQi3l6d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl4+JjoqLgnyhiZCKu6GYk5eanKimpa2ep7W/v7+4xsnNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfYmFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApIaKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4J+dYOGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZKOioqdl5ijooaTnZWgi4qJjpyQg4iPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eXioWPjYF/h4+liI2TqJqXk5aYoZifmZOcmqKytKWjvMG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doCDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqijnJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJuampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmZuKkp6Qi4mWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaSzuKzCyMS1ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq69q5u7paetubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtARUc+QUBDOzo1PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywK6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjarDw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY2RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0tKQUI9Q0Q8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC9u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXhpqppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3Lu8PCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKGjqKWetqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTEs/QUhFRUhHRzk1Rk07Pjc9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr67trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2cn6eimbSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0hLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKyMjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjBvrmyr7m0wMLJtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW2q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFBJTUVHR0JTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJmpnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAssDCt7WztK+9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69oZmjn6Kpq6Gdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSU5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+drqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6mtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbi5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafBrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7t6yztq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqJqZmJOio7igoaOSsK+spaafkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tcaov6+ttrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalJaUpKC3oqWllq+xsqerpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9NTlQ9QkFOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptaueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psOrsLauqKurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KwsbSss6esn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptrS1vq6xsrWssLSzwbrFt6y9sLG3q6yqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE5aXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6rrbKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaezqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHV6YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7KhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJuUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1raqxsaypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2eo6CgoqumprmlrLa2pausqa2wtq6inqOpqpugm5uSo7OZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCrsK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqWjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOEcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rqqxrq6ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnp7KypKeloaGsl6qhlZugpp6loqukraKfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvsq23qri4prO2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhteVRkVlFjT01WVFVQT1hbYlVIT2lUVlNHT1hVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKmttquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGira2ova+srq2iqKifrJmQsKGYoqGoqJ+om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRX01NUlpmTk1WWWRYR1JoUVE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWmraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWrrZypr6Ogpa2rqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY6Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3tsVGFQUVlLTE5ydV1IWltnWUVVZVBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn7+9qrPBtLyhr7K1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svnp+tppefmqGknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fouFj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp4bFVdTlBSS0lNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoJiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppikqaCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjZF9hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJfmlYWU1QTEpIUFJRSU9dX25TRFhaUmhOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XrqGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saibv7emrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYJ6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnauepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKjncO3pqq4t6yfsruqp6Wor6uZo6ecpaaUmKGzppmepKmpnKGflKagpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenq8PAtq+sorWup6+vt8HAvbHAtrGusra1ubi1rKq8s6+ysL3At668vLCkn7aspqa1qquvoaHFrKmosrWsrLS5naiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJihnqe3pq+qraGhnp2ilaCmn6KgmZybnJSanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkIOWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1daYFZJR0hLTVJYPjlgbGlIQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoZqZoJeltLKjsr63obHFu7mwsKO2rKuuqbm+vbutwLKur662rrO5sqerubCvrrS2u7avub6spp21q6ChsqWrsJ+mxaGzprCysbettJ2sr6yuopmdp6qlnpWbp6agmaWjqJyanpuVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuWm6GTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaWtqZ3Fya1toY2Fxf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUZMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rLuvrKurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6qjqq6drMSZr6awsbe2rKuesK2vqqKbnaSsqZuVnKaknZqqo6SWmqCckpyjrKupup6mpKCXmpqeoY9ro5aZnXGDmJ2lgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZXXGl0bk5QamNlcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5ramnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsLW5ra2jqKyrq6Whn5yhqKebmKGlppycp6idk56fmZCfqKuktK+joqOclpiZl6OIoY+Sm4ihiJWfooClgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98h590iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpb26GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprO1rq+ztquppbGtpbazm6y1trWlpqmzsa2yqK6eqqGzqaCkpZuipZ6xuJWmp6e3vaaspqmprKeloZ+ZoaijmZmno6SYnKWqlpSinJSTpKanobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5uZWm8krxuaHltcY/YfVJrYrayfX5wlHWaoaqQVk5XYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqelsqWioqCXnKKgsq+Wn6ShtbqjqaigrK2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVGxjWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbqwpKWvs6OquamdsrKwo6Sgqq2wrK+mqJ+jorGcpJ6ZlpmdnrCpmJyioLWzoaqboa2tn52Zl6GjqZ2ZnqWgnJmhqKSPnKKal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYepmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNweoWAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7t8KwvMOtubbCq6ytr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Gojqmnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKgl5ORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlqLa7vLO7v7i3tby8tKa1taOzsqSgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaOelZmWk5uFrHx4qHejj4uHqnCui4WohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyure1ub65uLO3vrWmubWhtq2goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpaloZSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclZaioJSYkaadhql+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKintbG4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5uVnqGWl4+rnI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurqLequK+1wbW9srG7uKzCt6qsoZynpKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH05Sau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX2MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZGmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKiroJyfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aMe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLiotbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlpp2boamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVsgJmVlGVeYGNxmolocox7hpRman5wdHh+fWJbeHSBaFBcboR8fIpqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysoKOanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgXmkhWxpe5B9gHWJi4Jygnh5dnaKf3yJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnprC1qsmrrbKmtabAqbShn6WmnKWWlaGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SfmaGOmJWLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhYWakYeGipWPm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp+d3l6b2d5kYCBiGp1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraOss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ+VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpayUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoWTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNrbXqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIFud4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlqfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCnrq6wvbGqqKWusLCgrZehpJ6impqmrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqpkp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF7gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKqwr66msrWvqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OhoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNzpTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWrprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJLBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtm52no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qKuplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wqmp2Tfaptn4OIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mopyyuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmqppyhkIOeTneagoCeeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaCir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaSmoIiQ0rXDt3mHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+oGJzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmdq7Smq5p8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchod8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIaomqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm3xjc3xig3d0gHxhaWZvbWZlZk9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2OfIualqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqZ2apquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXknuHmZGmm5KPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLWssqyjv6uyspx1dqqlt4ZliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6qkm5mvpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkpkV0lqWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeNppeNkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKpprWciZejmIapm5CUnZKqtJqcpK2itJiko5+io56jpaKXrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd1fHlpa2Rkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCMe4GUjKGUipWRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dmK2ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiHmCk4ybk4mVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoHl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5lwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZF92b2trZ1tlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l0dpKNlpOJk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnelnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCm5mEmH6RiIGCmGmMjIRqeHtxcGZleG5pbGpbZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKucp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6hpKmhlKOptaKvf6CmnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMfmJtj4uTkIyPi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKprg6NucqVvn4GbZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15eY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfaNenJmzlW97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0M9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU43VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZ2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYKpiZqhpaqiqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QjpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhsaZSdgbGumoRUX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMd4SMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWpTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqFiXmDdoiAboGfhneAkYWHmKGVeJKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKKtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYZ2XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamatzgZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUWdJVUxYUlVcZ2tuVWdXTUpBSU1KR0pOQVFKUGRjam1ldXNzfnh7bnSJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZT+UorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCQoIV5gZSGiJWelH6TpKablpaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmGbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhOW0hXaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6WDfYWSjIeXno2HkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhYeVl56ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gZ5mHdaxmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xbUVtJXWxtdl9bcVlbX1pnc2Rtb3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpbn6TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351e4J0bWxmjHN3e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFRdUV5vd3lrandkaWpqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dhoubp5+gq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboKKd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXV1kcn16dG90YmpqaXt8cXp2dGRtdGhse391en17eXqAgH9vhomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoKGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoOIhox/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2BsZ3R7e3Jub2NqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5eioZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjJqckoapnYJyio+FkpGLnJF8jXqpg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjXh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZWboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChYaIeW1qfH97bWhrbGZeeX9nfHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3GCjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI6bm5CHppt/cIqKi5KGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqVmZ1/k5N/iI+DdXWCcXdhfYGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXdkcHp+eHlwa2pmXn5zaHx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheYGdpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WMlZ6afW+LgZCThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KJhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+aWp3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF4bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgHhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSUloiain2LioJ7cXprdm17f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5gbWJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohrX2lkamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXFih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5GkmpOBfYB8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5NwjJyGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdHN1a3FvdX2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp6eXlscnBleV5ubHNtc1haXV9haVpPVldkYmVwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2trX29odH9rcW5tcWdva2V7YW1/endwa3d3iX+jmaOooaabiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3qGbHJveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZuXoJKWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIemhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3B8hmlzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVhdG+EgWFca21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWN8YoV8b3BsdWpobmx3d19xfnl7c3Vzf4J+pZWbrZ+nloWMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKSmJuRmHeQeoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4poiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe5CMjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBxU1BOW2VjXHdviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4ZnJrg2CHfm9vantgaW10gHRec3x4hndzc4V8eKCQm7Gdpo6Cin+CmYl/ipx+ipiSjoSHl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF5kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGBVa19edE9NS19mYlt3cIl0XFtldWBhZGSOY2BmYlhpc3Rua3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh35ub2t/WWtueXpyYHZ6e412cnaKdnmfjJyvm6CQgoV4iJV+e4ichoSekI6FjJeEk46HgXV3b3lxb4NvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoeUi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am95dFiIe5KHhnp/f4CGjX96Z3RqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFybltjcmFiVm5aXHdMTEtjZmBddXKJbVtcZHleYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt6bnNwgFdwenZ5cWR2eYaMaHaAiXGAnYeZqJyikoR9cYyTeHiJnIOEn4yOfJaNgJqIhHxzdnBzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTe42Sh4KIkHqRi4aPgoB3eIOEcoeCkpuWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajH2Tg4Z9gIOBhIuDd2J1bYqCkYyDgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxcmpXZ2ljaFdtV1t0TEpLZWZeYXFzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qc3eKfXNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdG53en1YeYVxgG5neHaRgmR2hoVxipeGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHipmHgZKQhoaXjXyMjICAiY17kI19iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJiRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEkm9teoB2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI6WgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hoGdk4WUj4SDcoGKd4Z+jJufm4iVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCi4B5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFlqbW18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcW1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxa2pkYHN6aF9lcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCEk42Ef3CAhHiGe4iem5eNlZKWhYhwe5OCfYKCiIJtgHZogIV5coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXWdqcmBvTldnUj9YZl5ab2pneXFaWlhrZVljcHleZ1xeZWxnZmtpcXd/h25sf36AdXCCe3+Cf4J/doGEiZeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZ4aDb2d5lYh9foSCmIqBfI2NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCan9xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeLi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV/dWlZYltoZm9kak1XZVA9XWVcXXVlYHRvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx8gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNg5ueloyBgGyMfWtofo2Len1+g5SCfn2KiGt2cWdoYltiZ3JvYGFrc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKHdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjIp+b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoamdtbGhwd3ySa2iEin18b35+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2EjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9wcF9gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0hnSId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WCfYRxh4p4eXFxhYSOgH96f352j4aDd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIN0XGFcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XVtlbmhWa15hamdlbm5ocHZ6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXNhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F5bYmGdHpsdoKEhX98fnp9dIyCfXRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYHKEb11gY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50ao6NdX52eH13gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSCeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpR3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmhxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOlX1yiGpvfoF5b31dWXN/bnSBi3yCb2+KgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVdXFZ7XU5VZXBZW2poXVdnYF5yZWpocmdwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoWHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRnc2VgWGNxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXVldYaNhpeAcIxna3uEdW51Yl1xfWx1fYx7gmd1h35ucWl2gHl/gHR+bXt8gnt4cWZsYW2JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoRnXmFxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGVtZHFncnB1gHdwmYZ2f353f3yFh311c4KIgJWCbnN5e3pzcoSHiYiDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ3YneGi3yVgm+Mam17gnFndGZhbnpoc3iKe35idoR3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNkX3ZnbWJwaXRvcn50dJmCd36AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5KCepd2hoSAhoh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFyY3JpXXF4ZXJ0iHx5Y3SAcWdqeXVzbXl5dnllhXx/eXdxZGRjbXt8ampUZ2FlU0lrZk9HUWpFYHdmYU1Tcl1KTVVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZV95aGxhb292bnB3dXqYfnZ/gXmAgIeGenl6g36Bk4NxdHR+enZ0hIiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cWx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1tnXm10ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3t2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZ2RaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYmNdfmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoGMjnx+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJuhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11cc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9+iH12inSCeX15gGlkdmxgZl9eaV9ddGtZZVxvb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfHRncoBlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNnV1hTTXZeUElZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2FiXIRpaGFueHltb2p2gZB5bYJ+gIGTiISBdnSJdIyGdHF2doF4fX1+jJB/fpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZcXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubWtkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH19c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHpzZ3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVNWUU91WlFPWFFIY3NhYEdWalBJUFpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPgoKXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3JjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl1fW17dXZwe391X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2c2NtdlZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF5djm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jjn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbXxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYmKioqKioqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpOOiI6OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSJhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYWEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPztBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZEVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9DdoSDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUZDQkFDVW9wdXd4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtHQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHQ0JBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNOS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZFRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5JSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUUxKS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0hDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkdLSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUpISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tKTExJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxMS0xHQ0NBRTw/RUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JQTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFtLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERERkRDQ0JFRURGQkVGR0RESkVFSkxLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtpamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk5ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz5DR0RFR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTElISk5LSE9cV15PXFxgXk9YWVNcXGJeTVhaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExMQUNEQURJRUdHRktKS0dFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTElKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUhEQ0JDRkdFR0dJSkpJSERGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lKSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9ZX1tdVVhYT1xcUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZDQVVVRVxUXlNWX1hOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1RRUFFSWVNeXFtdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUhKS05MTEtNS0pKR0VKTlFRTk5QTU5NTklMQkRBQ0NGQ0JAQ0RATEhDTExQT05MRk1GRkhJR0ZMS01PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVtdXGFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSExGYEVEXkxEZmJDTFpIXlxzbU9NVm1YS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9YYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fW9+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTUtGYF1HQUVNTUhLS0hKUE9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFBSS0hneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSVJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTT1RQUlRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVBWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtaVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFNZW1dVT1JOU1hVU1FUUVFZT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1FWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWVpaYVhbVFZYW1laV1hZWldWXV5gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmF4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFhdW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2VnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3M2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5enp6enp4b29vcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z5fHp6enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp8eX19e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en57fX19fnx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX19e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIh4iHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4ODg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt6fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAgoGGgoSDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaFhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18h4aFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8ODo8Pjs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0M/XdLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztHU1NPPztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STztO4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7u4na+3l5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPgInJnaOostGSfX6vsdLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqfQ08KGmrXV082ensTQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pKycntHWo5i01NPAoKDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6W32KKZtdTVsKKp1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1Ojo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bptmimbXU1aShudTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKDZopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87PDk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ2o2qOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgv9iim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdXWsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvdXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PDo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PTs8Pjo8Ojo9PTk8PD08PT08Oz1ESERDQTw8PDw+PkA7ODw4MTU6QUZFV661tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzo6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjo+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ2PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1N0JGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCMf4eNjIuLh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNTZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjI0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtq6WppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ozs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVRhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8Oz5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7WzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpiUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S9wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc1NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzU7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVX1lMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw76+wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ozo6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojw9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa8vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3wL/EvMLFxcfHysnGz8LBuK62tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oz48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjs/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipaqsr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJiamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dvfG91cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NjpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqmamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg7PT47PDw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqSeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo9Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pzk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Gbnpqjp6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJuakY6RlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJWalpicpKGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlXFNaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpaCsoaGioJ+amJaVn5ubmKShoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWfnpmSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKenmpmemammoJmnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ6foqOen56bnZyUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1xRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenZ+lpqedoKCssa+npKSjoZ+mrKafl5yUkZmdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrru2vrq6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfnpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5OOjZCMgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM08/T08zKwsXGxsrHzr/I0MvGxcbEwLvCwL6+vrW9s62+v8LDxsTGw62+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1dXT08jMx83NydLMzdPNxMfJycDFy8fIyMW+wrOzx8TLysrOxcm/vb+8wcbEzMzIyb/Dv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0srS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnCy8vLzs/Fxse2v8q/0szLz8XJx7/DwsjOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWZoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHGxc7M0NDRyMvMwMrLxdPOy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnZ3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jOw8jOy8rMv8m/x8jNzc/K0M3Oy87Px8rP0MrOysHIxsnMysvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ09fa3NbPzcvD09DCwrKrra6sprOyuauzt6mjn5yWlJecnp+fnpWWmJWKbF9fXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvMz9HTys3R1dLV1crAycHFzMLIycLMwsXHysrOyszM0M3Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzM3PydbWxcS4sraqpK6tubmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O/wMfLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk7Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKm3q7+6ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NHMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ozw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3u7avkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7ta6ytrq+s8S3urWruLy9wL2wuravtrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Hhnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo5Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6vLvKt7S7vbW1q5GJkJB8eX6Khnp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbW9oZ2dpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6lqKKrsbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDx8W6vcS+ure9xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXV1cXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+lpaelrZ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sbekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLGtrayxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD1APTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8TGs77FvLewub+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrLG1oqmqqauspLW4rbevrLK0rrO1rrGqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK64ubuwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCxLytqrW5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpqGkm5+gmpitra2vsqCloq2rp6G1sLGxrKeusqe5s6a2oaKemqOhraKhqbWqoqOmnaWmo5aYnpeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn56hnJahoaijn52onJuaqqausKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYq6ahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnKOqqrCtqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBusDAubq9t6iosbumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFpbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSro6Wwp6Wjq6utpaiurq6rqKmps6Wmq6+0sa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uramp7K1nqKKmIeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GdrKypqK2toqGilJeimpyPq6mwm5+in56XmJOKnpKNkpKVj5iYk5uhopykoKGVoKGjpJqjq6WipKqjq66lrbGppqWmprWmqaits7W0ubqvqayei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PTY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtr3Hu8HHw72/t7q1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OkoJSTm5aVkamprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaijoqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWVlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbMtbG9xLzCxcO9wbO5r6Wqr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqaatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloZ6RkJKSkpWnqqSZmZqdnZaOjIuUhoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y0q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMs7m6vsDFx7a0t7yyurvEvsKxs62wrrCsnKKIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkqpynmaClm5KPnqKal5aEg5Gao4+TopyVlZaHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKaopqGgtLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy1xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaCOmpuioKOYpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmPnIyCiX+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCcmpmZkJWPnY2ioo2JmqChpKOborSvrK+sn5iluaalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhITVNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWjrb+4sbCgqK2sqpaVonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqGgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raeolqalo6CXj5ZpUE5SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZKTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+Zsp+imo2glpiUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnKSeGd1hISEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpqbo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hYWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c42Ig4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZF0c3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjpqRdmx/e3xtcm5wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5b4WPgnpugXdzhHpxc3l3a25pXXeHfYd8iIePgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgXODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSgHt1i3Z8eG1vd359cXFwalpcW1pjY1dnZlxWUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iYqAdYV5X2NWTEM2MC4vMjMxMzM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgJqWgqChmJWbmqWtk5m7sae7yMSnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3h9d3xxaWNcWVlcaV1hZ2BaT0xOWFNSSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSBgoyMgoqOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWEtIT1NRTk5MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn2Fk5J6gZKJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNze3x5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJiNeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO2o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtPRElIVE9GSExGS0dGR0hBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj3yGjI+LinuJg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQTg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q4uaicuKqNpY+SlKCGeoGAcldfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKt7zEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7qiqbK5tbu+zL/Fxb29s8K4uri/uLu4uq2tsaaxqq6+sb28w8Otmbupla6PmJmriX6AeWhVYWBXaWNpZVZbZFpXVUpHR0xSSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU3Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5SUjpCXkoeHfIeBjpaKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNVFpUXpSvuLW7ucnAu73Kzby9wby4try7t761urLGYXWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9dXl5cVWBdaGZTWWJXU1dJRUZPS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGOl5KWlo6GiH2Hg42Win+DgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7trq2uLm0uLW1rre3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW11ZV1tfWGFiUVxhVFJMQ0JGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iYeMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVpaW1ZeVllkWlBdWE9SQ0JIRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6Li4uQiHyFgnB/h4KGe4dyg5KMj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSRhI+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsbmrprSjoq6ipK6jp7KgiaablZORipKPiIKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tgXVxWUldSW1BKSEpKS0A7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW52f3Z4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2ZobG5pboGDiZKMnp+gnpGXmaCjpKaypKWyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNrYVpXUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4eGh3uFeXF7e4SGdnuGjo6eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnZ5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiHg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09rb1tDa2tLWydXMk3V3ZmVYV05RUlxHQ0ZJST9CPj04Oj5APD5JPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZGLjZODjIWJiYGGj5GenJqIhYyBhpd7iImfl4+JjouLgnygiJCKvKCYk5eanKimpa2ep7W/v7+4x8nNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETkQ7PT09OTo8Pzk+QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bn19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZOOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Rg4x/ppmIhY6DhoSApIWKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d1dXRnZmJUXVlST05IRExDPj0/OTk7Ojo6PD42QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoR+d4WboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOioqdl5ijo4aTnZWgi4qJjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVdDQElEPz8/OjQ5Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hYKEfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiI6Qq5eXpKOImZ6VmomPh5iXioWPjYF/h4+kiI2TqJqXk5aYoZifmZOcm6KytKWjvcG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tMSFRaQkJIRDxCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fIWHin6KorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWRmbKWl6Whh5yZko+LkYqXm4mLl46GfoyYnomQkJuampOYl5+UoJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ06bOzdTS0NbY09DYum92clleU11VTkdJTkVBQ0U1Pzs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eYaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5iTnZm0l5WrnYqclJGOkZKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKvCyMS1ur28xcfHwtGhxsrNzcXX1tHL1J9td2VZV1FcUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwcCvvca7s7TAvbWtq7O2i6iyrq6+q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKkuq+pwLytrrK5paSofoiHnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42MlZeUkZqXnaibsZqRrJyOmo+SjpSQkJaXj5GgkYmVm6OslJaPlJydkqCdm5ifoZSanqalpKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tHNxcqFcG9eWVdcWUxKQktBRkg/QUBDOzo1PkE+PTU9Nz4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6lwKSrsLu9qq6ro6Oep6uutbCqnKCrnKGclp+wtaeMo7u7tsG8rKmds6WkqJSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSHl5+hs56UmZOfoJeknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSENNS0xKQUI+REU8NUFFPDszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6ousC9u8S3rMGprLO8v6qwqqSlpKyus622taGgsJ+lopmjtL2qnKm9wqS2t6+slLKsrKyXh5qqpqWRgoyTpZaKgXWKknmFjpKQnqCTj5OLj42Uo5mXnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMOvpbO3zMC5r8Szu77Cua3Cw8LAl2l2XlVUWVhKSkxJRkRESURDQkRMOjRESTo7ND04Ri4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtre8rbO/ub2ur6igqai2rq2psrebn62ip6Geq7e4qqWvv8WyvbqzqKu2tK6ul5alrKefkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39oa1dUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUsuMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+wmKSvpKekpbXAsaystL/DusC6tKi6trm0r5alra+upIuTlKGNdMKafZeahI6XmYyxlZualZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7uqsLLIwLmmrKutsrKjobKytKRta2NZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCao6S1ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istri/wsC+ubOzxbK5vq2kr7WsuaaIm5emm3a/n4SZno6TmpqMrpehnJuXlJqfoameqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm3oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLKtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2ucKyv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZymopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLays56do6Wbl5SYqqGedVxaXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJaamo+qlpWnppWtrJmiq7bEw7y+tsHCwMfEv8zFu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6gkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqrqybmKCgko6QlaielGVfV19bTUhHSU5MSEZESUE+UUlBPEdJSVxST0s9SU9VNUJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCSo5+WpKCmqayYtrGjqrO2xcS9v7XAwrvIwr7Jx7a4tbSxs7S3wcW2vrG4tbm0n6asqqydnp6lpMGln6mtoKSpra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma6VnY2Yk5yBjp+XlY2ho5aQpa2xq6mioqWllZWdmIuOkZKknoheYVhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOok6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC1r77EtLmysLq0rJmosamqmp2loafBrZussZuqo66wqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52TlZKZf5GglY6Nn6CUi6Wrr6WmopygnpGSmpOFipGNm51+X2RZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/HwbSrtaiwuay/w7O4r622uaWYqrKrq5ifppetu7SbqLCarKCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpedoo+ajJKWmIWVnpOLkJudk4qoqKqipqGYnpWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpVZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6Odoaa/p6ivsaKqtaueurGso6u0trGwubewt7i4xb3Dx729xMLGwLjAxcC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegt6mmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6Kcl5uShY6Zi32LlYSNmWhma2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk5NUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7ur63t8DCv8nEucTDwL+3w7zAtq61p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpbSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6qclZeElJaKnZibk4qNlpaalqalo6CdlpWXk3+PlIV7jZKCi5RkanFmb3FeRllnVkRDTVdEWjlIQjY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1BMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLiytKypura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsbWvo5mdrKeal5+bmau3opeTkI6YnKGXlpOqnZqSf5GXjJ2bmJaQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqqympK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y1vb+/t768sbytp7q5t7XCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrG1q6SZoKuom5yenJSpuJyUjo6Kl5uil4+XpJ+blIKQlY+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUtQS49RUxRPDNya0lDQ5GZpa+lra+rqKWxs7SruLK4oay1ucm5rcG7wrizsbXCws7Fv8G9s7y/vrq+vLLDqKm5sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2wta6jnqOoqpugm5uSo7OZj4mNhpChn5SMlJuekZGDjZKSnJqXlZSHl5KVmaecoJ6Mk5GOkHd9joV8e3yFiIhwcnF9fHxcU2RvXk5YZlxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkc+M0JIUyw+kGs7R0iPnKqsoqqxpKmltLWytbaysqKsrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKestqyyt7zAr6uxrJ+jp62pqaWwo6qyqrCrr66wrquzvKe2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7CsnZ+mp6mZpJmZj5+mmIeEjomLnaCOioyVmo2NhIWPlJ+clJeVhpaUk5eknJ2ci5KRjol+foeFfHZ+hYOEcnFwh3RsX1phbmJRcnBcSzyFfEY/WHVYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODxCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Gss8PDzs/Dvr+zwMHDub+zx8Orr7etsri/vrGsraukp6qwqKipsaW0rqqxrq2xsbSstLykt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqZyhpKOkmKCblo+XnJOCg4+IhZugi4qOi5eNjomCi5ejm5CQm4yTkpGTo5qbmoqPi4t8hoGBg3pzf4J/fHJ1i6SHeGtfYG1lV2SGY04/Z5NMRWJ5V2JZUmVVTlZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRv8C6uL++wbnBucDErLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrGusq23qri4prS2q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqrqqqiqqCtm5KqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6mboqOjn5mZoJCNj5iNfoeMh4OdnYaDiYmNjI6LgoWVopqNjZqQkpGPk5+XmZaMi4N/dYeBf4B4dIJ+eHZ9gIedj29xZ2Zvd1xgcodqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVlNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGIwMj9mPU5YPkMsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u8CwrbmuobawycfI0cC+vLq7wb26wr++v62xsbG1vLvBsbGzqrOppLSppq6zs7mxo664srCzu6y7sKmttqyqnqqrn6Ogtq6poZ+ws6K2qp6op6qjqqGira2ova+srq2iqKigrJmQsKGYoqGnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGeHSCf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFJYcF9KeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLOyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6Ogpa2sqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyUkYuRm5KVh4l/gHJ7en58aXh8eXNub3tmhHeFimRhZ19yhHpsZnhdXlQ/V3tsVGFQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaasuMG9ta+iua2oqLDCysnMwba9wLS3v7rItMK0srG0sby4ub21rbi1vqyhs6errLG2uLWsn7+9qrPCtL2hr7K1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svn5+tppifm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouGj42LiYSSmJCGlKOJk5KHkZqRk4CJfXlsfnZ5eGN8enBub3F2Z39yaoRnZWddbHONbGBocGBvPVt4bFVdTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbPAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq62taemp7CzoJ6lpqiipZmfraiqnqCqrqagppikqaCxuZ+jsa+hrKGtpZynp6mampufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjpF9hXxzcH5ydHRgenhobW9vbWh9cWN7bWllYVxkhH5eWXNqcklIfmlYWU1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qqi5xLSyraC3ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7C9w7mpu7q3p6e1qaissq20saicv7imrr24s5+xt7CppaevsZuhpKGlpaCXm6+moZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqWpn5eanqaUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBh4OHi42FjZOYjY+WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGpramdngmxlcmprZGdXYXJ/XllrdWlYRX1eW1hPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcSyr66itbCsra+1xMS9s766t7Czubi6uLqurb+ztLivv8G4q726tKWis6upq7StrrOknsS3p6q4t6yfsruqp6Wor6uZo6ecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaGZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gIOHiIiRhZSTkoyRlZSNjpR7g5eQi3d/fG11c21tdGJ5dGhmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Gusra1ubi1rKq8s6+ysb3At668vLCln7aspqe1qquvoaHFrKqosrWtrLS5naiqq7GlmJ2qn6elkpmlraKYnaSqoZuhnJihnqe3pq+qraGhnp2ilaGmn6KgmZyanZSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIaFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNqYWZjYXN/YWRlZmRoaGFlblldWFxsY2FNZ1daYFZJSElLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mzo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhko2uoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm+vbutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2sr6yuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaa6qK6ioZqbnpmfpJqlnZefmJuWmqGUqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJOFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2pua2VpZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6awsbe2rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqeoY9ro5aZnXGDmJ2lgHaSrKmflpeikoqYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eYuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINmXWRmbmtoXVtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrGbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSztLC5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/lainsLW5ra2jqKyrq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZmKOIoY+SmoehiJWfooClgKitn5SUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GV11oWmtqWohwa3lyh2iHhFleRk4+Rl5NRlJWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprS1rq+zt6uppbKtpbazm6y1trWlpqmzsa2yqK+eqqGyqaClpZyipZ6xuJWmp6e3vaaspqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWUmJSdiK6QmJWKqoyZpJ2GsYGlrp+Vm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuCbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY/YflJrYrayfX5wlXWaoaqQVk5XYU9WTkdWXFhQUFOLXFdbUEFcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqwtrSoqKa2pqi5rpyysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqaigrK2kop2amqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99Znujp4JZX4uraHyMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6OquamdsrKwo6Sgqq2wrK+nqKCjo7GcpJ6Zl5men7CpmJyioLWzoaqboa2tn52al6GjqZ2ZnqWgnJmhp6SQnaKal6GgrJ+mpqCan6GWlZGXkZuGtZu1eYepmraZeIi0m7d/lJeYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXVCpbmNweoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWBUNTAcl6CVibSmp6GtqaizrKq7t8KwvMOtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbKzqKOinairs6mwqKafoKCwl6Cbl5aXm6GxpZybpKi2r6Gojqmnqpudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKgl5ORlJOdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1QamhkUEBYZ1lkYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTw3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqrGptKmmnZ6frJiZmZiYl5mkrp+cl6itsamjno6roqeVnZiboaehmKKio6GboqKonJ6gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm+fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGlQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGmsK2lqbutprWlp7a7vLO7v7i4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaampOVpauimJOmq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn52mlJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4KClWySW7BXS5p1mHlmYK1ednaGZ5eIal2vdpWej3drNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub+6uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqTl6WonJSQp62wpaCUmaifoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiclZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB+gpVuk12rXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbWRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW/uruzsri8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLqjo6yhl5ySo6CWlZ+blZqioZGOjKmwsKadlpqnpp+NkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4eSa5hdrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqSbscCurqurqLequK+1wbW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn5+RlJWrtrCmmJObrKmWjJSmmqWto5KYq7OkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo+von6NdYerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYWNmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNj85p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaetuZ2jrpiVoZGmoJOOnaOemZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGanJeVpJmQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3toxegHl9iGeDeWx6YouscHSFfldbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqitq6q7r7HGr7W0sLmotbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqacpqudlqmlppyboaqmpqKooZGsnpeinpeWmJ2ekLCplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phZIePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqV2x6gnJJSm+FcE5xTURWXGZgTFpXZmNfT1ttdWpxUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUtPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6mknJysoKOam6OnrKKfqaGZrpuUpqCXlJ2fnZixpZmiqJmdkp+dpKabqKSbnpucm5GXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnh6dnaLf3yJanOBdIN1ZHd9dmtveGxfYltvZ01YWWZqX1dZb3lubWZTT0ZTOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXl6GYraqmwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZihm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSalaKkmKSgmaKPmJWLi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6cGd5kYGBiGt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWWt7cGpqXFNMUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr+hrKKRkZ6ampSSlqKdl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqZygpayUn5+dn6quqKSiqqGrmp6foZiln5yfnbCkmZ+plJmZnpKmnJqqn5yYZoWTfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbnqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4Fvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziWlqfHJtY11RTlZKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrOunpakkKOwpre5pa6jj4+aopqTkpugmZmmlnukq6KotMO3pKGmrp6dlJ6jn6SdpKqpkp+gnqCqr6mpoqmeppulnqegrJeinKWxpZidrJain5uTp5mhrJqgf72EiXO0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46AdnmBgHlxe4CGcHiEipJ4bHWRYmVed2NfZYFiXXRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvq6anprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrq24tKevopKRmZ2mk5GgopicoJ6Ipqukq62/v7CgqK6olpGfnaKZo6Sqo5OhoZ2drK6oqqWjoqSfo6ScramSpJuprqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdX9le4h2dmx+h219hI6QfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylrKawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ6Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiq6qepKino7KilJuonKGclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLiuv08bHsrOfnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaioqJuqpqOhqpqvsaKorK+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwcnW1sChmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyoZyrqrGxuaaUmKWpmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hWGNtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjItJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7ago5iUqKu2s6ycppyglpCmrZKanKejoKqmraCipqmws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56ErH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhH5vW2xud3NqgW5aZF9obmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSGLh5mprKSruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ybo6eitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYraGroqSXrqW7rKK3tq6enra0urO2qZqgsqOmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI2BbGh3aHhzboB0XWRkbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJColknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmJ+po7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oytbutt6merLWmq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGWfmlsfmJ9dG2AeWBnZXBvZ2doQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiQpKbySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK6xraegqJutmJmPraKhnaWhmaWcrZefqKW2qL6upKmjn4t/jpuaoKaekpOZmpOamaWjopinq6qhop6oqLykl8Osq6OirbS7rbCpo7axrK6ad69/kIqchod8uq2JmGSwjGSWrn2hkISnl5yCrYyGsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtlo2lmIiUjZKTeXeMm3xjc3xig3d0gHxhaWZvbmZlZk9UYltBU109SCg+OT00ISEtJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46vrKmno6iarpOaj6maoZ2ln5mkoqWYnqKosai7rqSonp2OfIublqGgmY+RmZuRmZeonp+Xp62lpKSipKi6n6DGp6apoay2t66wqaG/sLCwmIKqk6OujpuAhqSXmJCBgLjDuoSPnZSFqJmeg6yMhK+KqZ2apquSf9a9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4VvnX96srHHg2ursb2seXiivrt0gJSMo5mNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdr6ems6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2grKypuK2no5qXknuHmZGnm5OOj5eYj5iTqZielqionqimoKKqup6pxaOhsKSstLWssqyjv6uzsp11dqqktoVliqBwZ6yQio9ubnelkJuhgnaynJhxkY5yl6qkm5mwpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2Npb1pdZ354pmBicpCScGZkgIyRjp+VlZeNkpp6hY2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fpLSqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVl62fpquin6SkoJKLpZKmmamalqOpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZanopmvpZ2hq7mfsMGopbSnrbGzrLCuqrynsruYjKOppbWciZejmIepm5CUnZKqtJqcpK6itZmlo6CjpJ6jpaKXrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdIN3dIeMcadtfZaTlJSBgY+Pjo6bkZ6TlJOdgIWTi3Boj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYV5NVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXmBhYl1eVVFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp6Yp56atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpaa0opKdp5+OqaCNkp+irbGboqWzq7OapqOfp6ygn56dmK2ek5qinJSQl6uZjZmal5CXn5GHoJ6VlIaUjZCOlo2Cf2aOiHWId3qJhHScaoiSlpWSiX2MlpGSlpCekJmSnYGGl4V4cZRyeYl/cXt+am5kXnBpYFxfWGxiT19iTlg5RkZEPTI8PTcuKiUrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCotqqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6Giomco5Cvn6SWqaChk5eZnK6Lq5aPqJmnjJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaednbeif4OutaKwsHWkv6SzoHl7oq21v5d3r6ahioCqfmRcYnegj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlwgZmqmW2ApKmKZZylnJGYmZeMk5yRhJ2bkJWElIiPj5OLhnlskYh2h3F8hoGBYWmJjJWTjFt2lZBmaI6McXmhlZVkeJeFgHaXaIKJgm55f2twZWB2b2traFtkY2FgbFBZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXV9nZ2dYUUo8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWdIucr6Coq6eUl7mgoI+cpJ6RfoiJm56OrJqklaiino6Xkp6Fda6PiKaaqJGWo4ibubOnn5iYi4l1d5KNl5OJk5CQk4yPkp+NmZ6lmJuxlYCMm7WdtIySj72non6no3ulsbqDjo+poISMhY+xqq+MipajmnmBi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgpGXloSammJ5iJKFjpCTi4RucpGIeoJxgYGGgId0iIaXk3iWaJN0oJp0e5mCm5mEmH6RiIGCmGmMjIRqeHtxcGdleG1pbGpbY2loZHBaW0hTS1BARTUtWVNUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpae0nZCDnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhqmPqpqNnXyoj3J7d5yOppZolaR5tIyhoKiqlJrCg4GriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfIWUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOptqKwf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x2m5uOoJGHnaOblpiXhqK4rKWZm4yMfmJtj4uTkIyQjIyXi4+Rno2SnqCYoad+oaeHrZ2glq6QoJ6dkYeCoY2tsomkj6ycjJp+onaAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX15l2xdfZhvYVRyhl1gbXqEYFllgn6FgZlyqKprg6NucqVvn4GbZ2SebFpsiXtlWV+CfmFXUG92ZW90cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU5NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8q6+imZaeoKWrq5+crbSiqJKgoKGnnJmOmLSZkIuejJWLdYGUko2KppaWmJ6ffpOFhayjh5yRipiol5makYelr6ailZmHiYBpboiIi46OiYuMkYuPkaGKkp2fmqGkf5OBj6OhlKB3nJaQp4OjqYCHrK+HpXqNf4SafaJwc5OHlXuejHlth5yLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgca4fHGVtoxygZukZHSsq2F+ap2zfm5+iYSPg4yYcYCjbHKjcp6CfaNenJmzlXB8l56zdHJbnrKCaWJxdHVxaG9YamtxcGRbZ1xhS0M9RDVRQVlxMjxTR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARF9eW1pXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4tq2uoJqhm6KjpKyamrGsq5OXoZmhpZqalJ6sm4uJkXiLhXGAlo2JkKGQk5Sdl32Rio6ooIaYjomRopObmoyLqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ygn4uJd5yYoo2gcqGMiamJnaiSmaquga6NfnqgmXmjk3iAc5eHjJx9lZ+Hm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXaEnWiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE42VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11YZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIBye5eIi5aWhJKVmI96i4SWpJyJlY+Gip2SnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6foZOYcmifiqCPjHCSjYKpiZqhpauiqn+xrqSiuJd3o7Oio3+IlHideqqZf6KPn52ZiZhyoX6IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4t4nmJNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUWdEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbGumoRTX6GntLqzs6iaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniVhZCbi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6om5mVioqKfINshIVxgqGMeIWMiIeRmJR6kaOfnqOIroZ9tYSPnp17ppZ6qYKXn5GMo59/p2l4bn6ZdKBzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iKdKqyqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZeYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSktBSkQ4UEBRTlhTWE9TUWBlZWpTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobWiYm3+wrFRdS36qr7G0sLOinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoiFe3B9g2h9j4KTmoF3kY6PinCAho+TkmyYk3yIkZKjlYOOqZmTkoqFiXmDdoiAboGfhneAkYWHmKGWeJKho5mfibOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3KbiXSle3p1YoSDbn6hbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15qdmt4h2ZrZmJzdG9sVVtSWWhPUWhJVUxYUlVcZ2tuVWdXTUpBSk1LSEpOQVFKUGVjam1ldXNzfnh7bnSJentVUU5tXmhca2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laW1lop2JsKiFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aAiZSVj7lukIqiYn2Zo5eJbnNrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWFNsSVhOW0hXaGhzallrVlBSRVZcTVhSYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRtjKeupamwsaWfi3+WqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6aDfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V6mIl7qXWokISabqWijJKEjIO8bXylr4KHhYeVmJ6ifqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gaJmHdaxmnq2MtnN2voykk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUVtJXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqudgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3R1hnKRg25/i5KHhpSPfHuBhZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gp1xj4Z5k46HgXtzqY1xfX16mJabhI14e319h5OVk4t3kpqhooR7f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnFvd3hvXWuFbmlnVlleVlxlamNVYFRdUV5vd3lranZkaWpqdXxwcXRzYW90YnR7gXh1eYJ1f4B/gXmLhYJ+e26AbWR5bl5XbmdodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaObpqSZpJ2roZ+Dg5aqkZ2fiJmmmqiZg4Gci36WlIeOiomMcoJ8jnx+j4R7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dh4uap5+gq4OJjZWbf36Kl62okJOokXlxn5SFfZVwgKuHcX6VcWpvfIGfi3+RjYpnbV2EjY6dnqCQc5eNinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBboKKd21jZWN5g3qVWlxpZ252W3t5d3Rtc3KDZlxtimtrYllYXFlYa3FbXmBZXV1lcn16dG90Ympqant8cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZwdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7KikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIaGinJ9gIp2hIuChJaKcm+Ac5iGhH6Tg4OGioJ6gIOKmp+PgaWghniOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKki4eTm52jmparoqioopOdiZmRfnqRkIaqgH+TkZKTnLGlmpSejoywkZiEpo6Olp2hipGdhIqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYmIi5GnkYSHjoeCi4+KeoOIhox/dGqBg3x5mWlyaGB0inF+e3d2b3Z0gV1eb4dnbl9eWVpcU2dxVWNbW2BsZ3R7e3Jub2Nqamh/e214fnBob29rZoB7coKAd399f4V7bYOMhXx6eXx9eoR4TmR2anNucXtlbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYeDhIZteIB/coCHfoiThG1sfnqXh4SDkH6AhoSHfIeDjJqdkoapnYJyio+FkpGLnZF8jXupg42Rl5WOm5aFhZumn6KanoaDkpqZmZCZpqGmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZySnI6NqY2RgJ6OipWcoISPmICIkIRweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyNh5yGho91gox+fnNzfIqFfHqOj4WUqJCHhI+BgomHh3OChYaIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcYHB9bnRgY1pbXVFmbFNkWl1gamh1eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2Fd3GCjYd+e3t9gHuCi2Bpe2t1aGqDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqOhXyKkYOMgoKCbHt/eHKAhX2KkH1raH2Cl4mBiI58foWEh3yPgY+bm5CIppt/b4qKi5KGoKGKhYx8qJCHjpGWkpaSd4yjoKGdlpuAgZCamJONmqOipJuYkpx/kIh7goaQiaGBfo2Nj3yXpKCgkZmQj6WMj4GckoqUmZ1/k5N/iJCDdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqTkYGZgImMc4OJfX5yenyNhnx7k46El6aUjIaQe4SFhYJzf4CEhXhkcHp/eHlwbGpmXn5zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWhUZFheYGdpdXmBcWZqY2xnZX+Aam19Z21wan13hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoNudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWjn42Xf4yhioiblnh8hod+hIp+iIKAf3B+e3R1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aVhJKKlZeSkXaRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImI+ff4KLjoxzl6KeoJGXjo6hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIF9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5+lXmNi32CiX59coB5i4d7hpKLjJmkl4KEjHaHg4B/dHh/hoJzXnZ3fXN9dmZsZWF/aWp3c3R1fXF8Y2Rhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamJrZmh8gmtodGhsbmh/fIJ5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuKmHmWnIuMmZB5fIGMfX2De4CDgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5egmpKQknSAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqRm3uIiZCJb5edmqKRlIqLnYuGgZOdgJSUloiain2LioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiFgI91koqFeol/d3iBfoeCfoWPh42VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohrX2lkaWNod4dtZmxoaWxngHx6d26QiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3h4bmyIa2hfaXFih2hxb2V2Z21sYXpoanx7eHBhd22LgZmaq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8npORl5SJd357in18gHZ4f4BwdHN6b4V9gYCJfnxhXH6PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJiKl5NwjJyGaImbkJV7iYWQinCWmpShkJCIipiMgn+Sn32TkZSNmpB8i4aJdXN1a3FudX2LdW+GkY6ScnSAfIKCin5lcm56f5uVfoWKdZKMgnWKe3CCf4KIfoaOi4aOlquOe4h9foqEdnxubH6CgGFmd3N0bnpiXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcX+HZV1paGZiZ3GNbmNoaGVpaIF6d3VvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t7e3N5hGtrX29odH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmaOooaebiIuKgY6chpKadH+olJKNhqCMlpSRgXR8doV4eH9yc3qGbHJveG2JdoCAh25xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ6Kj4aSl5aFiJOYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIimhWiJn4yTgI2FjIF4k5iSnZCPiIiTjX9+kJl9ko6RjpuTfYuBhXB2cGxub3F8h2pzg4+Zi3J4gHWCiYR6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnyMiIWKj5yliXyEdoGJfnd3bGh9f35bcXJxb293Wl5wYHBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFNZZWVhdG+EgmFda2xkYmZrkm5gZmZfZ2qBdXJyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4eLf3x3i39qcWN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShouajJaOjHpyeHSCcHKEdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZygnmBoIKQgZKSmJqRmHeQeoKMkqOak46IlJiShIWWmIuTi4mOj4idhJGLfXKLhYiPiJyan5uXloGVgGqJn4ppiaKJlIWShIpxg5GXj5qMjouLjo13e5ORe5CMjpOYjXyJfoJsd2pvbGxte4Bien6Ql4J3eoJ4g419emh1bXaIl4yAiYd8lZJyfIZyeI57jI58in+FjpGfoIZ9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BOW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfm9scXOKfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Jrg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+ipiSjoSImI6Pj4R3dHdzgHBwhXRwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cmtkbnyAaWdzbmdpc2xTXW5kcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19edE9NS19mYlt3cIl0XFtkdWBiZWWOY2BmYlhpc3Nta3F2i3x0eYeCdnd+i3OAh396iX9yiYeBkIqIfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSekI6FjJeEk4+IgXV3cHlxb4NwbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHaDdYShhJFulY+Vn5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am96dFiJe5KIhnp/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJvZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFzbltjc2JjVm5aXHdMTEtjZmBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3eEgXl4fIlxg4V9fYh7dIuJh5WGjX9+mHNndXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn4yOfJaNf5qIhXxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaKmoiMaZePj5uUkoGIcIWIoI2Fi5WKjJeTe42Sh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjHaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml1eG1ajX2Tg4Z9gIOBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIlucXmLhHRqb2lvdX5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaIRxc2pXZ2lkaVhtV1t0TEpLZWZeYXFzhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgn97dnqIc4WEfH+HdnaKho+YgY2Ce5N2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp8iZmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3twkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXyMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0eHZrY46Cj4GFf3yEgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaHd5X2dpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRjXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWlticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYGSlXyJhnaJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYeQg4qNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiHGBfWZ+jHx5f4CIjI99aYF+hHZncHl4dHh0bGqPhouCi4B5goGFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV6c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBPWWpRRFNmYFlqbW18bllbXWxiWmJvdmRnXF1ga2lja2pzdoGDcW5/fIB0dYN6g4N9gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVqaneEc2yTjYafmZ+ZhYdufYt1aXeWjX6BioKUl4p6kJZve3Rxa2pkYHN7aGBlcXpaYHJ8eWdxeWBlZY+xsndLYlql2dCWcXqQio93fZOKhJiQi4Vua4WRkXp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCDk42EgHCAhHiGe4iem5aNlZGWhYhwe5OCfYKCiIJtgXZogIV4coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4p9d3mBhXqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Vnem5dWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdqcmBvTldnUj9YZl5ab2pneXFbWlhqZVljcHhfZ1xeZWxnZmtpcXd/h29sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmIqBfI6NaHhza2tmX2FveG1fYm94XGRrgnlhcXVfZWXU6r2LMjo+i45/cXmFh42NdYKWjH6SjYt+bWuEjIx1fY9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo6LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCa39xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCGgHR2f4F0gnBcboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bWp2gH90c1tnZ3VuV1Z8U1lvZExacnJlW0lxeG9cW1tZXXV/dWlaYltoZm9kak1XZVA9XWVcXXVlYHRvWllVbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9gX+CenWCgY2ThHCBi254foB7e4iTiX9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZ3JuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjIp/b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9g4FweHp8dYBtWXCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoa2dtbGlwd3ySa2iEin18b35+e4GAgXp3gH+Ki4NxfIdvcniDf3uJjI+DaX17bXd4dot2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZ19wb19gZ3Bmam6JdGF0b1thZGp1eoC/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0h3SId5OIeXlwY3eHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkpV/fH+AcXx3fHSAY1Z4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353kIaEd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJ0XWJcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XltmbmhWa15hamdlbm5pcHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm53goJ+iIuTf3CAe3h5eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGVZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39wcX9thHSThXh0a2B6gnmJj2ZyhHBodW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1pgV1ZVd21iUFJ0dlhQVlheYHKEcF5hY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtbZ2tgVmpfYG9mZmtwaHB2eI50a46NdX92eH13gYSBe3R9g4iHg29ygHRxdX6FgYmNinp2f3iDe3yGh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIaDdIWGhHiKe2JubFtiW1thVmlzYmBbZ25wZodyYXFlV1xia398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpV3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmdxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOln5ziWtvfoJ5b31eWXN/bnSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3NhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZXBZW2poXVdnYF9yZmtncWdwc3eGeG6Vi3R/enh+eYOIf3Vyf4eFjoNwcHx4d3Z6hYWHjIZ5e390i319hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1tcXVRnc2RgWGNxcmeAcmJrZFZaX2p/eL6ue5+3bmFzhWhzenF4gYV6fYt+d3dydm97dmVqb2GHdY6Ac2piXn55eYuEZnF/aGtrWlZvd4mjgYV/cJmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYaOhpeAcY1oa3uEdW52Y11xfWx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh7aGFOVXVrTFBUVV9ndoRnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGZsZHFncnB1gXdxmYZ2f353f3yFh311c4KIgJWDbnN5e3p0c4SGiYmDeIF9dY9+fIWKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkoByjoFxhoJ/g4BwZmxnWF1bXFtTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Zpem97cllngXd1aHCBeIJ3YneGi3yVgm+Na257g3JndGZhbnpoc3iLe35jd4R3a2xydXxye3t1f2h/gIB5d29kZmJthXtsalVoYW9SSmhqT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFpfa2BbWmNkX3ZnbWJwaXRvcn91dJmCd3+AeIB/hoR6fHWChH6XhW5ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Ad3ujpYp5h4WDa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF5aaX9pa3CAZ2xgaHl4anJzc22DgHp/fHV0bXpnaXlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJOCepd2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanloe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFzY3JqXXF4ZXJ0iHx5Y3SBcWdqeXVzbXl4dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVElbeV9bX2pdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenh5g36Bk4NxdHR+enZ0hIiRfYF8kWtylYB7g5+Ffod9gH6GgoCKe3eEq55/eoeHgmpygHl1gH6BdG6Gbn2Ac4qAanBuZGRZX1pZWlRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGt2dWdzdnFshHt9fHh1cmx5Zml3Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cX2PfniQc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXpoXXSAb3Jrcnx+dXZidYaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d3e3p2cWViZG1yfWlqU2ddXFRLcWJQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RbV11Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sWl5cYmNefmlqYG90eG1wb3aDmHpygIB8f4mMhn11dYV5h4x8c3V1gXl6eoGMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXmVWWVlXY2ZrX11cc4VoWHFuW15YWltremJwd3ZsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9/iX52inSCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2J6ZVx3fGtub3B4eXR1ZXOEk4CIg4l7d3BzfnRjeGVccXFicXKCfHRnc4FlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVRtU0pOWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbX2FiXYRpaGFueHltcGt2gZB5bYJ+gIGTiISBdnSIdIyGdHF2doF4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cZmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNybltZWFdfa3ZkaXVqaV1ZbXNwa3Nzc2mEfH5+enZubWtkaXBjW2pyZHR2jnNbVlNlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHp0Z3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVRXUU91WlFPWFFIY3NhYEdWalFJUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp8dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnVvYWdla1JdW1VnYWxrWlxxjGRPb25cVldUZmlzaGJ0ZWRcWG50bG91dHhqhnx/e4d2j3NjZGtuYFxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2dGNtd1ZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2FGWGlPSVhUV25pZX1qbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF1ejm5iZmt5dm5vaXZ2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jjn+Mk3J8ipGEh5+Ge3+GjXSBhnN+g3ZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R8bWNmZ2hTX15VZ19rb1tebo1oTmltYFVWU25mc2tleGVkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXh0bnxrdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNfaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJiI15bpCJdGtzgXR/f4iFh5GElo95fYyPh5GbhIB8jYVzgIFzdHlzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5vckosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2hrPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYqKioqKioqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOPiI2Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf3+Af4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+AgICBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH9/gIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5PT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn9/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTkxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwcHJ4eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz88ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQkI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTkpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pz08Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgIB/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQUA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQDtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAPz1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHt8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9REJERkZEVniEhIKCg4KGiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs8PTo+PDo8Ozw8PTw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSUxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYSGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQUBDRUNDQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpKRUpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXd4ent4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT5AQkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEtHTEpGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh4enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQT0lOT1dWWFpaZHF0d3Z0dHZ4eXl7e3x9fX1+f319fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXx9fX1+fX19fn1+f39/f4CAf319fn5+f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt7e3t9fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFJSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87Qkc+XHR1dnZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNSTk1MSUhIRj8+PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05OTVBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTFBQTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJAQEdKRU1PYmVQTU9NV0tMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHV4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tIQ0NLS0xOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxMTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUpIS0lHSFBLREpOTFFOT05PUE9KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISUhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZWVFlgX11pYG5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFRkFCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlWWF5aXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QUI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlFPTVFXWlZaWVdaXlpYYWBhYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TkhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhKSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWlxfX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVpamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUtKR0tLTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFiYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUxMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1KWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSktKRkI/QEI/PERERkRDQ0NFRURGQkVGR0RESkVFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTUxbc2JkcF1sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUtKSklKTU1OTU1NS05NTltycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBcYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHTEtLTklJSkxJS0pJSUtMTU1MSUtLSlNrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISUxNSUhKSktLSUhJR0tLS0tHSEpJS0tMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISkpISUtITEpJR0hISkhISEVGS0hISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKU19ZYFhgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZER0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKR0BHRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKR0ZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9YX1tdVVhYT11cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNXYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5NTklMQkVBQ0NGQ0JAQ0Q/TEdDTExQT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVpYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9NVm5ZS0NQX1RrVmdKXVhVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHN6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPR01QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUVJUWVdXUFRQUFBTTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2NlZ2pqZWdiY2RsbXBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1NXUGFeUlZRWVNNUEpTVFZYV1dPVVBPTlJLTHJvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcaHNfXFtbXV1fY1pfZGRlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpVUlpdVVVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1NQUVVVVlNaUU5SUldUUlhVU1hUU1FVU1VVWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNnaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVdZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVVYU1dYVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SU09NUFNSVVtVVFBQTFBXVVBWUVJSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXV9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOU1hVU1FSUFJaT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWdeXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTVRQUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlNUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVlRWWVdMUlpWXFtcUlBVU1dVVVJPVlBTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZlYmBlYV9hYWJiX2BeVlleWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV5gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2JiYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFVVWVBUVlRSVVVRVFVXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxiWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZW1laWVlaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZGFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXl1fWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZqZGZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVXF1dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGpnZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNoaWdkYGJgY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4OCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+wqKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3Qqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXp6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCg4ODgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4fHp5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eXt4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eXx6fHd8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp9fHp8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgYCAgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXl5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgoGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoKBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSDg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoOEgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoOCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX+AgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgIGBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGCgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f39/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4SDgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgYKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEhISFhYODgoGCg4GAgoOBg4WFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhYWEhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgoODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6QjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYGBgYGAgICBgYCChIODgoOCgoKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiYeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SEhIOCgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhoWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGCgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIGCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWEhYWEg4SFhYaFhYWEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoKCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHh4aGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSFhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFhISDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaFhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWFhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKiYiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SEhYSDg4SDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChYiIiIeHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f4CAgH+FhoaFhoaGh4eIh4aBgoSEg4OFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgISEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYODf35+f358fH+Dg4KDgoOBfn1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn+AgH59gH9/gICBf4CAgYB/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYGCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKiIeKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4KDgoKCgYKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCg4WDgIGDgYCCgIGBgYOCgoOBgYJ/gYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKGhIWEhIWEhYaFhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8g4OEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoaIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIGCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiKh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjoyIh4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKTkYuMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHt8en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjoyKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gICAgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gYGDh4SIjYyKiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYqHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhoaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+fn1/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIODgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGDgoKEhYWCgn59fXt7fHx6d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GBgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CBgYGBgYKBgIB/f39+fX9+eoGSi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBg4OAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChYN/gIB+goOBgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOBf4GEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fIGBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhISEhIWFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4F/fn1+fX2Cg4F9e399foB+fXt8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4WGhouKhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgYGAgYGAfX9/gX6Afn1+gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYmHhYSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4aGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFhISEg4KBfX9+e3x7fnt8fH1/fn18fn6AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeHhYWFhYaGh4iGhIaFhoaFhYOFhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoeFhoaFhIOFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4eHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fX5+e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeHh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYeGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGh4aGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhIB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFg4SEgoWDhIaCg4WFhYaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af35/g397gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p6enp5e3p6enp6enp7fHl7fXx8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8ODo8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ozo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb3NvZ19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqIoL+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTTnqvqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz0/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1N+sKyrq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJehbKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STz8mUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4nayeq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4rClIecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjQ1LvImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pa2cntLRlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCfk6W8s5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bp9CLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKHQ2qWZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ6gkqeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGjpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqtackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk7PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw6Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUtPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX0xIUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXFlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmFaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yYGhfY1NRWFRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NtaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJacnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbWFfZGBQT0FAPDs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFdWVNhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ6OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpeUlJGUmpiTj5OdlpKLkX56fH90a2xuY29saHF3bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MrGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZWZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIuLjI2SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlpZ11pb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmBndWdpaXRteGxdZFtVX1lMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8jKx8zIx8jNxszPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0MKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs7Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/t7yxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLe2uLa3wL/EvMLFxcfHysnGz8LBuK+1tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAuK+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1urW5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenJ2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHFzd3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXIur2+trGnpJ6hqbGutbi2srCrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3Zve291cm1iXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyxrrKppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlxdnNtdGlrXVtqVFxcT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw7PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUUNNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+nn6iqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJSQjI6PkJOQlpWWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeYN8dn95YnZsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqSmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfX2AdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6xqqWqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Ganpqip6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJqakY6SlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2ysLSpsa+imZydnqGYm5uamJmblJWalpicpKGgmqOgmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5SZkpKcmKGdqqKmoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp5+fo6CXkZScoZyamJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJWVn5ubmKShoJ2joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj83NTg9Pj9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56boZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWgn5qSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vLKytKGroqmosamqqKenmpidmammoJmnoJ+ep6elpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODY3PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ+foqOen56bnZuUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK6trOpsq2qsrSvs66prqOdq6a1sayir6Wgoq+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKGcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubnpqenJ+lpqedoKCssa+npKSjoZ+mrKefl5yVkpqdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8vSxr6/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrrq2vrq6qresqqq4urS7rq24o6ainqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5SPjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/S08zKwsXGxsrHzr/I0MvGxMbEwLvCwL6+vrW9s62+v8LCxsTGw62+uLG4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBPDs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeSkI+Mh4SEiYeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrOytPX0dfS1NXT08jMxszNydLMzdPNxMbJycDFy8fIyMW+wrOzx8TLysrOxcm/vb68wcfEzMzIycDDv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTs5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOeoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0cnR1dbZ1dfS1tjO0snO0czO0MvSz77GxsnCy8vLzs/Fxsa2v8m+0szLz8XJx77CwsfOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09DH0NjX2NDX0tfZ1dXMzs/JzNHLzs+/xcHGxc7M0NDRyMvLv8nLxdPNy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzo9NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6ZnZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dXN0dDY19fXy8jOw8jOzMnMv8i+x8jNzc/K0M3Oy87Ox8rPz8rOysHIxsnMycvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnpWWmJWKbF9fXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08rL0NHTyc3R1dLV1crAycHFzMLHycLMwsXHysrOyszMz83Ty8XHz8zHx8rExsDFycvMz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozo7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrnL1dbZ2tvYzM3PydbWxcS4sraqo66tuLmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nKz8fDw8/IxsHGx8O/wMbLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qr65ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrCv8O6ycfIusfFxMq/vcHLxsXDvsW8vL/CxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaylpZifmKyjoKWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NLMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcXCvcbAt7vEyb/Cybu3urrFw768wc3Cxr69tcC9w7q8xrrCubO7xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3AxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3uravkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrvBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7tK+ytrq+s8S2urWsuLy9wL2wubautrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Ghnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqessru6tsK5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHHy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6u7vKt7S7vbW1q5GJkJB8eX6KhXp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq20trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6kqKKrsbKzp7yqq6irrK20s6WoraCkr6mypaeorqWntqywsre5uruxvL2+vsS/tcHAx8i3v8DEt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDxsW6vMS9uba8xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+kpKekrJ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sLekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLCsrKyxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BsYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8PGs77Fu7avuL+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippuen6OloKeemqKbn6qwrLG1oqmqqauspLW4rbavrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+fnZmdn6WamaOcm52vqKunqqusrbCyuK64ubqwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCw7usqbS5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpaCkm5+gmpitra2vsqCloq2rpqG1sLGxrKeusqe5sqa2oKKemqOhraKhqbWqoqOmnaWmo5aYnZeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK4s66pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+6qqawurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn52hm5agoaijn52onJuaqqausKubo6O2qaCfrqi1qaamrLCjtq+jtqCim5iYq6ahm6y4r6Kho5yhn6CTlaGUlpabmJeWl5yVn6idqaOhnKOqqrCtp7OrqqassrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NTUzMzk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tbnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBur+/ubm8t6emsLumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+lpKOlpp6cn6Sfqq+mn6KktaegoaKns6Glp6SupLCsq7SeoJ2UlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSrpKSwpqWiqquspaiurq6rqKmps6Wmq66zsa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc1NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uralp7G1naKKmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFNVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWpJmglpyfpKGspaOjoqOhm6qqpZmepbCpn5+cpKqdp6Gdq6upqK2toqGhlJeimpyPqqiwm5+in56XmJOKnpKNkpKVj5iYk5ugopykoKGVoKGjpJuiqqSipKqiq62lrbGppqWmprWmqqits7W0ubqvqayei3Jwb2BbV1ZVUkZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtbzHu8HHw72+trq1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OjoJSTm5aVkaiprJqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaiioqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbLtLC9xLzCxMO8wLK5r6Wqr6uel4aBd3hvbmlubm5xZ2hpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTk9RWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqqatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloJ2RkJKSkpWnqqSZmZmdnZaOjIuThoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y1q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZQU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMtLm6vsDEx7W0tryyurvDvsGws62wrrCrm6KIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkq5ymmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjICLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKanpqCftLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPRE5OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzsq62oqy1w7q6rqqrtK+vn5enfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaGOmpuioKKXpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmOm4uCiX+JmJ+inpCTmJaEjoGTfn5ziY56kIaSkJCcmpmZkJWPnY2ioo2JmqCho6OborSvrK+sn5iluKalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0ODg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+0r73Dr7HHsq2nrJWjrb+3sK+fp6ysqpaUonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSVk46WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeIJ6hZOdlIOVjpGPgoZ8knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqCgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg0NDg3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raanlaWko6CWjpZpUE1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk5LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoeFlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Td3V2eISNmXBRjYiKh3t+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoB7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnGSeGd1hIOEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ60qa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGk6SWnIyCloiPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoaPe3Z6b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2dzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpubo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkZSAe4p6hIB+foBlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c4yIg4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2woq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH13dHd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZFzc3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorp6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cZ+Uc3iAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjZqRdmx/e3xtcm5wf3pzdW1idoR/hoCGkZGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Xiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnWhmXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5boWPgnpugXdzhHpxc3l3a25pXXeHfYd8iIiPgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MTA0NjQ2NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgHODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d3oZmIho+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSf3t1i3Z8eG1vd359cXFwalpcW1pjY1dnZl1WUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iIqAdYV5X2NWTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlXBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiQgJqWgqCgl5WbmqWtk5m7sae7yMOnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GHgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3l+d3twaWNcWVlcaV1hZ2BbUE1OWVNSSVFLRE5HQ0tEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSAgoyLgomOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01RSUlLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaSjrJOotqKnwcKux694upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlWxvdYmLgZWMjY93kIRxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWUxIUFNRTk5NR0lRRERORkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6FlJJ6gJGJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8QFI1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpeXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNzfHx5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUdHTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJmOeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5PEZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbSssLeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO1o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtQREpIVE9GSExHS0hGR0hBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj32GjI+LinuJg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0pHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbPAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxspiWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q3uaicuKqNpY+SlKCGeoGAclhfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUtIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY1OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpLRUZXVFBej6StpLK0w7a4wczKt7zEvbO0wri4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7mhqLG5tbu+zL/Fxb28s8K4uri/uLu4uq2tsaaxqq6+sb28wsKtmbupla6PmJmriX6AeWhVYV9WaGNpZVZbZFpXVUpIR01SSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5STjY+XkoeHe4eBjZWKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0pMVFpUXpSvuLW7ucnAu73Kzby9wby4try8t761urLGYHWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y9uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9cXl5cVWBdaGZTWWJXU1dKRkZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGPl5KWlo6GiH2Hg4yWin+CgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7t7q2uLm0uLW1rre3mWR1qZ6tcF6irZ2YoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nL0czPzsrHwMDCyr7BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW1xZV1tfWGFiUVxhVFJMREJGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZaRm5KFiop/iYaMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOm56Nj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVlaW1ZeVllkWlBdWE9SQ0NJRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6KiouQiHyFgnB/h4KGe4dyg5KLj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSShY+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN8fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsrqrprSjoq6ipK6jp7KgiaablZORipKPiYKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tfXVxWUldSW1BKSEpKS0A7OjxFQ0U9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW51gHZ4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZKMnp+gnpGXmaCjpKezpaSyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNqYVlWUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4iGh3uFeXF7e4SFdXqFjo2eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnV5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiIg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NfY19jX1NvX09nb1s/b2tLWydXMknR3ZWRYV05RUlxHQ0ZJST9CPj04Oj5AOz5JPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNUxHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZCLjpODjIWJiYKGkJGenJqIhYyBhph7iImfl4+JjouLgnygiJCKvKCYk5eZnKimpa2ep7W/v7+4x8nNzsTNytHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoJ1dWNlYV1SVVVUTUtETkQ7PT08OTo8Pzk+QTY+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEw5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bX19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2NnKScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZKOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Qg4x/ppmIhY6DhoSApIWKi7eXnZGUlaGmoJ2dnaOutrm0q8DGytDHx8zP09LS2NLV18DX2Nnb2Nra2dnX3LZ0dHNmZmJUXVlST05IRExDPj0+OTk7Ojo6PD02QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoV+d4aboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOi4qdl5ijo4aTnZWgioqIjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNx8bPy8/MztbQ0dSt1tXY2tja2tfW2dmca3hwY2NZWVVRVVdDQElEPz8/OjQ4Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hIKFfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiY6Qq5eXpKOImZ6VmomPh5eXioWPjYF/h4+kiI2TqJqXk5aYoZiemZOcm6KytKWjvcG+x8XFyMjJwsrSzc3UqNLR1tbW2NrU09rOf256ZF9bWltMSFRaQkJIRDtCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fISHin6LorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqmarK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWSmbOWl6Whh5yZko+KkYqXm4mLl46GfoyYnomQkJuampOYl5+ToJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ0qbOzdTS0NbY09DYuW51cVldUl1VTkdJTkVBQ0U1Pjs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxLPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eIaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5mTnZm0l5WrnYqclJGNkJKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKzCyMW1ur28xcfIwtGgxsrNzcXX1tHL1J5sdmRZV1BbUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTDpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fX1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbWtq7O2jKiyrq29q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKjuq+pv7ytrrK5paWofoiHnK29sIOMjIuQg46DkY96gYiQjY6ciIiPl42LlZeUkZqWnaiasZqRrJyOmo+SjpSQkJaXj5KgkomVm6OslJaPlJydkqCdm5ifoJOanqalpKKjsLKmwcbDsLC7t8XDw7/NpsfEx8S91tHNxcqFb29eWVdcWUxKQktBRkg/QUBDOzo1PkE+PjU8Nz0zMzMyNDFBMTdAQk0+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6mwKSrsLu9qq6ro6Oep6uutbCpm6CqnKGclp+wtaeMo7u6tsG8rKmdtKWlqZSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKQoZSHl5+hs56UmZOfoJeknpqfm5+UmJ6lo6ampK+tpcDEw66ot7bJw722z7LEv8S8s9HKyMK0cHVpWVVZZ1BLSENNS0xKQUI+REU8NUFFPDszPTlCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WiouIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6nusC9u8S3rMGprLO8v6qwqqSlpKyus622taCgr5+lopmjtL2pnKm9wqO2t6+slLKsrK2Xh5qqpqWRgoyTpZaKgXWKknmFjpKQnZ+Tj5SLj42Uo5mXnJSUo56qnpGlmoyPj4+Vloh8j5aTk6OblaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMSvpbO3zL+5r8Szu77Cua3Cw8LAl2h1XlZUWFhJSkxJRkRESURDQkRMOjRESTo7ND04RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZraekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtra8rbO/ub2ur6igqai2rq2psreanq2ip6Geq7e4qqWvv8WxvbqzqKu3tK+vl5alrKigkY6TssWnlo58kpV8h5KZj6mYl5OTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39naldUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+vmKSvpKekpbXAsKystL/DucC6tKi6t7m0sJalra+upIuTlaGNdMKafZeahI6XmYywlZqalZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacm5WapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7ursLLIv7imrKutsrKjobKytKRtamJZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1K0M1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCbo6S0ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istre/wsC+ubOzxbO6vq2kr7WsuaaIm5imm3a/n4SZno6TmpqMrpehnJuXlJqfoKieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm2oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlKCMk6uckZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLJtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorL21uL7HvLe2ucKzv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLaysp6do6Wbl5SYqqGedVxZXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvKDsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJebmo+qlpWnppWtrJmiq7bEw7y+tsHCwMfDv8zFu725srC5s7/Cx7W/sLy3ubalpKurraChmaqqxKKkqaulnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqraycmKCgko6QlaielGVfV19cTUhHSU5MSEZESUI+UUlBPEdJSVxST0s9SU9VNUJGOT5HRzVDYVpLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCTo5+WpaCmqayYtrGjqrO2xcS9v7XAwrvIwb7Jx7a4tbSxs7S3wcW2vrG4tbi0n6asqqydnp6lpMGln6mtn6Sqra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGun5minqmorKOawqypnqyum5uemaWgvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma2VnY6Yk5yBjp+XlY2ho5aQpa2xq6mhoqWklZWdmIqOkZKknoheYVhiX0tISkpORkVBR0s/PktCOjlKS05dUVFJPUxXXDlGST1ETUg4SGJbS0NMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOolKuloKSframsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC0r77DtLmysLq0rJmosamqmp2loafBrZussJuqo66xqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWjrKGfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqrj52SlZKZf5GglY6Nn6CUi6Wrr6WmoZygnZGRmpOFipGNm51+X2RZZmVJSExJU0FDQElIOztHPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsmVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+boMOppKqzoqS1qpazraeipLKsrqm7sq2xtbTGwMTCtMDEvcnEtb/HwbSrtaivuKy/w7O4r622uaWYqrKrq5ifppetu7SbqLCaraCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpecoo+ajJKWmIWVnpOLkJudk4qoqKqipqCZnZWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzs6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjIzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6OdoabAp6ivsaKqtaueurGspKu0trGwubewt7i4xb3Dx729xMLFv7jAxcC5qbakrLutwMG3t6qtsbqhk62xrbKWpKeRqrmqn6axnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6KbmJuShY2Zin2LlYSNmWhma2BsbVdQUVtVQUJFVEA8O0lBODpYUGReUFdXRVlfXk5NUk5eS0o+WWNeT0hQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmM/MTY0N2dZYEYoPzhsfWdbVjuJe2NDPqefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7u763tsDCv8nEucTDv7+3w7zAtq61pqu3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56sorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpLSuqKGtrq6xqLSts6qknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6mclZeElJaKnZibk4qNlpaalqalo6CclpWWkn+PlIV6jpKCi5RkanFmb3FeRllnVkRDTVdEWzlIQzY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1FMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX15fVDE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbekrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLixs6upura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsravo5mdrKeal5+bmau3opeTkI6YnKCXlpKpnZqSf5GXjJybmJaQipSSnpmkoaKgmJaSkpV6i4+FeoyKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYF9RTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqq2mpK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y2vb+/t767sLutprm5trXCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrK2q6SZoKuom5yenJSpuJyUjo6Kl5uhl4+WpJ+blIKQlI+cmpeWlYiWj5eap5ykn5GXkZCVdoOPh3uEgYOLimxvdnR7flxMZm1bS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYFxeUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUsQS49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7SruLK4oay1ucm5rsG7w7izsbXCws7FwMG9tL2/vrq+vLLDp6i4sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2xtq6jnqOoqpugm5uSo7OZj4mNhpChn5SMk5uekZGDjJKSnJmXlZSHl5KVmaeboJ6Mk5GOkHd9jYV8e3yGiIhwcnF9fHxcU2RvXU5YZVxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEoqOkc+M0JIUyw+kGs7R0iPnKqso6qxpKmltLWytbaysqKsrr3Muq7AusextK20wsPRxca+wLK+wMK7vre7xKartquytrzAr6uxrJ+jp62pqaWwo6qyqq+ssK+wrqy0vae2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7Gsnp+mp6mZpJmZj5+mmIeEjomLnaCOiouUmo2NhIWPlJ6clJeVhpaUk5eknJ2bi5KQjol+foeFfHZ+hYOEcnFwh3RsX1pgbWFRcnBcSzyFfEY/WHRYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0VGNjtCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Grs8PDzs/Dv7+0wMHDub+zx8Oqrratsri/vrGsraukp6qwqKipsaW0rqqxrq6ysbSutb2kt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqp2ipKOkmKCblo+XnJOCg4+IhZugi4mNipeNjomCi5eimpCQm4yTkpGTo5qbmomPi4t8hoCBg3pzf4J/fHJ1i6SHeGtfYGxlV2SGY04/Z5NMRWJ5V2NZUmVVTlZVVlRPXF1hVUtNaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWS4wSmdBQTs7Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRwMC7ub++wbnBucDDrLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrKvs623q7m4prS3q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm5tqqqqqqiqqCtnJKqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6qcoqOjn5mZoJCNj5iNfoeMh4OdnYaDiImNjI6LgoWVoZmNjZqQkpGPk5+XmZaMi4N/dYeBf394dIJ+eHZ9gIedj29xZ2Zvd1xfcohqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVVNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGEwMj9mPU5YP0MsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u7+wrbmuoravycfI0cC+vbu7wb26w7++v62xsbG1vLvBsbCzqrOppLSppa6zs7mxo664srGzu6u7sKqutquqnqqrn6Ogtq6poZ+wsqG2qp6op6qjqqGira2ovrCsrq2iqKigrJmQsKGYoqCnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY2LkIODk5+Wh5GdkJOQjZGclJePioaGeHWCf3x1eHl/eXJxd2Z+hqR2aV9jaYB0ZoiMfFJYcF9LeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wwp6q3vcC7r6e5qqausMnHyNHDvL++uL2+vMi6wLevr7Oxurq3wLKyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6OfpK2sqJyeqrKktKibq6epo6ido6moqb6stLCunaqkoK6cm7OilaSbpKagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4aQjY+Df5OakoWTooyUkYuRm5KVh4l/gHJ7en58aXh8eXNubnpmg3eFimRhZl9xg3lsZnhdXlQ/V3ttVGJQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHaUkyNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaast8G9ta+iuaynp7DCysnMwba9wLS3v7rItMK0srG0sb23ub21rbi1vqyhs6errLG2uLWsn7+9qrPBtLyhr7O1qqyfrbCjnKWpqqSenKSwpbCgn6upp6GpnKWpoa28qK6xrqGro6Sunp+tppefm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouFjo2LiYSSl5CGlKOKk5KHkZqRk4CJfXlsfnZ5eGN8enBubnB1Zn9yaoRoZGZda3KMbGBocGBvPVt5bFVeTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWdZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr6+pq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbLAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq+2taemp7Czn56lpqiippmfrKipnqGqrqagppikqaCxuZ+ksa+hrKGspJynp6iZmpufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWfiZGVgouXjpF9hXxzcH5ydHRgenhobW5ubWd9cWN7bWlkYFtkhH5eWXNqcklJf2lYWk1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxlYzI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qai5w7SyraC4ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7G9w7mpu7q3p6e1qaissq60saicv7imrr24s6Cxt7CopaevsZuhpKClpaCXnK+moZ6jqK+hn6GUpaWiuLChprGrn6yjr5icqqWonpeanqWUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBhoOHi42FjZOYjY6WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGtramdmgmxlcmprZGdXYHJ/XllrdWlYRX5eWlhPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcOyr66itbCsra+1xcS9s766t7Czubi6uLqurb+ztbivv8G4q726tKWis6upq7StrrOknsO2p6q4t6ygs7yqp6Wor6uZoqecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaCZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gISHh4iRhZSTkoyQlZSNjpR7g5eQi3d/fG11c21tdGJ4dGhmaWZjbYNmZ2hkZmdoXWRhaGVaZXpiYFBzVFtbU0tKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmBzQjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+soraup6+vt8DAvLHBt7Gusra1ubi1rKq8s6+ysb2/t668vLCln7aspqe1qquvoaHFrKqosrWsrbS6naepq7Gll52qn6elkpmlraKYnaSqoZuhnJihnqe3pbCrraGhnp2hlaGmn6KgmZyanJSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIWFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNrYWZjYXN+YWRlZmRoaGJlblldWFxsY2FMZ1daYFZJR0lLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhkoyvoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm9vLutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2rrqyuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaW6qK6ioZqbnpmfpJqlnZefmJyWmqGUqpetqpyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2ptamRoZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8RU1hODo/MjQ5QDM3ODE4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnY+Psp2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4ube3rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6ewsri1rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqdoY9ro5aZnXGDmJ2lgHaSrKmel5iik4qYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eIuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINlXWRmbmpnXFtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEVHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSys7G5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/laiosbW5ra2kqKyqq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZl6OIoY+SmoehiJWfooClgKitn5WUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GVl1oWmtpWYdwa3lyh2iHhFleRk4+Rl5NRlNWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6tnZqZnZ+rqqiqvsOusrm8t8G/qqS3saqsprO1r6+zt6uppbKtpba0m6y1trWlpqmzsq2yqK+eqqGyqaCkpZyipZ6xuJWmqKi3vqatpqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWTmJSdiK6QmJWKqoyZpJ2GsYGlr6CVm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY7YfVJqYrayfH5wlXWaoaqQVk5XYU9WTUZWXFhQUFOLXFdbUEFcRFBOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaivtKqwtrSoqKa2pqi5r5yysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqqigrK2koZ2bmqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aWk5iSmYWva2qMjqp/aIWWh61mcqCflpupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99ZnujpoFYXoqrZ3yMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraeln6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6Oquamds7Oxo6Sgqq2wrK+nqKCjo7GcpJ6ZlpmdnrCpmJyjoLWzoauaoaysn52al6CjqZ2ZnqWgnJmhp6SQnaKbl6GgrJ+mpqCan6GVlJGXkZuGtZu1eYepmraZeIe0m7d/lZiYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXU+pbWJveoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdLOWBUNTAcl6CVibSnp6GtqaizrKq7t8KwvMKtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbO0qKOinaiqsqiwqKafoKCwl6CblpaXm6GxpZybpam2r6GojqmnqZudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1RaWhkUEBYZ1ljYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2p7KxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqbCptKmmnZ6frJiZmZiYlpijrqCcl6musamjno6soqeVnZeboaehmKKio6GboqKonJ6gnpWZm6ehnKeUm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4RhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGhQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk1UX2VQNUc9YU02Mi6jnpGmsK2lqbutprSlp7a7vLO7vri4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaZmZOUpauimJSnq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn5yllJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4GBlWySW7BXS5p1mHlmYa1ednaFZpeIal2vdpWej3drNXnIrrNgRFVvXWdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA8VV9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub66uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqSlqWonJSRqK2wpaCUmaieoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiblZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB9gpVuk12rXFuTf5F/aGeqY3J6gGqYhnFdq1qJoI9rbWRPSkOhXFtNdF1iZk1aYV9ydGBKVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MFRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW+uruzsrm8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLmjo6yhl5ySo6CWlZ+blZmioZGOjKqwsKadlpqnpp+MkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4aSa5hdrWBOoXyHkVJzo2x5fn1umIZvXK9WPJx3ZVRvbi5bp09jUmtlYmxaYlxgcXxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi5VXmJMNUZNXjgxQTilmpyeuqSbscCuraurqLequK+1wLW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn6CRlJWstrCmmJObrKmWjJSmmaWto5KXq7OkoJ6orLCYoaKQmaGXoJuWm5eglJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo6von6NdYerfb5uc7x0soN1eICJbZqIcG2NpHS9XXd9W2F5vGpaVlxqel5pYWNmYm55b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvU11gSzU8TFstNj85p5qforyjl7DDr62pq62xqLmvt8Sxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaesuJ2jrpiVoZGmoJOOnaOemZ+akJaTsLmxq5WWo6enlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGZm5aVo5mQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3totegHl8iGeDeWx6YouscHSFfldbp2lEZFpUZl9jXWJQZ2ZxbnVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOsqqitq6q7r7DGr7W0sLintbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spL2noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqabpauclqmlppyboaqmpqKooZGsnpeinpeWl52ej7CplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phY4ePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqWGx6gnFISm+FcE5xTURWXGZhTFtXZmNeT1ttdWtyUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZURUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6iknJysoKOam6OnrKKfqaGZrpuUpqCWlJ2fnZexpZmiqJmdkp+dpaabqKSbnpucm5KXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnd5dnaLf3yJanOBdIR0Y3Z9dmtveGxfYltvZ01YWWZqX1dZb3pvbmZTT0ZSOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDUkdLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsirrbOntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXlqGYraqlwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZmhm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSZlKKkmKSgmaKPmJWMi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6b2Z5kYGBiGt1gXmJcWhzf3l1g4aAanNid2VfaGVjZGZqWWt7cWpqXFJLUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr6hrKKRkZ6ampSSlqGbl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqJygpKyUn5+dn6quqKSiqqGrmp6foJiln5yenbCkmZ+plJqZnpKmnJqqn5yYZoWUfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbXqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4FveIJ4gHJteIRzdoiHjoN6aIRYXWp0ZF1ziGhqfHFtY11RTVdKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9eWlRPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrSunpakkKOwpre5pa6jj4+aopqTkpugmJimlnukq6KotMO3pKGmrp6dlJ6jn6OdpKqpk5+gnqCqr6mpoqmeppulnqegrJehm6WxpZidrJajn5uTp5mgrJqff72EinS0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46Ad3mBgHlwe3+GcHiEipJ4bHWRYWVeeGRfZYFiXXRobWRiWExVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvqqenprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrqy4tKevopKRmZ2mk5GgoZeboJ6Ipqukq62/v7CgqK6olpGfnaKZoqSqpJShoZ2drK6oqqWioqSfo6ScramSpJqorqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdn9le4h1dmt9h219hI6QfmuAjF5wanBnYF94ZFtxaGpjZWBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylraawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ+Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmnm6aloqCqkqyzlqWiq6qepKino7Kik5upnKKclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPSg+MSkzVkBGIRxHO0MxLiuv08bHsrOgnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrJiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJqqpqOhqpqusaKoq6+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk6NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwcnW1sCgmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoqyZqqagoamhsq2hqbKyoZyrqrGwuKaUmKaqmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hV2NtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMS89LTRPVFEdHDs8RjIsJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7WgpJiUqKu2s6ycppyglpCmrZKanKejoKqmraCjp6mws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmtnKulpJ2ro7aroLG4sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56DrH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhX9wW2xud3NqgW5aZF5nbmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtTHBs2P0csLSCLh5mpq6SruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ycpKiitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYrKGroqSXrqS6rKG2tq6enra0urO2qZqgsqSmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI6CbGh3aHhzboB0XWRjbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlVRT1FbVSUhMkFIIyolknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmaCqo7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mmq6Cjm6ymvKyUvbCtn6Oxtbutt6meq7Wnq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGXf2psfmJ9dG2AeWBoZW9vaGdoQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK2xraegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuaoKaekpSZmpOamaSjopinqqqgop6np7ykl8Ksq6OirbS7rbCpo7ayrK6ad69/kIqchYd8uq2JmGSwjGSWrn2hkISnl5yCrYyFsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtlo2lmIeUjZGSeXeMnH1jc3xig3d0gHxhamZvbmZlZk9UYltBU109SCg+OT00ISEsJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46urKmno6iarpOaj6maoZ2kn5mjoqWYnqKosai7rqSonp2OfIublqGgmZCSmpuRmZeonp+Xp6yko6Sio6i6np/Gp6apoay2t66xqqG/sbCwmIKqk6OujpuAhqSXmJCAgLjDuoSPnZSFqJmeg6yMhK+KqZ2bpquSf9W9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4RvnYB6srHHg2ursb2seXiivrt0gJSMo5mMmI2SmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdrqels6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adppuaoKiimJ2grKypuK2no5qXknuHmZGnm5OPkJeYj5iTqZielqinnqimoKGqup2oxaOhsKSstLWssqyjv6uzsp11dqqktoVliZ9wZ6yQio9ubnelkJuhgnaynJhxkY5yl6ukm5mvpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2NqcFpdZ354pmBicpCScGZkgIyRjp+UlJaNkpp6hI2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fo7OqmJK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpquin6SkoJKLpZKmmamalqKpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZamoZmupZyhq7iesMGopbSnrbGzrLCuqrynsryYjKOppbWciZaimIepm4+UnZKqtJqcpK6itZmlpKCjpJ+kpqKWrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdYN3dYeMcadtfZaTlJSBgY+Pjo6bkJ2Sk5Kdf4WTjHBoj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYl9OVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXmBhYl1eVVBLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKC3sZCOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqomZOloKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp2Yp56as6Kcpaq2p67Br6S4p7Cwsq+srba+pLPBmpOnpaa0opKdpp6OqaCMkp+irbGboqWzq7OapqOfp6ygoJ6emK2ek5qinJSQl6uZjZmal5CXn5GHoJ2VlIaUjZCOlo2Cf2aOiHaId3qIhHScaoiSlpWSiX2MlpGSlpCdjpiSnYGFl4Z6cZRyeYl/cXt+am5kXnBpYFxfWGxiT19jT1g5RkZEPTI8PTcuKiUrKSYdJjQxNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVVQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCntaqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiomcopCvn6SWqaChk5eZnK6LqpaOp5injJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaacnbaifoOutKKwr3Wkv6SzoHl7o621wJh4sKahioCqfmRcYnafj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlxgZmqmW2ApKmKZZylnJGYmZeMk5yRhZ2bkJWElIiPj5OLhnlskYh2iHJ8hoGBYWmJjJWTjFt2lZBmaI6LcXiflZRkd5eGgXeXaIKJgm55f2twZWB2b2traFtkY2FhbVFZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXV9nZ2dXUUk8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWc4ucr6Coq6eUl7mgoI+cpJ6RfoiJmp6NrJqklaiino6Xkp6Fda6PiKWZqJGWo4iauLOnn5iYi4l0d5KNl5OJk5CQk4yPkp+MmZ6kmJuwlICMm7WdtIySj72non6no3ulsruEjpCpoISMhY+xqq+MiZajmnmAi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgZGXloSammJ5iJKFjpCTi4RucpGIeoJygYGGgId0iIaXk3iWaJN0oJp0e5mBm5iEmH6QiYGCl2mMjIRqeHtxcGdleG1pbGpbY2loZHFaW0hTS1BARTUtWVNUNikhMDk9Pjc0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpaeznI+Dnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2FnrixqJ2ako+FcHWQiZWQipOPjpuLjpGdkJWeopSdqoaftIm0mq6Lyoirr4q3hY2whLOzh6mPqpqNnXuoj3J7d5yOppZolaR5tIyhoKiqlJrCgoGriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfYaUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePommdgZ2WgJmAiouDiJhvjZKEZ3d0fHdnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBKZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOotaGvf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x3m5yOoJGHnaOblpiXhaG4raWZm4yMfmJtj4uTj4yPjIyXi4+Rno2Snp+XoKZ9oaeHrZ2glq6QoJ6dkYeCoY2us4mkj6ycjJp9onWAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX56mGxdfZhvYVRyh11gbXqEYFllgn6FgZlyqKprg6NucqVvn4GaZ2SebFpsiXtlWV+CfmFXUHB2ZW90cWpqb11pb2xqZ1dmTVxXRThBNEZDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8qq6imZaeoKWrq5+crbShp5GgoKGnnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhqykh5yRipiol5makYekr6ailZmHiYBpboiIi46NiYqNkYuPkaGKkpyemqGjf5OBj6OhlKB3nJaQp4OjqYCHrLGIpXqNf4SafKJwcpOHlXuejHlth5uLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgcW5fHGVtoxygZukZHWsq2F+ap2zfm5+iYSPg4yYcYCja3Kjcp6BfKNenJmzlXB8l56zdHJbnrKDamJxdHVxaG9YamtxcGRbZ1xhS0M9RDZRQVlxMjxTR19KUj08Mzk1Ojk2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4taytoJqhm6KjpKyamrGsq5OYoZmhpZqalJ6sm4uJkXiLhXGAlYyJkKGQk5Sdl32Rio6ooIeYjomRopObmoyKqKekno+Wh4R+anqGfn2PjYOKj5CJjpOfgZScnpufnouJd5yYoo2gcqGMiamJnaiSmauugq6NfnqgmXmjk3iAc5eHjJx9lJ6Gm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXeFnmiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX2ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE43VUJRbTRKWlpeTlpEQDE1MTw7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11ZZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7Gvq52lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIByepaIi5aWhJKUmI96i4SWpJyJlY+Gip2SnJuIj6iin5qLkIqAgGmAhXl/lot6iI2Oh46VmX2SoZ2foZKXcmifiqCPjHCSjYKpiZqhpaqjq3+wrqSiuJd2o7Oio3+IlHideqmYf6KPn52ZiZhyoH2IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4x5nmNNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs399mZKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUGdEUlZcYVheSUQ9Qjg/QjpJRTdMRVhBV1JbVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbCumoRTX6GntLqysqiaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniUhI+bi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6onJqVioqKfINshIVxgqGLd4SMiIeRmJR6kaKfnaKHrYZ9tYSPnp17ppZ6qYKXn5GMpKGAp2l4bn6Zc6BzcXydhZhvk4Kse6OEp5+bg6RwX6lodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iLdauzqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGima5rTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZfYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSUtCS0U4UEBRTlhTWE9TUWBlZGlTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGdobWiYm3+wrFRdS36qr7G0sLKinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoeFe3B9g2h8j4KTmoF3kY6PinCAho+TkWuYk3yIkZKjlYKNqJmTkoqFiXmDdoiAboGfhnd/kYWGl6CVeJGgopmfiLOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtr4qXi3+MpI2Vg6+jlXe1trbKonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3GbiXSle3p1YoSDbn6gbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15pdmt4hmZrZmJzdG9sVVtSWWhPUWdJVUxYUlVcZ2tuVWdXTUpBSU1LSEpOQVFKUGVjam1ldXNzf3l7bnSJentVUU5tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2Ir6eFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l6B5dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWjJGLgIh6gH2LeXCPoIV5gJSGiJWelH6SpKablZaEZm54nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aBiZSWj7lukIqiYn2ao5eJbnRrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GKl22hb1KIj26gXmSnVItdVJhtbXNrcYFtcGhrd3NqblFWVVVlWFJsSVhPW0hXaGhzallrVlBSRVZcTFhSYVVoal53dXt8cH18coN7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52mmaZ7ZXRtjKeupamwsaWfi3+VqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIqKfJebc3WJfZB8ZYOHlYqJlZqCfIiGlqaQgKGqj4SQioGJfYCAjnNpj6aDfYWSjIeXn42GkailnIimeJWbfqWJloyymZ6RhK+Xn6V6mIl7qXWokYSabqWijJKEjIO8bXylr4KHhYeVmJ6jfqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gZ5mGdKtmnq2MtnN2voykk1mDpo2rYXZydG97dXBian5uZ2xSVFhUYGBcakxcUVtIXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3OEfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqqdgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+MhH6Xk3R1hnKRg25/i5KGhZSPfHuBhZekjX+kpI2AjYmElHWCh5NubIuogIKKk42Im52IipKpop+Pf3STl4h+gXmUr6R/gp1xj4Z5k46GgXtzqY1xfX16l5abhY54e319hpOVk4t3kpqho4V8f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnJvd3hvXGuFbmlmVlleVlxlamNVYFRdUF5vd3lranZkaWpqdXtwcXRzYW90YnR7gXh1eoJ1f4B/gXmLhYJ+e26AbWR5bl5XbmhodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9gjpS5qaeLoaObpqSZpJ2roZ+Dg5apkZ2fiJmmmqiZg4Gci36WlIeOiomNcoJ8jnx+joR7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhI+PhJWCho6Yd3GEqoWNkZuOh52dhoqapp+gq4OIjZSbf36Kl62okJOokXlxn5SFfJVwgKyHcX6VcWpwfYGfi3+RjYpnbV2EjI6dnqGRdJeOinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBbYKKdm1jZWN5g3qVWlxpZ252W3t5d3Vuc3KDZltsiWtrYllYXFlYa3FbXl9ZXVxlcn16dG90YmpqaXt7cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZvdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIeHinF9gIp2hIuBhJaKcm+Ac5iHhH6Tg4OGioJ6gIOKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIWHoKmeoaKji4eSm52jmparoqioopOdiZmRfnqRkIaqf3+TkZKTnbKmmpSejoywkZiEp46Olp2ii5KdhYqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYqIi5GnkYSHjoeCi4+KeYOIhYx/dGqBg3x5mWlyaGFzinF+e3d3cHd0gV1dboZobl9eWVpcU2dxVWNbWmBrZ3R7e3Jub2Nqamh+e2x4fnBob29rZoB7coKAd399f4R7bYOMhXx6eXx9eoR5T2R3a3NucHplbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeCjJqdkoapnYJyio+FkpGLnZF8jXupg42RlpSNm5WFhZqln6KanoaDkpqZmZCZpqCmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZ2TnY6NqIyRgJ+OipWcoYSQmYCIj4RweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyOh5yGhpB2go1+fnRzfIqFfHqOj4WUqJCHhI+BgomIiHOChYWIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcX3B9bXRgY1pbXlBmbFNkWl1gamh0eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2FdnGCjYd+e3t9gHuCi2BpfGt1aGmDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqNhnyKkoOMgoKCbXt+d3KAhX2KkH1raH2Bl4mBiI58foWEh3yPgY+bm5CIppt/cIuKi5KGoKGKhYx8qJCHjpGVkZSRd4yjoKGdlpuAgZCamJONmqKipJuYkpx/kIh7goaRiaOBfo2Nj3yYpKCgkpqQj6WLj4GckoqUmZ2AlJR/iI+CdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqUkYGZgIqNdISKfn9ze3yNhnx7k46El6aUjIaQe4SFhoNzfoCEhXhkcHp/d3lwbGpmXn1zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWdUZFheYGdpdXiBcGZrY2xnZX+Bam19Z21wanx3hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoRudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWino2Xf4yhioiblnh8hoh+hIp+iIKBf3B/enN1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aUhJGJlJWRkHWRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImY+gf4KLjoxzmKOeoJKYjo6gi4uDmJiElJebgJqPfYmOgndyfm57ZIB9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5/lXmOi36CiX59c4F5i4d7hpKLjJmkl4OEi3aHg4GAc3h/hoJzXnZ3fXJ9dmZsZWB/aWp3c3R1fXF8Y2Rhc291cm1hWV9dWmpjUmJXX19nanR4hnBiamJrZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2p5uKmHmXnIuMmZB5fIGMfX2De4CCgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkIKPjpOWkIqAj5egmpKQknOAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqSnHyIiZCJb5idmqKSlYqLnYuGgZOdgJSUl4ibin2KioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiGgY91kouGe4l/d3qCf4iCfoWPh42VpZF5hYJ0iIZ7fnFyfoSAa2B5dHlwe25hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohqX2lkaWNod4dtZmxoaWxngHx6d26PiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2V2Z21sYXpoanx7eHBhd22LgZmZq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8n5ORl5SJd357inx8gHZ4f4Bvc3N6b4V8gICJfnxgW36PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyEj5eRlI2IiIySnZOQjI1uhJCPkYmemaKhmJiKl5NwjJyGaIqbkZZ7iYWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdXN1a3FudX2LdW+GkY6ScnSAfIKCin5nc256f5uVfoaKdpKNg3WKe3GDgIOJfoaOi4aOlquOe4h8foqEdnxubH2CgGFmd3N0bnphXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcH6HZV1paGZiZ3CNbmNoaGVoZ4B6d3RvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t8e3N5g2pqX3BodH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmKOooaebiIuKgY6chpKadH+olJGNh6GNlpSRgXR8doV4eH9yc3qFbHFveGyJdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ2Kj4aSl5aFiJOYjpaLio2OjJ2KjpGDbYmLj5GKnJahnJmWhpmJbIimhWiJoIyTgI2FjIF4lJiSnZGQiIiTjX9+kJl9ko6Rj5uTfYuBhXB2cGxub3B8hmpzg4+Zi3J4gHWCiYN6aHVwd4KbkH2KhnuWk3x4inZyjH2Ij3yMiIWKj5yliXyEdoGKfnd3a2h+f35bcXJxb293Wl5wYXBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFJZZWVhdG+EgWFda2xkYmZrkm5gZmZfZmqBdXFyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4aLgHt3i39qcGN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShYubjJaOjHpyeHSCcHKEdHF1iGxubHRsh3aCfX9tblVRgauUh4J4gHZygnmCoIKQgZKSmJqRmHeQeoKMkqOak46IlJiSg4WVmIqSi4mOj4idhJGLfXKKhYiPiJyZnpuXloGVgGmJn4ppiaOKlIaShIpxg5GYj5qNj4uLjo13e5ORe5CMjpOXjn2JfoJsd2pvbGxte4Bien6Ql4J3e4J4g419eml2bXaIl4yAiYh9lZJze4ZyeY98jI98in+FjpGfoId9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BNW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfW9scXOJfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+iZiSjoSImI6Pj4R3dHdzgHBvhHRwcYNvaml1bYJufHxtdHNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFj52hk5OQiZKak4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR7jndpjJSKboumh5WKmISGY4yRmI6UiZaLjImLcHqVinyOiYuUkot7h32AbXxlc29rbXt6W4F6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cWtkbnyAaWdzbmdpc2xTXm9lcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19ddE9NS19lYlt3cIlzXFtkdWBiZWWOY2BmYlhpc3Nta3F2i3xzeYaCdnd+i3OAh396iX9yiYeBkImJfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSdkI6FjJeEk4+IgXV3cHlxb4RwbW1+cmNkd3B8bXl8amhsY6Sawdyu76JzbHaDdYShhJBulY+Vn5OagJFwhYqhlomOlYqQnJWCgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQd4x3cIqLjoCNp4eUi56Ghl6LlJeKjoiNioqEiWx8l4N+iYaLk5CHd4d/f2x9ZHh1am96dFiJe5KIhnt/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJwZHJ2f19ybG9haHRmUmBxZ2tVX25zeWFyY2BpfnFzbltjc2FjVm5aW3ZMTEtiZWBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3aEgXh4fIlxg4V9fYh7dIuIh5WFjH9/mHNodXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn42OfJaNf5qIhXxzd3Bzam+BbGpsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaJmYiMaJePj5uUkoGIcIWIn42Fi5WKjJeTe4ySh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjXaIf3GIhYyKnaWGl46ghIphhJWPhoiFiIyGgIdofZSAfoOFi4+Pg3KIgIByd2h2cml1d2xajX2Tg4Z+gYSBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIpucXmLhXRqb2lvdX5dcmhtXGl0X1JkcWlmU19xdnRgcGBdaIRxc2pXZ2lkaVdtV1tzS0lLZGVdYXFyhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgX57dnqIc4WEfH+HdnaJhY+YgYyCfJR2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp9ipmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3twkpCMhWmYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hYh5hoOOlqCiiZiSoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag46QkX9uhH6EdWxtd3V0eHZrY46Cj4GGf32FgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaXh6YGdpaVhrdVlSaXJpYlFicnhtYmVeWmqEbnRiXGhgZW1eblRabU1HTmVjW2ZtcH9rWVticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYCSlXyJhneJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYePhIqNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXB+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot7ioZ8eomLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEc4GKd4d/jJygnImWj56BiWZ9k4J/hYKIiHGBfWZ+jHx5f4CJjZB+aoF+hXZmcHl4dHh0bGqPhouCi4F5g4GFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV7dGJbcGJXbnFTU25zaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBQWWpRRFJmYFlqbWx7bllbXWxiWmJvdmRnXF1ga2lja2pzdoGCcG5+fIB0dYN6g4N9gYV2fYiBlpB4hIt1gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraneEc2yTjYafmZ+ZhYdufYt1aXeWjX6AiYOVl4p6kJZve3Rxa2pkYHN6aF9lcXpaYXJ8eWdweWFlZI+xsndLYlql2dCWcXqQio93fJOKhJiQi4Vua4WRkXp5koaBhJiJe4Z/d3eJioSWgG+LiHF1fntqeYWDpZCDk42EgHCAhXiGfImfnJiOlpKWhYhwe5OCfYKCiIJtgXZogIV5coCBhYuIfWZ+f4V2ZHFzgGl5cHB1mY6Gg4t9d3mBhHqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Zoe29eWHZaV3BsTldxc2dgS2x3dGFeXFtadX5zcFhnXmdqcWBvTldnUT5YZV1ZbmpneXBaWlhqZVljcHhfZ1xeZWxnZmtpcXd/h25sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb2+BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmImBfI6NaHhza2tmX2BveG1fYm94XGRrgnpgcXVfZWXU6r2LMjo+i45/cXmFh42MdYKWjH6SjYt+bWuEjIx1fY9/hIGUiHuCd211hoSDl3duiIVsdXt1ZnmBg6aLgo+LhH5ugXZ5hn2JoJOPk5SVjoyHf3uShnh/g4yCa39xaIB+eW58fIOLhHhieoWCcmVyaX9udXJ1gpyMgYCGgHR2f4F0gnBbboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bmp2gH90c1tnZ3VuV1Z8U1lvZEtacnJlW0lxeG9cW1tZXXV/dGlaYltoZm9jak1XZVA9XWVcXHVlYHRvWlhUbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9goCCenWCgI2ThHCAi254foB7e4iTin9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZnJuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9rhIKHdHmJeIh8kod5fnJmdYh+fphvcYd/aXZ5bmZ5h4SkhoCHjIp/b4B4goSAkJyKhZeTmoqMhYl8kIhxe32Ee2h+bGqAe3pqe3eDiIFzYHiCf3Jlc2d2g251fIaWkoJ9g4FweHp8dYBtWHCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bb1tOW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXWJoa2dtbGhwd3ySa2iEin18b35+fIKAgXp3gH+Ki4NxfIdvcniDf3uJjI+Dan17bXZ4dop2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZl9wb19gZ29mam6JdGF0b1thZGp1eoC/nKakyLhxhYJyknt3hZKCc5CLh3Jyb4N6g3N0h3SHd5OHeHlwYnaHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOBdYd8g5aThnuZkJeQiIKJe4mJa3h5fnRnemhrf3lzaXp3gYR+aGB4iX5sa3RofIFpdoKMkpV/fH+AcXx3fHSAYlZ4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353j4aEd2pxaGyHgXFvXGZgcWxJZHVLXW1VU1lzbmJRT3R4YVJYWF1hcINzXGJcaWVlZGtkUVtwSUNjYFtjb11deGdUVlV2XltlbmhWa11gamdlbm5ocHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDb3eEcm53goJ+iIuTf3CAfHd4eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGRZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3N9dn9vcX9thHOThXh0a2B5gnmJj2ZyhHBodW5bbX1/kJJ/gHiRk355fG+KeISUjod3mY2TkIiGhXyAhW10dX5sZnZkbXt2bmt3d4CAfWFjeYd6aXZ2Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1phV1ZVeG1iUFJ0dlhQVlheYHKEb11hY21lZF5vY1RccUZCZV5dZWddW3piUVVbdFtaZ2tgVmpeYG9mZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgYmNi3t3gHiCe3yFh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIWDdIWGhHiKe2JubFtiW1tgVmlzYmBbZ25vZodyYXFlV1xia398ys6HuaFqbW2Ja3GDcXuDiX56kIR5eHN4dHR7amx1YoN1kYF2bmZffYJ6jIplcoJranFjWGx6hJuIgYFylpV3f31wi3OFjY+KdJqQkomGi4N7eX5xcG98ZGdwYW14cWttcXh+fnpdZnuBeGp2eWaDd2h0iIyOln5ziWtvfoJ5b31eWXSAbXSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3JhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hWldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZG9ZWmpoXVdnYF9yZmpocmdwc3eGeG6Vi3R/end+eoOIf3Vyf4eFjoJwcHx4dnZ6hYWHjIZ6e390in19hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1pcXVRnc2RgWGRxcmeAcmJrZFZaX2p/eL6ue5+2bWFzhGdzenF4gYV6fYt+d3dydW97dmVqbmCGdY6Ac2lhXn55eYuEZnF/aGtrWlZvd4migIR/cJmTcoF6d4VwhYWVi3aYi46JhYmFfXl0cm9oeF9pbGBtdmtoa2t5eHt3W2d+fXlmc35thXVldYaOhpeAcY1oa3uEdW52Y11yfmx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh8aGFOVXVrTFBUVV9ndoNnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1pWV1rZFxZZGJedGZsZHFncnB1gXdwmYZ2f353f32Fh311c4KIgJSCbnN5e3p0c4SGiYmDeYF+dY5+fISKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkn9yjoFxhoJ/g4BwZmxmV11bXFpTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeXxoc3VzcoGDd4CCeHZydW1qenFhZ2tmhnONg21mXV99cHuJf2lteGdqZFVXcm+MpXyEe3aWkXR9dH59cH9+lIh5m36Jh4OHg311cHFsZ3Rba2debHRkaGZpem98clpogXd1aXGBeIJ3YneGi3yVgnCNa257g3JndGZhb3tnc3iKfH5jd4R3a2xydnxyfHt1f2h/gIB5d29kZmJthXtsalVoYW9SSmhpT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFlea2BbWmNkX3ZmbWJwaXRvcn91dJmCd3+Ad39/hoR6fXWChH6XhW1ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Bd3ujpYp5h4WDa3R7enWCgIt5boRzeYR9goN2b2poZVZdW1pZU2JuZFtYYXN7amhsaWBiWF5aaX9pa3CAZ2xgZ3l3aXJzc2yDgHl+e3V0bXpnaXlqX2VuaIB2j4RmZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJODe5d2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanlofG1bboNzdWtwgX56eGF3hoV5kYZ0iXJxeoFzY3JqXXB4ZXJ0iHx5Y3SBcWdqenVzbXp5dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4e2ZfbnFqZF1WYVVublZKU2dXZV1YTVVrVElbeF5bX2tdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR/end0hIiRfYF8kWtylYB7gp+Ffod9gH6GgoCJe3eEq55/eoeHgmpygHl1gH6AdG6Gbn2Ac4qAam9tZGRZX1pZWVRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGp2dGZzdnFrg3p9fHh1cmx5Zml3Zl1kcmd5d5KAYmJUZXBogoV4eGdpamFXVllnYo6nb353gIuOe3Fyf2l7cX2Pf3mRc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXtoXnWBb3Jrcnx+dXZidYaMe4mIgoF5c3aAdmJxbltydGNxcoV8dWVzgG1hbXtxa2p8e3ZzZ4d3e3p2cWViZG1yfWlqU2ddXFRLcWFQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RaWF1Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sW15cYWNefmlqYG90eG1wb3aDmHpygIB8f4mMhn12doZ4h4x8c3V1gnl7eoKMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXWVWWVlWY2ZrX11cc4VoWHBuWl5YWltremJwd3ZsYVlscnJmdHVva4N3fn94dm1uc2RodGVbZ3RldXaReV5cUmZna4OCdH5iZGpcVFddYWKOpGl4c4OGkXlucXxqem9/iX53i3SCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2N6ZVx4fWxvb3B4eXR1ZXOEk4CHhIp8eHBzfnRjeGVccXFicXKBfHRnc4FlX253amVoe311b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVNsU0pOWldqbHJ8ZG1tc2NhWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbXmFiXYRpaGFueHltcGt2gJB5bYJ+gIGTiISBdnSJdIyGdHF2dYJ4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cJmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNxbltaWFdfa3ZkaXVqaV5ZbHJva3NzcmiEfH5/e3ZubWtkaXBjW2tyZHR2jnNaVlRlYXKAf3KCXWJjXVNZYFtjkJ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlheGFcfHZqa3JveHRzdWlxgpaEh4CFd3Rrcn5vZ3hYXWxuY3JzgHp0Z3B+XGBxc2Nha3OAbW52f3NyeGtwYVxlbGx6YGZSZVRXUU91WlBPWFFIY3NhYEZValFKUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp9dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnRuYWdla1JdW1VnYWxrWlxxjGRPb21cVldUZmlzaGJ0ZWRcWG10bG91dHhqhXx/e4d2j3NjZGtuYFxtbWNzeIdrWVRWY2R4fX1xhl1kX2NUWl9YYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzaHB/cXRwVFxna2ZxdIB2c2Ntd1Zjc2xcYHBof2dueH5zc3NqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2BFV2lPSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3VaX2VraVlhYF1ejm5iZmt5dm5vaXV2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jj3+Mk3J8ipGEh5+Ge3+GjXSBhnN+gnZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R7bGJmZ2hTX15VZ19rb1tebo1oTWlsYFVWU25mc2tleGVkXFhvc2txendya4d6f3acenlrYWVsbV5gbmplcXh+Z1lWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbn1rdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKfIlucmdxfm50bmRbYWlpb3SAdHJfaW1TZXJlVmRwZHxlc3h9d2twbWtgWWFmZ3RcZFVgVVJOV2RRTltOT0hkb1xiRllpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2c3uDcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5KElo95fYyPh5GbhIB8jYVzgIFzdHhzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dlkKGgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX12QpaOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiY6PkJCPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOPiI2Mjo+Ij5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqHjouHjYeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSMi4aPhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/f39+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gYB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJQUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU5NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUtPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9PTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRVFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FBQUBCQT87Pjw+Pz88ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+BgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH9+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUNEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJEQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFR0ZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+AgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVWyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4eIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhEQkA1Nzg4PTo8REJERkZEVniEhIKCg4OFiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQT88OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjXo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs7PTo+PDo8Ozw8PTs6Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ojs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg5Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYWGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4+Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4eIiImIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpJREpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW9xdXd4eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT1AQkNETG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0tKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkNEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5PUHmGhYeGhYaHiIiIiIiIiIiIiIiIiYiUnIyKiox9YYqLi4dsW2RVOlhYWFNRPkBWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWllXV1d6a1haXFxeU1BQT0lOT1dWWFpaZXF0d3Z0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lSTk9RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZFRkZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt6e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz89PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8enx7fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fXx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEVDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fX19fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkVQUFVZU1RPSk5PVVNTXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05NTFBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RQT1BPUU5RT1BPTEpMTE9QTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDP0JFREFAR0hHSEZGSEpNTERHQ09SQzhFTVNdZ1NRU0FHVU9PUVBQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NPT09MTU9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CRD49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NVktMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8endzeHR4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEE9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BSUEtHQ0tIQ0NLSkxOT05JSklHRENDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWdubGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUlIS0lHSFBLREpOTFBOT05PUE9KSklNUlVVUk9YZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISEhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFR0FCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlXWV5bXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QEI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlJPTVFXWlZaWVdbXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhLSENJSEdJR0ZESEtJR0pITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWl1gX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREdERURGRkhIRkhHSUtKRUpISEtIRUZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBfYWBiZl1kYGZoYGVpamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIREZFSUhGSUhKTUhISkpJTEpFSktISUpKR0tKTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlFQ0dJR0dKRklMSElKTUtNTEZLSUhLS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUtMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhJSUdISkZES0pHSEpISUtHSkpOS05MSUxIS0xKWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSkpKRkI/QEM/PERERkRDQ0NFRURGQkVGR0RESkVFSUtLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTUxbc2Jkb11sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURCSEhHRERLSEdLTU1KTExGSk5ISktKSUtKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBdYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3Vob11gc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEpISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGpPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN0dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW11cG5zc3Z0SUtISkNEREVAQD1DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklISUtJS0pJSUtMTU1MSUtLSlNrYllpXl5pYnJyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpJS0tMSklKTE1TW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVHSUpISUpITEpJR0hISkhISEVFS0hISk5LSE9cVl1PXVxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0dFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKVF9ZX1hgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZEREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZDR0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhJR0BHRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNFS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRUBFQkhIQUBGRUNTXVleWF9YX1tdVVhYUF1cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNWYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgXmJjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5MTklMQkVBQ0NGQ0JAQ0Q/TEdDTExPT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVlYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9MVm5ZS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVNUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHJ6fX1+gYOEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdJTVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlFxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoODgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPSE5QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUlJUWVdXUVRQUFBSTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBZYFpYS1RXUGFeUlZRWVNNUEpTVFZYV1dQVVBPTlJKTHJvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NtYF1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFKTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHdeWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JrZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhaWlRRUldbV1dXW09SVFdXWFFdWFZcVVRPWFJXWFhZWmBcaHNfXFtZXF1fY1pfZGRlZ2RkY2JaZGJnZmZtbm11ZmZnY2BmXl1nYGRsZ2Vna2hwemhnZ2t1amhoaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVFQUFBTVVJYV1xXUlJQUVVVVlNaUU5SUldUU1hVU1hUU1FVVFVWWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE1RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVWU1haW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVZZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1lbWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTU5RVFZVUlJSVFdVWl1cWlZWUVJXWFVbW1ZQU1VVVFVYU1dYVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFtiXF5dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SUk9MUFNSVVtVVFBQTE9XVVBWUlNSWE1PUFJVWFVUVFJUWFhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOUldVUlJUUVJZT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjXlxiYWJfZGdpZWdeXGRgYWBhY2RfYl9aWl5bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTlZRUlpSVFVUWF1XWFhTV1xYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW1+bFtVWlZRUVRcVFRUVVRWWVdMUlpWXFtcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllZWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5eZGNgXGdlaGZlYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntpWVlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVNXUVNWVFhYWF5eWF1bVl1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV9gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1cGlaXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFRVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxhWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoX11dW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZWllaWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFhcW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXV1dWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYWFxcX11gX11bYGRcXFhaYmVjYVJcWU9YVlhZWFlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYmNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXW1xbW1lbW2NgY2NjYGJkYWBjXmBcXl5eWVhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNpaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlZNWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PYWiUrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5etUExsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXp6eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDhHdzc3Nzc3J8hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z5fHp6eXl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9enp7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eX14fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX15fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5enp5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKAgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYGBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/fn5+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoOEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISBgoKCgYGCgoGBf4CBg4GAgIB/gIKCgoODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIKAgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SDhYOBgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGCgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgICBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4SDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4KCgoGAgYCAgICAgICAf4CAgICFhYaFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4iFg4KAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/gICBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SFhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aGhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn58fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX5+e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgICAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH19fHx+foqCe3p7enh6e3p8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUkYuMjI2PioaGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fXp8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p7fX1/hoSCgICBfX59fn99i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fH5/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+LioqMi4qIhISFg4SDg4OCgoKCgoKCgoGBgYCCgoGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5+f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjYuKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCMioiIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeHi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+EgoSIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYmHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6AfX1+foCAfoF+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt7enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoWEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYGEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgYKDgYKCgYCBgXyAf36AfX59fn+AgIB/fn9+fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B+fX18f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn9+fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t4enp3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoCBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+eoGRi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAfn99foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoKBgH+AgoOCgIKChYN/gIB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAf4KChIGBgoKEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoKBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX5/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgoGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBfn+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4F/gIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0fnZ1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgX+Bg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBfoGEhIODgoR/gYSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYSDg4OCg3+BhYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4CEg4B/fn1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fX59foKDgXx/gX1+gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWEgoWGhIWFg4KDhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIiIWDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3prc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX17fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXt8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fH5+fHx8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eGhoeGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn99f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFhoWFh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYB/gYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXl6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHh4iIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeGhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKDhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoODgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p5enp5e3p6enp6enp7fHl7fXx8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYWFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnt9gX+Ag359gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzExMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2RhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDY5IEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2CisyODAgMSA2NDAwMAorMjgzIDEgODUzMzMKKzMxNyAxIDEwNjY2NgorMzE4IDEgMTI4MDAwCiszMjEgMSAxNDkzMzMKKzMxMyAxIDE3MDY2NgorMzEyIDEgMTkyMDAwCiszMTcgMSAyMTMzMzMKKzMzMCAxIDIzNDY2NgorMzUwIDEgMjU2MDAwCiszNTUgMSAyNzczMzMKKzMzMyAxIDI5ODY2NgorMzI1IDEgMzIwMDAwCiszNzYgMSAzNDEzMzMKKzMzNSAxIDM2MjY2NgorMzUxIDEgMzg0MDAwCiszNTAgMSA0MDUzMzMKKzMzOSAxIDQyNjY2NgorMzI5IDEgNDQ4MDAwCiszNTAgMSA0NjkzMzMKKzMzMCAxIDQ5MDY2NgorMzU5IDEgNTEyMDAwCiszMTYgMSA1MzMzMzMKKzM0NSAxIDU1NDY2NgorMzU3IDEgNTc2MDAwCiszMjUgMSA1OTczMzMKKzMzNiAxIDYxODY2NgorMzM5IDEgNjQwMDAwCiszMTIgMSA2NjEzMzMKKzM1MCAxIDY4MjY2NgorMzM4IDEgNzA0MDAwCiszNTMgMSA3MjUzMzMKKzM0MCAxIDc0NjY2NgorMzMyIDEgNzY4MDAwCiszNDAgMSA3ODkzMzMKKzMzOSAxIDgxMDY2NgorMzMzIDEgODMyMDAwCiszMzMgMSA4NTMzMzMKKzM0NSAxIDg3NDY2NgorMzQwIDEgODk2MDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmFmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsNDQzIEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2Cis1NjMgMSA2NDAwMAorNjM1IDEgMTA2NjY2Cis2MzQgMSAxNDkzMzMKKzYyOSAxIDE5MjAwMAorNjgwIDEgMjM0NjY2Cis2ODggMSAyNzczMzMKKzEwMzYgMSAzMjAwMDAKKzEwNDAgMSAzODQwMDAKKzEwMDkgMSA0NDgwMDAKKzEwMjAgMSA1MTIwMDAKKzEzNTcgMSA1NzYwMDAKKzEzNTMgMSA2NjEzMzMKKzEzNTEgMSA3NDY2NjYKKzEzNTEgMSA4MzIwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODI1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE2MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTQgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorNDEgMSA0MDAwMAorNDEgMSA2MDAwMAorNDEgMSA4MDAwMAorNDEgMSAxMDAwMDAKKzQxIDEgMTIwMDAwCis0MSAxIDE0MDAwMAorNDEgMSAxNjAwMDAKKzQxIDEgMTgwMDAwCis0MSAxIDIwMDAwMAorNDEgMSAyMjAwMDAKKzQxIDEgMjQwMDAwCis0MSAxIDI2MDAwMAorNDEgMSAyODAwMDAKKzQxIDEgMzAwMDAwCis0MSAxIDMyMDAwMAorNDEgMSAzNDAwMDAKKzQxIDEgMzYwMDAwCis0MSAxIDM4MDAwMAorNDEgMSA0MDAwMDAKKzQxIDEgNDIwMDAwCis0MSAxIDQ0MDAwMAorNDEgMSA0NjAwMDAKKzQxIDEgNDgwMDAwCis0MSAxIDUwMDAwMAorNDEgMSA1MjAwMDAKKzQxIDEgNTQwMDAwCis0MSAxIDU2MDAwMAorNDEgMSA1ODAwMDAKKzQxIDEgNjAwMDAwCis0MSAxIDYyMDAwMAorNDEgMSA2NDAwMDAKKzQxIDEgNjYwMDAwCis0MSAxIDY4MDAwMAorNDEgMSA3MDAwMDAKKzQxIDEgNzIwMDAwCis0MSAxIDc0MDAwMAorNDEgMSA3NjAwMDAKKzQxIDEgNzgwMDAwCis0MSAxIDgwMDAwMAorNDEgMSA4MjAwMDAKKzQxIDEgODQwMDAwCis0MSAxIDg2MDAwMAorNDEgMSA4ODAwMDAKKzQxIDEgOTAwMDAwCis0MSAxIDkyMDAwMAorNDEgMSA5NDAwMDAKKzQxIDEgOTYwMDAwCis0MSAxIDk4MDAwMAorNDEgMSAxMDAwMDAwCis0MSAxIDEwMjAwMDAKKzQxIDEgMTA0MDAwMAorNDEgMSAxMDYwMDAwCis0MSAxIDEwODAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NjAgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorODIgMSA0MDAwMAorODIgMSA4MDAwMAorODIgMSAxMjAwMDAKKzgyIDEgMTYwMDAwCis4MiAxIDIwMDAwMAorODIgMSAyNDAwMDAKKzgyIDEgMjgwMDAwCis4MiAxIDMyMDAwMAorODIgMSAzNjAwMDAKKzEyMyAxIDQwMDAwMAorMTIzIDEgNDYwMDAwCisxMjMgMSA1MjAwMDAKKzEyMyAxIDU4MDAwMAorMTIzIDEgNjQwMDAwCisxNjQgMSA3MDAwMDAKKzE2NCAxIDc4MDAwMAorMTY0IDEgODYwMDAwCisxNjQgMSA5NDAwMDAKKzE2NCAxIDEwMjAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzYwMjcgMSAwCis2ODc5IDAgMzMwMDAKKzUgMCA2NjAwMAorNTMyIDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNDU4IDAgMTY2MDAwCis1IDAgMjAwMDAwCis0NzUgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEyNjIgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1NCAwIDM2NjAwMAorMjcgMCA0MDAwMDAKKzY5NzEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzYwMSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzI3NiAwIDU2NjAwMAorNSAwIDYwMDAwMAorNjU4IDAgNjMzMDAwCis1IDAgNjY2MDAwCisxNjgwIDAgNzAwMDAwCis1IDAgNzMzMDAwCis2MTAgMCA3NjYwMDAKKzI0IDAgODAwMDAwCis2NzI4IDAgODMzMDAwCis1IDAgODY2MDAwCis3NjQgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI2NTYgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0NjIgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTQ1OSAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis2MDggMCAxMTY2MDAwCisyNCAwIDEyMDAwMDAKKzcwMzggMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNzIxIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMxMDIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNzUyIDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MTUgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNzU1IDAgMTU2NjAwMAorMjUgMCAxNjAwMDAwCis3NjU3IDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzg1MiAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszNTM3IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzY3MyAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxNzc0IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU1NCAwIDE5NjYwMDAKKzI0IDAgMjAwMDAwMAorODAyOCAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis3MTUgMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzM5NSAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis3MzYgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTc1OSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis2MDUgMCAyMzY2MDAwCisyMyAwIDI0MDAwMDAKKzc2NTEgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNjE5IDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI3ODggMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNTU2IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEzMzUgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNTIxIDAgMjc2NjAwMAorMjQgMCAyODAwMDAwCisyMjc0IDAgMjgzMzAwMAorNjc2IDAgMjg2NjAwMAorMjUgMCAyOTAwMDAwCis2MjI0IDAgMjkzMzAwMAorNTc5OCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0NDggMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk1MCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTIxOCAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMzE2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzU4MCAwIDMzNjYwMDAKKzI2IDAgMzQwMDAwMAorNjY3MyAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0NzMgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjQ2NyAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCis0MjkgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTQyMCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1ODMgMCAzNzY2MDAwCisyOSAwIDM4MDAwMDAKKzg0OTIgMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNzIwIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzM2MzUgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNjIxIDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE5NjkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNDkgMCA0MTY2MDAwCisyNSAwIDQyMDAwMDAKKzc0MTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorOTQ3IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzM3MTMgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNzE0IDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzIwMDMgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNzUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis4NDcwIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzczNyAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCis0MDk0IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzEwMTkgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMjE2MCAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis4MjggMCA0OTY2MDAwCisyNCAwIDUwMDAwMDAKKzkyODIgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNjU1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzM0OTEgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNjUxIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE5MDYgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNjYyIDAgNTM2NjAwMAorMjQgMCA1NDAwMDAwCis5NzI0IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzYxNyAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwCiszMTQ1IDAgNTU2NjAwMAorNSAwIDU2MDAwMDAKKzU3OCAwIDU2MzMwMDAKKzUgMCA1NjY2MDAwCisxNTkyIDAgNTcwMDAwMAorNSAwIDU3MzMwMDAKKzU2OSAwIDU3NjYwMDAKKzI1IDAgNTgwMDAwMAorMTAwMTUgMCA1ODMzMDAwCis1IDAgNTg2NjAwMAorNjA5IDAgNTkwMDAwMAorNSAwIDU5MzMwMDAKKzM2MTggMCA1OTY2MDAwCis1IDAgNjAwMDAwMAorNzM0IDAgNjAzMzAwMAorNSAwIDYwNjYwMDAKKzE3NDggMCA2MTAwMDAwCis1IDAgNjEzMzAwMAorNTUwIDAgNjE2NjAwMAorMjQgMCA2MjAwMDAwCis4ODA2IDAgNjIzMzAwMAorNSAwIDYyNjYwMDAKKzQ5OCAwIDYzMDAwMDAKKzUgMCA2MzMzMDAwCisyOTEzIDAgNjM2NjAwMAorNSAwIDY0MDAwMDAKKzU5NyAwIDY0MzMwMDAKKzUgMCA2NDY2MDAwCisxMjM1IDAgNjUwMDAwMAorNSAwIDY1MzMwMDAKKzM2MiAwIDY1NjYwMDAKKzI0IDAgNjYwMDAwMAorNjU5MiAwIDY2MzMwMDAKKzUgMCA2NjY2MDAwCis0NjggMCA2NzAwMDAwCis1IDAgNjczMzAwMAorMTkyMCAwIDY3NjYwMDAKKzUgMCA2ODAwMDAwCis0MTkgMCA2ODMzMDAwCis1IDAgNjg2NjAwMAorODQzIDAgNjkwMDAwMAorNSAwIDY5MzMwMDAKKzIzNyAwIDY5NjYwMDAKKzI0IDAgNzAwMDAwMAorMjY4NyAwIDcwMzMwMDAKKzUgMCA3MDY2MDAwCiszOTkgMCA3MTAwMDAwCis1IDAgNzEzMzAwMAorMjAwIDAgNzE2NjAwMAorMTQzIDAgNzIwMDAwMAorMjUgMCA3MjMzMDAwCisxMjYwMyAwIDcyNjYwMDAKKzExMzkgMCA3MzAwMDAwCis1IDAgNzMzMzAwMAorNTYgMCA3MzY2MDAwCis1IDAgNzQwMDAwMAorMjczIDAgNzQzMzAwMAorNSAwIDc0NjYwMDAKKzQ4IDAgNzUwMDAwMAorNSAwIDc1MzMwMDAKKzEwMiAwIDc1NjYwMDAKKzUgMCA3NjAwMDAwCiszOSAwIDc2MzMwMDAKKzI0IDAgNzY2NjAwMAorMzYzNSAwIDc3MDAwMDAKKzUgMCA3NzMzMDAwCis0NiAwIDc3NjYwMDAKKzUgMCA3ODAwMDAwCis2NDcgMCA3ODMzMDAwCis1IDAgNzg2NjAwMAorNjEgMCA3OTAwMDAwCis1IDAgNzkzMzAwMAorODI0IDAgNzk2NjAwMAorNSAwIDgwMDAwMDAKKzY5MSAwIDgwMzMwMDAKKzI3IDAgODA2NjAwMAorNDU3MyAwIDgxMDAwMDAKKzUgMCA4MTMzMDAwCis0NzMgMCA4MTY2MDAwCis1IDAgODIwMDAwMAorMTYzNyAwIDgyMzMwMDAKKzUgMCA4MjY2MDAwCis0NTEgMCA4MzAwMDAwCis1IDAgODMzMzAwMAorOTY5IDAgODM2NjAwMAorNSAwIDg0MDAwMDAKKzIzNCAwIDg0MzMwMDAKKzI0IDAgODQ2NjAwMAorMzM2MSAwIDg1MDAwMDAKKzUgMCA4NTMzMDAwCisxNjggMCA4NTY2MDAwCis1IDAgODYwMDAwMAorNjYyIDAgODYzMzAwMAorNSAwIDg2NjYwMDAKKzEyOSAwIDg3MDAwMDAKKzUgMCA4NzMzMDAwCis0NDMgMCA4NzY2MDAwCis1IDAgODgwMDAwMAorMTgzIDAgODgzMzAwMAorMjMgMCA4ODY2MDAwCisyNzY5IDAgODkwMDAwMAorNSAwIDg5MzMwMDAKKzE4MiAwIDg5NjYwMDAKKzUgMCA5MDAwMDAwCis4OTAgMCA5MDMzMDAwCis1IDAgOTA2NjAwMAorMTcxIDAgOTEwMDAwMAorNSAwIDkxMzMwMDAKKzU5OSAwIDkxNjYwMDAKKzUgMCA5MjAwMDAwCisyMzYgMCA5MjMzMDAwCisyMyAwIDkyNjYwMDAKKzIzMTYgMCA5MzAwMDAwCis1IDAgOTMzMzAwMAorMzMzIDAgOTM2NjAwMAorNSAwIDk0MDAwMDAKKzc1OSAwIDk0MzMwMDAKKzUgMCA5NDY2MDAwCisyMTAgMCA5NTAwMDAwCis1IDAgOTUzMzAwMAorMzI0IDAgOTU2NjAwMAorNSAwIDk2MDAwMDAKKzk4IDAgOTYzMzAwMAorMjMgMCA5NjY2MDAwCisxMTA3IDAgOTcwMDAwMAorNSAwIDk3MzMwMDAKKzQyIDAgOTc2NjAwMAorNSAwIDk4MDAwMDAKKzE0NSAwIDk4MzMwMDAKKzUgMCA5ODY2MDAwCisxMDkgMCA5OTAwMDAwCis4OSAwIDk5MzMwMDAKKzI0IDAgOTk2NjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliYWNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTc4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCkBAIC0wLDAgKzEsMTY3IEBACisxMjU3MSAxIDAKKzk4ODEgMCAzMzAwMAorNSAwIDY2MDAwCis1NDQgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI2NDIgMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzUzMSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTM1OSAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTUxIDAgMzY2MDAwCisyOCAwIDQwMDAwMAorMTA3OTEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzY1NSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzc2OSAwIDU2NjAwMAorNSAwIDYwMDAwMAorNzExIDAgNjMzMDAwCis1IDAgNjY2MDAwCisyMDA0IDAgNzAwMDAwCis1IDAgNzMzMDAwCis2NTcgMCA3NjYwMDAKKzI2IDAgODAwMDAwCis4OTY5IDAgODMzMDAwCis1IDAgODY2MDAwCis2MzAgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI3ODcgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0MDQgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTUxOCAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis0OTMgMCAxMTY2MDAwCisyNiAwIDEyMDAwMDAKKzk5MDAgMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNjIwIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMwNzIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNjY4IDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MjEgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNjgyIDAgMTU2NjAwMAorMjYgMCAxNjAwMDAwCis5NTYwIDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzY2NyAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszMjQ5IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzU4OSAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxODE2IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU0OCAwIDE5NjYwMDAKKzI2IDAgMjAwMDAwMAorOTkxNiAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis2MjggMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzAzNCAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis1OTAgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTU4MSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis1MjQgMCAyMzY2MDAwCisyNiAwIDI0MDAwMDAKKzgxODIgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNTUyIDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI0MTIgMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNDg5IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEyMjcgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNDMyIDAgMjc2NjAwMAorMjYgMCAyODAwMDAwCisyMDE3IDAgMjgzMzAwMAorNTE2IDAgMjg2NjAwMAorMjYgMCAyOTAwMDAwCisxNjYxOSAwIDI5MzMwMDAKKzY3MTAgMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDI1IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NjQgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzExMjkgMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTE1NiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis0ODYgMCAzMzY2MDAwCisyOCAwIDM0MDAwMDAKKzEwMzA0IDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQxMiAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNjA4IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzM5NyAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNTE0IDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzUzMyAwIDM3NjYwMDAKKzI2IDAgMzgwMDAwMAorMTE2OTggMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNTQyIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzMzMzQgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNTQ3IDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE4MDkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNTUgMCA0MTY2MDAwCisyNiAwIDQyMDAwMDAKKzk0OTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorNjU4IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzMyMzIgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNjAwIDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzE3NjYgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNTUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis5OTUxIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzYyNCAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCiszNjE3IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzY0NCAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisxODQxIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzY0OSAwIDQ5NjYwMDAKKzI1IDAgNTAwMDAwMAorOTkwMSAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis1MTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMjgxNCAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis1MTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTUyMSAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis1MDkgMCA1MzY2MDAwCisyNiAwIDU0MDAwMDAKKzEwNTc5IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzU3NSAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTYzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MiBAQAorMjggMzIgMAorMTAgMzIgMAorNDc4MCAxIDMzMzMzCis5NjAgMCAxMDAwMDAKKzQ4MCAwIDY2NjY2CisyNDYgMCA1MDAwMAorMjY0IDAgODMzMzMKKzExNjAgMCAxNjY2NjYKKzQwNCAwIDEzMzMzMworMjM3IDAgMTE2NjY2CisxOTMgMCAxNTAwMDAKKzkzNiAwIDIzMzMzMworMzg0IDAgMjAwMDAwCisxOTkgMCAxODMzMzMKKzI3NSAwIDIxNjY2NgorMTA4NiAwIDMwMDAwMAorNTIwIDAgMjY2NjY2CiszMDEgMCAyNTAwMDAKKzI3MCAwIDI4MzMzMworMTIzMiAwIDM2NjY2NgorNTU5IDAgMzMzMzMzCisyODcgMCAzMTY2NjYKKzI3NCAwIDM1MDAwMAorMTA4NCAwIDQzMzMzMworNDg1IDAgNDAwMDAwCiszMDcgMCAzODMzMzMKKzI4NCAwIDQxNjY2NgorMTA1MiAwIDUwMDAwMAorNTA0IDAgNDY2NjY2CisyOTggMCA0NTAwMDAKKzMyNyAwIDQ4MzMzMworMTE4OSAwIDU2NjY2NgorMzU4IDAgNTMzMzMzCisxNzIgMCA1MTY2NjYKKzE4NSAwIDU1MDAwMAorMTExNSAwIDYzMzMzMworNDYzIDAgNjAwMDAwCisyMTggMCA1ODMzMzMKKzI1NSAwIDYxNjY2NgorMTE1NSAwIDcwMDAwMAorNjIyIDAgNjY2NjY2CiszNTYgMCA2NTAwMDAKKzM0MSAwIDY4MzMzMworMTI0MCAwIDc2NjY2NgorNjEwIDAgNzMzMzMzCiszNDEgMCA3MTY2NjYKKzM4MCAwIDc1MDAwMAorMTMyNiAwIDgzMzMzMworNjIwIDAgODAwMDAwCiszOTYgMCA3ODMzMzMKKzM1MyAwIDgxNjY2NgorMTE5NiAwIDkwMDAwMAorNjIzIDAgODY2NjY2CiszNzUgMCA4NTAwMDAKKzM2MiAwIDg4MzMzMworMTE5MiAwIDk2NjY2NgorNjU0IDAgOTMzMzMzCiszNTkgMCA5MTY2NjYKKzM1MiAwIDk1MDAwMAorODI4IDAgMTAxNjY2NgorNDM2IDAgOTgzMzMzCis0MDEgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YzY4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmM2I5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MiBAQAorMjkgMzIgMAorOSAzMiAwCiszODQ2OSAxIDY2NjY2CiszMjcwIDAgMjAwMDAwCis0NDMgMCAxMzMzMzMKKzI0NiAwIDEwMDAwMAorMjE0IDAgMTY2NjY2CisyMjgwIDAgMzAwMDAwCiszNjggMCAyMzMzMzMKKzIzOCAwIDI2NjY2NgorNjg4IDAgNDMzMzMzCisyODcgMCAzNjY2NjYKKzIzNCAwIDMzMzMzMworMTcyIDAgNDAwMDAwCisxMzYzIDAgNTY2NjY2CisyNzMgMCA1MDAwMDAKKzE2NiAwIDQ2NjY2NgorMTgyIDAgNTMzMzMzCiszNzMxIDAgNzAwMDAwCiszNDkgMCA2MzMzMzMKKzIxNiAwIDYwMDAwMAorMjI5IDAgNjY2NjY2Cis2MDYxIDAgODMzMzMzCis0MDggMCA3NjY2NjYKKzI3MSAwIDczMzMzMworMjQxIDAgODAwMDAwCis3MDA0IDAgOTY2NjY2Cis0NDIgMCA5MDAwMDAKKzI2MSAwIDg2NjY2NgorMjI5IDAgOTMzMzMzCis3MzU0IDAgMTEwMDAwMAorNDA0IDAgMTAzMzMzMworMjY0IDAgMTAwMDAwMAorMTk4IDAgMTA2NjY2NgorNDU0MiAwIDEyMzMzMzMKKzI4NiAwIDExNjY2NjYKKzIwNSAwIDExMzMzMzMKKzEzMSAwIDEyMDAwMDAKKzMzMjkgMCAxMzMzMzMzCisyMTYgMCAxMjY2NjY2CisxMzYgMCAxMzAwMDAwCisyMzUzIDAgMTM2NjY2NgorOTg2IDAgMTQwMDAwMAorODA4IDAgMTQzMzMzMworMzE4IDAgMTQ2NjY2NgorNjIgMCAxNTAwMDAwCis1NTY0OSAxIDE1MzMzMzMKKzE2MDYgMCAxNTY2NjY2CisyOTM1IDAgMTYwMDAwMAorMzU2NCAwIDE2MzMzMzMKKzMzMjQgMCAxNjY2NjY2Cis0NTQzIDAgMTcwMDAwMAorMTc0MCAwIDE3MzMzMzMKKzI3MzcgMCAxNzY2NjY2CisyNzYyIDAgMTgwMDAwMAorMzE4NSAwIDE4MzMzMzMKKzMyMzggMCAxODY2NjY2CiszMzk1IDAgMTkwMDAwMAorMzQyMSAwIDE5MzMzMzMKKzM0ODIgMCAxOTY2NjY2CiszMzcwIDAgMjAwMDAwMAorMzY1NiAwIDIwMzMzMzMKKzM1MDkgMCAyMDY2NjY2CiszNjg0IDAgMjEwMDAwMAorMzczMiAwIDIxMzMzMzMKKzMzNjYgMCAyMTY2NjY2CiszMzc0IDAgMjIwMDAwMAorMzIwMiAwIDIyMzMzMzMKKzM0NDkgMCAyMjY2NjY2CiszMzYwIDAgMjMwMDAwMAorMzM3MiAwIDIzMzMzMzMKKzM0NjAgMCAyMzY2NjY2CiszNTExIDAgMjQwMDAwMAorMzQ3MSAwIDI0MzMzMzMKKzMzMzAgMCAyNDY2NjY2CiszMzc3IDAgMjUwMDAwMAorMzc0NCAwIDI1MzMzMzMKKzM2NjcgMCAyNTY2NjY2CiszODY3IDAgMjYwMDAwMAorMzc3NiAwIDI2MzMzMzMKKzMzMjkgMCAyNjY2NjY2CiszODc2IDAgMjcwMDAwMAorMzM4NSAwIDI3MzMzMzMKKzM1NjYgMCAyNzY2NjY2CiszMzAxIDAgMjgwMDAwMAorMzU3MCAwIDI4MzMzMzMKKzMxMzIgMCAyODY2NjY2CiszNDg3IDAgMjkwMDAwMAorMzI3MCAwIDI5MzMzMzMKKzM0NzIgMCAyOTY2NjY2CiszNDg3IDAgMzAwMDAwMAorMzUwMyAwIDMwMzMzMzMKKzM0NDMgMCAzMDY2NjY2CiszNTI4IDAgMzEwMDAwMAorMzI1OCAwIDMxMzMzMzMKKzM3MDcgMCAzMTY2NjY2CiszMTIwIDAgMzIwMDAwMAorMzM0NyAwIDMyMzMzMzMKKzMzNzIgMCAzMjY2NjY2CiszMTYxIDAgMzMwMDAwMAorMzM5MyAwIDMzMzMzMzMKKzMzOTkgMCAzMzY2NjY2CisyOTA1IDAgMzQwMDAwMAorMzU0MyAwIDM0MzMzMzMKKzMxMDMgMCAzNDY2NjY2CiszMDk5IDAgMzUwMDAwMAorMzQ1NyAwIDM1MzMzMzMKKzMxOTEgMCAzNTY2NjY2CiszMjkwIDAgMzYwMDAwMAorMzMxMiAwIDM2MzMzMzMKKzI5NTUgMCAzNjY2NjY2CiszMzQxIDAgMzcwMDAwMAorMzEwMiAwIDM3MzMzMzMKKzMxODYgMCAzNzY2NjY2CiszMTgwIDAgMzgwMDAwMAorMjgzOSAwIDM4MzMzMzMKKzMwODkgMCAzODY2NjY2CiszMTEwIDAgMzkwMDAwMAorMzE2NSAwIDM5MzMzMzMKKzI2ODQgMCAzOTY2NjY2CiszMDgyIDAgNDAwMDAwMAorMjY5NCAwIDQwMzMzMzMKKzMwNTEgMCA0MDY2NjY2CiszMDAyIDAgNDEwMDAwMAorMjkyOSAwIDQxMzMzMzMKKzI2NzYgMCA0MTY2NjY2CisyNDExIDAgNDIwMDAwMAorMjg3NCAwIDQyMzMzMzMKKzI1NzIgMCA0MjY2NjY2CisyNDIwIDAgNDMwMDAwMAorMjUwMCAwIDQzMzMzMzMKKzIxMzcgMCA0MzY2NjY2CisyMzQ0IDAgNDQwMDAwMAorMjAyOCAwIDQ0MzMzMzMKKzE3NTQgMCA0NDY2NjY2CisxNjI3IDAgNDUwMDAwMAorMTM3NSAwIDQ1MzMzMzMKKzEwNjkgMCA0NTY2NjY2Cis4MDEgMCA0NjAwMDAwCisyMTY4OSAxIDQ2MzMzMzMKKzI2MSAwIDQ3MzMzMzMKKzc2IDAgNDY2NjY2NgorNDUgMCA0NzAwMDAwCiszMzQgMCA0ODAwMDAwCis2MSAwIDQ3NjY2NjYKKzE1NzcgMCA0OTMzMzMzCisyODAgMCA0ODY2NjY2Cis3MiAwIDQ4MzMzMzMKKzQ3OSAwIDQ5MDAwMDAKKzIxODEgMCA1MDY2NjY2Cis5MTkgMCA1MDAwMDAwCiszNDkgMCA0OTY2NjY2Cis1MzQgMCA1MDMzMzMzCis0ODYwIDAgNTE2NjY2NgorNzU5IDAgNTEwMDAwMAorNjc3IDAgNTEzMzMzMworMzEwMSAwIDUzMDAwMDAKKzQ5OCAwIDUyMzMzMzMKKzMyNyAwIDUyMDAwMDAKKzIxMyAwIDUyNjY2NjYKKzE2NDAgMCA1NDMzMzMzCisyNTkgMCA1MzY2NjY2CisxNjIgMCA1MzMzMzMzCisxNDggMCA1NDAwMDAwCisyMTMwIDAgNTU2NjY2NgorMzk3IDAgNTUwMDAwMAorMTkxIDAgNTQ2NjY2NgorMTgwIDAgNTUzMzMzMworMTc1NyAwIDU3MDAwMDAKKzMzOCAwIDU2MzMzMzMKKzE5NCAwIDU2MDAwMDAKKzE0MSAwIDU2NjY2NjYKKzExMDMgMCA1ODMzMzMzCisyODkgMCA1NzY2NjY2CisxNDkgMCA1NzMzMzMzCisxNDggMCA1ODAwMDAwCiszOTE0IDAgNTk2NjY2NgorMTAyNSAwIDU5MDAwMDAKKzcxNCAwIDU4NjY2NjYKKzQyOCAwIDU5MzMzMzMKKzQ2MDQgMCA2MTAwMDAwCisxNDU2IDAgNjAzMzMzMworNjk5IDAgNjAwMDAwMAorODkyIDAgNjA2NjY2NgorNDUzNSAwIDYyMzMzMzMKKzEzMDEgMCA2MTY2NjY2Cis3MDggMCA2MTMzMzMzCis1OTIgMCA2MjAwMDAwCisyMTc1IDAgNjMzMzMzMworNjAzIDAgNjI2NjY2NgorNDExIDAgNjMwMDAwMAorMTgxMyAwIDYzNjY2NjYKKzUwNTUgMCA2NDY2NjY2CisxNTM4IDAgNjQwMDAwMAorMjIwMSAwIDY0MzMzMzMKKzYyNDkgMCA2NTMzMzMzCisxNDIwIDAgNjUwMDAwMAorMjI1NCAwIDY1NjY2NjYKKzI0NDEgMCA2NjMzMzMzCisyOTMgMCA2NjAwMDAwCisyMDYyIDAgNjcwMDAwMAorMjEzIDAgNjY2NjY2NgorMjQ1NSAwIDY4MDAwMDAKKzM0NCAwIDY3MzMzMzMKKzIwNCAwIDY3NjY2NjYKKzM5MjAgMCA2OTMzMzMzCis3NTEgMCA2ODY2NjY2CiszNzYgMCA2ODMzMzMzCiszMzcgMCA2OTAwMDAwCisyODgyIDAgNzA2NjY2NgorNDU3IDAgNzAwMDAwMAorMjIyIDAgNjk2NjY2NgorMTg0IDAgNzAzMzMzMworMjczNCAwIDcyMDAwMDAKKzQ3MiAwIDcxMzMzMzMKKzE4NSAwIDcxMDAwMDAKKzI1MCAwIDcxNjY2NjYKKzI3MzUgMCA3MzMzMzMzCiszMDEgMCA3MjY2NjY2CiszMDcgMCA3MjMzMzMzCisxMDkgMCA3MzAwMDAwCisxODUyIDAgNzQ2NjY2NgorMzIyIDAgNzQwMDAwMAorMTUzIDAgNzM2NjY2NgorMTk1IDAgNzQzMzMzMworMTUwNiAwIDc2MDAwMDAKKzM1MCAwIDc1MzMzMzMKKzE3MCAwIDc1MDAwMDAKKzE0NSAwIDc1NjY2NjYKKzIxMjMgMCA3NzMzMzMzCis0MzAgMCA3NjY2NjY2CiszNjQgMCA3NjMzMzMzCisxOTAgMCA3NzAwMDAwCisxMjk2IDAgNzgwMDAwMAorMTk2IDAgNzc2NjY2NgorODU4IDAgNzgzMzMzMworMzg2NSAwIDc5MzMzMzMKKzY5MyAwIDc4NjY2NjYKKzE2MDYgMCA3OTAwMDAwCis0ODg0IDAgNzk2NjY2NgorMjgyMSAwIDgwMzMzMzMKKzIyMTEgMCA4MDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNSBAQAorNDIgMzIgMAorMTM4NiAxIDAKKzI0MDEgMSAyNDAwMAorMjMyMSAxIDQ4MDAwCisyMzY3IDEgNzIwMDAKKzIzNzAgMSA5NjAwMAorMjMzNCAxIDEyMDAwMAorMjM5NiAxIDE0NDAwMAorMjM3NSAxIDE2ODAwMAorMjQzMSAxIDE5MjAwMAorMjQyOCAxIDIxNjAwMAorMjMzNCAxIDI0MDAwMAorMjI2MSAxIDI2NDAwMAorMjEyNCAxIDI4ODAwMAorMjE1MiAxIDMxMjAwMAorMjI5NSAxIDMzNjAwMAorMjE4MyAxIDM2MDAwMAorMjM5MyAxIDM4NDAwMAorMjQwMCAxIDQwODAwMAorMjI0NiAxIDQzMjAwMAorMjI4OSAxIDQ1NjAwMAorMjQwMCAxIDQ4MDAwMAorMjMzNSAxIDUwNDAwMAorMjI5NCAxIDUyODAwMAorMjI2MCAxIDU1MjAwMAorMjIwNiAxIDU3NjAwMAorMjE4NSAxIDYwMDAwMAorMjE1NSAxIDYyNDAwMAorMjExOCAxIDY0ODAwMAorMjA5NCAxIDY3MjAwMAorMjA1MCAxIDY5NjAwMAorMjA1OSAxIDcyMDAwMAorMjAzMCAxIDc0NDAwMAorMjAyMiAxIDc2ODAwMAorMjA3OCAxIDc5MjAwMAorMjA4MiAxIDgxNjAwMAorMjA5NCAxIDg0MDAwMAorMjExMSAxIDg2NDAwMAorMjA0MyAxIDg4ODAwMAorMjAyMyAxIDkxMjAwMAorMjAyNCAxIDkzNjAwMAorMjA1NiAxIDk2MDAwMAorMjEwOCAxIDk4NDAwMAorMjEzOCAxIDEwMDgwMDAKKzIxNDAgMSAxMDMyMDAwCisyMTExIDEgMTA1NjAwMAorMjExMCAxIDEwODAwMDAKKzIxMzcgMSAxMTA0MDAwCisyMTU3IDEgMTEyODAwMAorMjE3NCAxIDExNTIwMDAKKzIyMDAgMSAxMTc2MDAwCisyMjAzIDEgMTIwMDAwMAorMjIzNyAxIDEyMjQwMDAKKzIyNjEgMSAxMjQ4MDAwCisyMjE1IDEgMTI3MjAwMAorMjEzMyAxIDEyOTYwMDAKKzIwOTEgMSAxMzIwMDAwCisyMDg4IDEgMTM0NDAwMAorMjEyMiAxIDEzNjgwMDAKKzIxMzkgMSAxMzkyMDAwCisyMTQ2IDEgMTQxNjAwMAorMjIzMSAxIDE0NDAwMDAKKzIyODIgMSAxNDY0MDAwCisyMjczIDEgMTQ4ODAwMAorMjMwNCAxIDE1MTIwMDAKKzIyOTIgMSAxNTM2MDAwCisyMjU1IDEgMTU2MDAwMAorMjE4MSAxIDE1ODQwMDAKKzIwODEgMSAxNjA4MDAwCisyMDEyIDEgMTYzMjAwMAorMjAxMSAxIDE2NTYwMDAKKzIwNjYgMSAxNjgwMDAwCisyMDY5IDEgMTcwNDAwMAorMjEyMCAxIDE3MjgwMDAKKzIxNDEgMSAxNzUyMDAwCisyMTQ4IDEgMTc3NjAwMAorMjE4MSAxIDE4MDAwMDAKKzIxNzYgMSAxODI0MDAwCisyMjQwIDEgMTg0ODAwMAorMjI5NyAxIDE4NzIwMDAKKzIzMjUgMSAxODk2MDAwCisyMzM2IDEgMTkyMDAwMAorMjMyOSAxIDE5NDQwMDAKKzIyOTkgMSAxOTY4MDAwCisyMzIyIDEgMTk5MjAwMAorMjM0NyAxIDIwMTYwMDAKKzIyODcgMSAyMDQwMDAwCisyMjg2IDEgMjA2NDAwMAorMjI2OSAxIDIwODgwMDAKKzIzMjAgMSAyMTEyMDAwCisyMzA1IDEgMjEzNjAwMAorMjM4NCAxIDIxNjAwMDAKKzI0MjkgMSAyMTg0MDAwCisyMzcwIDEgMjIwODAwMAorMjM2NSAxIDIyMzIwMDAKKzIzNjEgMSAyMjU2MDAwCisyMzcwIDEgMjI4MDAwMAorMjM5MyAxIDIzMDQwMDAKKzIzNDIgMSAyMzI4MDAwCisyMzI1IDEgMjM1MjAwMAorMjMzNCAxIDIzNzYwMDAKKzIzMTYgMSAyNDAwMDAwCisyMzE3IDEgMjQyNDAwMAorMjMwNSAxIDI0NDgwMDAKKzIzNjAgMSAyNDcyMDAwCisyMzMxIDEgMjQ5NjAwMAorMjMzMiAxIDI1MjAwMDAKKzIzNjEgMSAyNTQ0MDAwCisyNDE3IDEgMjU2ODAwMAorMjQzOCAxIDI1OTIwMDAKKzI0MDMgMSAyNjE2MDAwCisyMzg2IDEgMjY0MDAwMAorMjM4MiAxIDI2NjQwMDAKKzIzNTAgMSAyNjg4MDAwCisyMzU1IDEgMjcxMjAwMAorMjM4MyAxIDI3MzYwMDAKKzIzODQgMSAyNzYwMDAwCisyMzgzIDEgMjc4NDAwMAorMjM3MyAxIDI4MDgwMDAKKzIzNzQgMSAyODMyMDAwCisyMzQ3IDEgMjg1NjAwMAorMjM1MyAxIDI4ODAwMDAKKzIzODEgMSAyOTA0MDAwCisyNDAxIDEgMjkyODAwMAorMjQwMSAxIDI5NTIwMDAKKzIzODUgMSAyOTc2MDAwCisyMzgyIDEgMzAwMDAwMAorMjMyOCAxIDMwMjQwMDAKKzIzMDMgMSAzMDQ4MDAwCisyMjcyIDEgMzA3MjAwMAorMjI3MCAxIDMwOTYwMDAKKzIzMTIgMSAzMTIwMDAwCisyMjczIDEgMzE0NDAwMAorMjMzMCAxIDMxNjgwMDAKKzIzMzkgMSAzMTkyMDAwCisyMjk2IDEgMzIxNjAwMAorMjMxNyAxIDMyNDAwMDAKKzI0NDAgMSAzMjY0MDAwCisyMzUzIDEgMzI4ODAwMAorMjM0NiAxIDMzMTIwMDAKKzIzMDMgMSAzMzM2MDAwCisyMzA4IDEgMzM2MDAwMAorMjI4NyAxIDMzODQwMDAKKzIzMTYgMSAzNDA4MDAwCisyMzY3IDEgMzQzMjAwMAorMjMzNSAxIDM0NTYwMDAKKzIzNTAgMSAzNDgwMDAwCisyMzk1IDEgMzUwNDAwMAorMjQwOCAxIDM1MjgwMDAKKzI0MTMgMSAzNTUyMDAwCisyNDE1IDEgMzU3NjAwMAorMjQ2OCAxIDM2MDAwMDAKKzI0MzcgMSAzNjI0MDAwCisyMzcyIDEgMzY0ODAwMAorMjM3MSAxIDM2NzIwMDAKKzIzNDEgMSAzNjk2MDAwCisyMzI4IDEgMzcyMDAwMAorMjI3MyAxIDM3NDQwMDAKKzIyNDQgMSAzNzY4MDAwCisyMjMzIDEgMzc5MjAwMAorMjIyOSAxIDM4MTYwMDAKKzIyNTIgMSAzODQwMDAwCisyMjM2IDEgMzg2NDAwMAorMjIxNyAxIDM4ODgwMDAKKzIxNzkgMSAzOTEyMDAwCisyMjUxIDEgMzkzNjAwMAorMjE5MiAxIDM5NjAwMDAKKzIxOTkgMSAzOTg0MDAwCisyMjEyIDEgNDAwODAwMAorMjE5MCAxIDQwMzIwMDAKKzIxMDIgMSA0MDU2MDAwCisyMTIwIDEgNDA4MDAwMAorMjE2NyAxIDQxMDQwMDAKKzIwMjQgMSA0MTI4MDAwCisyMDEwIDEgNDE1MjAwMAorMjA2NyAxIDQxNzYwMDAKKzIwMzUgMSA0MjAwMDAwCisyMDUxIDEgNDIyNDAwMAorMjAxMiAxIDQyNDgwMDAKKzIwNjYgMSA0MjcyMDAwCisyMDI1IDEgNDI5NjAwMAorMTk4NyAxIDQzMjAwMDAKKzE5NzIgMSA0MzQ0MDAwCisxOTY2IDEgNDM2ODAwMAorMTk5OSAxIDQzOTIwMDAKKzE5ODcgMSA0NDE2MDAwCisxOTIyIDEgNDQ0MDAwMAorMjAyMCAxIDQ0NjQwMDAKKzIwNzIgMSA0NDg4MDAwCisyMDIxIDEgNDUxMjAwMAorMjAxNyAxIDQ1MzYwMDAKKzIwOTkgMSA0NTYwMDAwCisyMDY0IDEgNDU4NDAwMAorMjEwOSAxIDQ2MDgwMDAKKzIwOTMgMSA0NjMyMDAwCisyMDkwIDEgNDY1NjAwMAorMjE0OCAxIDQ2ODAwMDAKKzIxODQgMSA0NzA0MDAwCisyMTc5IDEgNDcyODAwMAorMjE1MiAxIDQ3NTIwMDAKKzIxNDMgMSA0Nzc2MDAwCisyMTU5IDEgNDgwMDAwMAorMjEyMyAxIDQ4MjQwMDAKKzIxMjkgMSA0ODQ4MDAwCisyMTQ3IDEgNDg3MjAwMAorMjE5MiAxIDQ4OTYwMDAKKzIwNTEgMSA0OTIwMDAwCisyMTE2IDEgNDk0NDAwMAorMjEyNCAxIDQ5NjgwMDAKKzIwODggMSA0OTkyMDAwCisyMDczIDEgNTAxNjAwMAorMjE0NiAxIDUwNDAwMDAKKzIxMzMgMSA1MDY0MDAwCisyMDczIDEgNTA4ODAwMAorMjA1OSAxIDUxMTIwMDAKKzIwNDQgMSA1MTM2MDAwCisyMDEyIDEgNTE2MDAwMAorMjAzNCAxIDUxODQwMDAKKzIwNTMgMSA1MjA4MDAwCisyMDEzIDEgNTIzMjAwMAorMTk4MSAxIDUyNTYwMDAKKzIwOTQgMSA1MjgwMDAwCisyMDc2IDEgNTMwNDAwMAorMTk2OCAxIDUzMjgwMDAKKzIwMjggMSA1MzUyMDAwCisyMDMxIDEgNTM3NjAwMAorMjAyMCAxIDU0MDAwMDAKKzIwMTkgMSA1NDI0MDAwCisyMDMwIDEgNTQ0ODAwMAorMjAxNSAxIDU0NzIwMDAKKzE5NjIgMSA1NDk2MDAwCisyMDcwIDEgNTUyMDAwMAorMjA4NyAxIDU1NDQwMDAKKzE5NjQgMSA1NTY4MDAwCisyMDY5IDEgNTU5MjAwMAorMjAzNCAxIDU2MTYwMDAKKzE5OTQgMSA1NjQwMDAwCisxOTg1IDEgNTY2NDAwMAorMjAzMCAxIDU2ODgwMDAKKzIwNjYgMSA1NzEyMDAwCisxOTU0IDEgNTczNjAwMAorMTczMyAxIDU3NjAwMDAKKzE2NDkgMSA1Nzg0MDAwCisxNjUyIDEgNTgwODAwMAorMTYzMSAxIDU4MzIwMDAKKzE2NTYgMSA1ODU2MDAwCisxNjcyIDEgNTg4MDAwMAorMTY2NyAxIDU5MDQwMDAKKzE2OTYgMSA1OTI4MDAwCisxNjcyIDEgNTk1MjAwMAorMTcwMSAxIDU5NzYwMDAKKzE2NTEgMSA2MDAwMDAwCisxNjc0IDEgNjAyNDAwMAorMTY5NSAxIDYwNDgwMDAKKzE3MDIgMSA2MDcyMDAwCisxNzA3IDEgNjA5NjAwMAorMTY5NCAxIDYxMjAwMDAKKzE3MjcgMSA2MTQ0MDAwCisxNzMwIDEgNjE2ODAwMAorMTcwOCAxIDYxOTIwMDAKKzE3MDQgMSA2MjE2MDAwCisxNzM1IDEgNjI0MDAwMAorMTc1OCAxIDYyNjQwMDAKKzE3NTMgMSA2Mjg4MDAwCisxNzQ4IDEgNjMxMjAwMAorMTc2MyAxIDYzMzYwMDAKKzE3MzcgMSA2MzYwMDAwCisxNzgzIDEgNjM4NDAwMAorMTgzOSAxIDY0MDgwMDAKKzE4NjEgMSA2NDMyMDAwCisxODMyIDEgNjQ1NjAwMAorMTk0NyAxIDY0ODAwMDAKKzE5MzkgMSA2NTA0MDAwCisxOTI2IDEgNjUyODAwMAorMTg5NiAxIDY1NTIwMDAKKzE5MDkgMSA2NTc2MDAwCisxODY5IDEgNjYwMDAwMAorMTkwMCAxIDY2MjQwMDAKKzE4OTYgMSA2NjQ4MDAwCisxODgzIDEgNjY3MjAwMAorMTkwMyAxIDY2OTYwMDAKKzE4OTUgMSA2NzIwMDAwCisxODY1IDEgNjc0NDAwMAorMTg3OCAxIDY3NjgwMDAKKzE4ODEgMSA2NzkyMDAwCisxODYxIDEgNjgxNjAwMAorMTc5MSAxIDY4NDAwMDAKKzE3ODcgMSA2ODY0MDAwCisxNzk4IDEgNjg4ODAwMAorMTgxMSAxIDY5MTIwMDAKKzE4MjQgMSA2OTM2MDAwCisxODk1IDEgNjk2MDAwMAorMjA3OSAxIDY5ODQwMDAKKzIwMzQgMSA3MDA4MDAwCisyMDM4IDEgNzAzMjAwMAorMjAxOCAxIDcwNTYwMDAKKzIwMzAgMSA3MDgwMDAwCisyMDY3IDEgNzEwNDAwMAorMTk4MiAxIDcxMjgwMDAKKzE5MTEgMSA3MTUyMDAwCisxOTA0IDEgNzE3NjAwMAorMTg3NCAxIDcyMDAwMDAKKzE4NzYgMSA3MjI0MDAwCisxOTQ0IDEgNzI0ODAwMAorMTk3NyAxIDcyNzIwMDAKKzE5NzcgMSA3Mjk2MDAwCisxOTc5IDEgNzMyMDAwMAorMjAxMiAxIDczNDQwMDAKKzE5NjEgMSA3MzY4MDAwCisxNzczIDEgNzM5MjAwMAorMTc4MCAxIDc0MTYwMDAKKzE4MDEgMSA3NDQwMDAwCisxODkyIDEgNzQ2NDAwMAorMTg2OSAxIDc0ODgwMDAKKzE5MzYgMSA3NTEyMDAwCisyMTU0IDEgNzUzNjAwMAorMjIyNiAxIDc1NjAwMDAKKzIxNTkgMSA3NTg0MDAwCisyMjUzIDEgNzYwODAwMAorMjI4NiAxIDc2MzIwMDAKKzIyMTQgMSA3NjU2MDAwCisyMTExIDEgNzY4MDAwMAorMjAyNyAxIDc3MDQwMDAKKzE5OTQgMSA3NzI4MDAwCisxODgyIDEgNzc1MjAwMAorMTg4NyAxIDc3NzYwMDAKKzE5OTMgMSA3ODAwMDAwCisxOTYyIDEgNzgyNDAwMAorMTk4MiAxIDc4NDgwMDAKKzE5NjYgMSA3ODcyMDAwCisxOTYyIDEgNzg5NjAwMAorMTkyOCAxIDc5MjAwMDAKKzE4NzggMSA3OTQ0MDAwCisxODU3IDEgNzk2ODAwMAorMTg4NSAxIDc5OTIwMDAKKzE5MTkgMSA4MDE2MDAwCisxOTA0IDEgODA0MDAwMAorMTkwOSAxIDgwNjQwMDAKKzE5MDkgMSA4MDg4MDAwCisxOTMzIDEgODExMjAwMAorMTgyNCAxIDgxMzYwMDAKKzE3NTYgMSA4MTYwMDAwCisxNzMzIDEgODE4NDAwMAorMTcwNSAxIDgyMDgwMDAKKzE3NTUgMSA4MjMyMDAwCisxNzU2IDEgODI1NjAwMAorMTcyNSAxIDgyODAwMDAKKzE3NjEgMSA4MzA0MDAwCisxNzM2IDEgODMyODAwMAorMTcwNiAxIDgzNTIwMDAKKzE2NjIgMSA4Mzc2MDAwCisxNjA0IDEgODQwMDAwMAorMTYxMyAxIDg0MjQwMDAKKzE2OTIgMSA4NDQ4MDAwCisxNzM2IDEgODQ3MjAwMAorMTc3OSAxIDg0OTYwMDAKKzE3NjggMSA4NTIwMDAwCisxNzU4IDEgODU0NDAwMAorMTcwOCAxIDg1NjgwMDAKKzE2NDIgMSA4NTkyMDAwCisxNjQ1IDEgODYxNjAwMAorMTU4MSAxIDg2NDAwMDAKKzE2NTEgMSA4NjY0MDAwCisxNzMxIDEgODY4ODAwMAorMTc0MyAxIDg3MTIwMDAKKzE3MTcgMSA4NzM2MDAwCisxNzE1IDEgODc2MDAwMAorMTY0NiAxIDg3ODQwMDAKKzE1NTEgMSA4ODA4MDAwCisxNTYzIDEgODgzMjAwMAorMTY0OSAxIDg4NTYwMDAKKzE3NDIgMSA4ODgwMDAwCisxNzI0IDEgODkwNDAwMAorMTY3NiAxIDg5MjgwMDAKKzE2NjQgMSA4OTUyMDAwCisxNTg3IDEgODk3NjAwMAorMTQ5NyAxIDkwMDAwMDAKKzE1MDMgMSA5MDI0MDAwCisxNjQ0IDEgOTA0ODAwMAorMTY1OCAxIDkwNzIwMDAKKzE2ODAgMSA5MDk2MDAwCisxNjExIDEgOTEyMDAwMAorMTY5NCAxIDkxNDQwMDAKKzE2NjggMSA5MTY4MDAwCisxNjc3IDEgOTE5MjAwMAorMTYwNCAxIDkyMTYwMDAKKzE1NjcgMSA5MjQwMDAwCisxNjM5IDEgOTI2NDAwMAorMTU1MiAxIDkyODgwMDAKKzE0ODYgMSA5MzEyMDAwCisxNDk0IDEgOTMzNjAwMAorMTQ4MCAxIDkzNjAwMDAKKzE1MDkgMSA5Mzg0MDAwCisxNDU3IDEgOTQwODAwMAorMTQyMyAxIDk0MzIwMDAKKzE0NTkgMSA5NDU2MDAwCisxNDQ0IDEgOTQ4MDAwMAorMTQyNCAxIDk1MDQwMDAKKzE0MTMgMSA5NTI4MDAwCisxNDk4IDEgOTU1MjAwMAorMTQ1NSAxIDk1NzYwMDAKKzEzOTMgMSA5NjAwMDAwCisxNjM4IDEgOTYyNDAwMAorMTkxOSAxIDk2NDgwMDAKKzE5NzkgMSA5NjcyMDAwCisxODk0IDEgOTY5NjAwMAorMjAwMiAxIDk3MjAwMDAKKzIwNjIgMSA5NzQ0MDAwCisyMDk4IDEgOTc2ODAwMAorMTkxOSAxIDk3OTIwMDAKKzE3MzggMSA5ODE2MDAwCisxODkwIDEgOTg0MDAwMAorMTk3MSAxIDk4NjQwMDAKKzI0MjkgMSA5ODg4MDAwCisxODYxIDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNGExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACitrb2dPx8XY1Up2Q3VzWNPVSXZKfn1LdVldwcjE9PT0ythJcnRCUlTz+cfaxtZUxfns7OP/1U9lYn3Z/u3p6+HBW3NnZ0T05eDg4OXGXkxMS39lWlFJ2ffx81B2eG5tcFXk7eT+3GBoFxRmdvno7+bnw3VnbX90ZXdYW99fWNjE1M/P2MFY0NZ5ZX9ncVLb+OX/4fhUR2VzRnxPwvXJ0FnfWXXC5u+V5shKaxARa3f465CX58d3YmltTPnk5uzk2EN6fHlicMPl4+fh6Phbdnh4SkL0//X+9F1xZ2F1X9374OPlwsZWZXxVwVRPcElwYGRx0PTB9+TYTEJGS3JldnR5c2dmfXNP1EJxUtzcRnHczU5OTXF3WsL75+X79NlzaWHY++Po6u39W2ViZtzk6ZeV6O/4WXhkeHxK9+fk6JTq4thzeGdmZnnE/NlQTGRme0/azPbx0UBxYG96QM7l/8vaX31ibEPw5ef53UZmaW1iZFvN5OVWRkhyfHxkdlzYx19F29ZJcGF+0Pb64+fwUnx/YG9w8e2U7fj0RGRua2Td5JeWlevu/dVwcENE2PbxzcnE9vHdW8fDU397UtPczM9U3FNX1FDVzsnI1XZGRVb3+M1dcUtyY2dV5O3nxtRIYGtuY353w/vJU0FDd3hjZmR4fntmZ2d8TGRmfNP1xdX299BNf2dnZ0bn6ZeRkZfhQn1M3O2Xk5yTle3UeHx19OX18fzSxdvA8VN1XHFmZ3tYxEFzS3dbV01eWHN2cmF9Rc3g+PH/U3J9YGVyT+Xp4Of2XHRqEGpk2eHm+sx2Zm9qYEPR8/BTTnN6f3hjZ2B92d/B5+TnyHh6fED85OXi/9hVc39I1uTu6Ori5uH42F5RxPb3wsbx8vPY0MzOz8NEeWdmc0TZ8v7m7ufHX1rfV012fU/TWETcychXeGJrbUzf/uXATmRpFxMVc9bb3U12Tn9kY3p1R1DO/fz58FB2fmVAzOTh5P/7wtXTdVDw98/G9OD/0F15Y2Rwze3t7+HwXGRhRcr65vnQRFpeVMbglOrk9Vp1cmR8V8T64+uX4PzwUHthY0jM8PnES3Nja2kVYnfW0lde1Hxua2oVa2FBzcPfXVNkbG59xff/+spBdX5yclj85/XIw/3n/eTk8ddERcfVz+Ht4MpGQkRJ1tbGwtvd3VNV091cdUpCXF9dVV5AUNj4+szLzER9Z0jl7ZWW6u/k8fr/8eXn5uT+4e7g+9t+axViWsn67O7wZxYdEBdrZ3N5ZG8UERIRb2FxV9TRRnxhFRdpZVLA9//890lkZXBE3cHL13d0SFzGwffn+PDH3dtXdnxmZVXy5fv75+VRSktT9uCVl+/DQHN5ctTllJTs4+Tk4+b3wNXw5OHol5Xv+8L2wNrExVNYcVLD3NxacX17Y2Jsek5Kc3lvFWtgcV9VQXtpaxcUY0hAfWZkX9rIzdRXUXJB19/NyM9efk7G0dr28f3+8/daQ9Hw5uX09fnCTnZc11fF+OHg4uVHZm1iReXrkZCRlfzIxkHT5O3o4uDs91BTU8z3UVDEz9rFwt9naGJlfHZFcXhjbmtvbXxGRndkfHVmaGR6c3BLUEt/R1NBdGFkTcLbxMHIRnx0XPLtleDMWVZT39/Dy83C2Mv4+8DK0n1tYUjZzufs7eDOTXxxckpaxMfL5OHk5eTx0vXj7+iUl+79X0tfz/fY2MLaU9jFUUlFd2VkZHh4fX9hb2NkfnN6e0p9bhMSam14UPb+8txHSklexfHl8NL0zVFaREbW9eXnzdDbSGRsaXteXNv65fNEeXJibn1bVcDe9OPm5/tX18fE7ZSXnZPp+sPI5uXn6eT5/dfBzdTe887cd3pFXkhSTndBfXBBc3h+bGoVanxAd1xPenh6dFxzZmVmfktI9/vDUUFPWNb2+PL1x1tDdmdJ2fb588fQRnXR1kBS3FTXVMf28FB5Z3ZxTfb9/ufg7eHeQHBzTlfL5eT6/cvxwczl/MT++v7KzdZU193z+eb6ytNaeGVwXt9V1ttYS1J2f01XV8nTWEdKQX5gYGJiWPDl+cbTUGVhdnHR/8nCz3FjZmRmZWV/c0rSVXJsamhnTf3hydXXdk13bGZQVcDzxtrA/u/r4/rA2vP64+P5+OH64uzn4OPIzfDRTF3F+OX08cj+89Hfw07Xydj3W2Z5cmB+fGdmS17a0k5KSEBzfHx/amF3cXRIfNrZZExxZnBYX/73U3F5fnp3zfz/7f1QZGhpc1nJ5v3FxcrI/t53d9BUVfD788fRRllKcEPz8/bMRUlc0vPg5eXm4/3Lzlh1xczD//D84+D3X3l5dc/tlJTnRnJ8ZUxRRM/429jef2Zlf0tCd3N8dUJ0Qn1gckl8WVlC9NZ+c2BqZUFU0FpCTUbdVl7NWHVWRndbc3xAT0LWTHLYyfH4zkBbUs7+//rWRNjUxePh75Tg8s5cxufk4/7WQFna/+fs4/Lz1WVgenpF2Pf45PfFzt/GVXVwRtn65PdAfnZwdtfeVvbMUEtlZnBISXJ5dnVMfGFtaxMRFGpgZXh9f2NtbWNkU//n5clIeHl+1/H1zObg+/7z/ebg7erv5/nm4frw/eXj6O+VlO3j4MnSxcXw5eTl+sBCcnZweXh9SVzeyvJTZ2dydFHe3/b499FQd3NfysJDc2Vnenp7cGVlfXtkemV8c2BsY2dsaGF7YWBiahVsYX59Z3PS/uDm9trFx/Pk5f3n6e7g4eHj6Orq6unj7Ojv5vn+5efh4u7j+f/ETX18ZWVycUREfWFhfnx/SUTc9fv6z3xsYXp+d0dXzfTN2ll+c0xHQ0TRUEVGTnZ8f3XezdrYW3Nkb25taRRoYGFiaRUWFhVpYWdkcF/VUERLTdH94uns7eqRlpGQk52dnJyfkpCQlujg5+fg4+H7yXVnZ3BJ387d1tRSRnxjYGR+c3VP1MP29sFQfXNX3tXcUUVU097K30BOc395eWRkZmZhY2Jiel9cREV8Z2ZgZnxgbGJubmkVa25sZ3xzcEJTw9zf3l7Rz/D55PP94ef65OTs7uuWk5CXlO7o6OqUlZaRl5Xk29TaxMP0y/Px//ncdH1wXM3z8fn9zMxUVk1zSV9MdUt8enpkZ21pb2xnZGBsFRERFW5jZmR6ZmxpFRRpfkxTVkVY0d3VWEBHVPLk5ffGxs/EwvL98PLz9cnY0dz3y/b8/Pz/5uHl9s7I9Pzm4+Pj6eqV7/754e3m5eX65eDu7+fz8ufm5Of98/XPwlV9bWgVFWhtb2oVamgVEBYVaW5qahYWFG98THZCU1TXX3N7ZH1Z199SXNFWUFlxcE3c+ef2x/X8+uTh5/j+++zo4/7E3NFT0NTY8eXn/ld0R1rJ5uDt5vj69NNHRtv38+Xh5f/z/Pn08fD77Ozo4v7yy8rAXnR6Z3p5f3BnYXx7cHNkfmdsaRQXEx0QF2ttb2JhbW1ib2Jhd9few0F0RXFa30Re08bl5/3w9PP29/zZUMr+4eL78vLw/ubg5/7k+Pvn8fT88frv7Ozu6JXt80R6XMPw7eTOyNFXx1TR/OTj4uPh9cvFWFhxZHxxcEx1YWoUbmd0cmNgbhcVFxdrbXh5ZWFpbGZjYWZpbX59RkB9fWRkZHt8clbz5ODl21fYzv/k5P7P8PP2/NnF8/rpleP/8fXL9ffK8OHi4+n7z/77+/30y8nxysP3z9r95eXn/fb65O3o4/FfUVVb0VNxcXJ5dHR+fHdGd2FqERcXFmoXEhMRFG9jYWFmZGJjZmJxwcDI2FHR0VDW1ExKUc78+/deTkpwXMXKz8312VZZRtT95uzj/Pnn5+Lm+efm4u3p6ODm5vvxzMfD/Pvm+vfCQlrR9P71/vr55v3WW1La3tFeSWdgYmx4Z2Z5fUd1Z2FjYGFhYGFmZXl+SH5kc0pdXk5wZXZIc3F3cHtne0l3c3dJVNZOf2RJ38Tz99dbUt7/5/709fzywsj3++Lh5uT8/vzk6JeV4ePg5+T68vqVlZeWlOjk5ubn5cn19MLHd2BifH98dGdtFBcUaGFra2NkcWZ4eHVEeWRpbmJkdVjFdXNxYXxlfnZfydreQ35jYE/X9t1Y1HZFdnt8cFBRys1CcX1aXcfNy+X54ebk4Pri4+Pt5+bk5+Lp7ODt5+Dm+Ob9+fr65cBTX/Xj7+zh/lV/eXxfRkFUX0luERIXZ31DQnBweGRhZH56fHBBdGRnZVNEdU98cHl4fEZSTdLB9MdMcXnWyfTMWlt/ZGFlRktaXN3BWnB618rK/cXPVElU0/r58Pn45c/D3v/j4+/n4eHx98nm7ePi4Ozk9Nv07euV4+TyV9ZW39vW01LSWHhtaG1gZWFkdX94ZHZAdnxkcHRkbWlie3V5Z3tjY2Z8RVHD1F9Ycn97XvDl+VFBcGFmf1XT0URA1kpyenTM9fP1ws7Z2sD/5ebj5+Hk5P724ePu7uDh5efk7e7m5vv48cZdQfP5//jZ1kBbW1L3wMTHUHd9ZGthc0zDUHV/e3lz3dVER3NnYGBpZ0F0TXFia2tpbnJDSVh1cnN2eHXO9/L2UEhJQn1IQXNd3tzS1XNldE714+bl8sNQ2vHH9P3x/f/OUPLm4uri+Prm5+Lr4u3s+vHK9sH44f/kyXZ+fnl3yPf0/dNHTHBgYXd23cFAQnZkYn50c9XRWV1ccWR8enZEemRnYWJiZ2N5Q0t0cHtjdFLR91BBdnhnZkJKTEB9f3t6Y3lfwODn/ffx/P3v7u3s+v3MzNTd+eTt4O3r65Xs6+vi7+Pg+/PFUsz2+/7aWnJ9ZXNTVsTRVE1+YWl6TMDz9cZFTX1yQUBNQkhIcXF7fkBT1UNMcHJkbGNgYGBkenNwZGVH0cTRRnJgY2J4SHBzRFhMSnV1w+Tj6eP/w8NV1vD6+fn9wtNCeUDJ9Prs6+3t4eft4efj6O7j4vL0+v782k1hZntkQtNQRNzL2sRIdtvS0tXaQnxKf0FU1NnA901xfmB9c0dU1kJhZG9vYGFlZUZDdX1iZUvVwcLEdE12dFpweGRxSXhlYnt1QtvB/cTA98n7+/jk5efxwFxH39r4+Ofk+uf74+/v4u/r6ebyx8rD8c5fcWxnZ390Xt3a9/331F7T/efk8fndR3h4dEdddVFaeWxuaWNyW0NQdnpkZHt+W3FH0Nd0eWdlQtZLQFpzd3RdS1N1Q9xSdmV9cV7w9cTER0xN3dPl7PrlydRMT1DC4+zk5/VTRsn/++3k7+/ky8Hx/eLp5f1XcmV/SHHNyPXOVktw1d724/v22XxgYEldw/TJzFxyZHVPXsba1U9nY2FxdUHS0VRwYxVqaWVW0F52Zm1gStLAyc3fSmZrZkrR/PPz2X1sb3DG+u/s7PzTQlPSxODr6uDx11rF/OCVlZaW7vzazfXn4OT2W2ViZnZFw/XOxkp+fkzX9ODg81Z9ZGd32ff0TXhib2lve0bw+9t3YGsUbnNa29fRXnhiFWB32/jIXHF8c3zZ/u3i/vTa2EdcxfT7919we2RgTfXz8MnN3tPR2vH74+LwWHZAQF/2/ubl8/z8997J4eDn33J5e39wy+bn8trG3VTcxP79+PNBcnhxS9nwy95KTk11S3fF8cnce2ZtbGJlQ0dCS3R8ZmF7S0xwQH1nY2RLVtjH2lJCQ1zW08XY09xPf2V5S974/MNRWVBdU/fg7OLj5cNGTcfy4ebh5vL19/P44e3g/sjXTHt9cdv9ycPeyPTJ9vjk8MXNxEN6cXRFWWV4e3l/fkNG0cFdQnNlYnp/ct1GcmVnf2RxRNjxRHRBdmdkTVP29NfWQ1/c+eb85/DYWnlnZ3d3V8NBdnxPXNX38u3mw91fQELSzvDl8szW1sTy5Pvk5/DM09JU28/z4eXDQFzA8P764+P82VledUPcy/3AW3hhZHfe8Ofn8UVjaWlicnFBSXtuFGx4QtDT0kR5Z3p0fUxS09JOeGNlWt3x98PLxVt1QULR211RTHBneNfK5u3t4/ze1vXy/uLt7+bPWE7c9OHu4Of+w15CR0bbwsLZQH5mcNH+4eX49VVMTtTUzcnT13NmYGVE2v/zyNZOd3x1RllQdHB6bWlve0fBVUdHQllf28LaxtzbRXl6eVrf/OTk/sPVREZf0cZWR3JgbG961fvm5fPfRXVI0c31z/HAdXt4RtPz5+fn/PHl+eXm4Ob78s/G2sDy5/rHVdVHRdHJ5fr03NF0ZGV/Wczx9/fad3FMc0hBQ31lbBYXam9y1UB3SHJ4cH1dzt5UVlh5ZXdN0PHM0dJ1eF/cwvzk8tFbeH53cNf//s/CyMrl5OTt7OX199dIUlHS/fn19/LA9Pn85eT+zdBFcUBId9z210p0cnRV2/Lh5dxRQHpgZ3PS9sbL9ttd0NFc19R0fWBqamlub3BKfHdJXsb0/Ofn8crOwMbQ1dfC2EFHQnRax8Pe3l9LfmVleHhlTtFWRUZcx9rcy/r4zdVSTXB8cFTw8cr55Prl5+3t5vnw8vn9983C981cTVhX38X19cjcQdfC2VJc0tJQRljH39LB989RTnlkYW1tb2xvenFnenNKVtvc3sFSdUZGSHh/SURfdE9SR1vd2lfSUHNLUFTb2tv3/fbJ/uXm4eHt4uf3xPbRdndIUtldRMTCwf76+vnJ9fTxz97fXU5wc3J3Q0hX2N3O9N1Y3dZYU1DQ31fAxNRd1s7B0kBKcXlkY2R/ZXBMR0N1TNzTQVzT39vDzsLVWElxcHNE19LGxd1U10twQEFIdEhPd0Dfxs3H9P3+5/rw09jAT3ZxXd7e0NXMyvD///r8/fb/5/D18P3EXl9Q1tBFVVfX0kBAdFTE19je2lXYwlfP2NjF3d9NcXh+eGJhZHp7en5ke3JwR0Vd1tzcXcXbXVNPcXh/fnBTW9fSz8pXWkJXzc7I9/P98/bB8OX45+T58cvA1NZU1trbzNXVVV5RXkFb3MLG2tDDylJHTndNSE93cnVARlLE3MzNwf768vbKw9vRUtjw8sDdVUh6YWd6d3V0Qk12d09IS19S0tJX0VNU3s3D1lJZXVp3fX9FQkxHSEBMQkVfUltQR0FcUNLC8/bz8s7C3FPVw/D3w1RUw87EzPz65OH48Pzw/OT69dvdU052cUNTW1nQUF3T0NPeyc7N2ltOU9bQ2FdYV1h3cHlkeHB9fn18eHx8emR6c1pAd0pV3NLKyszZXUJDQUZfUFNFTUxc2dnSwPPw9MrG9/vh4+f6+/7CV1tEX9ffU053QFBV38XJ8fPxzN7Y3dPdx/XJxVZBc3ZJcHRLWkZDUdzYxPT+/Mvd2sv98szbVVN0cXJ9dENaTXZ9f3xzS0dGVdzQUnd2WdbE287w3050TEBNQV9Td3FwfXlkendSVtjNzcr38MzFzMPDxNdU28PbxMTZ11NbxMXQz/z58/j7/vjn4Obm/cZXcXRNR0DR01HRXlhcVtza9vDC39zEy8Fe289bdUNxZ2FjZ2RneHlzdnR1dHVOcHxLd3xC09r18vXUQnVAX19WxsHE0V51c3FCUdrL9fP88f388vrl/PL9zdlVVFVYQU52dF/S2N3f3VJEU93exvH98/LI2FRbWVtQVNLT29BDdXdP183/4ef5/PL2ytzYw8PYU0h/Z2BnZXh8c3BDSnZBSkpDW19X3cnzy95dQHR+fExTU9RfQFlxcnB+e3TRzvfBwcPExM3AyfDy/d1PR0tY3NrJ8PPJwNzXW1xUx8zJ/fz48/H48vTA1lFV2N/Y3VXUUUFAX1DGyfXE0NJXxPXN09vPzF5xf2VgbGBkZXtzd3Jyf3xDRlBV2cvAV9XSV8XSUkdMUdFXWtfeXUV0Rl/S8/7//Mnd9cfRw8jz+P3Nx1FYX0BfUNDdX0NYQ3dEQF3C28bPxl5fUNHI0FTWwcXX3NzW0cfWXtRU2fTx8PDByv7y/fHw8MrEQmRkfHl8TF5dT3N5cH12QUFYXtdVQEx3dFzRUVpOdUdBTEBEWVfTU01CUVJB0tpX0cLx8svC983H2t7T2N/QxsP2wEHXXVHd0sfY2NTA1lPWUcH28vbN1NHEVMPfVMTY3NDVXtnEyfTDzs3P2txR1dxIQndzcntlZX1lfWVjYGB5d0lH19HeydjLw9jx/8zURXVTWltRUF9dXElKcUpd1s7M9vnl//j79PLwwtxWW1BdSFDZ3dVDdHB0UNhV3d1Rx8bS1tTWzM1ZTnd1Ud/S2vbl5cja0F3T2cL28PH+8M3LzdnE0kBOTnZweX53dHR0fX58dEd1fHZMQltGRlPYwffDQXR/fUpNR1fEwdFeQ0JE0NnQ2M3F0tDdycja8Pjz9vTB0FBd2vfJxlJWy8TZ0kVZ1tfb3Nb3/8LH1E1BWVXZ38HwzNzfSHJDdVrYy/j+2d7H2cjL2sbQUlVxZX9nZ31nYWRnf0pzdnxlQ9DcwM325fLL89NHX0tA09HGy1NCTHRAUlTYwMrzxdn3yv3k8cPz8PH0WnZIdVrT0VxYVtVfR1h1QFh3SdjL8vnfU152d0Zc1/Xz9cXawMbKx93F/fr58lZfUFDYyMnSwtFKS0p2dVhMd3lzT0h3fX55fX11Q0FRUFpQVEXR3UBAWcD/9tBBcXl3dV7Hxfb82lDX3ff//vv45+Hlz8TVUtDQwsJQXlZ3cVFXVdZbSUTB8vDExdpUR0BU2NrK/N1U31lW11lN2vT0995VXFpZ0svJ019GeGRzfXRKcnBKfHt/eWV/dnNLTF9d38PT28/1z99dXcDCyffdQENLc0BX2s7L9dvc28PO8PL74+b45fbV01BHW1hfUUZ9c3RDWVtBSU5W29DPy9bH0lJHT17AztPK9Mfb28PJ8+fm8/DOW0BMR1lT1NdNe3JyfndZVlnVxN93cXR6e39yfnxxT0h2QURIQFZWUtLK/fX2ytlVWUROX1DBx1XQ2dVf3vfz++Hn/PTG3sfOy/T0yPXfRkhYQUtXVEFNU9LQ3d3a1V9RUUNNVNxWVcfZ3s3KyfT02NBTdEp1RdTFxMrywFx0SHV2R1dRU19MS3ptYWRlf3d3SnRDX19V38THycPMysTP0F5ZTXZK0d/AzcvBU1bYwNjy5fr8yv/L1NDDwNr2ysnQ0V9PWlzV1MzA1FhGXEt2SVpDQdLB2V1V1lNXxPTOzP3k8vT0219IRVJUxvLL0dVNcnxNRUPVxNF0d09+YWFyfXhIVVlzcnJ2dElPSF3R0dRXV1pMR9VQRNvzyMXBxtvcwc7P9eXh5f/8/snE9vH2+uX2997U1VbQ1VXWwdFEdXl4ZXxaR1/O8vTEV9LH1dPEwcL29vDHQ0x3cEp3TdLa1VJZ1dVYU19MV8fd3F92cmVjZXpxRURHT3FydFpdTkHL98v02FJVQ0FVWlbZ2N/W3MLM9cvYwPHy5Pr0zPXEzcrD8PjwxN/b1FtQWHB0V8TGUEx3eWZ9d3XS9/fB0tHU2cjbV8P65P3w8cZdRNdeRNXfx1VSx8XRUnd9c0VXUFpAdH1lYWNmfHdJcnxDdXZLdnNOzfb12N9ZdHN0SErX9/bR2f/x9MfF0tn3wfbw8/L988jY3/jh+vLw5uX/w1BFQcXS1Vl1dnttYmFlRcP39PTz9cLd1FfD+PPPzvXfXXN9fH5cVURG1crC3lNBcHdaR1pCd0lDeW1uYn9wfU5QV1tYR0NB0vfz/v3M3V13fnJayfTPzvXw9M5QR1be8fXx+/r6/c9XW1rC8fT98OXl/sNRXkXUW1nXXnVzZGNneF3X2fL299nTXVtY2vn09v3y99pfd092R9dS393Mzd5ZSHZwRkhDWXFwc3tnZGR3RndCR0p8f3lxdFrJw/P4xkV2cnt7edH3x/Xx/fHK3lBQVfX2+ODn5+Xx3tZUyvjl4Ob7+fn31VDfysXY0kFxemFgZGRJVlfE28HPyMjHwcn+//bHVN9HcmRgZnBNRNLfy8jG1ElBRlTR0tVCSXtnbWlhdE1GX3VKd0p0dd3K+P3y8c/fUkl+f3xaUNvA0Mjz9FZa1d3K9uTg4eDn9FxNTVXB9vn9/fzK2lTS9/3N2MVETnZlZmR8QlZdUUVd29jS3fT+8MLBzt/Iy1FNdUtBU1XCyvT321J0SV1dV1FRREllbm5tZ3deX1BBdnB9e31fxMHa39nQUUdITk5f19RSV9VSVtBbTEVZUdjw5u3v7+HwwsnO9vvh4OHk/8TVxsba2VFSRHRzeXp9dUpFWUxDX1HY2cL++/DI2dBVWV5XTnV2c0ZEVsTNxMnUSUROcU5KW11JcmVgZ3p5RFRR0ldYUnZ319BV2tBdX0FYW0pbVVnW3tTe0dPP10dRWF7BzfLj7ezj+PDD0M3x8+Xk/vZXUthTUdNcW1BFQEh2Q0ROQUR1dEJUzPX85P/y8cza3VdWVklMSndFX9XG9srE0tVQdnFEUdzWU0pnY2FmYH51dXRITUh3SkFcWVpfQEhGXllUxlNc1VlaWVfW1tNWWUhMVM7l4Ovu4eb7x8nz+OPt7e3n98fcV1hF3d/R31BGR0xwX1JJQ3ZyR13UzMjB29jMxdjN1F5TTnl2cUpVUd/32VtEdnJ3dVfR2FJ/emVjYXJyS0VHXdVQU9ZRU97dVdfd0dfY3NdXUkBfXEVR09dTUEx1RNPF/+Hh4uX5ysXL8ubk4OP69dLTTV9ZREVa3ldVXdbdXFZTRHx5dHRe2szJw8TT3sDO8vHJwVZHTF1UUsXD2ENyfnl/fERS3snCRX93cnl/dEN9cU90dnJ3WkRBWHV9TEh/T9ZWXltQXl/V2sDE31NcSEDWVv3u7uLn5Pjl+vvi7Ozj5vnMwt1SUl5NQ9RVV1RWxM7TU19PdkJIc17fVE9MT0tUxdvT0dlFSHRB1F7A99pcSkp5cHRxXsXAQ3Fwf3hlf3dCWkBFQdLc1sHfxVBFX1pZdU1TV0BwSkBF0N/ExNvRQ0Zd0s/84+Hk5Pz1x/fx/Prk+szOx9rRVNFW38XSX0Dd39XZ3NxRTHN/d0Nb3dve0dHfyfbK8crMVEN2cNzD3MXEy1RDcHBTRFPQ30RyfGV5eWV+dkt2cXB3WkZCQljVU0Zyc1pJcHdOcHp2SllQ3/bE3UdFR9z75Obg7Ozh5uTh4O/t5eX/9dzYxd/SwsjGzMPdwvTBxNXQ0HFlZXF1cnNwcHdNWtfDwPTEWl9CfHNS29dT1lZMSnd1UtbV0UxKdmFlcXRxdkBIdHdHXNPP2Mbf2dNDTU5AR0BQSXZ2dltQxcHSUEBOf3bUwP/55+Pj4+Ht4+Lj5/rA3VhBWXVe0NTW383R3vXz8/XLxdNcTE13dnVzcH9xdljb9Pj/98XZ1U9NWl7VUVNXV1tJQtDSXl5Gd31/c3ZwdXJ5cXR2cUDc0kRQVE1HQU51cXFwfXNzcnND18/N0N9YQEdGV8Dy8v/n4u3t7+7r7+Hj/NjIy9rU091X3c339PX++vv0wNJBXUVzfnN+YWdgZXZL0s33w9/ER09Kd0pOWENS0tDb0VPfxNVBW3N+Sn5zcH9nZHFySF/cz/TL0sTcVsHWVlR1fnh/ZX5JVsbBzNdeTX53RkHSzsz2+Pvl4u/v7O/g5P/Az8DT2NVKStDXVM79+Pjm+fb309TQRUNOZW1nYG9+R8H2///J8t9W0tbf2t11XNdKQFXf0NnZRF5KfnNwc3JlY2Z9YWFNVlTEytXV0VNEXl1OdmRgZ2BgfFlTVsJRWkdIT1PG9uX75eDj4+Pp6uiV6+Dn5P/28vXF31jd3FTF8OTk4+fz9MdRdEhMZWFva2hpY39T0dv329vUW1xc11FSSHF1fHFMU9zT99tARXZzdUt8e35hZWZmcEPU2/P0w/XA0tRQQHFNZWJkZ3xCV1zayVLQVk7QzM71+PDJ5efm4unu6ZXg+uTKxcnEV8XdS0NHTtb/5+bi4f79xVpQR3l/f2xoYGZ6Rl1SxsjAxsTUyfHdxM1SdExDRtLAxcHeT3B2eHhzZWF6Z25sY2F2V1THyMfXVFBFRUtzdnhvbmZmeUxe1sDa1MbZwP/4/fzn+Pjj4uuXlpSV7ufk+//7+/TAz9ZNR1jW/Pr+5fjN2FRFVlNPeWFjaWlubXpzcUJVXkfZ3czzwFNV10J1Q1DFz8LSUXZlfnl5QkB+eHlgYmV+WMfJyM7EW0VQUtjN1XB/eWFhZmV0R17Q2tXdzM795fj19vn8+efi6ZXr5uT+z/Xx8f/w31NXWnFEw/34+Pnyy9tX1sfJ9V19f2ViYmZld19U09jb0Mj///XIxtTZUVvX0NrGR3dycmVkZXh8eGdjYmJuZENe3NVTWUROdUPU2lRJfXpkbmNgZ0tbRVPG2NXO/fz7+Ofh4+Dt65WWlu7t4+f//f729PfNxNrU0ff8+OfyzMDTW0JZ1lRFfGZvaWtqbGZF0EPZwNlXxvTFy9rfUUNPd0zV2NtDSURPfH5yfHJyZWFhen5wUMXP0tLXWF5f2vXOxVl9ZGFtYHtN0NhXV9zaw8Dy+f/n+PXL8fv47eju4+fk8M7Yz8rbzNBF09rI9ubj5+X13VFS1VbY10RyYmNvb2dK2cH131LPw97N/v/MxEd0dHBQ38/HVVh8cGViZHN8YmJpFGJjZEXf09PTc3xNR9j39Vd2eGxvbWFP39Ff3El0yPXx5u3i4frLz/7m6JaUlOvnyvP5yvnh/9FbRkXI/uTu7uLn2HV1REVUzdV/bWoUFWxkUsFTW3BlSsH38v7/zExlZ2V8V8Hw2lRYZmZlfXRHXXlsFRRif9Pz/vj9zHZ+QsX8/PDQdmRvbGNy0drFQXd6Z1rP4eLh4vnFR1zK5uqV6uL6y0xSzvnm/vdQc3xI2P/rlevv5MlMcVXA8PTaTGRibmF7VfD3x0JLdEnZ9+fn9NJ3emRkdN318slBdn9gZHFAXHluFhAUbmFC9//2XHdOfX3d9/HHU31jY2BmSMLa1HFhfExexPjt4uf2x/H65OKWlZXo+fLy8v3g7+XJWnxIzfPy6JTq7czQ28bTzfDTQXJtFWlmZ0PSQ05kYX1DVNLy8dhEZWZ/XkbcwlbQSXplc0BR00R4YWoVbHJG1f3z89x/cVBWxfLx0FBzYWB5RNHKUkJxY2d0VsH45fb21UfU9/rn6e/m5PfBzPb/4+3HWktzSFP/4evr5ufzzszy/P3620J9e2djddXP8UFLdHBwQ8vx5PBQQHZxftfN0cBddHJ/eX1QWlZwbWsWFRVjdEzT1UN1S09e9cLGy9V9bGd4e1Lcx9J3ZWdyTsf0/+H+yVDN/Pnv7ujq6PjK+f/h4uLs+N53SdHF++Lp4uXM2PfJ+uT098V3bGtiYH1EU0N8ZmtsZnPCzPHCQn9ldnHW98TbUUxnYX9xwdxATX5jFGhjf8TAxNvXR0Df0vrmzfbTSWFmcnTNw9XQXXxvZXfd5fzk/MZWUcv35u/s4/rwUFfO9+Lg4eXbRHND0PLs7+P4/vDL+ubv7uH0SHNhYn1H2N9AfGVgbGVI2/H3zFhNSnJYxc/2xnF/f2JnSlnTXklnb2gVbHpxdHd4eH97SNXSyfXDQXdxZHhBUlZXQnlkZnlY2frn5fn++PPl4u/v7uD9+vHA8vjh4+znzsBW0ffk5Obh//vy/eLs7+L7yE5xZWNkcX16emxqaGlnd1re39JeTE5JV8/MV19Ff312cVfHz8VYfGxiYGF0R0t1QHBzU9PL//7331FIS0p8RV9NdH1hbXpyQsny8vT28fX5+ubi5vL2zdfYxdzw+fryyMXQz8L0+fzy/vD3+Obj7ent+vDFWU9xf3R3cnpmYGZ7cUNV3dzZV0dYV9XdwdRXVVtGT0xPWlxJf2Fvbm1iYXx9f3Zyc0JW19bF21FAcXJyfnJ1dnN8f3lzSFPY9vn///Pk5uDt4uzg4OH58/P88/P9z8fPyvTx/fz6+vv5+OXk4+/g5/nLwVxPd3N5ZGdvb29obWNlenh3SUtBUlHd0VNU19TWV15QRXV9dn1le3t7e2V/SEJITkVY1t7b0t/aWVhPdnVIdHx0dntyfXFdVMT18s/B8P/n4ebk5ub++/zx/sva1dVXWdrexvP08frg5Prh5u3s7eHm5sraU0xaQ35+cX5kent9SnRbX1VfSlld19jZw83O0V9cRF5AcmdhZm1gY2F+eXh5dnN4c0JBXEdBVlJMdE90QU99d3J9emdzSV3byfT/+fvn4u/r6O7p4+X58/Dw8NpSV1fe2cDx/Pn9+/Lz/P3n4+zm+eT13VdHSn95Y2xpaGJjZn90QHZ3S0pZRl7R31XZ9N3SUFvc0VJKf39mZmR6fXFHRkF2Q9VT29nNx19bS3FDTV5BSHF8fHhzfVjY2trRVNTB/OTj5uPv4ub4+PXLwNVRU0hLSV3Y9f765uf6+Pv65uHg7eD48PT39/fKWXR9ZGNgZX9yTl5dUF5S2fXxzd/SXEJOdHNydnB/fXN7YWBmYGFgZ2BmYWBkcEx3Xc3YXl9CdXN2c31kenx6fnTYxvb8/fHz/Ofs6O/p6ODh+ubn+vH1wNXWVdLX28728/D0/vj5+uPg5eHn5fnxy81fcXB+YWdnYWZ+dndBQkFGRllFWNDW01JeWkhMT0lKSX5kfHh6c3FwdEt0dXBzd3VHWNXa297F3dpfdHJyfmR5cnd0V97J9c7L8f7k/v/l/v78/MvAwMHU2cze1N7YxdxY2MfO9ffP8f/74+nu4ODk+vz9w1dIdnF9c0teTltV0ERYTUVX3FNT0tbUV1NCd393cXBkZ2ZgZHpkYGZgZnplZH1ycEpSUFFTXUVPTHZwfXx2Tk9Vx8TP//n19ffx+efh4+zs4uLj4fjw9MBUX1NcVNvLz/Xy/PH98Pf++Prn5vjw/fzwydjXTXNycXV3SXB9c3V2c3RNcUzQVlTWUERHdH9kZX9+fnl4c3t6c31zd3FzS09IWtdRWVBFT0RCSkhKSU13S1JTU9TUVcPC3sP39c38+uTm5uTn/vbI9cDS3EZMRkRH1tzH9v32/fn5+/rk5+f+/PP89vbKxcfcUN/M0NHUU0RFSktIdnRaVtzJwN/R13VzfmZsYm1pYGRlZHllf3B/f3dwcHJ5d3BycUVCdndDdEtbXdDZ2VxW0NPFy8/J9fng5uDs7OPh5uT98/fIxtvYx8TdUFTF2vXw8/j75fr99vD29cPIzNjaxNpWUFPVUV50Q152dnRMdEtOS09HU9zF1VdGQ0pwfmRmZmR7fmR6fHJ2Tk1fVF1FUV1PRkZBWUR2dnBydF3DxN/TV1LTVlZXVdnI/v3+/+X+/fDxytrHxNBMWFbWXEROXdzA8uXg5uT65/j09PfD9P/4/PD39/bx88PYXVLU3FBHRtHWW1NfXkdRVldfQXF3dnlkYWBtY2NiY2Vnen59d093cEtJfXtyc3V3cXNxcFhd2d/FzdffxN7Q2Mby++X+5OHm5ebn+Pz3/vnywsHC29VfS0Nb1PXy/vnm5Pvk/M7B39Pf3tDdxc72zMnN3UFPRUxKdHNJRUx2SlxCWVtWWE1MQ098fn9+Z2FhZmZ9c1rVRFDZ2EBDQUpwd3dKd3J1XlDQ3t3RXFbW0FtGXMTTzvXIycj9++fx8vb2zsjPzsTQUlZZdlpEVN3I8vrn5OTk887w/fPy987K9fj65/3y8szExFlMWUFT0NZxTF5GXttVRkJPTUl2Zmd7ZGdnbG9pYmRxdnNDSXd1dmd7enllf2VmeEtG1cXV01DVUMfVUdzJ8f799P75+Ofu4eXn4eTl/8jOy8XW0kF1Qd7K8Pzl5PnO9ffQ0sDM2M30zMryzf3/3NXVXkxNTXV0R0NQWHFKXVhU3VNEQUdzSHZlenN6ZHllZ2R5eUVTXlNGd3Z0cHR3c3BOcXZDQUPX31FUXVte1l1X09/S9PHK/Pj9/OT6+PzK2svP2djdWkxAQ0XUUtz2+fz+/8L19/fx/PX0/fz8+vP2/vn4/f3Dx9jb0NpWQV9bQVfEVNDS3lhadXx6Z2FhYW9vYmdneHtwSktwSnBmZHp6Zntlen58fEZDSEfdVkTQ3NJWVND39fXz5ufg7O7u7+zm4vv2yvbb09zcX11cWcrFwsj0U1LT3Nbc097zxsb189rL8ffPzsTf9NPX1lNAUVlGQlxOU8lU29FBcnVIc3x/ZnhyZH9yfnlJRFLVXXBKQnF3dnJ8cHBzcXV5SF9T1FxERl3R1tLXVs/OwfT98Pbl5ubm//fw9NvTVkVNQVtBXl3czfX28cVZWNPH3MLI8Pz8+eTl8PD4+f35+/v/8vfIxNvAydBQ39jf2NrWUnBnZHhhbGBmZmFnZ395ZH50cHxze3p+ZGdzfH5zcXp/SU9CW15R0VHS39ndzff++Pr/5+3l5eHm5ODh5+f6wMHN0FZRWUJV28LMxVlRUE12T3NwWNfDyszU9ffC39jXzvb9+f/O1PTJzMvEQVTZ397aRUJecXJzZG9gYX5yfXh3S3VGXnF8TktfRHRlcHZJXdRwckBH09RZXcdS1t5Sdlzd2/fx9/L68Pzy9dHM9/f3wlFeRkvX0FxLUNTJ8s7c39VUVV9Mc01czfP/9Pz9/P3z9PD6+Obh5Pzl+vr++/bQ1tzR1ddeW0B0ZWVia2hjZ2Rlenl9f3xzZWZnfmR4eGd6cn90X3VycE91U8bPyMjc2cDd2/X//eHj5uHn8v7l/fDyy9PQVFNU0NDE0lHW29vC98PF00x3TnJ9SEFb3vXDyMHFzvH18vDCzfHx8f/w9/78w8fRU1/f0dZdd3hlY2NkenhwSXZPW0BNWUBJSXBnZX55cUFMQVFaWEZbT1Df2MbHVFzWVdHb9cLz/fLz8vTAy83Y3ddIcX13SFJZWldcWdnN28j3zNDUT3FORkHdw8TL8fP0+eTn4efl5Pv8+OXl+uDh5fv9zMPA19LURnlkYmlpbGNmZGV7ZHh8cXJzcXJ6ZGFgYGZ+d0RMSUlCS1nWwsDLysbR3NnHyPbl5+bk5uT65eXz9MLURUN0cVhX1dzZUlLV09zb29BURXZyfHhyTUdbVlZZXNPO//7+/v/y8fL+/Pzk4ePm5P/398nLwlVMfWdgYGRke3l5f3BycUFZWkNBSXN8e2VleHJ0TEJCTU5cVN3OwMDH3NRX2cHO9v34/vz2y/b1xt9TTnR+e312cUJHRFJUUlbbxcTd3VNFS3dKWFHc3N/Aws7L+eTn5ufn4eX65Obg5uHj7ODn+v/KzdZBcmRibmxiYWZkYGRlent9d3Vwfnl4Z2JnZmdlfn5zdUlQxNrM8PXL9/TBzMj85fv45+Dh5+fn+/HDwFVGdEhOdHd3cXZ1SVnQ08TP0lFaRXV8cExERUReR1pR0PTx8fbx8/Ly+OXn4efl5Ofh4eTk5fPaVU9+emRmZXtlZHp+e3N1SUBAd3J8fn9+e3N0cnB3dUhE1MH19/bw8cvM9fb08fH38/P9+vzI9MzWRHF5e2Vle394Z2R7eHlDV9Hb09TXQEpbR0BV2cTMzcv28/P85eT65ef55ePs7+/h5+bl+Pv58vfKzFZ1fGVkZGZkZGBmZ2d7cXZ3dn96ZWRhZX99dkt3fHR1dVPb2Mvx9PH3yPf/8vLy8/Ll5eTh5vrz8d5YX0VLQ0x3dHZyfHNzdkdfQUl1dndzeH99cnFAQEBZU9LAzc728fT18vj75Obn5OXl4OH65ODk/PXH2FdPdHZ+ZGV/eWVyQkRfWkJJfXp9f359d0BESElfUlFRxvb39Pz+8/7++PrwzPTIzM/08fb0y9NCdXByf3t7fmRnZ2FhZXp/dnN9cn1ycHJ1TEVEQ0VUUFTAyPL8+Pv4/uXn5ubh4+3j5uPg4eDm+vTTXVBAcHJ0d35lZ2dlZHt0d35yd3J6f31zdHFwdHdwTl5S1Pb//P7++OHk+uDg5uTk+vn+5ebg5fH39dBbXU91TEp1S3h5cH55cndzemdmYGZneHd3enl3eWRne3Z1cUdYRFDezMrO9vn+/Pnl5OHh7eP/8/fZ1UVb3N9UU1BYW0tIWlle1VFWR0NQVV1bQENEdUhAW9fL8/zy9vD89/P65uPk5ebl/vvy981VU9dPfXZ3dUhxf356Z2V7en5NWHV+e3t+cnl3RXRxRUF3dkxT19RQ1sTVU8XJ9vT3w8TI9v7n+fz4/M9TTX94dk9ZXXdLWURKSV1SW0VCTkNLQ1bSXFxWSXJyfE3W3sv45Prn5/764O3v7OLg7O7j7eL5/PLD2NReVMHF09RHcH9lZ3p8cnJ0fGR6ZmNlZWV+fntkemR7f3h7f358cEtHVffI98rawcrawcHF28fN3dZaQV5VXl1bXFNR3cbw9M3a31xSXVHV3NjBylVAS0BHU1Taz/L8+OT5+/rm5fr5+uXh5uDm/Mrf13RLQFHT2NPD2tVGTFpxfXxzfXJ/c3RJfUlRTkpyfXdNSEVSWXZLT3xxdEFR2N/fz8ZRxNhFW0dEX0Bzd0x2ckx2enplf0pYRlfHV0JUUEXVUFbHw9zGxVZfV1lV0dTD8Pj74eLh5+Dk5OX9+Ofk/+Tn/fb1xsjPwPH9//Dz88jM21JdTXN3S0p3RFpaWE9wfXpnen9wd0F2c3J4ZX95ZXJySUVTXtZRX0BBSXBLS0FZUV3Q1FJNRHV2REdX29JW01RcRlRHR1Nd08PQVtRSXkXcV9HY3vDn+v/+//D08MzJyvb75/3K9ffNwMraxcTazfHZ1sDAUl5SXlfW08PyzMz29tvZ0dHUUVDfz1NBUlNEUl5CTk5D0NlYSEBIfnllZmBhZn9weHhwc398fnx3TkDS0lhCWURNTXVwcUtMVddWVt/Q3d/WUtfcx/b29PX3z8/MwNrL9PH+/vL8+Prn5vr9/Pfz/fHK9dnZxttQUdzTw8PBxsjDwNzWQl5RX9RTWlbWQl9WWUtbR1/S39vP2UNAQUF+f3l/cXdzd3BkeXB8ZXBzWlFTXNZQRVNZQnNKSk1JWkbWUHRMXEVGUVzR19HQ3lpJTVtHS01ARFDRVczAxPXxxNrByPfw8/L59M7N8fHx/P7x+fvk4eX5//r4//HM2crMzc3b3sPLx9jMxN/1wsDfU1hSWUp0Qnx7fnp8fWVmZGRnZXJkeXF0S3d4e3B0cHZKfkBeXF1ES0VfRkRbRUlUXdzE0lHQXV5dVVFAVFzByszB9MHJy8vRUNbV9M7a28vAys/B0NbSxfLx9/P/9/TOzNrB0tr2w8H09cnx8ff0983z+vD298ba2tZSRVlF0t9bQUR1SEB1d3VwfkpwfnNxf3Z3cUpNS3RZXllYXkBbWkBNSnBxTXd3c318dnZ3fX5zdU9IRkFdWF9TUFhGU9Hexc3L9sv18/zw8Pnl5uPh+v738f/wzvfz8fn/8PD+/OXl8cv398L1zsv0ytjG21ZV3tNW0lxYU0FPV9FYR0xyfH9leX96eXdweX58f3ZJdE1eQkFdQEpEQU5eXkVXXHVCUkdDXl5aUFBR0ldHXVRCdHRxcElKTkRPdEFfRV3U2sbP2sHD29/B9c/JyvbO8P3k4efm4uLh5uXl/vv9/vPIz8rKw8DDy9rB3cDE0sXD2dXX0tdYUl/a2VZXXkBKdHR2cEJOWU99fXJzfHN8fn59e3xkZ3l6fn1yf3h5cnFNTkFEQUZDWkRDQFhd3VlFXFnR397R1FDU3NnQ1t3bx93b3tjA9v76+vrl+/r45OX7++Hh5+T4+f7+8Pr/9Pf98c/bUF5RUkBTQ3ZKUVBWUlpEXkVAVl9CRlNATEt0SFtBTUVMdkJWVtZVVFRVREx2fXp3XFpOdEp3SnJzcH14SkJOcXxwcn15e2V6Z3FGWklHRkdZXNbawcf8+vrw8PP39fHx8fz2+Of+8f38++Tk5eX78/n48Mn28vbK9d/S3tbO8Mv18ffKzcHQUVJd19VbR0FHS3Z9ZGRkenFxfXZ2dn96emR4cVjWUFlfWkZLSEFNWtfE29ZXVF9fT05IdnN3SnB/eXxycH5xdHZLUd3dVdXZwcLa9vbPw/b08fHy5ODm5eLh5P77/Pzz/Pj72l7UT3RH19XYxcfPw1PRxFTUw/b2yfD2/PNRVtvT3srOz8zA3PfFd3N9eXJEXkR3SnNMf2R8cHh9SnN0fXByXHF9d0B1d3Zzc31xc0R5ZXh+ZXFKT3VPRk9cQlxWXU1c3dnQzfD8+vP9+/r9/ufg4eno4uL78vv98eXl5eX6/P3/9srG2NDa2tfRxlRQXnZJWEVY29zdxN5U0F9LSUR1SlVBSHVKcEZCTVfVQFrTUFRTRHVPc312cmR/S31NR0VCWkpwSnBlfXJlf3h+fndycEdxc0NbR9bd01TcVN3O3dDByc3+/P338vX3/ML0++f55+X48PbO8PfewvP58Pj5/PT0w/f2y/Xy//zk+Pvz9d7NwtDU2NFR0UF1c313TnB+eHB8f092cnh4e3x/eXlycnRGTkh0dXdHXExFX3VGQXF9e2RmZWRmZnp7SkRPSnR1dFBQWlDS0/P89/T39ML4/vz/+/zg4ufm5vry5v/98M7b98na11NOddPV1t3a3vHN093EWlHBxcnew8L298LAz1lQydDV10RD1UVxTHdnc3d2W3VIQkZadkVKeU9PQ0h9dUJeVlvUQXZNSUpyZmdkZ2RkeGBgYGd+eXxJQltaX1RKSEDUxt7D9vL/5eHh5ebg7ezg4OHm4ebl/87MxPX08fH3z8PB2N9eU1FUXFBURVhW2sjNwPXxycTD3kZLSXdOdnl8SXJ0XEBOS0t1RUp2fXJkf05xfndwdV1JRdVSdllEdHJ9enJ7Y2xtYmxzSHRxcHh3dHV3RnR3VtPYxtvZ9/f8++Hl5+/o7uD6+OT7+P7l8/rn5Pv1VtXSVN3W1FnU1t7cV0DTw8jy/PHB8/3l/vTe2NVX2t9cWtLSyvbSQlhNXdddSnRHR19fcHtxckDVXHB2QU5Od2VhYm5gZ2VgZmVmZ2Rpa2pqbWZgYH13dXdGT0Be0vbn+PDk4efm7eHm4O7ql5Xqlerp6e/n//H//eXPxMHTTVjcVVbXwcHxxsHGx1XfxVBaU9rI/fT19/Xaz8HTR0VeWVBAXlZZQVbWU1lYRFxTWF1YQU1Md3d0d3RGWVhSRExNS3lnYGFmYWNtYW1ob2NjZHh3WlXW3tnS0NNW18PAzvzg4+iVlerq7uzi5+Tm+/3l/c3I8sr0xdzDyML3887C2MxdW8/f0vjz+u3i5uzt5P7y/Mrwxs/0XnBFSXdLc0lbXUfTVHd7emxuaWlgYWZ4Qk91d0Z1dXB9dnN5ZXJ5ZmBlZH9+ZUh1dkPXUF5VUkNaRFHH2Nr95Pnl4uLg7ODt7ePm4eD7/fH38f71/Pv99/DK10ZAcXl7enF2dUXHz8PP9sPOzMLy/v/x+fn0ycrN8/f0+P/K2szfWkF3ZXpmY2ZmZnp8ZWVxcmV4eX12dn56eXh5c3BycH55c3xle3pnZmZibGBkeH5wQdjawfD9/fLw9PD8/+Tg4+zr6+ro7OPs7efm5/78//XWV0VY0dFFV9Zd3dvTVtLd3sHeV9nH11fe0sPD3MXKysbJ29jT1UdPfX18cHBwTUl0Qlt0dn9/e3N+e3t5fnB3cnB+fmV3eWR9cmV5eGFhYWBgcnp6dEN1Vt5X1VRARsZeWt3e3f7+8eft4O+U7uiU6OHv4fL8+vHz/Mj5+PTOztRX3UV3X1xIU1VFUcDY9/jy/OHl/+b+zfLz2cPAXFnXd3BNfGd6ZGdzfGBnem1hZWNmeWV5S3Z5dU5zWl5+dkR0cHR4ZXxmYHx2f0pJdUpDc3xKcX5IW0De2N3C/ff08ff1+fn3/vv7/fr99/XJ2ff2x8zIz9vKx9bRUU1ZVVFX3t3c/vjw5efy+vrx9vP12vb2yPbL3MvI3M3xw9HfWHB0fGZ+cXFwe2JtZm1vZ2JrbWJjZ2VgYHl/eXF+eE1EUd3a3NbTVFbZUENVwsPD39naxcHL/cjFxsrIztvbxPH28f/39fL4/fD199He1dFTSnl3T3Z2dExwQU5GR0NK1cP28vL//OT4+f/w/OPi4u3u7OLs4efzV1fA19TX2t3VXnR1Sn5/fH9/eHpkenxkfnlhfnl/fnZ2f3lwf3xlYXZNQUHd28X18cPz/f35//3w+/nw8v3M8cr3/PLw9vn2x9jRX1FITltdXFTK9Mz0w97bVNLe0F5f0VRX3lRbXdHQ1t/W3vb3xs7IyPTx/fv7++Xh5Pvk+fPy+vvwzMHFwNBRVEZ2d0RbW0VaRl9bdnN2d0pMTUxCQVHH3NDXUFlTUEF0SENLQERYWkJPRl5YXNXR3drX1FFR1VFUVFTHwM/w9szQ09TRV1pc3NdU0tLJz8jK9vz/5ODm5/n88fTwyMDC2M31z/Py8sjSUVZdUEFbX1PcVNnazdrdxsjbzMPBxFNe1cPG0kJPWl1DTUdHT1pRR0FEQlhUTUtY1dPMx9vb2tXU3tRSV3Fnf3pkZGRlcHJ8SkZ5eXByfH19cUVGSk1URlXB39/P9PH+/cHP9tXSw8zPzvX98vfO/uX18fLw/PL09crMxcPFwf3xy8LB9c7EXEFbdn1Ld0dPS1HXXlLZ9PXF0lLZVF9TQHVFVdjZ31PW2FBZUllKTnRzZ2dhemRjfEd1SUxLXlpFZGR8d050ZXp8fXx7eGVxd0XFwlFUU9VcREFa2c7w+OXl5uf6+PbYwfX19MzYx9vf01VU1FHUxf3+98nAzMfcXERNRNbYXVLX1NjXUk9BQV9dR3dyXdxQcXxwRUFGVs30/P/2yl50dUl1Wtbfw/TN2ddOcHx4ZmRlYGBhZ35lb21nZmdzdEhaT0hAdGdhZ2d4SnBO29vG999Y01VFU8bQwfbK/frxyf31zfvk/uHi5uPi/c7I3tzL2FX28/f98NRdUEx3RHRyW1dU19Z1f35nZXd8S9FRQXRyfntkZH11S1/E9fHN0drRUlDWUUJHXN/11lLUXtdX0FfezMbAwEJ1cWdgY21tZH52UFRLXtVKT0NyfHFyc1BZdlFbdUFDSFzY3svl99vKx9PcXVXK9vPl4Pj54ef65PfP8PDL+OT9+vz3wsdT3s/H1cncQUx1fHJ+ZUp0TF/SX9Td3lZTd3l/Z2R+cH9KT05NWndMU0dF0NLX3FdeRUN8T0l/Q93Y9fz+//P21NVbdUVfUlnQ1tbFUF5XUFbM9/3zzPXCXUdNUlNe0trL9cPKwFTY3FBSUdfF9MPc8fDEy8rZ2tBW9PHIzvrxx/fIwMHY0snx9P/g8Mn0VE10ZXpCRk3Uwlld31h1Q3Nbw9BbUUR/fnNkZ3hkTNLFxPLIWVtAcXN2fELd19LOzdbB9cPx9/X64eXk+/jz8PDF39PSx/b0/+Xl5eX9yd/Z3MbVxfTA9t/Q0lJwQkFIQHR1Rl5IRVFTc0Za18HP9PH8zsHVU0XW0cLN8/jm4OTl8PfB9/XLwMHb3lxPdHJ5eHdL1FPHyvHM39RadmVzdnR2SUfSVNHWXkRHV9DeXdbJ8M/fwMFQV9HY/fbl7+vt4OH59PT19vv55O3s5vj11F3eVFfBUFf198nL33B+cX1BVVzC+8RAS3xibWdjZXN9UvPZ2cTZ38zYVcnIVMLywvT131jf3ML7+v3j5/T+8VVaW3x5f3thSkl0XUJN1FdKWtdRX/Dc0M7TTkp3fV3HwvDk9v3m/c/CVUbe9cXK5fL65fD09Mbd9ffJ8vnK//LBUlFYQ9PC2sfWSEZBd3l9eX1ISXFbVF7ZwNxMRXVzd3Z/c395fXFkZ3BydltUW9vM2cH33F1XSnBOT3ZW0N//4fHM99FGXFZLW1BE1llkZ2RmZHZ0dtzH3/by01NcXEXVVlH39cn99sbM1l1QydlVzczDwldbW0HU1vXb199bX9VXUFxTUUFQUFDV0vXF2sBRRnF8dHB2SnBKf0pNf3B3dEtNQkt2THNLfWFiaWpqa2hieXB+RUlxcHFPQ0ZQ0dLVWsfSxcfHwPP5+Pz///z79cvY29bUW1hRUkJaUVxYdVrU3VXb01ZRVlFX3dbVVlJYXkFMR1FRWnR5fHh7ZXdDRFXEwsfURFPQ0Fbe0NjMyszKysHOw97SxFFVxN9McnhlenplenN5fEpCS3dzf0tOfXl6YWNjY29ubW1me3lzTU/Uz8vb3Mzfz8jJzfbx/Obm+/j7/uHm+vPwzsXYwNbXx9FRQ3V8cHNH19dOT1tER05OfUdBSVnVT1lcV9lSQFtQQ1jQVHdE0ltc19xX0838yMPd1d/EUNXEV9HZwt7aV1bR2URZWXZ0dEp9T3N2RUFzWVJCWt3TQFx3fXZ3ZXJ7YWF4eX9ATUHY9Nv29srN9vX0/fH55vr2+/vx8vr28P719fHI3dFfRFlEdVpVWNXTQUhSQkJW0d3bzc3121ZQ2t/RxMHZwMXRzM7B29RNREZ1S1JeWtFSV8bdTF9fRlpTWcDxxfT//PH48sjwzdbGz9HR0Ux0REpPV9vH8f3Yzs1EcExye3t4fnVKckhNcEjT01f28ffk/vDPyNDEzPP0+OT+5PTx/fbRwfbK28fNxPTI8cnF297OwdDTUVPcx9rS3d7R2tddVFHQ0MD0ytBS19pSWdPc0t7Kz8ja0t3dVt3F09vFxNNQRk5DX13O9/z65+bm5/XE3l9b1tPd0N/f09FQVNbSw/DJ09NdTXN2ZHh+eHVETUtRwMj58vP0+8b0x8nd8cvO9vHw8vjb9MrE3c/F2sHP9f3fVtr6R87w2Pz311pRfHx0Rl5QXtPD0F7W3VdVx8LYxMLP2dDAy9/Tz/Hz8Pzw9cDe0tteTUVeVNVcdVzcXcPw9//n4Of98fTP39n2xE1exdLe3NPfx9vazlNITHZ0UVh1c0xMRdR0f3B1TUVFU1NbXvXy2VPd3cfw8vn9ysjKx19SXF/C8PbO9cPI8sDW0FDWwNZNS31nck53c3d0Q1xdUNJQQFRXXtXY18TKz8v2ytnCwcD12NPFUEhPR3Z2WVpZWUp2SEFC1trTzMZU0N/W1VTRxcrI9vzKwcXT01R1c3J1SHBxdEp3f3F0dV9V2NZXX3N0TnRBdE7RxNrD9dhFXlhb2VJ1fExaQkhJWN7Q1NtGSkZe3VFZdHhxdE11cnN1W1THzsPa2sTMyNFcV9v38fz8//P9/P79ytjD9cHTcHtnfHhnZ2Zmf3J8dnhgZ3x/c2VgY2V6enJ9fHJycF1VWdbB2Pb001TazdnLzcP8+fjl/87Yx9TAwEB1Rlddx/XAz8JT3MFdU1ZLT01+ZGBlZHx0eUFHQFHMV3FwZGFlYhVpam9hcH9wdXJ/TUZI2dvcx/XF3sj3yvzl5u7s4OLp4Ofm+ufl8dLQxtLM99leSX1kc35hZGFvbWJibWFnYHh5eU9PZXx8ZHl0emVkYGFmfH3V3lLe31/XyNfW30VPV9Ne0M7Yyfnl7Ovt7+rs4O/s4frx2dvJyMjyyNvDUVnB00xEfHp4Z2NibBVqY2xgeWdtbGNtZ2RkeGZnfE9R3ffO2/TJwv7y9/Pz9vz8/P/45frj7Ozo7+Ty8cTF9M3eV0tDQFBX0M5QRV9LTnZ/cmFiY2NnYmBlYWd2SFhXRHdDTHJ0cnJ/ZmZhfkhwXNxZ0Nnb8vrh5+fm4+zj4uLt4+yVl+rr4OXn5fj//cva39da1FpcXXBlenxkfnJlYGJiYWFnenFCSdrw8PfE1NPe1VbQxlNT1NX1/fnk+f7++fr++87VRUBQUNFARtbV3PDx/v/Pw8fYVNRdRUxDXt3My/PJ0FJTVtXT0FxHdnZHTXd4f39wQ1Pa3llb0FRc3MfG2Mjy+u3s4uLk/vrl++Tk/fLwzPD4+vz/+v78+Pj/9t3SX0tISUx9enBzW9rM8c3A2M30wcvdWlN2S0FDQ3BbUF/dxPDyxs/H11hGT35kZXpxWtbP29dU18DYwsRG11NT3N/MVd7NxvL+5ODk5f78ysj8yNvAxs/29vLxwFZeWVheWXZwcHJAU9LV19zf9/z+5+Xl/PTBUd9QQF3c2/X55+Hh+v3588PRRXZ3cnt9QV1Y1dJUxvf98/z7/PLeVNVLdkNHWlLV39nO0E5bUlxaRU9zeGVlf2Rkf3hzdV1SX83cVd9NR0xLQFD0y/X//uPi+ufn5P/09tZT1FHJ9/Dzw8vPxt9e2VxyTXFzcXx2ZU/QUcfE9fzCyPb1wMX1Uk5QRVjUUVZMR1bQzN7Pz97Kxk13cX1hYX95dExX2VXczcLFxsrTX9LQ2cLw/c/bx8TLwMXEX0ReRF5eQXx8TEp3dEJDf3ZCXFZBR31leHJ2dk1FSEPX3sr99sjBzvTOxdhRQHJKUN3FxvXPw/Xz8c7dX3J5ckpZT0NGdkbR3sjb28HT2NPV3l9HdHtxQ0BISF5NQVTZwF9OS35+cHd8ZntmYH5yR0B0WktFVVTf09rQXNXTz8rJ8cnB9vvn+/fCU1vW28BU19JF1sbYxdfTUkFER013d3xmZnt5en5NdUlQ3MPAwlVDc3N9ZHh5eHpzUtZRwMfU09PVSUFYTUp3dUl2Q9ZHTFje2cD2yN3TU1BW09hNTk1YUlnc1kFcXV5MQNRBd3F8ZGdnZWVlf3NxT1BMeHl/Z2VzcnJ3W1bb8Ofg5fn6/Mnz/PTw8//K9fbJ8fH1zNzJ8PHGx8xTUtzUSHB2fX9HXVLXWVRQdUfQUlRFT3l5fWdlfUh0d19WVllNdWdgZ2ZmZnl6ZUjW2dr1zFNZWVHSyvD0wMPx9cj1/dpS0NrM8fPz9Pb2w8xVXn1keHp0Q0VZdEh3c0BQwddNS319T1NQV9TFzPzk88rY3NNBUMPEVlHYx/z68/3Mx8DQx/L688LG0NjL9P31xNfQ2/Pl/Pb28MLJwlRcdn55f0lNRUJ2d3FKTEl2ZmJgbWJkZX94e3l03szQXHV1cHFTWt/F3cjz5uT55/z++vjn4e/i5v7/+Pvz9PfJ1N3Gw8jPxFXX2cheSEN2fX5IdHFdXltWXNzc9/LBRXNDQ0zcxdBXUN/Sx8bc19fe2VVc0l1JW1Xay/P/9/39//vn4uD79vXL9vv+y9nYzsn29/Tb0VZTX3R9eGZgbWJnZHZ4eHpnT1bB1EdIcEfVxfPz9vH1/uXm+v3w9/D7/P389fTax8r39sbIxtb18fzwz/TRUN3K8tza2dTMyvj99fLI2svwz19Odn9zQlBcRltZdkHa2VJKW3RwdUxcSE1KcEhQwNjR21TQ9f/9w8vKzsz3/PPw8f/45OPt5vrl/szS0NzH09PSxvXOwNvHxtzZzthVQnJ9cUxDQE13TUVF3NXVVUBQUdHUUNjW2NRfw19EXExFQlbbXNBFQ19ayvVXwcTGz/bn/Ofm//vz5P9Q3sHF3ND+zMD1xPfSx8x3dnFkYG15Z2Jhb2JtZV59ZXB9f39WVnJFX1zVVv/01sbGz8b74P/75f/Lzuf6xVbXxN30+/L+//LKy+f42FtR11Ta8PHK9vXfXvXw2VNOd2RmcXV2cHhkYH5KfmFiZmFnfX1kZmR7en9KR1hPdnx7dVXb2tpQUlfI8/D3zcPD9/Ty5eDm8f39+uTO3ltC1lDS2MHHS09bWlBeWXNgZmFld0pec3hyekpaT3BgfXR4dEFff2VweHdaU1Z5fnV9Q93K3kxQVlH05OT3zv3y+ODu6ebg5/344OD3x8rH28v6+M7YWkhwSlx9Z2wVamphZGJjbmoVbHlhYmFgYWRM0FxEdHN8StnbUFBMcU/V//D19dZaXvH+y/PCUFTF+v7+/fbOyPrk8PbHXVbC8vvl/vFRSFbD2VRffWFlf3F0cHxmbGNnY2ZhaGpoYWV5cHl5Z39CQVlHTndO0sD35ef7z/X+5eXm4eX45OHi4u3i5f7z8fPwz1dZ1NXRyM/B1lteTHd0d3F6ZXt/d3FPS3B2Z2ZnZnlkZXllcXRDR0BBQUhIQnVKcnZ4fUJT0NBYT03R0drL8uH68uXm7OLg4f775eTl+/r+/Pz45Pr/9dFNdnRwf3Jyfn94ZXFKSHZgb21tbm1hZ2ZneH53S3d3enxYTVxeXVRB3fT85fPx3MT88+Tn4OL75ODs7u3j8sHz/f/68P798ufg4ef+wUlKSnZxf3J+ckhHWElQRGZmYWFiaGNhYWR+SHVZRn98cnR0c0N1cUTQ9sjK8Nbdw8X3zvjj5uDi6O/j7fr+//X10s30w/D95Of75cNFTUpLeH9zfnFeXEBNX0B3fGV7YWNmYGd0QEh2WUlySEpEQEZZSURW9Pz34Of0yMPzzPHl+eHtlZfqlerp4ubh//n69PLk7ezn5+Txz9JGcXh5Z2FnfUBLW1VHdHhmbGxhbG1he0h0RlpGQUlCcEhRS0NS3fTB8PHMzN3cSUvc1tzw/ufg7urv7u3m8t/188/z/+Tn7JTs4fv/xEbT0UZaX9RJRthVXFtccWNnZGBsY2dtYX53cXhzfmBld01NW97R0eTv4+bm4fL0++Xn4+jq7pSQkJeUlObx/PX1ys3HVMb4+vHGwVlkZ3xkZHB6ZHxJXkJJR3dkZ3pnZ31wf3t1XnN1TXhkYX5xfkp1cUlQ9cjI99VFdU5WUfT+++HjlJSVlpXu4uTn+eTh8fz65+Dm4fv030FEQUxZcHp/cHV+dndkYG9uaW9hYGF4e314cUJ9ZmZkZHbUUVrc9vz+5+Hl98zFUkXN+f3l7e/s6JSV6eD+wtD2/8jK8/j++uzi/MRWWnBYVEt0cE53fnZKfmVnYxUVYmJvbW1jYWRxZG9paRUXbmdnfktU3Mzl9sXRXkF3XvTI9vvj6emXl+no7+T98f38zsn19/Xy4fDCx1tKc0NeRl5KTUZ3UVp+eGFtbmlmYGFlZ3h6eXtjbWhuaBVge3tyd1bC9fjE0ldzSHZPy87z+Ofp6JGW6pXi5+f+5/r2w9DP38bxwdladUhwSk5ITnxxSn10fmFiFRUUFGJmZH52RkJCSXB5Z2ZjY3tOTHNHx8r19M/cUk9OdUrX1lf3+OTm4+3g5fn2ysfE99Pdw97M8f75wtnZ2tfWxlVfWk5McXZ0ZGdgbhUUbGBhfHlzQnJ9emJtaGppZHZ3QdTJ/OXk5f78ydjfxvLx/OXn4O3t7e3h5/zx8M7Iz8XfV9LD2MFUWUVIXNDWxtrWRkpTSXFwf3JnZnplcHRCW03fU319e3pia29vYX98S3FHVUdfWk1yZn50SdTO8/Lk7+zt6Oro5+fh5eT6/Pfa9PLw+Pn8xN/Kycj9ytRGSk5xfHN6Y2JjYWdM0VlYWVRSQ3dweGdgZmZ4dHRKRNnH19TcS3F8eHJ0UNzdwf3n+vrs5vjk5fjk5/j28P344eHu7uDj4Obg4uP58MhVX15eQWRjYWJgZn1wcHB+eH58Zm9raRVqaWd5ZHxB1cfB2FBKV0Z3QNfAx8P85+fh4+Hl+vrw8Of798Xexsf08/3z/Pj6+uDj5P39/MPYwNjRWU9MSVlUVNjF3VRCXltlZmZjYm9gZ3pIfXpzWNdBfXZNSkhbVlTYx/X9+OHi4uvr7Ozh7eDm4fv65OHi5eTj5Obg7e3m5f/330VFcHh4YGdlZXt5XFBNXnVMT3p/YWltbGJhZXFleHJ2UUN2S3ZOS05dVc3Y1cb0+Pr64ubg7ePs4+Ph//7/5OLn4uH64OXk4uLm9s/dUtJcWUx+d3FKXVbD1kBbdENBcnltbG1uZH5ydX12S0Pb3V9MdnV2Q1PbxdDdXtPl5frl++Tk7uni7uH3z/b65efh5ebi7+7p6OfyzlPc1VFZfH9kYXp8Q3R4f2d6f3l5YmoVF2ppb2xubG1geUpTWUhASFlQ3/TYx9lR3c345vrn4eXm4+Lg+vTazfXw+v/z/fnk+ODg/PfMxtdSydpFTHV3cE3VV15U2NZG3NZwZGBiYm1hYG9vbWFgcEV8ZX5zfGd/d3J2dEpyQ8L3yv/k5+Xh7+Lj7eLk5+Lj4ebk5Pv44eXx88jQXFdXS3ZyeGZiY2NjZH55eXlyZ2BjY2Bib2xpYmZiZ3txdH1wTHV0dEt2dF9LSEdaR0XY/f34//DO2M7NwvD9ydvD9MDK8vP3y/b8/Pn7ztXZxlFWVFFwenBPVdvJ1HJ0d3h+ZHpiamtobWB7d2R6SHVHX9HUT1pT1cz0/sxQxN/M/+bj//T2zvzg7OTI8snExs3I3lfVU1Hcy8dKd3x5dURNcHhkZ39Ezs5WRnFkZUtFcH56YGF6QlxDSX9+fUDfXFxIZHhz3PTdxUV1Qd/78v7kz8DM/+Pn5vzXRlz1yMXx0UBf2P788vVEdHZU2U9ecGZmfdfBzMBLemRJ1kFUV3RmZU9Z0c1feGVK0t/391ZxS9Px+Of80EhV8fTx5fvaxPD+5unv5cLK/vz74efYRNzfw//4xn5hfnB0fnpnYmZlfV/SUnptYWV2TXV6YGZgZFrB9VN5cVvdyvLNW1PZ2/3k5PRTQVjS9Prm8dPUx+Xj4+TyztTXx/TzwNNdXcjy+fzB2FpewfDwV1hRSV7Mw83VdX58TF/TWHV0YWZKWVdYSWRtckFOQHd0f39RyfDF2dhB0f3n4eTk9sf74unu4ufIwPb45Pz+zlDd8Pz2y8BPdFtUxdZYR3Fz3/H03NxxenNBxsL1wFhPQtTIxM9FeHh+SEJOcGd6dlvb1Ntcd1lSwc7FxUFJQFzx8vv63sX1/Obh4uTy9cf28/fCWVtW18nO9ttd0tj38MrZTXNyeH12Xl90dXFH29r0211YcExNV1Jxd3VCVMTBxVfX08P1/Pra09Rd3PX4+vXC2cT28f/12sFfRFbR3F5aTV7ayfbJx8FQU8Pa0E9/fWV/TFLG0tZXRMLx9PTfUnV9dExFQ3ZxcU/S2sTM9cLWyP/9/vfSW0/Q3MH02sdFWcvM9MPEU3ZTRUBWSXZwfk5QXNDQXnZE1FLeyl1zfXNJ0crHzEZHxdvL8fTcSEpKd1hbXU1fxMX29//31sfB8/n0/NVL19T25+fkw9jdyPjI/cNMSnl2T0VQe3B1cddBTkd+cHBBUUxGe2NnYH1EUVRKfXJD9P3/9VBFcUDb2MjXTk1P18bNzN7Z1dvz8PLCX0ZF3sr99N5TQkPG/vjwwV93QlbFx9JPdHdN3cTWXER1d17F3F9wZGdkck9ASXVyf0fC8cLVU0hxdk9Bd3xne3DA//H2wsPb8OHt4fRXTVLNy/fIxMBcVPT6+vfZUUdf0cPOWHB7endNREF2TENZwsHZWnlkYHdEU1Fxcn1/X8HOyNNQdnNwf3J4ZmBsZE1f11PRXElFTVlTd35/d8DLxtjR31PF/uTi5vfDRdFcRFBFWnZM1djGy9vc19DG08TQdX55d0pGXV5YTln3/uX78c1FQ3Z9SnVwfHJLQEXE3tJXXFFITUBMdXBBUtv39czc3vT18//0xVldX1HA9PTTRUdBXcXe10FGRUdWUER9ZXtkfk1c2sXSys//4fnM1l9bcERXXkJwS0bVzMza9NrXT0bdR3B7eXB22vfA9NZeQVv1wFDVRUV1RvRcQkZ3cnlHXXRR0V5NUPnzyMDcV07Y/dXN8s3P/Ozi5eXy2EBP3lBcxddKdMrKVd3G10VezszZ0VZeWvLn9fb59NfX8vfNwdrddVjZ1FRFS2Vtf316f31Nck3D3NZYS3Z9VNJX1tjP0sDh5+Xm5fPc09lUU1hBTHNY3kdBWEd1SVRcWdFQWlvb9d/dx8TYzfb3xcr03dv39Pbw8dJETHZDfXp9fkvWx8bQ30R/dU1RW01SXFDA/OX3/fzFw8Lxx1PZWUhcXNjTxc3VzfTyydTER0jW2vLKzvTczN/0/sr59sTx8fvxzfVSW0RCSH50fGFwQNP3w/fFXltMXUNf1nVZ2srl+Pr8wcfT3NFaXUxLR3dJcXRAdnJycV9aUkd1RUxZxPXz9sn3yfT39c7a9/TK+fv329VVQXZNRV5BdXVyRt7DxtXXUVDZ38HF1MvI/uHg4ub78sLK8sDZQHR0dERNUVh3fm1heXl2cnZ/ZHNxU9zWx9TY8vT++Pj68/nl5Ob49tVW0VPR10RwZnlwd0BMTHNkcEpewdnAVlTczvnk5uTy9vT29/H82NDU1Mrz/Nl3fnlxdmd5cn18YXtF2FN9fHZEVlHEysVQS1rM/v/FV0VJXtfY9dbVXVHL//PeXUhORFXN9MPdV1bB8v798cDQUsTO2sFbd39/QFNV2dFZSEhbU9RRTkNQxPb3zNhXWkZXV9LFwt9e2PHN9cVad35wfn5IcXl7e3ZeUEBbdXNPQVnf3lZf0vHy5efm5PL3//P95ctUWddX1NjSTHx9d3BzdHV6YX5+ck9YX3FxdV7ZzfHLyPHz4Ozs4/jxxt3A2MPTSXV1SFVQQXR6f354ZWR5ZGV9cFLb8cjZ31LByfT79szH2s/2/PPa00ZGUtdRWEJ0dnxwcXd0SHdLRE5cXVPe38Xw+fr2zvf09PbM8/31yUND3NNTWEFZdH18enB1TkB3QFhFT0bU0dzcUF1YUlxYXVBX3l1QTkHU11VaWdVRR190SUp1W0hMWVhXX1HSVMDA3NHS2dvQ19vPwMTewPf5+cna2t/UVdD3/fDz8fT2yMnY1tNSVtdc1lVYQHVOUk1GSn53fH58fHl+Z2FjZ3JOW0FeWkFdx/X28fDx///y+Pz8+/X08fT1xN3cQnZmYGFtZ2FvZnVcWV3G8MPM8Pz7/fj6/OTg4+bh7+D79ffO1UV/Z2NubmsVaGxnZGZ/f392ZUxDcVNZUdNT9Pzz//Hk4Pvj6eznx9hPfH95ZmB4cVnT28nH3MTK8fH2zlN0d0hGR0zW1FjH9Pvn+MpJZHt/cn14c3lzWtD3z9BXTNX09/v+9sxTXUTVxtvcUlfayfv58d13fX59fXt4fH1MRdTK/fj2/eX7/fDwzdVV3VJCVN5RU93x8dpWWXpgZ3pmZ35ycWV/WlTQ1NpQ3vbM9vXFwNDC9cbx8d7a2PTw9ffWS31/QHZ4dH1lZXJGUcz98PXz5fz4+/3w3MTK3vP+9c3TxcDH0ExyfWVjY2JkZGFleHdB3PD3xfX18eTh4uD55+T/+eft4OTn5ufk8ffCW3FnYmtrbm5vYXF1RVJJSklbXljT0kF3fHJPcl/R3fby+PnIyMnVW1pDQkpfXExHUdfa011EdXFaVtPE0t7VWV5Q3cj08+Xt6+Lg4fD+8vH/y8n339v2/Pv+9MtQWdVQ3UV2dXpkdn13TXZOS0zGxF9Nf2RmYWVnZXdOR01D09bF39Pays7z5eXn5fLxyfPn4eT+8ufk+vLaV3BhY2hvYGB6Z2V2dVvdx/TI8vrm7e/s4+T65frk4eT9+uX/8tdfd2FtbhUUFGpubmZlYXt8dF3U0t7U39vFyvT08cfM2t7DzvTx9d1acUxHfHhkeUtY9fbBzNXb2tLk5+Xs4OTk/OT5wsvP2tlY28rf/cFGVEXd2HZIfXtxfUZedEh8ZnB3XMzT09dX3FDQ9MfM9MXHx/fk+vPcTUNyenx7fnd2S0RNXU93dHREWVfAxMrI39rG8vv+5eX8//Hl4fv313RwcHF3SHR2fHB8e3Rwfnhke3xwTVhMdHZzT09ERUJWU1Hdz//6/cTVR0BPRlxEWdRU2fT/4ePg4uPt4uDn9tLQR0pBS3BxZGR7eXx9REdxfXdwcHxkcn55WUXQxM329Pb65eXl5+b7yvX3wN1eXU5ySU1LSEpNR35wdH1ISXNlY2R4e3RN0VdE1M738Pjk5PbK8srHyPX1V1fF18TNzcFPQ1JxfndKZWgVY2ZkenRac3bR3sL3/+X49+Tg5uLh5vzC8crN8Pb310jf0d/dTFpJeXZxenl+ZmJgdEB+fnRZcX1HUU5F3FZMSVLAU17Y21RA0fzM29zRRUJF39zc9/n29vHz8/f588z38vz+ys769s71989SQFRDQFDR1U59dn1neWFgY2VbQHRDdk52TsDx8fH19/785fn09snL+drEw1HTcmRlfHFnb2gVaGJjZmVlcHF2VNnE3cDOzvnm4Ofk+uX8zOHo6uj63lZ3Wk5ydUpGTXRGXkVId11AS8XH3tzRWllMRN/C98XK8s/F3Ex8dXtzfX1FQNfx9snO8vry9vHD0kZAXEtCXkx2f2FnbWNyfXp6aW1ibmF6fklf9f30+Obl5+fol5eQk5Tp4+bn++zo5v/15OHzwdZ6Y2JtbhQWbmhqaWtjZ2VxfWV+en10Rc3A1llT9Pnw+Pzn7Ovu4vvB2VNDTEXey/bCQHR2dEVRV1NRXUt3XlxTV9fZzvL6/P3//PFQW1hG0NZNdXRMV9j38fH33sTPxMrJws3YVdJdTktMdGRmfkhZTn5nbRVsZ3l9cUXW0fL4+uHj6+ns6paX6uns4fj65Pj6y91RSUZXdXJ+YGlraWhoYmZ5eXp+RF9U09jTVd3AxtDT219cRcT2wPT/8PH///f0zvX0y9v3/v7x+f30y/D1xsDF3V9ATU9BW3Vyc3RwdHddxcfKXUxHck5NcnZydVdWwNlc0tNT2dLD9MHNxdfG2Mf19/nOX9XezvPdQHNmYGNiYW1ibWljZXBMQtbQXcP38+Hn4e7i7O/t6O7p7ubm4OT5VHZ+bmkUFxQXF2lqFW5vZnh+c1ld0vf+4efj5vL65OHv4ebg5uzi//jJ0NBGdXZ4dE1Id312T0xZXNHbVnVOcHZxZmBsbmJvZn513NFzc3BCUExW0VrF/eTp7Ono4+Tn4uni4PjJzdZG1kJNSmdhYmF0eG1vaGttYnx+fk1wdNfS++T//PXJ8/Dn4eXu4+Xk5ezn9PXRVMLKxNZwemFvbG5jemFnY2NhYGd+YWVyfEpxRMzc3tBRy/775ubl4uLm+//48NnfSnpydF/QQNBdQsPJ9vHUydVJVNzN8VDawlDYy/rt5OH8xdfSX9x0c0xGU1BU99HQwdvM8/zt5/H729BXd01IenpgbXpnfmdpbhRrY29hY2lhY2B3Q1TWWcb25uqUl5bql5Xu7u3t4vHw5OHj4fn5V1hfXltyfUN8ZWFgentmZmNmYWZ4cUlfRVhCXd7E9srZxsn8//zl+uf+ytzZx/fP3tnc3VVHSXVPSktNW1tST3B+fXFAdUhF18fH311ZU1JHXEZbUlHT2sL98/r6++fl/P/x/P329N5d1UZGcXNxfHt0fX55Y2dgb2dhcFJRzczb9vD/4OiUlemUlJXr4Ozkwv3/w9NPUkt3dnd2eHh4ZGlubGhvY2dkYWdlZmdlTEJxSVtRWUVXWXRUzvT2+u6V7ebh4+3slO/k++bt7ebg5PTYxvTaRUVwZmNtZGRgZXp+cnp+fXTG9dHWXNvdX8TLwPb35fv0/PrJ0FjN/Pfx+fbaT0NcdV7C0nVmcFpwfX1wZGJgeWBvZn97ZH1S0MLy+uDh4+rv6ZSU6uDk5frw8f3Pw97KXE9wc2RrFxRqam9kYWxtZHBIVf/k+/z85Pr64OH65eT4ytHP9cVVRkdVW1NUd311QUZHV8ReQn5yRVjb88VSR3Fxc3xzeGVibHp5Q1BDcXBAXNPa8PL7+f7n+ufg5OTn++T5/uXKwlZLTXdJUkVze2R+fHt0dX1ga29iY3FBREt+Tl9R3N7a21LV2sfK+/r/8Ofs7eDj7e3m+vzK9cjBX3Z8fHphY21saxRqa2xnfnhmZHx1TV7azFRSUc/+4ejj5fj75P/Jy8dQRkpBWkTUQndHRdnHV9rdRXR5cV5Q3VRbUFrQyd/IwdDTR3ZBV/T0xfb09/j45+bl+fj9/fj6ylTURHd3cnpgaWhqFhYXFRQXa2huZHFDdHReVFHT8eDh4Ovp7O/p6+L65/r1wcn68Nn19djBy/PCWkVeTHFP0FVxdkx/fnNEdXJzcX9kZ3ZKdXdGTkTV9vLM28vC38r98/P65vz19Pnw3lNXUkp0VFZId0xOc31GQHR1TldedVBYQk5HUVhYw/fGWU5U3dbGzsfAy/L8/fPz2tRS0NJfVMLa3MZEdHNzd3hnYGB6ZmRNTk9QzMLK+OLs5fvn4efk7O/78frn5/jn+dB2dk9zZXtwemBkfHp6ZXByZmF/e2R4c3N+eXZ3dUBU0VxNWVFAXd7H3Mz65efg7+/h7ent/vb98dnXzszawM/LWn11SHtkfHZ6YHp3S3RN3FHT9+fk8cjMwd7Y9/rl8/v2wMTazsLRVF5AQdPJ89tTSnZwdkl0S39jaGljYXJJRXFkfnZBUNLL1U5KWcL08P/l+fvm7e3s7OHz0d3188rI9NdLd3dDXdNVVEd3SU1fR0bQxd/C/+bh5/XQSEpaWFRcQ0lNR1fH8fDLws3AwPfNwtVCUfX2/fLN3XVwSHRkYWlrEBMWFGJ6c05ORsX1/v7z+vjn7O6UkZSU6eDv6JWV4uH0XVJ8fE11dXxmd3J/c2V8e2N4cEpaTEZHd1lX0cnD9VB9SlBT0NVV1UrXysjw/OHi8Pz75ebz9MhXQFpV0VFEW3BtbGZhYWF5eX1lZXl8d0NSy9zH/fzl5OTl+v/55OT73lfaSH14ck9yfXVbVlPC9N1BXN1bc3RQ0UBd3fb99/rk8c/05PfW2cjfW9/GxtJWxvTw9vT31XBLRFxFQFJQQHd2cHB5ZHtkZmBsZGBjZX5JTHXZ21XVyvDCWEdSSUJaVtld2ubg5+Xi4vbL9sj12PX5/fT4/OTl8OT/1tzVVk9nYGJpbmlsYGd4dn96ZHl2X8b28vrz9fPy/ffx5fDD9vbK8vL29NHXQEp1YXh8bxVrYmRlc0hwc3VY1d/Z9fTLVUfW1dbM9/76//zD08LL9c/AzffAwPf09MTeVFTUR1bcTHxlfXd9T1ZeUF1CVdNW98/eWHFEWnRex/P7/cn1zsPP9M1dTHByTEhS1EpaREvUXNPx91RFemFmbXtzf3FmYXB7eVjR2FhHUtdXxv/+9cD38vv4++Pkws7I+Obh7OL8wtZHTHB0V0N/Z2NhZXJYXNHQXF5R3NvB0kF2cUjc98P0/NHVX1fw9v/m8VZd3ff3yv37w1t0S0pzRkZ9YG5tYWFlfHZ6bGBnc1tQRE9/ZUpa9Ofm7+L4/vv+/+bl/shdTk1W1cH28sZbTF1W38fSVnVTyd/z8PP7U3Tfw/Tm5PfPSVPRWcn8+MNYcnllek5QW0B1d0pB3P/yzlJ5e3pnQklhbWoUbWB9x9hRVkxx1VzC/8zJ1NjH9P3g4+Hn5Pn6+v7k8dVOTUzdzv/h91tbQ1DC8+T8xlZXU1TYzP7LV0l+ZXp+cnh9ZmZlZ3xa3MfXTl1TUvT88vJV08LI+uHu6eb3x15JV9hSRnxgZGRmfllU3ld0THt32N/SWHVbQF31+f33UXdweVn29M7cQ9HDyfng4uHn211DWsvMzcnS0cff3PD+wd1zeHpyUl1FQn5lcHXT++bn/93Vx/Tt4PnyyNRbRU3DylXRcWZkZnxlZ2dtbmtvYH1Dd3FhbHtO18bH88zc1cHI+eLg+8jaXdPJ9/X+8/7/+OTj7OP5yt9SXMzC21x0eGR318HO0VtxYW1lQFJBTElKUNXE2Mz0+/HD2ML9y8TD2FlV39JX2dnYQWdsY3BOTkdAcXxyf3bZxMBec31/Wl93QVFWU9Da0/z5/chAT0bAz8Hy89pfV/T94u7j8VlzfV3V2NhGdE5H38D2+8pdUtVR9fLAyMVwT9nf3PHwyt55Z352RV1aRUhzTVFS3M7RQHF/eHRWWkhMdF/0xNHa3kN5YWNlcEJeTV1Yd0HT3fTm5v3ZWdXH9/zy+v325eH65uD7xFxCTNPQVFpYRE9a0cXJ+vbcTnNmZnNf1lTbUEBAWN7+xFJDcXt5RVxWXl1RzeXv6OvnxkJ3c3bZ2FdDTn5keHJL0VZwe2ZjaWV0TnxxTk1QV8///cRd1cPR9/v+xdJVVNjc+eT2VUdxfHxGxNjC5efk5OTs6OL5ydfVWlrG3kdXUF/axPb533JhaG9jY3NGSUFSRlba/ODlydZJdnBkf3Z7ZXJ5S0pGxUZjb25oY3pY1El1XkbR8eXplfrP29FWV87w8fHh4+bh4O3j9dNUUFRd1FTUWlbF8uXt6+/0dX5nbmptYGBtYXl1QdP38V13QVtLcFTf3FXTyPvn75Xr5Nd0dnN4REBwe2dkc3130txedXtlcH5LX15Y0/Xk5Pjj4PLVSXdwfnZCd3VCdVbL8+/q4fRQSUFLW8HLzPTx+ebn7u7kzVJZTH9lenxwf3dU98nx5PfTXHd/c3dOVN5QWFzHzf/t5MRecHhmY2FnZGFlStPQzuX5U3x5fGVnZHJJf3Tdwvzg65X611h2fn9mfVp1WfHk7ZSRl+Ph4Obx01t2dXN30/Hz5+HkyUd9fWBvbGJ/cmd13N7y5ODk8FTcWE1JRcFCSETI8P7l+MDVTnF9ZWRlcXZJXs/I9OXn/PTVdWVsYWdnfEBD29za9P7y30l+dXBkf09b0N735u7qlJTo4cdUXn92UdDM11tX9+Xt4fT0XnV/Znl0WFfV2M7l5uLg8MdRTGVvaWBtZnpgZVzE9/n85/3fTGBjcWF3UklKwfzw//PzxNVwZGBgYGd5eHJSys3z8/n/+tjQ08Lx3vLw/fvn++fg4eXg9Xdyck9PR0DRxff2wM3229ldentjYmdNX11TzcPX8Pz19lJgY21uY39IWNz1//jg7eLt7fFYR312dHl8SFHQ19PEWUx1ZWtubmRyfH1wWFbbzfP8//LefE1VU9/Z2Mv98Obn+fr69Fp+dVREU0Z1wfn95+Lu4+flzlNESHB8dnBdyd7UwvTR39tVRHdlY2hpbGFzd1jP98b3/PTQS0p0dXN3SHB8fEhTXlTOUXJlZWVMQEVXdFpd1M718+H9wF5OUcTBU8TGwcj54+iV6uD2VU1JR9FIVNFTXVfazvLzwkt8e2ZmbGtiYW16ddnK8P7I9dxRQV9YX19VVlPf9fH099jJ10dxfXZwck51TVBCQVvZ1lRAdnRySkxaRU9T3cXYyeHm+cB0fXtgYHhaV8H2//3m6+/t4/XMwF5aSUp0QV3cwvzv4eXm8lVFd35PTmV5e3FDRsTE3MNVS15bcXV0fHdxRsVW3tNf0E503vReTkl5cUNf3tv1x1XA03RzdHpyQXt/Tdfz/PfP0M/8ysz+9/Dy1UZUyOTn5+3h5/7M2vP0397G0Ex2SEVTXkdWTnNx1VxOdUxe3tjQ2FJGd3FnZmdPQklbXEdVVt/4/OTz/8hUV1BAd1nRVlrayP748FxSfGJjYXJ4eH9hYXl8Rcv49vH23dr18/b45f36/vb47+j6wVB+cVle18DGX0dJWdD95M3FU3t+UNDC9/fF1vTJ2cr+99ZceGtiY21lZGBhc3Z2Qf/819JZX8bP3vz10UBCQEpW9fHUV0dPd3JkfUp0c3VPd0FQx93S28rz5OXj6O3n5Pzw5eHs5M/Fxt/bVd/323VLSnBLQt3ZVHVdVl9aRdvTSnVYRlLexsXXcXdP1/T1/89OcX1heEBR0tNDTFVZx8LzzVzV1URM0txGcGZmdEBT2/L5w11DRk/e9vXBTnBG3sb85Obk+vnz9f3n/v3Oz8HI3vT68vXHzMfT3vj101tNXllE2/v0ydVAd3x8RFpKS3B3d3ZNXV/WVVNKdEBdVlxAfn5ySl/O9c7AWXdKUs/wwtxBQV5d2Pz78/HM3FZX2sbbxtnK8/D8+fjw9s3X0sfIwdLSVlNC3f3n5/nl9E90d0p2fnNkZ3hyTlPcVM7MVFZYXVNb3FFBQVdQV8P08s3USXRE2dNUU0p2Q0Jb3ND1xF5OdElbdnFdRFzcxMLHXMfUS3dxc3x0UtXUUkTcwf398vvI2M/E3lVa1kx/1MLQz9rDytPU31VUXU53T0tA2F1SVdv0z9veV1DM2NLf2NvbV1dZR1FOcXdOcXx8cUpA1MzYxd/ZydddXkVDf39zeXROWF5U1dT1UHR3fHhkZ398SETGyvHw9eHl5ODk+ffEw99dXVXX0FTS/fLdR3lnZm1lc3t/TkpY1VTI8ff3//z79fT0wfT8/efk8/v3xtJaZ2ZjYGRhYX58ckJbxvXFX1hOd3hkfHh5Wkdc39b1w8nY9fz+3XF0fHt9dUlUVczL8sjb0dVVXcfKzM3CUtPW11XSzM3b3NrU29deX1nVysLA2dzWV9LV11xRVNrXW1/Y2dL2+fDZQUNMYWd7cUNRTk9FdUp/cnh8dEpxfXl4e3l0SVjN+P/z8fPe0dDH8OXk8N/N/PL2xMbf00xLU9dGS1RcV8Py+v3QXUdEQXVLQFbUxlVR1V7G9//k+vRddGFheGdgYXp1TVrEx1FRWE9V2fT2W3VAQ1pF08bC2FRWdHNzT3dLX1tAc35P287OwsvB9/PH9fXQxcLO+ebj4fvNUkpMSk5b1cLWRkR1SlDX3cbAXk51fX18fnBOTF9U0cTdVFFfXdnZ019EUlhCVvX0/ffMxltIQ0db1s/z/MjKyMvN2d3XWEtLf2RneHB2dEfB+efg5vLNRHFMW0pF299QXNP3/frh4ubJVF3XW05JQXRxWdNQSXV8en5EUdNZd0x2c3N20/Lw8PzP1dHP8cz54+Lg+/D++v7J3NFQQHB3S3FyfGRhQt7T0lt0c3xyeXF3TFPDz9vM+uX54+/u7uPl9sHDVNTJxc1QQ3F0SXR4ZnlwdlfEVdFTxtvZ8PLzytBBR1xV3/T55+Tl+Pvn4ObTXUN9fmdjYmNnZHJQ9fb+5cjAyfP03MTLwd/Z287x8/3/9vD29NNxcH5nYmxncXN8cnFzeErYx878/fPI1tn0/f7w/vPP9M3GUM78+//5/8zEVVFfQl9LdUB8ZHp+fHZbz8jK+/v6+Mne0t7OzNvZ09vx2F7X2svCz9hbWsTAWklxTllX10JKd3ZxfHh5dFRZd0NHWVf34ePg+/fS2MDb28T38vz78+Xm5Pn3zMLG39JNdklMRlzZy//l/VdV3UZ2cUlxcXJyfn9GXdTPyPfyyNbcyvXaRlLZV9/bXHZORkBSRVzMyMVNcXl/fXRHTkBIcXN7fV3C/Pv74efw+/rl5uX1wt1QWk5MeX1PU1lE1NbRXUJMWN/94ef59tvdVMPz5f/N111ESUB0c3d0Ql9EWNTQdmdhZXl3WlJYVFF8dlzdxsr/99FRR0xS38LE09fX3c/eR1dfWFfWUnZ/dnZ+dFPEy/rn//fPWk9YU83K9dlCdEBJXt7N9crzwsf/+M7dVldaQFxLf3pkbW5sZmRwdHd1c2Vlf0hV3c7fW19d3cnw+Ofl4PvNwVfURX1wcH1wdnx4ZGd6dVrW28NWTEN0QtL95Pj5+fXE2/bl+sfVRklJfnpmYGRkeXZLQVZCTV1awvD9+/DxwEBwdn90Tk1NdV1FdnF0SdVWVtfXwMbfydJRwcT0yMXaXk1GdV/Y0cnDWFlYcXBldcTRx95EcX1wcXZFRV7UVtfVR0RaUdvcxvbI1kR3c3txT3dBRHV+eEBHTEXeWF7e0FBC3fbx4eH65/v98cnFU0VSQHdEVkBKcHJxWcvN0fDO01xyeHhJSHVf0VdVUVfYxvTzzvT68s7dUl9f1NVE2N5GR3d6ZXBf0kdKcGBjbWxne3l7cFdWUcrLwvng6+nplO7h5vbNzsTZxPHCXtXRdk5FR0VHR0Vye39lcE/Vxvb88/Dy8PT//vv+8fbeW0FPTVlZRl5dQEl2fWRkck1NQNFQSkp2eHxzf3ZGSn1wS3Vf8+Tn4e3s4+f+8vbIzMPG2Nnb1lRX18fByfD2UHB3dEDUV9POyfH8/Pz8/fr4+Pz7+sjV19VT31PQ8MxXR3xnZ2R9fXx1SnZzfH1wc3ZKW1hWx8HCxvXk4Obv6O7i/sPdVFxOdHR+dEBMQEBQ9PX1+fz999JWWEDX2PX+/ffKwN/O8v/08v3y8s3f0NBXV1VRX9jSWXBnfnV3Wt9cV150dElycE90fnpycHVNVMnl5u3s7u7h+8ndW1JTX1hbTnd/eHdARltHcUJASktKd0VR2vb+4+7v4ebg4Prk5v73wdfQUkFS0k7WfEtQZnRPTkbd1tHGz9VGd3hlfX13TnZDdkPcxP/i7+/g5OTzzF1ycHx7fHZDR0hF1dHL9cjCXtZWWtZGQdBR1dbX0NrGzNHZ+fL4+//+21xFTNfd0NVGdnxkZX16QNRaX0FaUEx0fGR9cn1O18n3zfb65uzi4uLh/MRdTnFzcXN/fX1ydEJWVt3Z1tHRV093QUZHVsPK9PL/+fXO9c/y+fHwyNhTQ3RyfX13fH9/cXF8StXQ0VFc3VdAc3h7fnlzfX1xdl3Q2cz84O7plOri8tLSxt7c10taQ3Zxd0hRV9fUQd1cTXZ+dUZN3Mz3+v395f3/5/nl9vTy3Ul+ckpKSnV8f3hhZ396fFnQVU1YWHFlYGZ/eXNzfEdDTlbVxvjm4Obk4P/TT3F2R1dRRF5VRFfGxML6+vHDwtpfdnJPRFRV1dPM2t3FwdTH4ezh4ODz2F5S1cH1xtTVUnB5fHJ/T0d3fnB8YGxoahVjZmR4dk5NXtbM/eLp7uzj8MrZ01dV2lxOT11MRkxNS9XOwNrf1ExPeWVKxPT/8vb29ffz8v7j5Pj55cnXWH14f3d/f399f3xzd1jT0FRYR0t4eWRnZmVnZXlyTXB9TkBV8Pjl5+Xzz9nW38jIxs/b0FRd0djQ0UdKSEp0eGRjY2ZkcUHE38PI9vb84e/o7O3n5fnKwNrd3FRfWE9GSX5kZ310cH1+fXFnaGpoY3h5R0ZL1dDH8+bt7eLu6eD8wszSQUdTQEh1QEp8fkpEWV9GQk1GfX5yfXNH08TZ18Le0cPy8/bx9/D88MfQ0tnY9/DPWV1VSHdKQXdwQUZLcnhgaBVrbXp2cH5BUkpa9+bm7O7t4eTk/8zdwvHz9dNd2tBWX15IcU10fWR6ZGBhfkfAzcLIy/j/5eHm5ODi5vr8+vRVRUxKQ0p0eHhnZ3hyfmd2dENJdXB8f3l9TVVQUlfX3ff45f/h7eDj4Ob/9/H99fLyzM7b0djB0kd2Ud1Y1dZNdXNxQlvMwNbY3s/KyfLz8+Tl//r+8PnKw1ZFUXV4eH57cnlkZWV5ZmZkYmhvZmV6ckNCWdTx5+Dv6O7q6u3p7Ofl+vP9wtxUS0ZBdHZyc3dxdXVYVlJFV93GwdLP9vf+5OXl+ufh5OTm4Ob6+/PNyVR1dHpkfn5xfX5xdkhNdn54ZWFiZnpmeX9mfETU19T35//64uLt7O7u4e3g8vPL0szG3FJydH9gZXpleHl6enbQQ3HT1sD/5Ozs6JaVlZaV6e7k/M/IxWVjY25vYGNib21mY3hOdnB2fXJ7fHx6dEhG3fXz/fP65fj6/P/l+vPw8ffSQk90fUpbRVhaWUFGU1BCQU5OQ1rWXlld0d/L9/P5++Tj7umVleru7ebyw19wfXByd39nY2JsaGpsYWNibWNjZGVmek1V2vjt6ZWX6u7p6+7h5+TyyslccHl/eWdgYmxtZ3lyT1VZXtbWU17e19fY9P/+5+f4+uT75eTh4+Pm8V1EcmNiYmBlcHB2TkxIcXBxf3lkZWdjZGRgZnFDWNXXzPjk5uzr6uqV6unt4uXCXVHdWUhlYmJsaGtpYWdneHp5dHd8cELb8ufs7pWQkZaWlJTp7+37yFV5bWsVahVqahZqbmhmcnVCTUBKSERFWFhf2/Tz5+Xy+cvGw/X9++bm//zKXUtzdERZ1t9EXdNUUFBWVN/VWVlMcHxnY2d8d0hHQcDx8uTi6peU6+/s5vPFREtPdX5mbRUXEB0SExEWFxYVbm5oa2Z2xfzk6JeUkZfqlZWV6pTo7OfeSnd6Ym1oF2tqamxsZnBHU93W3s71y8D+5eTj7e/v4eb++efn4ef21lxyYmsUFW9gZ2dyfX92cH1/fXFNRERBSHhgY2Nmfnp+dE5Q1NnM+uPv6ejrlJXp7eHn8MjWQHBlbWhrbmFmZGdlZHtiYH5ewfHh7ZWXl5eVlZSUlevs5PnZdGdibWoVFBcRFhYWFhcVaWJhZUzR3cfO+OXk4Ofk5/v98vX1/OX5w1pOcHpkZ398cnR9d0JEQXRKVvT39PfK8cdSSEpDTdfGxvHy//rg7e/u4+Lt6e7g+M/N00t+Z2xoFRcREBEUaG9sY2BgZ31UwPLl4e/v7uLg4eTj7Ozt4f7wy11LeGdkZmBiYmhpbGJnfUxJ1Mjx5O3t4eDv7Ozi4+Lj5ubm++f/zdlYdntkZmZkcnllc0tyfmFiYGdwSV9YR0p2cn1wSllfVczH3sDK+efg5uLo6+jr6eL929hPf2dhYmtob21jenxyTU9wQdXSyuXg7e6VlJWUlJWV6pXu5v7IX0l8Zm9tbxQVFRYSHRAWFG9hcFHN5eLq6+ro6Oju7+/n//nxxNHXSXZ2dnZ3dE9NW9VQUlHVUNDK9cbw+vr998/WRE91R9PTwcrLwcL45P728Pn+5eHm+8jAUnZ3fmZjbxVraGsUaGxuaW9kck5RzPX0/efm4eDg7Ojo6env7efk89tIfXFlYWJjbWtraWliYGVG2fPg6e7u65Xr7u7qlOjp7O3g+vj3w1hzfHx+f3B9ZmV8e3phYGBgYXt5dHZ2WllETEBHXd/Z38fd283N0dbQVMTw8uTn//X2/MXW2tHR2dddRlnV1lZFTlLXV9/P8vLK+Ofj7O7rlZSRkZbq7+LkzVpLeWFsaBcWEBITEh0TFhRuYXBU2/X85+Dn5+bm5uTl//P3z9vSdHh7eX1+Tkp2dEhTX3R0W9PfwfL55OTh5/LS2sHf3M3z9Mj0/OT6+eHj4OTn4Ob58/7y009LdXZlZWZiaBRqFBYRFG9sbXpOXVHc8eX7+Obt4uuWlO7k5uTBXnB2dmFsbm5vFW5hYWBmd0NS9eTm5efi7+Pg4+/p4uHi7+Lh5/LeUkVdSUpIcX9mZXpkZmNnfmVnenRxeXBBSXVxQN9dWkNMSXRHVllaWlbVQEXWycjb9c/Jw9faxNNVU1l3SVtOfWV4cHB5c3FFSE3R0MHO/uzr6paRlpWVl+vh+vDAU3tmbWkUFBUXEBARF2hoY2V4f1/3/Pz8+uT6+vrn5P7l/dBCcXB0c35/ZWBtZHN+fUhYVVfY8/r+/uX68PX85eH4y8dQdXXUx93Qxc3Axcv++fH29MDWUVhSXXRxfHtjYGRvFRUUFGpoY359eXp/cEzT9uHt4uzs5/vm5vXc09VRR3Z1dnlmYWRnen52R3RLUlNVwf3k+P7+/vn9/+bn++Tm+Pf/8/T2ys3HRXZ1dX1nenh5enpzSXJmY2FibGd6dkJBW0BPTlvdx1fQ0NtQU83K3tVXXkJB0tDBxtvY1VNR28RFd3R3cHTS8P3A2tjd3fb74O7vlZaUlerq4vPLxN1dRV9WSGZpFBVqbG9gYWxvYmFmcEVNS0ddVNPK8vzz9MHWRUZDdXZkZGRnZH5CSX95dkRWwf7j7ub998DByMr/+fL39Pb1zcNXWF/Qxs7y+ufi4fvl8vrj4Ob7/vLC3d3cXXJsFRQQExYXam9ubWNmcUTA/fvj7O7p6+jj89F0c35zQ0BMd3pjbWJkfHR0SE91Rcb75/j75+Ps7ZWUlpXv7Of//f38/dnUREtIT15adH1nZHFJV8X2ysRFd0tOdnFKd3BzdnbU01hAcX9xdkXW2FB1dXFzdFzP/Pfx//Lz/eTk8dFKcHFyf3ZaQ0x0dkxfVcX9+f3/4e3rlJeV7+f6+fn65OX3ztZCd09AQUt4ZmdjbGBmYmxgYXh2W83l5eXk++Xl+fz99tFMS3l7f35le3pnZXZXzfHx8vbD9fL5+fz48vT1wfPn+8j1w9zQ3sH/5v/3z8fE9/765P/M98ja9fHYW0pkYGBgbWBtbmhqamx4S1zd2cH8/Pnj4cjD3lpGSk9W0kJ0S01LSF/Rx9Z1QFVWxM7BVd7Fw/Tz8uDs5/v45Obh5+fk+PX3zMn/8sZEWF5TVtXC+/7KxcddSUJ0ZWBtbmFsbmFlZGFlcUXX0cTy9MPe0lfH8fL298TRw9/byNdHTnZ3dnVDUVJDWlBfWMbz/v/+5eHs65eRlO/g5/ry9/H+99VEWENKQVxZTn17fHl4eGRtaWlvYGR8S11cRFNXUdD08NtTQE9KfXRAcGFjZ3x2S0bSzsXE8vn++ebn/PfFyM3S39xEdnRNU8fO9//+9M3w//vm7O/i7ePv7eDm+8NSWllMcXxkemEUFhVqFWhsbW1nc9/Nzvjn+PH28svc1NbcRnl6fXpkZ2RnZ2d9REBEXllMXtLbyvnn4uPk5ebj4eLs4uf4+ef5wsDD1UhPX1NQX1Lb111ex8za29dYcmdnZWFsbmxqFxVpY3h2QlxaRFDWW1ZWWU1IRtrBUE1ETWVkf3dxd3dDR3FwWl5CW11dWFjc/ubn5OPi5fvm4Obm4eDk8872wtLVU0B1R9TY1kRISGVjYH9xeXBAQXF5fndxdVlWRkJE0NVMdndLf2FkcHx8fHVMdkFX0NzezM1fUtDL9drH3lhLd0BSXMX/5/rk4O/j5Obg5/3+5uPn/fTO1kx0X1hNSXVwZ2BgYGFgY2diaWJlSEdfx8vCzfT/8cvLwF5KTkF3ZGBgbxQUb2dkeXF1dHdL3Mnw5+Dt4Obi4uDm5+fk8fXLw83TV19bVlTazsnK98vP8fjn5/7z8NlHRkVCdXF8YWxram9ubGZ/SkxWycjH3djB0Ffexd3UWU1xfXllfnl+cXZ+fn1wcE5Q38DbwMj08OXi6JWV6Ono7+jr7ODm4efzyNxcT3pnenlwdUt1c3xlfnN1XFRFQ05KQ3V1S0hPdHVKc39yf2FiYWV7e3p5eGR6dl5X38PE21JMVtvJ9vzl/vz2ws3DxcLCzPPk4uDl/vL5+PL65+bm5Pj9/fzy9/b099pSX0dJcX1+emVhY2NtYmRJRFzbw8TAwsXeV19GRU1JcWVgbWtraG9jZ35zdXF2Q9PI/Prk5uzu7O/v7ePm+/n+/Pjn+/H39PH28P3wx9DU2PX2/Pn3zt3W0lJeWkJNdHx8fmV7f3tmZHJCU9DSU053cHZOQFtRUHVwcHN9f3t4ZGFhZnhwcHdOT0XX9PP45uLu6euUl5Xq6+7i5uTl//Lz8MrfVVdXVdXZ8czHy/b5+/HMx83I3FxaQF3RU0R3cUpNQEJJdXdwfXt6fHFyZWZmZ2V/dUBPc35yS3V0W1fW3sTJ9v76/PHJxvX44e3v6e7v4uPi6ZSV6OLm4eDg5fPD2lVATVnR1kdzfXx4ZXhydHR3T1hXx/TC0EVJcnpmZmZkZWRkYGNibG9ub21gZHl2QkVbU1HH9fng6erqlZWV6ujo6O7v7+/j5OTk5Pvzys7C9v/55+fm5fvg4OHl88BSdXR2fHlmbWgXFxcVbmxjZmdgb2NmeX99cnB3dEFCR05/emFhendaUdXBzcL85eDi4+Pk5OPplZSXlOjs4+Dj4+b7/v329/D00FJaTU9LTkFGQnFlZ2Npam5hYGZkZWVleHh+eHp6ZGVlZGR6f3J3Ql5W3N7W2cDOxsj++Pn4//3/+f7/+ufn5uT+8fD/+Pn6+//L2tveU0JwfHBwd3RKcXF+ZGVkeHFKSndzeWV/d3RyfHJ/c31xRkJCW1lZWUdS1VFWVt1R1c/LzdJcWlDTx/H//f/78v/88/7/+Pzz8Pf///fC2V9aU1lbT3JnZ2R7f3ZMQE1KTlpDSV3TxNNZWVlCdEtHQHVHRFpdUlbR0tLbwM709MbMzMLI9/f398bQ1tRFcH14enxyeHx8enx3RF1ZWNDQUtPA2NRf1NBW09LAwdFFRU1IR9bFxs3H9M3J//j5+Pv/9cTCwsDAyMPeXV3ZycZWX1NScn98ZWZtbWJtZ35KRXRydUdISl7Z1lZTVlJPQkl1QEt1dXZDRdfZ3N3I8fHl4eDn4eDj5/rm5+T78vLOwfX3+fHCwNxedktbTnB3cHJkY2NibWhubmhsYGZ7ZGFnZmZkc0hJT0tJc35zSEBbXllbWt3A8fn8/uTg5uHs4uPj4ef4/Pn98PTY1URX2vH6+fD29/b38PPA00VAdHhlYW1pamoUFGpobW9obmxub2Jhe3t6fnd0T1hdVdPby8n25ODp65Xq6O7o6O7s4Ofn5fnl5Pry/f3x9PP6+vj2zthWQURETUhyf3thYWdnZGNhYWxvbWFnYWBhZ2NsY2dkYWJmYWNld1pcRNDa3MX94+3t7+jr7+zp6Ozh4eHn5OTl5P/398DS1dzA2Nvf1dVFX9rQRHVJT09T3NvAUk9GQ3RwTEl9emdleGR4SnJmenVzcNHB9fDCy/f09Pby8/D28f788vj68vT19MLw5fj7+ffI9MDf2ttQWkZbWUBbWk1yfX9/cHRNT0xLfXN8fnFCU1NZ1tnA9v3l//Py/P/85ebn/vbCzddHXlNHdEtXXE1d1tpWW11eXV/N88reVlTVREFdXVh1Q1FCTdXXUElxdnJ/dVJTRExLX1JOW9LHzc/2+Prh7uqV6e/v4uLv7u3n//DxwtLGzsdWV8XTUNbe005/eWdjY2ZnZ2BsYmNvbmNjYGB6dHdJV8fD0VHc0lHfy/f3xtTbx9/GyMjK9uTm5eHj4OHm5OX9/uXm5/r75eT78ffK09RU2dNEUldQW0l1cmdne35lZHp4emFgZmZjY2Z5Z2R9dEl3cXZweHRU9v3w/vv+/eTg4uHi6e7i7JWV7+Pt7+D65Ofh5fn+99rbz8nF0tzRWXVITkx9emVkYm9sY2BsbG1jbGxtYm9ubGBmYXpzcnB0WlZZ1Mn///rj4uTk5uHi4+Di4uHk5+H7/P775+X7+vnx9/PO3dreUUVNTXV1dEpHQ0lPQVFfS0hJdnx8fmNtZmFhZ2dkZ2Rkckl2TVDR2NPXw8vN9P7l9/T88PD9/P74+fzk5+Tn5Ofm5Pj/9sHS1Ul7c3N8fnh6ZWVkZXRJc3B8fn99cnFzf3NGd3JEX1HV2cH19drL/vfMyM7MwcDax99bXdZEUNvT39ncxM3b3czD0VNeX1NYWEJLdXdxdndF0VdU3djYwldFUlhKdUh2Sk90d3Z9c0pxfHTQ3dr38/rk5fnk5OXk5Pr75f33xsHA9cfB8fTZ29rH1F1FSXR7ZGRkY2NibGJvaW1hYWZ7fnN0Skxxc3N0SXx4f2V6d3F3RFLXyP3y5+/s7+/r6+7u7O3g5fv498rw8crE2c/PwNnCxNHeVER9Z2FgY2Jpb25rbm1hZHl6eX12Sl9fQ09EUkZxT3d+ZGZ5fHF0RNHOyvb6+vnn4uPg7e7o7ePi4OH4/fzz/vr5+P/w/P32yMv3VUZBd39nYWNvaWhoaWlsbGxtY2JjY25rbGNuYmFlemR/TlhBQFncyvT94eDn5uLi5+Ts7OHg4+Pl+OX48/Dx8PXN9Mr3wtrXWUdLTUNOQkh2dUpN0NvT3lVaTEZcX1JDdHJ6YG9vbW1tbWBgY2V9cHROQ1xUzfP5+vnk+vn65OHj4eb4+/r45uDm+vj48vXx98zfVF1NTXd9cHZzcXFJSExZS317fnJ6ZGV4ZGVnYmNjY2RzcnZZ0c33//r6//37+vbI9vHPwsDB3NzR2cjM2trXW1xX2t1cTUZBd3ZMVl9dWkNAV9PN/fny8Pbz//L8zVhaV1p0TVtaXF1Mf3VDXMDz8PH8/Pb0+//3zs70wdnc08TE1VlOdU5U11BSREFHWlPWTndyf01Lf3VId3V3TkF0S1tNR09OR0BGR3V8ent2TEZZVt3awvzk4+/u7u3v7+no7+zs4fjy8PL0xt3dVFdU1VNaSkpxe2Rnf2VgZ2Rgb25iYGd4dEZT1FfT2VfX3FFdRVffW0ZRX0FOW1xQ3sXx5eXk5uDt4u7p7O3t6e/g4eDk88/KyM/I9Pz88PT1y8zS3Vp0cXt8fmZkZGNpaWxvYm5jZHtgbmJtbGJ6Z2ZleHFIcXRCUVXC8fH45eDj7+7q6urq6pXu4ubh4OTk+v3bVsbGx8TDxt1XUFBbTk1HSHB9cE5SR0deRk1eUl1RUd1QTHR3dHF4fHlkYGNnfnZ1Xd7F2Pfz//z75frm4uzs4uHh/f3x8ffC9c/38PXI9czb2snJ28HCzczQU1ZeWVtQREFOTFtBcHBHS315e3p4e3NzfHh5f3l/T1tT19r28v32+OT7+uX6/vzl5ubn5OX21kJEX1VdV19PdXt8cnVPdHR1c3dI1cHCx9FSXFHbyMPw8/vl/PLy8PfN3lZdU17U39rc39LaxszI9/bO/fP2//fNx1VFTkdT1FdFTEtDRFxTW0txemVkZ3pySnF5Z2RkckpGWVBKfXl0QFpEX9ReU13VxMvI2d3X19/Ew/X85Pjy/Pnn5uLp7uzt5fz1/fbG3tTc1k1yemVnYGZjY24UFBcRFxVpbGN5fnl5ZXBMWllF1tFU2tnK/PP2ztvb0MDM8vj1wd7CyPTy++fg5+Hh4ejo6ezn/vXJ9vLm5/nw2Fx3d09DdHlnYWkUFRUVFxcVFWpoaWJtaWsUFxdqaWxjZnJ2eX50RFle2vTz/Pjg4+Tk4e3u6JeRlpeVlOrv7e/h/v358/vl/P7PU01AREJEQ3lkY25paGhsYmxqaWxhZWdlZ2dgYmdleUtaVkB2cHZJRcXw88j3//Dl5+Tm5ebn5uXk7e7t4OTk+vH65/rx9/v6/P398MrB11hxZXh9eWZmYGBvb2BibG9iYGBhZntkbWdlZ2F6XNBFTkRRU1H18cRfU1HczfLh4+bn4+Lm5eDt7+X2//LIyMvJ1EFFUt3U3fb00UdAdGdgZHt6Y2F8e3x9cHF6e3ZdW03H9sNRU1TZ08n98/HM/eX48vv69NzQ3sz28OTh5fD19NJYXNrDXEBQXktCRFhLS1ZR3d7C/PPdUkV1emNtY2Jvb2Ntb25sbhVrbGFmZ0/W0dTF9PPz++Dj4+Dt6enu6ent5/7w8fTx+Pv029NecXp7f3pmZXl6ZXN0cH1wdEhNRN71xEdMdGRibmhvbm5jc3F2XlBBQdfB9vHx4enh5Ozp7ezqlZXq65WXlJSX6+H+9c3bVVTR01JAQ3F4ZGd/fGVncFl3S0F0fXxJW3R6fnV9Z2dnbhcTExATEBYVbmR5d0tIR8Tz9PHm7OLg7u7s6eqQkJCQkJKQkJKR6+L69NNJTlpIeX5+e2VmeHFwc3x/eXlwR3Z/ck7SQnB9d3d3cX54YWJibWJhY2FmfVZWWkVRyf385+Dj7OrqlerolZeRkJOQkZGWl+jn8cLUdn55ZXpmZXByeX90QUNXwNlfWMXaTXphZmBibWxvbmtvbW9pYmBgYXp2c3JMxcrNxc3PyfHk5u3p7+vq6+jo7+zrlOvt5OXg5c7URHJ5e3l7f354fn1le3J+c0JQXHV+d09Lcn5kZnpOWVbF3t/axNjMxdbTzPH0zcPx+fj/+/3w8eTj7e7u7e3k5eb89Pvm+f339fDx0UR0fnp7ZGd7cHRxdH57ZWRhe2RmfmZtY2ZpFWxgY352QFDYzPL+/eTk+Pj88/fA9/vn4ebn5uHi4O7r7e7v4PjxysH0wtRcREJFWdRTdHB4Ym9obmNne2V8e2R7fHt7fXJ9eXx0QXBwVtFaVNz0+ODulZXp7+/t5uT9/Pvk4unv4uzv4+Ph5vvx9MjGV1heVlhATXVDQ11QRXR5ZWFpFWpoa25iY2xubWhvYWBuFRVobGRxTVHbz/b45u3v7O3v4+fn5OT65+Hg4+Lv6pXv6JXt58He3dVV19hX39FQVVfXWXZ7Zmdmb21gbW1iZmVmYXh/ZnNBXHNgZ2ZhYXJB2vTx+uTl5P7/+/z8/+Xk5+Li7uno6Onr4umXlOL4/t1adU9Z09vewcLIxF1ERXFkbW5raW5qFWoVFGprFGtheWBoaGlraGxgZGVI3c3z//799s/Kw8TL+Ofm4ezv6Oro7OqRlu/4+vHEWE1OdUhNXNzbxVBQ1112f2VkZGNgZXp6cXZ6ZnNZ0n9sZ29pFG5lf3h0VsD09PX++P/y/v/98Pnk+eTt6Orp7JeXlOPH21pxfnxxSXFwd0FbU1Ba1FRDcHFJdn95Z2JvYGFmaWllZmNqFhYWFhZpZmZ7T1TC//v+8vDy9fTN9v318fvk4e3i7ePs6ezo587BUHR5c3Zzd3FNWE5DWdNSdHl4ZGBjYGV5eHVLfGFmdHR2eWBua2hvYGR/SV5Vz/Pn4ePv7ubz/eTn5uDs4uLi7uztleju4fTI0lhfQkRPcmV5d1pbREVKZWBnZ2Fjb29vaW9vY2FgZ2ZsahQUFBcVa2hrbHpwXNHx///h4+Hk4ePp7+bj7Ozu7uvj7eHg7P/5/PTAVtHWSEpKQVFHS0pFQ3VzcXtgYGd6ZWR4cnZ6eXN/eGdlZGBubWRken5xd3VZ9P3m7uiV6uiV6pWXlpeU6+7p7+/v6eLm+v722cv3zMDUUdNRVlXVUU58Z2ZjYGdgYmgVFRUVaW9uYm9iYm1tbWBmZmFnc3ZF2c/M8ebh4OLs7eqU6uvt4eDv4OHg+/vk4O/u7OPj4f7x8vH28vbIycVSXVlOdnhkZ2RnZX5kZWV+entkZmR5ZWBnYWNkeX1KTNTO+eHplOvp6+uVlJWUlJfp7+3h4eLs4OTl/vPz8uTh+Pb29Pf19v3xwkR1dnt6cnllY21vaWJjZX95ZWZgbG9pb2JrFGljZnNS0sX0/OTi6OqUlpTr6Ojs4uDg5fHy5+T++OTk88jG3M728vvl88n39MzK3lFHf2V5ZHl2T09yemBlfUpDTEpyeHpkY2B6f3BwWsf24OmUl5Xp6eqVlZWV7u3h+8zK//H2zdHdwPTy/PbOwdZX1trb2dFbQ3V8e397Z2JoFBVubGNsbWJtYmBkfnd2eXxycEpE1c/19Mjw5+DolZeXle/j5P7z8/TE3trHzPP45f/+yvf98//88/TYW051TndzfXt9fXh5e39+ZGNqaGxgZGV8fmV7fn9xd05GX970++Hs6Onv4uHj6JSUlerv5fDH38Lb39rQz/L74eHg5PRSSkpZ1NbTX3NnYWJiY29ubWxub2ZjbW9qFxATEWliZnJ0e2FmfHFMR9f38uft6pWVleL9wNDE8/j68vTMxdLby/D85eTn4+Lg5fLBU3xhZH11S11RR3JkZGdmYGBmYmxkeHlkY21oFhEXFWxleXd1dE3d/Obg7O/ql5CSkJfr4fZSRlTQyfHy/vvy/fjm5Pn99MzN//7OUkl7aRcXa29gZ3t5ZW5oaWsVFxcVFRVvYmxuahcTEhZrY2VzX8r89vvj4+Dg4OPm5+H78cZQdXxyXtv45uyUl5To7uH4ytxTX0Fc3Ed3fXpgaW9kckdMSV1Dd3J7ZGNtb2xtZ3dLeGdmbWxtZXTV9PHn7+/p6O7s5vvz8vvk4OH+8cza1FXb9ufj4+zt5OT330Z5YG4Vam5mZ2JjbG8VFG9menpydHJkZ2diaG5vbmB/Q9VbT090dHNC3c/9+uHj4ef4/cnb2NPfxPng4Of4/+fl9v7h7e/s4OX1VEVwZ2xoaWhuZHF9eXt4cH9+SEd1cXV1dHJzdX1lZH9IWc/l4eDk+fv/9/Hl5P7k5+bg5OTk/vjl5ufl7Ojp7Ofk5/zPwPL1yc/XUFt2emIVFxEXFhRvbWBub2JjYGBme2FkeXhwc3Z1dnZ0X9rJ5OPv7+Pm+PXcUFZbQ9DB9v7k4eH65+Pv6emVlZXp7eb9yNlU0FTR397d1tNScXhlYWFiYmd4fXllYW1jZmR5dndOXdbfzcDX0MP2+eDplJTp4uD6//n98Pb39vrk5eDt7OLs7+/p6e7v5PD00Ex2emFiYGNhZXt9dnN5Z2NsbG1vbWJpbGBjYWV/cUxT3/fx/P7+//398vH18f388MPy8Mnz+fjn4ebj4+3v6ens4+Ph5+Tk+vjOxdvVWktBTXd+cUlFX050SnRyfHlyfHN6e2Vlc3F2QlXB8v3h4OHg5+fk+f7wz8zI+frz9Pf98fP64O/v7urp7+7t4uX/9sHE397dWnZ4emdhZ2ZhZmd+d2VnZmZhYGBjYWdkfHFwcnBAUNPAwPTz9/nl8/b1wdNQ1lNc0Mrz/fD2/f7k4+3t7+/v6ezh5Pz1V0dfXkFdUNHfU0dOdnZKfX1OW0REdXNzfHp7cXZzdElE1t/Cyc7L9PH3ycvx/f788/32y9rQ38DNyvP38f7l+Pn8+f3O9PT129TWXXd7Z2Zjb21nZ2R7eWRvaGhsbGJhZmdmZX5lemZhZ2R5TN/H2MH0xVxYR1nU18r2ysn38MjDxcfEx8rl5Pr5+/7AVlxX0VFUxcfUVlVQR3F/f2V6cEJMcHxzfWdgZnh8eXtye2V9cH1lZXJ0dEbL8M3JyPfO0d7MzczNyMPbzsj29vfy/P308v/w9sDH3FBOT09JSnxyfH98fHp6e3thYm9tYW1iYGJvbmxmY2RleXhnZ2d7fnJ1SHdxcURTU9DWUVlHRVfVwPT///D+5+Hh5Ob7ysbW0tTR28fH29jX0cr3z9deXdRSfWVxRk5zZHh0TEhwemdkemZhZHZQRHVJ2vPO2M3P9PDNw97EzcXWQUFWUtnO+eDh+vzk5/j+9t3DwvfH3MLZ0FhBQnVwS0xAX3R/ZWRgYmdnYWdmZGZhZGRnZWdkZ3hFVNdSWlhTWHZ0WFxETlhcUFXWxsb18ff0/+Hi4Obm5+fy8Pn6+uXk+/3y8vz32d/UWENd0t7e0FxGXkhNSnRDSXZwSERbUUdBVFJVwPTz9vbD3MPD0FNd0d3SXVHN9fP7+vj45eTh7eLm5/z28snN3tLAVFBbQUJ2dUl1dXZxS0FZdElNcHJ7ZX9lZ3l/f39yS0t1T01CT1lR08VX2dJZX1NT1lBd3tjBxsnx8fvk5ebk5+Dg4+3u7eDm5Pv7/PDyy97c3dvbwMv1wcL28cvC31NeT3R3QFZaWFxDR1PRx8z39MnJw8DB1FdQWER3cUhaxcn2/PHz8PPy/f3x8vfz+/Hw/vPI0Nfe1V1cXERYVFNc1NNYSEtKdHF1fX97ZmdhYGBjZnp5eH53SlzT0tFcWkNxSU1LS05aXV7Q9/Pl4Ozs75WUl5GWlpaXl5SV6u/t4P/L3ldX38fMz8/29/X2yt7SU1leS3Rzc3F5ZmNiYmxjZmR5enZ1cnNyf3t/c3RH0M/I9/Hz/P775uHn+Pr65uDi7+H6+P7z9vPz/Pj9/P3O2tFfRkp9e2Z4f35/e2ZjbW9paG1gZWdlfnl9d0pzfmV7c0pwS090dVjR1t/L/ubs7uqVlZeQkJGXl5eUlOvp4/nLztvR1NLR2tvcyfXMwcxXWElLcHhlYGJvFRYWFxYWFWtsb21nYWBkZGdkZXFaV8H28fH18fn+8vfz8vP/++X65Ob4//H28v745ebl5fvy88nGxl1Mdnl7emVlZm9rFRUVamhtZHt+fH99fHlzfHl4f395ent+c3x+c09GXcL74Obj7+rr7urp7eLh5P/AxdxZcnF1fHtwQltCQ15QXFhSWU53dHF5ZmBmbhcRFhQXFWN6cHx+eXl9d09BX1JW0sfO9/fM39LYzvTx8/L9ytvf29/Y09fW2PTy9vf5/cBd19raUV5V29VeQnNyc3N7YGBnentnend1WF1cVtDBwtzUXFtZT3dxc398cHB4fXdOR9b2/fH++vrk+v/D29d0f2VkY25sbGBnZH52dElWzvfw/vr58cPWRnNlYWxuaGBnYmJmf3dOREVfUsjl4+3m5Pjx9vbI09HcVF7Tz8bTwNpV3djF9//++vz7//zzzszaxdrE9fXEwcLUU15dXUJBQ3N4fXhyfXdaQV5VwPfO0t7fVFNYWkNxdHZ3ZGd7Znh9SFtHVsL29vP/88rLwcXfUk5Od3x4fH1xdHZxcUPa9/7m5Pn7+//89N5UREdKf3p+f3BIS3V1cU7D8vL/5eDi4OPg5fP1y8Lf297X3NnE2trBzfD/5+3o6urr6Ozh4Of88PHNxd1fUkJJQkFFXkROR1laWEZCdXFNT0BaWFhIdHx9dn1nZ3p5fn94eXJ/cnZ2d17V3/H/+ubl+eX9ysjy9dzWXUl9fHplf3FFxPHw5Ozu6evo7uD6/PTN0FxJf2V7fX1xd0tGTFb18OXm4OLv7+Ps4uPm+v/2zcLE19fS0tXawPX95OTm5uHh4uzj+vDN2dReU0JxfmFmeX95ZGRkYWd7ZmdkZmFmZXt+cXd2Qkp0QklNT09RW9bUW93c2dvQVlTZyfzk+v/+8f388v7z9MLa11NNdnlnZGR7f3ZCRN3A/Of7++Tl5OXl8NNQTXZ/f3NxdkLS2s308Ofj4+6V6u/s7e3s4+fw3lRYREhbXkVfQlPHxsf1/f35//3339NSdXB6YG9rahQXFxVubWNmemdgZnp0QkFXXE9IXFBbUFBVXU9OXlDXwtjaz8Px8vb55fv65efn4+bl5P7y/PDN29BST3d9emd4emBjZX1K1MDO9P/4+ODi7e/h5P3L2FBPQkt3cXB2TkVdVNr0/Ofj7uno6+no7Of8zlJKZWBnYWBtbGxtb29me0BXUN7e0tJcRU54Z2BsbG9sb2JgY2BhYWd4fHF0R1xY0MDc0dHEyM7Lz93XUkTV9fH39M7B2sPAzvzk///9//bBwcL18ffOwtzUUljW0FlCSUlFXFJGW1TWzPfx8/f2+fn9+PfYVVRCd1lQSERVXNPY2djaxd3fwffKyNvS1E92fGFiY29pbm5rFRQXaGNhe0faz/D58fX0wdVQVl9wYWZjZnphZ2dmZHtNUsDB2fb18vvM9PHAx9nGxlBdT05JSEJXUNXdwvbz8PTw8vjg5uTh+fLw9v3xz9rfwcXWXFt0fHtlen97enNN3Pf38Pfn4Pnk4P7K30RIcWVhY29uaG5jZmFkZX5EUU9E0NDAyMTWWXVwcH1kZWRjbWJtZmVleHxyUvf9+fv45eX+8MrfV15SWU5zcmVge3Fzd0FTXFnRwsTexMD08/bKzMfS3M/F3dPQ1Mb/5eHm5uHn4uno6Onj5eXl8d5RRU1JSFhYR9TX1NvfUEVPdHZNR1BdTnZxT9RAcHpnZGZmYWNsaBVqbWNiZnxB2fX/5efh5f/h5vD13FladHx4Z2RkZnlMRVbSx/bl5uPv7u/j4u/j+srRRnBkYWBhY2BncE9EU1Ha8fvk4+/p7OHj4+b69vf98srDysbc39bWyfHw9fH4//zk6JaR6uzu6e37911JREl6bGoUFWhvb2gUamN5cXJzdE1FVll1dHVMSnF9eHxzfXB7ZX9xS3VF1vf/+ufk5+Dg4OPh+PfBwddAdHx8cX1xQVNWX9PO8f/z/eXm4Ob6/cDb1FlYQVhZSVxSU9LN8PP45ODu6+7p6eDk8vXFVVJNc3dMQUZY0sDx/uXh4uLg4uDm5P/3z9FbeGZnYWgVFBYXFxEQF2tpbWFjfk1aVMb2ys3A2txc1UZ1TX5ne3t4f3NMR1vTyvHk5uHs7uzj7uzm+vLxwt9Rc3JxeXtkZ35IQE1Uwf//5e3s7+no7u3g4Ofy9sRSXkNOXkFMRlBeW9DG/f/65OT45+Dg4fvyy95RW0txcnhkYWZkZGR5fUpDQlzRWU5SVFNOc3F6e3lmYmxmZ2FlfHNxcXVOQU5DUtVR0/39xsLMxNPBw1VVUVxAS1rRx8XayPDk+Ofh5OTl5fPJw9rY3VVSWVnV11Tc2NvLzPfk5eXh4eT75OX7+/nwysPcUVhMdXRKT1v08vLy//3w5eDn/v3EX0NLfGZtbhUXFxERFWpqbm9oaWxkc0zD9vb8+Pj+//P1w9BFQnx7Z2FhYGF5cnFKTFLQ2vb1wsnDxtjSyvLOx8bQVEdEX3Rxcn92Xk1H3ML0++Hg6JeU6Ojp4+b6/9NUXUtKRl9PdndMdUfT3sfx8/37+ufh4+Lj5vvI0VZYTHB5YG1sbWV/fnxye3p7fnBzf2Rsb25oaG9tb2JkZ3l3dXZ2dn95cU9JQFTQ3czw8/X++/P2xd/R39FMSnZyc1pX1tnb39nFz9lUX3V2SkZc2cDD9fHz9/L5+fj7/P3//fz45ubm4eHk5OT+9NhCcnxxdndLTk1e0dzT3svA9fDz8cjcVdBaT3VOSntnY2xvb29rFWhobm1gZHFS08PI9fTx+ffF1E1xe2dnY2FgY2d7cURXV1RZUtTd9fD2yPX39/34+Pr69MnLwtlcQkhweWdncVBRwPf1/OXm4eDs4ufl+vvy+Pv998TVUdVUXkNJdXVTwcby5+fh4+Ph7e3j+vTNXHZ5Z2dnZ2BibGxtZ3h8cnNkY2Zkf3hlfnB3SlVeT1NQW1tW1HV6ZHNbxsVfQklTyv7l9dxdUN3WVHV5c0RSUk1/ZXVU1lVTUFzR3tnH1lXawv3n4ezv7Ozt4ODm5Pj1zcv18vv/987N2dRXUtbZ0sDbwsDEzMjNy/TFzPD09vH2zMD0x8DxzcXa2VFFdGVhbWlqFRQWFhQVa2liZ0vDyMj19fT02vX83VJcSFtbdXV1W1xCTF1UU9LeyPPz8/f39s3E9v729/Tc09VAcXJ0S354cnxyQVHY9PX3/Pjm4O3rlOrr6+iUlOnm//XBV9XeUV5V0NnNycveyMrJ9/Ln4+Hk+Pb32kVZUkJPdnNxfmVlYW1ibGhsZX1wQ0dwRlNF0sdXT0lxeH54ZWdmZGdlS9HXV9zEwNvP9M/29/D7+crRV0F2dnFIR9HY19DS2trc1MXPzMjK9v37+vj898rBwfP6/v/z8PPz9MjC1lxc28bA9/3//+Tk5+Hh+v77//fKyffwzdJR1NRFQltEdHllZ3t2fGFib2lub21gZmRkeHRDU97b2d1WUdv1yNtRXURfUElNW1tMdnFydkxc11FTU1LSxdjbw8dU1N/L8ff2xNNcdEhKSE52dELcz/fx9v/65+Dv6ujp7+zi5vzO01FLdnN/cnd2S1pNR11V3sLy5+Hh4eHs7uHk+v7x9MrEUEp5YWBgb25ub2xtbW1iZ2BiY2RxS0N2cHVzcEpOSnR3SkZHXV1ORVFRVtfB28XBwvfN3lFcR0pBQUlyc0dFXFlIdHF3TE9Z3tNSR1TJ/fD8//v7/P/64ePh5P/88cPeV9XXWVtU2cH38PHy9fb12MDEVFZFRFxcQUVBSE9E0MXd3tJRR3RBSkt0fH56ZGBgbWFgYWR7dnVHXlFU2VdU31VXW0t3dn9lZHp9ZGZ4cHVf3NLb0NTNws3w9s3E1N/E2FHXWX1ycndATHRIdkxaVdDW39j08eTm5eXn4Of65OT49MfG1lde1NnU3d/W1ldR0tbc9PP18OTj4+Dm5P7KyszWXUpzemxoFRQWFhcUFRVsYWdyTkNeU8T08fb39fT239BXUNVBS3Z1TU9MWF9WVsfx9MbT01FHdnJxcXZxdUxARkFf09RXV1DYyvTz+fbLx9PBzNvAyPT/+vz8+/rl8PP5ys3A2d/bwcXG39bW0MXEw/by//n6/f7l5fjy+Pzxw1VZWF1GWEpxdnV3dn5gZmdmZGdgZmZjY2NgZ2VkfXFKVs7y8PPxyPfy/fLy/fbx9M3d0t1WRkNSXVHHyfX29/fIy8Da1tJaf3FyfnZzcHZ3dULb8PP28fj65OPt6ZWV6ePl8PDz9dBcUEdGQEhPSFrW19LN9v3l5eXn+vD/+ffw9sj38PfH11JcdXx/eXpgYm1sbWJgZHh8ckhGXt3Yxsj09sfXUFRWUUNwe2FtZmV8SktE1MXFyfT2/f365+bj5vj0wt9fRkFLdXR1S1pX1MD1/P3y8fX19crbVtRXUt3ezPfNxsH3yvX38v71yPf9/fDPw9jX2/TJyMFU3d3axNJXV93R3tLU0VdRUVtxZmJiYmNgZntnZGZ6c3NPfX9CTFzW11JdXF/XzPfY3NDdwM/2zNfBUXVW0FZPdnZ7e3lzd05NTF3cxNDRwc/K8Mz19vXB9PzFVFZ1S13G29LI8fj64+nu4vj/+/z3xdJNfmFubWRnZn5P38/L8f/+5ODj7+zg4OH4xtdbdUl0cHthbRUXFGhpb2dkZ3hydHVJdnlzfU9V3ddfUlZVXNnL3tZcQV5aVVVcWkp0cFvc0trG2MH0yPbyyMTXREJPdHF4YWJhZ2d9dUdd09nTxc7z/+Tj4+Lp6O7s4//B3VFFSFpeRUJcXlHB9vLyysj0zt1TX1l2eHt7e3NDT05Z3cb08/LJxNLdX3V0fGRjYmBva2hrbGlrYmR8SlPcyvfy5Ofk+v3EVFdMfHFPSHRARkJSVNbSxsnOwcD1yt7QRUlcR0NT0lVXx8PBycnf3szfV1nW10ZEUNnYxszK8f7z9v39/fz5+fv4/PXI9/XbV9HXUl/R2Nr3/fn+5+Dh4ODk883fXk59Y2oXERMQFhRrbmFkcl3ezPT98/X08PPKxcXXUVdDQ0VMeXp5cnFIUtbN8/L29PLxyvXB1F1bdXJMQnFwcXVNU8Tz/vnxxc79991Q19HUVd/K9/H/5OHg4Obh5/DA2czHXUhyd0tye35M1VdU3NDb8fD44O/u4OXk+/j//PDG2F9Y1Vl1SnF+f3xwcHh6ZGFkZ2xrFWprbGZ9dVbB9P/74u/v7+3m5f/02tNST3V/ZmBgYWR5S11ZXdfYx/T+/v/99MvDwdFHSXJyfH1+e3dwdtPz+ubi7O/t4u3n+/nz9MDEV9TF2tvYVFPQ28fLwsTEVFTW28/N2tVQUdHMyMrAx8nI9M7YUFdQQkBDdEpze2R4cnJ9fXdKT0Bb197Ozsv33l5PdHB9f3p7eX9JXdPT0cf3+uHi7ef7/drWU0t8Z2BgZ3t/d0lDdEhXxvT08PP28vP+/P/xxMXZ11NfXdXF3t7ayPn9/uT7+f/wzsbA21BBTUpCWFxUVdTfy//5+/ry8/TC21pLfmZjYm1sY2NsaW5jZXJxdFbCwcPz/Pjk5fr+//P1ysLOxdfRX1hdR1lNcHFwfnh/ZWVkfn12Q0Fb1NLbyvz65uDl/MnA2ll0cHJ4ZGR5c3F1RVPVyf7h4+Lv7Obm5PD1w1dbXH9mYGNkfn1wcUHRz/f84ODt4+Hh8vrxyfTc1Ed2fkp0ZWBsYXp7eGRjbW1jYWdkYWZ6cXV9dkpCVvT/8/374eDk8sT18vn1WFhd3VdzcFpddXxydkl3fXZ1QkN0dEpIc3JOWFld3drY08Dx+ufk+PP1zsb3/PTNx9VRXVFYSUJDdUJU28XewszY2dVeUFhOQVlYW11fWUVeU17Tyc7MwMDb01ZRR0p2eWVnYWZnZWVlfnl5dlpd08XaxdzC8PfOwtpWW0F2Skh2fGV8Sl5U3d7ZycvN9Pz98f32zfb3yt1XR3Z3dElIcU9LfHBxdk1MTVpR18f2++T65+T4+f79ycvIzsvT39hSSXB3dXJzSU9OWVjQzfb//fLy9ffKxsHDVnd1dnN5Z2ZhYGZhY2B4fXBAX9De0NHYx8D28vv4/vr89/TLwN1EW0ZNQU1JS0tNdH9+cnx4eHdaVNHU09rC8/n5+vrm5/vl5fzLzMLDwM/b11NYRVpfWFbU1lTTzMbS1dHc3Mn1zcDA39PdV0RPSkhBXtXdzvTPx9vG2sTK9/bKysFRXFtfRU51c3J+f3t+f2VmYGB6fnJ3QNbbwM7y/v///Prk5uT998HfVNXX11FHTUFGQE11d3Nyc3RNXN7e3FZFRltX19VfU9fX09TX3tzZwPf/++Xk5OT4+/j5+/r/9vXOzNnXUERNdHF0cnJ1dnNzdkhe19rLzMv09vXD29FSTE9ZUlNUUkB3fH1wcUp1cnx+fHJ9c3dOTUZUxsz2/PL0wMXBzc3N2tjc39BeV1dTRk5Z19dX111GS05R2MP09/f09PH1wdBXWnd0QkVEXF1aTktAQUfV2dvGz/fx8PL9//Ly+ubh5ub+ztLVXFpZRU10cEtaX1FRUl5EVt/T3dnRWE9BX1xQV1FQWUdOcXlmYGJsbWFnZXxJTUbSy/3k4+Lg5+T6//31xtZfQkxbXV5cT35/c3F2dUxNQUVQVNHf39PS2sTNzMDNxtbX3sbHxcfBz8HGwd/Z31ZdWVtW3cTOytnV0t7awsnD2VdfREBFQUhJRlndyPHz/ffP9fD3zsLMxNHX1FFeRU9yfHh6enp4fnthYGZnenJJWF9cWFffw8nCx9rA9Pby+f/0wPXx9vTOwtFTWEdLdHF4fHB0RllQ1NRVXFfQ19be9Pf19cjH399VUV1cV1fcwMLM0tbEy/H95fr48/T0zMLQR3R9f3xwSUBGTk5EXNRWV9DWV1lYR1heWlbZzczO9crD0lFeQEpzf3tlZGd6fnBMRllX0dvI/Pv78MzD2NLfwcHE3tbUV1FTWkt2cX19cUpGX1/Szc/AzsLG2djG39fR0dVW09/d3MXGxdvb297c39ze0tVUUV9b1NxX1trY2MTHxdZfWFpGVtbSw8fHz/fJwsDXXURAR01aU1lHWF1YW1xfXkZCSnF9e3h7en58cn1xT1tcUt/excnCzs3GzcDBzPf39/H28//+//LJ0l1ZUV1CQ0t1dUpFRkZcW1nU0trAy/XLzcnI0F5HQkZBTUNHRkRER1pZXVBQ0MXO9/Dz9vTJwdjQ1tHX29vQ3NfX2N7d39nR3dbX0NHd09LV1t3VUklxcXx/eGVnZmV+fnhzSHdIX1TX3MPOy/b0ysj09cj19vz9/PLx9vD32dBWQUFHTEl3SEFMdUxARkBMTVpS0NvbxMbDwd7d3dDV1d/c397awcPDzM3CwN7T01RRW0BaRUdESXVEUNba9/L8/vrk+v32xUZyf3pke3h5fnNJRl/W19zDwsHNzNrWXUl2c3N2dU5BUNTd2N7fxs7Pyc7Ext/VVNVW1dHX09lRX0JLTE1HQVxSU9Te2NdRUUxMQVtf0cHI9PT0ysL29vXx/Pj99cbY1tPUW15cW1dW3cbAy/D3wdrcUFhNdXZxdHByd0NBUtVQX0VGX1HW2ML18/T08cnMzMXd0ldZT0hATEpBQk5bV9TT2MzLyvf321NBdn56ZWdne3xzdFLf2MLIxsbKzdrF2NJU1FdWUlTW0sfPzvH//fPz//788vfF1lJAT0BGRFtdUFdZX1JaRV5BWFfXVFfX1UZNX0ZCWFPQzfP6+uXl+PP99szPwdBTTXF/cnd1TERZXFZUVFZdVtdcW1tAdHJ4emV7eXJ2SUFf3tvX1tfU3djDy/D+/fHw8M7d1lZETE1CSEpMT1rX3drCz8jNwM7Aws3E29vT1FRRXkZMRVNdVdje3dNUQEp0c3BydEtF2MXGyMjPwsn09PP+/vn65eTk5f/3wdrdV0RCdXR0cU9DRkd1d3J6ZGRkYWZmZ2V+c3x+cXRD1PT+5efn5fn588DdU0FBW15d0d3HzPTx9vb3w9/X3NBU11RWUFJSR0l1c3Nyf3N3dHZxdHd0S0hCWdXbx8vy8vT09sjaw/fz/OXk5eHj4ebn+/LJ29BWXFlERl5ZXlFfQ3VwdnVxdEl3SklIS093cHJ6fnB1VlVV0FFdUFxFWFHR28bIycL0ytrf2tdWXUFBQFLfxfTy/P31w9dEd3lnYGFhZ31xdnZ1SkpCXNPN8vj4+uX/98/ZVNfdx8LM9c70/f3+/vzLx99RUlBcQU9S0d3F31dbQUFOQlPd2MDK8PbP2150fnp9dkBZR1BRUlheVlHX19bQ1t5VWF1SWF1eQE91d3Z3Ql/Xxc7DxMXf0NBQW0dMSUpNWlxAdn1nZGVlfUpb0cfI8vHNwsj09fX0ycnOwM7x+/r6+//w9ffK9fTLzsPG00ROd3N8cnd2dUZfVNLZ0lZGTElAXFfR2cHF09/R1N/Zw8DPysPM9PL9/uX58dtfT3xnY2B7fXN1Qk9LSUBBQERBQklKSnF9f2dib21menN1WNnO9/L65frk5eX6///2yPH++uHi4eTzz99WWUdGXNDV19FSWk1zc3d3cXJ2QkdAXFVdX1hFVtLG9PH9/fXO9fTKy8LBwd9SUtfZxsLx8vbN011NcH9+cnVPTFpYWl1SUl5HQE9KQ0RHWUF0cXJ5ZHp7eH5zSE9AUdfe9/Py/////vnl5uHh4fr/9NdETXR0TVjX093Y39/Bw9rZ3lNBTU9ER0xPdUxMTkNbWF7dx9jEyPTIw/XC0lVQRUVd0c308fLw8/HJwNlX0cLG2dnd1VFbUVRdQHdyfXl5fXJ8fH9ycXJ8fmVleXlxWFTQ2cD29/TK9Pfw/OTj7eDm5fz33V5DdHd1S0NGQUZFRF/R2sXQV1RdXVxEQEBPSExPTU5OQ1zWxPTy5fr/+Pvz99rR3VbR29jE2NHV1VpBWkRfVtbYxsTPwd3a3lhJcXN9f312dnFISk5MSk5EQkhGU9Tf2sPFxc3G2Nje287y+fn4+vj+/cne1110fHZKdElMQUJMWl5GTkhITFlYW1lERUh0SE5MQ09b18TK/f78+fzy/vfKysnNzdvEwtra29DUX0ZBdXVAWVLe2N/Bw8bVQENKd3F0dnB0SUxNTEFISVpFX9308/Px8/HKy99SV9bS2cPJyMj18fXNwd3WXEReUldTXUFPR1lYQU91Sk1EQE9GQ0h0Tl9eRk9LS0JS0dvAxMTG9fXE3NrNxdPHyPfxyMTF3lRETUNMTljXxc3DzcnA1VNVVNRfR0N3dn18cnNzfHF0d01R39Pa9PXx/ffMwM/18fD8/fL5+//y8vHN2dBU0NDeVltFS3R9eWVnenlwcn1yfXF2dEdR0VRQUNHHzMrPy83P9MHT1tfQ3N7f3sXD9cPHwd/WX0dDT0xAXkVaV9DUQ3VKT0RfQUpCTUtCRUdMd3F3cUtaV9vCwcn95fn3yvDx8P/7+fj//f7998vD2NBR1dza3tVfU9VcTUp2cH1zdHB/cH1ycHVJQ19cXl3bzc/29sr39c3TUl9RXVTVWV/Q3NDQ3tjW1dRRXVdQXl1ZRVbR0kVOQERDQUJKTk90SktNd3l+fHl9T1pV3dLE9fXLxMHw8vD75+fn5+X48vDJ2N/RUlbe3FVSUddWX1xaR1tBTkZeRUVcUFhNQ0BMSEBc1NnFxsr1zcTf1ldU19LT1dfSxsLH397Y0FZcVddTX1hbXVBdXEN2fXhlZWRlcXRKTkxCT3V0dHVbV9bAzMz19cjIwMXIycnIyvH+/P398PH0zMPQVdbWUVZTUNzS1F1FR0B0S0Vf1sbF2N7WUVpBRU9GVt3FxsPDzsPExMb1ys3PzMLGw9hUX1TWVNRSRkNHQUBGXlHW0dVTW0Jwe399cnRNSHJ9fGVkZWdkfExb1MHPy/XIycnw/fLw8fL9/Pzxysr29/X1wt/T2d3R38fE3VBGS3FyfXxLXdba2N3W0VFaQE9NR1fE2NrH2sfY2sPK8fPw9vz5/v7zys739MDdVEx9eXJ+fHNxcXx9f3xzcHNxRdHQ1ldcTUl0c31/eHx1R1bT3MDa1tvC9/D1z8/Dzs7NzPTL9fTAwN9U0tLWxcr0yd9fQXFycUtAU9Pc011SUF9TQXRLW1Tfz/b3zMfF09HYx8HM9fX0/fzxy8rw8vz99d5UVl9ZUdVZT3RxfmV/fX9zd0RfRk91dnJzf3tlZmR+fXRAU1VTUdfW2/f08P78+ufn5/r4/vfMxtZEU11DW1XY0FhfRHZ3dXZD1dLY3dnZ1dHF1l5aQURW0djDwvTN28bF38Xc08P08Pzy8/DNwM/Gxt5WUlNeWNXRVk5xcXxycXZOQFDU0dfRU0BBTEt3cXN7enl5ck9DS09KQ1he0drN8/z55eTk+v309c3ZxdfX0lDX01RWRHdOTHF3WtbaxMTPzsLJ2tLXQUlBRlxX1dzSVNHXVNFUXVTb9fL/+vr//fbIysrDxsXe3tvY1kVOdH1/f3xycndCTEFYQUxNdnNzcXJ4e310SFlV0NrY3Nvf2sDP8fnz//v88vb1y8HZ0dRSUFJGQUpPRklLdnFxd0ZW3dfawsHPyfTKwNFDRl5V38TD3Nbf3NddV1JT2Mvy/OXl8vb19vbxyFRXVFBeRkx2fXx8f3h9dkpCRkVeXFZfQkJNTkhxeH5wdUpLWlPV1VXX3sTD8PPy/vv4/vD09vf1ztJR1tjQWUBYX1pcWk9CSHVDQVNUV9Pe1t719MRUWV9d0NpVX9VTX1NeWVlaXdbXyv/8/fDw8/Hx8vbZ0t/e3llbW09Idn99cX95cnBNQEZeQUxDT3dzfXt4fXBwZXFFQFjVxMHO9/34/OXl+/v98/z5883Mz8La3NZHWFZSVFJaQU92cHd1W11YXVzTzcDd1NbU0dHZ31TR2d/FzdjdxdPX28n1yML09cz29snOzcDbVV5ZdHB3eHl3c3xzc0pJRFdSQF5FSUROdnF9cHN7eHx+ckhG1cHFwMrL8/L+/vPK9PXK8vbO9vf29cPA3lZXVF5V01JfXkVZXtHTXFtTUdbGycbHxs7QU9NUXERbUF5QXV5bXtHbyvbx8fb8//Ly8PH19cXR0lZaSXZ3cXN9c3NzdnZIcX98eHh6eXx+f3JxeX5zc3RPU9zY9/b08Pnl+Pr6/PH38fTKys7BwcPY1FBUW0xFXFNdXEdMRkdCQV9YWdHGzvHw/P3x9cfc19RXVNFU1NVTX1PZ2tvB9c/HyMfGzMbD0tnYVERZXHV0dnZNdUtPTFhBd3dKc39zc3RKdkJ1dHd+eH9xd0RSVMTZz/P9///y8fXBwcTYwszN9vT38cLZ3tNRUlpc11NSUF9ZQkpISUBR0NnK9/X39c7HUVhfUVFSXV1dWV3dwvb3yvH98/3x9vb39ff99sjYV1FaS3NydnN9cEp1cX15e3tlenh7f3l6eXd9eX9yd0xf3dzN9PT/5Ofn+//w9cDJycHJyPfw8vP03tNUWlpcRlfUW1hDdU5KcHRFU9nAyf338fDMwNpUV93R1tlX0dBf0cXM9cPEzsnLyszN9sj08MnA3lJcR3V2dHZxd3F0SE51cnxxcXB2d3B2dHBzfXxyfnl8cUleUFzdyvD+5eXwyMzAwsvw8f34+fn/8vDBXkRTW0VcX1JFQVpCSHV3QVDWwcvO8PPPwsHc09RfW1tRVEdaV9LbwfTNwMf198jw8PDy/fzx8/bP0llFRl9Hd3B9cnByfHt6ZGV+fnllfn96emVwdnx9fXZPV1NSxMz8+uTn+P799crx8vL58vDy9PH10Ft0dnR3d3d0d3V3SkJLW1Xdz/f9++T7+P3098zY3VZRVFtbUFPczcbBxtPd2sfA2trA29Lc3NvfUFJcQF5UX0RGRF9WWFpBSUpKT0t2d3Z+e3h6cnF8e2V/c3B2SVzXxff28fP2w8/1z/X9/Pzz8/3w98PXWUdOSUhOR1pHRkJaXVXe9ff08v758/Dwzd7b0EdPSH1ydnVY0sDPwcvKz/Xy8Pf28fzxy/TC3dvdUFTWV9ZZTUxNQnd/fXJ/c3B/fnpkZWZneHl8dHN5fXN0S0ZUzfzl+/j6/vbw9vfw/f/99vfLwdjTXk1DTHdyc3dLTkl3dUBY1cbJ8PD8+P38+f3wzNnXW3Rxc3BMRdzLzvTOx87LyPXKwc/H3d7S0dZZX1RSVtPUU19FUVRTVkdPR0xLSkhzf3hke35ycXh6Z2BkeX13W9DP9PHy8vPw9PT28P398ffMz/bG19zUV9dYR0xMQUt0TUdb1MXN9/Xz8vT0ys/39VZHTEp0fXJ3TVzWxcD39ffz9v3//f/9zsLF3MXcVtXT3Nrd0dRdWk9JT0h2SEhwc358f2RkZXh5fH96ZGZkZGVwT1zfwPX39vL8/f/5/fj7+fz2/fTAwtxUVNZdQUlCXkxCW0NDWVPT2szIyPTx9vTy9sLFXl9QREZAX1bU18fPzffLyPD39ffB3tFE1dBYXdZd0dhX01ZU01pb09Rc1VlFX3VKcHp/eGR+emdlZGZnZmF6en9Kd1zf3vfx8fvk+uX58fL39ffLzMjAxcPZ39xT0NVf2d7S2tzW3sHAwMbBzsXExNRURU9EQk5EWFlQXlPYw/Tw//n6+/7y9M7H29NSXFZR1dXX09bQV19cWk1MQkpLcXBwfmV6eHp7Z2ZkZ3p7ZXxzcHFxd1hd1PXz8/r65OXy8/H18PbMysvHxt/V0V1XVEdH0dDU2NLGysXPzMz3yPTx9MDa29jeUERWVlZYdVpWUdbay/3yy87E3NRFU9dWRl3b3tJX0NjYw9/cyMbTVNfc1l1BSXB5eGRnZmFjbGFkZmdkZXl7ZXpwSEdUyPzl5OX5/vz09ff38vH18/LKz9vcxsXSVNjG0tPC9vXKytrOwtbVVdZXR1vU115FWkBCTU9LW9jezfnk5fj/9vfI3trGwNjR38fH0FFRVldV0NRXUUZBXFlZREp/eHlnZ2dhY21hZ2R+eXx+fHB0Tlnc2Mzw/f7+//DKz87Mw87L2trF2cdRV9DV01DS39rCzPH9+f7w/Mvewsfe2t7TxM3Q2lVIREBKd0BR08fG9Mr19NjSUlnR2NrHzsL2wFLfVlHV1VfFzt3FxlXFxtBST31keHphYWBjY2FjY2ZmZGFhenZNRdTfz/38//7+zM/39ffO9vTz99/Dxd7J01fdzMXE99rM+//x8fXS1VFeQ0paQFxXUMPVUNZ1SkncW9f33vD78/7OwttWVtbP0MfxzsfR1lpDWEpHVNBW19VQ3tBXV3RPcnJnZ2RvYWZiZmBmZGVkZnRxT9VU2fT+8/D8ycv298PCw8PIxdLURdFeQNTTz8DMwtjK8Pj5+v73/PfM3lBdX9NcV8XfwlVPXlNeW9HS2fb18/HPycDRUlfY2tvL9MXe21dcRVtDXsXRUVLPwFLG31dQWnB5c2ZtYmJgY21tbGJsbGJmeXx0XfXx9fP18fTDzf/+zvf7//H09d1f0NFdxvPLxPX2yMr7/cr6/M7O/lRK1kp9Ul9G0txKV9R/UsFH2v3L/fvK8PDQyPRWx/Hexs7LzVxc0Up10k1N2tRBWsTeX17bXXbQSGd5eG5ofmZpZ2RtZmZtfkp7Wchfy/vdzPPW2vbM8v7Y9/nGzcTW1kFf2FfG5cDd8cnN9uf7z/Dh8djlw3RX03J2xlN3WkV+cV9bxsldyfrTyPtS1vNTVvDb8fvXzfJZU95cX0NV8t9X/l9M8NpEWMHadXdNZGJkbWliYWJuYGcVbXlmckRd1sXwwFTCw0XB98zw+Ofz8eXGVfxRccLNx8vz/dzW+8ta5eTU8ePDW83MdnbcR3TawH1z1ER+1v3WUef4W/PkXEX5z3XO5sHP5cZNw95xSt9OQ8zdXtPaU1vXV3dQzUN2WXJsZX9paXB5FWd1aWhOdWxB9lhb5cxx3/lJdOf+X/vuz87gx0zI9XPV5cPf5P/b+ubF9OPwyefnzfTwR0PG131U9HB+UXVlVtJ2VeTdXv/AdVnKSVn+ydbk4MXN/dZMx9Z32PBdRPbaT9v1TkDNQXbCxWZ3U2NudH5rZHYVFHxtFH1cYHL8003y9nNS5FNN4+ZV5+jWUeHDecn/ddbv9V/j4NTn7tLO7vDV5+RB3vhDc/TYe97+e2TyXWfN5UhX7vR8+fxmTeVEfeD5SOXgdFbgUWTwwXrC/n53/kxh/N9sUfZhcfN6YM1/FEpIF2RdFBZaYhFBUWtJ5n1z4Nxm8OV60e7FWen5e/DjeUvhQnrg+3P561bKlPNS6+Nb4OhEz+5AceRQZvP0bUrwZXzlWHrk5XbO5n12/E1n9PN2yuNXW+D0Sf72e9HmTHHn12Tw92BE83p+8kJh9cVifV1ubUdmF2VmEGB3am/eTGHDymXQ5U915/FG4ONC8+JeRubWZPDzcczmU83p/lfh5lP77NTN7vVE5PR7y/x/SPFxZ8raZ1f5TUbn3n70w2VZ9kxS4P5Z8ubV3uHbTP/9T8HkTUb+X3hQUmd2w0p/y9B5X19iZF9iaHNkFWFzaGl2fmZQ039Y9Fhb9spf+uRTxeTTTPHAfcX/dEbnxkjn4lHK7cDR4/rT5ezAwuHES/PwcET1dH7GUHvR9HVf/ld8wdp/WfNCW+DxWPnnXNrk1F3l8kzO5E9L8l1nTVhhdsF3fc3Rf1rSZHpTZmt8fhVgcBVrfXpjQd56dfJcdP75WvDhV9f/xXTe3nhE/lx3/vlI8eBT2+3/UOfswfXu/lz45UTS51J9w8t8ScZKc8rFed/7cnP+VHrM+nXR5sRC5eVy3+dU1uL2dfzkd1vwdmfcVmdG8HFw/lFgX8ZkZlhkFGRIaxR4Yxd7WGxlyF9lzf9Bz+7CRuT4fNL+fXryw3H05UTQ7P9K8+3aze74X+HvVcbsx0Dl+n9b/HR+99ZgX/t9cPxUc/X3f1v/VEz++kHB41R3881x8uLf3eH/TMX7c3jyUWJb8Wd781htRctlYtFzFnhRFBdNYxBkRG5g9lBnwuR3QO7wdPrgWln6U2Pb+X9K4cZ45ONNx+n2W+3sW/aV9EPi4UD16NZ++PFlWPp3Y8z3YHXk1H/x/3pP4NF7/uF2QOPYZM76f9bsx0nj7UlR4ll6z8Vjc/9xYcrLZ3X8dGxGShVtRm8QZH8Ra0Z6aVzIZHX62nb74UbF78Vy88phdv5cffnnRcDp9dfs7FfK7/bf4+bdyO3z1Of+S1bzdX7YR2ZYz3FC5fV1yP99dfnVcvP7Wtjn2HLHw3ZY/8Re5eVSwvjVc9NCYHfTcnnBX2RVzHx/02VpfHwUFWRqEXp2YnDBS3/OyHTY5sFM/edH1v9JYdfcZ0b5VUjk5tD76Pbf7uHE45XwyePyxuzt1MDn13PaUGJyV31x8vFA9f12dPPQfc38S1Pm9kL29X1F/9RB5OVW9ubWU//cZ0DKc3P1UXtb2XlbznNjdH8UFWEUFmFgaXNRZH3GQ3/a91/F59BC+P99TvRxesnGfdDg29Lj4dv67vf06ebE5ODX0OP9Vf72cETMfWx3cGJJ90FF5v902/5eQfLad8f9WdHk1nfJ9HTW+N1R5f1Dx/tVTfdXZdTBe3ndSmZZ0WV9V3prZGYQFX9vaEpIZkb2Q3X890vZ/kZY+t583cl9SvVUc8T1WfXiwt7t5Mztlfvklf5R+OfHyeHGQf7BekfWZ2JQV3tZ9l9S/cx39ORDd89RfPT1eVr4XmX28nTD5sFX5fF19fpKTPzActfFZn7Kdm1cRG9nS2gWZ2wRYXAUYtB8Z/XOdN7l1XXzzUvBwn1H+99wwfxB1uPxVuDg1/jq+fGV7Mzn4EDf7cdy/PNM0fd3ftFKZVXCdkXk9F764NfF4NV9+P130+dVdefyf9rhQFjtzHjx9nxf80dy99RkXFJhe814b15CaXlKaxV1ZBFgRm9i2VBw8/tZx+dWdfPWf1DQenTxTWfGwE/c51VF5fFf4en9+pbjVuPiXNrm30/6/1jJ+Ut09U1kUNJlUfvUVOf5TtjydEzy0HH29k7d5NZ28/FFwf1YRPPHc9/zTVDIQXffQ2RERWNmQnhofn4UYnNqF31/aXLNQnXzzE735VjS599xyMt13c1KXuXCW/v6Ttznw1bj49nn6cfd4v931/JPWfzZSfTCfV3MRn7S1E398tzz5lNE+8db+eVf2+LLQv78d13+1H3E0ntOVnJ+3VJkRdJ6cN11ZF10YUpEYWJMeG99e2hkRWZn99x/0vN0R/vMTvbwc0LISmVfRH9UykTV8NtA9/zQ8+P28Onh9O/s3MrgzVD7/17a59RC+dp8U810QvbUSd/YdlH5x0bl4dXL4cBS5/VK9PpGTvdfelbdZHbEe2fMU3tH2XZx1XxndnFuYHdjaH56a2dHZWbHQmJR8HRa4fdY5u1H0OFCevTMc8bkRlb82Uf980DN5d7E4ufa/+TezeHNS/HzStX62FPz3Xva+nVO/9B8xclN9OfawO/hwOTkVFT7zXXK8X9yxX9iRXRse0ZmZd9DZt73eEPwQGVTSWJ3RGFhRmVvT1Bnf9hyZ93Yc8ThxNHm+VjHxHpK9XV88fR7UftZQeTAefTi3MPp5fXs5sPm49XT5vVF8/tHXPFJcvVQYV7cZ3zHTXPz5Vn2lfPU4PpL9eLRUfvXfVTYZHPWZm1ESWNN2GVE9kl391FgS1lhZkZhFXBxFGREY2dQemH11HvC48jA6OfW+vBx1uVNTvnWf8zxdlH7W331yXfN4NnD7vPL7OVO9+ZD1uHBcfb1edn7dXPy0WXE8HTW4MPF6u3I5eNT3eDJS/PNenXEZ2PUexR+dmpn1GVkz91zwv9yTvBKZdpYb3JSb2ZXemdWQ2BAw3JG819R4vlD/+V6Rfx9evfUYlP8fFv7UHzJzHH04t3xlOb8lejK5O3C9u3JX/vIZFz9fHz0c23b3mZN+EFF4PDE7ORa/eZBzu1XQubWZ87DYnLWbmzffG7d1mZX8Xtw8XJj2k9pT1kVYkZoa114alLfY1z4dU3i/F/v71zz7E5x+tB+yMF6Uc58SPVxZcZRf87/W/fpzsHs+1Tn/tPg5lf7+nbS5kx359B68vBl2eRF3u/3zuj/Xfv3cMz9SdDzc3vWcW91cmpldmt5zHp6/FF78MV/yvB6X/JkettmbVVxaV3TbF7JY037d1rvylLi2n/9VmzTxGBc/2RC5Hdy/Fp95fRI4uBT4eja+uhXxunXR+zIdPjFZ/f2ZtvxYUT8ZXHgQXDs/Vzu4kH+4XnW4kbS71p9+Xdv2XYVXVhrXshjRP5kcv5+ZvdKadRbFHPUFGPebG3Lf237Um3l92TmlVrkl09W7X155Fp++1xh+d9t9MBv1P9nxOlI0JXGUuvzcO38YOTgcPzsc1fqXE/q9Hzk2nvk5Xnk607/lV/N6HJx4EFw4l9h8VsUW0AWd04RftpueuV5ZORwbeVGaPTea1v1anbzYnLyZHr/fGP8TWD69Xjh4n3x5GFO8GFz5Hpg+khh4N5m+/h79u9D+ZXQ/Zbxx+vLcOPAeOP/ZPz4ZPfnZcfgZHXnemTiUHvp/HHt4HL24GXA73BR7Ut5+XRty0hr2UFqQdhjSsZ7cdFiYVFnZl9+bF5Jb0raenTOcHfxWHHwzlrk597h5HT0/GVQ8XNC9HB09nR393R9y8V2yvxe9eba2frfUvfXWffL0PHK3fn5zv3828n0x8POxNj48sr4/NvN0XVbxXdbxXVEw0B/R3NmdXZ4dnJ8TlN0ddZJdEFydk10d0B1fFhAQdNcQtDQTF7dTlDF1dv88dHJ0X1bQ3NEX3VA3tFX3Vzc9szE9PHDyv339/DAz/HKzcnDz8zd0dLFw8TZwMLaz8/X3sXZwvT1zPD+xNDHxd/NxVPaxlbW10xKR1hAQXR9c3NlYWdne357fHZyc3J7f31/c0VYQl3azdnZ9cz38vb08/7I39vRRUVXQ0xRU1tQX05CW13X3dfS2NjVVlZaUtnO9PL8/P32yv3z+/D1zsnwz/L88PP9+f//8MLOxFldV1pfRUNKWlBNd09wck9NRk10dnF5ZXpnfHd0S0dV1UVPSElJdVnQU15X3tXc1FLezMfTx8/WXkJ0SEZJT0dHRVxR1NPV28H39PHMz/bFUdDUXdbO9Pb55fLy9d7S29vFxdJX2dlQztvb9f398P/By8ZX29j09NbDUdffQ9lXTNRXVlJfQ3h+ZmxraWNhenh4XklzTH15f3NCXtld0sLN8djx//fkzfX008JEWlZaXVZXX0xYWl1FR1/cxlRX20RNWXd9cEpb38v3/v764fXz/vLn8fn29PnG9P7L9/L4//HL3dvRTUFfxlLX03hc0UpyR19OUtdJWkRxeGZnYWJleHxMSVlDSnRHd3VU19ff9MtSwcPU08rE3cDNRkFDcnZyQ0dJW0FAW13TXtDE/fTBzMHfUVlWTkZRXlTI8PT2+PTN9fDw8/zx9Pf12MfT2sHN2PT9x9jHVFza9cXI8Npd2sNSVsXG3cfcXEx1fWZtb29saWBhZGV7e2Fkfnh/WN/Qzvnwz/3/8f34/v748s7bVURDRERCXkdFQUdGdVheXcHTRNdbd3ZAcX53RnXZy8H0//z45uTh6eHj7eHk5/vx98HJ8fXAx9tXUkNaUVhU0FBFWllzdltBSdfa1FjXQnl3c2ZlZWV5cnFIc2d/cmV5dELVwvX38PP888HN9M7DxVRRU1tOdnNydUB8Q0ZZWdHZ0c778dLD1l/RXUVJdlTI1FHGw83BxtXM/v35+Pvm/P/z9NlWw93dxtPU3cXRVs7xx97O2srRQNBR1crd0c7fWUh0eGBgbG5ibWdmYGJiYGhtYGx9X9zz++Tk7eLl5eb4+vLZxsvB2VhwSnR2c3RwZXBJSl9Q08bRVktGQk1IZ2VCTF5R08339sj+5eTn4uHt6OHj7frN8/DQ2lZYX1/UWUZf1lRHWtxHdkVxcFhSVNvMxNvWX1laZWF8ZGR2cmB6fGJjZ2V6fk1T2vLm5P/45PD0+PZHVt1eTUBGfn95e3FzQtFCTtTJxvf79tv1yNFcS3d0cFpCQt7B29/G9/bl5OHh5+Dk5Of78PbOw0dAV1pd01jXwMTU3cTU11RFXF9P0sLByP/C1s10YGFnYmlkZGN4Y2JgaGBpYnJ9V9L44efu7O/g5P/LyPXe391T1ExPSXh9dnpxSkhKV8/b9PDewtBxd318eEpzcdle2fT18PXg5fmU5OqU/pbk5pVFlGfHwWL3Y/VmX0vRR9hDX0Z4wGHGZfNbwPje5NHNRXxKZGV7ZH1kfX19ZXpmYH5kck1Xxcjl/PPizP32dP530M1l+G7BdnrXY8Zn23THUf3M4fL+4dj6ffdgSXFkQWRES0bYWdjO9+Xy4eTm5+zh4OL45crFXkBUdErXc8/SWudy9lFD+m/mctj0VOZb5Nf3fFhjdGh8em1latMWc21pZWhwYHzfc/L88+Ph7ebh//z1yMHbVUVbQE94c3pOeHZZcd5ezvxczeVlydJp/2xg9RbwZn/pau7VzJFDnfDp7uSQ/Ojh7OX61P1IUHd9SGHZfPVKX0taW0xYTNhHydjb3/Hw1tZGTkNgdUAXUH9p9hd/Wxf6F3DJF+tj/+Znk3Tr1cXgevBxxXZS3MRkxmTXT3r/ZOZB4M3l88HnR/t5UkVgx2p9fWzIZUzYd/7D2ezd5u/Wlvb5lMjs517j2X7vb/bLY5FgyvhslWNd5BWXeNjjapVi9MJq7BdGchHxH3F8EPAfzW1nzBT8Yc7EU+fY4//i+OTh0+da9cFOztLSXXNIT2dScHfEcfTXdPVYSPNswF0V4RZeRBHgaFX4b5FA5Zdynt/skXGeTuqXZZ5g4coXlBD8SG3pEeF6fPZq/mbS0V/zS/Hf+Fzy1NbJZs1vSH9uwRRLfmj0F9F1auAU+V9ml2aU29nrfOFwzlRN9kX9RvR0wnNx2WXzcPT0ced95c9742zIcWrhE9Z+FeYQ53VD4nDq0eTl++PC7fjo8O7+9uR05HPG3kLie/jEeOBo8lhs7mrjXWGVa+l0SOFr+mNKe2tyFH9oZmF/YXtNe1ll9klW/VTqweDjUe1Y0eZn+/R+62fL9272YHNXZkvIdnbzf9zSec5OZMx5efVvxlZt7H/F4n2U8MSRQZTuTp7S75VBlkbU+UZTy01E+nrSxW7Xf2/0Yn/mb/33Zpd/0pRo48NglBbQzx3iE37HHuARdMAT7GlZ/W+XfObhfpdp4MdtlhXsx2eWbfjFYfpkcf969Mtm7mTc+mrvb1vzFulpTMMX4hXf2m2UaOL8eJxilO1QnkyU61aVxc/sT+bmeJR7wfgX6Gp49xDraU7gF+hpV+YWl2rz/heWEvVkFvIbyGpnwRbmbsnGeJRl6v/fkmaRWcLubpFm5fZ47hX+d3D2F/pjdfNo7GrC1GvhFedxdORl4mXA1nf0Zv5E/fRM60ri4VSS0ejrWpZU+eRE5tXOU89ed9MV2mdvwhHAfmLtYvT6ZuxeWe9SzuJT0PJtU0UT1W8V2BZyURHcQnvhccftdffkZOfIe+t3X+xj+Ntg53p14HrQ8Hnm9GHtQ3/ibVLnYvv4buJ0augUeOYT5MpolmBck2zo73ef9MOcWf6Wc+rsYJbXZZUUXOQf4XoX6xbF+BCUdGKWa/PnF5N0fpcQ+EMd4R18RxP5alpdZuFk48rJlHaW3EaWbe7JZJBt2+cX72Bs7xHLWGmUa/T2ae9px9Rv52L5X3XubOVxcuMU4EFa6W/s8EnoXeXu1e/n0uPN9Pjf8dPAS1rSbl5iZ0IRx2BwyWnsWXXqSOTnTerL1eBC11F6fWRlaXJnFFBrSkxo5mTN/H2XfdfjZPrQceZZRf/UQ/dCdM1zWfdQVf3+Q/70cfxDZPBYYvZYYPV0ZMp6Zst/evJLQudA9uLf4ez75O3k+e3k9+79derFZfp7YVFobMNvYflmc+149u5g7P1t6lNn42985RF3RBbZa27zFUfIbeJUXZBe+JZy5OVl6VJ973FR+W3SzRbQSGv8Y3TsavHgbu1NfuJq3v5o+UZy42P09GbmZFL7YedT2OB06fzz7FSV3MjuSezTXO162chtw2JtVhFAcmPwYfD00eLU7v7T6U7m333jZk1Ua1VsakUQfn9q9GPU/WTj187gd+fTwfhw5lTPynbgdkb8ZdjXc+XUSuHAWvvUXfR9R9plc9R9QVBkV0tkXXxAcXP5X1jh9/Ti8eTq3+WV1OHpXu3ndfLJfUNWZmdCYmRUYnn7XnHi/3Xn8XL/3mT/0GDCWm5wcxR8fxRFUWPA5k/87lTz4lNU7E9D4k125k52+HN58HRjykNn9Ft7+dty+8d6xMphWPxn3/15z/hmRPlkZed+d+t91pRAzJZF05Zzypdm+O1p/Mpu/3Zu9mFo8G1n/WvC/Gfq8sOXWODte+DdS+dk3NdsWGxjZhVLbnnTY/BOSu9/8v177l5P4nbZ+XDO5UzS4UhX4nHf5n3b+09c4FBl5XFjymd7z3hb237UcmLBYGP4e1zkRvj33ePa5eZd6OXblfX+4VX/3dXJdPRze/BiREJs9WZf5XjmwXLicXT6fFb5SkPIYWfcFWNRaXbbcEX/yULn/Xz6+EzJ8VzX3c1aWfV0XPF3XUfQRGDxT2Hg3nzl0mXc0WRC/09L7cV25slgz8lv2eBl2O5xRpVWfJXSZZfdZerYZO7IYefYYedUZvFaYNBYYNPbcPjOVuTBwsNH/NdH4VxzwnpkfmJnY312YVpUZ9b2fET/UETlwHD4yn7l5Hv96HTb6llT60B67VZm7M9p5NoX9FYXzcNu8vpsw/VtWVFhUM5x3PZO/c5M5l/b7U365lLt8dHuw17j20DlQ3H5cnjGZXrDdHP0RHPIUXPJ0Xbz1dX9fttdbNtkZ9lmQcZkVPl9Ufh/xeV8x/553vhIx/pAxOdX2vpe0v9wXNVy/XBw82Fd0WPSR2fNyUjn/nbkyXr20H7wxHnGwHbJzXDBz3Xy8EH539HmdfzlSuTDRPNWRPZbf8B1dvZ31fN+2PBwU/RZXfjdXv7Vf9dfY3LdZmTJc2HcR2Vc3UpAz9FLw8tXycny9dfl91z5+9nN5VZQ9kh313RjSkZvcVBhQfBEUv7ST9XbS3HL1n3eyl5x3vR9X/5XU/743Pns9cLn/kz34WVF4XR99NBlX9NmSdhmecN/Zs1Ze/XyTNn40l/HXEhNWkR2W89aePTYbs//YET/QHPk8nTy/Uv05XNY50Fx+Md1wMV9dVhweXN2eXl31UVX49BHlfF///hzSfpIe+XeZsrEbV35YVHtc9TryNbtz3b69mP35mDQ7WVO4nlx4WR45n5n5nBj5UZz5kRC4VFx8Ndkx91nxVZt9NRq0dBrUcxjwft//Oh11pVIce5feOL9feDnZf3gbU3kZmH1f2jVTmz0ymP752f85WLU52Za52dS4WZO5GZ99n1a49z1kfrBlMpC7Uxk+Ep65lJn+N5v2sJuWslodfRucuNyZe3LZePnePvKZPjOZv3zYc3/Y13xaU78bkeVcVPpXFj+cUn0ennkT37jVHvj1m3lxG/32GlXx2Hc9XH75Hfm7mbG72ZA7mV24Xdk/UFuUVFqROR7zetC9+pwVux7ZeNEZezQZeNDZufRYuXMYvvcYfrcZufwZ/jmYdPlZkD/e0z2YXL5e2H/eGjIcGbmynHp537t/mT5yGb6+Xzh5Gb25GHf/2ZR9W5H9mlz8Xlw9lh2/Ud6/lll5fZl9Od53PphWPVsRfhw3un1xOr/WuDfZvbYY/b/Y0X0YE73Ylvwbkb4Y33mf3/iW07rQXTpQmfs8GTk82f5+2PI+mp15Gl743B87dB+49Ri+1Rqz/xgVOVhWuNlde5wZO7QYuXCbf35Z/jgZPHsZ0Tocn/tdmXiS2HgdRT00RVQ8mBW4nPE60pC7k1n4Mpm+vxsyv5vw+Bh1u9Id+LYeuXPZufwYPvkb1fgZH3meWTlS2fkX27xxRTR5Wxc7Hzf6XJc7kB44/xn5edj8Odg2OFiT+J6Z+F2b/9RbfzJbPXlb1btYUnuf3LuW0jvXWb7xGnN52DQ7HTX6VBf7F164c9t9/ppd/lsZf9gZOFwYOLBYOf6ZP7mfv3tZNvsYXfsdnPg1HLj22flwGjL8RVF5WxJ52Rw535k41Zt5/Nu9+Rs2eNiU+xhTeh5Ye1dYe3IZu/0bOb7FfTgblbvZlzoZXHpY2LtZWrmRWnmzW7l/2747WL26mRE72R47WVk6EFh7spj4+Rg5+9j/O5vwO5pd+1jZ+B5ZuJNYOLfaOXwFcb7at/maVHiaU6VfXOW2XKVzWHv9G7g/Gr95Wnf5W5K4GBw7GVm7HFo5F5v4MNi4/9h4eZjxOFnT+Fkcuxzeu90beLRY+H9Z+X7bM38FE36a2Tjen7ufHuVXHCX9Hvt+mHy+G3K5mPY7WVelU5K70d4501t90pq2lMXUsBoXeVi3et/ROh2fO9Wce3We+DBY/LwYffjfNbjdHX4f2f4TWPl9WH95GTG5WNF5G16+GZ54Xdg51li581n4Od75vFj5NNp4E9s7XZ37nrT6mHh7mPr8m3uYWfpFdrmEexaYpFgUJQU4/cVlm156xPCwBHrZGSUa+fsbpfQYZRgdettwe1s1fRu3vlhz/pmVf5ncPV/cvxZceT3SPP6cFPmXH713WdZ83dz8VRnRsl+cfvyc13kRWDf/WZi/slsRe/VYeGUQHeU7md17lBq0OtGbf3sfWPl7X144OdhYvr+YWL2wWpt9sBoZufkZXPv4n9+4eFwfODvdGDH50Blzu3TZljlUm1w/MBhfvj6dH725URl3OdQYHn02WZ49v59Z9L+WnrD4vRwR//0fHvf8EV9U/DEdlHl5NFa/OTSf17OUXJ1zslOd9L1VEDF+/DVV8731U9QxEV/cFlfcXfE991e2/fAQ03T2dFd1cdQd0rT3FlJUsRYc0nTxF5Gzf3a0M/xydHXzchWREVWUXV3WlVYd3dGWXRa19FURV9QWHR1WF1QQFHZ0d7C8/7x9v3wx97a0tLW1dzQ3NVV39rHxMHHxVdY1tVedXVCdHN9SltEWFDf09bGwdnf28jIwN7b015d0FRfU9dQWFxXVdVVVF9H19xWUdPa3lFUUVBeXlpAQ0xBXkFZXlfS295VVNRSR09CQVNQXFHU1tLDzM7Nwc3H2NvE3NXS1lJV3dRTVN/Dzsr098/IyMzYVFFCdHR1SU1YWFNSVNDUVFRTWFNUUdReWVNbWFxU09dSUtRV1Nvb0tPdxsfawcDG3sXE1lJX01NAX1xES0pCQnZOX0Z0SUdDdXV1RkFBWFlcV9Hfwcvy//788PfOw8PO3Vzcxd1V3djGzMzLzMLHxNnR1V9MdnF2fHRNWEZJWVVRU1De39/Az8bd3tNWUV3V09bf3dNX1tndU1ldWERQUlTX19DUU1Ld0VZfX11YW1BTU15TUFxER0dJTVlJSkVSWEZEUNHV0Mf1y8v08Mnf2dxSRV/V0NDb2t3FyvDLzPbz88r28czWXVxCdHREREpLQURbU1BaXFJUX11RXkNAQlpdV97b293d3trEVtfd19Df29jDw8TZ0NxQV9VXUl5eUdVaTlpEQHBycXx4fXB2cE5bR01HX0BY3d/D8frl+Pj88/TO3FNfVsfCx8P19vf0z8rKxtrF39Lc1VpJd3NwSUx0dXRPXF1E1M3D2MXEwNPVVVNcV93b29vZ0NXf1FpYUlNeWVzX1VHU1VxTU1NcX1RXUVTXVF1VV9BdQkl3cXFwdkhCTFtaQkZaRFhTxPTM9Pz0x9jH0l5HVNLdzfT28//5+fLz+fD39vH1xNncX3dxSndzfXN3dnZATUZR1dXQV1FfRkZbWVXQ28bZ0NvG1FJU3dnfzcrB38PC3dfQ1FhMWFpCQ15QR09HVkVIRHV8eHt/f3lzQ0NCWlFQW17d2Nr25eX+/fLwzNzY0NfazMjNyvL+9Mry9MXFzMJXW1XXTHVCT0p0TnRwS0F1S1jT2cHJ9/Te1NbR11TTxsDVV9PXXVpYW0VU0tdU1NdQXl1UVEVc1VlPQVTUUlbW39HS3tZeWkRze313cXZGR0t1W1NHRVHX0sf19c3B2tfUVd3O8fD2/fz45OT68Pbz/crNwNrVW1tdWEVfQ3Bzd0x2dnZ1dUhR0VTV1UZFXFXb3tPc0Nbfw8ZaVldd3c/N9cXR2lBYVlLd1VpAdU9OQEdIRl9XXVpSRnVxfH1zSnVCQkFAT1DQ0dPUxPb19PH+8dFS2MDZy//PzvH58PTx//bGzvDB0VdfRHZwTlJfTUBbWXRJW19BRVfU19/J3lfTyMXfzc/aVtDEXk9eVkB0R9fRV1DdVkNCQldXV9zcV1TYT0XTVcRYXc3HVFDWWnd9dUF0cndZRHp2XEFESl3F3crMzFp21lfe/uT28/7l//D74Pzw5eT+9/PbXlRIX1hxT0Nxc310cXNzX0Nye0xVQEpSV3dS9M5Q0/T+zlhVV1NSwcvW8crA5XhK/cNwS/bMwsZweV5GdXBPR9NZddJfcnJZR0t6W9tfW3F2UVff1Udd28LZ3vTK1dHb8PzTwv71yeTl+/zx8MHb9/RdStdU13VJ3V9PXlDRTU9YXFtDXdFWXV5VVkLU2lZexclR11PV1HRG0VFDwlFAW1LbVndcxVRf2PXdWlxUVUhHW1ZR1FZQUURc3Etx11hGTXFMQ3ZyX1l12sXVU1XX1lHC28r++OTk+uHt4Obm5v3w8/PN08bP0EVX00hwTkJ3cU1ZT3VCTlNAdXVydXZzS0zV0tLT29/d11/d1tbZzPHYxMbdxVZRRUBYWNRcW1lRREVMSklyc3V9c09DS3R3dUZGTEV1QEZYVFNTWFPSXVJX39RT2sn0//7/+fvn4+Hk5fj59fTI39/XVtFfVN1TXU5Y0trAVlxe09tcWkBdR2VyT01KTVFcdnVcUElAXd3FwvXK1tTTxNBYXlTQWl5XwNDFwMnDWFVET0lAX0BHQlpJdkp0fX1zSk5xdkxIWlhJdXVGTnJB1t3V9+bn++fs5ubh4+Pj//j39NDV9tHU0tHaSXtZ0V5T3NBaRtddTEx3Q3xnZHFzc0lZQkf0xlldytr1+OPk/vbA9Mzb0MfeT0h/ckHOVVHW0MPYfndRdXN0Vk5yd3tzcEbVTFdEd1dcR1BB1HRQWXx3dHXR+/v54ePl+cb65v/x2/TJ11NfUVZGTMzQQkd2wlFFxc3SxtnaRHdfRE1HXUBCdnJATXx0d159cFlf9/nC/tLN9NxWc9J1dvHQ+9j5xUrwy/3P9MvAWvTaXVhM1091dmV4Q2ZKRnZddlJPfVhxSnhkcnRXw8vy5uf45+b9/vvl/fP3+P39XE1QW9lMd3l/RnZSW0RWRdVBQVhwekJDc1V3RVhATE1WVltZUljB/ufk/OD49PDd0/XS2MnFz8LfUdZUU99Z01FCRnNHQnFIdEx1d050dUtFUltC1kNNV19fXkxITkJdwPb2/vzn5/n+5frk//z2+ufH019W38fS319S1V/T0NnQ29JUWEVYcH5+fnl8SXBzTEpGSEhLdnBE2MfI9PHxx8T1xMDQ0fT0wMXeycjRVMTxUNFXUlRMXkhBcnt5fHl8ZXx0dn11RU10cEZPdHRLcUpD1MbEyv/88+Xn4+Tk4Pv45OTw88HDy8DcxcVcU1RQ1V5K1EBcRl5UXXRJcXBEQUVFXkBSUddZSljT0dLZ9f/wyMjHVN/R1FNd1sXZ1l3U3lFXUVN1TltdT3NPSnF2SnR1S3FzS0tf1F5SWUVaWF9CdHZ2TVDQx/XI/Pj38uTg+uXk5fzx9vHF3dvBzNHW2VFbW19Q1dFT1NjUVlJfSHVJTU5OWkNJRkZIdXFNT0pBVNXc2sbExszB0tLE29LczczBx/T1wMXG01NYR0B1d3R3fXB3cHxkZHx7eXdPdHd2dU5ycHZ2dEhX0sT25eTn4ezp6ezs7OPg4eH/8vf2zsDZ1FdTRU5ISEBBTUdSREdGT3R1TkVaTFtaWUFBWlNFWdDV1FDYwcTfzPTMVdHQRE1e0VJZV9jb09fa3lhJTHV8c3JzcXR2TUlNd3RBR1hdUFJZREZNTnRKdEpCQVjSx8bx+uT75OHn+Pz7+/30/Pz2xPT031bQ2FdaXNdSWlDc0lZX11NcWFNfUk93QUBOS0BFR0JbWVlZUlHW39vMzMTdVVHVUlbT2dLczPXMxdrF109JTHV8e31wfH53dH14cEh3cEtJd3NwcXZ2cHRIQU1c2/T8+eHt7ezu4uHm4OXk5fj4zvPa1t5NWFBIX0txUkRAdVtXQkhHU1dYUldQWkxZX0NCUdVQUlXS2t/Zz8Xbx9jQXEdYR0FHW1bUUtPY39/W1V9ATkNDSnZ2dUlPSVhZWkdOWFhJT0NPcnxwc3xlfXFzdETe8P3l5uHm5+Ph5Prk5Pr65+X/9cn3wdTQ11dfWFDR1llW11BETFlTRUBBTE51dk1GdUlbXlxZUN/Z0NrNwMfR19RcXVbU1tXR3tnU3cPd1lRVUkxJREV1cnJPd3FDXVhLSk5DdH1wcXJ/fnNxc3x8SltY3fL7+/rm4Obm4eDm++Xl5Pj//PTB0tHQ1VBU1F1ZU1NaTU9EQEpDX19DSkVdQU9SU0VBSV1WVtbFxsbZ3cXeUV9YW1taUNHX1tPS3dLT0tVRUVNSXV9fWEJ0dUBbUVfV11tMQEVCdnJzfXh7fnlkZHx1RFHD9vP/++Tn5+Tn5/v55Ofm+v748vX0ycLB2NnY0NZUWVpAdEtDSE1KcXR0TEZNQkVaQEJLQ1dQ08Xaw9vfxN/W1dfQ1NXXxcff2NzQ1ldUXEBeVlJFTU53cn10dU5HX1lETHdKdXFxe3t5en9+f3VNX97az/bw8uXl5uDg4+X/+uDm5fvl/8709MLG2MDF0tdfR0FPTHR1TU9MSkxHWFtSU1hGREFCQkdZ1d/T0dLW1FFQU11cREReUdfewcffUlfTUFhbUN7T1FVWWU5MRF1aRVRcWEZARXV3c395eH96ZGV/d01f1djayff+5eTn5+T45efh4eDm4ebk+P3x8PPx8/HB11BeTHV1S3RyfHNzcXN3dUBId1pZQXVBVtRRVdDQ09HfztjF39HWVNvFxMPCxNZQ0VxFQ0RT1V9DT0hwf313SHB1T0dKd3VCdH18fXN+fXdNT0RR39/cxPfy8/nl5fr4/uTn5+Tn5OX8/f3LyfXw9s/C2tRcWEZKdnZKTUpJQV1aQEdXUk1FU1ddU9feUFBW0FRSXlfUWkVfVVdU3M/Pz8TA01tHRVxSV1TUV15FWUREQktOTUNfXkp1dnZ8eHl9f2V7dE1IT1/RUtHF9vP19/388/365+Hh4eLg4Obk+Pb3/PLLy8bfV0RMSnNwc3ZxcHZLSnZCSUNKTF5cR19fXllcUFTWXF1X3dFU19nd19jMyPXP2d5cRkNSRE1HR0VPQEBNdHRKTU5EUlxLcXZ2cXNxdUl2S15XX1bW3dPQ2Mr0zMvw/PHw+OX7+uTm5vr7+fPJyvfKwcHMxVVaR0dMdE9BQXRJQUVMTlpWXEhE3NxFXlTUWEVfV011T1pYSUdX1tbTxvT1z9jZW0hHUF5AR1PVWlpfUEJ0QFFERl9SS3J2dElyfnF2cXZMU1pFWNPfVlHZytzQzPH29vL65+fm4+3m/vj68vT08PbKz83DVFheWUZCTFpOdnNLQUpKW1NMQtXdWUFF1NRYX1RdQEBS1V9aUNLR1d7z/c3d3lVBT01DS3d0XV9AQ1laTUFd31JCSUJ0c3BIcGRldnVKSUNWVlPTztre2cDOzc/w8vX08OXk5eTh+Pz////x9fDyycbDzd1SWVRdX0VAQEpzdEZDSHVBWVFT1dFWWVfWUkRfUEdYX1xQU1lTV9faz8jA31TUU0Z0T0ZDT1hWW1lZU1ddU93QXUxAQkl0cHx4eXlxd3ZxQF1U1N/HxdPRxMPBxcjMz/X55eX6+vr5//zz9/fx//H0y8ja0FbV09ReR1xEQ0BEQ0h0TUFaREZFWVxZXFJVU0daU1JQXlhaWlbX2NrA2cTF2lRfWURDTkZTVFJTUVXW3NHVXFlGREZPdHNwfXJ9d3ZzdktCXtDDxtnJy87Nyc/H08f19/D45fv7/uX7+f3x9/bOw/fI3FZV1lFHUtFQTFpZW09KQENNT0ZaVFpFWF5bWV1YXFxcUVhBREZfRF3Q3tHd2thURVFURXVGUltHR0XU1FZU0dxcXtdWSnd1S3l6fEp3cENHXF9XxMnF2c33wNzYwdxW0s/x9v365PL8+uT48PP88c7K9/Te1tzQWVHR291RUdLTQ0lAWndyQ9VSQkBRWU5G1dZFTUNDdXB3QURDR9PE397AzlVcVtBSR1bRUUNd0dBdXdXXUlNQ3FlxfHJyemV8dH1/cENBWlzby8Ta9PbI3NDbUljT8PL8+uHj5uTm5vnz9fLzycH3wlNFX1RER1HRXkdYUkZPTURIdUxc1VhHR9VXX1ze3VFeWFhLdU5ZWFlQ2cPM2sHE0VJaVlNYUdRaR1xXU1NYUNFWUVbVRnN5cnx6fEpHT3dDU15R3dvT29/ExtRQWVtbU9j39PLk5ubk5Ofk/cr08fX0zc/bVF1XVFbXwcfVUVFRRURCT3VPWlNaTk1FXFlHW9VST3dJdHJxT0VCXtDGx97Z2NZcXlfV2cXFxNTR0tReR1HT1VNdX09zf3h+e2VwTkxOQlNURFnT0Nbfx97R1dPVVt/By/nl5ePi4Obk5/n08/z3x8HG2FRaXFxZXVPX0F5aUVxAQkFGQUFbWE5IQkBERFvR1lNYWVtPdk9eWVvdwt3V0dxWWERfUdbcxMfZ1tVUXkFCU1ZYQV5FSnZwcHN2dERQU11U0VRDXdPQ11PQ31dd0ddW0ML38/764eHk+/r58fXy/cjCwMfSVd7E2NzSxcXf1FdXW01AW1hCSVhJfXNLT3dOQkdaWlhZQEpxdFpf1NzY2dVR19RSVtnFxcn39sPT0NBTWl/XWUhBQUpzcnN8fHN0QltQVldWXlpaUlBc1N7XXtTa2NnM9//5+ufn5/j88/zw8fb2yNnX09FR1d3R1dfT39ZWVF1GTEZXXUBPQEx3R0VEQEPX3t/d0VBfQ0tCRkZcVFReTEJBTk5FXdHc2cbHxd9WUFNZW1xTQ3R1Qk1OQk9NRFNUUFfc0VZSWVtW11RQWVJHWNbd0t7J8vj7+uX58vb38//+8vfPx8bax8faxMHOw9LY31ZYXFpKdU9bS3NxcXxzcHZKT0RRV9VXR0FMSE5bUNfW0t1XUNLT1t7YzfTPzMvA3lZQUVlbTUp0dnJ2d3d2dE9IR0dHUVJYU1BX1dvZVV1S19bT2Mj39PD45fr/8vbL9c/28/bK9cLF3t/T3tvZxcTa3tvdUUBHR0ZMSE9AdHdATUJZVlNRXlJSXlJJSndKSUNFWERGQUBNQFDU19zN9ffMwNjf1FfVV0ZJTk5CdU5DXltbWl9fXVNSX0dd19BaXVBYTU5HWF3U2szK9//4+PH09fTK9Pf28fb98/H09/b2zs7L98jG0NDVRE1OQnZ8cHR8fnZDR0dBR0JOQE9IcUpCTU1AWFNfX1LU3VTfxsLbwcvx9MbZ2dRGQUBCdXV1cXxwcUpLdEhBWkVbRFNWVtXa01dc1NFaXNrLysj19srw/fz0y/TI2trAz8LHz8PJwcTPz9vezPLwx9zS2ldaR0ZOSE1ETEVd1NDU0VVYTUpxcXN2dXV0cXBPW3V0RdDUV1TCz8HL98nGxcXeXV9cU1lWWF1YTFpSWkxDX1BDTFLRXVpY1VxMS0BIcUZQ393Tx87HyvX29/f28fTDzc/0yM/0/v3x8PLw9ff88MLH3tlfQ09LdHFwcHRLSUFSWVtNR3R8eXNyc3Z1dXBORV1bVMH09cjK8ffOycv0xtnd1l5NTlhcWklAW0J1d3V3dU1GTEZZU1NTVVRZQUFGWkRX38LNzcH08MjP9vL98PHwzdre29bd2cHB28TAzc719ffIwMDC3FZDQkdATURfU1BT0dNUWUV3cXNwcHx9cn54dkp1SF7T2sXNw8zJzcDMys7D2dzXUllVUVBX19dRVl9HTVhYR1pcUlxYXF1HdXZ0dnZ0RF1SUd3FzM3J9/Dy/P77+fXMz8jbxvX0ycv39/X2/fD29PbO21ZHSHV0SnRITU1dUFhPRkFKfX1xc3l5c3Z+fndAQkzXzff19/P/8M/098rG2N/fX0RbXkVMRVVRW1hBdHdNQURIWNXUXFbUUU92TkNHTFnRxN/Ty/DMz/f9/fbw//Hb2treUFbYwsffxM7Jzc/y+Pf28vHFXkFYQnZJXFBX09zbUF1dRHRxcHZ8ZXt4ZWR7fHR3T9fOx9/E8fHYxvHxwsHDz9xT1NDU0d3EwdxVUV1ERU9YW0NZUFhOTkx1fHlzdHB0Q1RUUtDMzsn2//v7/vz588vAy8nCwcrxy8j18/b0/fr+8crO0UV1d0pwcHRaWF9YXERPSkh1cHxydHJ+fnJ5eXJNXlDWyff0y/Tw9/XK9vTN3tDQV1hdVVdUUVFSW0lCdnZxd0hERV1TRkd3dXRLcU1MQV9U3Nzd2/X28v3++f/28fTPwMTBxd7dxcLDxcPI9/Xx8v788c/eV0ZHTkBFXVXU3NFdW0dDTHZxc3N4ZGZhZ2d6cnRJQ17X0NbTxNjCw8739fTN29nGxsTAz8LA3cTfUlxBSHR1S1tfWkt0dHRydkt0dUtBRFpDUtTRxsjw+OX6///98fb198vKys/098j38vL98/P8/fXFUV9FSHd0TE1JS0FDSktMS0p0cXdOcXp6ZXh5fXVHXNbZxcfAzcLAxcfAy8rN2NrR1NvF29vb2FVfWUdCdHFzcHVJWkVCQkFcUkdbVlxEWFBSX1Dd3t7by/P98fXz9s3AwMfY3cXE2sXPz8719/38/f/w9M7c3N9QRF3VU1pFUFFeU19aRkp3cX5mYWFmZGR/Sk1AX1XVVdTT39DbyPT29fTw9MPI9MrKyc3E09Dc1ER0dnByf3J2dnBwd09KdkxYS3F1Q1hBRlXBzfX8+/j//f/y8PDy/PbOy/D09vLw98n08fXH3sXdU0dFW09zcUp1d0paWU5MXVJcWk11cnh6eH1xd0dWVVTZwNvR1NLc2djBwMbAzs7NxdrH39TV0tBUV1ZZSHROSnZxdENGR0FeU1xBR1xHSU1SUllW2sDDwsv09c/Gwcj0w8zOwsHJ9/b29/Py/PLw9/H0yMDa09HRXFhaXFBeXlNZR0FGTktweHtmYWBkeH98cUJHW1pfXVxV2cXA9fH8+/7y8/LwyfXLz8bAzsbdV0F1dnNyf3F2c3JxSnVIdXV2dnd1TUdS1d/O9Pfw8/L09vTw/PLx9/L//P/88/H19MnKycXGw8DdVFRQR0RHREVERUFAR1tAQ0BJcXZxfHx9cXZ1QkZEUFNQU9VV1dPX0N3D9Pb19MnBxsPH2Njd1tPT1VdcRExOTnVJTk5IdUtCQE11T0xKS0xcUVXWwsjMxs70zsHNy/b39fb9/PHy8vH0yvHx9fX39srMydrQ1tJXU1RQU11FT050c3x+fntlZWV7enhydndxTkJaRUFW2dLYzPTOyfLy/PL88PLwyMvz9MPbxdNaRlxYdnZ2Sn18cn14eH54f395c0pzdF/Fx9vI8vf08PL98PL/+/39/vrl+fHw/cjJy8vax8/P3NDQ0ddQXlxVXltGWkh3dEJ3eX5zfWV4fHBzd3d1TEFDXFdfR9TN3tDey8Pay/L0zvfw9cnIzc3H2FBX01VeVFdEQkVNcXJwcX99cnNycnB0SnRMX9HUVNvx9c/08Pb28PLx9vLy+fr+9vn58vby/PTGyMrd1sHH1FdQ1FlYQXR2SXZ8cn9lZHtkZGV8fX9zSnR3TVpdRVDFzMPAwPfz8Mry//Hx8Pz29PTJ3NJRX15cW09CQEJ0dHB+eXZ9eH5yfmV+dnZKWVDV0cbP9vL88P/6+fP9/vHw//r98vn4/fLz9vf0z97Y2dRR1VNYW1xASkpJSUlYQEpxdnJ5eX94fHB9c05BSElFWERW2cTT0trHz/f09fDz8PX8/vTBzMRTVtdQWVpFQE1bQEt0S3FzdnRxcnJ+enl0d3VZ1lJUxMr3yvH9/v3z8/789Mr8/vz/5eXy8P3wz87A3NfWWUdZXk1PRk90T1xCSEBGd3J2cXt7c3N+cE91SE1MSkRV1dDM9MLH9/TO9/3+/fPw8Pb0wNLf015FU1tDTk9KSkxGSUlNd3B1SHB8fn94fXdIR9HZ19v09/Xx//z2/fj//Pnz9/L5/v/6+vL08PTDwcTVU1FeQ01bQndIXkFDUlBERE12fn9/ZWV4e2R8cXFzd3dKQVDT3cHOy/Tz8PH++/z9+fry8PHB1dPZUFDXXUFNQkxLQENwcHRyeXB3e2Flcnhld09OX9Dcx/b09/H8/PL45Pj8+Pv4+uTn5OXl/ff3ydnb11lfXk53QkZLdkJaTExbRUx1dnN9c397fn15eXRBdnFBW0ZQzMrNy/H09fDw8fHz8fbz/fTCxdFZVtZRRV5eQ09FXEdNSHR2dXJ9cXF7enxzfXNORV/U2cfI9/bx//zz8vj68vL48vf85fv++/zKwMzH0N7WXF9fR0BeVERJX1dHTV9ad3B0cH95emdleHt+S0J3SllXXNLPzsLJ9vT19/f28v3z8v72x8HHV1/W3F1b1NVYWlxBTkh2fXNxeXp8c2RneX5lfktGQlfDw8r8+/765Pr75Of4/Pr7/fvn5P/y9sHR0FNGRVlBRVdXW1peQ0tEXEJOR0J2dnRwf3t7e3x2cXZFUkRf2svHxsv2zvX3ycPCxsD28/fL9M/dVddfRllXUl3U1lhNQ093dEh2dnV2fXJxeXtydnBwQ15Q3Mz08f/6+fvk5P77+/HO9/H08P7998vA1lNTREZcVNfSxN9dXlFWWFfXREhDSXN/fmVmZHplfndwcUdUUNXByMfF9PbOz83Z0dvCw/Xy9sj3ytBV29xQ1Njf1NZQT3V2cHN2dHJ8cHJ6en55ZX12c3Rf1dfC8P3+5eTn4OPn5eT49Pf+/PT3/PbC2NZAT0FMTlxVXVDRUEJCX0ZLRF5Od091fXxyfHl8cXBLWVlY18fCwvHz9fXwytzS1l1c1NLfw8jAxsfXW1DWUF7U2dBQUVFaQUZLdUJCdXRId39xSXFySEJJRFXQ0sb09/b65+Xk5f/29Mja2sjLw/T8ztHS0F9aUdfU09nexMPcVdfdUEFFUk1ycnN6ZHh4e3xwcHRER0NR2d/H8fP09fTFVNHZ1VHZzc/K9snYx9pXVcfSXNXYUEBdWXdwSHR8dktyf3Nwf310cX1IWUxO1cfZwvz65ODt5ufg5Pz9/fTJ9PbNxMVVQU1ASUpFXUFA1d/R0tZdVtPVWFzVRnRIT3Z2Tk91SkBGRFJUUtTPysn098Pf29xaRFFZR1Tb0tDE3lZQ19dd1dFWVdzQUlBVWElFU0x1RFpJTkNKdU9PcXZMS3Va1dfb9vn45ebk5eX68c/1y8zMztvQ0VBAQF9FQVjX1NDMzsTEwNvT3dFYQFpGdHd3fHlycn59dEx3SllQ1cTNwc3OzcXH2tBQ1t/T28zNwMfHxt7Y2FRR19FV1VZbREZETHVOSnRKSXVKdXR3d3V0d0hCRlHbyPH+5ebh4ODk5fvz9vT1z8TF1l1HQUl2SnV0QVfX1tHe2NPf39VRUFJYX19ATk5PcXFCR0BGW11U0djFx8bGxMXZ0FNfXF1fVtPd0tBUVNHXUVlTUdXXVdHW1VFW1VBQU1BXUltbRUNOSnFwdnZxdUFFUNjM9/zl5OX6+/7x9/T1y8LG29LWU0VYWkNAUdPcxMHCz8/MxN3R1FNbXF5AdHd3c319cHB2dkpYUlxX3drF2dzd09fU1tTc2MTPz87Cz8PF3tDRV9fdV1HVVl9eRUdDQERCTkZMd3d0cXBwcHN8dVtd18zK9/zk5ubm4eT4/vD08fTG3tzUWEdGSnN3Tk1aU1VW1tLc2djbVlJUXF5XUEFNRUNISUVHQF1WVdLY39DbxdZT1tFHRltbR1zS19bc09TX1lZT1VRW1d/e19na0VfR31Fd1VVQX1pOS3VzfHx8fnZEXFLXxs3I8f7//fz/9vT3ysj1z9rax9JXUFFeQVzX1tzaxsHY2cXa3tRZWlJGSExKcXx9cXBxTkBHXlbT2NzY2tDVVdfQ11BR1VRU3cPIxcTDxN3T0tFXUFNXV1VVXVJeQEFGQUJMQ0h0Skl0cHFwcUla1dvOyvXy+Pn55OT+/PLzyszLwN/Q0FdbW0FJSEpMQVZWU9fS3NfS2NBTXlJQUllbWk9LT01FWVLU39jawsPBxtrc1tRQXlhBTnVPRkVcV1VWU9HQ1VTVV1DV2drZxMPF0dVV19dXVlJZR0hITnRwc3ZLSUdU0tPYwcn09vDx9PX0ysPZ3tjc1NDS09fW111cVtXcxMLGxMnMxdjd1FJTUkZCQnVzcHd0TkdFWlPX1NbY2dVU19VTUFVQWVlBR1DX1NXexd7azMXU3N1fVtnY1tHe0VNSUFhYXENKSEtxc0pLcXZERVrS29LG9/H38/7y8P3y9ffxx9za3lZeVVVFRFxCS1pFTV7d0VHdx9ZX0tNeVtBQWltbTE1RVVPWxcXGyMPewM7bV1FXQUxaQXRJTUh1TUZGXdHQVNTdUV1WU13Sz8PbwsvBxcXfVdDeU0BHRkJMQUBLTl5cXFBV1tjAxNjFws3FwMDYwMbd1NbQ0NLd2NZXVFVRUlTcwM3NyMv1z9/c119ZWUJ3d0tOTUBbWlzVVFTVVdDU1VddX1XRUVFQU1HU1FHV2MPHxcLb3dRdWkdT1dXQ0t7d2MRUWFtFTXR3dndOQkxCXlHU0tnc2c31y83J9PT39cjLyc/Z0NNUV9HTVl5TXEdDSXVDXFxf18XDxsDA2d3f01VWU1tY19nV1MTA2dDc3t7YVV5eWUFPR0VCTkNEQ05DWllR1VBX0NFeWlxcVtnGwc31y8n29cTa2VFDQ1pDQkRbT01YRFpRVl1X2d1R1NrTVdDd0sXD3NDaxN/ayc7T1t1VUlldV9Pb3sTP9M/GztrVV1FYQ0FCTkNfWEBQV0RGXFdX11VcXlZXW1/WU13U0FZd3Nre2MXc197RR0FcWUZR2dnfxcfS3d5UXF5AcXNOTUpIX15bV1Zd18fY08bMxMXKyMbAw8Xbxt/W09rSVt3YV1hbTXF3TklOUdBX3sjOxsr3xt/Z0FJU09RR0trT0cXZUFTc1V1RUUdNRU91QkZ0dEJPS0VWUVTW1lRWVF9c19zW3czOyfXxysP1z9PX0FpIRERISEVbTk9ATUNQV15d1VVcUt7d1NvB39PBw8bNw9jbwMfWV1BbRVJRVN7a29jHz8DAzdrVU1dZRFxbQEdRX01ZUVlbV1dfV9RTWFFTW17UUUZf1FRW3dvd3sXdU1BWWFtRVVfT2dzcxdvR1tNXRkdeRE9NRkFFWEdaX15dVdzc0d3ExcTNzMPAxN7Q39nT0dLX1NLTUF5ZR01CX1lbVNDR0MTMxsXa2NbT2NPX0NTV1tzT1dfdVV5WVl5EWltZX1lbQE1NdUlHQUBbVtXU1dbX1NzS09jZ0t3Gw8PPycPZxNlWUVFHSEJaTEhDREJMWV5aXV9EWdLZ3sDK2FHcxtPW2tnX0t7c38XfUlfZ3NHc3FVX3d/Sxc3cU9PZUVDXUVtFWlpfVFJBUdxVUtTVWFpSVFBV0F9AXFJGW1VSWlbZ09Te2FfSzN9V3dxRXNDfVlXY1FvU011FXkFLTFlBSFhfT1vXVl9V0NbeyPXJ9/bF1MbB1lTXUVtR01VX09VHU9hUWlfQX13f2dXcwtZT2sVXVcXcUtXb31XZxdfSx9RZV9VFW9DXR0VVRXRARkpMREBHVN3VV9vH3dvM31fd01xT3t5Q0szS0c/DUF1cQ0JFWkt1XF1ORFdEQl7VVNDL98DD9cfdwdheWVRQXtTdVVTHwtzYxtnR0dddUd7cV9XSVNXd1l1d1lFe1t1X18bG0dLe11BRVltX2VFGWlNFQl5SQUJRU1tW1lDUwsze3MfeUFBQRlnX1FJUxMfY2tvVWF5ETkJATERcWU1HUVJd0drAyvP2zc71w9vf1VtFX0dBXlBSUdna1NzD3FJQ11BQ0dZT1MTcVNLT1t/c3dDZzsHfxNvX1NbVXF1QU1ZRXUZaX09MRUdERUVDRl1V19HZ2dDc3NZXV1RW1d/f3M/IxtjExNRRXE1ITk1MTUBMTENHXlzSwcPPzcnNwMLH3dfUUlhaRkVW1dXf3tjH3NFUUtTW1NVQ1t3Q0NzQ0d/R3d3V0Nvf1tTR1lddU1JT19ZVVFZXV1xfXVhfUVtaWEVaXNXR1dPZ0VfVV11WVVdR1dzY3sXY2dnd1VlaRUNCRFpAQEVFR1tS1MfOzMDOycPDwdrc0dReQURER1hSUFBV1tRQVlRQ0NnR0dja39nHwNrbxNHV3d/S0t3UV1TUVltW1VFV11ZZX11bWlJTWVhSRENbR0RfUlRX1N3W0cXe0dPc0NTc29jYwNnW0tFYRVhbRkRZRk9AQE9DUldX38Xf08XAxcXMxNPc01BeU1NZX1JdXFZVXFbQ3dfR2d3Q2cXe29rT1tDS1NTf3dbT0VBTUF1bU9HW1dDTU1BUUF1cUF1bUlNEQ0RBQFhTU1BU0dTQxNvT39zX0N3d3dBVUl5TUFleUF1T1VFfW0VbQ1tU1dbc39Dd2MXHx8Xc0NzVW1lfRURbWFlZXVBTU9TW1tzY2drDwMHH2t3T393X3NrT1tPWVlBXVFdX1FBcU15fUlZRXVZRUlxdWUBCTUhCXVFQ0d/excbDwcHE2dnaxNzQ111ZWFNSWl5eRVpeXkVaWERbXFJT1dRWV9TS2cbCwcfb39bUVFNeWlldUVdXVNXW0N3bxd7Y29LQ3Nrf3NnS0NLS0NDWVFdQXF9RVVdSXVFXVdfW1dXR3dbRVV5EQ0xPRl5cUVdWVdzHx8fDxNjY39PUVV1FRlpFWF5fX1xU19VVVFxbUVdSVtPQVNHc0t7Dw9jZ3NFXXV9GRkVbWkVTUVNRVFXW2Njcx8Tf28HG2tvF29/f39PbwdLUVVRcWF5bQENYRVvVVVfQ29xU19BQRkFNdUZTU9TS3t3Eyc7FwsvE2MbZ0NZUXkJARkxPWFtBUlVdWV5eR0VcR0JW11xR0NLewc3Nx8fY3d/cVlHQ1VxcVlRX1NNRXddXXtXSV1TT01XU2NNU38Xd3MHfV1ZUVl1WVV5YV1BcVd3c2cPC297Z11lbWkxJQUVf1dfU3MHA3tvDxNLZ2dbVUUVNTkxJT1/UUlHd1FPU1lJdVFFaXNLVXdPd193Bx8TE29NU1FReXFRfRFxWXllR1VNW39dU39JU0dzX1tvH2NnAwNrBx9DV1lRbWlFdQVlRRERX1VbdwdvfxttRXlFFTVxXU1XZ3NbewMfZwsne3MTRXlJTR0lCQU9AXEVHVlVeXdBRW19RWFpRVF9R3NDSzvTOw83B3NDQUFLQ11heVFlDWlJYXtHcV9TXWkZWVlPV39jd2Mba3sbH19HZ11ZUVFlFU1FEXtHU0MLPx8PH3NVSXFpbVNVcX1ZTUdfY28XPwtPX01hGXVxERVxdWFhaRlpXUVlS0ddfXVdcWFJRU1ffxcD39MbEx9nVU1BQXVFcQUNCTEJEUlHX2MTUWFJcXFbX0d7Hx9nZxMbExsHd1t3Z0VJfWUVbXkVF197T0tva3tzdV1xdUVBSUFhFUNPQ0s31zsLD3FBV1F1fU1JFW1tPdExFQkBcU15WVVlGXVFbXNfWVMf3ycPLyMTF29RSVdNdWlJbTEVWWFjU3VZS11xMWFRZWNPZ0dTd1VfEycXayMPT2NhQW1bVW0XVVF/extHU28Lf3drVWFTRW0RTXUZT0NHez/XS1drdUdHSXVhV1UVAQUp3QVhNRdTVX15cRUZTVVhS3tPRxM/a28vM0tLe1V/VVVpbVVdHWVFfX1VUWlvUUVpcVllZ09JRV9PW18fKz831zt3T0lZTVFRdUNzTUFTUVtfGxdLT3FRaXFBYX9ZRRVDQ0tzEx9HXx9vV0NNWVlddQUZfR0pMXlpe1VBFRF1TX1LWVVfe01TW39rHxdnQ19LRXVJXU1JVUVBWVlBZWFJTUNdQWl1VVFdUVFZV3d/TxMnD2sXZ11XR0VFW0NBV19VeXlXT1NDa3tbQ0VNQ0NBQUdbW0dPc0t3F2tPQ0tdQVVVEQ0VHRkVHTENdWU1GWFpGXlNS19nT19bR1dbDwNzHz9vW3trR0tvWXlfYVFpdW01HU11BWl1EWlBQW1LQVFbdx8XEzs/c2MLE3tnH2sXD3NTS0ldR19RQ1ddcRVlSWF1WX1lX0tVW097S3sXTV9Lb1lfQVFxR1FNZVNReWlhaQERcRUNf11FdV15BW1dWU9De3NPe1lbd2NZW0d3R3NjQVlXWVFFWUF5dVV1bV9VRVdbX0NrF0dfc3VfQ2dbU2MXd0NDUUdTfVVfZ3VbU3dZX0NlUU9Le1t3Z1tfexdJX1tdfUFRZRVhEQ0dYWV9WUEFCRUVEWVhYUFdVU1DWUFpW1tTdxNvc3d7d38PbVdDa39HS3NRdXl9HQVtaQ0dYWVLV1FbX3tncxMXe28bE28TGxd7f39HW0NbV0dPT0tFXX1ZXW0VQVlJTVlVV0tPR3d3T1dTQ1VFXVdRWUVJSV1BfX1FWX11WU1NfWFhZW1pYXllERFpcUlFQUNTW093T28Tb2trFwcfb39LUVFNHRVpbXVLV1tTd2Nnc3dPe29jd3NnY0FFUVFDV1FfV3N7d3NjS1tLS1ldUV9fS1lfX3t7X0Njd1dRVX15XV11TUlpbX0ZPQURFWFfUXVHXXUFEXlpYUlJYUtPUUNfUUlTc3d3aw9rfxsfcxc7F1NfRU1tHTXVIRERf1NDV09xUVN7ExcbMw8TAxtdTVFRdVtbWVdzE39Dc3dHc3FZcVFReW1BQUlfR0NPe3tVQUFxS1N3T1tPQVl9FQUFcUlzV3ddWUFlDQUVaRVpbWllcWEdeUF1SVNVUVdLR19zExcTNw8XGxtJQXFxYWF1dXdbS1dXUU1DR3tvY2MfZ0FRfXFdWU9Tc3NLc29vfxMHc2sTT3NjXXFLX0NbR3t/Ywd1XVFJaWVJXX1lRX05KS3VMWlpZU9VRW0RFQVhSXFNVVFBRV1Jd1NzXV93d19bWVlHX2d7axtvbwdtVX1JbQkFfXFlU11JfV1XU0tje3sbB3NPUV9Tf39Df2t7W1tzS0dnZ0tLd1lRQXUFFVNVW0N7fxcHZ0N3c1VDU1lbV1lNbW1lZXFBdXFbVWUNAQE1BXl5eUlFaR15YWFfW1VXQ3dZWVlBQ19PT2cfBwcHG2NDT0VNZXl9YXV9EWFFTX1fWVNTQV15eXVNU3N/f3sfb0N3ExtrHwMHGzMPd0NFX1Nzc0N/F2dzFxN/T01FfXVNdW0VATUFYW1tZWVpZXkRNRFlaWlPXV1XXVlDU0dHS3tzc2NvRUlxSXFJU1dPe3tdX0dFWVNVTW19cWkZYWV1V0FRR1tPW1NVWUNXS3djDzcfa2t7d2tvR1NLY2dne1F1SU1NX0dDS2dzX0MXG297S0NDQ1ldX11RW1NRQWVxfQUBBR1hSXVlcVFRbW11fWVNWUlXQ3NPR0VBf1dDV1N/e0t3S0dHf3FRX0ddVVFBZWllTXF5SXlhfWUBDXlJR1t/F2sLB3tvF29jb2Nzd38Tb397f3d/d1t3F2t3S393Q2d/X0dzXUlJdXF1V1F1dXEVAQEFJSEVTXdfY01TUV15T09NQUNbR0N7Z0VVXVlBW09RV0VVfXlJQUVZRU1fT1lBXUVxdVtVXXV1ZRUVbWFPc39Pay8vAwMbb2MPa1tPRVV9TVV9ZVdBWVN/S19LS19Xf2dbcx9rZ2tjR0d/Y3dLf1lFQXkxJR0ZDRFdUV9BUXkZGQURSXUZGUlBYXdRVUlZUVdDE29fS2dbX29jVV9LS1t7Y0dfc1F5TUVlOTk9xdkFZXtHH2sXMzd/fwMXX3drRVFVQW1lWV1bd2tPfwsHc3MXZ3d7Z1tHF3dTS0FNS1tFXVNZSREdHT0JSU13Wx9rW3dxQWF9HTEFETUxZWUBY1NVdUNVX1dDTVVTQ0VXT01RU0t3W3Mba0t/cVlZWWk9CRkNAX9fR3s3OwsDF0tPS1VxdVF1GQERCRlNX19/a2NnGwdvYwsDb28bBx8PG29jE39HS3NVRVVNbR0VaQEReXlLW115FR01KdXV2dkpIdU1bWFDT3t/f28Tf39re3cXE3d3Z2d/bx9jZxN9UVdZTW0ZPdHZ1Tk9HVdLdwcLY3dzdVFfVUVxWUVtfVVdX0sXExcfDxMXCwsfBwNnZx8Tf3NvSUdTWU1fS1VBWUV9FWV5FWNXUVdDXXEZDTHdzd3ZwdU9LQ1JSXNXc0FXS3FXU2N/cxMDb2sPD39jDxNPd3FTV0VFaW19DS0ZFQV/c29nExtzQ0FFHWVFZR15SWV3X09HFz8HFzcPFx8rMx8zLwsHIwdPbxVVQ1tDV19zWUFVVWUZYWkZbV1BfU1NBSU93cnZ1cXFPQUNZVFdR0NzW0NjY39jF2dvMysnDw8Xd2cXS1dHWVlFWXkdGQ0tLR15R0t3W1tzf1lFcWEZaXF9S1NbX097Ex8n1wsHPyMnKyMHDzszGxdjS1VdWUNXR0tLW11dRVlNYRFteX11dXFFRXkBPSXR1d3Z1SExEX11cUNVWU1dUVdDd3d/Ew8jOx9rc09PW1tbS09bUVlNQU1lEW1pFVtTV0Nnf0NVVUlleRUBFX1FX0N/c2MDNwcHOzMLOyczO98jHx8XQ0N3RVdfT1tHb3tbR39RfUl1aRkZBQkVfQUlDQXV0T0p2dUlOQ1xcWlDUXlhU0NfQ2NvEyPXMwM/N3NjE3NPc39XV3dRSUFREQllbQlhWUlbf2VdT1V1GRFlFWtXVVtLE2dPaz9rFyvXJ9/HKzvbO3NzY1F9R1VBV3NHX2MXQVNHVWkRYQU5GW0BBX0RITUZLd0NHSkJZWkVSUEZGXlhGU9dRVNjH3sXIz8fBzMTawtrW3dnVV9vG3dPdV0VaWkJaV1BT1t7Q1dVWW1pZQUdSVlxX2dzX09vY3MbBx870y8/IzN7Zxt/X0tNTU9bW0dvG2N/e0V1bRE9LQEZMQkRDSElJdHVAQHVPWkdGXl5HRFlaWlbQ19PGxtnBy87Mzs7CzvXB3dLTVVTd3dHW119HWlpCR1BdW1HWVlJXXUdZUl5bVlRSVN/Q1t3e2tjBzMn19/XPzMzE2tvd1dXVUl9dUVbQ0tfW0FRZW0RBQFpYWkRZWk1MTUNDRFlFRlteX1lZQEZEQ0NFXF1W09jZxcbDzcHGwcHa0tDWVFXR2d/f2d/UUF1QUFHV1dDR1tVVVlJQVl1ZWFxZWlHUVVfQ3N/f3NvHzMHBws7AxMPMxN7S1lNeXV1R1tLQ3N3XUFxGTUdEQ01FRE1MQEBARkBDTU1PSUBEQU9BXkRaUddX1tvZ2cbMwszPzMLMwtrT0NRTVtLe0dHc01BQV9VX1VfV11VSUlVdWVBVXV5WV15cVNdU1NjFxMbNwMj0z8PKzN3fxttV0d7WXVBRXFxUVFRXU1tHXlpDRFJbQFhSRkBZXFtYUV9GQ0JMQUBMTkdZR1pU11fTxcDYwc3DxsTH2dve11XUVlPV29/S2dtVU1TWVVTQ0NHU0NTQ01RQVVZbW1fVXVHS0tfd29jf2djExsfDws7Y3cXB2dLe2tZcVtRUU1FQUVxYR1pEQ0xEW0FaUlFeUFVVX1leREh0dXVKdUhGWVpaUtPW1N7AxdjGwMbFxsHCxNnT0tBU1dzb3tnHxdfV1tdcU9TR1dXU1NPR11TVXlpcVlJdUNbRV9Df3NPex83AwszJwNzSxcDf28bE09VXV1xbWkVBSUpPQ0lOTUdFXlPVVl3X01RfXF9YTU9NQ09MQVlbQV/W09Tc2sHe3djF39/YxcXS0t7cV1fTxNvc2sXR1dVV1FTT2MXb2drA2NbW1lJFXVdWXFHU1VJQVNTU1dTQ2Nnf2MTe0d/D29zfxdrS19HQV1JSUlpMTEZNdU5fVFFU3sXXVdbVWkNGRUJ1dUBCdHVPREFbV9bV0NjF2NDdxsbbxMPMxtvFwNjR38TF09De29RSUNRVUdXH2dDYwN5SU9VVRERTVVxeVtZUUNDExdPSx8LS1sXB3N7Bw9jYwcLa09PS0VNbWURIdEtLd3NLW1tZVdjb3tJVV1FeW1pYTUlDQHV3TVtbWVXW0NPZ3N3f3Nza3tHT2sfT1t7H0tLc3tTR1NzTVlbT293QwvTA2cTBVlhR0FNAWdVRREZf1FNc0cfc1NLH1lpW2tvV2M/G3cXPwd3awcfSUVJTXkxJQk9KSkZcXdTbwNtVU1lfRUJOQUJ3cXV0cnBGWUBG1d7VU9Ha3t3B9cjY387J0NbDyN7R28bW1djF1VLX3dFW0drF3t/XVF9bXl9eWV9eWkFBR1zX3N/bzMDc19/e1tPIy8fb9fXb0cfO39TS31NBR1NAcXdDQnd1WFBbU9zSWkJeUUZCUldHSEhOSHRMW1tbUNTVV1TU193EwsTHwsfd0NvH3trC2VfV2t5XUdLSVlbazcTew87cUNHb1FlQ0FdaWFNHdExTUVhT3d5TX1TT1NbByMLazfTN2dja2sTa3N3f01VQU19GRllcWURc1lZZWFJZQE9ERnV0QnR4f0tOdkpSUEFEVNdSXdjOx9/P8PXHxM/N3d7Mw9PRxNhVVdLQVVXU1tbT0NVUXVxX1NfU11FcXVtHW1JQWV/W0NfTxN/X2MvJw8vw9czK9czb38HFUV/U0VtORF5AS17XX0JeV1lJRlJdWV5SXFlERkZPSkNaREBEX15bXlJdUdHf3NjZ39jF3lRV2trX0drfVVfQ01Bd08bb1tLDxtVV2tvR08ba1FDT01lHXFBSWVtfWkFCRFhFXNLGx8bI9PT09c7CwsLHx8fb09Lc1V1W0dVTVtDXXkVfWEFDWF1AS09Bd3xzSnV0T1tEQVteX15fV9zbxMLJysrKysvMyMvPwMHY3NHQ1V1X1VBS1VVTXllaREVQ19fX1dLRUllRV1BS1dVSX1ZRWFhR1tLDyPXK9fTLyMjLycDY2NzTVlJcQUJEUl5eVNFQX11QXF9QUF9eXVxcR0NDRlpeU1BcW1lHQkNZUlbU0t/c2dzS09LR3NrGxMXE2dFVVVXQ11XU393X0N7SV9HY2tLYw8TWVlZSXl9WUllEWkdMdEpCT0BT3NvGzsvDw8/LysrLzMDH29HX1tVWVNfW09DRV1FdXVLVUkVaXkRIS3V2cHdLTk9EW1pGTE1EWVnQ2MXFzcjAxcz0zsn09/XLzcbS1NZV1FdTXVFcWkVeXl9SV1dV3dzS1dVcXVFUXVNUUFpGWkZBWFdV38HK9PTKxsPOy83IyMHd01FFRF5ETUdbWV9WUF1fVldRVF1fUVReR0BDTkJBQENYVl5aRVpGRV9TXdfd2d3R1NXYxdvbw8LAxsHY0tjY09fQ0dbU1FBX0N/e2drZ2sDD3tbU1FBQUl9fWUFKd3Zxd05DR1Lc28TGwMPMyMjK9Pb1w8XdVFdUUF5dVdfR0dbU1FZTV1FZRFxeQEpJdXZzcHF3dUtOQkBHX1NWVNPa297bxcfAzsrJysr1zsjB29ra09TR0NVQUV1YWF1SV1BU0d/f19Hc3VFV3dNU1NRSQE1GQkBDW1LX0N7HzcfAyMjCzcrJx97fVl1YRU9CW0RaXVRdUtXWUFfU0NfUVVNdXltBQEh1SkJLd09YRE9bXVxaUVVVVtHZxMbax83M28TDw9nYxdjR2MHb0tbRV1VU1VTc2NjawsbS0t3XXVBQX0ZBT0lOSndIQE1GU9PR38L0yMv28fXI9crP2Njd0FBZWVFYRFJXUlhQUV9bUlJZWltGQENCQ0h1d3dxdHRIQ1tbU1RX1tPT0MTGwMP0y8LO9cvDzcLD2d3e2dbR1tRQX19eXF5Q1t7T2MDC38XA2tLX11BYRFlaQU1GRkFGXlHV0dvIysrL9MzF29rS0dVXXFheR0dHWEVeU1ZR1dHf3dHT0NFUV1JTWkdGTXdxdHV0d05CQExFWVtEXNTR0dzAw8bEycvMxs/OwcTMy8Db2cfZ3NHW11VU0dLc3tjGxNnQ39zWXVtATUp1T09LdUNEWkdS0dzZz/Dy8fbx9M3Hw8HcVlTRVlhcUVNZWVdQXlpTV1NaWFNdWkRaRUFJTEt3cXRLTE9MRF5YR19WVl1V2MfawvX1zcL19MzEw83B38XG2dTU39NTX1TXUFLd2tzR28bY0t/F3lZYXllASE1AQ0xBRVtZUtbS2cfI9/TJw8zA3dTT0ldSUVRQXlfR11XU0tBVVNzf0VZV1FJEXlFbTExBT3FxS0txcUlATEpPRkZBWFTQ3NjDycjOzsnPzczLz8/OzsLF2Nva3VTU0tJU1dvG2NPY2tNQVNFRREBaRU51SU91dENYRERR39/ezPHwysr3yMXS29rc0NPf09dU09/WVNXR1FFXV1NfXlJcWEZFRE5ISEl1cXdLSHd0RFlET1tTX15Xxs3Nz/fxzs3IycHbw83Bxdva0NfQ09RdUFdQXVPR39zQ0t7Q11XR01BcXFNYQUJBRUNNR1lTUlTc29vB9cvCxdjY1tHS1tRU11RQUlTd0dbQ3tvR0N3f11ZVV1FfXVNZRUJJT0lKdHR2dUt0dHRIT0hAXtfd28PPysPBw8zLwsPI98vBzMLC2t7Y3NzX1dHQ3d3f0NHSV1JQVVdYWFJXWExDQ0NKdU9CRkRQ0sXGwMrLysvDx9vB293f28fRVNXX1lBR1NDRUVZXVF1aWFlbQUNHRVpPT01DQElOTk9NTk1DRUVGW1PT3d3FyffPwM/Iz9rHwsPY0tjZ2dDR09fRVFJSUdZU1NHc3tXV1NzSVdDf2tBQUFNdQU1GW1hEX1TS3dDbxMTe0dPS3dTV093c1VZdXVdSUdXZ2dfQ2drRUNXUVltFX1xcRFteW0FLSEp1cXF0dU9OSUJAWltS1tnCwcDP9fTK9fT29MPDzcnB2cfG29RV0t3RV9bQ09dRUF1SXFtcUFRQW1pFW05JQ0ZFQVpQ09zdwMv1zcfBw8Lb2MbAwdLT0dRWWVHV1VZW19TVVl1eRVpGQ0BEW0ZGWFxbTUJDQE93SkNaQk9FWVxYUN/GwMDLysrL9ff1yszExdnb3tPQ09/UVdfT3VdTVdzQUNXT0FBT0NDWUVNWUlxaWFhYRUBaXVfW0NLYx8TZ3N7F3NLYxMfT19bXVlhT0dLUVNPe39fV11RdWlhfWVleU19eXV9bQEBNd3Z1TEp0SEZZRERR397W3cL1ysrw8vbKycvCxd7Y297Z3tnZxcXT1VXd31dTUNRQW15RVFlGWF5BS0NZWkNDX1BTUNfc3sTF29rGzcDAwMPMxtre3tJTVtTXUV5TVVRYRV1QXEBDWVlZRVlfWFpaXkVBTE5OSkhMQkFYU15ZVtvA3d/N9MrO9PD3z8HAxtzV1d/T11XT397c0dVV1tRXVtfT11BU0dJUXV1dWk9CWl5aRFLU1V1cVdHWVdbZxcbBwMfExsXf0dPXUl5RVVdQ1dbVXlhT1VdbWVZWUllfUFJeWFtGRk50dHRKdUtNW1pBWlzW39LfxM7Px8z28/TOyvfO2NzF2NPX3NvY39Ld09ZUVNXX0FVSU1fUUFhaXFlKdUdfREBfVFRcUtHe3dDdxMHGxcfCzMbaxdne111eU1dTUlBQV15ARl5eQVhV0FdfUNRVWUdaWkZOSk1GQklDQ0JDQUFEU1RU1tjCwMTDyPfJzM/Lztjf2sPF093Z2N3X0t/d19Hex9rS3d3R1VFSXFxeQ0lCW0ZDWl5XX1tX0tNWUNDa39LGzs/DwcLG2tzVUVTVVlBW1VReRFtfXFldVtZUXFJWVlhAR1tHSXRITU50S0BGQEJBWVFQV9LbxsDNy8r0y8nOycnG2sTNwd3T2djT1NTS2N3R39vb1FdUVVNbWF1SREFFRFpEQVpcU15fUNXRVdTQ2MXZxcLPw9nZ29rQVNfR11JSUVRRW1hZXV1ZUFXR1VNU1FVTX1lFQUlLSE5NTk9ARURPTUVcWF7V2MLCwMn09czNzMPE3NvGxtrY29jY3NDR39jQ1t/FxdPV1NZWWEVYXFpARlldWVhSVFdYW1JQUF5dVdDT0t7Hwdrf2dvb39LT0NdTXFLV1VJdV9RXUlXd3dRW1NVUUl5eRUBIS0xMSUpOQEVaQERbX15bXdDF2tjA9fTPzMjLwtvFwcHa39rE2t7f29nf1lXW093UV1TVV1hHWl5FQkdcV11c19FUX19SU1JYXFXd0tbex8Pa3N7Z2dPU1tDXXV9TVFFfUlfW11fU3NvQV9bQ1FlFWVhBTk1GRUdCQUdAQ0NGRV5bRF7V3NHR3sDPxsfNyM/Ex8PMxtvGzcLExMDG29PR0N3c0dbc3NZdWkRbRUBDW1BTXFDUVFlEWV9ET0dSVFFS1tnY3dLZ2Nje3d3d3NFV1NDT0dfW0tZWVNPSVVNX09VYQVhZWkFHWFlbRkdHRkFBWlleXl5TV9XX1NzEwsPDz/XKwMbCy8za28HG3t7E291VVdbXVVFX0NdRXFxfXl5YXFFX1V1TVNVRXVBWVlhbXVBcW1HT3NBV0d3QV1fR09HV19PS3dbV19TR19fR0NZW1NHWU1pcUlBZXlZXUkRER0FDQ0ZER0ZGRUVbXlzV3NvFx8PDwMXHy/TIws7IyMLbwcPF3NLZ09bVV9ZVUF1cXFxfWF5RVlxZXF9dX1pdV1BZRFldXF5R3Nvc0N7Y0tfU0tjf0dDZ3NBUVtTU1VZXV1JTWV1WUVNYX1NQXFxU1lFFRFleW0daX15FQkVZWVlS1t/F29rBxsTe2cfPzMXFwMbY0tnF29/U0N3WVVfU1VRTUdVUVFbV1tFVUlHUVVNeXVJcQE1GREVGWNXXVFNR0dfV193Hxd3d3t/TVFTR0tPT0dDRVVxdUFNRU1BUVFFQV9RVX0ReXkRPQ0dASXVJQ0RaX1Xc2tnZx8HAxMDOy8vNws3NwN7bwcfZ09/Z0FFS1dVTX1JQXV1bX1JQV11U1VdTXl5aREFCR15TU1PU3dBXV9Lc09PYxMTF3d/f0NVX0dHX1FXVUFlHRV9ZXl1RVNDXVtfQ09VXV1VRRUFGQE1OTkZYRVpR1tbX19/Z29vZx8bHxcXHx8XZ28HGwdvZ2t7QVNXR1FRX19DQV1fT09ZV1NRWXkRHTUNMSUFaW1heU1ZXUVBV0t7f2MPD2t7Z2sTd0Nnf3d3R19RRWVlcXFxYUlZRUVJU1tfQVFZWXEdOT0lJSE9BRVtHXFRV0dTZxcbAxc3PzMHHw8DDwMHE2NvS09PWVVJR1VRWUFZUVFZS1dDR1NfTVV1FWkVGRkBbXFNSUlVU1dXX3N7f0tnE29jQ0dDW19TW09BUUVdWXVlfXFxSU1HU1NbU097Z2dbS1lBZR1pEQUJPQEFBTUdeXlhZVd/e3tzb29vY3cTBxsfHwsbG2d7Z09FV1tbV1ldV3dbQ3NDd2NbX0lZTRkNBTU1ITkJBRkNZU1JQVNDZ2tnawMTa3tnb2N7R3NnT1lTX1ldTXFNSUV1dV1TUVlfWVVVRVVxcXEdETUFDSUZGQ0BHX11SUdPe3NvFxMPHxcfDzczG28Xf2dHQVdVVXlxWU1RSUdfWVdXf093S1tLVVlJcXV5EQ0ZERVhYUFBSVlbU097f0tnZ29LW3tPR1Nbc19VR1dVXVlxUVVVXVN/T39Ld2dPR1NVUUFNYW15aQUxMS0lITkRHRFlfVNDd09/b2NjYwcPBwM3OwMbF39jc3dFW0VXX1dHc0t/Q09/T0FfUVl9bR0RATkhIQklCQVhSUlRX0d7Y29zHxsbH28HH3NDQ3t/Q1NXSUVJdUdVcVlbV0FXW1dZV1VVdUV9fXlhdWF5AR0RBR0ZdV1dWUdbd3dPexsXa39nG2Mfa2sTf3tfR1FBRU9VXV9HX3N/Z0tLZ3tPU19FUVV1SXERBT0ZCQltFUFJWVFTT0NDT0Nzf0tHS3NDRVd3Q1NRX1NFUVFfcUNDE0sFX3t3R2NVXX1BcXFlGWVlEQkhCQk5NR11bX19V1NbQ18bawMXexMDMwMfMwcTY3NnQ11HV0NHc09/c3tzS293UUlxEUVNZW0FASXVISEBGRV1WVtXR3d/f097AxcTF2MXa2dPexdnQVNTVV1ZS19dVVFfW1ldWV9RWXFpFXkdbWlhcW0dNQURcXlnW0NbV1N7c09DZxd7f3dvE2t7Z2NzT11TXVlBQU9bX09bT393e097Z09ZWVldRU1BWXFhHQ0VERFtdVFdUVlfXVVVRVdfV11TR09PT19ze0NTU0NdUVdPY3NLS2MbY09Dc0FZQX1JcXFhbWUBDS0hBT0xBWVBcWVlQ1VdX1NnZ3dnYwMDBwMLNxdje2t7X0tDd2N7f0t/Z3tPW3NZTWUVeWkdERUVATUxGRkZeXVFWUVdX1tDS0d3b39jc28HEx8XAwMTZ1tPVUVdW1tdWUFbVVlJSUVZcXlheUlxZW1hYWkRbXVJQUFbXVFZRV9DW1tLZ293c3Nja39/e2N/Q11XXVldXVNDX1tHQ0tDT0d/Z0NZU0dZWUFDVU11fX1NYWVhbX1pZXl1SXl1eUFFR1NXS3tzc2MHH2N3c3tDW09rE2NvY2dLX0NTT0VRXU1FbREZCQU5MTk1GQ0NAWlhfXF1VUVTV0d/e2djHwcHNwczOwcLHwcHY39zf0tDWVNBVV1dSV1NdWFtbQUZDRVpFW1tdWVpaWl1YXFBX0dHS0tzb3tjexMDFxsXBx9re09JUVlBT1VFSU1BRU1BSVFFSUVlSXVhZRV9fXlhcVl9fXVBXUFRV1NRU0dTR3dHR0NDX1tbW09TX19HS0NLQ3N/d0NfQ09Dd3NjY3t3S01RUUFBRXVJeXlpHQUxAQkxCQlteXl5dVFRUV9fc3d7ZxcDGxsbAwcfGx8bE2tjd2NzQ0NDQVVdfXVJFQUJNTklOdUt1S0hNRURZWVxXV9XX3djZ2trGzMLAwczDwMHax8TE29PT11VWUVVUVlPV1VFTXlJSWEdBWFhbREZFREdGRV9eXFHR0tLc0tra29vZxMfb2dnFxdjc393R1lZQU1JQU1ZUVlZX1VZSU1BWUFNZWFBSWVpeXFhYWllZXVRX1NDW19fT19PX19zQ09bQ0d7V1NDT09fW0N3Q0NDY397awMTEw9jZ39xRXlNdXkREWkZCTE9CTEBHW1JQUVPVVdfU19/T3t7Yw8HHxcXHxtrYxcbb2d/d1tzZw8nFUN1fWVROQE1MQU53TkxbSHVMQUFSX17WUtNU2NxTxsDG2sbf3N3SwtDQ2sLc3NDf39dWVthW0N1T1d5XWVVQW0dDX9RFQF1YQlhAVd5RVsHBxcHazczc3sfazdvBzczZxtvSxdRRxNJRVFhWXlxf39ZSw9RXUVPRWl9eX0pWWnBccVt0RtZQVVxRXtzWVt1b1dhUVFHZV9VRVFVVVdjR1trfV9rFU9jHy9nE9crfxfTeVdXS19VcXUlBQ3REckJbXndBVkNHUtR308BF0cPbwApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYjljZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACis/Q0te5ebq/VxYYFpUavL+XVhbUFNcW2tv49zl2dra3OpdVFpgcHzVz+Xo5Ph758/ExMfR/l5NRlPr0MXBwMnjaVVLS2bazcjIyM3kbF5eXFFNaHZd69nX1XRYT0JFVn3MxczQ7khAPD1KWM/Aw8rL4VtLRVFaTVlpaextaunl+97e6eNq9fdPTVFLV3Dpz83Ryc99ZU1VZFJe4Nvd9Gvsa1vgysK+ytxcPzk6P1nPwLm8y+VZRkFFX8/MysTM6mFNUU9GVuHNx8vJwM5oV05PW2Da0dvQ2m9XS0lbbO/OyMfN4ON3TVJ94nxeVl1WSExX89nj2MzqX2BjXFRNWFpPVUtKU1Ve/WBXcO7uZFfu311dX1dZaODOy83O2upVQUnqzsfAv8XTaE1GSu7MwLy+wMPPa09MT1Jc2cvMwLy/xupVTkpKSk/m0up0X0xKTl7n39jX92JXSENNYt3N0dznbFNGRGHWzcvP72NKQUVGTGjfzM13Y11UUlJMV23q5Gxm6fhdVklQ9NjOx8vWcFFRSENW1sW9xc/aZkxCP0zuzLy7vr/C0/5WVWBm6djW393m2NfuaeXhc1FOcPLu3t597nJ5/HT+3d3d/1hkZ3jZz99vV1xUR0t+zMTL5PtdSD9CR1BZ4c7dcWNgWE9HSUxPUE5KS0pSX0xKUvLb5/7Y2fRfUUtLS2TLwby6urzJYFNe7sW8uLW4vsX8T1Jb2szb1tLw5+ni13JbbldKS05q5mJVXFlpel9salVYVElSZ9/Iz9fRcVNSSE1UXs3ByMvYbVo/OT9M6snKzt9XSkM/SGH31dVxXlVNUU9HS0hT6+3jy8zL3E9NUWHSzM3G0ep9VFFd+czCwL7GysnP6Wx15tjZ4OPX09Xq9N/e3uFmT0tKVWbq1NDKwcvlbGjte19YU17yamXu3d16T0Y/RV/t0M3hXkxBPDg+Vfjp7l9YXlFMR01aZXXe09LP1XNYUE1i38zJzNHO4P7zW3XW2N7k2cjR829PR0xW38XFw8nWbkxJZ9zOys/zZWdsfeTIvb7L22hbVExSeuXOxr+8x9LVdU5JR13f1c/mXFVHQEA9Rln48Hls+1JCPz4+P0li3+HtbnFMREJT59nRztxjWlBUVGrSy9vd4dLL0szM1/tmZ+X+3snFyNxkYGZd9/jj4Ojv7nF+8e9uW1tgbm1vfmxidOnPzt/c32ZTSl3Nxb67vsPL187R18zLyszQycLIzulQQD1GaN3OxMLWSzs2OTw/S1VPTEM9OjY6Q0lXev32ZFJJPjxBTXDi2dHS2V1MTVZm7+Lc+llaXG3j49nLztbl7ul5WFJKTX3Uzc7Oy811XFxy2Mi+vMPgYlVQU/zNvb3Ex8zMx8rZ4f7WzMnAvL7DzuDY4ujm53JqVnDh7u5oV1NOR0ZETl5bVU9DPkBIV2x+Yk5BPzw9R11hU0pMbefc3/16d1Rj+uzf3d5sUF7k9+jY19PQ1dloYfbVys3a28/gXlhu+nrnzsnIxs1lSUVGZs2/urm6vtLc42PzzMXAxsjE2XRyc9/YdXTl3ujm4O1LQEZMUldnV09HQkBDRVJkZFlMUltKQExOVVVcdFxRZXFiWklMX+Dp5uPcZFJZbtTFvsjfa3dx7ezh3N/g6tzPzuHc8FNFSF3r3cvExcjeX1JWVFxo5uXczMjMzczX8NvHw8C9vMLTbVxt3tnp6eDoc+rmdl1nWU1MTE9PUlFJQ0dMUFVOTltTQjg3P0VPdNjQ1O5lW11s59fN1vDa33VoZWP42s3L3/PpXUxEQU5sbenOzdVmT1NGQVJpfeLs2sfJy856+uXmxL28trjBzuHcys3LwczP0/nj3/vs1d3uWU5ma11wXlljU1ZjVU9QQz8+PlJiWW5eTk9OWm5VSk1KUFxd2c7gdmNeavjYz9Tb5GlhWEtd69jP1eX0ZFv3+WJw7nz7e+XY1nVPS1dXX9jT0MvIxcnrYlZVXXvczczN09zX49/N0ubQzdDb3/h7+u/Vz8rO3PJoT01WbO1+9+lpXHBXUV95et3xaWRbY1BISEZGatbNz+TxdE1JWFf20d3g3ldHSkxKTU1RVFzxflNEP0BLX9PJ3f/7V19ZREp0fuLV5Oji0MO/x87i6NXNx8fPz8nOxsTLyMfd39b2X2/nz83a1tzQ1fft4V753enYaUlPVEhQUktKXGzo8F5cXWFVUlJQP0lZV1pcUufqTF9XSlVqbNDYc1dPUE1Z39LRxdN0TEBBVWvdytLm59zd0OxZWPN8ftbO1eX2ZGtcVmHV1djeZ11u8NXIzc3Kx9Pc3Wpa59/h0dbSx8jZbE9PW97Fvb3LZFRSTV92Zt7P6ersUUpNUVxgWVVSW2BaYFNIVF1Sa2pg2vhQVUg/TWN89GhgX2PueGzfalt4ZFloVVFiXmD4X1Tq3dfP3mJpcN7Q0M74Zun858bJwr3I091t5MvMx9D3Ymvo0cvEx9TU/01ITU5n6dnPzNnn3e3kfVtVZOrNzNhiUFhWWPrseNffdFxNSlZdXVRPWFtfUUhFPzg6PT9ITU9TUUdFRUdMcdDLzd1dT09Q+tfb38rIztDV08rIxb7Dy8/Kyc7W083HwMO+vcXHyN3w5ubWzczNzuJgVFhWT09TXW7s29RxS0tUWnbs7djP2fZzWVVt2+BhVU1LTU5OVk1NU05LTk1SVUhERktEQElOSUhGPj5ESVBTS1Xw0MjJ2Ojn5dTMzdPLwcLIycnHwL6+v8HHxMDDys/QzcvJxsLHz9HlX1NSTU1UV2VmUklJUFFRXWbu287N3lJESU1QWWR739rf52tQVV9lYWb1c2ZjXlhSUVvs3+jpaVVMQ0JFQT1ASElGQT47Oz5ASUtMVm3/c2ZcX/fTxsHExb+6u7q4uLa2tbW0t7m5u8DHy8vIx8nO3VtLS1Zd7N7v+PtwZFJHSExQVVte++HY2ON0U1V67P7td2d88uzb7WJeVVFPT0xMSkpJR0ZGTm1tZmdSS0pISlJIREZCQkE+P0FES1JVVmBy4e7s7Gz33tXPzNXTycvOzMzEwr+7uLm8vcLAwL+9vru6vL7M6fzn5uHZ3NXX0c/uWlNWbt/V18/T3998eF9VXW1fWlxSTk1MS0VBQ0RLTEhEPjo5PkJHSkxOSkRBPj1BUF9yd2dq9+/+amJle9TMzdjk5N7m4NTT1tTV293q9e7Z3NjS0tLRysnN2N7d2dLKx8fGwb++wtDPycXKzc3NzcjBw8vV08vKzMvT1dve4H1TRUA+PkBFQz8+P0A+OTo+QUI/Pjs7PUNSXldgcnv6bVVOTFNr+u1wbvZ4dWtXVl/uz8vY5NvSzszJy8/QzsTAx9Dm7vdz9Pvq183L0HtaZWjdysjFys/O2vNlZOnZ1c3JzdHV0tDZ19bOxMPAxtDU3NzibFpNS05PUVVLSFJOVlVMUEtEQT08ODY5PD9FQ0ZJRUVGQ0ZJWfvs4GNaZldo7WZs8uTNy9PW2tXY2dLrdNzQycbO1NTW0MrIy9DMz87L1trS187DxMTCwL7F1WZObuHWxczd3fV65Hv20szHxsfJ29znaWpXTFJXVl9bST89QktaVEdIQjw+PDxARU9PTUlBREpHSUpBRVBSZGJTU0xMTE5SVHjVzMjN6Xrq3tHMzNDe1tXY0uvm1c7BvsfR19vc29nc1snGx8HO3tDOztPa3N3X3OHZ3ufTzc3L09jOzMXAx9dtd35p9nJWV1RPWlpQUVlkWEk/Ojw8Oz88Nzg6PUNHSUlKTEZHSkZX4+Ld6nf293T4/F5cdt7RztlsXVtWbufc3t/a6nhrZPzTysTH0s/Ly8bK0MvKxsXBwMjKys7X3+Xh0s7KzdngYGj22tDb0M7PytP3aHHo7PVsXUpIRUROSkpPU2VbS0lHSElJSElKTU9QXFBMVVtvbF5WTFhcVFdZVU5LTl1ZVVldfPdeUUxd7ObV2flpcOzRy9Da29LU4N3ZzsbJyszS0NLMwLy+ycfIy8zO086+vry7vcDMysnLzd3a2uDlWUhGUlFSWktFPDw9QEk/P0dMV0pPT1tmT0xBQkZMW2nmW1VXSVJNUFhs3ejsYVBHSF752O9q/FhmWE5SVnR13N9gV1NobuTf3M3PycnMx83Gx8fFy8rMysbAxMjFy8jKz8rTz87OzeJybNvHw8TJ0H1RUFJtZGJ7bV1COjc8S1JgYFZWTkxJTFBOUlZjWkxLTXJlW15RVk9PUmNwX/Hj2uVfV0/43drfaGlRTElNZFxnbu/jaFZO+tvc0+befF198s7P1s/Pzd7h69HHx8PLycnX2d3KxcfGyMTM2unZxcC+x8zUevl47en58nDwak5FQEVITUlMW1FPTFhiV1JMVlpMRUFGTlpPS05HR0pSZ3fh+21qVFFObNbNz3djVUlJUX7x9WZi+FtUTlrf29Tb4N3r6OLRzcrHy8nMzNDYycfCwsjIzcvMxcLKys7O1uRuYtXP0c/q+GJpaXDZ4uXldVlTTEBJVV/hdFpRTk9V7/1lZFRLSEhBS2NaX1ZGQD9BQlRhXWpbVFVYT1ve2dTYdF1dYFNdYlVv7O7x/VVNWV7bx8rN1OF06Nfl2tPX09Hdc9TKxr/Gz87Ky8a/xsXEztfb2OPPydHM3VhQUE9Z3dna0/NlX1ZISVlX7+JhYFhMRlBaVf71a25uV0xSTlhlTkxLSUZGSkdPYVxaVk5HWnD22XNjWE9LSmBbX2JTUU5OR1Bt4sjK09nX0tLDwsXEzdLe3/3vz8vFyMW/v77Ev7/Gw8fIztTmcd/YztDoaFRTTVRyeeb1fV9QSUFNX+LV2+NnX1NUY2JfYF1dV1dOUGJy/WFfVlRMREdISEhMTlVWTE1l9eX1ZFRIRkZPXVZVZmpfW1tb4czHwcfR4eB9+NbOz8/T4PNgT2Hd2s7Ev8XFycvFycvHwMLHxtTaztDS6F9JSk5MYPJ0Zu3c5+ZcWOnw8P7oYFJbUWN9/Ovi2V9XUEhTVGV7+WBJTENDSElNTWRhW1JGTVz+4uDmWl9YWmhWT0xXXU9NRk5bYOnj0+Xh2d3Ozs7MzcvX4m5k7OjPz8vMzsrOxsPDxsO/wcrU5dzg195tV0RLSlFabO/n2dPZ/Wzy08rM18/vZU9PWmVvW3VnT0RCQUdUaWF0WE1MTE5QaFZl9PpaT0tNYPhcYmhVWVluXHFbYO5wV01TV2zW2+blZV9f7/HMxM7N3ftfXnTgx8TMy9txY93RzsXMw8PM3OPX08bBzdN7VExRXVff3dveeFxW/uzXx87Y61JISF1v4drd325UTFtebOPn/15LR0lXWmPx9ntWRz4/QU149GxXSkVIXPDi3d/sXEpASlv20tXU6lJEQ1bkzcPExNLyYHHw5si/v8jX+mjn0si+vru7wtLn39vLyMzXaU1FSlhn4dre5FtQUF/62sjI1XdTTEtZ69naX09GQ0FDTmTWzulZSD89QlVn6fr3bE9GPkhZ6c/dblZSVVLr0MXG0Nrn6mVu5tnO2W1WTkxIX9rV1t3f7PL36NfOx8bWalhiYmzY0MrN1dLS2evdycjL7VRPTlFW3MrL1Ofk73zu5tDTz9RjVE9XXOrW3OxcXl9bXFnn193uTkpFREZNYWVgXFlSSkhOXF5VYlNLR0tceerl6HFgYG748+fp8u5eUU1PXOvP0uB2a3Ruc9nIxMbHzeFjX+TUycrJytTb2NXPycXI0N35X05TV+nT3eHs3Nrd2M/M1ubf5mFNVllnak1PTlBRUGFk9eNvYFVNRk1RVO9kU01LUUxXZurXZlpjWEtLX3LX2vr5YW3uz8rSy9bqaE9LS1lZe+FjWFJebv7Z1MXK4O9tYmDw3tbN1N/4+OXUzM7Ly9bf8fB86N7Vyc3hYm7i1tDNx8fS62tsW2Hu3NLiaE9JTFjr1srL12dHQUFGVFdiXU5CPURPYPTx8WZPS05aU19w8vBeT0dNaO7X2eHc5mlbY2D26W52X1ZLT/rbysXFx9Hr+NvU0MbFw8real7t2sjCyMvQ4WxgZWTp4ODrYlBKVffQyc3P235fXfz9393x+VVKSE1m59HV3fheWVJbZGtzWlZNRUFDTmTjfWVlYGtt6eDo5O7pZ09OUGfs0svM0OH/ZmRt9uR4ZVRIRENN/c7KzNXsZ1td9d/b3tfhW05OZPLVy8vL0tfNz83KyMrO1N7k6OHUy87kfv5lZ/fdzc3a7vVaTE1Ra9/X2dnoWVdfVVxiYVNNRDs8P0NU/mJYXVRPVlNv3ut9eWlPTVlf9Nff9/BbT23u4NLL1PZpT1BZVvrR0N7g3dzNzMzFw83b2fldcXbw08/b2dTh2s/SzczQ3/RmV2FdWe7Y+lxZVFp+6NTJze13Yk1IS1Xw2OTc2Olv9fVu+/xaU0g/P0FCQ1ZcUlldbOTa0svL19ze4uT1/vvg6mNlYFpo5eHs621cUE1NT09NXvd4Z2Ru5efu3M7P3/5wX1ZSVnzW19zPzM7Ny8XFys/W1M/T2d/g2d9uX2l67efb29zuYvvg63Fu8PB0Y2rl7fDj2N51Xk9MSUVFQ0RDTldLTlVceenu7OJwW2RkXU9RXWZtWl5wZWnu6HrwdFVcc3zp6OnZ09jd0M3KycnExsvZ5tj2WFhdcOtvZubg49DOzs/d29nX3uztb15WVVRYYVx66u/e2u9q7/hqc3Pz7Hnh5vxu997j8GJcV09LR0xRTVVfZWFaX+7yY23x7enh3uD9al1XVlVm+fDk5+97+lxWYmJcWl1eWWLt5N/l2tLQy83V8eniXlhXbuvs9P7e29bQ0c3S09jRy9Xb1tPlbG1z+PNnfnn58GJiWnvm+err6H7p4Hre6urm7+1fV09QT0ZJTE5OTVBMTlRWZWdv9+7ubufpb3NeVk9RUFZzaPnw3tx5aGB6397d2NXT1dfi1s3Oy8zP19zi/Pl99+jp3/3+fmx1a2Jo7eDj6PXg3HBlXllfXF5ZVFtiY3Dm7d/f49DN1Njb4On1cOrW1OLufV1OSUtNWVtaYF9XWV5cXG1x8fB59nJ769/g+HFrb2hZU1BnYF9lXWFeYGdtcWhzZWNudPHg1djV1N7g7XL+4dbZ4Xx94d7m39LNy8nP1tLW0szO2+jucl5YVmFyaWr0dW7y9PPs3d7f6Ghec/jz6npqempZVk9LT1ZTUFNST1JSTUxNVWhiWFx+7vDc29/rb2BhY2Rtc3FnX15u6uvx4tXW2tvk2c7Jx8vOztDgemhlbPrscV5ZYnR97efd19XX3+zq7/Hv5dvd53ljVVddVlpcZ2Rgdu3q5trQ0tzv59zT1N/pfXJaVlRTWmFnX1hTUVJVXGRkfu70cFlYavjm6d7W7V5aX2JfY21yWVZWU09MTllweerf39zZ1t/n3+Hh5vp76ODp5ubr+XFp5uf03tLP1c/O0M/LyMrK0+N6V1pfZWL28XX2a2ptd+7n2Nbg7e3l3ONs6N5pW2FXS0lHS0xLT09VWFpbWlteVlJcWVJg8ujb1Nv8YFthbWx54+Pm9WtbVVdgd+jc2tXS19PR1M7N0tTT3+t9e35qY15YWm3w6u/t73Bmcu7s5NfT1dTd6ntoa2h1ffHx6PRgW1le+t/RycvP0tTY3O7q4OHqcV1RS0hLTE9RVVZgW1hjXFxhaWx5793V3OtuYlpQUl9ycvxtYWtXVFZQTlr33tnj4uHl5t/h3dbU0+9eZVxq7ujd1tXd4u77aW175d/d09LP1dfO1Nnh+XV+6u3p7378dmNibHTk3dvm9fF75tvf8uje32xXUE1IREhMTU5VWVRUUVJhZHV+6tzief7weufwcGVfdvZ6aPnsb2dZZG3w1NDR0d3u2+X24d3Vz9Pf5XdpbWJsdPPubWFpYVlmYm7g6OTe42xtdfXd9Hz44uf77e739eX5a/x869rX1tXi29DU0tfW1tzmYExMUk9SX2xvXlVPVVNYYmNqbPp+Yl9ZWm72dmheWmVjX2Jma3vzc19gd3Bj8Oh69eDX1Nzg2N/l5+vy6u3z4+HY4mP6b3bu8OXq6vvi+XP4deLY1Njf/fflfOHtfOXq7fT/a+rm3drh3d/e6O52/u5dYFhVU05NTVNNU01HSEhPWF1l+fbs3enc4enX0d/8Z1tyaGl2dWxvbl1bV1xv+N7e2M/N0c/O2tPW4O53aXNuXXTr7/5hWlZadOp97u915eTx+Pv4399rXlladu3w6NjNzd3o82/x6+DY1tbQ1d/c3+vl8WJeXVhWT1BYWlpaU1BSWmVaUlhfYGhkZHHq4tjgY1pRU1xfZXnm4/VrYGBm9Ov06d/n8PPv3d3n1s/U2Nrj9XNv59nd5HB33Obr8Gdr+fro7vfZ0eDl/F9ja37r7eLW3+7sXVRhW2fq3M/Q6uzl693c6OT1cX1XTVFLS1NLSUtLUVxVWFFNYfTu4t/YzdTc1fJlbFxi8vfk3HFgX1picHzp4tzV5+vZ29PM1+DV1tfaZ1hcW2jy9m5qeP9tZWpbYmpZXerc1M/scmxYWGNu+tvV2+bo4eTc5e7n087P1HdtdHTq3N3x4PdbXFxYW2peWU9VXl1ZU1BPU1NbYWN3dGhze2f372Jha+LR2PVjV09ZW2zl59jS6HT579jR0M7Py8nN3ub9cfP04OB0bHhZV3Z6fvhoXWbi1NXl5+h7ZWJ86ujb0u997Wt5+mtf59ra2ex+bmdr8Nzd8mxkT0xVU1pcVFZcUk5RT01QWFVcX2xv7eHz6d7b3u1vb+Hg3dnvYmFcVWJ66N7c2+ju6eDe1tTOx8rPzdj98nVlaWptdWRTVVpga2liXV546fXe3Pjl8HBlXmvi3vLc2uTp6eHd1cvK1dbdaWJfZWty/PpfTlRUUFhqd2v95e1ZVlpNTlFUUFJXXl1YY2VdYnh4cPDb09vY2+t+amZebHTj5X306v5s7NnVzsnK0trk7OXd3NrZ3dvtZF1qYlx5fGJfcvD17u7o/m13dmFfe+15fuXr7N/c3dra6vRyWltaZvzn5tzU4W5aXVtYZHp2cW1fXE1FSUxNUVlZXFphbW1+7ebl3eHf3Obe9WxrX1hc9+3h39zjcXfq4urUzc7S29Dc+/Xh4ujY3N319m1eaG7//N/i/GpjblxYXWhhYvDi629++XJ65dre39PM1Nra6W1dZnF75NTc9v9fVFJfZ2H+5vZaWV5QSUlUU05cfmtVVFRYWl1eXW/39fx7eWhfZf5zZejV3efj5Oju497e283JzdHS0N3l2NbYzc3Y2ez7/njz/3344/ZmW09PTVJoZWze1NrmefHk/vHm4+DY19bkYV9ZVltZX/Do/nBq/v5qc21ee+Xu7m1YVE1HTU5XZ2ZlXldUWmhvXmPc2dza6XB+YGJ+aHjr6e347uDf29zq4dfTzM7a39vm39vh1s/W5u3p/Gh1alZaeubjdF5ZT0pTWFvx2dnj8PX8693peuHOzNPW1+NvZvpsZv7t5X5w5eb1cFlTVWd6dWdiWlNNSUdKUlldVFFhW1hcWFVd39jb6u1qWlVaXVz52dj169HX2uXn8evZ49jW1dTT1d3p7c/JzdTWys3R4XNnY+fx/WtbWE5FRkhNZ+HZ2drV2+Dv/Hnhz9Xe3tvtblVTUlBufmZk/9vg7HJiVVloZGhgWV1hT0RCRlFWU150eWlpZWFj8NjV0NPe729ZUFRo3dre3dvV2t1zZXfr19vXzs3O0956aWjg19rT1s3N0OB1a2f9aWv7bFtVTEdLT27569PY2evybmlq6M/a2NPU2ehtWV5YZPtx7e/f3+xrXVhWZF1ga1ZWVU5LTExZZFlgZVtSUE9XWWjd4NTP5GdYVE5OT/fZ5dvX09fb7HR0ftvXzsjLy83X6/h828/NyMrOz8/Z/nPs2+fp8GJXTklITExdeHrm6OLe3N3l493Q0djle+1lU0xISlVfZvDt3N3k/F1jZHz28f5gXU5KRUFJWl9kbVtbWVxaW+/cz9PU197tcF1QUVJnc+nh9d3V2ndo/+/c18zIycjL2m5fX37i2M/T0tLc53zw2dPf6edlXVhNSkxSYHdudmdv6erw79rQ1uDj3u3d3HZfW1xjcn7g29rZ6XBaXW5veXd1Zl1NQkJFSllsbXRjWFZTTlNt5ePo7ev0dWRdXl5t+vxxe/1xePNpX2drd+rWysTDw8nW4N3d2M7JyMnM0eb95OTn6nZwZVpVT05TW1tna19hbHXq6+DQztbc6/V+a2x6XltYVWNmeOXf5d38XWVdV15baG9dVE1IS05PZXx18HlqcFhZ+/R+6PRvbWNpaVxpfmv36/zs9/Pe+WV3amzj39PHxcTHz9bh89/W1c3M0Nh6cOpxd/JtaXRnYV1YYWZeY2VbWmB93trSzNHU19/o73p4eF1fW1hnbP7j19vm8f10WFdmde73c1tLR0lKSFBbW1pdX1xYW2Jta2htYl1kbGt75HNu/mtoa3v4+PF4a11ffN7NyL/CycrO5d3Vz8fFxcXL2eXueWln7+z27HRjZV9WbXBdYVhUZW/7393j6erf5+nf/WxyXk9YV1x+du3Z6mlmWFRZW3r26nBRTk1HSFRTXGdlb/90cfl1cuvvfvrv9fnq7vp6cWFtbmd28vtydF9aZvLn0cnJxs3P3Ofc1MrMyMfO2/DyX21qZmdn7Hp9b/nubnhyZlFPWlpr6N/d4ebz7OLe1Nfd4nhlXm97cObh6mFUUE9RUmZw7N3gZ1FZU09RWmFTV15aWFRZaGVjaVtTXl1RXvh5bGlza2395+Lm7XFuXGL4edPBwsbLzM/Mzs7GxMTHyc/f4O9wcGtfYfx9en145d3yc21eWGBdVWztfF5fXlx75+jz9etmXVlj/Gvi2eduW1tPVllXbOfiYVZWUU9NUVlgZ2JnYvDu+OPt53RmbWdrW19zemJWXGJm9e3l5un2YGRu8N7Sx8nMzNLa5dnX0s7Mzt/e5ej2fPZ57OfwbWHv7f/r7u11X1VRWWBp7+ns9vbs3djb19zffWFYVu7g7efm3HthVlZyZnP07GZUUk1PT0xQWFxXV1ZZZ2RgYGr/cmRUVWddVVleVk1YW2t07djm72VnZO7OzMrIxMTJyszJyMPFzc3Q2+7q5+zw4N3j3uHv4Nrj5v/181dNTVZaU1VVVlhfaPrh4trmaG1gUlVx6fpy+HdfXFlbcPf99l9cWElMV1pWV2JdWlllbvLe6uTt6/JhX15iZWJzXVhYWGh15+PwdGJeUVj94dHPy8fHx8nFx8bGy87i72lja1tr8/z47d/27NvV1dvc5/JuX19ZWFtVVlFXWGrp2s/R2efq/V5faGv9dnN5e2ldYPTwbGxjWVNRVVhWW1RPV1pYV2Lu8GZ0fV9kY15bV1dWU1VVVFVg+t7f8+1qYmVjeeHU1NHLxsXFw8K/wsnH0unc3Oj98e967t/Z2tvQzs7a4fBib2ZVUFVQSUtITVdc8d/Z4OzmZV5cWFxeaWBw8PXp9nLt5v1jaFVQW1BVVlFLTFdUXW3u3tnc8ebueOP5eHtbUE9RTVBdeOPj3/tsX1BZZGPx3d/Yz87NxsPDxMPIzNHi3uHy6v1cW/X6fN7Tz8/Kz9jZ8v31Z2BdTUVLR0NQZeLY0dHd1Ox48Pjs6O9bbvlcYn7t8+rqZmxcUFVWVVRNR0pTSUlfd3vm3P7+9nFma29eWExIS0hIUmpyeeB2aGVdXnPk2M3OzcjHx8fBv8C+v8jLzNHY09rn7Wrv7nzn1szMx8vU2uV2Wl1fTUlDQEBBR1Fx9ujZ6en9aW5u+ndwXVdbUldecu7x2eliZ1hVW1xSTlBJTEpKVmH76dXa4dvi8fx1YldfTUZMS1Fgem3o3XDzeV703t7bz9XdzcvKxsHBwb7Izszc593meefvXGBlXvfRy8rGydDT52h1ZVBRUURASEpOZG9w5N3i5Ob93dbu5t9wWl9hZPDi5+PsXlZYT09VTUlOS0JER0lYe3vk3eX6e3RnZlxVWE9DQkpKT19s+OLo/OTq4dHP0tLLz8/Hxr+8u72+wsvMztHOztri3vdfZWr40s7Qzc7f6n1meHFeT0lHQUBCRU5VV2B9bGXq79/V4nN9+2BbYXPm3uDwdlhNUE9PYGJQT09IRk1QauTd3d7maWd0cOrf/lZRT0lJSk1aZWzz6P7v397Tzc/b2M/Rz8vGwb6/yszQ3tvX19HW7HN6Z1dm4dPPzs/U3Ol5+OTd225TUU1GRkpNWW198urp893R0dvd5Pzqd2n79OjkZVlTVE1MTU9STktHRkZCTGFs7f5xa2ZeW2H953xdU01MQkdIS1xpZ3Hk6v7e09LOz8vIx8jFwL67u8LFx8vR09DY2tnf5uj799jSz8rU3uLxaWBr+XtmUUpDQT8/REpn9GHr4ut75Nrm3Ojtd2FeWF/+6ulhXWVeUlBTUlRUTUlJTVBWdOfe8fD6amxt6Nve5mtTTElFSE5f9Op6eu7o4OHUz9HLz9rc187PxcDCx8vM1t3q3tvp3/Nm8+jd2MrHy83b73Zx/njq+WZURkZDQ0tc6uLa7HDe4Ozf0NHf5mVaWlZ07d7kfmlSVkxGTFVRRUZBPUZHTGft8vLyVVJfZerZ23pYT0RDRUle7Pdt7l1a3dvXysXGyc7c3tDKwLu8vb/L3NXP3M/J0fVpZGbd0MzCwsbL6ltaZmZ83/5RRT89PkRMcONzaVZNXOPZ1NDR319NS01SeePW53xqSkpNU1llb09EPj1GUPLV0M/T31hQYOfS0tb0WExDREdU9+fnY1lOS2feycbJxs/mZW3cyr++v8bN3F9w3c/K0Nl0VVJd6tG/vr/DzN1fVn3i1troX0xFQklOftbY5GBcWl3r2cvL2fBZTkxMWu/b1N1iV1FITFdibk9COzk9Qklg2dHYblleU1Lv2dflc1NHR0hKXeDn/FdJUl9r5c/FxsvY5dfOzMa7vb7Az9TU1NPIw83daFJd39XUwL2+xd7z6eTx39byY1REPkFKS2DwYV5MSVNgfPDU1+lmTUpRa2Pt4Hn0XU1NVWJ28mZPST8+RFRk/tPU1e5RV3R459TX9XRVSUhPZvXccGBXRktaeePPzdjY/mX92c3LwcPKzNnj39jRx8TlZ1xVXXHQyb+/ysvV3t/U0tLN6WBTTktHW//e12NcWlZWYNzXzNZ1YlhXUPnf9+JvWlNRT1N0aHdWRD87Pj5HWl/x/mBbXF5r2+Dk3P9SREtPTnHu5fBZTUtUXuTa0cnQ3XXf0s/DwsC/wM/cz9HJxsbEz+tZXffnzsbBxs3f6tndzsza2edZRD9GSFNmcWFSSj9ESlXg39fgYFFNWFf42Obodl9LSVBW4+5iX1BHPUBGUebh5uj5ZWLt8M7K39jyXUlKVFrf4f71b1FDTVnvzdLM0uR4dtzYysPEx87WdHrd2cbIyM3pZlVh9dTEwsfO0NbczsrDwsnaXVVJRlNl6e1iUk1IRE1d6dbZ32pfW1Rq5t7Y5FdRUUZLW2vybF1LQ0A+RE5XWllPT1FOXf/w3dvhYllWTE9jcHd6YE9MSk9q687Lzc/Qz9TNxsPDwsjTztbi1M/Jx8TL3uJ59tnMzMrJ0c7U08bEw8bO3V5XTUdMV1NOTUQ/QEFLWGjr7fBsXl5ded7ee21nUVNXV3rl3udqUkRGSElaZFxbYVZVcfLc0dDY7XZdXFxSZmxfWVNJRU1TYN3U09rY19vPzcrFytTY3/nq5+7Wz87U3ef03uDaz9LU0NbYz8rHxcHFztXna15XUVpZU01KSEpOV2F+7+7qeWVqef/u4/x6fWljXl9eaG5dUElDQkVGSVJSUVhUVWB4+vjn6XViV1NUUFRbWFVSUU9VXHLq18/R0dXMysjFxsTIyMjP1dXS1dXT3uXe3NrX0tHNzs7Pz83Mx8PIy8/c4m5eWVVPTEtDQ0JARUdNTk9ZXVxicHbv9nF9+vz5emt0Z1tTWFNNTk5OTk1RXWBcXmZq+Ovp8ezoa2peWFpdWlJaV05UU1dve+Xb1N7j1tHLycrMycrQztHW0Nzo/v16a+js5NXa187IzM7JysXExcnKytvocl5oYFBQV1BMTk5TW1ppbX5tXGpv+urr4d/e9WxtZmxhVEtJSkVIR0lQT09PWFRPVWBibmVjeXBeWl5aY15TWVNTTktVXW/p3drR0M7LxsO/wMLBx83P1NbW1uhweXrs6+LX0s/SztTV0tPLx8TKz8zb73pkW1FPR0RBQEZHSlFaYlhZXFxqZGv37H7r2e7xdWnu9XBcUVFKSkxOUldkY2NYYf5y6evf5W1pXFdgX2tjXVdSUk9VU2rq5+j1ffzj0szHysfDxsrPz9vc4f52cl1cXW7p29DNysvNz87OysnIxcjP1drY2dnba1lTS0dHTVFUXWxvdGxw6tvX3+3wbmBeWlRUWFZRU1VOSUhKSElIS0hKSUhMVl9Yb9/qa21gW1VYVVNMTlJNUFrp5NjS09fV0svEwMPBwMjJzsrLztfb4v75fvD66d7Y1dXZ0M/PzcfIzcnLzc/X3N9tV1ZQSUpLSUpQWFhjYGJkZGtmavT48nBsaF1fXl1cXVBMUU9OVVdWWlxaWlVVWVtlav/o6evn7+hsWlRUUExPVFlae+zd293c19DM0NHN0NDS0tzh4uL969/s/Ovq5+5q6eXe29ne19HOx8HCyMjMzdLT4XpdV1ZTVVxrXmh+9WVpX2d67XFy8Pn8eXFgWVFZVlZMS0pITE1LSEpISk5NTFNUVltwdXZzb2deXlhWU1JYXl5+5ebe0c/b2tjX0MvJx8TExsXHyc/W2uJ8bXJtfenc3tvT0tfT1dnQz87Lys7W09LW3er6X1VUV1tZXVZTVVtYVFpfV1/zd3v4dGVlWlFMTVFQUE9PVE5OVVNVWVdUXF5daPp2a3RmXmZgXFxbXV9ZXHFycfz8fuDg7ODZ2t/SzczKyszL0Njc2+Lw7mReZGZl9+7l2NPY08/Pzs3My8vQ0tXS19jc5uXude3e9Pb7cWZnW1xdV1poee3d4u32+ltVUEpERkVBSExNTE9NUFZRUVlWVVRPWVZUV2ZgWFlhWlxpbvTr62558/Ln3N7d28/IysjExMfJyczT1dnd5Ojp5ebvdXvn6NvW1M/Ozc7T19bY2+Hd3+nn5eh5dHP+dmxaYWxYWFpfWlxeXF5kcu7n/ntkYFxWUExKSkxOUExOUlRYXl9tfG9ndm9eZGNja2ZYWFZUWm/h5ezxenHzeHh6fuvc0NPQ0c3Q09bX3Ojk5fVfanj4bmZeb+7i083IyszOy87a2tnh2tHP0tXZ2djX1eDqbnH87nNlZPf3aXNtbGV3eHtsYlZZWE9LSUhFRkdGR01LTlBTWV5ZVlxdU05UVVtZV1VWVmlv6u3n3/vt5uz06eTUzs3QzMnKzcrLz9LZ0M/U4OPg6P5tXGFp+9vU0M/JzM7M0d7j7fPs7PXv593X3t3f72NeZl9bWlVdZ19XXG1gaml4al9fYF5SUFFQS0lJSkpTVWj9ZnTr6mFhY1xWWVlcWVRbbHPz7O/1bnj582lkbuby3dvd3d3TzsvX1NjY3t3e3ub1cHhrWGhmfe/d1M3LzMzL1d7W09XU2d7c28/Oy9PU1N/m5mtfamJy9fdXX2xkbOl9Y2BeX11YSUtOTEtKRENBRkxWWFVhXVlbWEtOTk9NUU1KT1xj/+f+8XT/dOX/d+7d19DT2dDPz8vCyc3LyczN0d3d3Of48GJbY+zb1tLNzM/d29n18OHe6t/a39zU39PR7v3+bF9fX1taZWBzaldcb2p97nNmYmVVXVhNTlVOTE9NS0xPUGZybHJkWFhaVlpZVVVeV1hhY2H77XV7b2lr+G958ezw2tfb0s/T0szNz9Hb59ze6+rvZ19hYWf8ce7Yz9LQ0eDa2dnX0tva09LSztXY0M/P09Ph5erp9Oh5Y21pY3rme/Tw7GloW1JOSklJSUNDRktLT05VXFxWXFZKTE5OSk5NTlBSUWRhXWXueWbz7vF5fPPZ29rUysvIxMLCw8TKxs7Y3Njp8e7ubG9uatzn4N3acXDx7vfu8+zU5OTb1ejc19ne3ebs2vL6+HJidWtkYG5dct176fZiVFtdVVJRSk9UTFFUUE9dZnH+b1ZcYFdZWFRSVlZVVltPXW1y/G1mY2/39/H7eN7e49rT1dfNysrK0djW2unxeGZfYmlia2/u39vY1+dravPl7uDd1tLSz8zN1tbOz9PQzs7R1Nnd5uni3fV07Ort6uj4cFZLTE9JREhKSklLS1FPTFBaVlFUTk5QTEtVUlBVV01RXV5gaWx39Xfx7evv39nQz83Ry8XNzMnKzMjJy8vO4uPf83l2a2B+6eDf52t3dF9YXlVWavvh29/829jg7en53tjTz9He/drd39zmY3zr7evoZ2BsV1RVTENISVBUUk9ZXFtkbFdSXlxsZlpNVlhdb/1WVGJk8vtrbuVw9+xwWG3v6dnX2dTO1tLU2/bf2djY4HZsZFz69G5cdPzd1N3u7f57fW1eVV9t39XR2tLT0tPV2dbOz8rJzNLNzc7Qztjz9+72/fpraWJaTU1GQEBHS0xNTk9TUVJVTUpLUExPTktOVFFZbVtUVl5bc+Te3d3t6+Lv6drR0sjGysnL1NDN09bU3PL0fHJ89PPm8Xb36ejg2eHn819YXVRTXWNp7Nvh3ePn3tfb1Nbg39fX19HW2dDS4OX3cW3t9vdvWU9NR0dMTU9WXVheaWJfa2JdXVZLTFBPV2NfY3VoamRoXnPt6uTkfW75fvbp2+DV09TV1Nrh3N/q7vtdV1NZXHBqZ3lua+rf6d3Z3vT7XldeZGPv4ebc19Xaz8vLycvNzM7Sz83NzcjJzM7T3+Hi+/D7ZFBMRkFBREZKTE1OTE9SV1RVV1RNTEhISEpQWWVfXV1gXGv34OLc2+T17uvk3djNy8rMyszOzc3V2eD8Z2FaV2p6/u7rcHD+8e7p6fR8ZlhUUU9UX2Rpd3lrbfHd0dDQ0NHU19TQ0dLMycfKzNHZ2d3c4H1fU0tISExMTk9PUVZTV2NrZ2BjXVVSTk1NT1RaX2BgX15tfe7d4uHk7v166+Le2NPP0NHY3Njb5OxyXlpQTlNYV2BlZnB8cHjp5+bv7nNnXFhcanbu7uzi4N3cz8zLysvLyc3NzMrIysnHxMjLzdHc3/diVExFQkRGSUpLSExNTk5TWVtWUE9PS0ZLSktNUFBVW1115ujf1trc2dnj393Szc7PysfJy8vLztfh4n5kWl1eWllZV1hbXWv08ube8HdoZ1tSVl5lZmZsZWh19NrX19jX1NTUzs3LycvNzMvJyczMzdTofl5QTkxKTU5NS05QTlVbXWFiWVRSUFFQTlVZVFZZW11m/OPb2djV19zf29ja19fZ1dXTzdLd2t/4ZldPTk1NTlFPS0xOT09gevbo8/v6YlxpZGJ+6ubf39zY1dXSzMzNzcvPzcfEw8PJy8rNz87P1Nnc33hbUk1MTEpMTEhKS0tOV1hZWFFNTUxJTVFTWFxZUlpaW3Lp6tzX2tfY3dnR1NTU1dTNzczJys7V1+xpbWdcYV9ZWlhUUlRVWGRtYl1bWFlVT1FTVFdiYmJrc/Di397Y19rb1M/OzMrLzM3NyMnNzMjM0tvl6npeWlhQTE1RT01UYGVtZ2BdU05TUVBTWWJmXV1scHZ249jZ2tLQ1dDQz87W39rc397a19jZ3PFgW1ZUUU5OUExLS0lJTU5RWFVTVFNUVlRbX2dmYWd7dX3i3NPSz87P0M3LysrJx8XHysfIycjJzdrxb3NiVlRZWVBNS0tMTE5ZWVBUWVROUVNVWVdWWVlWXWtw/NjR0tDQz8nLzsjIyszMzs/QzcrIzdfZ2/Robl5bX1xbXE9PVlBPVFlVTktKSEpLT1lZTU9ZT0tLTldbV2VqZnTs3tze2M/Q0c/NzMnJxcfR1djq/Wdp7ux7cXRqaVxdaGps/3V3ZWFzfW9oYWBmW11haPrc1NLU2NbS2dXOysfMzcrN0M7T2d9+cfpeU1hZWl1WUVBOS0xOTlBfalpQTk5QVE9ZZ1lWZ2JZWF9y+vt1+OX/cufd2NrZ4ebd2NDLz9LP0t5zX1FPWF5rb1lca2ZcXW5xaGZgXmFcYHnwbW54XVRUUl/47NzOzM7Ly9DOyMXDxMbIxMLHxMbP0tTh6v1sfOPn8vtkVlFNS01SU1NaUUxOSkdNTUxQUE5MTUxOUU9OUVBSVlxkftnd2dvo4tvn4uPn6eXf7/hoY2x+bG9pbnF37+TW2t/o7W5wb3X+7urj235iXGFlcn3o3tTSz8zPzs7Kzc7Pzc3JysjK0dzs+VpcYXXx6vHg5/1kX2dXU1JVU1RRVVpdU112XltUU1lfXWdwa1hcXlJXWmN36u3t3uR25epmaWRmbWJVWV9YVF5YTU5NUVxpZHnkeWB9dGf/c3nk4e3k53dse2t+9fvg1s/OycbJy8jMzM3Tz8vM0czL09jb493e4dfT0dbV1d3f6XBvX1VZXFxZZWhoaV5WU05LTlFWWWNYVVRPTVFPTVRUXWdya/d1bWJjXVZcXGJrdm7z+3BfZltYZmR66fB48nttZHtlZHFv8uHzd/xwbGbuefbq69bLztHQ0NbZ1d/d29jOytPc29nf4tzo5+bo39fq+eLhcWxxbHv48uHU39/Y2Onq9vb8d3Xt3nNicHJmcGtgXV5h9OtqXWJdUE9NSUhJSlFWT09WVVFSUFJZXmLw8Gpga2ZfX1tWV1xfffp4eOzz7+35cfru5djX2tvY3t7e4ujc2tbQ0NTSz87Lys3T0tnV09bc2+rr5Ol0d+7z4OHi493h4u73YGx3bfxyZ3j4YGx4a1xpZG3w7ene62FiY2JQUU9RV1lVWVZMT1ZSTVZVZ3Zxbvh0Z3JrYFVcXF9daGT4dVpfbmdkdW72+/f17GhdX2llXF9hZXX3fd/i5tvX5ujj3dnW1NTP2t3f19bX0tDXz87Myc3P0c7P0dff6tzf39/o7OHc5enf5u3b4OLtcWpwa1xaYFJOUE5RU01KS0xLTVRMT1dZXFlPTlZaVldcUGJsbW9mXGdtZGZpZl19b+7m8HXzbmxvfndifW7j29/j2uPd3Nz2dPf/2t3o6dzi3N7j9ffw5tTX2dXR2dre3+jj8ejY4ePa293W19na2d/VztbY2eTn6PlwZ2tn8e1pY2ZbXWJbWFtWUFxWUFVXUVhYV1xfXFpqbGpqbGFoZ2JfW1ZXX1lZVVNSWFhZU1BVW15dZGNvam1ydWpjcfXs59/c2Nzb1dLW1c/NysfJztDZ19HW3tnV18/R1dbQ0s3N19zZ2eDb3tza3Ork6Xh+6/J48G5qcWNeevZpZV9UUlFNT1FOT1lWT1BSUVhdWV9rYGNvYVxmY15sbGZ7bltgcGVha2xndHR38Xtlb31gWVpXVl1cXWZeWmNtZm/86OTe5+Ph6e3j297d29jd1dPMycvKxsbJys3N0M7T0NXd3tzc4eLh3Ofj7uHm8Ofh6/368PlpcGzo63h7bGJcWlpYVmBea15TU1RVUlVSUFBTTlJMS09OUFNUUU9PVFdfXWNmY2RhZ2ZhYmlv7mtnbWv27ev3/HT77evz9+/p5O/p7Oni2NDOzs3Nzs3PzM3OzsnJy8zO0NDQ1c7R2tnS197oc2x1cGJyYVhbdnV5cGhmbGdheGxgZHJiXlxaXGljX2dfWGB4ePl9fXx9Zl9YU05YbmheWlxZXFRVVlNPXGBeV1JWVFJPTk1OS1dkZ11kZGVrbvfo4+XSzs7W1tXZ29bX1tLXz8vQ19LSzszMzc3O1c/P1t3Y1Njb2+3w7Pjd1tza19nc3+PzdnBu+/9pZGJlXFdTTExMTldWU1hYWFFOTkxPV2r4dGtsaGRcXWNfZ/nm6Ph5fW1sXl5cWFVZW1ZRT1JUVlBXWVhcd+/vff3r4uDo2Nje4dja19fTzMjKzcbJzNDO0tLV0s/O6Gz7Xlpl+/3q5+Te4XL15nz84djY3dbY0tV1eOny7Nze3t/h7tnnWVVTT1RmbGZZXFVfUUtSVk9TW1VaU1ZUbldTWWJbWVhVVVNXVWZPTU9QTVdcXlteZF5uYG55b19u7+v039bSztXTzs3T0MvIycHAxsbO1M7T1s3Nzc3O0tPR19zk6vTo6Pr25Ht0bFhdaWdq6e7v5ut79G1cXWVbXH1jXFtcVmNgX3n+YmjydXtyZlpeVVNYVExQXFNfZWdgaFxWXFZNUlRNUU9QUFlUVmVXVWFpZffv8XzufO/e7vTj3d/Q0tPZ1NvZ0uDazsvPy83P1tjd1tns4NTP1s/P0tna4dnY3NvU0dLMz87V2+vf4PT86vd29mNbVVNZXVZQT1ZSUV5YVE9PTlJRT09UVFpkXl1aW1llbV5nbVpkY1ZTTkxKTUxJSk5OXGZeW1pbWnV0aHTw8dXS2NrZ2uDP0NLRztLIxsvKys7UytHT1t7p2d3o+nNdW/L++O7o7Nff8+/mZ3bj593s4ODY2eDi3mt13fT9+mZh/mdXX1lLVVhYaVtdYGRoWGdbT15eYV1TW2Brd2n8YlhfXVxUSUtMS0xMT0hISEtQT1JdYGlobHtbXWL85Ozh2NTQzcnJzcnIxMTIyMnKycrM0d7f5tvZ19fZ3uHi6u1scnZ8bnV7Z2p36N3f4tvX3ebh62NcXVleWE9SXVRabWFeXFxbZ1xYU1RMUV5XUFlWW29dZ/1wWGtlWlRTTVNOR0RFRURUXVpXVk9ZWltZZFpZePHq5Onr2dnSzsnNy8PAwsjNz8zOztDN1c3Ly87bef3xfO/4+2v7+OzueWLy4dzU0tfi1dPN0Nrr6f976O1uaPHw3NjwYGlfbvpvXFpkZW1tVk5XVGL/bVZYYl1eWU1JRkJIS01ISk1KS0xBPz8/RUpISFNZWllkXmFr8dfKz9bMycrKxcnKyMK/vL6/vr7AwcPL0dbR083e5ePzX2rtfnn74+LX5OPk5X7t53Rocujd09rb2dvn3uPyZWdra3RibHhrYnj5cWtqZm5yaW9qY19fWVlZWVpka2pwZl9fXE9LSElKSUdFSUVAQ0dHTE9ZaH747Ovw8/F4+uHi3tLIx8C+vr+/wsTGy8zKztPN09/c1Nza5+7h3eDY1d7g6t9vad7t8c/VzsXGysTFzNDU0tvW5N7abFZmXVlcVV1pb2XyfFlOTkRCQUFISUpPYF5bWWRbW1ZSWFVPTVNPSkhNTFFQTV1bWGH7dWx9cWFoZnbl6ejTzM/NxsbIxMfFxcfKycjO0tbZ19Db0s7T2dXb+WRiV09OTVdYWmfk3uHe2OHd3+DU0NHX0M/Z3dzf1dnaz9Hb6N7taGJZTU1KR0pKSk1STU1XU0xPT1NYWFBNUE9PVVZUVlBQVFJNTk5LSkpGREhMT1BWY+rn49bS09TW2tbS0czIx8TAv7/AxMfExcvKy9DS0dv4eWdp9vZnevlv7+nyePDv7OPseuvl+3vs8eDh7ufc2+Td6erz/mReU1NSVVZWX11aYGlaWFFRTlVQTk5PUFZZVFZQUE1ZT0xSVE1PT0lJSUhIVE5OWmBbeOx7/ntiZORsaO/r79DQ1svFyMO8wsC9wMnDydTSzdfV0tzPz9ne3vt672dZbG5ccn1nduLq2c/T0sjN0crQ39PV6+HibWv5WVZfUUpOTEtVUkhLTUVJTEdKT01PXFdPW15VaGtQWGZaVlpPTVJKSFJYUVtdW1xhVVJcV1BdaWLs6u/g09na19naz8/Z0M7O087T2dvd69nX5d/d3unc5fn3dl9rfnV57O/t0M/VzMvUzc3X2NXb6NjX3djc7tzc7d/X4PbtaVVaUkpQV1dVTkZFSkVDS0Y/RUZHS01ISE9RT1dQT19mdu7n7ffzfHjrc2F+4OHh7evn5+Pc09zm5Nvc3unp5tfY19HY29TP09bb2fXs/vZyW09ZXlhYWl9WYl5kZWBc/uHY1NTQ0szPz9HW0sfGxsXCxMbEycvUenvi+v356O7+bFpbXFBRUlFRT05MTlJMUE9JUE9RUFdYUU9WUFJNSVhfY2Pv6efb1uHV0tLP0dPWzs/W1NPf19vZ0tTW2M/X5er3bXZdXWlvbnvc2t/Z4evpfPDs9Gxt9X157Htpb/b19+337NjY5N3c3NrX087OzszJzM7Mz9XUzc7W3+Pn4vV3fGRYWWZoaWdoY21pWFVXWVtfX15gY3Xk7vP7dGpydWNaXWFcYmZqaGBeZGxqbv337+j6+3Z2/nV8fHzl4t7W2N/08f33eWhu7vt78fHd3t3b2NLRzMjKy9DS1trW3eLg6d/b3tXU093wdndvdGNpbXLue+ro3+fv5N3p3+Hi5nNr/uHj8GBeZ29hX2VlXmh2ZGNlYGp8X1xq//Le5ejo6P786/twe1dLUU5MTExNVlRSXGRQT1ZUUlNTV2dkW198Y37j7e3e2tfQ0uPe2P7w4N/e3tvS1Nne0M3b19TW0tTa29vf5+Dn4tPX3ODj2t7mbmNoV1NcWWVeXHb6bHDr2tvn8XHqe21yYltnfurq7XL46nRrcGtcXlpVS0tJTkxHUmRbXV9ca2hnTExRWV5aTE1SU1FOT01XWWbn4Hd7c/5uZmNo697Wz83NysvNz9jq49vb2t/q5ent8n57/Hb959PQ2d3i3+XubmZfZfnqbnD6/Or6cF5jY2xvZFlUb+10V1JWZ2NjeN/a0tHY3GxaW11baPjt4Nrf6vleVVJPSkxNSEhJS1BNQ0RLSktVWl1oXl1iWktJS0tPW1Zd6Onk2O1q8n5mc+P049jc087X3dPb387M0MnGysfG097d7O7c6n7Y1dnT1fxvdF9ZZlpUaXp7+vhbUFBLTVlRXPV1Y1pUUE5MTFNbXGzm2tff9uj3cHT4dWBkbu3b+HH9bPt79Hrs3+Ph4mBbVktIR0VFTFBXdX1cbP9cXmFUUVdUVXRrWHVpW2NgXG7p69zN2ejb5fPub37b19XNyM/QycrOzNne1tbcz8zTzdHZ4OVy7N7l/d3uY19bUlRQTVxaX23xbPvv7HdyWU9RS0xQVlFcXl1fZ1hfc2Rn9fD67XpsZ2FSXl1RYe/q2tLQ0NXY/f5pW2dtcGr0+Pjnc2x5c3ff2dPV39vgb2VfcHJr8ejc2+Hb4Xzq7nNwdvrm2uHu19bm3Nzq5/N52tbc3s7X5dnd4uPq8N3X2tHI1t3afF9aTU5gZF/84Gtv7WpbYVVp4PRpdWZRUFVMS09MXvDn5tTda2hiV1VYUmDv+/De3/fi2+DX2dvNyc3Mzs/V1tbn7fPx5dja0M3NzczT3e3r7eT+59ri2O308HBWYGNcYllbY2xcZnVyVWNo+uPe2dfS3eP/c2f39+Df1c/KyMzN1tnj2dvc4uPp7G5eWlRPT1lc/HLk29ff7fxoWE1UWFpXXWXwfPf4bGZle/Tsb/jd1t7t4eJ1effq09fNw7/EyMnP2trb2M7PzMXEys/b/G7rfHvjc3rb2d3c7VZQV1NjfW7gzuViXFJGRUtHTFVScNXq6+br7d/qft3de+DU4Nrb7Grt7uDOzdPHy9nQ131naFJPUU5JXF1ab2Bf/HlbaPp3bdbu9N3yXlxZU2/l4NbM2NPK097gfWTs2+fczdTOzdba2uTv29jd09Db0dTicHZqYfPg6OX4XWRjWE9TT1NdXVdpe2zr4u1fZ1tVWFdRVVFPU1dMS1ZUWGh7aOnf6+PZ7m97W1VdXlh58+3Rydff2fVjbXdcaXRm+GtMS0xKTFhaWO3k7NjU8XFubmf/eHfZ293T2OTf+W903et+39/g4HtpaWP8+dvp+uxpbf96dG1xd2Nzc3T/8dvn6OF3ZFdSWlZYW1ZcUVxfUVZZWlxfYFxYX1VcUklGQT8/P0BGT1ZQZl1XVldeYWR09vD9aOXw5uXl4tXPztLR0dLO2tzq6ff7aWp2cGBodm1qW2j7737p8nd2eHd77vj9eXBpbGNeZXZ2aFpPUk9OTVlhZn7m4OX7ZXH09Hfr9Onf29/b2+Pe4evw5nd+5exeVE9NTk5NTVVPUlxgXFhVUFxeU09NSUdHR0JCRUVKTk9VX1783tzp7t/s3t3d39jW0srKzs/O0MnKztTW3efq4vj75fZ1YVtSVlVk+/peXmllZV5dU2RjXWv/Xmpte+twYml0YGn1fVlm8Glu+u158t/R3eHu/e3mdP3mefbr4Ozoenj262Zra1haWVtTXlVYZ2NVa3BgaO/yYm5ZU1dZTVNOSUlPT1FiX2Lq2unY2Nzf2Nra09fQys3Yzs7X1M7Y1dDb29fd7/ZsZmpmW2h+av7zY11wYGB59u/o39/b6Xh06Oz15ePq4uf13t3j6P1fZmRbXHBsaPdxeuPvXm1tZGhxa+HX59rR0tfP1N3V3/fk3vb29l9ZZlxeeujl19Pq3d9mVl9UTk5PUFtcVF1fVlzz83rY19nM0Nbe3fTm39Xaz8zQzNrX09f149jb6OXf5trd193n6ezd4vPzd3Lu5ejw7+v26PpvfXXz9OLa3PRw+uhwa/Ht8Ozb3tzo8O7vd+/n8enm5vJ0ZF5hbW/e2dLOy8rKy9vm621p+PLv8+3s8vV1fPnw4NXd8vNuX1VYTE5QT1pmX1x24t3P1NXZzuPa5d3v19ze2NfW1M/p2tvm797m6OPe2tPteOjOZd7W6tLZ+2d1UlJaZGx0bPHh9Gz373l+5eDq5uDe6/Pi3O3x3tfV1tLW2+Hs8elsX2drfP5uW23ubuHW2dHLyMvT19re7evY5l9s5vDs7vLs5Ono3nJdX1hadWpbVV9eZ/1aUVZbX2dncnFpa9vT6nLv7+TW1M/T3N3b5G1xbm3g1tje2+Hc0+H483T44fdfXFNLVF5YVVlZYW5vdPB0YXx6a/3q++bc3tzY3Ovg4+La6vLmdF1eZVdYamdra1tYXWNg+Ojy3uN79ez3/nz259zd19Lc4+fz83xaVFRbXVZXWlxYUVdaW2x+6vd7bVVaXlpjWl725ujh2+pnbGpp63FbUl5nYFxdaez1/OlkXGRs7nZrWk9XWl9bU1VbaXzl3uHo6OXf3fVte+nZ19LS0dXT0dDT2+rh2uLyVk5LUk9LS0lKUVRSWE9IS1FQVU1IR01OTlRTUlRUVm9+a/jj6tfa8Xvn3+rc3+DSz8/N0d7p5fzi4WJaZHpv5dvh3uBy7uNvcXlcXl9QTEhNTFJaT2JlYnbee1ZVTElNRj5BP0NJVlFWW1RQX2Nd6+nu5Nvn7N3Z3NLNysLEyMbByMvKzsvN1/D05PDf2etsXVNMVVBJTEhDRUZFRUlLSE9PUF5eTVJSTE9aTk1MSElKUlP+63Ds7G373fv57WdeevNs9N7q3c/NxMDFw7/EyMPEyc7X6ujd3dzU3Onhd2vj819lUk1PSkdGRD4/R0RIT0tFREdFS0xMT0pLUl5179ne6drd4NDU2dXV19LS0tHOzM7HxMTAw8zU1+bn2t/selxhYnR69N50Z21cXldRVElGR0dLRkdNSUtXXWl6ZllhX1RaVFRRSkpJUF1Wbe1q9Ovp083Jy8vKx8THxsbEx8S9vL6/yM3Lzc/R09zo7fpo/Whub1VNTVJMUFRNSEZGSUlLTlZgXejV1tnm/PHs/3f15HJy/P7b08/Mz9DQz87Qzt7/Z2J1c/ZhY/n/7tbX0NHe4eXpffxvZ15hbO/f3NXd9HFzef7y9G1lWFhlX1lPUVFWYHHo7Gto9Htu7uXk6tzUzsXExsbM0M7NzszL09TW3tbPztLRztDRz8/R2O/wbVxdXV9TTlZVaOjf19/h6t/a49zvaHJYXGNhYVZodG3v5tXU5N7l+2pkXlBMTU1XaPje6ft7+eLp4OZk+3Jz7u3ffuvf5NTQzMjMzdDS3NzS3enh5N7X19PX4nlra2pra1dWVlRicfH+++7s2dLQy83N0trjde1zYW7u6dvPy8jJztLQ1eH2ZlhYVE5TY29q/fB85NnT1dLO0tTrff1cWGFlaHD/7eve9F5ocG5oZ15VT01NUUxMUU9VWm9wbd/ufu1fZV9cYXPa3NvR0MfGzsvLzNHa2Phy/Hbd2dXV4Nze5Oxs6m5UX1dVV1JYTV70duTm29Lg3Njb4ufbcV5zZ2r8dnhfZXfz3+ze3uzb5F9ZV1NJSVFPWl56637u3+Dn5NvybfDz6+DW097p5ebc4ubmbWZsZmxsY1JSX1xZWmBhUFhgbXdiZVNNT1RYWF9nXGD569zT2Nzj3tne5+p3YlRcde/n5Nve4NvV197vbVRPVFxrXmFkV2P2693p6ePy6vH+7G1lWk5XYWJdXWxfY3vr4m1eXFBQVVlSSk5KSFBUZWJaaFxnfn3t8uj0bv7y3tzd193j2M7Lztjgcmn36eJ9+/Bn+eTp5/rxcWJmZV9YWVJKSk5PTlBfW1107eDi4H5hVVVTTE9QT05Ucfh24uT78/H/XWNqX1tZW11YYfhkX2ns6uLY3e7ycXR38upfXl9pcWru+WNub2xfYftiWFdSTEtLTU1NUVVXXnNfT09RS01VVFRZaXjp1svIzc/N0t3U0trW1dHc29jd19fb3+7d1tbj5d5xcO77XVZYU1Blb3D7a3t0W2T0cHtmXlBPU0tNU11aWG13eGtfW0tIS0pKSk9OTVz56+fb3nJra3bw3Nba4eHX293b0+dw8+je19XV2tjY4d99bFNMT01aYWdrWl1ZVGJ04/lfXFNTXnF1evzm39LM1dzq7vNideHmeHbq5dLN1dLf5eL15dTO1eDk8+rc2tPb5vv16dXN0tjY1uDd4HxuWFBPUV1fZ2BYWFdcX11XSkZIRUZMTVFOTk9a7N/zbltbVldyaO3m7tzVyszQy9LQzs/LycPGytDRz87U2tnd/e/k4d3e5X76691sXWFYU1BcWlZvbGl4be3t2dPjZ1VhYV/u5vN6dO3w5ePt+vns631t8G9daH7o3NTR2dPS0c7LxsjO2Nvc2M7Q3Ovp3d3Y2drp93lybVpTT0pIRUZKTFhPT01LXnnj/GRdVmX959XV19fb0M3KztPW2dbO0tPS2tro5NvY2OTd5Pjb19LW3tr3dO/c1O3o6v3f28/T29Td6NzW3mxdWFFVYHVuZGlrWGPo63BbaVpWW19uXF9bVl114ur26Xv029HT4Nzc3t7Z0tXW19HPzMfEys3N0N/x9O7k8vPw5Nve4unk5O7r3up9YFNTV19hYl9YX2dn7v79fmJ0dvb8c+r46fxs4W1lbV5nYHjpbvNnYWxo3Np64+bk3tjL0srK0M7UzNF16+Ln7vTQ3+Lb5djw5d9ZV1ZMSEVPS0ZJQ0ZFTWxTTVZTUFF5d1RnbW79eNHa+OTk3uTOyNHOzdHc3svO53j55u7aztTQ0dTb3MvP6ml3+nzo1tfb2Nvsa9vW63FeWUxKV1tXVk9MSFBcUElGSklLU1NLSkxOTlFcZWleWFJOW37p5+h1cHrd1dbZ3+Dg2drUzcjK19PSzsze62lg+HTw6uPlXF5oZ3Vsa1VISklNWVxrVE9UTVxoXlZIU1pPWmNsUU1WT1lncnhPUFtTYe/c6190eHXazMvZ3tPUz8jCwcnIy9LPyMfZ5dzl6dzOz97qaF1WW21TSkQ+Pj5JTEZHQj8+Q09JRklISUxf9G5mWlVSW+vpc3RfV17+0dbb2/hnbNfQ3NXgdXvmztDQ09je3M7M1tjlbnfg1M7N0NZ3XHjh631sU0lNUVdaVlJKREdLR0pJQD9ASU1PVk9PS1FgY2tlXlld8OLZzcvO3tvQzc3Kyc3PzMnFxsXGzdDU19XV3nlq/P733d7j92lsX1laWFdOTU5RWFdeXFZYS0pLSk9MTU9NV1phZWJjYl1dYFtbVFhPU2By8/RqXl/39ufc1MnN1M3KxMbIydDOzczMzs7Q0tHPzM7R2/VfV1pWUVRUUFFOTVdcXVhIQ0VFQkVJS0pLT1BZXFhZTlJqX25sb3tj7tnSzdXX7eXS1czLyMbOzMjEwsXH1OLV09DO1tDT1MvIycvQ411bXFhXUVNQVF1kal1zZkpJSUlGQEdISUxQXFtrZFFSVFpaVWFbV2b12Nzc1vfv4ebZ3c/HysjFwMPHxc3Q0dvb8d/a4dbTzMvOzeFnX1xcT1FUUFdrbmJfbWJZUk1OSEZKSEpaYVxYa11UXVxlYmRqXWZ52tLZyMva3OHU39fNz8nFvry/vr/BxsrJ0c/O2tTMxcTLy8zX3vBjV09PS0lLU2FcaX5kWk5KRERJQ0VJTl1aZGdkY11gVl12XGFw7trj1tff3+7tXVzt+O3W0MrIwr/CwsXK1O3b1d7V0czLxL3Eyc7Q5mTz9WRnbf1dZOl+bmhuV0dLTEhER0pFSVBZV05UUEhMWF9faez39czDx8rKydTZzs3Lx8C/wr24uby9vcrX0tvb3N/le+TOztfk42tMS1JMTFZOTFJda2BdZVlMS05LS1NWUU5bbFVbX09MSVBXUFtbV110293c2f9nW114d9rQzsnHvb2+u77CxszLz8zJ19LOy8fKyc7a7WNlY19rVk5QVltQWFhMSENBQUNJSElPTlNOV2BTSkpMS1j8dmfu2NLQy8nN2d/ncGffz9PNxcPEwL2+wcjQ4PPY0d3c1c/QzcTG0uZ5aFZqfVxaVV1ZUFhcUE1LRz4+RkZDRUVHSUxXS0NAQT47QktLUFx77t/N1+b2bGJZbNrd2M7HwcG8vMHAw8zS19PS3d3b2NrUydbg5WlbVWFsY2tbX2RZdmdQT0lFQkFKSElNS09OT05HRUBCQD5ITk5UWHjg28/m8HpVXVde3N7Vz8vBwLq7v77Gy8vQy87Y4fTe7ePW4+toW11WXF5dXlJXXFNZUElGPj49PUZKTFBYZGBgXVZQS0pHR05eXlVl5Nzb2t7ucF5dW1v693rYz8zKx8XIzc/Y3OXm2fHu4Ovf19DP4Ovq6Pn5435saF1fV1daTEtIQj49REhJUU9VYFRTTUZFQD9BTFhZY/vd0s3MzdDS3ert49TW0s3Lx8XFxcXJy9LX1t7d3uftefDg6eN9a2ZdbvT45Oj4ZFxyXVdWUVRKSU5NVlpgaF/tclNSTk1GP0NDSVFSXFdlfmVtaF9USlBaXf3e1dTMw8TFwL/Ay8vJzczO0tno2tTWz9DS5e3c3d3T2/1kXF5XUVVOR0ZHSUtf9Wtqa3twYVlWT0tISUpPWlpcZuvk+vzuXFdST1Nade7v4tPLzs7Eys/Mzc7My8/Y1tPOycnCwsjHyMrIxsfP1t1+bGtsYkxHSUZISlNWVlZQT1BSSkNAQT4/QUtPTFJj/uXi6nRbe2NYYvvi5OHRy8vJx8nNzc7W1svO2efr4+Xa1dPV0s/OzsjHzNLS0uDq4ur1a15fXWt9e+rm7ntgbGlNSkpHRkNIS05cUk5VavpiU1dfW11peHvp5dvTzsnGxr+/xMTJxcjKyc7OzMnGzczHzMrIxcXKzdHZ7WZnVk9PSEtNTU5PbnVfbFtfXk5RSUBFREZITVdNT1RYdWFYXFheXF5vft/q/eTaz87NxsrIxcfEx8fJ0dDRzMbLxsnOyM3MxsbK2N7vcfBua19QWVdbb3nh+WJpWmBjU09FREVCTFBUW1JXXGHo721fWFtXYXHo5/XvbPHNzc7NzszMwsHGwsnZ3tfOzcvJzMrGw8LBwMvU3nLu/ndrUlFMSU5SYFpPUEtNUVBPRj8+PD5BQkRCREVIT1txa11iXWtz7Nrq5et279/Pys7Lyc3Kx8bIzdro39vWztDV08/Mz8jI0tje4/tx3ehnX1tZVV/+eWx86vdk7vlWTEhGRkVJSENDRUlIVmdSTVBVUktRWVRYWlxUYeDZ3NHMy83Jw8bHxcbMy8bHycrMzM7Pyc3X1d30bXp7XFhUT0pGR0dHTFBPUE9US0hHR0hGQ0RBRkpGS05XWlNWX1taWlxYWm1cXWVnZWbq0tLP0dbe6t7f4NbT3enh2uLb1NXZ3NjR0s/O3f/q5Hd5e3ZVTlZefend/VRaWU9QTE5FPj9ARUhOWUxOXVpkbfX7Xmhy/d/a0N905u3f0crH0drY3tLIxMzd1N3l49/d7Hr+cXbu3OVbWFJPW2ZfVk9MS1Fm3t54ZFdMTVxnVlBNSElOYG5gXVFQU2Ltbm5dTE9V7trv52ZbY+zO1NDM3uLe0MfLytL5ZG3b3ebX9mJt6tDS1NtmWlh9615sVkpKU/rj3+JcTkxd92J8e1pKTV5r999sT01b8O3Z2XhXXPHXzsvS9F1919rXzc7o5dbQysHDzeDb0NLOycvpZu7t4NHP5FBJUFZaUE1LRkpNUm3xcE5FSU1YX1tNSEpITGji23FQV2nu29TfaXHr6dPMzNpxY2rx2s7K1/P85c3Hx8zU3fz65NnV4vFub93Uz9Lj6mhs49bVeml2XWzf4N/9WlBSX2zzaltaSUpba3pqXUxFU2NeYllaUVB23dbn6+pj9tPLyczM2OXOxcHCxsvc4djPzNLQ3nXv1tLY3OJeWmh85/lqZVdV7dfa7u1XTlVj5ODb4mpeYPzd5d5nT09QXWBdVktNWGnp++huWWtw493m5mNdYm7W087O7Obb0srJxszU2+XY1dnga2l4+t3e2Olv8OrZ1dzqX1RUT1NYbG1aW1dl6efa6G9qVl5fenBXWVtgfebi5nv68+Db0c3o8/xv7tvPztvg6+bY19Ha6ONtZnf27WxoX2vo3djd5eNzc+Hn815RU01QX3Dk8fl6ZuDX2trtcFtTWV9nYFhXV17w6OXf2uD43NHT0NnwaF707ePa6OVma9zf2uDmclhyZ2J5XVhWUF5zbvT0bFhm/HDs3G9VU1Vd9tzl3mNk5+jc19nuXFtcWWppb19t5ufY2dHZ+eXj1c/a0v1c+fzYy8vM4enu3c/d0+BfXE9YXmZ0TlVbV/tjXmVQVlVjd15jTkdLSFNmd3xbU1Ng2tPR23RnV2Lp6tz6Xl9e+uTf3+zq/ejV1tTgbWRn7NzT2utzYGHk0M/W4mxZYHfn5PBeWVlf7+b5bmZbWWzn7m1WTEtMVF5iXVtUUWXg1+D+cl1XWF5jWVJLTlbi0dfY4ODo1snEydp5X3Df3Nnc5eFufNnOztnqdmVt9+HeaVZOTVlfZmNYX2Fr4OPraE9MSFlmcnZXVFNRbePe3fJzWFRWUVRPSkhETF9t+nL2bl1mX2tyWVBRWeLc5On27HLn0MzGytnhZ/ZuZnRnaFhe/erj3Onu+vPj8ub0WlBPWVxjb2xpXmvZ0M3O199mYFhTXFtWUlNcYWbm7PB5bXVdX2JfWlZjcOnZ29/t7Nrb1dHa52tubXfi2tryZmVjb+fs+mNkZmV4dWZTTU5MUF9u6Ofw3N7Ryc/f+G1pVmZ6bGBWXGT+3t/o2uj5XmPuZVZOT1ZY59nh2vdsY2nb4nX+Z2dbY9puYGRZVE9kb1p29mxfc8/V3eHueV7q0/7f1N/e0sTGzc3U6mJe63Nu5/pcWtzbfu/k+mds3t/q9XhsaNTL2tjP2vv61Nnf4+fvW2rr/XxnXE1FUVNOUVNfVF/h7vhqXFhSe/B6+Ore8OLJy83KzdXu8et9cmljX1Vq7GVjaWVbXXxua/d0aGnp2u3u5ebq39jZ59za7+nZ2tjW1/BmXlhhU05TUFz45eT07GZRWl92aV9wbXTi0s3Z09Ln4ODX5XLralxubury59/+39nU3fzmZV346NTb3tru3+3a0NzP2ObX187X39twaWVgXVBaUklVYvPZ4Nnna2hfb2Bt+Ftr59zNz87S4uXy7vdob19cZVldV1piWFRUV2xncGRbZ19q5tvV2N3Z3drZ297o2drcz87Z6P1+Y1hfZ2xjW1tUY+zh5P77dXXq7ePn/Nzc0MjIxcrO1ODb1OLrYlpaWmVfdmlZUEVJT09YVFdQTFRXcu735f3q1NrQz8/O1c/MzMrP2P1493L1+mVWSk9WWWFfX1VMVlxs4uvhd3vu3s/MyszU19nY2dfS6fT9/dvV0utZUE9XWEtPVFJSSU5m6nJTUlhleHXl3Od1XGje0NHme2ddbPvp2/n+b3bc0NXsb1xeZn3f2uHvenjj1NDT1uL0cObd6ONpWVFRYnJ96/ZrXV1pcv12XWF05tjZ3+p6aGR5efDn4O1r6tff2+dnWVBWUFBdV09OTlhsc2JpW1VeY2vs7Hht8NfUzcvJzNTZ0dXTzdx7a/l7/OrwX1JTWVZVWltOSVBQVF5pbVdXWmvr39fc3dfUyMTEx8/X5O7i6uDxXVtbXX50Y1pOUVBPTUxPS01SVnHo193r7XDj3drO2N/l6N7Y0tTo82RkcPp2amBaWFJVV1haXVlcZl1ub3Lr7efVz87Y3dja2tje1dPb3WFh7vNxamNrWlNSTVZaXmFZYmpnXmP89u7uc29qcW5qbnN77G90XmP8+X5oa/91ZGxaXVtaaV1eamp6bXfwe+Li7vfw6+n0+une4ebs4tnPz93o5+39fvTZ09bU19rX3d3p+fJwd/tt+X5pYltecF9kXFBZUlBSUk9QS0lHS1ReaWJraGJv5dvY19bX0dHUz9LSztva19na5u/uYFdKSElFS0lDSlpua27k1uDe1tLO087O0szIx8rJw8jO29nd/mdRS0dCQj8+QERLTEpRUVFYTV5hV3FqdfNy2tHU0dfMyM7HwcPL5epeUlFPSUhPV2vx6d3l7uXc1tbY3nNZWVxkZF74/Grl2s7Lz9xdTE5RVFNPVU9VaPPZ3vR7X/3a2M7Q2N9zb2b+5OnucHro3c7P1+9ZU1BTU05PUlNeZ/3b0s/X083O09bW3/5973BgfOx1cu7X1+d4ak5IS05KS1BUVk1RaHvz/Ohz7Njf2Nvm4vTg2+TX1+zo6trV29n5XFNRYVhPWlNNTVRjd97T1tvVzdLPztPW7uXc7NXQ29/z5+Hl819UU01HR0ZMTElNT1lj7tbZ59vb18vJxsjPy8zRz8vFyMzLysvM19ngaVdLRkA/QkJDSVdbZ3BdW11obGry8GNZUlReU2z179fUz8/d3d39aGhhYFxsbl5ldvro8W5lW1dnefPm8ev+a2x0793a1c3Fv8bIydXQ1NfR3N3Z7OnY0s7Q2tx0a/9z72dYW01MWFNZX1heXF/j5m1fUUxKSU1LTVleZV9h8/fm7PPo3N3Vzc3LzdTX3dXLyczQ1MvMztToelZJR0BDSEhOS01YW2nv5drc1M3KxcPEx8vNzc7MyczTzs3R1PptWElFQj49PT9CQklNSU5RWm788Oz87enn29ra1+Xf6Ovg3drX2+5oV19lUk9MT1xq2tjj3/3p6PDMy83EyMzM0szP4Nze6Otp6Nvs0+NjfWfv6VhdU05XU2RsWVxRSlZZbt/z8vt67nPz2uXf2ufk5dnMztXuX2BTTVJOUFlYXGVfb15ZWVpmanrh5tzd7efk1M7Qzc3S0dfNyc7Z+VlWVldZXVpYUlZSTllWUE9MTlJWX2pfWVhVXl5lZmB3cnXv3tHO0+X/ZGFeZG5ma/x769rRycfIxsfFxsjL2PH0ZVxiXFZXTExOT1FSZWRXU1lWVlJMVFBPa2f05t/Y2djOzc3Ny8rO3NvZ4u9rbl1UXV9cXFxfZVBWWlNdXVVNR0xPTllf9ntm/N3Y1s/MzNjb1Nvk3dvbe3nm++Xf3+NeYXBXUFlcTUA+RkpMTlpoVFj37ODZ0c3P2czIysbJytHg19zf1tjY+l3t9u3uX2hdT1hWTk9QSkZHWmJQUFpqV1Nld15m7nhfXXHicWzq6Hxi9dLe6e32Z2Bn7e7u2c/Y2NfV1dnP1N/Z1NHQ3N3O2N3b2d5xYnxhYnP3/V1TWFNLT0lIRk1pYVpgWF1YXuHX19fb2dDSzc/Z2N3cz+jm4HXxVExNUldLQ0A+QEZHSk1NVldYfevl7+Ld3c/KyMvMzc3S38nAv8DO7HhZaF1UWltkX1pkbGdcWW5iXOfk7O73Z2tfZe3g2ebc1N7n7l9SW05VU1NnYvrX193d1M3U2Nfh8GNiblxgbF9YUUlLRUdUU05NQUVGQklOUF1t29Paz8rNy8vAvLy5uL3Bx8rLzsTAytHazMnV4vhOR0ZFQjw7QkA/QT9HS01WU01QTVNZZ9/i+Wpy2s/Wz9HKxMDBxs7j63JhX2fs3NjgYlpYWmd2enN1b1xZbG1yevvr3dTO0tPR0dd1aGlk9flfWlpfe+rZ19fZ6+be5tzd4N/qffBvXlxeWkxKUF1rXVBLRT5ES09TV2f59tPPzsnHv8HEv7u8vsHEyc/OzM/O3O91XWR6W1RQSEE/QUBARkpPT01QZm198unyfe/i5PXx6WxuZ+bY4trR1dfR0dna3tva3OnZ0NDXz9Pa3Nbb5OLm721iX15jaVtUVVpWWllv5+Xbb19kVF5fVFhTW3p34upu8fJz6/Dh2uPf5/nk6uXa2c/dbf/s3tXvYlRKSEdGSUVGRUFHTVZfYPn0b+HZ1MnLycLGxMPFwMLBwsrKx8zQfFhQQkE9PD08PEE/PkJDSk9QVWpv8NnQycvGytTOzMnDycrIysTG0c/d9fRkW1hPWl9dWVNYXl9qbfXpeFtdVldXSkhEQkZDSlBb7vZVVVZgdV949mjn08zBxMHAx8zLxsHGyM/d3/hk+GBfW0tJRklaT0VDQD9ERlJQUF9WWvvxzszR0tvd1NXKyM3Cx83MzcTL2tv3fODb5vlWTklDREJHTklKR0dJSEtQSUxUUltXZt/u7PR23NDOysrNxsbKztHP1uvtXE1UWmzzYfRvYOHd2Nf83f5dfO7f13To4HPp3M7FzMnS5/rwbe5aVV5kcXR82fXz4uje1dLFy9fO6fN6WV9dTk5IRU1LUEtBQj0/R0NJR0FJR0hZYX35auTYyr+9vLu/vL7CwsXExtfVzMnHydDPemltbGhUU2BSTUlITk5JSkdKSUpOV11sZ2pgbuzl2Nvq5N3S0NLNzsvQ3O7r5dne6+vu731kXVteXFxfaWlxXlZQU1diW11n++Xl7G9qcXBlbmNpcXby6ODT1c3OzsvN0dHX0tPX2uxv/WRkV1VXUk5aUlBPR0tIQ0tJVnB239/p2NbRyMC9vsC9vb6/yMTM4NPR4fFecFxZWFlYT09PTEFCREBDR0tMSUtNSktNX2BXXWh2a2d7a1p73trYzsK+xcrJx8XEvcPMzsrFxcrIzNrq49roZ2dVSkdETExITU5QVE5QU1rk2/b5bujubObc4tjYzc7a0s3d9Grf0tnXz9foXmFuW2zg8FtKVmhWU1NWTEZIUEhDSlBOTFNw9eDUzcjJx7/Dwb29v8jMzc7W19Pe4ezcbl5WVUw/PD0/P0NMSURFTFZcfdHMztLSzM3NyMnNzMzP3Pbe2+Z+Y2R9aXF7WVJbY2RleuVsYFBTZmrp1edwZVdXVVJUTk1GRE5PYXRhV1ZhbvHo1tTOz9DLzcvIzMzLzszP0M3c4HlcX1ldcGdVTkxQUk5aW1NIP0NGR1djZVxQXW127uvo6XH/6OTbzs7R1svExMjHxcXKztHc29zjbVhSUk1JR0VEPz0/P0RLUE5KTFJbX2zo331wdt7QycDHzc7OzNHd3OV0Y1tjZ2b7YFllZ+vleufuZ1lPV2xz731pdGj03ezd4vTyZVhietra59ja2c/Py8rNz8/T087O2337ZllZVE1IQUA/Ozs8Pj08P0BCTFdgWlpse3fx18jJyL/BxMPBv8bOy87b4t3O1uva2+rj3NXgaGdsX1de9H5XWF9RUFVlWlRVV1FMS1dbWllkXmb+2NTe6dzg7dvT1dTOydLb2c/W7HF7cFtae3ddWV5eVVNkYlpbXnlsW3NqYF5kdmpp4dnka1197/nk3uXi3NTS09XV6P1x9PBtfODo7uRmWlVVWU9LSEhNSkxfXl503+Dcz8XEzc7LycvLxMPO183Ky87Kz/VXWF5VTU5WTkdMUk5OTVZUSklRTkxPVVVQT1hZW2J89m5fa3dhb+zk7t/OzcvIw8PJxcHF0NjS1+v63t/n4t7caFNbXU5MUlhOSE5ZXFpf7nby2MvM193e4+zq2c3N1c7Y4ebo3eD2fGxiY/Hd1ehyXFhWWF1aXFFGQEFHSVRdZldMUFdjc/Hc/15ca+DZ1tDNz87KxcXDxMnV9u/b1Nzc2vtcWVlhb/F+fGRZXV9sZWT05+3g0crJy9v1XVxoan1uYV1fZHnl19bc4N/i4tnf4P5gddvY09Tf71tWXFpMSUE/ODg7PUZNVF5eZOfb0NDVzs/LxMK9ur29wcjDwL6+xsnZb3BSUl9bW1JKWFNRVU1STkdOVlxoX2RlWWt69t3h2nRTXHNx9f99/Vv53N3W0cnG1tLOzcrV2t16Ymh993ZlaVZFRElJSUlPT1NNTE9SWWFw3O7l09LNzMzMzdHPzMzO7HroXFJPVF5UUlppeHPg2u9jbe9oVVp09mJu7tjT2M7M197azNn5693tae3k5PB35NrW2NnZ/lZcZW5nYnF0YllYVlZQTE5MSkhDTEhHTFBdX1vr6X3+29bgamVwXWBod+tu6MrIy83Gxtjc2Nzb6tvP09rP0szN1szR+e3/eF5LSEZBQkFESEtOV1FOTFBYbePY087U29XT09nXzdbg19jb1NTY2fb7YlxbSU5SQz4/RkxNVV1WVVtp/+3r29rcfmX3/vnf2dDO0dLh8eDc297i39ni4dna2eXsfHz9ZXjuX1FNU1lSXndsdG9gfvF42d7saldmaFps5dXO093b3eHe2t9uX1ZUX11w/VxoZlz9bfLX2XxmTklKRE5VUVZKSVZOT2r26mpkcPp649HQ2+LZ1M7PzsfM4N7dz8rJxMbS4PlkX1Zae2FRS0dJTVRqbvb1bmx27unj8GNYV13u2eHa0vb+bXrW2NHK13dv79nZ3NPO4WlaXFxVY2RTSEFFSElMUldOREhLVGl0ZV5QTVtn2svKw8XP0M7Q0crN0NxuXV95/uPY1ONoX2937eTxeVty3e3V1dXOc1rt4NrKzNneXXH2a93Sz+FpVE9NTV50aWJbWFti7dHU3nFPTk5LYF1JRT89REhT5Op2eV9W/m3g0d7d++rl2tPIx8nLzM/OztDM1/1eX1/v3tHJ2WlpYHTg1czS43h6cX3q39Dcel1QTU1QVE9TSkpNS1Jo7uX6Xm9xcdrS1NR98eDdzsnCwcrZ5GxdeepwZFFITEtKUGt87HlaX05Z6ezwaltpYm/bz9PYdVlWT2rY2t7tYfbg3c/IxsjL6W9gZ9zf393x9uXt7tbQ4+9VT01UcG9nYFBNVlryzsrL0e/+5drFyM/U3f1pZ1/g3H71V0pMSlJNS0tFQj9DSFNhWVZJRE5d++Tl1d/t/uLdz8XIzt3obvHd2drQ1dDRz8zHxMfP3O1wbt/g6W5aT0xZ+uLe92lXSUVNYXBiX11bdP3m6t/Zztfg6uDS3OXh6mp+7PF56+vqY0tER1ZeXmViV1JUUVjq5uFsVVNRaG1ZYnZ5cvTo8dLP091hXmPi3uLU1OhtetrTxsLH12tVUm/+6upkWV5l7eHXztxvcP1229Ti3OdWXuvt7tbW2+xPS1BYZm5oZl1VX3Zx7t71YVZRT1p5aF1eWmza5fXo7GFPSUdNVmBsX29pWWLy79rKytPqa/7k2dLUztPYzcnOysjO5m5gX/L0fGhqZl5o9+fdztjuXlVKSlVt+HzpdGJhaezQ5XBhV05PZ254a293383DwMDL5GBZVVjr6ntgXlBMT1Rc9XlWTkpHQU1ZXlJWXV9zed7Q0+Zv/eH32c7Q5/B9fOrtz8vYfmRXUlJk5ungzcvMzMzEwMbP3fv/aGfj7GR6dW3o5tjP7VNJQENHR1VjXWJxY3no0sjN3fddWFZMUVhOTVRPXFxk52RHQ0JAR05p+11bbGP1183Bvs7e6fZ4ed7W19fJx8rJyMXH2/J7dH1v+3z8aHjn083Fv8PaW1BLQj9FR0hFSU9bY/PY1m9ZY2hcVn3s7n3x3M7Lw76/zPpZWFVPZmFWTktMVVNZ8e5sW05NVlBcbGxq8tvMzM/HyNT+XVlWUFhgWVtgW3jc1cO/ydp0XWJcaePc3trXz8rLwsLM33BrXlFNTlJVUVl82d3XzNnzbllRVFlefex0aW7l39HFzOZsVU9KR0lLTElNW/H03c3PclJPUk1LTFNdUFrv4NHIv77N+mpYUFBKU2hba9fMxb26u8fJyMrX8WlYW1VZ8dfVy8nM3WVTUkhDREZRVEtb7uvTzMjM1nvtaV9dZ+NgXWbc1dDNz+L+XVdTTUxMV1hdbN7d2s3L0tr9W01ESUtLUmFh6e7o2tDU7V1QW1VMUV5o9OzZysK/vb3AyeV8bFFYd/Pf+Wh62c3FydnabFtRSk9aaXn+6t3NysbI1uV2X01DQEhFSk5ITW7m2NDRy9PtXkhHV0lZcF1b49LW0dXV5v9WTEhHSEtPTlRx3N/V1c/Rzurz8uDX7NTW087LzsvIyczI21lUVF5eZWL159nX4t/Y6OpvTU5HRUtfbG5x3+D61tLb2HFIR0VCR1Fcau7b0c/IxcbFxddqZVJYWk9SXXfz+fLma19bTT9BQkxUUlNWanjp39XS0dTrUl99cuzr6tzT1srLz83N2mhQW3xmcWRb48/Ty8XCx8vN3nFlXVZSWFZu3ez84Nr27el9ZllNR0BBRElVWWre2OPZ0tn1XFxaW1VZXVZSUl1xa3zedlRNTU1fYmd6Wmhv/d3b1cnT4Wxedubic+bk4tzPx8C+v8jYfV9dZPZdfPZzb3vn3tTV4FxSTkpKREBFSUVOW+rb1tDc2+12Y2xqbWx+eXPt29fa2erd+WVXU1hWVF5bX3VgY2nr+X1iWFlUXF9oZl5y7ufq3cnKz+JZU05HSE9ne+PY0dPKv8PFx9vf4WtoXVtaYm7t4NLDyc3K1H1nWVBeXk1PTlZgZObm7uF+XGxpVltZUllXZOd37PJs9F5a69psXl1QV2Ft6+jb5X3i8lpVWk5UY05RX/rV0tne9N7S29/Q2dbU/2R73czLy8XJy9De6NXa7ezk9F9XXWZzbGV3XlVX/m5eWl9s6+n16nBkWVdLSUteYF1pbmR+ee3P0szV0d18e3RiWWv3eGjo3dDO1W5wUkZHSVNPT1FJSU9SZtzP19bY7+ja1djPzdPO0NjPw8DO43VQV2ts+uLkbWVda/PTzN/nck5QdPTg2dnn+Nrd69zQ2fhtT0BGR0VNTEhJVVhYY9HS+vFrbeTe7NLb9WFgYlx429f8e2VeWVRMU1xZVFteWWNz5e/w6dvVzM3HwMXLzNLWzcjEzN7n5O3pfu3Z6VpcW1VcYO/rfFtveGxoZ+nyW1tqZHDs5Of6V1le+tnb0d5eVlNJT2J18fFhX31r5eDV327+/mVf8O5kVkpKWmJy6NTP4W5gY17s2NviXVZk7OTSzMrMzc/V29LL0NLd3uPd69rN1Nvl3uXy68/b8Whfa2tm6M7Z3f5iWFJRZmhcXFVZWVhfb2z4fXFbWmJveW1hUFBUXGze293ia1lccN7W4O5jY2tv6tLO1dff7nl66OPp5Ovb1NXSz8/W19/78eXd4/HweHNg7tPLy8/N2l5aWVtXUFVMS09UXnLufd7efHdqb3Np7XVjY3p1euHa1N/8XVpm6/J9c1tYYWBp7vTa5mxeWV1oWFdvZm7t5uDlbuX8XFlXVVJacP79cGbu4tPT1M7d6t7m631n+F9R/OD13ujh3PP87X58b15ZXlxh6m9xfena3unse3Tf6fDt6ujoenpqZXZeV1heV1JRVlti+9/p5+3q3fpvbGdgUVFVT1pdamx8/vzbdVlZUU9MS1BSXWXk3NfW28nNzMjMz9nl4e1vb37683zw09TvZE9LSUVNVU5RXVxp/n3d19nZ0dLO29ra49rS08vM1c7Z5PBoS0pHSExISVBSVGBp5NvnbGpeWU9MUk9QZ2Vu7fjb4d3q29LQ71daUk5TWl17ft7c1N3o9v9+b+Tc39/gcPP3+n3x3t/p7ej76ftrbWv+2+Di6+73efH/+m51fOj5aWzq6vHYz9XqY2FfSUtOV2F2XV5nW1xRVE9SWlxXU1BPTk9aXWrfz9DV19Xr9vXk1s3M1u3f0tTY5uTt8l9cc/pkXHxueeHUzdP0bmRlY1tcYnj85H13/mzk2dHMztpvWklJT0tISU5bX2jm5XV1al5969rYaVtiYGdn8uTg6nx4WlVVXllcbWliVVBe6d3e4Nzj2dXl29rz5+De0MrHyc7fcFteXF5p/uD4ZGZbXHP57+TibF5aU1NSUFZeX2189+bufXZtb+vq8m1mcGlgedva09nf42ldYWVp+d7V0t3c3dzf6+/6alxcUUxKT1ZYWmXi0MvIytTfZldeaVtn6e10bfLZ087Jxsrde2/7aV5dY1pXa/J1XVtSTVBmdvJrWV5YVVVY8dTW1tLe/fbe1t/Px8bIztXQzdDd7vZ0YlZZXFdUUkxJYOzx8GhaVVFUT1dZX3Lh3ujfzs3Qx8PCwsfN2OPhff3d5t90YFdaXVpPSk9WWHrmfvZy5Onr1tTV3PRjZW197NrPy8zNz87LyMrxb2FTUEtHRkZLTFR029jQzd3i3dXa7uXc4u3r6d7X1dPR19bX2vJXVlBLRURLV1VSVFdVT1zq5d3S09Xd+eva09DW0NXe2t/kdd7SztHQ0N/mfnZtYG1cW2JSTE5QUlhp3tzbzs7Ozt3s8eze3+jr8ejX6mz66Nzg3uppaObiZ11WXmt6+mBcWFhXUk5PWnxrWWFkannZycfIztnw6uLo6ebY1NHO1c3KzM/Z3+Dj7fFfWF1fZG7r3NHN03t972RYV11XV1RTUFFkb/ve3dnU3Pju3NvoZHDreuzpblheZGFwZm7f3edfV09RU1plXmJcV1VOU2/g0s7OycvWzs7Nys3b4O9zaF5fT1Necmtl+/f2bmBfau3TycrP2OnufODUzdHf+W9mXWJaVVlaYG1laf31WEtJTU9ZaHBpfHVSWG7v5NzR2fZ2ZV5w7eDm8/r6797rZXltanr5cFhRWFdQWnLm3M7L0dneZ15pc9/b2+pgWmJdbOvf29zU4OXRz97ueHloYm5cUE1MRUJESkxWWllbVU1MUV1+797taW1v793Wz8vNx87f43r8Z1NWVlNWWFJPTEtOW2j46eB4X2FaYPDTzM/Pz9rm6djNzeX9ZF1dUE5KSExMT1hcYnlgX25n4NbTztXX4WJWWFFaXl9fW25nWFdZXf53d/n64eTt3fB24uba3efobF9kW23q9t3hamtqV1ZNW+b25exlV1JWV1dnZ2z7ePv+ZWVod+nt5Njd+WZZVU5XXlljZltQT2JkX2fsamvs9HRg79fXycnNy87T193ncmdwYllmeGFbVlRXa9zf9dbe821UT09dXVts9Xt9dnnq49rU3trO097ucG1t+/1l6uxkZVlOTVZt8GVcVkhHRURLTk9OVnl3d9zc4M/Iv8HBvcHJytjf3ubq5tfga/32WF5nZWdlZWdUTlFNVl795NjR1dbU1trQ0M7Q19jsaWNeX2trY2xvYl1YU0xMVF9fYfV1XFxYT1FVUVdkXFJVXFtt1czLycXDx8vQ1Njd3uHj6uro+Ht7+uXi3dbYc1ZZWmL8evPe3dfS0tLS087Pz9LOztz++v5z7XLz1t96ZVJLS0xTU1JaW1hVUlNWVVhcaGp55ePg49vMyMrDwMLG0OHvfG5eWllQWmJfYWJ02tvbz9LT2fB4amL76tvQ09nc4u3e1NHa1NPU1N/t8/R6en52berxa1ZLUFtZaO1uemxaWl1UVl5aUE5UVVtffN3NysXDwsLJzt3vaXBxbGpoXllRT1liZGlkV2BiXFxbWWd36NjQx8LDycrIyM7MytDZ4/rzcGNw8V74Ulx1SlpeXmTv+Pfk3v5jWU5NU1NZXlhhWGDu5dHGw8PIzMzV3m9UVlJOUlhhZF1n//fc29zgbPd4aPlkY/N2/vn79ejk3vfrz9TPztHQ6W1nX/rv9f9kV1JMTVNOYvxnbWNodF5aUkxTVFNd+t3Z39jOysTGxsbJ0uZvXldVV1VRUlNUWWB4eO/r+Pb2el5ZY2RkeeHc2dTRz9rd297Uz9bW3elyYVpUU1NZUlFRV1ZSW//093Vu73liVU9OUE9UU1NXWG/069/RyMLBvb/G1PDw5Ovu+1xoYFhXWF12evv7Y+9uX1hQW2Rf7t/ZztPTzdPRy8/N2NrU7l1QVFxbW1tSUU5JS1FNUmv0fl9qaldNSEpRT1VVUmVhXnf/48/KyMrMyNHyXldYZXl3Zmt+Znnj5eDOzdfh4OhtWFReZnx+//Pf6O/n4/zlycTJyMjV6mxx/uPb5P3/cFVQUlRRXmVZUFZSSERAPz5HSkxPWF5fbPjf08XBwsTH1tzr8nl9521eXm9fZF9fXP3e4uft/F9eT01c5trR1NfX29nV1NDHzM/Pzd36alJPUVlRUVFTUVJVWWry83xpZVxPT0xLSk1LTU9UX1ZTXmJ91s/Ny83V3ur47N3d497o9Xxv9urz9WVcXVtaT0xHR0lMV2Pm7eHd2NjSycPAxMXLzc/b4ejv7n1tal5jXVBMS1NaVlNQUldLQD9ARk5PZGRc/vXl1MrFxcbCwcjS4N7wY2VyYV1bYVtSUFtmam1kYF9kU1BUUlVk8+Xr++Ds9uHU1NjX2dbS1uT18Ovp2dbea25+XVlcY1lWY2RcVE9IQD4/RU5YVlBicVxn2crKxMLFyMzM0d7u4NfV2/Fu6PR5bWxdV19aU0tOTEhJUGXi3+Dd3M/RzMnKzMjGys7Rztp+Z19bYVxaT05LS05UUEtYWmBdW1ZSUU9TX351cHv679nOzdHJxcjHyMrR2dfT2tTU397p9eri8GVXdu9q/flfW1RXYGne4vjq697c3dTV1czN0c7Q1s/c4HhndVtPT1BOVE9MTUxPSkpMRkBDSk1OU2Fga/vXy8jDwMK/v8TBxMvNztXT4O18XGNjWlhUVVlXW1tqeXBneu/k4vDe2NnQzM3NzsvJzMzKyMrNztXf3XtaWk5MUFBXU1BXWF1fWFBPTUlGSk5JUFFJUmX8+vzZy9HNxsbExMLCycXI1NXc8N/j7nBUWVFITU5NT09OTlj1YVfy9+LRzMTEwLu+vru+wcLM0t7d501HR0JDSEdGQ0VKR05dWFZYU1ROUlFOWl1k79rV09XNzM/O0tHNzdXW19nwYF5aU1xoZmpoa2NjcnRgY15eYWj5bGpv9u3c2NXPzszHwsC+vr/CxcrU4W1WU1ZUWVFKR0ZEQD9ESUdGRUdHTE1KTl996M/Fwb68vsLBwMLJyszU3N1uVk9RUEtIRkRFS09UXn1rbPf4c2vs+/vq2tHQy8vOzszOzczJxsfK129mVEdGRkhNVlZYXl9dV1ZXUU9MTUtHTExISlZhav7638/MysS/vr6+v8HFxs3gb3Xva11NRkVEQEBASUtLT05PWVlSVmDp1MvEwr65uru7vb3Bw8XO3H5PRT8+Pz4/Pzs+QUBKVFtgX2JcXWZnamps6drVy83Uz9zk4dvTzsrK0dLbblxVWmZr9+xlb/J8dHV5fez9a2peVlJLR0tSWV1lY+LX1MzGv7y9v8PEytXnZlxeW1BKRT48OTY3ODo7PDs+QkJAP0pY59LMwLy9ury/vr6+v73AxMrrXFlORkVAPD8+PkRESlZlce/4697b3OLQzczHxcPDycrQz8vLycvY+G1URUA9PkNIS0tUU1FYVlNRU1dfZmZjXU9IR0dKUE5QWl50/OrfzsfDwcC/vb3BxcnL1tz5YlZNRUA/QklKTEtNTE5GSFBs49fJxb68vLy+vr29vr/EzM/rWktGRT8+PTw6Ozs7Ozw+QUZJTV/27uXez83MyMvMy87T1Nvb0s3P4WheVk5MS1BSVFpTWGBmY1pceNrZ2dnb1+RwXVxhX/rk5NfU0M7HxcPCx8bFwcLIz97f8VxQSkRAPjs6OTo9QENER0hIS1N74dTNycPDwsbIycvHxMTFydDW3G9cT0tMSkdGRkBBREZLU19d/d3XzMTFycjDw8TGx8bHysrKzsvQ3+tqWE5MSkpMVE9NVVxUUElGSEtWXW1pZVxYVFNWW2ttft7l6+Lcz8vIysbAv8C/wMbT6epeUUtJRj9AQ0VHTlJTX15WY/7x3M3IxcG+vb69vb6+v77CydDcbF1SSkNFQz0+PTs3Njk7PUNJVnbfzca+v7/AwMDCw8PL0c/X5fX5XVhYWFhZWV5faf91cHb+dPTc2+TWzc7S2N75ZV5bZPLy49zc4+DPzNDY1s/QzcnKzt3icFhZUEpHQz4/QD89QERCQUNMVF1239va0srKycjIxMDAwMHDxcvM1eldU1ZNSUZHRT8/QUFGSE1k69XIwcLCv76/wsK/vcDBxMXIzs/Z4WpVUlFQUVZTSk1STk1JSEhHSU5PWlhYaGtlX2Jlbuzr7eXv6d/f9vfzfObW1MzL0drY0uf36Pb26vpuZGv9+HhnXnH6euze1NPcz8vHxMLAvr26uru+w8bM32hcT0lDQDw7OTc4NzY4Oz1CSVZ76NvRy8jLy8rKyszN0dXZ3unwWk9OT1NQXVxXWl1zbFpaaPPt4tTPzMzJy9Tw6OPt7t/V2t3Z0szNz8nHyMzLyMrP1dDU815cW1hNTUpGQD0/PTs6PUJERU5ebnXt1s3Oz8rFxr+7vcLMyszjbFZYWElEQkJDPkJISUhKWWFw28zKzcvGw8fIx8PBxsnGw8bJy9TrcGdvXVtcV1FKTU5MSkdLUExLTllXT1ZjXVpXYu1vaGFfXVlld2tnZ3f/YWb33d3o297d4fvo5fN+cmpZXWleU01PVlVPVVdmXV/19OPd0MTAvru6u76+vMDIzdbhcU5JRUA9PT48OTk6PEBAR01OUWzZ0tLSzszNzs7LzNDN0vRgV1ZZVVBRTUhFTFVQUl1qfnvq1M7Q0MzO1tvSzcnO3OR0W1r85O7059/h59zQ0NbY2uL3dmpwb1pXUk5HSExDPj49PT9AR1BTT05RVl/x2MnFxsTEy87Kytvt8v92ZFhbWE9KSUxLTlBYZFpccHJ+49PMz9DQ0M/T0crLzszKz9nR1NrY3N/kZ1hbWlNLTU9PTk5VXVRKR0lGREtOWGBjaWJeXmju5Xr09Ol0cd/c7P56bGBj8PPj4+jp/XJ26eVnWFpZVlrw1tPh5+rv79fOyMLDvru9vr++xdXc5u9vZ214XUlBPT4/RENISURDRklKVmdfXGVvffPb1NLU2uP5ZmRhWlhMTExLTFBgXVFPV2Z449DHwsrS2OLj3dzRz9TZ2tjb3+F6am31493UzsvGyc7N1M3HyMrO0NPg7+/ub1REPj05ODo8P0NCRUdKVmbi087HxMLBwMDH1fZaVVBUYWJfWU1HRUZMUlpaXF5aZ+TOys/Oy8fExb68u77DxMvR09LS0+v8ZlxcXmxnWlNLTFZdeefY3OZnWVxeWFdcWVZVWFj88mpiVlFXWGf36nRbW1dVWm7e0tnX0dPV08zM1/VcVldUUVhoYV9aWF9tfefT0NPQycW/vby+w8vNz8/OzM3Z3vhgWV5iY1xPSktHREhKRkRISU9Yad/Nzc3Mzs3Nz9LT1/ZfXE9OUVBMTk5LTVh639fW1Njh29TQz9LP1Nnb49XLzt3b4e3z7OPRytHZ3uTm2dDOzNHe2d3o2tfqaFxMSEhHRUhFQkA+P0ROXG7v6+PR0s/Hyd3h7GhkXF538GBaXF9cXG335flbYn555d3ifuzn4drV1MjEy87PzMrJy8vLz9vZ393R1ORmamxyeP3gztDc5+VvXWBZTUhEQkhEQklNS0lNV2b79uXU2uHs8Hrl1tTY2eX24e3o3ftlXlhZWFthd3FhaHRtauTV0NHQzcnEv7y6vMPIy87U2dfQ2P9mamFcY21rXVNOUk9PT0tFQEBDSExSXG9tZXF6dvPa1elzYV5cUlpiVklGS1JYXGPw3ufm1M/Qz8rL0tjn3d/x7O5mWFlfcuXe2dHQ2t/W0c7Kw8PGxcbDxcjKzuFxaGtfV1JMTUk9Oz4/PkBERUVLVOzf3s/Lz9fY1Nzu/fjuY09OU05MS0xLS0tTZmJlbGtebPDp3M/LxsfMzcrHycbExsvOz8vQ4OLh/V1ebXN0bXDp+m9s5d7o6ftpU0tLTUlEQkQ/PD5BR09YYG5oZXT3aHh4a19dZOfidF9mX01MUVlXWVlhZVdWaGxgaW5vaWru0MrLzMfGzc7KyMrKycjM1d7Y4PD+cWFbZfvq+GZdXU1HSFFXT1ViYldPUFlXW2t5Y2Bm9P1fWFlcUUlMVlJSUltfWGN79O7r399tcPTc2+jk7GpcWWJxbubQy87MyMPHzMnIy9LQysfL09re919abWpfXVpWS0dISElIR0pGQUZNXGVt5Nzg39rR19zc4mxbXWNZTEhIQz09Q0pMT1dbWllc7d3Wy8jFyMrGxsjKy8rL19vc4d/xemxpeXvo3d3c2dze18/Ly9DV1etlZGdgW1dRSUQ/PkNCQ0pRW1553dzl7urj9Hvs5+/8al9XU09NUFBQV1hQUFNWVV5z7eLp4tza1s3GwL6+wMHAwsC/xMjKycvU3O5uXk5KTk9WW1xbVVJNUFRbbnxnYF1cYVtbXF1eWltbVVFUUUlGSU1OTk5PT0xOWGt67eHm6HFfeOnd2NLN0NLY4N/h5+Dg39XMxsjN0NTQz9TNy8rKy8/T09LU2dja2ehwbWRdV1NQTk1JR0dFRkxdZm7p4eXi4OfseWxkZl9dV01IRD8/QENHS1BVW1dYYfHd0s7MycTCxMPDxcfKzs/Q0s7LztfZ2tfX1tLW5PT86tvY0s/Z3u/38HBsZ2BfWlJSUE1OUU5KTFRgcfPxcV1ZVlhdYml2c1tWVlVTUU5PTElJSk5WVlleXmf72tXPysbCwb+9vL6+v8LGyszN0NTV1tvsfnt5ff/r19/k3NjQztff5N/c7W5oYm/2cWZZVltfYWBdW1lWUk5OUldUTUpKSk1RW2JeVFBUXFtZaHr37Obd2NDO0dfd5NvPycXDwcLDxsfGwb2+wMbKycjIzdXg6H1iX2v2+WVUU1JPTU9TWlpZXmp65Nrg9GddVE1KSkpLTUxMSEZGRENCQ0VITFBYYGdpcnbl28/Iwb+/vr6+v8DAwMLDw8PHzMzMzM7V3N7g2NHPy8vKzc7IyMnN1eJwW1pYUk9JRUA8PDw+QkRHSktIQ0dKUFFTVFZZWmNgZF1RTklJTllod//j3+DSzcjGx8fMzMfBvr28vcDEx8jHx8rO0NPX2dba83BnX15cXmNkYFdNS0dBP0JJSEpMTU1NT09QT05OTE1NTExNUVRZYGt47ez46uLe5N3Qz8/P0dPRz9DRzsvLyszQ1tbQztDOztHc6Onrc2BWUlZWWVpcV1dQTE1MT1dbXFlVT01RWVpUUlNRVVJXZGBgaWtramVw/nZ3ee92/t7c3/BuaHXx5NfR09HO1NDS1dDQz9HV1tnR0dng621ocmppXlRLS0xOUVhfYl9cXmhhXW/y5vJqa2tgWlxlYVtlZmdvcHj18fDp4t7a2uPf3+Dc2dnY2eT1+P1mVlJPTlJTT1JSTlJZZW5qavPzcfLh6v1s/fV58fDh4/ZnZ19dZffn5N/l2t/d0c/Qz87R2+bg4OLi3eHsbm/q3eN4bHJwVFFRTUpFRUZFS1BbZ1pTW2VdXGzr93hxeHBeYF1bYlxbW1hhZ/rr7u7d19fNycjLycjHy83Ky8zO1NTd49vZz9fg4e5sWFxoXlZZVlRMR0dGRUBCQkBESEpOTElLSkpMVVxdXlxdVVBVXWFpbGtoaO/h18/R0MzIysnExsfHycvP0s/S1trq/mZ56NfOz9bY2NjZ1tTi82diWk9NSUVBPz49PT9ARUNAQkRCQ0ZJTk5NUFlaXmpvfvLo3N3XzMjBv76+wMLAwMLEyMvLzM/NzM7U09LX2tXOzc/Y3ep5Y2ZmX11TUU5JSUpLTEdJSURDRElLSUhJS0dER0tMSUZJSUdNWWhtZvTo7ufSx8XFw8DAw8TBwMTJycnLzMzNzNHZ2eHw/u3i6unt/f5nbej0ZltdXl5y7unicF5kYVpWX11TTktNT0xPXFRKTltUVvbj29bg3NnZ2tjT1dbY1tDS1M/O1Nna2uDWzc/Oz9nd2uHs6Ol0aGRpa2JoZ19UUlFRVlpfXl9cU1VSUFZgcnJr+Ovh2NPN0NXU0tHSzcrL0Njg3/pkbHNlWlx7bl9u9+h4aW9rb23f1dzseHv9ZWNvb2pbYHZgX/75dV1WWFNQWnBxZl5cbXBeafDl397Yz87Jwr6+wcPDxsbDwsXL0dbX4PDj3uV4e+fxc/ns8l5RT0tHR0pLSkhERkdCQkdHSEhNWlldeuXh9XXu8Xbt3NnY5P3p5e3k3d3b2MzKzMnHyMnKzM3S0M3Ky87OzczO19nc8f176vFmcHl1aV1bVEtLTlBNTE5PTklISkpHR0pPS0xTWl1ZV1hWT1p92NPW0M7Q08zIxsnGwcLGxL6+w8fFwsjOzMvJzc/Q2efp3t3n8e72a1tdXl9TTk1MRkNER0hEREVHQ0RFRkNCREhKSU5VVFZaaHlq/N3R0c7HxszMysnGx8jGxsnMy8nO0tDOy83Ozs/X2dTe7+jsd2ZfX1pbWVxlYV1eY3VtXF1dWFJSUEdFSkhJS0tLS0xMU11YX3X36vH54dzf2tDN2NrS1tbT0tDPz9HMy8zLzMvKzM/Q2OPw/l1OVVVSUE9OTU1MTVpdVVZRUFFTVFdVUVVkWVRmbXb+6+Pa2ujc0Nnf3d7e4+Ho5e1pbvhlc+nz7evu5t/p7t7g9nJrbXJqamBcW1hXWFln9nt77+rq4HpncGpbWl1YXF5aWVhTVVtXUlr17+fZ1c3Mzc/MzM3LzM7OzdPZ5OPi2+Tj1trr6efl/G9nXVpOS0xMR0dGREZDQUVISUpOUFVaW19XVVRaXVJOUU1OWVdZZnD73dPTy8PDw8K/v8LCxMXHzc7P2dvW19zm697e4evg5vbrfWZTS0lIR0ZBQ0I/QkVJTE9NT1NYXG1tYF5mcWRXXllQTEpPUVdZZvfe3NjOzs/LxsfIxcLAxcfGx8nP09LV0M7Pz9DW0tPY3dzZfWNjWVFLSUdDQUBAQUFERERFR0ZHR0I/REdBRkhNTUxRXWpjYmvu3NrTycjLysbGy8zExMjIx8fNz83P1dbX1tvf2tzZ4Oj5a2VcX2FeYF1YW1tf9Onx7H5nXmRubHBhWlROSENDRUVFRUhIR01TVlpeYW1839XPzc/MztDNzMnHycrPzs7PysjKzs/P1NrX2d/sfW5fX1lTVldVVlddXV5rXFNOUFRNTE1OTE1LRkdHR0xVVFhr9t/Z0c7O0dPOztfc2Nfe4OLj7u316tzf6Oj5aW576O9uX2RjWVhfeGxuaGBiefPf08/T1tjV0dTS32lnemhaX2lobm5fUVthbeLV1dfS0tjaztHZ3t7a4+vu8uXm/mpeW158+3VwZmNlZ3L5XVlTUV9cUVpcWVtYXmNaXGlfZV5eZWFkZFpSTk5YX2Rree/n4NLMx8PCwsTDw8DAw8TEyc/U1tPa5O/ue3l8/nJnXFtXTkxLUU1ISkxIQ0JFSEtPWmRy+3ry63r67XVvZ3rtaGR1bWNeaW1z7OfXzc3MysjFxsLAxMXEwcPIycjM1N7c3d7d2tLR1trb3N/w72dZV05SUEpMTEdBQURDRkJHTE5IQkZFREZNS0pNTlddV1pgdX7g19fPzcjHw8K+v7+/vr7CxsrJyMvMztPoeOPj5ebg4+97c3VpXl9lXVZTVl5wZWVsZF9scG92du90XlpZWldPUk9MSEdLUFhbb+zn6tnV0dHOzc7KxsTExsnJ09PX19ng297Z1tvd2t/o6N3d6ePg39/0c3hsa2l0ZmJdX2hjVlZlXFNPTk5PTlVVUk9PUU9RXmhy+efY1NPYz8zOzs3O0NLNysrLzM3Y92BmbX5ve21eW05SU1teWlpbVVld/ePg5fZxbnfp3OHW1c7N0tTT1tnf7HdvcWv87Ofu7fHn497d2dje09XY0dnf5X1nXmVz/HtnX1xgZW1yaVxXTU1MS05UW1dPS0xMVFxja3VcU09ZYWhlbfxrc2/+5tzc6u/7+u3m4dvSzM/T0s/LysbAwsTFzdLb09jk7Pvu919UTk1LSEpHR0I9PTw6PD5BREdPUE9PTVZeaGtn9/Z85+vb0tTY3unp8+Lf1M7a4+zg3drUzsvIy8nJyMDAwcTL0Nvd2NTKy8/W6m1ZWV5hWU9LSUE9Pj4+PDw9Pj9AQUZFQUA9PDw/QURHSlRYT1BaZWtr6NrV0s/Ix8zMycXCwLy6u7y+vb7DxcPJ0NPP1c7N0tDecV9hZWBmYU9MR0JBQEBERUQ/QURJTUtMS0tIRktNT1xod2JYVlhdZubW1d3Z0dbNy8zKzcrLys3MxcHFyMzMztbOy87X2c7O0tLT1dzj+WpXTU9TT0pKSEdDQ0hGRENGSEhJSU5MRUtMS0lObfNnXmV2cnbb1+ZtcXbt39TJx8rLx8bJzMjFw83Y0dPd3Nzd/WNncO/979ja92RiWktITE5NR0lSTlJTVldOTlhuaV/l2OF3cX3r8t3T1Nff083P087O2u7069/Y1szJzNbb2vFqbujhbmJzbFxgZWpcXHl27uzg0tXvcGdbTkdFR0ZCQ0dFQkJEQj5ARElKS1749vzn2tXVzsjHx8jFwcDCwcHFy9DW19rXz87a6fJsV01OUE1KTU9NTVVaVlNWWl1fZezb5mVfWUxGQkBDQkJHVFdYbHNjY/ri2NfXycDJzMTBxcS/vr6/wL68vb28v8nQ29/pfnv38nBhYVdPTEtRUk1LVmtZXGNaU1JdaVpOUFpTS0tLQjw4ODk4OTs+QkxPWVxcZebV2tfKxMbIwsLEwb+5ubm5ube5ube6wMbO2vJdXmhcT1BQTk1KT1ZWVVJRT09WZVhRVF3xYFZTWVlYV1BOSUZGRUZJRklKU3l5aGd33dPSy8jHxL6/vr/Avry6ubi4ubq7vMDL1+D8WFBPTU1KTVZUT1FaY2F74ettaufnX05JSkhGRURDQkBDRUJBRkhISU5XVVRe59vf59/e3dfMysXBw7+/wMDAw8S/vb/FzM3IzN78ZlRPTk9OUVBOUFNNTlNQVWB1bltQWV5cU1BMSk5danjn7O3o5une5/fy39fa3+HXz8/RztPW1svHxcLCxcXMzcrR2s7Kz9PZ2tbW9mVaUE5OTEtOVlpXWlBOTUxJTkxKUEpFR0pBPkRHR1BYYXPq3tTQ08zMz8/S1dji2c7LycrLycnGyMK/xcLDyM/W3OPa4P1uZWBna/tzWlZPRkNAQkdLTk1STkxOUk5OU1RTT1JaY1ZWefdnfO3az8jBvr7BwsPFyszT0s7MxsHDxsPDx8fJyc7X2t3jempseGlhX1tgYG91ZlpPTUlBPj9AP0JGR0RCRUBDSUhCPj5ARExXX3bo3tjOysXDxMXDx8vLzMvOy8nIx8bDv77DwL7Fy+Lr7v5++up77fV1fnr6a1hOSktJQkVIRUVGSk1KSU9RSlVjbVVIS0pJSVRj6NrWzsvNzNDRztLS0M3My8bGwsHAwMC/xsG8vcbP0O9oW15q8unr4+Dd5m9mZ1dMRUJAQUI/Pj8+PT8/PT9JT0hAQEE/QERITE1d7t/V0dDT2N7c4eXcz8vKycTDwL/AxL+6u8PPztfmaV9eW1xfbu7p5nNz+29YUU1MTEdITU1OV1hOSlVq8VFES0NBPUJNUU9ad+La2tvQz9HU0NDT1c/Mz8zFwL/Bw7y8vcfl6WhXUFJXXVdVWWNpcnNo/HxhVlddWFBPS0ZDSElKQUFNSkc/Ozs7OztBSkpOXnzg0c7Q09bU29rf2NLb187MycXGxcfDwcPAy93jdFpQVVhVWVdfal5ga/NwWlBPTEhHSE1PT1tcUklKWlpYT0hCP0BDR0xRXWx+3tTLycfDwsrV08zLysjExsbGwsTFvsDCydnd8GltYGZeVE1PWWdoZWdbTUhLSklHQ0NDQUNDR0hIS0pEPz09PTw+QEA/RE5WbvfX0dHJx8nMycbBw8rHxMTCwsDHxcnIw9HP0trhePX3XVtcYnVlXFxnYFtVV05ISEtNTUxOVFdNUFVQTktNTEhCRUxMTlBXWVtr2tPKwsC+v8C+v768u7y9v8LBw8LDwcbKztDY69zZ3+H8d/J3eH3/dV5SS0pHSEtIRkA+Pj4+QUNCRkNGRkVFREhKSklLVVdn697e1snJyMbExb+9v8DEycjDyMnIzs7MyMPCxMfHydDX1NfY1Njd3edwb2teWE5MS0xLTVBMTU1QTk5MSkxQTUhLSUdMT1NcX/zez8nBvb/Av7++vb69vbzBw8TJycbEyMvN0NTV1MzJz9jY2tnb2NPW4GZbWE5OU1BNR0VDQUZHTFFPTUpIRENBQ0Y/PUFHSlVw8Ofa0szGwL+9u72/wMDExsjIzdfUy8zQzszM1dzk7d7Y1M7N1d3Z2d/c63ZlUE1PTE9YXl5UTkhNU1thX1xUTk1MR0hOUVZWaOXYyMG9vL7Bwb++vr6+wsXJzt7c0dfX3/Xv4trT0tjd4/l5+Ojp6/ZpYVtSTlFOS0ZAPT5CREdEREZFRkhMUFhYT1JUVltl/d7b2tzWy8fAvry8vsLHzNDV1dnl7Ojl3tXPzdHQ29nT1dDS1drqaV1bXllVU05TU09PTlFQTEc/QERHTE1RUE1OUFFXWV5jbezZzsjEwMHDxsnHwL29vr/Dzdbl7eDo7Oj03tTOycnIzNpwXFtr/PnybFVLSEZGR0NCRURCQ0pHRUM/PDk4OkFGSlRaTklKUVdfZfvZ1MvFv76+vsbT4fTl1c/O1Nre5/Dp3NbSzczLx8bIzdTjclJJTFNbXG92ZVRMTEtKSEhJRkRMT09MR0VAOzo8PkRNT1lbWl/v0srIxMO+vLi3uby/yNhwZHv13dfU0M7U08/KzM/S2t/f0dDdcF1OQTw8P0NIS05PTUJAQT8+PDw+Pj5DRkRCPzw4NztAR01VbNzS2M7Hx8fIyMfKy8nO1+R1W1JUa+nPysS9vL3AwsnP3O5zbGNu7mRZU05IQUNMVGRfXW9hWVROTEdFQ0RFS1lcTktKRURFTVr+2tfLw8PBwMLEys7V1M7MyMnQ19/n/X3p2MvHx8TFzMzZ7WNPSEI+P0JJS0ZHREM+PUNKTU1UWlRMS0tGQEJDQkhRYf1pXl5ZWlRg797TzsnHycvO093o6vPt5c/Ix8vO0cvM2NDJxcPEyM3bfGdWS0RAQUBCTFdTT05PVlFQXWVbV1tbWlRVW1NNTFFda97NycjLz87R2NfNzNDMy8rIzMzM0M/NysvNw8DBxMvMy9Le4tTb3d77c2lXTkY+PDo8Oz1DRUhCQ0ZHSEhKTklMT09WVVhbWFhabejdzMfDw8fKz9vudXlpYPPj2NDMycnNy8fCwcG+vr7BxcrT3et89H337ezv+PFwV09NSUlGRkpPU09NSEVHSkxPWFldb/fs3+L59OHXz8jBvb3BxsjN0c/T1tjY2M3MzcjFxMbEw8PBwcLDzNba819YTklGSEdJTU5SWFVPS0dEREVDRUZBREhHSU1RV19x7dnX0tDQ0dPT1Nfb19PS1uDU1t3Vz87LycrHx8XDwcHEx8fJy8zMzc/d5+j/Z1xjX1lQV11nbV1aXFpUUk9UUlVOTkxNVVdYYH7j1NLJyMnIy8vM0NDV3t7d0M7U2tnT19XNyMPCwr/Aw8LFxs3R2OLl7ezvaFhPTktJSkpJSktQWU1KSkpJSEhHSUtMUldWVFZidPHh4trV2c/N1djb4/J093Nt89zV09bY09DMx8XFw8PDwcTJzNLbemVtbGNudPbtcmReWFdbU1NeaGZmW1VUUk5OV1hVWl1m9+3g3d7c2tfZ3dzX09DS1dPY3Oj17OHf3NXY19DNztDSz9Pd2tnb6fv5b1lOS0lHQ0VLS0xOT0xDQEBEREZJSktKTVBNTUpJS0xPX+3l6uPa525qZWv8+tzY293Z1t3h5+Xl5dzNy87PztDieW569nZ95+X9eH1zZVdRUE1NVmBfVlJVU0tISk9ST05UTk1TVlJNTFRZWmPc1t/d3Nnd9+ze397f3eHp3d3Y2NnU0tPa09HW2OLl7nVdXl5dXFJUUlFRUU5OTk5JRkNFSUVGSEZDQkRKR0xNT09LS0tOUFRbXVhXV2ZycvT5dmtlZ3n/4trR0dbQy8nJzMrO3OT38fz16eXl6er79tzZ3vlrbvtwU01XZF5VTE9ZX11WTUtMTUpJTFh1Zltd6NXe6t/e2tbf4evm3+f5Y2N4cevez8jJztLMy87Q1+7h4Nnl7uDr9GljYFtWXF5hbVpRTUxIRktKSUtKTEpJTExLTUtMS09nfflxaGlyalhaaW5mXmludH744+Tb19nZ0cnGyMrKy8vU1tDOzc3MztPU1NLZ6+z8amBv8Ovs9G5kbF1fW1phXVhWXWVodWVjfHB+4trV2Njh7uHh9HJv9u/wb3Xf29XOzs/PzczJxcbKytLX1N3f7PDie3NpYmBYW11bW1dXXGJrWl1fVVROTVFNS09RUVFUXFxaXl9gXmt28ed66/FrbXJz93Rv7Onj5N3X187MzMrMy8jIx8XCxMjKzM7O0dbU3Ozu7+no4tzb4+DX19zg7XFsXllZYnhoam5hZXP25d/Z2t3d4eLi/Ht0amZZV11o593Y0tfV1tTU09PX1NnVztfW0NXd9Pvs/W9ubmZpe3Fu/PFqXVxcWldbUlFOSktJR0hHSk5PT1BZW27y8PVuZ2FXXV9cXF5ob2z02dXNyMTEw729vLq7u7u8vL29v8PFyNHc7Hl67eTf3t7Y2dvY3OvwcWtrXFpVVVdPSkdGRkRHSkxPTldbVFVUUU5RVVpl9N7d2dfV0tDOysnLz87NysjGw8nOz9DU2NXV0s/T0tPe6PZtZFtTTkpPUVBRTkpHRUNBQEVITUtNUE9TWFxVUE1OVVxWXF5ZW2n29+3c0MrEwr++vry5ubq8vLy9vb/Bx8/c3un2/PD26Oju3dvf4996al1cVk9NSEZDPjs7PDs7Pj9EQ0VLSUhMS0tMTFdne+PX19fb18/Q1NnV1NTRzs3OzMrP0dfY1NDOzcrNzc7T1d3j5G5fWFBOTk1NSkM/Pj4+PkBFTE5QUlFTUk9UUk9PUVFPTk5QVFJQVV5kbuDOyMnHw76/wb7BxcbJzNHi5u5rVFZbUk5WYGhgYWt1bmlwa15ZWldPSkhKQjw6Oz08PkdNVlJQT09TWV5jbXB58OTd2dnf7PDq3trW1dTT3Ont6ezq8vn46drU2NnP0+Fv+ujodmx+6f1rYFVUVVROSEhLTk5LTllbaW5uefTj4O79bmlqXlhXVVFRVlZPU1leZffY09fQzs7MztHg6flaUU1MR0JEREhLS1BYWl143tnV0M3Q1+H3ZFVNSURCQEdLRkVKUVleZmdtcd3Nx8XKzM/X2Njd8vXue2vy3uTy4eh+7urm2dHQztLO0dLV3t7o5ujm29vl4+D8c2xub2BiYVVPU09UU1loY2t94tne8OztfXJqaGBXWlhZTEtOSk9TXWlleeDY2NTR1dvc4+fscF5eWVJPUlNXWlhXV2Do2NDKzM/OztHS2ux8ZmVbUE5QUVZdXFtbV17h09TRzcjGyMfIzdXb3ODt6Oz77uvm5+jj39bQy8XAv7+/wMTJyMvR1tff5+9tcGBdYGNma2VdZWtoaWNgW1dfXmJoamldWlJTWFNLS05PUFFPT1RRVFhYWWz/7dfRzsrNz83T3N3U2+74b11TUk1NUVdn5tfVzMTCwb/AwsjO0drf9G5dUU1OU1NWWVxkX3jb1s3KyMbDw8fExsfKztHY3+Dm+vrw8P/o4drTzMzKysnJxsTHztbf6v1rcmBXUElKT1FQTExMSUtOSktMSklKTU5QV1lYYFxaYF1fXl51afj8ae/t6+n1eXzr3dLMztHQ19PS1NDV2uDo+nFfWE9LTExOUFhgZu/i0svOzszNzM3N1vJ1X1hRUVRXWGDw6N/a1svHx8K+v8PExcXDx8vW7H1qZlxpbGdtYHLl4+Xb09PQ0NPZ7PJwW1ZOSEI/Pj08PD5CRUdKTUtISk5ZYGN6bl5dbXRpc3R+b15ebHT54Oro3uHX1NjPzc7NzcvLx8rNzNDU0tbf6PRwXllTTUtPTUhHTVNc/OLd2tHPz8jGxcPJzNPc6XReYFxZV1VYXmdue+fZ0svHwsHAv8HAxMvS3nBcTUhLSUhFRERFQ0NKTmF6c+zs8PFuZ15PS0hERENEQ0ZIR0hJSUtPUVdaZW5q8+Ht9ffm3d3c3u/7cGX929fZ2t7j6OHi3tLM0dHT0dfi4+Db19ne4O77cGr49GtgXV1mbnBkaHz43tnX1dnYz9DSz9npfntgWWt1XWV9bvLq6+ro5+/t49nc3enx+15XUklGR0NBQkI/Pjw8QEdJTmXn3tbP19rZ4/91eG1VSUpHSk1JS0tKS05fcOLj69jb1M7f2tfi5Ork5HRvXl5dXWB5dP3v4NjU1drW1M/IyszJz9TW2NPX3ujs4uf5bWlaUk5NTVFOTVVf7tnY1tnLx9DMyNDc7GZdVk1JR0NCQEJHSklMTVBmdl5m9fPi3eb3a1tWVlNMTUxHRUZFSk1NT1JUcNnTz87Ozc3Q1tztemxxa15VU01ITlZVWWNybmv34OXs5uHa1djc3uXw7t7m7/H0/OPRzcnKysnLxsHAwMDHzczN1+t2Z19dXWlqZfz7/Ontc2deWlhfZXRvXldWXv1hVk5LS0pKSUdEQD4/REdGSlJj6tvRzcvJzdDJytbb7mpoWlJPS0xMSk9fZnfw5dfNysfDwsPHxsPHztz2ZFZMSUhJR0hLVl5lcnbo187Mx8PBxMnHxsrO2NnT1Nvg2+Pu7Pf53dfW29fP0dLLwLu6vsTCwcXO2G9dZV1ORD49PkBDQ0A9P0dPV1RVWV9meGpbWltfXFdST1JVU1VOTVFXXFtn+NnRzsvMy8jIx8fJz9nj4/liWlJSV1NXY3J3bfLe1tHV083KyMrO0+Lp+2tpY2pqXW5wcvDf1tXPzMfCv8LBwcjM09vnfXBfVVlfYmRq8OLX0M3JxsbIxsjKzNHY3vZpT0pLSUA+PTs8PDo5PD9BRUlHUF9ofOPX29/i6O5u/mRbX1BLTk5PUVRfZWnx29fMysnEwsPGwsTKzdTX4O11VVNXT05MS1BdYl9849HQzcXEw8HAwsXIyMvU2OZwbGFebGNfZHRsaPPk09HOzMzPy8jIyc7U3Ox3aVxXVE9MSUpMTExPU1thYG72a15xfHNdVVdNTk9KRkRKS0lNUVVXV1tdY11gcf1289PT5ODf5vPj4X5+dm5hXGj35efo3dbMz8vJzMzNzdTd4ejq731wa2v++n3u6unc39nMzc3JyMzOy83OztDW2+DudmpfW1pbXmna1NPU0dLVzcfL0NPmbGFcUkpEQj48PDo6Pj8/QkNAQURMVV/g19jSz8/Q0dXb4fRnYFJOS0lJSEhPVFdcX3D06Njb4N3g5Orw3NTd5OT1e2VmbVlXVFBXa19l7uDazsnIwLy9wMDBx8rN0fF7blxcZG1eWFlfWmXz7OXW1dPOzcvJx8bHys7d9XhqX1ZPR0VERU1RUFJUTk5OUFZVUUxEQ0JAQENEQ0ZLS09ZW1hYWFFPV15dYn3079/W1dvQztTY5+337fZfW1hUVWd79+vp7evn3ut7bVtYXGRu6+Lh29fV2NTPz87O0tPR09LPycrKycnMzMvQ2ulgU1JWWFlcXl9r9e7y7Nzh29bV1t3tfvRnXlteXE5LR0RDQ0M/PkBAQkVITFdw8uHd29rXz9nn/F9XTktLR0lIR0pOV2Z6enxrcfzu2tXY3dvZ2dPPz87O2t3c4OtuYF1WUEtLV3N14tnb0s3KycjExsvNzs7Uz87T2OX+d/18bGFdW1tx4+TTy8vJx8fJxcXHztrfblhPS0tLS0hGRERFS05SVFVLR0pMUU9NUFZZXH5sXnF1aWl3/FpNTFVo5OdtYF1y3NDN2+5vdO/4fFtPVWZwcF9RTVt8+H1xdW717Ovl+H7o4NPLycTDxMTFyMjKzM/a39zb087R2N7f6vx6cPfr8OHp4OLl3t3f3Nrn39ba19fX3+La5eLX3+bo63dnWk1JRUE/Pj07Oz0+QEFGS1zg3d3a29ra59vS73FuXWlpW1tbaG5gX258cfDr3dXU1dnZ2N/m2NDY2dru8v9hV1RaXFBPVFJUYnXq2tvZ0s/KyMW/vb+/v8C9vcHK0dvje/3sdmt+8+rf3dzr3dvd2dPLx8nMz9jZ6GdrcGBeWFRXUE1MSUVGREBETVNWYWVWY3Fn8OV5Xl1XT1BPTUpKTEtNXPX6ee3l4une2t7Y2dbOz9v2e2NXV1dcZfXq+/Tw6Oju/Obe393c2NPOzs/S2Nzj49XO0NDV1tXV2t3g921u6ePi2dPR0czMy8jJztDO0dnc3dnW3/F3/PtmYGhlWk9MS05YUklGQ0FCQ0VISkxMT1phcezp6+55denb3Ol3b2ZsdF1faGlfV1dUWF9u+Xdxc3Dw5unp4OV8/O3c19jY5vNuWl1bXF1YWmDu3tnX2NHNysjDv8DBw8TGytHe8nZcWFVRVFlYXGdfZW997ODUy8nJycnDwsnMztDX2tzldVxPSUhIQ0JCQ0RFRUVGS0hGR0xXXGBYVltUVlteXFpZW2Nlb25eZ3V3ePvj6Obj4Njf7HduZFtjY11UVWRnbmtdWlZZX15r7PJxZX3d09bS0M7O0tHNycfJzNHS1+Hrev76amh86+PZ1tfU29jb6uLmfXhnZm5uY2djXV5m8+fu7PB2ZFpiXFxaUlBOTEhIRUhISUxOWFtkbHZ763l77H56aFxZWFFNTE1TTEpPVltt7vHp8/3f4N/V2N/m/O3m6nb6a1NUVFlhX1ldWF9ofvT47era18zKzc3LyMvOzMzP2uXj+Hps/Or87+34+Hl18Pju2tXb1szHx8jKzNDb2973b1xVTURAPj07Ozw9Pj5ESUtUXmFsceba19jZ29rY7fV5dP5jXFhbX15fam15eeTX2eTz83dkWFRXV1hXW19hZGNt8vt5enTp29rVz9jc5fPj3+ni3drRztLSzs7N1tXP3N/i6u3p4ubk7Pf59Ofl4NjT0M/O09DNzc/Tz9LX4X5ram5kaVxXWFtZWFBISktKTEtISklHR0dIS01MU1dceN7U1tXX3dnU09TU09jX2t/v8O94ZGBwb3Xl3dvY2dnc3OLo+PFnUVdUUFhVVlhZW2Dp1tTY18/OzMfFwb6+wcfN1dbV2/Rtc2RkYl1eXWj4+fHf19LNzc3LzdbRz9jW193Y1tnl+XBuW1JRT05IRkVERUZITE9SVF1kbO/q493a2OX6c3x4d2BWTklFSk1RXFxm/Obn3drX0tPNy8rHyc/a4OxtZGJcW1paXGh6/eLa0dPU19vb29vpd/t6cO/s3tnf4+LZ3NrY1NDb3dnT09be4On66drd3eN97+/o5vB6eu/17PD89nt2d2lXSkZGRkZISk5LTEpNVVVeU1FgX273+nBubm3639nq7vTv4d7Y3/vjdlt383heV1hOTk9VWF5fX2/t5vX2497c1t7b2Nvj2dLnfXhbXG7j6fDd18/Nx8HCxs/RztLY5/BfUEhCRUxLSlBe7d7c19DQzMjHw8TIyMjP4/ppW11aVk5JRT48PUBBQ0tMS09UWltdV09VUl5+7vttcHl+buvc6/huY2xofn1uZ1xaVmnu8ejj6uPa3djU3eb6ZWBeWldPSUZJS0tSW2Rv8+vy593V0MzHx8bBwMLEx9Hj73VnXWhsZ2Bta3bj2NTU29za3u9ybWtYT05OTlVhXl5r7uPa1dTd5vDvbVtZUkxHRkhDP0BAREA/RkxRXHLt29nUzMvMztPmfXlfUldeXFpiZGBxfPjw5N3e4uLb3Ov0Z11uZWBy8H165eHj3d3t7N7temv4+mRmdOvq5N/c19DV2NLT0tHQz87P0tvd2drpevb6cG336ujZ09DQy8jJyMjM1d/ta15TRz88Ojg5Oz0/QklMVG/s3trT1dva1tXc5+f7dXlhYWdeT05PVFddcfjf1dPX2tTX3Nvj/G9pW1ReYFdWVltfc+bV0M/X597T2e50+/X8fu3c2dfRzMnIyMrJy9bh6t/lb11UWVxUTlBe/nl87vPp19bPyMPByM3Mzs/R0tbk6m1q/2taXFZQUFJWVU9OTElMS0Q/Pj8/REpSW3fj2tHOxsPDw8XJzdHa6PNwXltRSkhISUxQXG9rb/rq5drQ0NHT2tzh4/VlXVRUUlNQTllWWPLVzcrGxMPFxsXLzs/V2uLme/3n6OjqfHP06OXc4Obme3v46N7f6P10dvbf3dzi5d3d2t3pdHl0YGJhWltVTkxPU1RTU1lbXmJp+ezd3tzZ7GxeWVZTUU5OT1Fdb/Hy9eTYzsnGxcvO0+j3clxSS0hIS05RWV1hWl165Nra1tXY1NTQ0tHX5efr+XJtb/7n7Ovo3c/T0MzO0NHW3uTi6XRjX1xgam58fv3t3NHPzs7T1drg6GhcUEpHRkVER0dEQUFHTVRXWnng4+DV0s/Mzc7Q0dXb3ODd5/v3bWpuZGtfVldWUE9RTU1MUFNXYWNp/PHp29LOysjN0t3i6GtaVVRPTExPVVdaZ3P+3dDJx8bDxMrKzNba4XtpblFKSEdMUFNWV2P13tnSyMjFx8nJ1M3X3drt/GVYUFxaTUhESU1OT0xHRUVHSUtMSUpOV1pTWFxgeNrR1dPOycjM1OXb1M/bampu73pVVWdvW1JUWF1ZU1hbYGBaWlxdVVReamtu7+jp8eHXzsrMz9Tb3uTZ0trf5f93bnVqXWBhW2B86ebs4N/q6/5rdGpeY2tpaW9ta2dscmzx3d7f4uLp8nh3ZVtYUE1LSUpLTU1NUE9PWGhv8efo5+7g1tne4Oh5aWNYXF1YUk1SXGx97+vr3dzf2tLS1tPX39jZ3O56ZVhZWl1dV15cUlZXWF9eX2d2+uXYzszOy8zPz9DT3dzd3dzx7epwXVZZWlNVXV5ea2rz39jR0tTU29jb5OPhd1lbWFRPS0pJSEpJR0hPU1ZibfPr9fXq5eHY1M7P0M7R2drc4e9maWRfY19dXFxfWlFQVFJPT1hnfPb88ujg1c/Pzs7Ky87NzNLc3uDh4t7o+3NqZ2dsanj9+H3y3uPw/vbu7d3b3+Hi7fLveWZeXF1ja/3v3dre5enj6Obc2djc2+N2bmltZl5aVVRQUU5QUUxKSEhOUFRZYffp4t7U0NHR0s3MyszT2ePtfP36+XZlX2NkYl9bWVVTVVpfbuzs7nhnZGh6+f1tcvr78vz66+7r4tnRzszMzMzPzs/Pzs7R2Nve3+v6dWZfWldZVFRbWFVVWFxs+ejc39za2Nvh6fVwX15rcHN7cWJZUlNWV1tbVFJQUlRTVVheX2R85N/Y0tTZ4ebi39/f6Oru7fVseXpzZF5r+vp7+m5kXF526uDa2dja2dfb4/N6Z1laYGdmbm5nXlxhY2X/6+nk3tnX1tTT0dTUzsrJysrQ3vD9bmdrZ19aVlxnbHZ2cGxleezy7ur2al5jbG50eXZ0a2ReV09KR0ZERUlLTVJdX2Pw3NPMx8bIy8zO0NPa4/htYF9obmxuXlBRVVdXW19fY2d0fPbs7fPw6OXf3uLf5Pf56+Tk5uXj3uPk4+zq7Xlva2l47+be3Ov98ezn4N3g6nptZWFmY11dZGvv3NfV09ne29bZ3eDf5vb7+3dsZ15UUk9OTk1PUE5JR0pLTVRdam1taXrt4N3g5eji2tjU0NHZ4dvX2Nrd4PZzamVcWldPUVZaZGtz/Pt+bXr0+fns2tnb293l7e1+dm9tenvu4eDe8Pjm3NbTzc3P1dra3+D0ZVpSUVJVXWFjXV5mbvx4evT4eWpqZWpraHjr397e29zg8HdsYlxVUU5NTEtNUFZfZGp69ejd0s7O1t7h6vDs4+Pm7Pf9enZyaFxYVlNTV1tkbW3w397i3uDk6+rk7Pv39f548+3v7ufk5+jp6evt7e3s8P57d2xo/e559+fq6ebl5/htamhkefjw4OXl3tnd4OL6bmZiZV9oc2tlam9qaW5ta2RgW1dTTk9OTlBSVFNWXmlucO3s5t3g3t/k3+Li39nZ2dfY1dHQ0dTd8W9rd25gYFxbW1xmZGNuaWv88Ojh3Nvc393d9GtlYGRjX2FlZGZmZGhrb3R19efd2dbV19nd4+n1+fb56en07vn66uvv7ev27/j79ffu8vD99+/+cF1WV1JRTk1LSk1QUE9VXVlcbX377uDe3Nja293a293a2NLT0tPX2NbZ6/N5Y2NkX11ZXWNfW15hZGJfX2hw9enp5uTg4+zu7/T//e3u7ezn4+Hh39/g4uzx83x2aWJoZmVmXVtmdPjn2dTR0M3MztLY52RUUE1MTk9PUFVdY234+u7h4OPf3uj4bl1YVVVYW15idPzu6uzs5N7e3d3m5O3+fP94//f68et2bGBcX19kY21xcv3s6vp2dl9fY2lt9+Pc2tra3ODY2NvW0s/T2+Pp+PL7aWxuaXl47uTi3NbZ4ufudGpfW1hWWVZUWWFicf50bGdkbXf46uDb1dra193f3+fv8HtrXlxiXlxjYF1pe/zz6d/c3NnZ6XNiWFBNTUtLTlJUWnDt6uDd4+Pc3+jn6fB9/Xl4cHz48eXe3tfR09XV0NDS1Nnn+HFhXmFjZmhvc3lrbXFoZ2xjaXr5fXr6/mRfbGRganP139XOzc3Nz9XT2N/e4/RyX1ZRU1lbXmZqbnl9fHdvePpuaWliWVRPTU1OUFRYXWJt7On69/n97+nh3NbQ0tfW1t7v93hlX19gXFxeXmj77+fg3t3f4t3i4N/m6Ony/H13bGRfZ3Jvfunr7/J7YltaVVZUWlxn6ubk3dze4N3a2tXQ0M/OzczMzdHZ4+jve2VgW1paV15hZGRbWVROS0xMSUpKS01QVVJQV1ph/NnQzcvLzc/P1eHvcmJjaWtu9+/l39rX2NjZ4e377vR8+nx4c3BxZV1bVVVUUVRZWVhXWllaXFxgav7p5dzU1Nra2Nzn4dnU0s3MzcnHycrLztTd6PR4bWplZGxrbHZtYVpWWFpXWl1ZXF1dXF5ZVVNOUFZbd35+9XVvdG5nanf36ePd3eDa2+jt5/p4b2NjYnDt5trU0tPb4PplWU9LSElJS1NXWFhbXFxgbvHf1M/Pzc3R2N7qe/nv5eDf293a09PQ0NLc5e12cHRuY15w9e/n7HppY2NeYHPv6uLb1tje6WxaUE1SWGJqZXR2cGpreHf6+fj0+ex+aW9wam9sYl5bWVhZYG36597g5efs9PRzaWVeXVxfaG1iWFNLTE1NU1to9+Xd1Nff4N3Z29va3d3e4t7Xzs7NztHW29nb29rc3uHk8mZeWVRSVFlXW2RsfPHr8HhkX11ibnn16uPn8e33++3r4eHe2+Hf2tTT0M3Q1+hsXlJLR0hOU1VbYF5cXWJiYmZiYF1cXFdTUUtGQ0VKTlVbauve2dTOzc3Mzc3N0NHY3NfQzsnGyczV3u15a2VkbvT/+/VwaF9VVVlZV1RXYGVibn1ubWpnd/Dj2tfT09ve29rc3ODj4+1xcPnr4+DX1Njf8W9fVlFQVFteXmhpZ29wcGtlYl5cYGZlamJaV1RPTE5OT1BUXV5id/ns2dXU0dHR0M/NysnJyc7R2fpmX1paX2r78u7q7e3i4Ojq7HFiX15mZF9eW19fXmFoamzv5erl3drd4dvg8X50Z2dv9t/a19TV1Nfd4ut69eDk6+vv/XZpdn1uYllUU09PU1RSUlFUV1RSUE1NT09XaX3z6+LY2Nrc2tnW0szGxcjKzdLZ72xhWllbXGFkYmRnZm336Ob0eXxvb25mYmFeXF9eX15eYW745trUzc7Rz87U2ej273j16erm6vb+/2hjaGZtd/fq5Obe4u/n7GpdV1RTUVNYWFdcXF5fXF5lYF1kcfzt6OHm59/j6urr6N7Uz8/Pzs/Q093s+W9aUlhcWl1fY2BfaGxkXl1dX2tqaGtmZ11aXV5fYF5p++Xb09DSz9LT0Njb3N3f3+jm4Ojo6PT7bGNjW1thanHs6e3j4eP9YmBcWVdaWFZaXV9fX2NdXWhmbe7a1dXX1dfc3O1wevjx6+Dd3d3b19vf4+/4bmZscHpybmNeZWtqY15bW19mYl5kYVxaXm1rZF5cXGBw9ujh5ubk29vm7ujf5/Lk3dnX3OXn63xlX2FfXmr659/h393h/3J+ffxtZWFZWFNSVFVVUldaWV927PHo2tvX09ne4t7b19bS09TPztHU1Nff6/V99PPseGhnXFpTT01LTU9WVFJUU1dYWmV393x0dfXl39ze3N/e2uPx+fr17uzt7Obh2+Dl4+z4bGRgXl9ia2doevP9YVtbXmVtY1tgX1xgZ2VfWVdZV1xoe+ng493Szc/Z29bX1tHOz8/R09DT2dzh6vN2/+7o7P5scf1uX1tYVlNVWlZRVlNUVltdYG1ta27p397Y19zZ29/ycG12b33/a2317fTz6+r5//x1b3pzbG9qZnn28WdeYWZhYmBbXl5aXFxfWVBQUk9TXmh97vHm2tvc5uPV1NbOy8vLy83P1Nbd6u32cXjs7n5xdft4bW5oZWljXmNsZ2dudGlfYWJfXWJu/Ovn5Nva3+bt+Hl9+vDy//nw5ODk7ezq9XhufvtybWpob3RvbmFYU09NTUxNV1pbXl9gXltaWlppevfi3t/b293d4ubd3d3d3NfQ0tPT1tfa3+H0fvf4d3hxde7w/G5nZWJaXGdt+OTn6uz4dWhiZ15kee/n5OHh3eDm5eTa3N/e3+Dk4ep8bXv4ffxwZGFlY2JjbHf39v1yaWBWTlFTVFlfXFRSUk1MTUtMUl9p/OPe3Nvd3d3W09TW19TT0tLX29zY2dvb4O3y6u717eXm7nNkXFdUU1Fcb/jn6u/493ZoYl5fZXrl6ujl5+Xq6ODc19XW2NLP0NDV297Z2uHufF5TT1RQUlVXV1JTUVFVVlVXZvb093tuX11aVVNRT1JbZXjy7uLo+ejg2dbb3t7h3t3f39rc2tri4e188PH35tza3e1tYldUV1xicvLt8m9xdG1xY1pcaXzt3tjZ3+Xm8vbq5ePe29va09HX3NvW1NLT2+t9d21rdv5rXlpXUE1RU1FVWWZsZF5bV1RUUU5NSkxQU1pic35ydvr46dnZ1tDSzsvLy87P0Nje4/hmcm9haH3p9WpsZlhZW1hg/vDq7+vr//Xn+GxoY2V49urh4Nrf6ePn7Ofu8+Ha1tHU1dbf4t7k5Ot3cHFrav31eF5WV1JUV1heYnX79vr3cmJiXlxZV1VOTk9PU15hXF5cYWps9uff1dHPzczMztPa29/r5/v58HT683x3ZlleX1dZaPjn5uXe3uDd6PD6Yl1jZG16/u7wffX6e/Z8b3vo29TRzs3R09jd3Nzh5Obs6+nq92ddWlNRUVJUVFlgX2NpY19fWFRVV1RPTlNZXWt99Ojq7ujt6OHe18/U0c7S1Njb3OPr9/1wdXFjY1xeY11cWFdXWWN57/no4OPe3drc4fdhZGx+7eXh7fft7vpve3Bx6dzU0s3N1Njb2NjX3Hx7fXRrY19YU1JSUU9TWFxgZGdsbndtYGBfXl1WT1BWW1tcZ3P+/X777Obh1tTU0M7P0NbZ19na3vF2+er0amFqbWduaF5gXFphYnJ9e/Ls+evb2uV7a2xv9eh+bf5zbXJsamtob/j63NHR09bV1dfX1Njr8O3r7GtpaV5cWFFTV1FPVFZfYmNrYl9gXllVU05PU1ZWTVdnYmn+5uPe2dPP0s3Nzs7S1dLP1d/f3uDn7vlkanlwfHBoY15YVVlaaW9qb27z3+Lv/fn89vfr7Hz26+3n3+nv5vL56d3b3eDa29/X2N3e3+LofWxrWlVZT09ZVFJVVVxdZnpwYWxnXWVeWFdTVlVOT1JQVFxk/uPn4dvc1dPQ0NXb2tvc1Nje2NnY2+Hi7Hd5fGx+8nBtbGdrbPfybWlxd/nj3eTl497zcfN8bWZpdWx0bmxpbPbp3NjX19jS0dTU1tfb2+f28XhoXVhZV1RSVVVVWFhdV1BRT09OT1FQUVRXT1BVVVpec+7p2dja1c/Nz87O0tfZ19rc297j4+Hp+3R8aV9nbnJvbmVfZGRgY2xqa/Xk3dfW0tPX2+Xu+f16fPZ8/f5zbHHq5+nj297l3eXk3+Ph8OvqfWZrbltaWFhfWlxeX2pjWFhbVVFVVVpcWGBbWllQT1FXWWZxfObr3tXT0dHU19vj4uXq4N7f2NrY1+Dr7PJ3cGht+nNwc21rYFxcXWJ29evc2dvZ297ldmlsdndwb25ua27v4NjZ3NfT1dPX2NfZ29nT193qenVoXFVUWFVTVlxaV1NPTk5NTk9OUVBNT1lTT1FUWV9t7u7f2tnRzMvLztHV2+Ld3ePd3dnW1NTa6/F8aGduZHn9aWphW15bVlpncuvi3dPZ19be4uh8eu/2+Ot79vNt9+bf2+Hl3t3c297f2Nza1t3h7HBuZVtYWlhXWVZaXF5bVFFXV1ZYWVVYWlZVUlJUUE9SV11sc27u29bQzc3W3d/h4NzW1tPPz8/R1NXja2ZzaWdtbXBmYmhgXVtZY3T349zd1tXe4OLt8vxsaWl3e2RoevHp49rf4uTb2dzW1tbU09LX1dje8GtmZG1lWFZTVFZUUk5OTE1QUFBNUFFNTk1WWFJTU1heenFx5t/SzszLz9DT2tvW1NTQ1NbU2dfb9GlaWFpZWVlaWVtZXGBcaX7v3tjTzszOz9Pa2d7p73d1fGlodXPu3+Tj5PHv5+Xi5+fi6fDu7untc3BtYmt8bWZkZm14aWhiXVxbXlxYWVhQTk9OVFdSTk1RVVVYXW7559nY1tXY4N7b3tvT0tLU1dPW2eH7amVeXV1dZWhlZGBnb33s29na09DP1dbW3+zp9WReXVJUWFpq8OHe49zb3tvU1tnY19LW3Nrg7+nvdHz4evhrX19fYFlRUlRRVVZRUE1MTUpLT09SWlVQU1VZXGN839LNzs/O0NjW2NnW0tHT2Nnc4+rxbF9hXllUVVlcXl1ZW2Jq/uTd1tbSz9PSz9LW3+r7aVpXVVZfZ+7c3drd5d3c3dvc4t7l7+zw9fhrbXxwefH9cm1ndn1yeGVeZV9cW1xVUU9MTlBUV09OS0hMUFJZaPTe2tfU1NXW2trY1tPT19jf3tjk+e79efppZV9fY1xaX2Vo/Off2dvV1Nra3N7Z23dlX1xaU1NZX2745+LZ29nV19PR09HT3uDn7efteP7z7uju9/1vaF5dXlxYXV1WVVBSUUxMTU5PUlFOTEpMTE1WXm7s4tvY2NTS09HP08/O0NLX09ri4O58ffhuY11gbF9gaWFhanHy6N/c3NrX2NrU2ODnbG10ZmNibHj7+uTe39nc3dbY29ni7PZm/fVqb/hu9up68Xl78Wdo8vxu/2tnbVtcVk5RT0xQTktNTElLSklNTVFbWW3t7NnW187Mzc3Q19TZ29nc3t3h5+Hr7O5y8/9t6+zw5+746+Ph4uTj3ebm5fx8Z15mYF5mamt1bHLp4drW0c/OztDT2t3l6fJxbnh2//768vn1emxuaF9fYFxcV1ZWUE1NT05OS0pMS05OTVJVVldWWGpv+9vV1c7NzMzU1dfb1tff29zl5O3/9W96fGVl9vT76fHj3Obe39/Y3drX2uLn6Onsc2Z4d3lqW2h3dvjo3NPU3N7l7fxnc/l4ZG/p7PB79enq4O3u3eTze/ru+G9jXVZPT0xLSklHRElMSktMTU9OTU5WXWV73dLNzM3P0NLa29nY1Nfb1dTb3unu5Ofxferk8PPg2Nvb3Oje4Pj/ffh5ZGj8+2xmZ2JgX15caers38/Mzc/R2Nnc7Ojk4ur27eTl9HV2eHp+9Px5dmRjbmtqZVtRT09LS0tJR0VJS0xQT1JQUlZaXmru6t/W09DQ0dbc3t3f4N7c6Ofn6uV2evX/8XTw7ejg3tfTz9DW0tzr4OXr6Ozz5t/0531dZmFbWWJ28uXk2tvb2urxcGv16ufk3uDY4nDteHf9/nrn3e/n5H7m5PRxXlNMT01JSUhHR0lHR0pKTElJTVhfZ/zt3tPR0dDQ3t7Z29ne2NrV2e3h5+zd83nv3+fm2ejfztHX1tvw/3dsYFtoYm55c+D+dPhbW13uaPnZ69XO1dDe4Ol5efne9OXX3uX3+Ghhalxle/N4+f5z7PV7elpeVFRLS0xDSUpGSkhKTE1MSlpXXv5869rQ1dbS3dzY2eHg4OHd5/D8ZvVrYvvx3uLf4Orc1c/PzdDZ0tnf63VvbPNteeft4H1ebHJsafbw69jb1dfe3eL3cHrq5+nc2efs6XttZ2lhbOf2d3De4nDk7Xp1Z1ZPVEpFRkZIR0VFREZEREZKT1JabtvW2tXb1trh39HQ3tnO0dba2u9t9PZu5NXc5trY3dvO0tvO0t7e0Hxb+VtTcGxj8O1beftRceNl59Pc087c1db03dp45dfr5N7c325u91xb8V9f6PxjaObsbGzpbljzXUtPT0JAUEpBS0xFSkpFUFxOat1t3M7v39X36Nje1NDq2c/k3+b3+WNt6nrkzeLv193f2MvO3tbJ1+rN4Fp68VRY5HFZaGZQV2xp5N1v3c7z3c5w99VyeNbo187639RrcetubWF+1O150G1f1uhmauPoW1lfTEZMRUFGSUZCSEs+RU9KVGVv9+fV4n3g4Wfj2N7Wz8vV183kfdJ2V+Df5dzV0+35ztxnzMz818fhaN/fWFjuZFro4lNV/WVQ+NP4dsvPaNXMbmbP3lveyuLezeRf4exXXOxeYd/vbPPnc2n7eVl032BYalRETVFBQVZPPktbQUBeWkRi2Glozd9X7c9dWsvQbM7C3t7I5V/d21X9zeHtzNHpzcrm2sfW3cvL39rWZWHj+lJ82lZQdltNefBYfszvbNHiW2vcXWvQ3fnMyOff0vlf5fhZ6tZuZtjoXujbXmLfY1fg50pYcUdCWlA/TFg+PVJFPVJuSFPS8l/U11VwzHJfx8p+y8D4d8nhUN3RW/jD2m3HyP3LwvDewtb+y8xj689hVNrqTuvQTkzUb0vfzVx7wtpSz9JKX81mU8jPXczIWnfIdkzW407g0FBZ0F9J0uxEdthJV9VOSN9RPVxdPExvPTtnRjpidj9dylNVyO1K1s1O9sLna8HPTtbHUFzJYE7IzlTPv3ncvdVwv8dpyMBm3sJhV8t0StXaRVzWTVLNak7MzVjeylNY0V9L2tVY3Md7acjaXdDYTvbKX1fL+kzV2Uhl1U5Q1GBJ2+dGU29CRWVKPE1KOUhZP0PsX0nh203zzV5by9dkyMdg1cZsY8r4TNXVV9/Kcd/B0HrJynHOxPzfwttmzNpO3NJRXNdXS9zoS3vPX2TL7FDa4E1r2F9wyNBr1Mn+68npX9HTXuPMX2TQbU50cEtY4VtR3PRPbG1FTG1GQFVMPklVQEFYUEp08lFq2Wpp19xtzsxy58zxX9fiU+fRWmPL5F3LxnXcxOL2x87yzcTi4MnmXNXWVmXbWlDkdE712Vpt0HpS4uhRatVgaMjWas/LbujM/W/N1F7ezF5c1G9LX2pJWONZU9/1UWjxTE5ySj9RUD5IVj4/U01GY+xNW9RuWtDPaNbJevrQ51rr7E9l0G5Z0M9d18hy6cXRc8vD4tvC0G7PzWXwy3BT4dxSXeRbVdzmT+zOVFXQfE3fzlv2yuZgzc1U7ct8+cbYW9LMWWjVWEvteEtk1VdW0HZIbeRMSmlMPUxcPz1PRzxOaURM3G1N39Fj3sLgY8zOUvDQU07T4VfZzWb0xNFb1cXn38LPbcnDfuTE5GLNzlFp0lpQ2fhIbc5TVdJ7VdvZUGjRfF/QzmPjxnxZ1d9X1Mbt78nRX+bOVU/Ud0Zp10tO1WpFZtxNRfVVO053PTxfRjlMZkJI2HRL4MxZYsLWWs3IZ2vOckfpz1FcyORPzMdf5cHXaMXEadi+2mDGyWLbwPhQz9dNac5ZRt/ZSFvL/FHX0U1eyPVO0MlYYsfqTN7OUffE5F3HxV11xmtO3udGVdFWSdzcS1rSWkRjXD5FZEM5TFE6P2ROQW7dTFrO6FfOyWTnw+dU1dxJWNBuU8/LZuHB2/vExHrcw9jtx8rv3cXV/MvQXHjVW1DqZUpq3ldgzdtb3dFTWs//VNXOaOrL6VTl4Fhp0eZszM1w4M/+VfNgSFnzVE/ibUx+31JR8U1BUlI8Pkw+Ok5YRlbjXFHe3VnqyuNf08tk+NFdSfvuS2TPfV3MyvTOwNjswsnmx77W3cbU5MTF/OLL+1XndEZTe1JW1Ndi29NYWtX1U9/SXHLK2GDY21Nm0fxjzM132Mr5ctHtS2HbVVXbdU5o61Bp3lVHWlE9Pkk9O0lIQVV1TFPkYVHo2W3ny/Ngz9FTXdpXTd3kU/TI6PDGyejNwtnawcrmzMj79MfTftDYVmXfU0RZVkZd2WNmytFa6dBsY9ToWeXTa/XM+Vnd2lr4z+92zdNh5c5+X9l7TfzjTlDvXEpr9k1Te04/TEo4PlBDQFxcSmPYYVvR2Vzq0GRqzexS7t1TXNt9VeXbatvG4OzFzN/Fvs7MvtB3z8vl3cnkY9DjTWX4S0Z1ek5r2G1w099Z2sxgWd51UtnbT2fPa03Y1FrhyuN6zddb285cX9HhVPrmSlDcWEVuZkNLXEA7S0Q6SFY9RvRSS9reWuzM/1vV31zj4FNlzu1W49Jj+MfXeMjI+c++z9a+xN/LyGLtxeVU0tVf9dhZUPVcTX7gWGfM2mzNyPnmyP5Tz9JZ88t+W8vUUefJYWrF30/X2FJt1WVU2fxMbXFJTt9PQ2xgQVBcPz5aTDpIZENG63VW1c5q5ct4W9X4UXT0TVrXX0vk4V7uy35nzddsycHTzrvHeMfGbejK7V7O0Wrdz1xa219LdPBMd877fMvPXurUWl/U9FfY2F3uzPhY1ddn49JqZtXlVe3VX3PdY1ntYUxmZkdKYE9AUFA9RlU/PFNRQVTfYFrU317ZzWrxy+xX3dxb799ba83gaM7OXu7L4HfHx+rLweXvxtBZ+9NeatLrXdrgU2/fZFDx/V/S0+7VynFmzuVpz81t6cbcYNDSWG/Q/FLm8U5ed1RQ73BMZ/BOVu9bTG9aSVxmSUZeT0NTTkBMZ0pL2O5R8NVaZc7fXtjVVWDdW01tZlB722X/1uli2NLz1cfY1sHI2sPE7tzI33XO0Wzoy/xgz+hRcd9aYNj7Xe3pWHbP5GPNyf7cyeJwy9tb2s5kXthtTXjvTFjmTkveck5k6lhX/lFLV1ZBSFlHQFBOP0tlTUrlYEZ21VpoydlqysVl9MlgTdrfVePMZHjS62XT1WLfzezmxsvo0czs38nfXNfVW/3O6nHV707ozlte0fVS591f2svn4cPJ4czMfXvO31vc11FT51FGZ1lETmRKTe1hSuzZT2HWYkxyXUZZZklJY01DXnNLUepUS+7qVebJ5vbKz2rl5k5b21tS19pOds5rY8viT9rG7uHBzdvEyeHKx//xyttn1c5kbtddVNt1SWzuS1LlX1XVzWvYvtX8yM5c28b3ds77U3zqTFX3SkVmXUdf6kxl2F1Z2XdIXGtJSmRJPlZXPUxmR0t0Tknb/E7gx93iwMv4ztZX+c1fXs/5Ud/XV3bOaVPb3VnfyOvgwtXcxM1e2cph+cnjV9jbT+rOW1XU9k3m1ln3yODmv8Xdzcdz78jdXNXfTlrmS0f8Tj1QWD9L+01M3u5V4NFUXtZbTedqQ1RwQ0p7TUt3YUhh4VRk1W11xs9g0c1OZ9JTTtn8RnHSUmjOdFLd3lfaxu7XvcrRvsDczMXg2MXdbc7dTG7TUVLaVEXp7Epfz2NnyNblw8xo08pj3sV5YMr4S97hRlP3QkTtUkLv+Ep7105W11RH515BXmo+RmRAP29PP3DsR27PW1/G0m3Dw27VxF5XzvRQ3eNOd91RXdtXTeR3Ud3RaNnB3ePEznvL0PHIynrOzljwyl9Zy/RN1NZN68xm7MPZ3sDRbs7ZVt/TXfXVVU74VkNbVD9NV0BP305N0ndO1udQ29ZObdRMTuhKRX1XQW/zRGzdR1/OWWjD23DG6FHTeUTx5Uhu0UxgzFhU0mhSzdpdxsdzycDozsB65MD5ZcTdWc/nS9nYSunXSWbRTVfIY1bD023CxmLQyU/4xWTww2hTz1lD61c+bmo/bN1HZdBMVNBQSthcQfxoPVX8PUfrREXcUUXOcUXN2UzKvmjMvF54xVNPzGhQzm5Jz+1F2uJD/NBL5sFc9L7kcL/VVsXSSMzIVdLEVXu/bl6/2VLM6E7MzU/Mv17QvmzfwFRXyGNWxm1J1mg9aWI7WV46UOhCTs1QTMxWRc1kQNrsP2nbP1jVRlTUTE7RUkfRX0jO207JxVPXzEle1klVzE1IzVxJyOtKzs9O2MNg0L7007vX5MDcVcfhTsfRTNLPTNnLTeXITFvLTkzGdE7B0lfFyFTYyE3iw1Z3xVxPz1pF3F1A62I/Y+pHXONOV/dGSXZLSm1QRGtdQ1vnTVreVVnXalfW3mjMy+zJzFna0k1011Vg2lZa2FlZ2VpT3OdY3NJr2sro687tcdn6a9nc89fc78/P3dPS6d3a5eHe5urP1NvP0unf9Vtp5llo51tm4WJRZVVKW1dPWFRRXnFaW/hdWmNTWF9aWWJbUmlhY/JtYPT1X2zvXnTm/enS1/bd9lNpYFVmbFti7PV77m7u2N7l2tbh3NPZ2dbi3tfb393g3t/u9fHn4eXq4uDo3t757Ofr4Nrb3tbQ5vTl5+3f53Lo5Hf5+19bZWpiY1pTVFVNSUpLTlBOUlhUVVROUVNRVWZpYG/o3+vr29/Z1Nja1dDc7en2Zmd6YV93cmlzbF1gaW/67/vw6er9eHdoceve2tTS0tPY3NPVztba3t3W3tTS1tXSz9HQ1uDe5mtveWhtZ2BcZ3NfWV5WVF5fZF9aWFdPTU1LUllaXGR+/WdeXF1dW2r0cWx67P3t/HDr3+Xy5d74a2BZXWNdXmRlZ252+/P+6ePZ2tff3tfndfX8b/fe2tjPzdTT2+zx6enn5/B76+p13unp29PT1dHj3OR66era2vngd/rsYOt5X/16eHFtYU9QSkRAQUdJTU5PbF1VX1NPUVVgbOtu8ODf1+nX0dnM39rZ8+BlaHlnbnh6bF9qaG9nZW3u43x56WVfa1lTVltp7dzY0NDNydvV0NPL1s/Y2s/k2tDc2dTP0dfc7uj1X2Jt5HD68k9u9lxUZW1dcPldaGZXT0pLSUZNT1JfXWtgW1plWVt9+vrt2txx4+D98tzm7+HfZGNhVFhUYWVdaWNhaG7ybPXm09rj3uPsd2t5XWN1a3zd1trXz9rf29bW1dLX2dna6eTy6OPf6trT5erlfW7o2+fd1udv6OFwd+fk7+XubV9bU0pFQ0NEQUhJTE1OTklMUE9Qau313s/W3tPR19PO0NDP1N7pfmVhZmZgbGVnYmVjW2psbuPxZfppWVhiV1BZZFvq3OLZ0dLPyczJwcnHxcnMy87X2eLd19ri5el6cGFodmp99HNnaGtVWGljXfvn/Wr6YE9ZVUpNTU1PVFddVUtRVE1PWWD94NvZ1tXS1eLf2t3h5nx2cmhdWFVUW2FSYWRra/Xr997O1/Dg+G31b2ddWHzc/Hbk4d/j5P7e0NPPz87K0tHV2ut34e/v5PP97uf1eN7X5eve6Nz2YfN2/tzv9t7sa11aT0hIQ0JGRUtKSEZGSEBFSERTbO7VzszMxcbNzcrOzdTq5Nzj62lWW1pYVVlWTVZdXG108+T2d1xkYF9dS01gX2x28t/Z2N3QzczLxsnFwMnHxM7f1Nb06HhpbW38a2Rt+HtkaO5lWGdXVmpwfenf5un5bWpnTUlSTExXVEhOUkZHS01OUF9y6NTKzNHPzNbaz9hleO5sX2FkUFFQTldUYPVgXvzd5NnO2Onb3fdtXFlaVmhgYOzi6ezk2djNzMnJy8jMzMrO1tfe4GRiemhv8mr54uX97+b7+Xxnbmxe8eDj3dHg+N9aSElLRkFMTEdPR0ZIQEhBRVRTevDPycvCxMPIzNHc3dvs7O5z/F5eXU9TWE5XW11cet7p2tbs4PVXWVJST1tVV+tr69rb1tvIzc+9zL+90LvMyr5nvUvl40XZR9tKbFz2ZephbWRP4knjTdVp4s/ry/bfZlFcTE1OS1NMU1JTTU5KSFBMVF9559zN0tXG39LYWtBZ9N9Nz0LjWE36R+RL6VrkdtPfydTQyerOU9lIXVdMY0xmXGPqaure2c3UyczKysTJyMbPzdznbGJ7Wlz6VN7xZ8tU2HdgzkPKVOrafcppzPrZUmpHWkBSTkRNP/I7VURBTUBWSFLtVdTS1cfJxcrJ0NLb3ePpfmdpYl5PVU5eT1drV+xs3dJu381N3fBB0ENI2zvWSlDBP8L+37phttXBwsy40sDIxM3N/NNddFlTXUnrUttbbFxoaF9pX+ll3erp7dfW+PlkXmFIW2E8dFBB2DxQaTzOPFbdPL9H0cpLuFq//ubITtZX51hw7uZM5Ev5Xk7RS8ljyN/N1ePLZc5PcWZI5T9TUkTdTV/pWdDh68TvysP3u9fPvdzEy2zH61DDQ9jcR7pH289EvkdvzD28T+nHP75G2uA/xDxjVDrXNFdSOdY030VL3j3SSd7lcsvqx9HGz8zJ88to2+Ne3fDxblVdXktwVlnmV9r5WttqXNVE4m89yTtsZjrIQH3OQ7phzbxUs+3EulezXb68TbNIyds8vTnSXUXBOslNUtc/0Erw9mzVXNftz27U/fndSt9DXVFC4z1cUEDaPPdbP8g9z2xKvEm96Ou/UclW3ntf2GfTZNpa4FVX603VVdnaV8pTzd5Ox0TdVz/JOPdQPso5y1thxla+9svNzsfgxc/A1sLQ2MxazFXk7GDGTs/mT8hA02lEwj/Hb0m+P8FaXclAzkdbTj9UPVBASklRSU5fTmtN111303y/4sjHd8Vq98lLztpQv0vc2ULXSFV5SlzdWFjVUO3xT95eTN9PT9tC5HhFxFHnxlO91ua6Y73CXbPwwr5ju2P8z2Ny3F9mzk7w50L5UUPaRlHKQ9PZSrxR8L1Ax+FIvTvz3jXFOFDlMsg6WuE3xEFq00O8UsrJULxByOVFuz7E5Uu7Rc/nSc5MV9FO2txKwkztzj/DQ2nUO8FBX+A8xj7s6EW9QMbST7VGvcVzs1+9v3e+597EXsrKT71O4887wD9P2Tm/QV7IPMBBeso7vD7U0Dy7N9tMO9Mw3T5K4jvKQt3kT71Nv9Hst0q6a+DCQrpKzdhPwj7QWFbYPM5HWtVAxD/g/T/JPstXWsxNxk3i91jZStBm09pfv1vGyXu398DAaLt9z8xlyv3dct5sWfE+6EtD4DrhUEbFRtrOSsRsa8Nw3sZy9dRFcWc4/UM+6jpUdzruYE7JV+TFW9nMTMvcTr9ZbcRHz+lIy01byE701k/K2knFYFHGRXDLRs7PQsZaP8A9T8o4zNxAu0huuETAw1i02uG1a9C7Vb/ESLv6Tb49bsw0yU08vzvnzjm9Wka7P9XLPLhaULw5z2E2yTZSZTjPP2hvSshMx9zdvVi77mS7RcLdTLhF6cs8w0hEwzrcaUG9P9rYQcNB5fxDy0bQbVvCRM1XVMc9yGJnwUPE1l3Abs3C/cPL8Mff2s/t1/LiXGjxQmxGS2A65EhV3UHEalu/XczKX7/c/8hg+3dNU0xNQVRLPXU/W19Aykzf0lO8U/vHTM71V8prZ9H7YNlgWt9Va9l0fdPQYdDaVtJgTNZqRthqSNpaS9xOStxRTdRcYMth2MbtycTOzMXMz8XM2cLTW77nTc5OSHZAROFDSc9KVcVP2MJIxNNEv3JLx0NSzTpZZjvrP0LUPmXcRcZ8b7lsz7tUzMxMwXBTw1Z2z0Xw3zvzXT/SR1rEP9fIQsRfUMY+7NBAz2RUx0fa2krKTHHOScty6sdawdLUxHy+7d3CXcTybcVO691F4UZFeDpiVEfWSdba9cb8wtDzwV7K7FPGSl97P35EP2c5UFE/2kb800zH+t7HWcvy489Wynve3FjIWGTSTer5Vc39XMniaM77b9pTZOhNVftSY3RMelxMb1JiV1XPbWrJ2NrG1sy+7M2+/cnBbMXLW9TdU2F4SktgRkx7Rk/ObFfG0VvL11TR7EzR9EfgaEJWVT1SUT1ndkfiyl7SwnzVxnJ7xF5hxl9Yyl5Yz1VP1lpH22FL2mlOz+lUzuRO5txJatFL7dNP3s9KZs9MTctQWb9T+L1i37tn8btV27xKz8VB0dxC0VdC2ElA1kVL0j/g0ku/1OC8asjFTsjvXMtL7vpEakRHSj5cQk/xR9ZeXMNQ1NNOwmxexVjrz1bezV/xyV16xlftylPozl5tyHNNzVdH3EtO3k9o6FD8U0bjSEfPTm7MZM/Z78fnzcpvwM3pvtrQyX7R7/7dWtpVTtZGZmBE20ptzU/K41PGV1rOUnnPXGHdSUvuPkd3QVjoVmfQ3WDL01LNz17d1277799oattabtdZb2X0ZkjXXknI7FLN8E3t9Uxg0V5cxedYyt1I3t1D68hN6cJXZL55Ur7xTbzvTb7qS8LdScvqSct8StdnSPVqSPLpVs/deMzj4OBl0vplyW5V4E5MUEZLR1NYSWh8S/jYUmXRdGbN4lXP21DNzE7TwFrpv2tzv2JOxXhKxN5BzOg82ng83+FC081E4dtFa3VJc95X7thd095eymzpxV/NynDF1/bC4WzH6WLNYVbPVE/kTU7gWVXaZlTddlXd91jV/v/TUOluROlMS+tKYuRMfdBSdc9R581S5NBP7M9c5c1i5st7585s8dFWbv1U01ZW1Ulv90fwZUvf3V3L0FjM3U3Y9FDW5k/k4Vfd31bj3lvU1mPQ7PXKW9HNXMzgZtV4ZdhoUeJbWNhY/dVQ6tZWcdprb87ua9D+UftsR1TvSkzdVEntZU1u71xh3vVc4dx63d3U2/rN2W3PzuvfzXl02F1Z+VpHXGRDV3RJY9ZlcdDwXv/pXFfc+FPs3GtX7NpTbdB6c9DP7s/E2+DL0F/ZyU1nyVpT2vRNbfJKXepKT+FRSt9rTtvUX+vO8W3kbl1faGVYaN5oT9rqQt7RSGXRYlXM1FrU01zazVRpy2JXz+Vb4udSW2lWUFVYT09Z/2d6x/VlvtdQ0c5VXc1dTs3sStzmRW/PSXXFVfy/3PnF3lfN2EfZykj0xU1exk9XyUtPylBLylZHzWRVymVgyXdX1ftM5e5L53dF2vw/9vM/d99H485Q0sBb+L5dV8JtTsXTU8jLTdLIRV/MSknbUUD+XkTa20fOy0vSzUb7y0poy0twyUpezEpT2FNox+3bus3jvdxgxV9Lz1tOynBLz+xD6OBCaN1AW9lCVMdUTcXcTcfLT87bTM/dStPVSd/RR2/XQV7SQmW+V3LBbWnQV13aTk/MXlDHfE7G+EXM5kPZ6kF75Uju21fOzFnKwkrkw0piwk1YyVlM02NBd3Y+ZsxO379g2b5WecROTcdmTcT0TcdhSsv1Rs3fRs7tSc3tSsvWS8/KSfHNSmLRTl/YSVPPTknRTkDcVkrK21fBy1DF0EzP3ErOz1LJzErYzEnt0Up320Jl2EFV109W12pY02VO0GtNzdhM2ctP7s5JattEZ89W7MHb5r/RaMjsStjpR9jQR2faSF3ZRmnWQmTPR1PKUVHGaF6/YlrBYEvE1kzM1UvPzkfczj5bzEFOx1VSxfVQx/xGzn0/3tJIe81JaMdNWsJWTML0Rs3gRdPPSs/ITNbESmbAVFHFWE3GXEnIWz3a9z501Eh4xlXmv1tgwl9LyNxKztJE3NBD4chJ+cNdWcbqTs3eSsvVSM7LQ3vHTFPKT0zNXErMbUHX5z33zUNuxFHtwVRuwmFPxtJLzMtH1ctI6slGXsZOS8lYQ9F2RdLdRNvNQ3jFSV3BUVTBaVzDb0rO5kHfy0jzxFr6wXNsxG9Oyd5E2c5BWc9ETdFITMlWSMbjSMvOTNDKUNPFTOjDSVnEWFXI/FTH6UvN4UDc1z5nzURdy0xWy1BMx3hFytVC2cxE68dGcsRJX8BPScVvScXcSsPaRMrOPtrIQnjDSm7ATVfBR0bFTT/KZkHK30LN0ULOxUbYv0xmw0xPxU1MwGNJwttHx8xIy8NH0sJD4cJBWcVGS8hPSsZfSMXtQM3WPuTOPu3KQXbGQV6+U1W76lS+30nD2kLI0j/TzEHtzUJcyEhWxE1Kw1dAzGxDx+FGx9FIycpH5slLXslMVMRVTsNaRcX2R8nTS83ORN/SPV/NP0zGTlDCUk69bla82k7FzknUzkXcykfqxU1rvl5cw2VPy19F2Vw/6HE8ceJAb81G779RZcBYUsN4V8X4TsjjR9TWSdnHUvnHWlvOUUvPX0fN20nTzEvkzUdnzEVNz0pPyFlIy2pGyt9LyMtOytdHzPJByF5ExVhZwk3xv0nIwke/1EXCSUvBPufKOsRoRrpIdb09xtk9u0VPvzjg4Tq/TEy9P8rEQrz0Sb1IW79E4sVE/dlC7M9J3s1KftBLVttQVNJrV8zZXdXOVnHKbVDb7ktq1VlV13xLZN1QV87UVW/MZ0js00pG0N1EZ8P/Scm9Ylm9wktbwnU/9L9kRdPEU0fNxVNOyMtJRs7QSUbY4j9F2OJASsvMTVXDxlFQyclVUsfDWkjly2FN3sXySmnNcUVW0uJJUM/OWlDYzWZN7stzSE/a60pP2NBTS/DQaE7hxtpWZdDaUU7t1mdTctbmWHbNzPZo0szxUWzedlRb3t1eWfDbe2Lnztb/ed7Z/V505mdRVmtsV1nl2O9s6NniYF/y6/dv/eR0WVvy7WtdcOZpVV3y5mtj39Po9N7X3ff63914Zmd3dltZaH5qWVlka1po+vZ8Z210alpbam50YXbr9ezg1dDX2NPW5ezo8PD5/e717v5+7efl5uPk53tq+P5sW1tgWlVTXGlmanXs8vfj4+vs6N3d4uvp8mxu83xtcvt1am56fv1+fG1l++54d/Po63d7d3Rra2hiYV9ja2JrbHvw6ex9ffxwZV5gYnJ1bnX8+PHh393f49/k6unm7v3w+HF+7/xze+3g3tza2d7d3d/qfHVgWlpbXV9qaXJwfPT9e3tyaXJ9d/1sanJpam588vpwcPx9++no8PPv5OXo4uLk7Ofl+HB68XJibW5mXFxgYFhebWRaXWVhW1tbZGNjaWpuevXt49zU0dDS1tne4eDd723u5u9+7urk39/c3uDl5uv2/21fWFdYUllfamNda352cXXs7e3h3uTu6/J4dm7+8/js7/J6+OvucmtuamZzcHz6+fT7cnDu9XhtbW9qaXRxcWtydG5lZWRdX2tdXGdwamNmc/f+8+Xb3NzZ1t3t6u5xZm3/9PTp6O7n3Nbc39fV1dzY19/4bm5gWllmZltcY2ZpcXVobXB9bW91bGFhYGhveuzo6e7v6+jmd/vv+/Pt6Onh4ebq9O50ev15cGxsdf5oXWdmYVZUV1JPU1VYVl5pZV9lbWJp7+3h187Nz8/S1dre7nJteOXg5eHb19na3tzb4+jn7fDu/mhdWVVWXV9aW1pebm5m+9/h6ufm4vL+fnJueu/o6enr9P3t/GhqcHJsam76/nb9/m1xcnNubXx6dXz6e29+efRvYF1ZV1dWWFxgX2lnYGRoZmpx5tre2tLa5erl8GxkfPHv39nY1dHPz9PVz9bZ2Nfa5uvubFlXXFlVU1VZWFhiX2R3//70endtZGRoan706eTr9Onk+3F87uvt39vj7OHg7vv0/GpeamhgYGx0ZV5leGddZlpRT05RUU9VYWFgaHZ1aWzu6ujYzc3Q09TV3u7q8/ro393f29PQ2dzU2ubn3+B6aX37X1tgXltZXlpWXGNbXGrx6uPd2drs+/j3+nzy5OL+evL6bmhqaGd98Pl8+/p0bG97fGdu/2peYnz8cHj37fbx6/dsaGZVTlNYV1dkZVxbaHNlZ3b68eTb29/j6Pr8fe7e19bY0tLPzMzO1tjV09vf4uf/aGhuamZtYVVVWV9YWFhbWl129n3//2Rnbn7p7PLt9Pnt4eRoeHlu7t7f2uf153VpeHDu/2diW15eYmVcZG16b2dwY1tXUlNVXFtgYGJiXnX09fP85tjb2tfQ1vZx6uLr3NHe3tfP1trX0Njj3tbi9XptZldWXXFtX2Jpa1pdaW1jZ3n9+uzd63rz3Oft397oePXla15seGJaZfn2e3TveGFgYHl5eu7teXvqXmbxfuVqb9/ke3X4aFlTW2NaVFlqZk5YbWJlXG7m79vf32hX+Xrs0MzY1dDN0dXOyNLWzczQ2dXobH1dbGpXXmFXVVNaV1VVbGFTTl99Ylxwe1hw2d508tnQ3mp+enNw49z519zhzU9c0uFWXNjf4ONWT2tkWlZeZfJqW/BtVFNrZVxOaeltaFdYd3vt/mRv6eDr7Nrb//bp1tLy4NDb3czNztLX1eLp2dpvXPl8+ltd721ebHX3X15qbmlhbvd4b2x+eGD96Hhr5t11+XP+/Fpk93Zh4HZiaXDpeFlu53tt6dvvaG58fV1kaXh2/Hd0dmZu7lxX+WljX1ZeYVhUbGtb5+b+cn36+Hbg6dvQz8zMzsnFyMrJytLW1dXf8uTe82Z7811WXmBZV19qXlpgXnNiWltUW1hVXF7/8PDx6O3v+m3v+Pnq39fp5uTu5nd3Z2JqavtuaWp3ZmdfXF1UVVpTVV5hXFlZW2NkX2ZbYmRqe3NyanLwb3B67f1x6N3a0dDRz87Lx8nMzc/P2trd7e35d/Ztfe5yb15q8OfheW5r8+luaGJvZE1UXl9cX3duWFtudF1hb+/n4Nvb+Pzy5vVqbH31aGx64fPn4t3han5lXl1ibWJlYGhdWFxaU1NVXF1XWF5dZ2pdWltjXlNi+e//2crLzsvEysrJx8fH0c/Z2vT+2PX78ffoXU5r9mty7vNnZPpuX15ZYVJLTFZUVV1rYGXa5Gtv2+jaz8fM0Nji2t/p9OTsXlxRVGPefnX59eHqUFl2W1Vad15UWU5VVmT/XnlmWXtuZXNj/Fp0alJZWlv2zs7QycfMz+TOytHW6drd+nNtd3hkXt/0YGVY4HZn59/x5OvoZlltZl9kb2JgWFRiX1JZWWxTVmts2dDg0PDf2u55VfBbV9f1zurP51zW3NPe2tziaNrnbmpf+15bWE1PYEpbY1hvWHBeU2pXXE5MVFp64NzUysvPysrT0M7N09XZz9PTbV91aOtfWVBRZFhwaGV4Z/1jY2pWTmBhVX5ZZ2piX193d2lrcGrj0MvM0sfP2tbu8tvw6d3n3uDtdvh8cu1q8nZgZFVkYFZcWl9bWF5aW1xncGhg+GFfeW1tbF9dXWBv4tjY0NLLy8/Qzc7M0dLYzsvl8Wx47OXw7Wxw/23y9Ov16fB7amdpVlBQUE9SXVZVX1tkXV1cWFZm6eXd2tfX5ebb5uLz9tra4ubs3d31fObXdPZ7cH1ea11jVE5PUk9STVJZWFNbZl9aVmReWlpcV1xh/ePm3NHS1c3Lx8vMyM7PzMzW1OPg3OLu5+ducXx0/mxc+2FuZGx9blpdV1ZmYmdna2JwdftqXGny9vDq29HW3dzle+31+3Nu+Ofr+W787HV6dnFbXWhvXlVeW1dYW1pbXFdVXFxt/Wxwa2Zoam1gWlhYX3T15dvd0s/Z1MzIzs3MzdLX2Nfn7+nj3/X46nZpaG10/vdx/Or8d3FtXVtdX15eaGFdZGRdW1dfXlxjfP7u5+Tm5N/j8PDm6fDu39/j5dra4ufk8nJqZWJbWVpZUlZZVlJMS1FOT1leWVlYW15UVVhXWlx68ObYzczLycTBwcTExMfIycnR1NnY3uHr/XlxZl5dXWJjX2VxZmRkXlpbXmZoX2loa2NjZ3Jna/P//HTq4ubt3trffvb0Zl9s93Bqeenp8/vn7GpdX1tSVFRVV1pYX11fWFpjZWpvdXBqZmRfXlpcWlxgY2rw5eTXzszOzMnLztLOztPZ0tLY5dra7Xf06nlnbftxZ3Tu8Xd6+3NtaXJtcF5ZY2JdXGJmZWBpa2trcXb47enf3+bvfXb+cHfy6vDu3tvf5+jn+l5dX1tSTlNWUlBZWlNPVV1ZVlxdWVVWV1hYVlpdY19u6drSz8nFxcTCxsnKx83Mzc/P3tXo+OtfanNdbVxXcGZiWmh7YF1kcntpcXp1Z19rbWFgdv90cH7w6O3q3ubp5OrzbmVpZWNkaXn7cPHq7O34/21iXmFgW1hYW11eXWpraGVeamldXmFeVFJWVVJNU1dVWmbs1tPNysnKy8fJzM3MzM7Oy83R293Z4/v1+XptanX2+Wt5+nRmX2pyZ2JjX15aWF9jW11pa25rdO3r9ejf4eX1+vtub3j99/327Ov97+Hv+Xx+cV5dZmZbVFReWVdhbmpcXF5hWlNWV1RRUFRXVVFRXGlq7tTOzs3KyMrKycjKzs3NzM7R0drj8Pb0/nR8/W9rc3NoX15lYlxhbG1hW2dvY15xcmdjXW94ePjm4+Tr7+fsdm1paWhodfX6+PLw7/Dy8f12dnFwbm1tamBaW2Jpd3r/+WlfYmdgWFRVU09OUE9MTFJbZnXh2NXRzszLyszLy87PzMvKztDP1Nva3eDj6erq9fh7amhiWlxhXF9cV1paX2RfYGdoYmBcYXpz8ubn4ens5u34/fvz+/365uXs6e71+Ht7bWFseHBnX15ZVFNaW15lbGpmX1lbW1dXTk5QTlFQUVtfbezo3tjW1M3NysjIx83RzsjKzc7N0N3a2uDj6uHm8PptZWJeX1pbX15fW19lamlwcmpkZmNgYGVq/uzx9vD3/HVzcm5uZmZsd/ns4+XtcHvzdGpodOzz/X53a15fZm9oZntuamRiZ1tZVVFPT1FOTE1QWV9t/ern3dnQzczLy8zOzcvJycjKycrMz9PX1tXX1dfj+XRsX1tbXFpUUlVVV1VZW2JdWWdrY1tjePx1fvTz8vft3ern7ff4fOjm5uHg5vl19m5nYWVy/WxhXl1WUVNYXVZbXmVbWVtgWlNSU1VQU1lfXmZ27e3u5tnT1c/Nzc7P0MzKy8zLzM3S09Pc3dvW2N7g6PxtamRcV1hcX1xdY25nYmR6cV9mc3lvcvrsc3N49HxxbHr7aGdtfXp87t7e3ubh8mllZ25wen38emxnamZlYFxdX2FtbFxbV1hST09TUU1OWl9dXm33cPbn2NXb2dPS1dPOy8nJycbIyMrMz9fZ0tPc3OTtemZfW1VWVVdWVlhcXFhgXWFcX2xuZG1tbGttdX33bm977/d8+uvv+unf3dve6+xuY2FwZl9lZWZeYWJfWllcX15lcG5cV1hYVlVWWl1YXGt6bHn57/Lz6tza3tzW0tfWz83OzszKys7Oz9Xd3Nnb4+Pf531oZWReWl5jY1pdY2ZfXmh3bl1l7u5nbH39amdtel9aXmhqXWR6+Pnz49rb3urqaVxkc2xiZXH+Z2htc2BaYnVmY21wXFRYWl1TUFdYV1hfcmhnavLseHbr3O713tfY2NTOy8vKx8TK0M/N1Nra1tjc3t/he2psamRgX2heWFVcY1xbaHJeYP7va2Nn+/tpbXtuYWJw/m1odPD2/uvV0t/v7H5iXl9hXFhab21iYWtoX2Ju7XBgXWBZVVZcVkxNWFtcXWF4d3Pz3ujr6+He397W1Nva1c3MzczJz9LR0NHX29bU3ePg3+9wanxvbWdhYVtVWmNhXFtja3Zz/fZ4a3v3cGZtc2VqbW50cWtyefro3t3i7H38cmRaXmRgXmp4aWprcXpvce/zbl9iYF1ZVlJPT09XWVhXYm57/ezl5/P25uHj5t3f3tvPzc3Nzs7P0dLV2NnX0dfa3N3o9Hj+8/xsZW5mYGFmYV1aX2NnZmNna25qbnB+cmRocnB0bGpoaHj66ufi6+bn531ta2VhXWRze3Bzd3737ff+bmtjZmNeWVVWUlRTWVhVWFxgbPTh5Ord3N7f3d7k8eTb2dbPzc7O0M3Oz9LX2djd4dnd7Xd9+HZlcPZ0X2hqaV5cYmFfXmRne2dnamtoam9qbm5tdmpjZmRtZW/z7Pfv6Op7ZnZ8Z1pkcGllZWf8/Hh79+5ubPp3W1lbXE9NUlxZVmBlbm175t3m6t/Z4e7q4+538N7X19POzNTSzczO1tXS197b2drs+O71a3b36e92dvDzYF1iZ1lUYf5wYGJ2al5j/fdnX2FgW1ZZY2VhZfPl7ezh3n1uefRwZXf2dmFu9fNubv75cXJ07mtWUlRTTk1RWlNQVmFjZ27p3OXn2tjd7vXpcWry1tTSzsnHysvKys/V29TV3ePZ4HFnbXtmZXf3bGVqcGNeX2VcWl9u/WpkZf95bW7s73drampcWl1ramtz6+He6OPm93Fod3FpdftnZG57cXFpc/V4dnf+ZFVPVFJOUlxlXllhcmx37+nx6e3m5Px0amlpcunZ2tTMysrLzMvM09va19va397pfW95fHj64+X+dXZ1ZmZgXlteZ3NoXl9nbmplaf5wXlldWlRXXmZgbPPk5evq6vhubHn96+bn5vz28P1sZXby/nJvbV5VUU9QTk1WXl9dYHN8ZWvz8/jt5ev1/vP+d+3i3M/NzcfGyMrMy8/a1dLZ5ePk6Xtobm5rb3L682todW5hYGJkY2NpaV1dYGJmZWn393JpamleWF5sa2nv4O/+9e54aWZsdfju5eXr+P99bGNgcXhqYmxnXFhWVlVYWmZ0cm9993xhb/H0+nLz7Xpv9/t49ODY1dDNycnMzs7P19vU093g4uXwfezl6e7w5+ft+3l6aV9iaWpgXWpdU1VcXlleYGVnaGlrYVtXWmht/O7p6v52+vxxeOvn593Z2OHy9PRxaG35a11jY1tVVFVSUVVaYGh1eHt4bGdocHVt/ez5bPvn6urf2dDPzcrLy8/S1dLW19jY3Or68fZ2/e/2/vrx7Ph4fW9jX2R7b2FeYl9YZWdlYmD56+3u9XRtYVxgZGRufHtsX2BjXl1nb/fu6+Pl5+14dHNqaG1xYVpbYF9eYF5fZnN7dXru9nhwa2l4+Xxza3Blafjv8Ozd1M/Ozs3P1NjZ1dHQ09ne5eTo5eXn5ePd4fDq7XhqbmdcW15pXFVXV1FVVlhcXmZ1e/56ZWNfXV1pdfr38O96c/Hx9+zq39re39zh7Hd1d2toX1taWFRYWVlYWl5dZWVldXBqcXR7/ujrfW9w+/jx6d3Z2tbPzc7R1Njc297Y1dfc2+Dm7O3z7Ojr5+bn7OjvdmJlZWRfXV5hWllhX2BqeXN3bHBxbHBdXFlbXWBmaWZkY2JfYnT8+u3f29nf4urs/Hn9emRdXV5gW15hbGlpaG1tb3JwbWVv+vVob3VpX15kam796N/c2dDPz9fa29rc2tnY19jT1dfa2djX3d7c2N3k8/P+Zl9eYFhSVlpSUFdhZWVjZGBeYl5cV1xgX19hanJtbXD8733t5ODo49zX2uTr6/xkY2JgW1tbV1JWV1tcWV1jaGdpZnJ4ef7o8ntu/Pdobujc293b2NvW0tLa3Nnd6Ofi3uDl3uHd4+be3uns39PW5O7w6HloZWReXV9mX2Zv+/P89n1qX1xXV1VYW1taV1ZeaVtZZ/T8envg3uPc2d3j5+fsbm1ucmt5am9qX2hwaF5hbXRhX3D1bmhq/W5fXGJcV2R07e/x5d7l3NvY2dnY19nh397a3N7a0NPX1tTV29nS1uDl7OptYV5cWldWVlpcXWJwa2lfZVpST1VUVFhbW1ZdZm9pfOPa29zb1tnd3dza5Ovv92xfXmluZ11haWBbWVtZW19kX2Rrc3FyfX1rY2NkaGZ67eDf3+Pa1t3e19TT1dfW3+jr6Pjv6uPi6ebh397b29nc4uLg7XhhYGViX2ZtcnRy9/J9a2dZV1VVVlJTVFBPV1tbXGvx6Off4d7d3+Lf297h6+36cGt9dnV6+vl1eWxlX2ppZWdtcG5qbm9lW1haWFhaZm9wd+/n3t/d2dbU0tDOz9rf3t3p5Nra3dzZ2dvY09XY2dfe6XhlXVtaXFpdX19udGpeZGNbU1NXVVBPVVhQUFliYF7539jb2dXR1t7a2dvj6uztbWVpbGZfZ352aWliWllfYmZdaf37bXn8dV5XXmFkX2v35u3x3Nbf3tnT09jW0Nfo6OfrdXjq4OXt5d7d397Uz9nY1NbnbGJqYFhdbXN78+3pdG5vZlpXVldSTU5PTUxOUllZXvve5ezl19bq5NbX4OPg3u5y+/T89e/m4+1+dW9lZl5qaWFrdGpeXl9bUk9VWlZaYXx7cfTf3d3Y0c7O0NLP1dzh3N3g49zX3N3b1djZ087Q19ve9mdbWVxWVlpoaW1qbWZeXF1aVlJUWlRQUFRPUFRfbHP53dna3NrW2dvb2Nrf7PTzempvfnt8dXdwaV1gWFhXWV1lZ25xZGVZW1pcV19eYm177u7v6dvY1NPQ0NHY19re4ubj5+zv5+Dh5+Hd2dvX1NDS197se2RlXmJnbn777fZuaWVgX1hXVVVPTEpJS0tOVFpdYWz69ffy5eng4N3Z29rf6evj5Obi3uDh7ubscW5jXVpbXGhsaFxaWlpUWFxaW1xjZmhhcf315N3Wz83O0dHT19fb2Nzb3N7a2d3Z1NTT1dTS09rndmxnXVlaX19dXGNgXFxfXFxaV1leV05NTU9PU1tlbvjr5+Xi3+Dh5uXi3Nzf6uj1/enn6eno6n5sa2VgWlZUVltdaGdgYGNtcGVpd25lanNxbXXu7Ozp3NXT19vV2N/i4uXq7ubm6Ofe3t7b2dLS09HW2t7u7e11Zm/+cmdndHZscW1oY1xZV1BKSUlJS0xRXF9ibX3+fvzx7fTo3drY29rW2uHd2tvc3d/m8vTt/WVaWFZUUFRYWFZWWV5cWF9qXFdbYWljZH7j39vSzs/R09HU1tbU0tje3Nba2NPW2d3a19vl6+fvcmVnaF5UV1xbWVtoa15eb3BuaF9bVE9NT1NXWWV4fX3r4un3/PDu6+ri4uPh3d3f5+fl7fv/8PN7enhrXVpdXFhXWmFjZWJsc21iZG5kXV9wcGt46OLg4Nza297k4t3a4d/e4OPd2dfY2dXU0tTW2dba3eLo8vX3bmpobnVsbHFrZGNkXVxWT05KSUhMT1FSV2BlaGdtb2596ubi29bSztDU1NTW3dvc3uPi3eTve2NbWFRUUVdYVVRXXFtdWltYWFlaX2Vw/ezd2tnV1dTa19rW0tTX2dTQ0tHS1dfb2t3b3efk4eHvfH1zZWZlZmdmZ2NiZWliYWFdV1hXUlJTV1hbYGRmdHJ0cv9+//L69e/h2tja2t3j5OHl6urv+PPx/nltZl5dXVtdXl5dW1xgYl9bXl5bXF5udX334Nzf5N7a3uPf3NjZ29jT0dfT1Nba29fX29vZ2Nve3ejz+PB7cntzcW5nXl1aVVJQUE5NTU1OTk9UWFlXXmBoZ2N56/Dq39re3dTT0tTS1tTW3dzV2uDp5/FoY21pWFhYW1NSVFNPT1BPUVFPVVxVWm3m5end1Nja1tPS1tTRztPT0M7Nz9fW093d3Nzo5d7e7vXz9/p0a21+bGhkaF1ZWmBZT1BVU01PUlZVWVlbX2NhbnttZfzf7PTs3OHo3NTa3tnW2t3d39/k6nR68n5rfHlmYGdfV1RWV1FTVFVUVFZaXFpfbfb8fOnX297a1tjY1tTW19TUz83Q2M/P1NjT0trk3dzv9+Ll/Ht1/WpqY1pYXVhSVFFMTE5MTE1SU1FVW1lZX2hvZ3Tn3+Hh4tnV1tzU0dfX1tLY2trd7vB2bWxuaV5gYmBaWlVQT1hTT1BUUE1QWFdba3X99uTe2NTS1tHOz9XT0NfW0M7T1M/P09TV2Nna3uzq6/t1/nJpaW5iXFtdXV1qYVtXV1RPT1BPUlZTVV5jXF1mamZ56+bz8ejl3tnZ29bV1dvS0Nrj3+Zyd/tza2hnYV9pYlxaXFdVWFpWVFRQTk9aWVtr+HB75tvZ3NfT0NPV1dDS2tvS0NLRzc3U1tPW3t7i7vr4a2VrbF9eZF5aXm5gXWJkWVRYV05OVFVQVl5bXV9eW2Z9/vTf2eDl2dne2dPQ09XW1tja4vDt8WtncWhgXl5cW15kXV1fWVZbXVZRUFFPU1ldZfXr+una2drX0dLY08/R0s/V2dTP0NHOzdTa1trh4+b+c3ZsYF9pYFldbGNhcXRmZl9YUFFRTU1PTkxSVldVWFlcY3Tz7+Ld3NrV1tfQztLSz87U1tbj/vHrdXX7b2JfYF5cYmFWVlpUT1ZZTklNVE5NWV5ebfPu5dfa2dfS0tTPzM/Sz87PzszLzM3N09nZ3evp+mtsbF1ZYGRcWGBoX19pZ19bWFVTVVFOUFNPT1piWFdjaWR039zf3Nfa29bV19fU19jU09rg5vVrePd3Z2tsYV5nbmRfXVpYW1RSV1dOTlJVUlVeZ2386+Td2djX0dHU1M/O1NPP1NnSzc7QztLb4d/l9Oz4bm1sZWJsfWZdbXplX2xoWVZaVlFPTktNT05QXGBZXGp6bvHe3eDd2Nrb2dnY1NPU09DY5OPle2347m9o/P5paG5jXl1YUlVXUE1SVUxLT1BNUFxkYHvh4dvSztDOzM3Oy8vP0s3O087LzNHU2OP19XNkZ2tjZ3p7aWhsYVxlbmBeZWBYWFpVUU5OTlJYV1hncGZt59zl5NzY3dvY3eDg4+LY1dnc2t7vfvptZGt5cG/892lfYV5YWl1YWFtYU1RXT05UWFZWYGx07t/a19DOz87MzNDOztfd2dfa1dDT2dzh93JzZWNte/nw5u1va3Z4anr7Zl1hXVVQUE1KTE5NUFlWV2V7dP/j3eXm2tje3t/r9ung4dvU2N3Z3PR96e11/ert+/h0XlpYVlVXWlRSVlROTlBPTVJYVVps/vng1tPQzMzLyMfLzczP2dnQ0trZ0tjg6fliXmJfXW1+b3P1dWBgbWRcZmxeWV5bU1JUUk9SV1Zcamtq+eXg4NfV29vW2+7x+W9u/fDt4d3h5OX7aXX5dGz86/N0dXZoYmRcWmBgW1pcWVFWXVdUXWBdZn318ePa2djOy83MzdHX2t3o593c4drS3vbw821odvn88uvs5uHufvrvc2NncF9UVFVOTE9PTlJWVVpmZGF26+zl19Xa29rnfPXr/nfr397b2N3q5Oh6fuXwbf/qdGJva1lWXVpSWFxUUVVWUVNaV1Nda15d/uXr4NLOzMjFysrIzNLT09nd2tjf5eZ9Yl9iXVxmb2Ni/+338PdvePH9am7/Y1pcXlhYXl5bW2JkZnB8cPve3N3a2eHt6O1oZnZrZXzo8PPm7Hh1+ftu/vV4fe31cHV+al1ncl9bZWhdXmFcW15eV1dfXFto/frp2M/PzcrMzc3O197b3N/f3un09XRiYm1nY2n6/PTf3ubm4uny7vZqYmhkWllZUk9TVFBSWl9ZW2tz/uXf49/e3+bl6PV1+Ozy6d/f4uXl5Ozp6nt2+fd+/nhoZmNlX1tdXFpcXVtcW1lZWVtaWV1gZHbo3dfQzcrJyMjMzc7V2Nrb3ubn+W5lY11YW1taYnr6+fXs6vLs7f92dHFqbG1iXV5eV1dgZWJjaW989urn5eTk5ufr83JsbW9tePLv8PN7ffb6d2txd/75fvf4/XZ4/XR0c3R7cGlpZ2FeW1dWV1hXW2NndOnf2dLNzM3OztDW2dnb3ODj6fD3cmdpaGBhdvPt5uPg3t7f5e/3/HJpbmxhWVlZVVNTVlZYWFxqcG557+fn6+3v8vr79/zu6ube3t7g3uHn7PP3efrvenb+eGxrZ2RhYmZgXmNfWVlaV1ZWVlRSW2lu+d/c2dLMysrKyczO0NbZ19rk6+38amRkXFVZXl9oc354+PHt6+rpeHB8bWx6dGNfZmFdXWZlYm53fvDq7fTo5/dy+fZlZGlpZW7w+fjt8fv7+Xhy/Xx4/u3s+evo9nr27Xdv/n5zbWdeXFtVUlJSUFhlbnD65N/d1tDQ09LR19rZ3N3b3ufo5fB7c3VsY277+O3o4+Lq6+fo7PxraHBkXV5bV1JTV1VXXmJlbHnx6e7q6PT9ffrz+nR2/3t97+Hd5ubh5u7z8Pd6dHJ7e35+b3BrYWNkY2BfYFxaW11aVldVV11o/une29rUz8/PzMzQ0tTV3N7c4uz19XtpaWNdXVxfY3l4c/vw7fvw6fRza3B0cGtpaF5cXl9ma3D87ero4OHi5Ojt+f10bGliXVpeY2dueX53c/b0/n3/enP96+jq5uHn9f1++vt7d3BrZV1cXlpVVVhcXWV88PHq4t3a19bX2tva3ODq7Onu+/Tw8/v3+m9ueP7u5uDk5t3f5+nv/HBzcGNgYFtUVllaXmVnaHL6/fjq6v17+v9zdH50a2tjZXT6/P3r5+zo3+f87u9teOvq+Pfs9nNwdGpqbmFcXVxXVVtcV1hlZ2fw6fDk2dbZ1dDU1tPU29nX5O7o7Hhsfn1nZm5gXGdnX2zv9Xfv5fd58PJsd/V0aGlpX191fnH55ufk3eHs4t7pe3d6Y19oY1pdX11bX2Rkb/f0fPzvdm95cm/w3uDo4Nzi5+fsfvPsc2JlZGBfYmJcXmtubXR9+Orh5enn4N/n4uLp4uTu/ffz8/Du6vd6fH51cHvu4t/f3dzb3u3u+m1ramBZWVxeX2FpaG7+fH3/fvX8/ntvbX72dXV1cnX8/Xb+6uHl5+Dp7/1vZ2Vx/v3z8Ozv6uV9amhnX1pZWFleYF9ga3b88Ovt69/b3N/d2trZ29zc3d7r9fF7evbxeGtybmVhXVthbW5t++fh4+Li6u/s8X15cmlp+uv+/ebi6vXu7Ozpfmxsa2NeZWdgXmFmYF5hZ2t2/XN78/VsaG5ud+vk49/b3N3Y2+bn63ZhYWhhYGZpXl9pZmd1eW966+92/OfyffPv8Ofh7vTo5e3o3d7z9+5+cGtvefLo7Obe2t7k3uj/eXdqYWNgXWFtamJ0e2Zkbnp6+n1tbHh6aW34cW/983lu7ujs6ufu+uz3ZWNua2R36+vt5+Tx7+x9bmxiV1VdX1xdbWxpendu+eXq8uTe5ufc3eTi4Obp4+z58ejwd+7qemlpX1dZXl1ed/V77N3e5NzZ5O3r9HB78f128Ojz9+frdXzt/W92d2VfZ15bYGNZWmBeXGd5d3z4+H15fW1t+e7379/e3drX3OHb3vP79GhdZmZdXGZpXV5iX2F0emxv/n5ucezv/Onj7fHi4ePf4Ono4uX4enRpZ3B1e+zo6erl3uLi3+f+cXlrZm5oYmV2bV9rdmtpenptevxyanZzaWv9dmNt/X147unv7Ofvc3R4aml1fnrx6+7u5+n3+PN7ZGRsZl5fZGNnamVnbWxufu7u9u/m5+bf3+Hi5uzz7evx9vD5/fHydGxrZF9gbWtpfPX29Obf5Obn6vny6vP69fv/+O7y/vrvfWx3eGxmZ2hqbGppYl9fW11kY2Jod/38//j5++7w8err8O/j4eHe3eHr5ut4dXdlXWBoX11gZmBfa2xobm1ma/Hr7OLc6nXu5PH46Ov78Ozt7eftcHrr7fbt7n577+3w59/ucvLrd3P5d2lmaGhtfHBjde5+cPv9aWhwfHN+821ibnFkaX5waHjr8/zs6nvx3+x+7+52bvPseH7q/Gn98m5nbGNcXmtiXGltXmn5d2198/js3drd2dfn/eTj+Hz6dml383568v5kcup7aHv0bG/t6/3u4Pdy6Od7fefucP/p7X7r5/vw5ftre/1nafT7ZWd9ZlliZFteZWJlfe//e+nk7+ne7Xrv8m5z6+x18N/w997hdW9uYWBnaFxbbm9eZnpmYGz+ffTc2eLh2uXv4+pra3xzbPzvfn3l4O7q5Ov29/tvduzuev/xfP7v+G9v+Hdr+O96+uTk9fDr+XN2d2l663dkaHFnYGtwY2B2c2l5+HX84N7s7uXrdXV0ZGv5/XB95uTq6On+aWtlXmBiX2Zua19ld3Bu9+fi29XY393b4Ont/WlnbWVibHRwdevo++7h7XB0+XV09flz/ObtfPDy+ezt7/Pq3uPt5un5+/f9bm51cXd3b2RobV5eZmVlZ2dhZG9++/fq6/Tu7vl7eXx5/e3t7d7d5Orm5vt2bV9dXV9fX2JfX2BlbG3w4+He393f4uDl7/r8cGpnZGd3/v7t7Onl7vV7cPv4+/11+e/z9O309u317+/+9Ont+Pv3+HpvcnBz+fh9fHd6em5tbmptdWlnaWdobv72/vPr9nr+em93fXp2/+7q7Ofp6+vv/2pnZmFgZmhiYmdnZWlw/eXe3+Le3eHh4+jt9vxsY2VmZWpwc3R++Px0d3x09er39+ro7evk4ejp5vX+7+zw8O77enz9eGh5/XZ++3drbW9pZ3Bya2lwZmFoZWVscHt7/O/49ubr9/Hu9f3t6Orq4uv48PdqZmppY2ZrZF5hYl5gcHt67eft8efi5+fe5vLu8nRrcnJrbXBvbnh9bnj07vr26+/16+fs6ejy+PTw/P3t7/fy93Rzc29pcvb3/vTzc3R9c29udW9pcHJmYWZiYWpycXN99vv05uny7O769e/v7/N+cWxzc2tsc29x/nZtaWdoYWl9/vnu7fTv6ufk5Oft8+7+aWttZ2Zpamtrb3Nxcv34+e7q6+fh4uPl6O7z7O/57ujx+fH3eHV6fHl5/HVucWxscHl2b3h2cG5va2JgX11gbnZ09u3r5+Ph4+Pm6+vo5e30+m9qanJwaGxsZmhrbGdoamZpbnFy//t4evvw6+Tg4+Xp7ff9e3FsaGtvd3l7fP748+/p5+vq6PD17ejt7uvw9PDw8/T4e3lzbW11fnlwb3Z6fvr4/v717/n3fmtmYV9eZGxudnt5fu7l5OTg5urp7fL7fW9nZGdnamxsbW18+f59fG5pdnlwefH0e/bu8Ozh4erq7fV6b21jZGdoaGdxd3F2e3736uru5OXt6ePk6Onm6e3t7fLp4/D7fnxtamxpYmFpZ2j+fnv06O18+fR0Y2JfW2Rycvzw7O7m3d7m4Nzm6uTr8/l8bGBiZF5eamljcH1va2tsZGZuZWB5+m529fDs49/f5eXp7u3ueHX1/25ueHx6/PN2b/p6bP/xe3zy8n796fJ97efv7uPse3d8eG95fmxqeXNtfe/u6+Hg6ezq+2toaF5dY2dt//n77uLh7Ong5vDr6/f/dmdfXl9dXm38cHfv/XL893Bve3ZobvD/b/Pu+u/j5ebm6fN8/H1rbn1tZm15bGt3/nJ47ft97fB79u76+enl6evh4ejj5fX++XxpaHVuY2p2ZmZ7/nnv4+nt4+l1bHVmX217cX7r7vns4uXr4N3s7ub1bHByZF1gY15ibmZld35sb/R2aW11aWd1e2127vTw3drd4d/j7vT1dXD0+2pre2thaHBqa/Xuev36Z2N5eXH+7Oru6uTo7OPl+vbr+nl8fWtmcnZmbPf99ODe5OHl7f5wbmhofP9ubHlzdvrp6Obe4PL682lkb25mZ21uampoZGh5d2tw9vttb3puaXB2cnvt5+LZ2uTm5ev+c3N0b3VuYmFgX2BmcHf76uX9anBubXn79+vl5erq5uTm5OPv+e7r93Bta2ZpbGdn++zy8Ono6+7vem1vd3RwdWpndPH08N/b3uDh7nR+/G9tcXFnaWleWl9nYGJucWx4fmtkb3Vpbfn4fOXZ3eHc3ebn6P1wfvFvaHBoX2d3amn973lw+21faXxravLr9vvv/Xrm3efo3eHx6up0aXj9aWb9fG3s5Pb96ODs7uj+aXz2aGZyb2Rz9Pbs3tvx/ujvdvbwb2p9/WZhY1xZY2pfZ/z9bWxuZ2Ryfmlw7PL25t7n6dzf8PDs/m3+fmdpfnpla3ZtbX57aGn8dWhteGtr8fB3efL5+eXc3t/a3u/y8HlzfHxuc+7zdHz7ePnk5vDz7XxobXVpbfh1ZnPz8e3m5ff65en+8/J4eHtuY2RtZFxfbGhr/3RnZm9ybHD4fXrs8Xz47ejl5uv1+vD2b3B6cXF+d3R4d3RranByc/p0aG9+fXl9fHd+7+3z5t3g6Ofr+n319nZ58/V++f1sbH7y/PTo7Pjz9nF09fRzdfn49vLt8O/m6PL08Pt0fX1mYWdlZGZlX2Fva19jamdjbHJw+uvz+vf2/fjh4u7l3uj37Oj38On4bHrqfGhvaF9lc29jaG9maHR1aXDzfHfu5efl3t7u6uDm6+rk6Ofh7vzx8Xp1+fxz/vltZ2twam94bWp78P938+vw7Ofze/Dp+Xr1e252+3NrffxsaGpoYWZuZ2Ft+nVue2xjaXt4cvXr7vLs+Hju6vh49u717unzeH75fHZ5dGxvfm9pe/53fvj59ejn9vru73rz6/j86ufv9PT7df3tfnnr73j97/h78+t9cvDr+O/r9/rs5/B7+Pptc31rZmplYWRqa215c2NgZ2dmampqc3t+cnT4dGh4+Pzv5uju7+zv7eDpffXo7fbw7fxvbG1lYmlnYWVpa3D++3j57Ovu5efs6OPm6OXk5+zt7fX49Pj+9fPx8PV6bXh5aWd1eHByeX5+8PH27+/z/vz1/nd7fvt5dXBwenNsbXd4bW55c3NtampraWhqbGpmZWhucHV1dP348u/y6Obp6Ofn4+Xp7fH8fXFlZ2dpb3D9+P3v6uvt7/Hs6eru7uvq9XZ8e3T/+3v97uzv7urw9/Dw+Xp7evvw93n76+z69erv/vx9bWx5eW9ycGhpbWReYmZmanr8b3X6b2NlbGhqcHFpcPL9dfv8cHzu7+/n4ejs5OTt597n/Pn2cmllX1tdZmZs/PX/8u59e+zl5uTf4ebi5PlzfHtuePf5fu7l7fTu7vfu7nlte3xsaHRzcXv19PLs6/91c25w/O7y+PP0eW1mY2JucG3+7/t3c2tgYmdoZ2hpaGpuamRsdW5wfP98fvD2++7m5ubf4efj5PB1bW1paW9ub/jw/f78cXP37Onq6uXq9HttbXp3cvvu7fDu6Ons5uPu6Obx7ur6bnD68/j27O3q4+97fHBoa3F7bWp3bV5bXFtfaGhrc/53aGZnY2pwbnJ+fXN2enBv/O76ee7v+fn3eHX66uzo5Ojp4+l9bXBpYGNtbmp8+nBte3788Ors7OPj7vL8ef3s7fTt6Ov59+3x9evr8PDv+Ht1b2NnfP549ezt5+Pr8+/u/XT893j++XJoaWtqbnRubnn+a2BhYl9ibGxscHZoZWxqanr3/n3z7/l4eXN0+fLy6+Xi4uPk6fTy9nNrbG1qbm1maXZxbXr4e/vzeWtsb3N77uzt7OXp8+/m4+jl4uPk3+Hv8/V5/O7u9e3n6+7n5uzy83Zsb3JvaWdiX2NpaWhra2hrbGZfZmtnaHH7en37d3T99fbw7O7u6un2cG5xbnF8/vLr7Pp69vV4e/5yaW1uaGRpa29+9X12+PP3/f14c/7w7+rg3+Xo5+vv6On1/fDq6+vs/W9wcnJ79/Tw6+378+fk6ezw9fX093p6+315/fx1a25sY2JjZGlwb2pufH1paW5ta3F4cH3z7vH293Rt//P//Ozs8O/w9vXt7X159fl+fHVqaGpxbmxwbGpta2Jga3B3+e3n6ODj7Onn6erp6u3v7ebp7evt7+3v9+/n6O/w7O/z6u369u76cHFvbW99+29vbmdiYmJdXWdxb/vq8nv7e2xy8vJ1c/n19Ozr9X56d3N58vx99n5tbHF0dnl2c3ry+XV6d25vef55b29rZ2dpanPu7fPo3Nzh4uPp6eHo+PP1fW1zfm1rffV4fO3w+fHw+/7t6/ju5ejr5+r39+zq7/Ds+HZ0bF9dZGRhZnp8e/N9a2RkY2Zwb2RkcXNqb/t+cHh8fvPl6fvx6/f56er/evDw+ezp9vvu+2xydmteXl5XWGNrbPXl5+fe3+3t4uf67uf3fH5zaWt4e3jv6PLt4OLu7efr7+vr9/bm7/vw83Fw+PV6fPlwZmVkXmBxcm/35ej37u50aW1lX2NmX15qa2Jq/f5udf16//Xyfnz0933y8nt98O737uTn8O3ueXh3aF5gZGBibfn369/e4OLn8PPw/m5ufG5jYWZgZHJ7+uzn6urk4+jp4OLp6OPj5eHj6erm7ffx7v12fXNoZGdnYmZrbHD3+WxnZV9bW1tYWFtdW19panTy7O3t6ebt7efr7+fl7u/r6+3o5err5u17fvlyaWReWlhbXl5lffDu4+Dp7+7vfHr+dW54d2hsfnp68efm5+Th5ufg4OXj4urr5eXt7enwd/z3c3vw/nV3dmxna2xnav78fvX6bWRhX1hVWVhWWl5cYXBxbf7u9H7w7n786uzt5eLo6OHh7erh5fLv7nz+9nZnaW1hXGNnY23u6erl5O7z9XVlanZrZGxwa2/58fXn3uPn3+Hn5Nzf5d7c4OPd4/Ho5311+PP/+u33dX5+a2NpaGNpeXRtc3JjXV5YVFdbV1deY2FrfHt29O739Orq7Orn6ujf293g4efv6+bx/vb4eHZ3a2VkYFxcZWx28O739+7t93ZtamRobWxw/Pj58+vm5d3b4OPe3d3b3ePh3d/k5+rw/Xt4dP/28PH5+np3eXJpZmhsbG9vbnV3bGJeXVpaWVhbXV9mbW9udf94cnl8fvTv7u3l4d3e5eju8fL5+Pfx8/n9eHF0c2pmaWhnePz/9evt8/59cGtrZ2JmbXZ69O3u6uLf4+Pe3uDe3d/d2dzl5Ob19O73ffvz+Pbp7Pj37fttcW5oZGNjYGdtYl1hY1taXlxYW11dYW5uaHT8bGp99fr06enm3dve4d7f7erl7vLu7f797vxxdHtmYGtpYGp5cHjt63lz/m9kZWtmaP3+ePDl6vHo3ujn29vd2dfc3dje7u7p+2x2/3N+7fb66uf1fPb+aGVqYl1jaGJjbWVdX2NcWWFkW2BraGdxdGRkbGpkcvt2fOrl6+fd3uXj3+bo4Oj47uv+e+nk7/PveWdoaGBnenRz9+v1/f54aGdrYmRweG166+768unq7uTi5d3a3N7c3+vr5O368fJzcfj49+nk6u3r9m9pZl5cYWNfYGZhXV1dWVpiYlteaGRkbGxlZmtnaHf1+/Lj5Orj3N7f3d7g3dvj7/Hzfnzv7/f4+2xlaGhgZHNvaHb5eHB5b2VrcGxpeHtwe+30+e/r5+ri393b2dre3t7m6Ojv/v/+cG1vdnfz8Pn49HtraWZiYmhqaGZraF9fX2FgZWtnZGhrbGprYWRmYGFmbm548+rq5+Th3+Pk4uLo8PP3fX716+zs6+38c291c3f+//X29/1+eHBzeG9ram1raHf8fnvz7uzs7enk3+Pj4N7i5eHf5ezx93Frb292+PD07e/6c25jX2RmYV9nZl9fYmFhZGJhX19eXWJlYl5jbGZodft6+enq6+Te4N/e3+De4Ojx9Pxyd/Ds9vft83R0e/56/3v++X5wcX5ua3R9bmx5emxuffl8++nm5uPf4t3a3uHc3+/t4+h99+z4b3R2bm58fHx6cWlla2dhZnBpYmpwZGJrbmlpdW1kYGBfY2JeXmVrZGh7+nrx5+Lq49/g5OXl6ujs+n77eHH+6e3w6ul+cXz4fnv08/f89fz08nx0fXhpaXr+bnfx8Pvv6ert6+rm4+Th4N7q7+fj6vDr5/duePx7cnZ1dm5qZWhmYV9maWNocHZsdH5+bGtsZl1aW1tcW11ka2hncfL4/Ovh5+rj4uTn4+Pg5uvy8PN9/u3p6+vl5vv/+Ppucvv2//77/PP2+n3+bGhteHBudPj2e/Tt7fPs5d/i4N/d4u3x5+Lt6ePm8/16em5oZ2diXVxeYV1eX2VnbHH+eW/68Xttbm1qX15fYV5eY2ppY2358v3t5+Ps7+rn7Ozq5ufx8Ozte3ry5unu6Ob2//5+/Xzy6ufp6+ji6vn5+XBnbnt5bnb8/nB0ffz7//z06evs6ubs9u3h6e7t5+jw+vfzenBwcGdfX2RfW15tfXV77Of7fvf+aGFkZ2BbW2JgWlteZmNpe/j+9Orm6vTv5OPo5eHf5Onn4ur37ebn8fTs6fxwdPt+df3l6vXq4uxwcf19ZmZzfm5sefd9dfTl5/Lw5eDw+Ofj7uzi4Orp4+Dn8/Lx93Jpa2ZdWlxcWFVcaGlrfenp7PF+e3draWhqX11hYltZX2hoan348/Pr7u/t7u3o7PXy6OXy+Ozl8fHt7Pz2++3zeHfy6e704Nni6+bjeGp29XNiav12ZmRt/HFu9eTu/fHk+Wh45+n/6d7j7+fe4+/o4+XxdXFxbF9dYF5bXGNub/3p4ul9cmttZmBdY2BZVltaVFZka2Jk/+v+cvfn7O/j293q7N7d9Pjg3Oz26OT3/urm/XD67vd49ujn6+37fW1pbG1sa2xsaGNjZW757u3p3+Lt+uzr+fHc3OXo29rp9uXe7Pzw7HFjZXJiV1lgYFlaaXNoce7waGBsdWRgcXplXV1eXVpeaWlpdP3/eXv7+e/m4OXk4OXv8+nl7Ojg6nv96Ox7d/DxeHno3+br4N7udPfp/Gt09XpoanJkWl9zdWlx7+xybH3x/fji3ODn39rf6+rn6Obn7u/t8n51cW1kZGtta2Zu+HhqanBrYl5mZFtaYFpPUVxdWFtwdGNme/lwb+rd5eze1trl5t7f7+ze4PP15up9fvD1fn79+Pfy9P57b256/fn9+nVubmllaHB0am349Pry5e376tzd4dzW29/c297p7OPndWz89WheZmxhXGz5bGBse2tdZHBva2xwbmtmZGReW2FnZmJmbWxpbHFudvXt7err7Onm63x+5+j69ejtfXrz8XRv8uTp9/Dg5P9+6Oj28+Tn/HTy8mtkbXRxa2ltaGJgZmpmbfHj5ePc2tra297g4ODl5eXp8vDt/W949v9yePX7a2dtamNgaW5iXF5iWVJVW1taXmlmY2lsbWxteu7p5uDd3Nzc3Nze3dze4uPq7vb1/m95/3Nw/n5zbGpoZmdz+vr6/fD2cGp3enRw/v5wbXh2amp29/Dh3dvb29rc3d3c3eHp6e3yeHBtY2BlcGxse/ZzbW90bW10c21rb21uZGFhY2hscXVuaWtkYGBrcHj78O3u6+3x8fD37ujk5efl6/V+fX70+X387e/69evwe/fp6PDp4Ob4eXlwbG14cGtmZ2ReWlxgXmJx7unk3tzg4d7c3Nvc3+Hk6ff79/53ffr58vX3eXdvb3D/cGZobGZdXFpYVllcXl5laWhkX19mamv06efn393i59/a3d3a2dvc3+Tw/Pl+/Xpzb3ZuaGZsa21xe3t+7+7w/v5ub3Z7b3F8dGhjaGNjanl+7eLc2trc4+He3N/d3ePv83VnZmtmX2Vpa214dW9td3p2e29tdn1sZWJhXmBjYmFqeWtoZ2hkZ21xb/vv6+72/P7q5ujo4eDi5OPq8Onp8fn09/j7+3N69O3r6+jq5+Hh7Pj7/HVzcG1ta2NbWVhWWV1hZXDu6ebk4uHf3d3c2tjb4ebvfHl8dWxvffn29/f8/HdyeXZrZm5rYVxdW1hVVldZWlxdYGJlbXJ4e/Lo6Ozp5+Xi3tvd3Nvb3d3i6ejo8fz39P5zdm5qam9xeXR79u3s+vbu73Z+7/F8/PxwYl9kYGJhaHD59Ozl3+Xi3d3g39vd5OzteG9qZ15gaWZobn1ucP/5c3n89Pr9fnJvbGhjYl1bXGBcWV5qZV5pb21od319efbr5eTo5d/f6ebh4evp5ur16uPo8fj3en18/n3t6unn4OTw8O/5b3NzbGRjXl1eXFlcYl9kcvL37eDa3dzY19rd29ve6eru9XNra3ZqZXB6cWp1dm1pcXBraGlkYmFgYV1bWVlXWlpdYWhpcXt5+PHy9Obk4uHa3ODe29zg3+Dh6+/s6/n1+Px0bWxsbmxz+ezy6uLg7Ofi5/D5+3NqZmtnY19kY2NkbHb+9end3Nzc2t/n6ejw9v55bmprZWVlamdscnd2/vft7/Xx9fZ8e3ByaGVkX1lXWltZWF1gYl9namlmbv339+7i4ePm3dzf5N7e4+bf3OHp6+Xr7vb5+3189fDu7Ork5uv07e74b2hiX1xbXl5cW2FlaGVw9u3r3tbU19jX2t/l4OPud333eGptd3Nra3lzbGhyeXJoanJuaGZoZ2JdXlxZV1lcXl5fZmtpZWx4d29+6uXo4Nrb3+Db2t/m4d/j7ebj6/387fFybXz7dHHv6O726OTq8O3n7HlqbGpiXV9iYV9jZ2lrcfnw6+Xd2drd4N/i7/zy8Hpxdn10bHr2+X788fR9fO7t9nl++3FmbHVpXl5jXldXXFxXV11iXlxeY2Nianv07urh3d3e3t3e39/c3t7e3uDn6uno73388PB9/unk6vLq6PN0e/V1ZmJoZ15aXV5bWmBqZmZ27O3r3tfW29zZ3Ofx6eju9PLs8ft88e34fP72/HZ6eXJtbHBuamNnZl1cXF1bV1hcXVhaZmtlXmhybGt65N/f3tnX3t/d3ePp4d/j5+no8/r08vxvdXt0b3L17e308Oz0+3728nRtbXFqYmBiZ2FfZWtycHzt6enj29zg5+nq+fbw+P17+3xzcHvu9/j06+j38+/t+nh+endtb3FrZ2BdXl1cWlpYWlxaWlpdXl1ibPnv6eHe3OHj4d/c4ODc2dzj3+Dg6Ozq7u76/ffz7+7t9PfwenB0fntqaXF6aV9hYWFcW15gY2V08Ofj4tvc3Nzh5enj6O/t6eX1ff/693R2/PP2dXh6e29oamppY2FlZ2heXl9gYl1eXV5fXV9hZ2dkaXPy7+7m3dne4d7d3ufl4ODq8Orq6/P28/r3e3Bxd/h8+/Xt7P7+/O3wfvTt6PR1dHFvY19jaWplbXzx7vTp5uXr9/Hw7/z/8+/u/ndvb3lwd/3r6vrz6+f3df/7d2hnbW5uZWlsaWNcXVxbV1dZW15eXWBhaGlw+erg4uLe29rc29rY2uDh393j6+Xk6f1+8e/2efjz8/p2dW9wbWludHxzaWdnaF5dYGRmY2h18+7v4dzb3+Ti4ODp6eTh4/Dz9ft4a3b9/nd3+v39eG5sZ2hkYWJmaWRkam1pX2BhYl5ZXGBoYF5na25qdO3k4uLc3Nzc29nb3N/m5+rp7PL08e37ffvx7npyfu30dP/y9HRy9fP5dnN4cW5oaWlpZ2Job3n49fDq5Obr7evn7vDp5uXy+vj6eWpz9/H8fPHr7Pr/+ntvZ2ptamtscW1rb21pYmJfWVhbXlxaXWRqZmZ27ez47uDb29vV1Nfc3dzg5+zp6ezq7Ovr5+fy/37v7Xtzdf11aWx1fWtkamxiXGFrZ2FhbHRzdfrt7OXn6ejk3+Li4eHf5Ojs7PByeP35d2xyfnxpZ290bmJha2trZ2ttamhoa2djX15eXF1fYGJqc2xreOni7+3f2tve2tbZ3uPi5O3//u3x+X3z7Ozt9/5++Pt5d/vx+nV99vB9bm5vZ15gaGxnZnD8/W9ufvb5fvnr5uPj4uXl5Oft9fP6cGx2fnp1/vf/bGpx/ntpa3h4cGttdXBsaWlkZF5aWlpcW1xfaGhjaG757fDt5t7e5d/Y1dre3Nne6u3n6vL67ujp7fDv8/h7fP779H5xcnr8dGpobWpbW2VtZWFtfXxucPbs7vXv5uPk5uXg3+Po5+vs+m9scXpzcXN0eWxiZGxsYmp+9Xlsc/t9a2VoaGRdXF9jYF1gYWBhYmNlcn17+Org4ubh3dnd397c3urt6ODm8u/r6u/58e3v+vbs5ejx7+/1/XZwbW1sYF1gaWRhaGx6bWl58fJ3dPPo7fDk3t7h4+Dk5+7+d3v9eXN4/31sZmltbmtud/l8bXB4eWlhZWllXVpdX15aXGFkYmBjanZ0e/Dp5OLf3Nza3N3e3d3k5+bf4+/y6+ny/fvx6u/27ejp+3p8fnJpam9wZmNmZmhlY2huc2xtc/32fvzz6ufr5+De4evr6ef1fPn1+3BwdXx1aWlrb29rdX72/XN8/X1xbWtnY11cXV5fXl5hZmZeX2duamz+6uDg4t3a29/f3uDm7unk5Ofq6erp7vT37er19+zn5/H+/fh5aWdqbWhiZGtva2pwfHpqaXF0dGxufvTx8evl4+ft6+jp7fDy8/pybXD//nBveft6cH7v7vx4/f59cWxsZmJdXF9fXVxeYWdnYmVpbWxpb/Tn6Orh29re393c4Ojn4+Po7ejm6Ozt6evt93758u/7eXz+e2lkaGtnYGVueW9u+vd8bW1xc3BpbX7v8fjs5eHn7uzr6/H8+PX7b21ye3dtcHn4+nn97uj0evj0+2tna2ljXl9kZmRgY2RiYWFjZmtoZmz/7vX16+Le4+Tf3N7l5eDe5Onj3+Dm5uLk6fL39O/u9ffu7fluZ2VpZmJhaHVzbnT9e2tmam1mXmVwfHdx+evq7/Dq6urr7+/u7vV+/PXz9vr38Ph3e/PxfnF78/1qY2prZ2NlamtpZGRlZGNjaGprbGxyev36++7l4OHg3tvc4eTg3N/n6eLk6+vm6O9+fvj5fnd69fp1bW1ta2xpbnZ6/29ze/52b3R5d2lpb3NuaXXz7fR99+/0enr28/b++fPw7/j++v32+fv39fh4/Pf5cmdtcHRqbHh5cWZmZWJgYWNlZGRkZ2dpbG797ujm5eDh4ufk3Nrd4N7d3ODp4uHn7vDr8/f/evh9dG9tbW5samx2d21rbm1vbWdvenVqZmpvbmt37unu9Ozp8Pn88Ors9vTr7vR8eP39/3h6enBya294dnJqbXNzbm58+XdnZmtsaGVnbWxnYGdqa2tw9+zn6eji5Obs6+Xe3+fn4uTq8Ovn6O378+/3fXr9/3xzdv19fHn++PZ+cHb8fXJrb3BtYl9kZmdkav77fXN29vr++u/l5+/v7OzzfHv38PPz9/T1fm5vdXJ2cXV8e3d0efx+bWZsbGZeYWRiXVtdYWZnbH3t6Orr5ePi5eLd3Nzf4N/f4uzp4uXr8u3r9Hdw/v9xbXB0b29obXF1em99/nlxbGxoZmNgZWtzcXP87/R6evDu8fLq5uXn7u3t9P169/f5/H79c2tlZ2xrbG51fPT7ePrz8f56e351Z2NkYl9eXmRpZmd1+fj5+u3r6ejr5ePk5+bk5ebr6ePk4+nr6Oz1fP72/Hx6+fT1envx8vl++/15a2ZlX2BeXWJoaGlscXh6dnR+8Ozt6uHh5+zr6Obv9Ovs7+/1+/11a2ttbW5qcHl3d3B8+Pv1e3h4bmVeXl1dXF5jZ2llbnx+9/vr5+Ti59/e3uPl4eLg4uLm6unw8/H4fnB2/n14dHd8fHhw/vT1/PryfW9naGdjZGJpbnFwcH58/v367ezt8Ovm6er09vP3+f348vV8dXp4b2ttbm5wcXb7+/f88uzq6/fw93RqZGhmY2BeYmJiX2RsbGprfu3r7O7p6Onq7+Xi5OXk4OTk6uzr8vZ++fn/+Hl97/f07vTv6vj78HhxZGBjX19cXmBiZGFrc3Bze/Xr5+vo4ubo7Ovo6ez27uvx93z6+HpybnFwdm9veXv8eXn4fn52fm1ubmVmX2NhXWRkYGJlbW5wdfPr7ujn5uDl5uXg397j6Oft6/b1fv5+bG54cnxwdfv5fv3t8+/w9/D9eHBub2xmYGRmZ2pqc3RxeHj78+zs8Ovr6fD47PP3/fju+f53//15d218fn55fO3y7fDv6vP1+/58dXJqaWxoY19fXF1dXWZlZmtsffTv8e3p6erq4+Dj4t/e4uPm7enu7vZ39n75/vbu8Oz08u3y9Xr9eW1pZWZiXl1dYF1gY2pwcXx59uzq6e3l4+Tl6ePk7vT16+30+/7wdnBudf5ud3j99H34/vh+/n5udm1sbGpvamxiZWZjZWRvenp3d/nu7/Hs5Ofn7Ovk6eXn6Obt7Pr1/HN1cv95evb57uzr8PHr7PH8+fZ9fW9wbmViXmRgYGlndXB3fHzy9fPx9O7t8Pbw7vT2fu/0/fx5/Pd9fHruc/Pm8ON67O/16v56bXVubmtka2tmYFxgYF1fZW9pbW1+/Pj0+eTo4ufs5uLf4uXe4+bp7uv0+3X99Pbu8uzu7O7x6O/7cG5mdnFraWNiXVtdXWFjZ294ef/27+3s8uzi5+bn6ufo6/Ls5ur1e/z+eXhw+fp9fXr4+Hp4e/x3bmhna2VpZ2luaWVfY2ZubGv38/n+/Ozt8vTr5+vs7unm6Ozr6e3y+nz6eXV0cvf78/jy7O/s8+zr8fh5eXp2c3V4bmllYWZlZmhufHl9d3n5fn51ffr++3z38vLy+e3s9Pz79fp8fvLq7fHw6uPp8/Xt9Hl0bHBubmppamJhXF1iXl9ia3Nta2t1/np5/Ovr7uvq4uHj4uDf5urs6Oz58PTv6uzt8Ozr7PL47vlya2ZrZ2VmZ2dhX19kZGRrb3Z4dnp69/Tw9u7p7Oru6OPm5efi4ubr9/H+dnl4+Pt4dHf/eHFxdXlubGpscW5raWpqaGZob3B0dHf7fHl1efT4+fHq6O7u7uro7O3s6u3z+n76eXp7e/T6+Pb18fPy9u3r9fh79vd3dHP+cm9tbHFpa2ppbWhra29wbG9rdHV3/P3w7O3u6uPl6u7t7PT38+jm6ujq6/D69fzz93t6c3ZpZmNgY15eXl9kYGFiZ2psbm9+dXv99u3s6+rl4uPf49/e4uDk4+Pq7e7s8PT5e/R9e3pwenJvamlpYmRhZ2hnaGlua2hoZ29qbnV59vbw8O7p6+rs5uHm5Ofj5ejs8fB9d3Nz/nZxcnN1cXVwe3dxdmpwb2prZ2xtbGpud2xsb3R7c3t+/fx99vz27/X19PX59/f48vz6+/bw8/Hz7u3v9fvz8fXu7urq7O/w83x8c3R3b3BsbGdlY19iYF9gYGhrbGtvfHt8evvt7+zq5uLk5OTi4+Xk5eTm6Orv6u709PT1fXptb3BnY2BfXl1eW1xbXF1fZ2Zra256ev767urr6Ojk3+Di4t/h4uPo5ebm6fPz+X54dn58eHP//ndxbHBwamVjampoZmRnZWVjZ2xsbnX38PDu8Ofo6Onr5eXp6+vn5+nu7e/2+Hd0c3B0cnh7eXl7/XdxcXV4dXJranRwa2hsbmlqaGtrb3t6/PP5+fny+fL7+u718vj09ez++/Ty8/r48+709PTq7ezn4uXm4Orr7O12bHJvbGZmaGRgXl5gX2FlaXB1d3L+fvr7++3y7Ovq4ePk5ubl5Ojp5+Tp6+3v+O7r4d3ndO9sa31eYl9eYl5ZXl9oXFtfY2NwbGz3cfJ76e5y5OLk6OTs7u/w4PT06ODu7vXt7fp4eOp49O9x/ut7a350aWVhbfxnYW9qYGpifux3eOPj5+Po39/t7OXo3+nj39/r4+nw5v125vB3fGp4a25t7flw4f16dnP1aG1sbVx5Z1ZuV2haY/hzfm12bO33d+9p/up9fHbre/92fX1+fur3+Ojteejncerl3Orm29zt5trsfv7w+/9tb11iYVpmVGBpbFljd2FkcP1Z8+Jm9uHo4gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCkBAIC0wLDAgKzEsMTcgQEAKKzk3NSAxIDAKKzk3NSAxIDYwMDAwMAorOTc1IDEgMTIwMDAwMAorOTc1IDEgMTgwMDAwMAorOTc1IDEgMjQwMDAwMAorOTc1IDEgMzAwMDAwMAorOTc1IDEgMzYwMDAwMAorOTc1IDEgNDIwMDAwMAorOTc1IDEgNDgwMDAwMAorOTc1IDEgNTQwMDAwMAorOTc1IDEgNjAwMDAwMAorOTc1IDEgNjYwMDAwMAorOTc1IDEgNzIwMDAwMAorOTc1IDEgNzgwMDAwMAorOTc1IDEgODQwMDAwMAorOTc1IDEgOTAwMDAwMAorNTIwIDEgOTYwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZmNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KQEAgLTAsMCArMSwxMjIgQEAKKzI2MzYyIDEgMAorMTIwMjMgMCA4MzMzMworMTA2NDcgMCAxNjY2NjYKKzEwMjY5IDAgMjUwMDAwCisxMTA3NiAwIDMzMzMzMworMTExMDQgMCA0MTY2NjYKKzU5MDkgMCA1MDAwMDAKKzQyOTEgMCA1ODMzMzMKKzUxNDkgMCA2NjY2NjYKKzUzNTMgMCA3NTAwMDAKKzUxODUgMCA4MzMzMzMKKzI3MzYgMCA5MTY2NjYKKzIxNTc1IDEgMTAwMDAwMAorMjE5NiAwIDEwODMzMzMKKzQzNDAgMCAxMTY2NjY2CiszMTA5IDAgMTI1MDAwMAorNDQxMCAwIDEzMzMzMzMKKzE3MzEgMCAxNDE2NjY2Cis0NTU3IDAgMTUwMDAwMAorMzM3NiAwIDE1ODMzMzMKKzEzNTIgMCAxNjY2NjY2CisyODQ0IDAgMTc1MDAwMAorMTc4NyAwIDE4MzMzMzMKKzEwODggMCAxOTE2NjY2CiszNjg0MyAxIDIwMDAwMDAKKzI1MjAgMCAyMDgzMzMzCiszNzQ5IDAgMjE2NjY2NgorMzc4NCAwIDIyNTAwMDAKKzM0MDIgMCAyMzMzMzMzCiszNzk1IDAgMjQxNjY2NgorMjM0NSAwIDI1MDAwMDAKKzMxNDIgMCAyNTgzMzMzCisyOTQ4IDAgMjY2NjY2NgorMjAxOCAwIDI3NTAwMDAKKzUxMzMgMCAyODMzMzMzCisyMjc2IDAgMjkxNjY2NgorMjM0NjggMSAzMDAwMDAwCisxNTIyIDAgMzA4MzMzMworMjI5OSAwIDMxNjY2NjYKKzMyNzMgMCAzMjUwMDAwCisyNjMwIDAgMzMzMzMzMworMjkxNSAwIDM0MTY2NjYKKzMwMzIgMCAzNTAwMDAwCisxODkwIDAgMzU4MzMzMworMzcxOCAwIDM2NjY2NjYKKzE5OTAgMCAzNzUwMDAwCiszMTM5IDAgMzgzMzMzMworMTgwNiAwIDM5MTY2NjYKKzIzMjA4IDEgNDAwMDAwMAorMTQxOSAwIDQwODMzMzMKKzIyNjMgMCA0MTY2NjY2CiszMTMxIDAgNDI1MDAwMAorMjY0NSAwIDQzMzMzMzMKKzE4ODAgMCA0NDE2NjY2CisyMjM5IDAgNDUwMDAwMAorMzYzNyAwIDQ1ODMzMzMKKzE5NDEgMCA0NjY2NjY2CisxNTc3IDAgNDc1MDAwMAorMzc3NyAwIDQ4MzMzMzMKKzE4MTYgMCA0OTE2NjY2CisxOTYwMSAxIDUwMDAwMDAKKzExMDQgMCA1MDgzMzMzCisyODA4IDAgNTE2NjY2NgorMjQxMSAwIDUyNTAwMDAKKzIxNTkgMCA1MzMzMzMzCisyNDExIDAgNTQxNjY2NgorMjQwOCAwIDU1MDAwMDAKKzIzODggMCA1NTgzMzMzCisyNDE4IDAgNTY2NjY2NgorMTQ4MSAwIDU3NTAwMDAKKzE5MjYgMCA1ODMzMzMzCis5MDIyIDEgNTkxNjY2NgorMjkyIDAgNjAwMDAwMAorNzAxIDAgNjA4MzMzMworNzQ3IDAgNjE2NjY2NgorMjA1OSAwIDYyNTAwMDAKKzE2OTMgMCA2MzMzMzMzCisyMDc4IDAgNjQxNjY2NgorMjk3NSAwIDY1MDAwMDAKKzEzMTcgMCA2NTgzMzMzCisxNzQyIDAgNjY2NjY2NgorMTAxOSAwIDY3NTAwMDAKKzEwNTMgMCA2ODMzMzMzCisxNDE4MyAxIDY5MTY2NjYKKzE0NjcgMCA3MDAwMDAwCis5OTQgMCA3MDgzMzMzCisxNzA5IDAgNzE2NjY2NgorODM4IDAgNzI1MDAwMAorMTMyOCAwIDczMzMzMzMKKzIyOTIgMCA3NDE2NjY2CisxODI5IDAgNzUwMDAwMAorMTcyOCAwIDc1ODMzMzMKKzI0MzYgMCA3NjY2NjY2CisxODUyIDAgNzc1MDAwMAorMjE5MCAwIDc4MzMzMzMKKzE1MTY3IDEgNzkxNjY2NgorMTE4OCAwIDgwMDAwMDAKKzIwNzAgMCA4MDgzMzMzCiszMzE2IDAgODE2NjY2NgorMjYzNiAwIDgyNTAwMDAKKzk1MCAwIDgzMzMzMzMKKzEyNjAgMCA4NDE2NjY2Cis5MDYgMCA4NTAwMDAwCisxMjk0IDAgODU4MzMzMworMTI5OCAwIDg2NjY2NjYKKzE4OTcgMCA4NzUwMDAwCisxMzQ4IDAgODgzMzMzMworMTMxOTQgMSA4OTE2NjY2CisxMDQyIDAgOTAwMDAwMAorMTI1OCAwIDkwODMzMzMKKzE0NTcgMCA5MTY2NjY2Cis5OTAgMCA5MjUwMDAwCis5MDAgMCA5MzMzMzMzCis5NjMgMCA5NDE2NjY2CiszNDQ4IDAgOTUwMDAwMAorNzc0IDAgOTU4MzMzMworMTA3NSAwIDk2NjY2NjYKKzc1MCAwIDk3NTAwMDAKKzEwNTQgMCA5ODMzMzMzCisxMzEzOSAxIDk5MTY2NjYKKzMxMDQgMCAxMDAwMDAwMAorMzM2NiAwIDEwMDgzMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYxIEBACisxNjk1IDMyIDAKKzE5MzggMSAzMzMzMworNDcxIDAgODMzMzMKKzE1MyAwIDY2NjY2Cis5OSAwIDUwMDAwCis2NTcgMCAxNTAwMDAKKzI2MCAwIDExNjY2NgorMTE1IDAgMTAwMDAwCis5OSAwIDEzMzMzMworNjIyIDAgMjE2NjY2CisyMTEgMCAxODMzMzMKKzc5IDAgMTY2NjY2Cis5NSAwIDIwMDAwMAorNTk3IDAgMjgzMzMzCisyODggMCAyNTAwMDAKKzE0NSAwIDIzMzMzMworMTQ3IDAgMjY2NjY2Cis2NzYgMCAzNTAwMDAKKzI4NCAwIDMxNjY2NgorMTQ0IDAgMzAwMDAwCisxMzEgMCAzMzMzMzMKKzY1OCAwIDQxNjY2NgorMjcwIDAgMzgzMzMzCisxMDEgMCAzNjY2NjYKKzE1MSAwIDQwMDAwMAorNTI5IDAgNDgzMzMzCisyNTcgMCA0NTAwMDAKKzk4IDAgNDMzMzMzCisxNjAgMCA0NjY2NjYKKzY2NCAwIDU2NjY2NgorMTg2IDAgNTMzMzMzCisxNDcgMCA1MDAwMDAKKzY3IDAgNTE2NjY2Cis3OCAwIDU1MDAwMAorNTc1IDAgNjMzMzMzCisyMzAgMCA2MDAwMDAKKzEzNCAwIDU4MzMzMworMTE0IDAgNjE2NjY2Cis2MjkgMCA3MDAwMDAKKzIyNCAwIDY2NjY2NgorMTM4IDAgNjUwMDAwCisxMjkgMCA2ODMzMzMKKzY0NSAwIDc1MDAwMAorMjY0IDAgNzMzMzMzCisxNDUgMCA3MTY2NjYKKzcwNSAwIDgxNjY2NgorMzY1IDAgNzgzMzMzCisxNTYgMCA3NjY2NjYKKzE2MCAwIDgwMDAwMAorNzI1IDAgODgzMzMzCiszMzAgMCA4NTAwMDAKKzEzOCAwIDgzMzMzMworMTYyIDAgODY2NjY2Cis2MzggMCA5NTAwMDAKKzMzNyAwIDkxNjY2NgorMTcwIDAgOTAwMDAwCisxMzMgMCA5MzMzMzMKKzQzMiAwIDEwMTY2NjYKKzI4NyAwIDk4MzMzMworMTMwIDAgOTY2NjY2CisxMzYgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTQ5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMiBAQAorMTA3NSAzMiAwCisxMDc1IDMyIDAKKzY4NjEzIDEgNjY2ODcKKzE5MDI1IDAgMTk5Njg3CisyNDA1IDAgMTMzNjg3Cis3NzcgMCA5OTY4NworNjgxIDAgMTY2Njg3CisyMDI1NCAwIDMzMzY4NworMjkyNyAwIDI2NjY4NworNzY2IDAgMjMzNjg3Cis2NTggMCAyOTk2ODcKKzIwNzg2IDAgNDY2Njg3Cis0MjE0IDAgMzk5Njg3Cis2MDkgMCAzNjY2ODcKKzY2MSAwIDQzMzY4NworMjA4MzggMCA1OTk2ODcKKzQyMDkgMCA1MzM2ODcKKzUwNiAwIDQ5OTY4NworNTg2IDAgNTY2Njg3CisyMDQxNSAwIDczMzY4NworNDIwNyAwIDY2NjY4NworNDI3IDAgNjMzNjg3Cis1MTQgMCA2OTk2ODcKKzI0NDU3IDAgODk5Njg3CisxOTA0IDAgODMzNjg3Cis5MjEgMCA3NjY2ODcKKzk5MiAwIDc5OTY4NworNTQzIDAgODY2Njg3CisyNDM0MiAwIDEwNjY2ODcKKzE4MjIgMCA5OTk2ODcKKzg0MCAwIDkzMzY4NworODkyIDAgOTY2Njg3Cis3MTUgMCAxMDMzNjg3CisyMjg5MyAwIDEyMzM2ODcKKzE2MTggMCAxMTY2Njg3Cis4ODEgMCAxMDk5Njg3Cis4OTAgMCAxMTMzNjg3Cis3OTQgMCAxMTk5Njg3CisyNDI5MiAwIDEzOTk2ODcKKzE2NzMgMCAxMzMzNjg3Cis3NTUgMCAxMjY2Njg3Cis4MTAgMCAxMjk5Njg3Cis1ODggMCAxMzY2Njg3CisxOTgyOCAwIDE1MzM2ODcKKzE1MzggMCAxNDY2Njg3Cis4OTQgMCAxNDMzNjg3Cis5MzMgMCAxNDk5Njg3CisxOTg1MyAwIDE2NjY2ODcKKzIwMTEgMCAxNTk5Njg3Cis5ODEgMCAxNTY2Njg3Cis5MDAgMCAxNjMzNjg3CisyMjg2OSAwIDE4MzM2ODcKKzE1NjIgMCAxNzY2Njg3Cis4NDIgMCAxNjk5Njg3Cis3NjUgMCAxNzMzNjg3Cis2NjUgMCAxNzk5Njg3CisyMjM0NiAwIDE5NjY2ODcKKzIyNDUgMCAxODk5Njg3Cis1MTYgMCAxODY2Njg3Cis2MDQgMCAxOTMzNjg3CisyNDMzMyAwIDIwOTk2ODcKKzE3NjUgMCAyMDMzNjg3CiszMTggMCAxOTk5Njg3CiszMjAgMCAyMDY2Njg3CisxODU3NyAwIDIxOTk2ODcKKzExMjMgMCAyMTY2Njg3CiszMzcgMCAyMTMzNjg3CisxNzUwOSAwIDIyOTk2ODcKKzg2OSAwIDIyNjY2ODcKKzkwMSAwIDIyMzM2ODcKKzIzMzY2IDAgMjQzMzY4NworMTIxNyAwIDIzNjY2ODcKKzM4MCAwIDIzMzM2ODcKKzM0NyAwIDIzOTk2ODcKKzE5NTQyIDAgMjUzMzY4NworMTg4NyAwIDI0OTk2ODcKKzQ2NyAwIDI0NjY2ODcKKzE4OTM5IDAgMjY2NjY4NworMjg2MyAwIDI1OTk2ODcKKzMxNyAwIDI1NjY2ODcKKzI3MiAwIDI2MzM2ODcKKzE5MzUzIDAgMjc5OTY4NworMjA5MiAwIDI3MzM2ODcKKzIwMyAwIDI2OTk2ODcKKzMxMCAwIDI3NjY2ODcKKzE4ODAwIDAgMjkzMzY4NworMjAzOCAwIDI4NjY2ODcKKzI0MiAwIDI4MzM2ODcKKzE5OSAwIDI4OTk2ODcKKzE3NDUyIDAgMzA5OTY4NworMTA2MCAwIDMwMzM2ODcKKzMwMSAwIDI5NjY2ODcKKzQ1MiAwIDI5OTk2ODcKKzI1NiAwIDMwNjY2ODcKKzIxMzUyIDAgMzE5OTY4NworNDA5IDAgMzE2NjY4NworMTczIDAgMzEzMzY4NworMTkxNDIgMCAzMjk5Njg3Cis2NDIgMCAzMjY2Njg3Cis0NjggMCAzMjMzNjg3CisxOTA2NiAwIDM0MzM2ODcKKzYzNSAwIDMzNjY2ODcKKzE5NyAwIDMzMzM2ODcKKzE5MCAwIDMzOTk2ODcKKzE4ODEzIDAgMzU2NjY4NworOTY5IDAgMzQ5OTY4NworMTY1IDAgMzQ2NjY4NworMjAzIDAgMzUzMzY4NworMTczNjIgMCAzNzMzNjg3CisyNDYgMCAzNjY2Njg3CisyMzYgMCAzNTk5Njg3CisxNzQgMCAzNjMzNjg3CisxNjQgMCAzNjk5Njg3CisxNzA4MSAwIDM4OTk2ODcKKzM1MyAwIDM4MzM2ODcKKzIyMiAwIDM3NjY2ODcKKzE4MSAwIDM3OTk2ODcKKzE0OCAwIDM4NjY2ODcKKzEwODM1IDAgMzk5OTY4NworMTg1IDAgMzk2NjY4NworMTM5IDAgMzkzMzY4NworNzUxMCAwIDQxMzM2ODcKKzE0OSAwIDQwNjY2ODcKKzEyOSAwIDQwMzM2ODcKKzEzMiAwIDQwOTk2ODcKKzEwNjMgMCA0MTY2Njg3Cis4MDUgMCA0MjY2Njg3CisxNTcgMCA0MjMzNjg3CiszOTQgMCA0MTk5Njg3Cis5MDg0MCAwIDQzOTk2ODcKKzYxNTkgMCA0MzMzNjg3CisxNzUyIDAgNDI5OTY4NworOTg1IDAgNDM2NjY4NworMzEzMzggMCA0NTMzNjg3CiszMzkwIDAgNDQ2NjY4NworNzcyIDAgNDQzMzY4NworNzgxIDAgNDQ5OTY4NworMzEwODQgMCA0NjY2Njg3CiszNDk4IDAgNDU5OTY4NworODE4IDAgNDU2NjY4NworODgxIDAgNDYzMzY4NworMzA0MTYgMCA0Nzk5Njg3CiszMjY1IDAgNDczMzY4NworODE1IDAgNDY5OTY4NworNzkwIDAgNDc2NjY4NworMzEwNTMgMCA0OTMzNjg3CiszMTA2IDAgNDg2NjY4NworNzA4IDAgNDgzMzY4NworNzEzIDAgNDg5OTY4NworMzAyMzAgMCA1MDY2Njg3CiszMjE0IDAgNDk5OTY4NworNjM5IDAgNDk2NjY4NworNzY4IDAgNTAzMzY4NworMjk2NTcgMCA1MTk5Njg3CiszMDEzIDAgNTEzMzY4NworNjIyIDAgNTA5OTY4NworNzIwIDAgNTE2NjY4NworMjkzNDQgMCA1MzMzNjg3CiszMTk2IDAgNTI2NjY4NworNzEzIDAgNTIzMzY4NworNzc1IDAgNTI5OTY4NworMzA0MjAgMCA1NDY2Njg3CiszMzc0IDAgNTM5OTY4NworODAzIDAgNTM2NjY4NworNzE3IDAgNTQzMzY4NworMjk5NjAgMCA1NTk5Njg3CiszMjgzIDAgNTUzMzY4NworNzkzIDAgNTQ5OTY4NworNzkwIDAgNTU2NjY4NworMzEwMTEgMCA1NzMzNjg3CiszMzk3IDAgNTY2NjY4NworODA5IDAgNTYzMzY4NworODMxIDAgNTY5OTY4NworMzExOTQgMCA1ODY2Njg3CiszNDAxIDAgNTc5OTY4NworODA3IDAgNTc2NjY4NworODI3IDAgNTgzMzY4NworMzAzMjYgMCA1OTk5Njg3CiszMTg2IDAgNTkzMzY4NworODE4IDAgNTg5OTY4NworODYzIDAgNTk2NjY4NworMzE1NTkgMCA2MTMzNjg3CiszMzY0IDAgNjA2NjY4NworODQwIDAgNjAzMzY4NworOTE5IDAgNjA5OTY4NworMzIwMTMgMCA2MjY2Njg3CiszNDk1IDAgNjE5OTY4NworODcxIDAgNjE2NjY4NworODAzIDAgNjIzMzY4NworMzAyOTQgMCA2Mzk5Njg3CiszMTUzIDAgNjMzMzY4NworNzE2IDAgNjI5OTY4NworODEyIDAgNjM2NjY4NworMjk5NTIgMCA2NTMzNjg3CiszMjk5IDAgNjQ2NjY4NworODAxIDAgNjQzMzY4NworNzQ5IDAgNjQ5OTY4NworMzA1OTggMCA2NjY2Njg3CiszNTM2IDAgNjU5OTY4NworODg3IDAgNjU2NjY4NworODUwIDAgNjYzMzY4NworMTcyNDYgMCA2Njk5Njg3CiszMTExMCAwIDY4MzM2ODcKKzMxOTggMCA2NzY2Njg3Cis4MDkgMCA2NzMzNjg3Cis4MzYgMCA2Nzk5Njg3CisyOTc4NCAwIDY5NjY2ODcKKzMxNTUgMCA2ODk5Njg3Cis4NTkgMCA2ODY2Njg3Cis5NTggMCA2OTMzNjg3CiszMDY2NiAwIDcwOTk2ODcKKzMzNzEgMCA3MDMzNjg3Cis4ODYgMCA2OTk5Njg3Cis4NjEgMCA3MDY2Njg3CiszMDQxNiAwIDcyMzM2ODcKKzMzNTAgMCA3MTY2Njg3Cis5MTcgMCA3MTMzNjg3Cis5ODcgMCA3MTk5Njg3CisyOTUwOSAwIDczNjY2ODcKKzM1NzQgMCA3Mjk5Njg3Cis5NzIgMCA3MjY2Njg3Cis4ODUgMCA3MzMzNjg3CiszMDg3MiAwIDc0OTk2ODcKKzMzOTkgMCA3NDMzNjg3Cis4OTggMCA3Mzk5Njg3CisxMDI3IDAgNzQ2NjY4NworMzExNTUgMCA3NjMzNjg3CiszNDU0IDAgNzU2NjY4NworOTY1IDAgNzUzMzY4NworODQxIDAgNzU5OTY4NworMjg0ODcgMCA3NzY2Njg3CiszNjE2IDAgNzY5OTY4NworOTIxIDAgNzY2NjY4NworOTkxIDAgNzczMzY4NworMjMyMDggMCA3ODk5Njg3CiszNTUxIDAgNzgzMzY4NworOTE4IDAgNzc5OTY4NworODk0IDAgNzg2NjY4NworMTY5ODIgMCA4MDMzNjg3CiszNDU4IDAgNzk2NjY4NworODQ0IDAgNzkzMzY4NworOTQzIDAgNzk5OTY4NworMzAzOTYgMCA4MTk5Njg3Cis0OTYzIDAgODEzMzY4NworMTQxNiAwIDgwNjY2ODcKKzE2MzkgMCA4MDk5Njg3Cis1MjQgMCA4MTY2Njg3CisxMzY4IDAgODI5OTY4NworNTY1IDAgODI2NjY4NworMzkyIDAgODIzMzY4NworNDEzMTcgMSA4Mzk5Njg3CisxODUgMCA4MzY2Njg3Cis0NzcgMCA4MzMzNjg3Cis1MzQyIDAgODUzMzY4NworMTI3NSAwIDg0NjY2ODcKKzEyMSAwIDg0MzM2ODcKKzk4MiAwIDg0OTk2ODcKKzY0NjUgMCA4Njk5Njg3CisyNjA2IDAgODYzMzY4NworMTE2MyAwIDg1NjY2ODcKKzk0MyAwIDg1OTk2ODcKKzExODYgMCA4NjY2Njg3CisxMTU5MyAwIDg4MzM2ODcKKzMxMjIgMCA4NzY2Njg3CisxMjc4IDAgODczMzY4NworMTU5MyAwIDg3OTk2ODcKKzkwOTkgMCA4OTk5Njg3Cis5NzggMCA4OTMzNjg3Cis3NDggMCA4ODY2Njg3Cis4MzUgMCA4ODk5Njg3CiszNjQgMCA4OTY2Njg3Cis0Nzk5IDAgOTA5OTY4NworMzY1IDAgOTA2NjY4NworMjE1IDAgOTAzMzY4NworNDM2NyAwIDkxOTk2ODcKKzMwMiAwIDkxNjY2ODcKKzQ4MCAwIDkxMzM2ODcKKzYxODAgMCA5MzMzNjg3Cis3NzEgMCA5MjY2Njg3CisyNDYgMCA5MjMzNjg3CisyODEgMCA5Mjk5Njg3Cis0NjM2IDAgOTM5OTY4NworMjExIDAgOTM2NjY4NworNDAzNyAwIDk0OTk2ODcKKzM4MiAwIDk0NjY2ODcKKzQ4NiAwIDk0MzM2ODcKKzM5NzUgMCA5NTk5Njg3CiszMTIgMCA5NTY2Njg3Cis0NzQgMCA5NTMzNjg3Cis2ODgwIDAgOTczMzY4NworMTExNiAwIDk2NjY2ODcKKzIwNiAwIDk2MzM2ODcKKzY5OCAwIDk2OTk2ODcKKzYyNTQgMCA5ODk5Njg3CisyNTgxIDAgOTgzMzY4NworMTMwMyAwIDk3NjY2ODcKKzk4NSAwIDk3OTk2ODcKKzk2NyAwIDk4NjY2ODcKKzY0ODYgMCAxMDAzMzY4NworMzU1NSAwIDk5NjY2ODcKKzE0MzAgMCA5OTMzNjg3CisxNjA1IDAgOTk5OTY4NwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYmZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTQgQEAKKzU3NiAxIDAKKzU3NiAxIDI0MDAwCis1NzYgMSA0ODAwMAorNTc2IDEgNzIwMDAKKzU3NiAxIDk2MDAwCis1NzYgMSAxMjAwMDAKKzU3NiAxIDE0NDAwMAorNTc2IDEgMTY4MDAwCis1NzYgMSAxOTIwMDAKKzU3NiAxIDIxNjAwMAorNTc2IDEgMjQwMDAwCis1NzYgMSAyNjQwMDAKKzU3NiAxIDI4ODAwMAorNTc2IDEgMzEyMDAwCis1NzYgMSAzMzYwMDAKKzU3NiAxIDM2MDAwMAorNTc2IDEgMzg0MDAwCis1NzYgMSA0MDgwMDAKKzU3NiAxIDQzMjAwMAorNTc2IDEgNDU2MDAwCis1NzYgMSA0ODAwMDAKKzU3NiAxIDUwNDAwMAorNTc2IDEgNTI4MDAwCis1NzYgMSA1NTIwMDAKKzU3NiAxIDU3NjAwMAorNTc2IDEgNjAwMDAwCis1NzYgMSA2MjQwMDAKKzU3NiAxIDY0ODAwMAorNTc2IDEgNjcyMDAwCis1NzYgMSA2OTYwMDAKKzU3NiAxIDcyMDAwMAorNTc2IDEgNzQ0MDAwCis1NzYgMSA3NjgwMDAKKzU3NiAxIDc5MjAwMAorNTc2IDEgODE2MDAwCis1NzYgMSA4NDAwMDAKKzU3NiAxIDg2NDAwMAorNTc2IDEgODg4MDAwCis1NzYgMSA5MTIwMDAKKzU3NiAxIDkzNjAwMAorNTc2IDEgOTYwMDAwCis1NzYgMSA5ODQwMDAKKzU3NiAxIDEwMDgwMDAKKzU3NiAxIDEwMzIwMDAKKzU3NiAxIDEwNTYwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNhNDQxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVjNzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDM4NSBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzExNTIgMSA0ODAwMAorMTE1MiAxIDk2MDAwCisxMTUyIDEgMTQ0MDAwCisxMTUyIDEgMTkyMDAwCisxNzI4IDEgMjQwMDAwCisxNzI4IDEgMzEyMDAwCisxNzI4IDEgMzg0MDAwCisxNzI4IDEgNDU2MDAwCisxNzI4IDEgNTI4MDAwCisyMzA0IDEgNjAwMDAwCisyMzA0IDEgNjk2MDAwCisyMzA0IDEgNzkyMDAwCisyMzA0IDEgODg4MDAwCisyMzA0IDEgOTg0MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDA2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpAQCAtMCwwICsxLDI0OSBAQAorNjQ1OCAxIDQwMDAwCis0MDQwIDAgODAwMDAKKzMyNTUgMCAxMjAwMDAKKzMwMjYgMCAxNjAwMDAKKzMyOTMgMCAyMDAwMDAKKzMwODkgMCAyNDAwMDAKKzMzMDUgMCAyODAwMDAKKzE3OTQgMCAzMjAwMDAKKzE4NDggMCAzNjAwMDAKKzEyODggMCA0MDAwMDAKKzE1MTEgMCA0NDAwMDAKKzE1MjcgMCA0ODAwMDAKKzYxNDYgMSA1MjAwMDAKKzEyNDMgMCA1NjAwMDAKKzEwOTkgMCA2MDAwMDAKKzEzNTQgMCA2NDAwMDAKKzEzNjYgMCA2ODAwMDAKKzEwNDIgMCA3MjAwMDAKKzE2MDAgMCA3NjAwMDAKKzg3NSAwIDgwMDAwMAorMTcyOCAwIDg0MDAwMAorMTI1NCAwIDg4MDAwMAorOTk0IDAgOTIwMDAwCisxNTkxIDAgOTYwMDAwCis2MjY1IDEgMTAwMDAwMAorMTAxOCAwIDEwNDAwMDAKKzgyNSAwIDEwODAwMDAKKzg2OSAwIDExMjAwMDAKKzkyMSAwIDExNjAwMDAKKzk3NSAwIDEyMDAwMDAKKzkyNCAwIDEyNDAwMDAKKzgzNCAwIDEyODAwMDAKKzEwNjYgMCAxMzIwMDAwCis3OTMgMCAxMzYwMDAwCis4ODkgMCAxNDAwMDAwCisyMDUwIDAgMTQ0MDAwMAorNjI3NiAxIDE0ODAwMDAKKzg4MSAwIDE1MjAwMDAKKzI2MCAwIDE1NjAwMDAKKzczMCAwIDE2MDAwMDAKKzQzMSAwIDE2NDAwMDAKKzM1MSAwIDE2ODAwMDAKKzMyMSAwIDE3MjAwMDAKKzM4MDIgMCAxNzYwMDAwCisxNDYgMCAxODAwMDAwCis2NDYyIDAgMTg0MDAwMAorMzI0NiAwIDE4ODAwMDAKKzUzMyAwIDE5MjAwMDAKKzYyMzEgMSAxOTYwMDAwCisxMzc4IDAgMjAwMDAwMAorNzE5IDAgMjA0MDAwMAorODE4IDAgMjA4MDAwMAorODU2IDAgMjEyMDAwMAorOTM3IDAgMjE2MDAwMAorNjExIDAgMjIwMDAwMAorMzAzMSAwIDIyNDAwMDAKKzEwNDEgMCAyMjgwMDAwCis2MDQgMCAyMzIwMDAwCis3MTQgMCAyMzYwMDAwCisxMjgzIDAgMjQwMDAwMAorNzU2NSAxIDI0NDAwMDAKKzYwMiAwIDI0ODAwMDAKKzUzMCAwIDI1MjAwMDAKKzI1NzkgMCAyNTYwMDAwCisxMTUgMCAyNjAwMDAwCisxMDU4IDAgMjY0MDAwMAorNjg5IDAgMjY4MDAwMAorMTExOSAwIDI3MjAwMDAKKzY5OCAwIDI3NjAwMDAKKzEwMDYgMCAyODAwMDAwCis1NDUgMCAyODQwMDAwCisxNjE3IDAgMjg4MDAwMAorOTEyMyAxIDI5MjAwMDAKKzUyNyAwIDI5NjAwMDAKKzE1NzYgMCAzMDAwMDAwCis0NjUgMCAzMDQwMDAwCis3NDEgMCAzMDgwMDAwCis1MjEgMCAzMTIwMDAwCisxMzIyIDAgMzE2MDAwMAorNzc1IDAgMzIwMDAwMAorODYzIDAgMzI0MDAwMAorOTEwIDAgMzI4MDAwMAorOTE1IDAgMzMyMDAwMAorOTI2IDAgMzM2MDAwMAorNzU1NiAxIDM0MDAwMDAKKzc0MSAwIDM0NDAwMDAKKzUyNyAwIDM0ODAwMDAKKzI1MTYgMCAzNTIwMDAwCis0NTkgMCAzNTYwMDAwCis0MDQgMCAzNjAwMDAwCis1MDkgMCAzNjQwMDAwCisxMjI3IDAgMzY4MDAwMAorMTU2MSAwIDM3MjAwMDAKKzQ5MCAwIDM3NjAwMDAKKzcxMiAwIDM4MDAwMDAKKzgwMyAwIDM4NDAwMDAKKzc1MjQgMSAzODgwMDAwCis3MzAgMCAzOTIwMDAwCis0NjEgMCAzOTYwMDAwCisyNTI2IDAgNDAwMDAwMAorNDUzIDAgNDA0MDAwMAorNjMyIDAgNDA4MDAwMAorNzgzIDAgNDEyMDAwMAorODQzIDAgNDE2MDAwMAorOTE4IDAgNDIwMDAwMAorOTYxIDAgNDI0MDAwMAorOTQ4IDAgNDI4MDAwMAorOTU5IDAgNDMyMDAwMAorNzU5OCAxIDQzNjAwMDAKKzY3OCAwIDQ0MDAwMDAKKzU2OSAwIDQ0NDAwMDAKKzg5MyAwIDQ0ODAwMDAKKzYyNCAwIDQ1MjAwMDAKKzc1NSAwIDQ1NjAwMDAKKzIyMzQgMCA0NjAwMDAwCis1NTYgMCA0NjQwMDAwCis5NDQgMCA0NjgwMDAwCis3MzkgMCA0NzIwMDAwCis4NjIgMCA0NzYwMDAwCis5MzggMCA0ODAwMDAwCis3NTc0IDEgNDg0MDAwMAorNjk5IDAgNDg4MDAwMAorNzAxIDAgNDkyMDAwMAorNTMwIDAgNDk2MDAwMAorNjg5IDAgNTAwMDAwMAorNzc4IDAgNTA0MDAwMAorODU2IDAgNTA4MDAwMAorOTMwIDAgNTEyMDAwMAorOTc1IDAgNTE2MDAwMAorMTAyMSAwIDUyMDAwMDAKKzEwNzQgMCA1MjQwMDAwCis5NzggMCA1MjgwMDAwCis4MDIxIDEgNTMyMDAwMAorNzA0IDAgNTM2MDAwMAorNjEwIDAgNTQwMDAwMAorNjk3IDAgNTQ0MDAwMAorNzExIDAgNTQ4MDAwMAorODIwIDAgNTUyMDAwMAorODQzIDAgNTU2MDAwMAorMjUxIDAgNTYwMDAwMAorMzM2NyAwIDU2NDAwMDAKKzUwNyAwIDU2ODAwMDAKKzMxNjggMSA1NzIwMDAwCis3NzkgMCA1NzYwMDAwCiszMTYgMCA1ODAwMDAwCis2MzUgMCA1ODQwMDAwCisyMDQgMCA1ODgwMDAwCis5NzggMCA1OTIwMDAwCisxMjcgMCA1OTYwMDAwCis1ODkgMCA2MDAwMDAwCis2MDQgMCA2MDQwMDAwCis2NjYgMCA2MDgwMDAwCis1ODIgMCA2MTIwMDAwCis3MjkgMCA2MTYwMDAwCis0MTUyIDEgNjIwMDAwMAorODU4IDAgNjI0MDAwMAorNzM5IDAgNjI4MDAwMAorODg1IDAgNjMyMDAwMAorNzQ5IDAgNjM2MDAwMAorOTUwIDAgNjQwMDAwMAorNTkzIDAgNjQ0MDAwMAorNzcxIDAgNjQ4MDAwMAorNjc4IDAgNjUyMDAwMAorNTI5IDAgNjU2MDAwMAorODM1IDAgNjYwMDAwMAorMzkxIDAgNjY0MDAwMAorNDY5MiAxIDY2ODAwMDAKKzQ3MyAwIDY3MjAwMDAKKzcyNCAwIDY3NjAwMDAKKzM4MSAwIDY4MDAwMDAKKzkwOSAwIDY4NDAwMDAKKzM5NCAwIDY4ODAwMDAKKzY1OSAwIDY5MjAwMDAKKzM2NyAwIDY5NjAwMDAKKzY1OCAwIDcwMDAwMDAKKzUyMyAwIDcwNDAwMDAKKzU1NCAwIDcwODAwMDAKKzU1MyAwIDcxMjAwMDAKKzYwODAgMSA3MTYwMDAwCis0OTYgMCA3MjAwMDAwCis3NjMgMCA3MjQwMDAwCis5MzkgMCA3MjgwMDAwCis3MTUgMCA3MzIwMDAwCis2NzIgMCA3MzYwMDAwCis2MTQgMCA3NDAwMDAwCis4MTEgMCA3NDQwMDAwCis5MTYgMCA3NDgwMDAwCisxMTUzIDAgNzUyMDAwMAorOTQwIDAgNzU2MDAwMAorMzIyIDAgNzYwMDAwMAorNjYxMyAxIDc2NDAwMDAKKzg1MSAwIDc2ODAwMDAKKzEwMDcgMCA3NzIwMDAwCis1MjAgMCA3NzYwMDAwCis0NTYgMCA3ODAwMDAwCis2MzkgMCA3ODQwMDAwCis3NTggMCA3ODgwMDAwCis4NzkgMCA3OTIwMDAwCisxMTUyIDAgNzk2MDAwMAorMTA2MSAwIDgwMDAwMDAKKzk0NiAwIDgwNDAwMDAKKzg1OSAwIDgwODAwMDAKKzM2MTAgMSA4MTIwMDAwCis4NzEgMCA4MTYwMDAwCis3NDYgMCA4MjAwMDAwCiszNjcgMCA4MjQwMDAwCiszOTcgMCA4MjgwMDAwCis5MzAgMCA4MzIwMDAwCiszMzcgMCA4MzYwMDAwCis0MTggMCA4NDAwMDAwCis3NDAgMCA4NDQwMDAwCis2MzcgMCA4NDgwMDAwCis2NjYgMCA4NTIwMDAwCis2MjcgMCA4NTYwMDAwCis0MzM4IDEgODYwMDAwMAorNzQ1IDAgODY0MDAwMAorNzgzIDAgODY4MDAwMAorNDY1IDAgODcyMDAwMAorNDYwIDAgODc2MDAwMAorNDU1IDAgODgwMDAwMAorNTA2IDAgODg0MDAwMAorNDkyIDAgODg4MDAwMAorNDg1IDAgODkyMDAwMAorNTE3IDAgODk2MDAwMAorNTM0IDAgOTAwMDAwMAorMzk1IDAgOTA0MDAwMAorNTYyNiAxIDkwODAwMDAKKzExNjkgMCA5MTIwMDAwCis1NjQgMCA5MTYwMDAwCisyNjEgMCA5MjAwMDAwCiszMjcgMCA5MjQwMDAwCiszMDMgMCA5MjgwMDAwCisxMTQ1IDAgOTMyMDAwMAorMjU3IDAgOTM2MDAwMAorNDk4IDAgOTQwMDAwMAorNDY1IDAgOTQ0MDAwMAorNDE0IDAgOTQ4MDAwMAorNTUzIDAgOTUyMDAwMAorNTYxNyAxIDk1NjAwMDAKKzEwNTIgMCA5NjAwMDAwCis1OTIgMCA5NjQwMDAwCiszMjMgMCA5NjgwMDAwCis0OTcgMCA5NzIwMDAwCis0NjcgMCA5NzYwMDAwCis3MDUgMCA5ODAwMDAwCisxMDg2IDAgOTg0MDAwMAorMTI1MyAwIDk4ODAwMDAKKzEyNTIgMCA5OTIwMDAwCis3NzYgMCA5OTYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY5MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3Y2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxNjY4MCAxIDE2NjY2CisxNzAxNyAwIDMzMzMzCisxMDUzNCAwIDUwMDAwCisxMDI4OSAwIDY2NjY2CiszNjk4IDAgODMzMzMKKzI3NzYgMCAxMDAwMDAKKzE5MzYgMCAxMTY2NjYKKzE0OTMgMCAxMzMzMzMKKzEyMTcgMCAxNTAwMDAKKzk5MyAwIDE2NjY2NgorODA1IDAgMTgzMzMzCis4NTcgMCAyMDAwMDAKKzUwODIgMSAyMTY2NjYKKzgxMiAwIDIzMzMzMworNzE4IDAgMjUwMDAwCis3NDYgMCAyNjY2NjYKKzc2MiAwIDI4MzMzMworODY1IDAgMzAwMDAwCis3ODIgMCAzMTY2NjYKKzgzMyAwIDMzMzMzMworNzUwIDAgMzUwMDAwCis4MTkgMCAzNjY2NjYKKzgyNiAwIDM4MzMzMworODQ2IDAgNDAwMDAwCis0NTIyIDEgNDE2NjY2Cis2NzggMCA0MzMzMzMKKzcxOCAwIDQ1MDAwMAorODAzIDAgNDY2NjY2Cis3NjkgMCA0ODMzMzMKKzc2MiAwIDUwMDAwMAorNTg3IDAgNTE2NjY2Cis2MzUgMCA1MzMzMzMKKzY1OCAwIDU1MDAwMAorNzE0IDAgNTY2NjY2Cis2NzcgMCA1ODMzMzMKKzY5OSAwIDYwMDAwMAorNDYxNiAxIDYxNjY2NgorODAwIDAgNjMzMzMzCis4MzEgMCA2NTAwMDAKKzkyOCAwIDY2NjY2NgorODY5IDAgNjgzMzMzCis5MzEgMCA3MDAwMDAKKzkzMCAwIDcxNjY2NgorOTc0IDAgNzMzMzMzCis5NzggMCA3NTAwMDAKKzkzMiAwIDc2NjY2NgorOTE4IDAgNzgzMzMzCis5NzggMCA4MDAwMDAKKzQ2NTUgMSA4MTY2NjYKKzg5NyAwIDgzMzMzMworODk2IDAgODUwMDAwCis4ODMgMCA4NjY2NjYKKzk0OSAwIDg4MzMzMworOTY1IDAgOTAwMDAwCis5NTEgMCA5MTY2NjYKKzkwMSAwIDkzMzMzMworOTY1IDAgOTUwMDAwCis5NTUgMCA5NjY2NjYKKzk0OCAwIDk4MzMzMworOTY4IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY3YzJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJhOWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDEgQEAKKzQ3IDMyIDAKKzIxMTE1IDEgMAorMTY0NTYgMCAzMzMzMworMTE4ODAgMCA2NjY2NgorMTIxNTUgMCAxMDAwMDAKKzExNDAyIDAgMTMzMzMzCis1MzQ1IDAgMTY2NjY2CisyOTg2IDAgMjAwMDAwCisxOTI0IDAgMjMzMzMzCisyMjc1IDAgMjY2NjY2CisyNzkzIDAgMzAwMDAwCisyNzU2IDAgMzMzMzMzCisyOTMzIDAgMzY2NjY2CisyMTEwMCAxIDQwMDAwMAorMTMwMiAwIDQzMzMzMworMjIwNiAwIDQ2NjY2NgorMTU5OSAwIDUwMDAwMAorMjU1OCAwIDUzMzMzMworMjc4NCAwIDU2NjY2NgorMjQ1OCAwIDYwMDAwMAorMjQ4MCAwIDYzMzMzMworMTQ0NiAwIDY2NjY2NgorMzEwOSAwIDcwMDAwMAorOTQ0IDAgNzMzMzMzCiszMTM0IDAgNzY2NjY2CisyMTM0MiAxIDgwMDAwMAorNjUyIDAgODMzMzMzCisxNzA4IDAgODY2NjY2CisyMjAyIDAgOTAwMDAwCisxNjk1IDAgOTMzMzMzCisxNjYxIDAgOTY2NjY2CisxNjUyIDAgMTAwMDAwMAorMTY3OSAwIDEwMzMzMzMKKzE2OTAgMCAxMDY2NjY2CisxODI0IDAgMTEwMDAwMAorMTgwMyAwIDExMzMzMzMKKzE1OTggMCAxMTY2NjY2CisyMTU0MCAxIDEyMDAwMDAKKzIwNSAwIDEyMzMzMzMKKzExMjQgMCAxMjY2NjY2CisxMDY5IDAgMTMwMDAwMAorODM4IDAgMTMzMzMzMworNzY1IDAgMTM2NjY2NgorNDI2NSAwIDE0MDAwMDAKKzk0IDAgMTQzMzMzMworMjA0NjMgMCAxNDY2NjY2CisxMDI4IDAgMTUwMDAwMAorMTQ3NSAwIDE1MzMzMzMKKzM2MzAgMCAxNTY2NjY2CisyODM3MyAxIDE2MDAwMDAKKzcyNSAwIDE2MzMzMzMKKzExMTkgMCAxNjY2NjY2CisxNDI3IDAgMTcwMDAwMAorMTY3OSAwIDE3MzMzMzMKKzE4NjYgMCAxNzY2NjY2CisxMTk3IDAgMTgwMDAwMAorMTU3MiAwIDE4MzMzMzMKKzE2NTEgMCAxODY2NjY2CisxNjc4IDAgMTkwMDAwMAorMTY4OCAwIDE5MzMzMzMKKzE2NTkgMCAxOTY2NjY2CisxOTkwMCAxIDIwMDAwMDAKKzU4NCAwIDIwMzMzMzMKKzE0NzUgMCAyMDY2NjY2CisxNjc4IDAgMjEwMDAwMAorMTAxMCAwIDIxMzMzMzMKKzE0MzUgMCAyMTY2NjY2CisxNjEyIDAgMjIwMDAwMAorMTYwMiAwIDIyMzMzMzMKKzE3MDkgMCAyMjY2NjY2CisxNzM3IDAgMjMwMDAwMAorMTgzNSAwIDIzMzMzMzMKKzkyNiAwIDIzNjY2NjYKKzIwMDkwIDEgMjQwMDAwMAorNjMxIDAgMjQzMzMzMworMTU3NiAwIDI0NjY2NjYKKzk0MSAwIDI1MDAwMDAKKzIzNDkgMCAyNTMzMzMzCisxMTEyIDAgMjU2NjY2NgorMTU2NiAwIDI2MDAwMDAKKzE3NzMgMCAyNjMzMzMzCis5NzkgMCAyNjY2NjY2CisyMjQ2IDAgMjcwMDAwMAorOTA0IDAgMjczMzMzMworMTM0MiAwIDI3NjY2NjYKKzIwMTQ3IDEgMjgwMDAwMAorNjMwIDAgMjgzMzMzMworOTgyIDAgMjg2NjY2NgorMjA4OSAwIDI5MDAwMDAKKzEwMjEgMCAyOTMzMzMzCisxNTA2IDAgMjk2NjY2NgorMTY0MiAwIDMwMDAwMDAKKzk2OCAwIDMwMzMzMzMKKzEyNjIgMCAzMDY2NjY2CisyMjcwIDAgMzEwMDAwMAorODY0IDAgMzEzMzMzMworMTI1MiAwIDMxNjY2NjYKKzIwMTQ1IDEgMzIwMDAwMAorNTk1IDAgMzIzMzMzMworOTE4IDAgMzI2NjY2NgorMTE2NyAwIDMzMDAwMDAKKzEzNDcgMCAzMzMzMzMzCisxNTk3IDAgMzM2NjY2NgorMTYzNiAwIDM0MDAwMDAKKzk0NCAwIDM0MzMzMzMKKzEyOTUgMCAzNDY2NjY2CisxMzk3IDAgMzUwMDAwMAorMTQxMyAwIDM1MzMzMzMKKzE0MzIgMCAzNTY2NjY2CisyMDE4MCAxIDM2MDAwMDAKKzUyNSAwIDM2MzMzMzMKKzEwNjggMCAzNjY2NjY2CisxMjMwIDAgMzcwMDAwMAorMTQyOCAwIDM3MzMzMzMKKzkxNiAwIDM3NjY2NjYKKzE5NDggMCAzODAwMDAwCis5NjYgMCAzODMzMzMzCisxMzQyIDAgMzg2NjY2NgorMTMzOCAwIDM5MDAwMDAKKzEzNzkgMCAzOTMzMzMzCisxMjk2IDAgMzk2NjY2NgorMTczNzggMSA0MDAwMDAwCis1ODMgMCA0MDMzMzMzCis5MzYgMCA0MDY2NjY2CisxNzQ1IDAgNDEwMDAwMAorOTg3IDAgNDEzMzMzMworMTM5MyAwIDQxNjY2NjYKKzE0OTUgMCA0MjAwMDAwCis4NjkgMCA0MjMzMzMzCisxOTM4IDAgNDI2NjY2NgorODI4IDAgNDMwMDAwMAorMTg1MSAwIDQzMzMzMzMKKzgzNCAwIDQzNjY2NjYKKzE3MjgwIDEgNDQwMDAwMAorNTgwIDAgNDQzMzMzMworODY5IDAgNDQ2NjY2NgorMTYwNSAwIDQ1MDAwMDAKKzg0MyAwIDQ1MzMzMzMKKzYxNDcgMSA0NTY2NjY2CisyMjAgMCA0NjAwMDAwCisxMTA2IDAgNDYzMzMzMworMzk1IDAgNDY2NjY2NgorMzA0IDAgNDcwMDAwMAorMTk0NiAwIDQ3MzMzMzMKKzE1NCAwIDQ3NjY2NjYKKzQ4MiAwIDQ4MDAwMDAKKzk0OSAwIDQ4MzMzMzMKKzEwODggMCA0ODY2NjY2Cis5NzQgMCA0OTAwMDAwCis4NzYgMCA0OTMzMzMzCis5MTY0IDEgNDk2NjY2NgorMTAxOSAwIDUwMDAwMDAKKzk4MyAwIDUwMzMzMzMKKzEzNzUgMCA1MDY2NjY2CisxMDQxIDAgNTEwMDAwMAorNzg5IDAgNTEzMzMzMworMTAzNyAwIDUxNjY2NjYKKzgxMiAwIDUyMDAwMDAKKzczMiAwIDUyMzMzMzMKKzk3MiAwIDUyNjY2NjYKKzcwOCAwIDUzMDAwMDAKKzYyMyAwIDUzMzMzMzMKKzEwNjY3IDEgNTM2NjY2NgorNDYzIDAgNTQwMDAwMAorOTExIDAgNTQzMzMzMworODYxIDAgNTQ2NjY2NgorNTA3IDAgNTUwMDAwMAorMTAxNSAwIDU1MzMzMzMKKzUwMSAwIDU1NjY2NjYKKzkzNCAwIDU2MDAwMDAKKzgxMiAwIDU2MzMzMzMKKzg1NSAwIDU2NjY2NjYKKzgwNCAwIDU3MDAwMDAKKzc4MyAwIDU3MzMzMzMKKzEwNjEwIDEgNTc2NjY2NgorOTUwIDAgNTgwMDAwMAorMTI5MiAwIDU4MzMzMzMKKzEwMDIgMCA1ODY2NjY2Cis3MjggMCA1OTAwMDAwCis5NjAgMCA1OTMzMzMzCisxMjMwIDAgNTk2NjY2NgorMTMxNSAwIDYwMDAwMDAKKzEyNDggMCA2MDMzMzMzCis5OTUgMCA2MDY2NjY2CisxNDAxIDAgNjEwMDAwMAorOTA1IDAgNjEzMzMzMworOTMyNiAxIDYxNjY2NjYKKzcyNiAwIDYyMDAwMDAKKzY2NyAwIDYyMzMzMzMKKzgzMyAwIDYyNjY2NjYKKzEwMDcgMCA2MzAwMDAwCisxMTcyIDAgNjMzMzMzMworMTkxMCAwIDYzNjY2NjYKKzE5NTQgMCA2NDAwMDAwCisxNDk4IDAgNjQzMzMzMworMTE4OCAwIDY0NjY2NjYKKzc4NCAwIDY1MDAwMDAKKzEwMDUgMCA2NTMzMzMzCisxMDAzMCAxIDY1NjY2NjYKKzQ1MiAwIDY2MDAwMDAKKzc2MyAwIDY2MzMzMzMKKzYzOSAwIDY2NjY2NjYKKzY3MSAwIDY3MDAwMDAKKzg2NyAwIDY3MzMzMzMKKzk2MyAwIDY3NjY2NjYKKzk4MiAwIDY4MDAwMDAKKzk5NSAwIDY4MzMzMzMKKzk4MiAwIDY4NjY2NjYKKzc0NyAwIDY5MDAwMDAKKzU3NCAwIDY5MzMzMzMKKzEyMzUzIDEgNjk2NjY2NgorNDc0IDAgNzAwMDAwMAorOTY5IDAgNzAzMzMzMworNjMzIDAgNzA2NjY2NgorNzIzIDAgNzEwMDAwMAorMTIyMSAwIDcxMzMzMzMKKzY3NCAwIDcxNjY2NjYKKzc3NiAwIDcyMDAwMDAKKzU3MiAwIDcyMzMzMzMKKzkxMiAwIDcyNjY2NjYKKzU2NCAwIDczMDAwMDAKKzU5NCAwIDczMzMzMzMKKzE2NjYxIDEgNzM2NjY2NgorNTE4IDAgNzQwMDAwMAorNjU2IDAgNzQzMzMzMworNjI1IDAgNzQ2NjY2NgorNTgzIDAgNzUwMDAwMAorNTg0IDAgNzUzMzMzMworMTAyNyAwIDc1NjY2NjYKKzgxMiAwIDc2MDAwMDAKKzcyOSAwIDc2MzMzMzMKKzc2NiAwIDc2NjY2NjYKKzkwMSAwIDc3MDAwMDAKKzk2MCAwIDc3MzMzMzMKKzEyMzM2IDEgNzc2NjY2NgorOTQ0IDAgNzgwMDAwMAorMTM5OCAwIDc4MzMzMzMKKzE2MjUgMCA3ODY2NjY2CisyMTAzIDAgNzkwMDAwMAorMTYzMCAwIDc5MzMzMzMKKzEyMjggMCA3OTY2NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VhZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5OSBAQAorMTkgMzIgMAorOCAzMiAwCis4IDMyIDAKKzUyOSAxIDAKKzMyOSAxIDEzNTAwCiszNDkgMSAzMzUwMAorMzM2IDEgNTM1MDAKKzM4MyAxIDczNTAwCiszNTkgMSA5MzUwMAorMzQ0IDEgMTEzNTAwCiszNDMgMSAxMzM1MDAKKzMzMiAxIDE1MzUwMAorMzIwIDEgMTczNTAwCiszMTkgMSAxOTM1MDAKKzMyMyAxIDIxMzUwMAorMzIwIDEgMjMzNTAwCiszMjggMSAyNTM1MDAKKzM0MCAxIDI3MzUwMAorMzE4IDEgMjkzNTAwCiszMTkgMSAzMTM1MDAKKzMzNSAxIDMzMzUwMAorNTExIDEgMzUzNTAwCiszOTUgMSAzNzM1MDAKKzMyNyAxIDM5MzUwMAorNDc5IDEgNDEzNTAwCiszMzIgMSA0MzM1MDAKKzMyMCAxIDQ1MzUwMAorMzIxIDEgNDczNTAwCiszMTAgMSA0OTM1MDAKKzMxMCAxIDUxMzUwMAorMzEwIDEgNTMzNTAwCiszMjYgMSA1NTM1MDAKKzMzMCAxIDU3MzUwMAorMzE4IDEgNTkzNTAwCiszMDkgMSA2MTM1MDAKKzMwNCAxIDYzMzUwMAorMjk4IDEgNjUzNTAwCisyOTQgMSA2NzM1MDAKKzMwMCAxIDY5MzUwMAorMzE0IDEgNzEzNTAwCiszMDQgMSA3MzM1MDAKKzMwNyAxIDc1MzUwMAorMzIxIDEgNzczNTAwCiszMzMgMSA3OTM1MDAKKzMzNSAxIDgxMzUwMAorMzA2IDEgODMzNTAwCiszMTUgMSA4NTM1MDAKKzMyMCAxIDg3MzUwMAorMzE1IDEgODkzNTAwCiszMDggMSA5MTM1MDAKKzMyMCAxIDkzMzUwMAorMzExIDEgOTUzNTAwCiszMTEgMSA5NzM1MDAKKzMxMyAxIDk5MzUwMAorMzE0IDEgMTAxMzUwMAorMzA4IDEgMTAzMzUwMAorMzA3IDEgMTA1MzUwMAorMzE3IDEgMTA3MzUwMAorMzI4IDEgMTA5MzUwMAorMzE3IDEgMTExMzUwMAorMzEyIDEgMTEzMzUwMAorMzA4IDEgMTE1MzUwMAorMzE1IDEgMTE3MzUwMAorMzIwIDEgMTE5MzUwMAorMzIyIDEgMTIxMzUwMAorMzIzIDEgMTIzMzUwMAorMzIyIDEgMTI1MzUwMAorMzIyIDEgMTI3MzUwMAorMzAxIDEgMTI5MzUwMAorMzAzIDEgMTMxMzUwMAorMzA4IDEgMTMzMzUwMAorMjk5IDEgMTM1MzUwMAorMjk3IDEgMTM3MzUwMAorMjkzIDEgMTM5MzUwMAorMjk1IDEgMTQxMzUwMAorMjk3IDEgMTQzMzUwMAorMzAwIDEgMTQ1MzUwMAorMjk0IDEgMTQ3MzUwMAorMjk5IDEgMTQ5MzUwMAorMjk2IDEgMTUxMzUwMAorMzAzIDEgMTUzMzUwMAorMzEzIDEgMTU1MzUwMAorMzA2IDEgMTU3MzUwMAorMzAzIDEgMTU5MzUwMAorMzExIDEgMTYxMzUwMAorMzA3IDEgMTYzMzUwMAorMzEwIDEgMTY1MzUwMAorMzM5IDEgMTY3MzUwMAorMzI1IDEgMTY5MzUwMAorMzIwIDEgMTcxMzUwMAorMzE1IDEgMTczMzUwMAorMzE2IDEgMTc1MzUwMAorMzM4IDEgMTc3MzUwMAorMzI1IDEgMTc5MzUwMAorMzI1IDEgMTgxMzUwMAorMzI4IDEgMTgzMzUwMAorMzA0IDEgMTg1MzUwMAorMjk3IDEgMTg3MzUwMAorMzIyIDEgMTg5MzUwMAorMzExIDEgMTkxMzUwMAorMzA3IDEgMTkzMzUwMAorMzAwIDEgMTk1MzUwMAorMzAxIDEgMTk3MzUwMAorMzA5IDEgMTk5MzUwMAorMzAwIDEgMjAxMzUwMAorMzA2IDEgMjAzMzUwMAorMzA1IDEgMjA1MzUwMAorMjk4IDEgMjA3MzUwMAorMjkxIDEgMjA5MzUwMAorMzAxIDEgMjExMzUwMAorMzAwIDEgMjEzMzUwMAorNDM5IDEgMjE1MzUwMAorMjkyIDEgMjE3MzUwMAorMzA4IDEgMjE5MzUwMAorMzA1IDEgMjIxMzUwMAorMjk4IDEgMjIzMzUwMAorMjk3IDEgMjI1MzUwMAorMjkzIDEgMjI3MzUwMAorNDA4IDEgMjI5MzUwMAorMjk4IDEgMjMxMzUwMAorNDUyIDEgMjMzMzUwMAorMjk3IDEgMjM1MzUwMAorMzAzIDEgMjM3MzUwMAorMzAwIDEgMjM5MzUwMAorMzEwIDEgMjQxMzUwMAorMjk5IDEgMjQzMzUwMAorMzA2IDEgMjQ1MzUwMAorMzE2IDEgMjQ3MzUwMAorMzA4IDEgMjQ5MzUwMAorMzEzIDEgMjUxMzUwMAorMzA5IDEgMjUzMzUwMAorMzEwIDEgMjU1MzUwMAorMzE1IDEgMjU3MzUwMAorMzA5IDEgMjU5MzUwMAorMzE3IDEgMjYxMzUwMAorMzExIDEgMjYzMzUwMAorMzI4IDEgMjY1MzUwMAorMzMzIDEgMjY3MzUwMAorMzI2IDEgMjY5MzUwMAorMzIzIDEgMjcxMzUwMAorMzE2IDEgMjczMzUwMAorMzI1IDEgMjc1MzUwMAorMzE2IDEgMjc3MzUwMAorMzE5IDEgMjc5MzUwMAorMzI2IDEgMjgxMzUwMAorMzIwIDEgMjgzMzUwMAorMzI4IDEgMjg1MzUwMAorMzEyIDEgMjg3MzUwMAorMzE0IDEgMjg5MzUwMAorMzA5IDEgMjkxMzUwMAorMzA2IDEgMjkzMzUwMAorMjk1IDEgMjk1MzUwMAorMzA0IDEgMjk3MzUwMAorMzI2IDEgMjk5MzUwMAorMjkxIDEgMzAxMzUwMAorMjk5IDEgMzAzMzUwMAorMjkzIDEgMzA1MzUwMAorMjg4IDEgMzA3MzUwMAorMjk0IDEgMzA5MzUwMAorMjkyIDEgMzExMzUwMAorMjkyIDEgMzEzMzUwMAorMjg4IDEgMzE1MzUwMAorMzA4IDEgMzE3MzUwMAorMzA0IDEgMzE5MzUwMAorMjkyIDEgMzIxMzUwMAorMzgyIDEgMzIzMzUwMAorMzgxIDEgMzI1MzUwMAorMjk5IDEgMzI3MzUwMAorMzE2IDEgMzI5MzUwMAorMzA4IDEgMzMxMzUwMAorMzAxIDEgMzMzMzUwMAorMjk3IDEgMzM1MzUwMAorMjk5IDEgMzM3MzUwMAorMjk0IDEgMzM5MzUwMAorMjk1IDEgMzQxMzUwMAorMzE3IDEgMzQzMzUwMAorMjk3IDEgMzQ1MzUwMAorMzA5IDEgMzQ3MzUwMAorMzEzIDEgMzQ5MzUwMAorMzIwIDEgMzUxMzUwMAorMzI5IDEgMzUzMzUwMAorMzMwIDEgMzU1MzUwMAorMzI0IDEgMzU3MzUwMAorMzI0IDEgMzU5MzUwMAorMzA5IDEgMzYxMzUwMAorMzA0IDEgMzYzMzUwMAorMzEzIDEgMzY1MzUwMAorMzEyIDEgMzY3MzUwMAorMjk5IDEgMzY5MzUwMAorMjk1IDEgMzcxMzUwMAorMzAxIDEgMzczMzUwMAorMjk1IDEgMzc1MzUwMAorMjk3IDEgMzc3MzUwMAorMzAyIDEgMzc5MzUwMAorMjk4IDEgMzgxMzUwMAorMjk5IDEgMzgzMzUwMAorMjk2IDEgMzg1MzUwMAorMjkyIDEgMzg3MzUwMAorMzA3IDEgMzg5MzUwMAorMzAzIDEgMzkxMzUwMAorMzEzIDEgMzkzMzUwMAorMzE4IDEgMzk1MzUwMAorMzEzIDEgMzk3MzUwMAorMzUzIDEgMzk5MzUwMAorMzcxIDEgNDAxMzUwMAorMjkyIDEgNDAzMzUwMAorMzAwIDEgNDA1MzUwMAorMzgxIDEgNDA3MzUwMAorMjk0IDEgNDA5MzUwMAorMzAxIDEgNDExMzUwMAorMzA1IDEgNDEzMzUwMAorMjk5IDEgNDE1MzUwMAorMzA1IDEgNDE3MzUwMAorMzIyIDEgNDE5MzUwMAorMzE1IDEgNDIxMzUwMAorMzI2IDEgNDIzMzUwMAorMzM4IDEgNDI1MzUwMAorMzIwIDEgNDI3MzUwMAorMzE5IDEgNDI5MzUwMAorMzI3IDEgNDMxMzUwMAorMzMwIDEgNDMzMzUwMAorMzEwIDEgNDM1MzUwMAorMzAzIDEgNDM3MzUwMAorMjk5IDEgNDM5MzUwMAorMjkzIDEgNDQxMzUwMAorMjkzIDEgNDQzMzUwMAorMjk0IDEgNDQ1MzUwMAorMjk1IDEgNDQ3MzUwMAorMjk1IDEgNDQ5MzUwMAorMzIzIDEgNDUxMzUwMAorMzA5IDEgNDUzMzUwMAorMzA5IDEgNDU1MzUwMAorMzAxIDEgNDU3MzUwMAorNDczIDEgNDU5MzUwMAorMjkxIDEgNDYxMzUwMAorMjk3IDEgNDYzMzUwMAorMjk0IDEgNDY1MzUwMAorMjkzIDEgNDY3MzUwMAorMzA0IDEgNDY5MzUwMAorMjkyIDEgNDcxMzUwMAorMzAyIDEgNDczMzUwMAorMjk2IDEgNDc1MzUwMAorMjk4IDEgNDc3MzUwMAorMzAxIDEgNDc5MzUwMAorMzA3IDEgNDgxMzUwMAorMjg1IDEgNDgzMzUwMAorMjk0IDEgNDg1MzUwMAorMzA0IDEgNDg3MzUwMAorMjk0IDEgNDg5MzUwMAorMjk1IDEgNDkxMzUwMAorMzI1IDEgNDkzMzUwMAorMzE5IDEgNDk1MzUwMAorMzIzIDEgNDk3MzUwMAorMzEzIDEgNDk5MzUwMAorMzAzIDEgNTAxMzUwMAorMjk2IDEgNTAzMzUwMAorMjk1IDEgNTA1MzUwMAorMjkwIDEgNTA3MzUwMAorMjk3IDEgNTA5MzUwMAorMjk2IDEgNTExMzUwMAorMjk2IDEgNTEzMzUwMAorMjkyIDEgNTE1MzUwMAorMjk1IDEgNTE3MzUwMAorMjg3IDEgNTE5MzUwMAorMjk0IDEgNTIxMzUwMAorMjkwIDEgNTIzMzUwMAorMjk3IDEgNTI1MzUwMAorMjk3IDEgNTI3MzUwMAorMjk3IDEgNTI5MzUwMAorMjkyIDEgNTMxMzUwMAorMjk3IDEgNTMzMzUwMAorMjkwIDEgNTM1MzUwMAorMjkzIDEgNTM3MzUwMAorMjkzIDEgNTM5MzUwMAorMjkxIDEgNTQxMzUwMAorMjkyIDEgNTQzMzUwMAorMjkwIDEgNTQ1MzUwMAorMjkxIDEgNTQ3MzUwMAorMjk2IDEgNTQ5MzUwMAorMjk1IDEgNTUxMzUwMAorMzI3IDEgNTUzMzUwMAorMjkzIDEgNTU1MzUwMAorMjkxIDEgNTU3MzUwMAorMjkxIDEgNTU5MzUwMAorMzExIDEgNTYxMzUwMAorMjkxIDEgNTYzMzUwMAorMjk0IDEgNTY1MzUwMAorMjk2IDEgNTY3MzUwMAorMjk1IDEgNTY5MzUwMAorMjg5IDEgNTcxMzUwMAorMjk1IDEgNTczMzUwMAorMjk1IDEgNTc1MzUwMAorMjk3IDEgNTc3MzUwMAorMjkyIDEgNTc5MzUwMAorMjk3IDEgNTgxMzUwMAorMjkyIDEgNTgzMzUwMAorMjk1IDEgNTg1MzUwMAorMjk2IDEgNTg3MzUwMAorMjk1IDEgNTg5MzUwMAorMzAzIDEgNTkxMzUwMAorMzA0IDEgNTkzMzUwMAorMzAxIDEgNTk1MzUwMAorMzA3IDEgNTk3MzUwMAorMzA0IDEgNTk5MzUwMAorMzEwIDEgNjAxMzUwMAorMzEwIDEgNjAzMzUwMAorMzA1IDEgNjA1MzUwMAorMzAxIDEgNjA3MzUwMAorMzAyIDEgNjA5MzUwMAorMzA1IDEgNjExMzUwMAorMjk4IDEgNjEzMzUwMAorMzAwIDEgNjE1MzUwMAorMzAwIDEgNjE3MzUwMAorMjkyIDEgNjE5MzUwMAorMjk3IDEgNjIxMzUwMAorMzAxIDEgNjIzMzUwMAorMjk3IDEgNjI1MzUwMAorMjk3IDEgNjI3MzUwMAorMjk4IDEgNjI5MzUwMAorMjk3IDEgNjMxMzUwMAorMzAwIDEgNjMzMzUwMAorMjkzIDEgNjM1MzUwMAorMjkzIDEgNjM3MzUwMAorMjk3IDEgNjM5MzUwMAorMjk0IDEgNjQxMzUwMAorMzA3IDEgNjQzMzUwMAorMzAyIDEgNjQ1MzUwMAorMzA3IDEgNjQ3MzUwMAorMzIwIDEgNjQ5MzUwMAorMzMwIDEgNjUxMzUwMAorMzMzIDEgNjUzMzUwMAorMzM3IDEgNjU1MzUwMAorMzMxIDEgNjU3MzUwMAorMzIzIDEgNjU5MzUwMAorMzEyIDEgNjYxMzUwMAorMzI2IDEgNjYzMzUwMAorMzI4IDEgNjY1MzUwMAorMzMyIDEgNjY3MzUwMAorMzMzIDEgNjY5MzUwMAorMzQwIDEgNjcxMzUwMAorMzM2IDEgNjczMzUwMAorMzI0IDEgNjc1MzUwMAorMzEyIDEgNjc3MzUwMAorMzAxIDEgNjc5MzUwMAorMjg5IDEgNjgxMzUwMAorMzAyIDEgNjgzMzUwMAorMjk2IDEgNjg1MzUwMAorMjk5IDEgNjg3MzUwMAorMjg5IDEgNjg5MzUwMAorMjk1IDEgNjkxMzUwMAorMjk5IDEgNjkzMzUwMAorMzc0IDEgNjk1MzUwMAorMzkxIDEgNjk3MzUwMAorMzY1IDEgNjk5MzUwMAorMzQwIDEgNzAxMzUwMAorMzMwIDEgNzAzMzUwMAorMzM3IDEgNzA1MzUwMAorMzI4IDEgNzA3MzUwMAorMzI5IDEgNzA5MzUwMAorMzE5IDEgNzExMzUwMAorMzEyIDEgNzEzMzUwMAorMzA4IDEgNzE1MzUwMAorMzA0IDEgNzE3MzUwMAorMzEyIDEgNzE5MzUwMAorMzExIDEgNzIxMzUwMAorMzE2IDEgNzIzMzUwMAorMjk5IDEgNzI1MzUwMAorMzMwIDEgNzI3MzUwMAorMzMwIDEgNzI5MzUwMAorMzMwIDEgNzMxMzUwMAorMzQyIDEgNzMzMzUwMAorNDM5IDEgNzM1MzUwMAorMzIyIDEgNzM3MzUwMAorMjk4IDEgNzM5MzUwMAorMjkzIDEgNzQxMzUwMAorMzEwIDEgNzQzMzUwMAorMzAzIDEgNzQ1MzUwMAorMzE3IDEgNzQ3MzUwMAorNDUzIDEgNzQ5MzUwMAorMzc3IDEgNzUxMzUwMAorMzc0IDEgNzUzMzUwMAorMjkyIDEgNzU1MzUwMAorMjk1IDEgNzU3MzUwMAorMjc0IDEgNzU5MzUwMAorMjkyIDEgNzYxMzUwMAorMjkxIDEgNzYzMzUwMAorMzY3IDEgNzY1MzUwMAorMjk1IDEgNzY3MzUwMAorMjk4IDEgNzY5MzUwMAorMjk3IDEgNzcxMzUwMAorMzAxIDEgNzczMzUwMAorMjkyIDEgNzc1MzUwMAorMzQ0IDEgNzc3MzUwMAorMjk2IDEgNzc5MzUwMAorMjk3IDEgNzgxMzUwMAorMzA2IDEgNzgzMzUwMAorMzA4IDEgNzg1MzUwMAorMzA1IDEgNzg3MzUwMAorMzEzIDEgNzg5MzUwMAorMzA2IDEgNzkxMzUwMAorMzIyIDEgNzkzMzUwMAorMzEzIDEgNzk1MzUwMAorMzA1IDEgNzk3MzUwMAorMzA0IDEgNzk5MzUwMAorMzEzIDEgODAxMzUwMAorMzI0IDEgODAzMzUwMAorMzEyIDEgODA1MzUwMAorMzE4IDEgODA3MzUwMAorMzExIDEgODA5MzUwMAorMzAyIDEgODExMzUwMAorMzA1IDEgODEzMzUwMAorMzEyIDEgODE1MzUwMAorMzEzIDEgODE3MzUwMAorMzEyIDEgODE5MzUwMAorMzM1IDEgODIxMzUwMAorMzMzIDEgODIzMzUwMAorMzQ2IDEgODI1MzUwMAorMzM5IDEgODI3MzUwMAorMzM3IDEgODI5MzUwMAorMzQxIDEgODMxMzUwMAorMzM1IDEgODMzMzUwMAorMzI1IDEgODM1MzUwMAorMzI0IDEgODM3MzUwMAorMzE3IDEgODM5MzUwMAorMzE1IDEgODQxMzUwMAorMzAzIDEgODQzMzUwMAorMzE3IDEgODQ1MzUwMAorNDUyIDEgODQ3MzUwMAorMzI0IDEgODQ5MzUwMAorMzIxIDEgODUxMzUwMAorMzM1IDEgODUzMzUwMAorMzI3IDEgODU1MzUwMAorMzE1IDEgODU3MzUwMAorMzIxIDEgODU5MzUwMAorMzE5IDEgODYxMzUwMAorMzA4IDEgODYzMzUwMAorMzE0IDEgODY1MzUwMAorMzIyIDEgODY3MzUwMAorMzI4IDEgODY5MzUwMAorMzIwIDEgODcxMzUwMAorMzI0IDEgODczMzUwMAorMzMxIDEgODc1MzUwMAorMzMwIDEgODc3MzUwMAorMzI4IDEgODc5MzUwMAorMzE4IDEgODgxMzUwMAorMzE0IDEgODgzMzUwMAorMzE4IDEgODg1MzUwMAorMzE4IDEgODg3MzUwMAorMzI1IDEgODg5MzUwMAorMzM4IDEgODkxMzUwMAorMzQxIDEgODkzMzUwMAorMzMzIDEgODk1MzUwMAorMzMwIDEgODk3MzUwMAorMzM4IDEgODk5MzUwMAorMzMzIDEgOTAxMzUwMAorMzMwIDEgOTAzMzUwMAorMzQ0IDEgOTA1MzUwMAorNDc5IDEgOTA3MzUwMAorNDczIDEgOTA5MzUwMAorMzMzIDEgOTExMzUwMAorMzM3IDEgOTEzMzUwMAorNDk1IDEgOTE1MzUwMAorMzUzIDEgOTE3MzUwMAorMzUyIDEgOTE5MzUwMAorMzQ0IDEgOTIxMzUwMAorMzM2IDEgOTIzMzUwMAorMzI0IDEgOTI1MzUwMAorMzIxIDEgOTI3MzUwMAorMzUwIDEgOTI5MzUwMAorMzQ3IDEgOTMxMzUwMAorMzQzIDEgOTMzMzUwMAorMzQ1IDEgOTM1MzUwMAorMzM3IDEgOTM3MzUwMAorMzM1IDEgOTM5MzUwMAorMzMzIDEgOTQxMzUwMAorMzM2IDEgOTQzMzUwMAorMzM0IDEgOTQ1MzUwMAorMzMzIDEgOTQ3MzUwMAorMzMxIDEgOTQ5MzUwMAorMzI5IDEgOTUxMzUwMAorMzE5IDEgOTUzMzUwMAorMzIxIDEgOTU1MzUwMAorMzE2IDEgOTU3MzUwMAorMzIyIDEgOTU5MzUwMAorNDQ4IDEgOTYxMzUwMAorMzEyIDEgOTYzMzUwMAorMzA2IDEgOTY1MzUwMAorMzAxIDEgOTY3MzUwMAorMzAzIDEgOTY5MzUwMAorMjk2IDEgOTcxMzUwMAorMzAwIDEgOTczMzUwMAorMjk1IDEgOTc1MzUwMAorMzAwIDEgOTc3MzUwMAorMjk3IDEgOTc5MzUwMAorMzAwIDEgOTgxMzUwMAorMjk3IDEgOTgzMzUwMAorNTEyIDEgOTg1MzUwMAorMjkyIDEgOTg3MzUwMAorNDY4IDEgOTg5MzUwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZiODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJmNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0OWViMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUyNGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KQEAgLTAsMCArMSwxMCBAQAorMTYzODQgMSAwCisxNjM4NCAxIDEwMjQwMDAKKzE2Mzg0IDEgMjA0ODAwMAorMTYzODQgMSAzMDcyMDAwCisxNjM4NCAxIDQwOTYwMDAKKzE2Mzg0IDEgNTEyMDAwMAorMTYzODQgMSA2MTQ0MDAwCisxNjM4NCAxIDcxNjgwMDAKKzE2Mzg0IDEgODE5MjAwMAorMTA5MjQgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGIyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE2ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDUyMCBAQAorMzAgMzIgMAorNDE0MCAzMiAwCiszMyAzMiAwCis1MiAxIDAKKzU4IDEgMjY2NgorNjEgMSA1MzMzCis1NiAxIDgwMDAKKzU5IDEgMTA2NjYKKzYzIDEgMTMzMzMKKzY2IDEgMTYwMDAKKzcxIDEgMTg2NjYKKzc2IDEgMjEzMzMKKzM3NCAxIDI0MDAwCiszNjYgMSAzNjAwMAorMzc4IDEgNTczMzMKKzM5MyAxIDc4NjY2CiszOTMgMSAxMDAwMDAKKzM4NiAxIDEyMTMzMworMzc1IDEgMTQyNjY2CiszODggMSAxNjQwMDAKKzM3OCAxIDE4NTMzMworMzc5IDEgMjA2NjY2CiszNzQgMSAyMjgwMDAKKzM1NiAxIDI0OTMzMworMzU4IDEgMjcwNjY2CiszMzIgMSAyOTIwMDAKKzMzNSAxIDMxMzMzMworMzYzIDEgMzM0NjY2CiszNDEgMSAzNTYwMDAKKzM2MCAxIDM3NzMzMworMzQxIDEgMzk4NjY2CiszMzUgMSA0MjAwMDAKKzM1NyAxIDQ0MTMzMworMzU1IDEgNDYyNjY2CiszNjMgMSA0ODQwMDAKKzM4MiAxIDUwNTMzMworMzcxIDEgNTI2NjY2CiszNTcgMSA1NDgwMDAKKzM1MyAxIDU2OTMzMworMzUwIDEgNTkwNjY2CiszMjcgMSA2MTIwMDAKKzMxNSAxIDYzMzMzMworMzA3IDEgNjU0NjY2CiszMDMgMSA2NzYwMDAKKzI5NSAxIDY5NzMzMworMzEyIDEgNzE4NjY2CiszMTYgMSA3NDAwMDAKKzMxNSAxIDc2MTMzMworMzE4IDEgNzgyNjY2CiszMzAgMSA4MDQwMDAKKzMxOCAxIDgyNTMzMworMzE1IDEgODQ2NjY2CiszMjIgMSA4NjgwMDAKKzMxNSAxIDg4OTMzMworMzEwIDEgOTEwNjY2CiszMTUgMSA5MzIwMDAKKzMxNCAxIDk1MzMzMworMzAyIDEgOTc0NjY2CiszMTMgMSA5OTYwMDAKKzMyMiAxIDEwMTczMzMKKzMyMyAxIDEwMzg2NjYKKzMxOSAxIDEwNjAwMDAKKzMyNSAxIDEwODEzMzMKKzMyOCAxIDExMDI2NjYKKzMzMCAxIDExMjQwMDAKKzMzMyAxIDExNDUzMzMKKzMzMCAxIDExNjY2NjYKKzM0NCAxIDExODgwMDAKKzMzMSAxIDEyMDkzMzMKKzM0MiAxIDEyMzA2NjYKKzMzOSAxIDEyNTIwMDAKKzMxNCAxIDEyNzMzMzMKKzI4NSAxIDEyOTQ2NjYKKzI5NSAxIDEzMTYwMDAKKzMwMiAxIDEzMzczMzMKKzMwNSAxIDEzNTg2NjYKKzMwOSAxIDEzODAwMDAKKzMyNyAxIDE0MDEzMzMKKzMwNCAxIDE0MjI2NjYKKzMzNiAxIDE0NDQwMDAKKzM1MCAxIDE0NjUzMzMKKzM0NiAxIDE0ODY2NjYKKzM1MiAxIDE1MDgwMDAKKzM0MSAxIDE1MjkzMzMKKzM0MyAxIDE1NTA2NjYKKzM1MSAxIDE1NzIwMDAKKzMxOSAxIDE1OTMzMzMKKzMyOCAxIDE2MTQ2NjYKKzMyOCAxIDE2MzYwMDAKKzMyNCAxIDE2NTczMzMKKzMzOCAxIDE2Nzg2NjYKKzMxNyAxIDE3MDAwMDAKKzMyOCAxIDE3MjEzMzMKKzMzNSAxIDE3NDI2NjYKKzM0MSAxIDE3NjQwMDAKKzMzNSAxIDE3ODUzMzMKKzM0OCAxIDE4MDY2NjYKKzM2MiAxIDE4MjgwMDAKKzM2MSAxIDE4NDkzMzMKKzM0NCAxIDE4NzA2NjYKKzM0MCAxIDE4OTIwMDAKKzMzMyAxIDE5MTMzMzMKKzMyOSAxIDE5MzQ2NjYKKzMyOCAxIDE5NTYwMDAKKzMyMyAxIDE5NzczMzMKKzMxMCAxIDE5OTg2NjYKKzMxOCAxIDIwMjAwMDAKKzMxMiAxIDIwNDEzMzMKKzI5NSAxIDIwNjI2NjYKKzMyOSAxIDIwODQwMDAKKzMxOCAxIDIxMDUzMzMKKzMxMSAxIDIxMjY2NjYKKzMxNyAxIDIxNDgwMDAKKzYyIDEgMjE2OTMzMworNzUgMSAyMTgxMzMzCis3MyAxIDIxODQwMDAKKzMzMiAxIDIxODY2NjYKKzMyNyAxIDIxOTg2NjYKKzMzMiAxIDIyMjAwMDAKKzMyNSAxIDIyNDEzMzMKKzMyOSAxIDIyNjI2NjYKKzMzMCAxIDIyODQwMDAKKzYxIDEgMjMwNTMzMworNjEgMSAyMzE3MzMzCis3MCAxIDIzMjAwMDAKKzcwIDEgMjMyMjY2NgorMzE5IDEgMjMyNTMzMworMzAzIDEgMjMzNzMzMworMjkyIDEgMjM1ODY2NgorMzEzIDEgMjM4MDAwMAorMzE4IDEgMjQwMTMzMworMzQ2IDEgMjQyMjY2NgorMzI4IDEgMjQ0NDAwMAorMzE2IDEgMjQ2NTMzMworMzQxIDEgMjQ4NjY2NgorMzI4IDEgMjUwODAwMAorMzM4IDEgMjUyOTMzMworMzQxIDEgMjU1MDY2NgorMzM3IDEgMjU3MjAwMAorMzQ3IDEgMjU5MzMzMworMzg0IDEgMjYxNDY2NgorMzU4IDEgMjYzNjAwMAorMzYzIDEgMjY1NzMzMworMzYzIDEgMjY3ODY2NgorMzU4IDEgMjcwMDAwMAorMzM5IDEgMjcyMTMzMworMzY5IDEgMjc0MjY2NgorMzQzIDEgMjc2NDAwMAorMzQ4IDEgMjc4NTMzMworMzYzIDEgMjgwNjY2NgorMzUwIDEgMjgyODAwMAorMzU4IDEgMjg0OTMzMworMzUyIDEgMjg3MDY2NgorMzM4IDEgMjg5MjAwMAorMzM1IDEgMjkxMzMzMworMzQyIDEgMjkzNDY2NgorMzM4IDEgMjk1NjAwMAorMzQwIDEgMjk3NzMzMworMjkyIDEgMjk5ODY2NgorMjc5IDEgMzAyMDAwMAorMjk5IDEgMzA0MTMzMworMzAzIDEgMzA2MjY2NgorMjk4IDEgMzA4NDAwMAorMjk3IDEgMzEwNTMzMworMjgwIDEgMzEyNjY2NgorMjk3IDEgMzE0ODAwMAorMjkwIDEgMzE2OTMzMworMzA2IDEgMzE5MDY2NgorMzAxIDEgMzIxMjAwMAorMzA2IDEgMzIzMzMzMworMjg5IDEgMzI1NDY2NgorMzExIDEgMzI3NjAwMAorMzE3IDEgMzI5NzMzMworMzQ0IDEgMzMxODY2NgorMzA4IDEgMzM0MDAwMAorMzA0IDEgMzM2MTMzMworMzA0IDEgMzM4MjY2NgorMzEyIDEgMzQwNDAwMAorMzA1IDEgMzQyNTMzMworMjk5IDEgMzQ0NjY2NgorMzAxIDEgMzQ2ODAwMAorMzE4IDEgMzQ4OTMzMworMzEzIDEgMzUxMDY2NgorMzMwIDEgMzUzMjAwMAorMzI1IDEgMzU1MzMzMworMzI1IDEgMzU3NDY2NgorMzIxIDEgMzU5NjAwMAorMzQ5IDEgMzYxNzMzMworMjg4IDEgMzYzODY2NgorMzAwIDEgMzY2MDAwMAorMzEyIDEgMzY4MTMzMworMzAyIDEgMzcwMjY2NgorMjc4IDEgMzcyNDAwMAorMjg0IDEgMzc0NTMzMworMjg2IDEgMzc2NjY2NgorMjc0IDEgMzc4ODAwMAorMjk1IDEgMzgwOTMzMworMjgxIDEgMzgzMDY2NgorMjg4IDEgMzg1MjAwMAorMjc4IDEgMzg3MzMzMworMzA2IDEgMzg5NDY2NgorNjIgMSAzOTE2MDAwCis1OSAxIDM5MjgwMDAKKzYxIDEgMzkzMDY2NgorNTUgMSAzOTMzMzMzCis3MCAxIDM5MzYwMDAKKzcyIDEgMzkzODY2NgorMzI0IDEgMzk0MTMzMworMzA5IDEgMzk1MzMzMworMzAxIDEgMzk3NDY2NgorMzAxIDEgMzk5NjAwMAorMjkxIDEgNDAxNzMzMworMjg5IDEgNDAzODY2NgorMzA2IDEgNDA2MDAwMAorMzA1IDEgNDA4MTMzMworMjg2IDEgNDEwMjY2NgorMjk0IDEgNDEyNDAwMAorMjkwIDEgNDE0NTMzMworMjk3IDEgNDE2NjY2NgorMzA4IDEgNDE4ODAwMAorMjk2IDEgNDIwOTMzMworMjkyIDEgNDIzMDY2NgorMjg3IDEgNDI1MjAwMAorMjkxIDEgNDI3MzMzMworMjk4IDEgNDI5NDY2NgorMjk1IDEgNDMxNjAwMAorMjk0IDEgNDMzNzMzMworMjk1IDEgNDM1ODY2NgorMjc1IDEgNDM4MDAwMAorMjgwIDEgNDQwMTMzMworMjg4IDEgNDQyMjY2NgorMjg1IDEgNDQ0NDAwMAorMjc0IDEgNDQ2NTMzMworMjk4IDEgNDQ4NjY2NgorMzAxIDEgNDUwODAwMAorMzAwIDEgNDUyOTMzMworMzA1IDEgNDU1MDY2NgorMjk3IDEgNDU3MjAwMAorNTkgMSA0NTkzMzMzCis1NiAxIDQ2MDUzMzMKKzU3IDEgNDYwODAwMAorNTUgMSA0NjEwNjY2Cis1OCAxIDQ2MTMzMzMKKzU3IDEgNDYxNjAwMAorNTggMSA0NjE4NjY2Cis2OCAxIDQ2MjEzMzMKKzY3IDEgNDYyNDAwMAorNzEgMSA0NjI2NjY2CisyODkgMSA0NjI5MzMzCisyODIgMSA0NjQxMzMzCisyNzMgMSA0NjYyNjY2CisyNzkgMSA0Njg0MDAwCisyODYgMSA0NzA1MzMzCisyODIgMSA0NzI2NjY2CisyODQgMSA0NzQ4MDAwCisyNzggMSA0NzY5MzMzCisyODEgMSA0NzkwNjY2CisyODAgMSA0ODEyMDAwCisyNjMgMSA0ODMzMzMzCisyNjAgMSA0ODU0NjY2CisyNzEgMSA0ODc2MDAwCisyNzMgMSA0ODk3MzMzCisyODIgMSA0OTE4NjY2CisyNzkgMSA0OTQwMDAwCisyOTcgMSA0OTYxMzMzCisyOTEgMSA0OTgyNjY2CiszMDkgMSA1MDA0MDAwCisyODMgMSA1MDI1MzMzCisyOTIgMSA1MDQ2NjY2CiszMDQgMSA1MDY4MDAwCisyOTYgMSA1MDg5MzMzCisyOTMgMSA1MTEwNjY2CisyODIgMSA1MTMyMDAwCisyNzMgMSA1MTUzMzMzCisyODQgMSA1MTc0NjY2CisyODEgMSA1MTk2MDAwCisyNjUgMSA1MjE3MzMzCisyNzIgMSA1MjM4NjY2CisyNzcgMSA1MjYwMDAwCisyODAgMSA1MjgxMzMzCisyNzYgMSA1MzAyNjY2CisyNzMgMSA1MzI0MDAwCisyNzggMSA1MzQ1MzMzCisyODAgMSA1MzY2NjY2CisyODAgMSA1Mzg4MDAwCisyNjggMSA1NDA5MzMzCisyODIgMSA1NDMwNjY2CisyNzcgMSA1NDUyMDAwCisyNzQgMSA1NDczMzMzCisyNzUgMSA1NDk0NjY2CisyNzAgMSA1NTE2MDAwCisyODIgMSA1NTM3MzMzCisyNzkgMSA1NTU4NjY2CisyNjAgMSA1NTgwMDAwCisyNzIgMSA1NjAxMzMzCisyNzUgMSA1NjIyNjY2CisyNzMgMSA1NjQ0MDAwCisyNzYgMSA1NjY1MzMzCisyODggMSA1Njg2NjY2CisyOTQgMSA1NzA4MDAwCisyNzEgMSA1NzI5MzMzCisyNzcgMSA1NzUwNjY2CisyODggMSA1NzcyMDAwCisyNzYgMSA1NzkzMzMzCisyODIgMSA1ODE0NjY2CisyNzYgMSA1ODM2MDAwCisyNzUgMSA1ODU3MzMzCisyNjggMSA1ODc4NjY2CisyNzAgMSA1OTAwMDAwCisyNjYgMSA1OTIxMzMzCisyNjggMSA1OTQyNjY2CisyODIgMSA1OTY0MDAwCisyNzkgMSA1OTg1MzMzCisyNzkgMSA2MDA2NjY2CisyODcgMSA2MDI4MDAwCisyODYgMSA2MDQ5MzMzCisyODAgMSA2MDcwNjY2CisyOTAgMSA2MDkyMDAwCisyNjYgMSA2MTEzMzMzCisyOTIgMSA2MTM0NjY2CisyNjQgMSA2MTU2MDAwCisyNzEgMSA2MTc3MzMzCisyNzcgMSA2MTk4NjY2CisyOTIgMSA2MjIwMDAwCisyOTggMSA2MjQxMzMzCisyODQgMSA2MjYyNjY2CisyODcgMSA2Mjg0MDAwCisyNzUgMSA2MzA1MzMzCisyOTEgMSA2MzI2NjY2CisyODcgMSA2MzQ4MDAwCisyODMgMSA2MzY5MzMzCisyODQgMSA2MzkwNjY2CisyNzEgMSA2NDEyMDAwCisyODIgMSA2NDMzMzMzCisyNzcgMSA2NDU0NjY2CisyODIgMSA2NDc2MDAwCisyODUgMSA2NDk3MzMzCisyODAgMSA2NTE4NjY2CisyNzEgMSA2NTQwMDAwCisyODkgMSA2NTYxMzMzCisyODcgMSA2NTgyNjY2CisyOTQgMSA2NjA0MDAwCisyNzcgMSA2NjI1MzMzCisyODEgMSA2NjQ2NjY2CisyNzQgMSA2NjY4MDAwCisyNzEgMSA2Njg5MzMzCisyNzkgMSA2NzEwNjY2CisyODggMSA2NzMyMDAwCisyODAgMSA2NzUzMzMzCisyODQgMSA2Nzc0NjY2CisyNzggMSA2Nzk2MDAwCisyNzYgMSA2ODE3MzMzCisyNzUgMSA2ODM4NjY2CisyNjMgMSA2ODYwMDAwCisyNjYgMSA2ODgxMzMzCisyNDcgMSA2OTAyNjY2CisyNjkgMSA2OTI0MDAwCisyNjMgMSA2OTQ1MzMzCisyODMgMSA2OTY2NjY2CisyODAgMSA2OTg4MDAwCisyODEgMSA3MDA5MzMzCisyOTkgMSA3MDMwNjY2CisyODUgMSA3MDUyMDAwCisyODggMSA3MDczMzMzCisyOTkgMSA3MDk0NjY2CisyODggMSA3MTE2MDAwCisyNzkgMSA3MTM3MzMzCisyNzYgMSA3MTU4NjY2CisyNzcgMSA3MTgwMDAwCisyODIgMSA3MjAxMzMzCisyODUgMSA3MjIyNjY2CisyOTUgMSA3MjQ0MDAwCisyOTQgMSA3MjY1MzMzCiszMDQgMSA3Mjg2NjY2CisyODIgMSA3MzA4MDAwCisyOTkgMSA3MzI5MzMzCisyODMgMSA3MzUwNjY2CisyODIgMSA3MzcyMDAwCisyODcgMSA3MzkzMzMzCiszMDYgMSA3NDE0NjY2CiszMDQgMSA3NDM2MDAwCisyODkgMSA3NDU3MzMzCisyOTkgMSA3NDc4NjY2CisyODEgMSA3NTAwMDAwCisyODEgMSA3NTIxMzMzCis2NiAxIDc1NDI2NjYKKzYzIDEgNzU1NDY2NgorMjg5IDEgNzU1NzMzMworMjcwIDEgNzU2OTMzMworMjU3IDEgNzU5MDY2NgorMjQ2IDEgNzYxMjAwMAorMjY0IDEgNzYzMzMzMworMjgwIDEgNzY1NDY2NgorMjczIDEgNzY3NjAwMAorMjg1IDEgNzY5NzMzMworMjY3IDEgNzcxODY2NgorMjc1IDEgNzc0MDAwMAorMjc4IDEgNzc2MTMzMworMjkzIDEgNzc4MjY2NgorMjgxIDEgNzgwNDAwMAorMjk3IDEgNzgyNTMzMworMjk0IDEgNzg0NjY2NgorMjg2IDEgNzg2ODAwMAorMjkwIDEgNzg4OTMzMworMjkwIDEgNzkxMDY2NgorMjg5IDEgNzkzMjAwMAorMjg2IDEgNzk1MzMzMworMjgyIDEgNzk3NDY2NgorMzA2IDEgNzk5NjAwMAorMjg3IDEgODAxNzMzMworMzEyIDEgODAzODY2NgorMzEyIDEgODA2MDAwMAorMzA3IDEgODA4MTMzMworMjkzIDEgODEwMjY2NgorMjg5IDEgODEyNDAwMAorMjg1IDEgODE0NTMzMworMjkwIDEgODE2NjY2NgorMjg1IDEgODE4ODAwMAorMzExIDEgODIwOTMzMworMzA3IDEgODIzMDY2NgorMzE0IDEgODI1MjAwMAorMzE4IDEgODI3MzMzMworMzE5IDEgODI5NDY2NgorMzE1IDEgODMxNjAwMAorMzAwIDEgODMzNzMzMworMjk1IDEgODM1ODY2NgorMjkxIDEgODM4MDAwMAorMjgyIDEgODQwMTMzMworMjk1IDEgODQyMjY2NgorMjk2IDEgODQ0NDAwMAorMjg4IDEgODQ2NTMzMworMzA0IDEgODQ4NjY2NgorMjk5IDEgODUwODAwMAorMjk4IDEgODUyOTMzMworMzA1IDEgODU1MDY2NgorMjk1IDEgODU3MjAwMAorMjk2IDEgODU5MzMzMworMjk1IDEgODYxNDY2NgorMjg3IDEgODYzNjAwMAorMjkyIDEgODY1NzMzMworMzA4IDEgODY3ODY2NgorMjg3IDEgODcwMDAwMAorMzA3IDEgODcyMTMzMworMjk1IDEgODc0MjY2NgorMjkyIDEgODc2NDAwMAorMjkyIDEgODc4NTMzMworMjc5IDEgODgwNjY2NgorMjg5IDEgODgyODAwMAorMzAzIDEgODg0OTMzMworMzA3IDEgODg3MDY2NgorMzEwIDEgODg5MjAwMAorMzAwIDEgODkxMzMzMworMjk5IDEgODkzNDY2NgorMjk5IDEgODk1NjAwMAorMjg4IDEgODk3NzMzMworMjkwIDEgODk5ODY2NgorMjkxIDEgOTAyMDAwMAorMzA0IDEgOTA0MTMzMworMjk5IDEgOTA2MjY2NgorMzA0IDEgOTA4NDAwMAorMjkwIDEgOTEwNTMzMworMzA5IDEgOTEyNjY2NgorMzAxIDEgOTE0ODAwMAorMjk2IDEgOTE2OTMzMworMjg4IDEgOTE5MDY2NgorMzA1IDEgOTIxMjAwMAorMzE3IDEgOTIzMzMzMworMjkyIDEgOTI1NDY2NgorMzAwIDEgOTI3NjAwMAorMzAxIDEgOTI5NzMzMworMjk1IDEgOTMxODY2NgorMjgyIDEgOTM0MDAwMAorMjk2IDEgOTM2MTMzMworMjk1IDEgOTM4MjY2NgorMjg3IDEgOTQwNDAwMAorMjkyIDEgOTQyNTMzMworMzAxIDEgOTQ0NjY2NgorMzExIDEgOTQ2ODAwMAorMzAxIDEgOTQ4OTMzMworMzA3IDEgOTUxMDY2NgorMzAwIDEgOTUzMjAwMAorMzA5IDEgOTU1MzMzMworMjk4IDEgOTU3NDY2NgorMzA0IDEgOTU5NjAwMAorNjAgMSA5NjE3MzMzCis1OSAxIDk2MjkzMzMKKzY0IDEgOTYzMjAwMAorNjQgMSA5NjM0NjY2Cis3NyAxIDk2MzczMzMKKzcyIDEgOTY0MDAwMAorMzA2IDEgOTY0MjY2NgorMjk3IDEgOTY1NDY2NgorMjk0IDEgOTY3NjAwMAorMjk1IDEgOTY5NzMzMworMzA4IDEgOTcxODY2NgorMzAzIDEgOTc0MDAwMAorMzA4IDEgOTc2MTMzMworMjg5IDEgOTc4MjY2NgorMzAwIDEgOTgwNDAwMAorMzA0IDEgOTgyNTMzMworMzA4IDEgOTg0NjY2NgorNjQgMSA5ODY4MDAwCis2MyAxIDk4ODAwMDAKKzY0IDEgOTg4MjY2NgorNjQgMSA5ODg1MzMzCis2MCAxIDk4ODgwMDAKKzc0IDEgOTg5MDY2NgorNjkgMSA5ODkzMzMzCis2OCAxIDk4OTYwMDAKKzYxIDEgOTg5ODY2NgorNzEgMSA5OTAxMzMzCis3NiAxIDk5MDQwMDAKKzczIDEgOTkwNjY2NgorNzAgMSA5OTA5MzMzCis3MiAxIDk5MTIwMDAKKzYwIDEgOTkxNDY2NgorNjkgMSA5OTE3MzMzCis4MiAxIDk5MjAwMDAKKzI3OCAxIDk5MjI2NjYKKzMwIDEgOTkzNDY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTAyNzEgMSAwCisxMDYgMCAxNzAwMAorMTM0IDAgMzMwMDAKKzE0OSAwIDUwMDAwCisxNTIgMCA2NzAwMAorMTU5IDAgODMwMDAKKzExNCAwIDEwMDAwMAorNzIzIDAgMTE3MDAwCisxNzUgMCAxMzMwMDAKKzE4NiAwIDE1MDAwMAorMjAxIDAgMTY3MDAwCisyNzAgMCAxODMwMDAKKzM4MyAwIDIwMDAwMAorMjU1IDAgMjE3MDAwCisyODYgMCAyMzMwMDAKKzI3MyAwIDI1MDAwMAorMTIyNCAwIDI2NzAwMAorMjIwIDAgMjgzMDAwCisyMzEgMCAzMDAwMDAKKzE5MiAwIDMxNzAwMAorMTgyIDAgMzMzMDAwCisyODkgMCAzNTAwMDAKKzIwNCAwIDM2NzAwMAorMjM3IDAgMzgzMDAwCisxODcgMCA0MDAwMDAKKzg5OCAwIDQxNzAwMAorMjMxIDAgNDMzMDAwCisyNjYgMCA0NTAwMDAKKzI3OCAwIDQ2NzAwMAorMjA1IDAgNDgzMDAwCisyNTUgMCA1MDAwMDAKKzE2OSAwIDUxNzAwMAorMjMzIDAgNTMzMDAwCisxMDExIDAgNTUwMDAwCisyMDIgMCA1NjcwMDAKKzI1MSAwIDU4MzAwMAorMjIzIDAgNjAwMDAwCisyODMgMCA2MTcwMDAKKzM2MiAwIDYzMzAwMAorMjE3IDAgNjUwMDAwCisyNDUgMCA2NjcwMDAKKzk2MCAwIDY4MzAwMAorMjMzIDAgNzAwMDAwCisyODYgMCA3MTcwMDAKKzI3MiAwIDczMzAwMAorMjU0IDAgNzUwMDAwCiszMzEgMCA3NjcwMDAKKzIxOCAwIDc4MzAwMAorMjYxIDAgODAwMDAwCis5ODEgMCA4MTcwMDAKKzIyNiAwIDgzMzAwMAorMjI2IDAgODUwMDAwCisyNzkgMCA4NjcwMDAKKzIyNSAwIDg4MzAwMAorMjk1IDAgOTAwMDAwCisxNzUgMCA5MTcwMDAKKzI0OSAwIDkzMzAwMAorOTk2IDAgOTUwMDAwCisxNjkgMCA5NjcwMDAKKzIyNCAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMGM3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzg2OTgwIDEgMAorNjc0MSAwIDMzMDAwCis5NDMzIDAgNjcwMDAKKzkzNjMgMCAxMDAwMDAKKzg2NzEgMCAxMzMwMDAKKzkwMDMgMCAxNjcwMDAKKzc3NTEgMCAyMDAwMDAKKzEzMjA3IDAgMjMzMDAwCis4NTQyIDAgMjY3MDAwCis5MzQ0IDAgMzAwMDAwCis4MDY5IDAgMzMzMDAwCis4NTg4IDAgMzY3MDAwCisxMjA4NyAwIDQwMDAwMAorNzMxNSAwIDQzMzAwMAorOTY1NCAwIDQ2NzAwMAorMTMxMDAgMCA1MDAwMDAKKzc4MzIgMCA1MzMwMDAKKzEwMDYwIDAgNTY3MDAwCis4NTQwIDAgNjAwMDAwCis4NjY3IDAgNjMzMDAwCis4NTMyIDAgNjY3MDAwCis2MDE4IDAgNzAwMDAwCis4NTIwIDAgNzMzMDAwCisxNTM1MCAwIDc2NzAwMAorNjExMCAwIDgwMDAwMAorNzg3NiAwIDgzMzAwMAorNjEzMyAwIDg2NzAwMAorOTQ3NiAwIDkwMDAwMAorMTEwMDIgMCA5MzMwMDAKKzc0ODQgMCA5NjcwMDAKKzg3NjAgMCAxMDAwMDAwCisxNjUxNSAwIDEwMzMwMDAKKzc0ODIgMCAxMDY3MDAwCis2OTgzIDAgMTEwMDAwMAorNzU2MSAwIDExMzMwMDAKKzgyNjMgMCAxMTY3MDAwCisxMDY4MiAwIDEyMDAwMDAKKzgxMDggMCAxMjMzMDAwCis3OTI0IDAgMTI2NzAwMAorODY5MyAwIDEzMDAwMDAKKzE0MTkwIDAgMTMzMzAwMAorNzM5MyAwIDEzNjcwMDAKKzY4NjQgMCAxNDAwMDAwCis5NDMxIDAgMTQzMzAwMAorNzY3NCAwIDE0NjcwMDAKKzg0NTggMCAxNTAwMDAwCis1ODk5IDAgMTUzMzAwMAorODI1OSAwIDE1NjcwMDAKKzc5NjMgMCAxNjAwMDAwCisxNDc3OSAwIDE2MzMwMDAKKzY4NzcgMCAxNjY3MDAwCis3MjY4IDAgMTcwMDAwMAorODUyNiAwIDE3MzMwMDAKKzg0NjcgMCAxNzY3MDAwCisxMTIwMCAwIDE4MDAwMDAKKzcyNjEgMCAxODMzMDAwCis4MjgwIDAgMTg2NzAwMAorNjcxOCAwIDE5MDAwMDAKKzE3NzQyIDAgMTkzMzAwMAorNTIwNiAwIDE5NjcwMDAKKzU3MDAgMCAyMDAwMDAwCis1ODcyIDAgMjAzMzAwMAorNzkxNSAwIDIwNjcwMDAKKzg0OTMgMCAyMTAwMDAwCis2NTQ1IDAgMjEzMzAwMAorOTA3MiAwIDIxNjcwMDAKKzEzMjAwIDAgMjIwMDAwMAorOTYzMiAwIDIyMzMwMDAKKzEwMDE2IDAgMjI2NzAwMAorNzgyNCAwIDIzMDAwMDAKKzEwNjI4IDAgMjMzMzAwMAorMTA0MDEgMCAyMzY3MDAwCisxMDg5MiAwIDI0MDAwMDAKKzkwMjMgMCAyNDMzMDAwCisxMDczNCAwIDI0NjcwMDAKKzE1MDQ1IDAgMjUwMDAwMAorNzk0MCAwIDI1MzMwMDAKKzk2NTcgMCAyNTY3MDAwCis4NzQzIDAgMjYwMDAwMAorODA3NCAwIDI2MzMwMDAKKzk0NDUgMCAyNjY3MDAwCis2NDk0IDAgMjcwMDAwMAorODYwMSAwIDI3MzMwMDAKKzEzNDc4IDAgMjc2NzAwMAorNjk0MiAwIDI4MDAwMDAKKzgwMDIgMCAyODMzMDAwCis3OTQwIDAgMjg2NzAwMAorODMyMCAwIDI5MDAwMDAKKzEyMjE1IDAgMjkzMzAwMAorNjY2OCAwIDI5NjcwMDAKKzExMzg0IDAgMzAwMDAwMAorODM3OCAwIDMwMzMwMDAKKzEyOTA4IDAgMzA2NzAwMAorODQyMCAwIDMxMDAwMDAKKzc1MDIgMCAzMTMzMDAwCis4NDgyIDAgMzE2NzAwMAorMTA5NjggMCAzMjAwMDAwCisxMjMzOCAwIDMyMzMwMDAKKzg2NTcgMCAzMjY3MDAwCisxMDQ2OCAwIDMzMDAwMDAKKzEzODc4IDAgMzMzMzAwMAorOTM3NCAwIDMzNjcwMDAKKzk4NTcgMCAzNDAwMDAwCisxMDM4MSAwIDM0MzMwMDAKKzk5ODQgMCAzNDY3MDAwCis5OTU2IDAgMzUwMDAwMAorODkwNSAwIDM1MzMwMDAKKzg2NzIgMCAzNTY3MDAwCis4MTIyIDAgMzYwMDAwMAorOTY3NyAwIDM2MzMwMDAKKzk4MTIgMCAzNjY3MDAwCis5NjIyIDAgMzcwMDAwMAorOTAyMyAwIDM3MzMwMDAKKzcxNDcgMCAzNzY3MDAwCis5MTQ2IDAgMzgwMDAwMAorNzQ4OCAwIDM4MzMwMDAKKzEwODEyIDAgMzg2NzAwMAorODM0MCAwIDM5MDAwMDAKKzEzMjgwIDAgMzkzMzAwMAorNTE2NyAwIDM5NjcwMDAKKzY5OTEgMCA0MDAwMDAwCis2NTQzIDAgNDAzMzAwMAorNTk1MiAwIDQwNjcwMDAKKzUxNjQgMCA0MTAwMDAwCis0MDExIDAgNDEzMzAwMAorMzc5NCAwIDQxNjcwMDAKKzEyOTU5IDAgNDIwMDAwMAorNzEwMjAgMSA0MjMzMDAwCis1MzUxIDAgNDI2NzAwMAorNjI4MyAwIDQzMDAwMDAKKzUwODAgMCA0MzMzMDAwCis2NzA3IDAgNDM2NzAwMAorNTg1NyAwIDQ0MDAwMDAKKzUyMjEgMCA0NDMzMDAwCisxMDk3MiAwIDQ0NjcwMDAKKzcwMjMgMCA0NTAwMDAwCis2OTA3IDAgNDUzMzAwMAorNzg1MSAwIDQ1NjcwMDAKKzQ4NDMgMCA0NjAwMDAwCis2MDg1IDAgNDYzMzAwMAorNDg2OCAwIDQ2NjcwMDAKKzUwOTMgMCA0NzAwMDAwCisxMjgwNyAwIDQ3MzMwMDAKKzYzMzAgMCA0NzY3MDAwCis0MjA5IDAgNDgwMDAwMAorNDU5NiAwIDQ4MzMwMDAKKzYzMTYgMCA0ODY3MDAwCis0OTU0IDAgNDkwMDAwMAorNTUzMyAwIDQ5MzMwMDAKKzc3NDkgMCA0OTY3MDAwCisxMjQ4NiAwIDUwMDAwMDAKKzU0NjggMCA1MDMzMDAwCis0MzUzIDAgNTA2NzAwMAorNTc4NiAwIDUxMDAwMDAKKzU1NTEgMCA1MTMzMDAwCis2NzExIDAgNTE2NzAwMAorNTY4OCAwIDUyMDAwMDAKKzYyNTggMCA1MjMzMDAwCisxMjk3NSAwIDUyNjcwMDAKKzQ4NzMgMCA1MzAwMDAwCis0NTUyIDAgNTMzMzAwMAorNDg0NCAwIDUzNjcwMDAKKzQ3NzQgMCA1NDAwMDAwCis1MDI1IDAgNTQzMzAwMAorNTIwNCAwIDU0NjcwMDAKKzQ4MTQgMCA1NTAwMDAwCisxNDgzNSAwIDU1MzMwMDAKKzUzNDMgMCA1NTY3MDAwCis0ODA4IDAgNTYwMDAwMAorNTA3MSAwIDU2MzMwMDAKKzYzMjQgMCA1NjY3MDAwCis1MjQzIDAgNTcwMDAwMAorNDk5NSAwIDU3MzMwMDAKKzUxMzQgMCA1NzY3MDAwCisxMTA1NCAwIDU4MDAwMDAKKzQ4MDcgMCA1ODMzMDAwCis1MTE4IDAgNTg2NzAwMAorNjQyNCAwIDU5MDAwMDAKKzQ5ODQgMCA1OTMzMDAwCis3MTg3IDAgNTk2NzAwMAorNTUwNSAwIDYwMDAwMDAKKzY5NDEgMCA2MDMzMDAwCisxMTUxNyAwIDYwNjcwMDAKKzU2NDYgMCA2MTAwMDAwCis2ODMyIDAgNjEzMzAwMAorNTI5NCAwIDYxNjcwMDAKKzYyMDAgMCA2MjAwMDAwCis2MzI4IDAgNjIzMzAwMAorNDM0OCAwIDYyNjcwMDAKKzQ2MDcgMCA2MzAwMDAwCisxMjk1OCAwIDYzMzMwMDAKKzQzMDggMCA2MzY3MDAwCis2MDg0IDAgNjQwMDAwMAorNDQ5NCAwIDY0MzMwMDAKKzUzMzggMCA2NDY3MDAwCis1NzQyIDAgNjUwMDAwMAorNTQ3MiAwIDY1MzMwMDAKKzg0NTkgMCA2NTY3MDAwCisxMzA3NSAwIDY2MDAwMDAKKzg5ODYgMCA2NjMzMDAwCis5NTgzIDAgNjY2NzAwMAorODc5MiAwIDY3MDAwMDAKKzkwMDQgMCA2NzMzMDAwCis5NjMyIDAgNjc2NzAwMAorOTM5MyAwIDY4MDAwMDAKKzkyNTkgMCA2ODMzMDAwCisxMTkyNyAwIDY4NjcwMDAKKzEwMzIzIDAgNjkwMDAwMAorMTUyNDggMCA2OTMzMDAwCisxMTI0NCAwIDY5NjcwMDAKKzE1NTU4IDAgNzAwMDAwMAorNjE5NyAwIDcwMzMwMDAKKzgwNDQgMCA3MDY3MDAwCisxMTQzMiAwIDcxMDAwMDAKKzg3MzcgMCA3MTMzMDAwCisxMzg4NSAwIDcxNjcwMDAKKzExMTU4IDAgNzIwMDAwMAorMTUxNTIgMCA3MjMzMDAwCis3MDI1IDAgNzI2NzAwMAorODAyNSAwIDczMDAwMDAKKzEzMzYyIDAgNzMzMzAwMAorODA5MCAwIDczNjcwMDAKKzEzNjM3IDAgNzQwMDAwMAorNjE0OCAwIDc0MzMwMDAKKzkyNzAgMCA3NDY3MDAwCis4NjMzIDAgNzUwMDAwMAorMTA2NzMgMCA3NTMzMDAwCisxNDIwOCAwIDc1NjcwMDAKKzgwODQgMCA3NjAwMDAwCisxMzc4MyAwIDc2MzMwMDAKKzEwNjYwIDAgNzY2NzAwMAorNzQ2NiAwIDc3MDAwMDAKKzE0NDMzIDAgNzczMzAwMAorMTA5MzQgMCA3NzY3MDAwCis3MjM5IDAgNzgwMDAwMAorMTI1NDggMCA3ODMzMDAwCis2NTY0IDAgNzg2NzAwMAorMTA3NjEgMCA3OTAwMDAwCisxMDk5MiAwIDc5MzMwMDAKKzEyOTI0IDAgNzk2NzAwMAorMTIzNDggMCA4MDAwMDAwCis2NzcwIDAgODAzMzAwMAorMTQyODggMCA4MDY3MDAwCisyOTM0NSAxIDgxMDAwMDAKKzE4MjIgMCA4MTMzMDAwCisxMDg3IDAgODE2NzAwMAorMTEwOSAwIDgyMDAwMDAKKzIwMDcgMCA4MjMzMDAwCisxNzk4IDAgODI2NzAwMAorMTYzNSAwIDgzMDAwMDAKKzE5NjA3IDAgODMzMzAwMAorOTE5IDAgODM2NzAwMAorMjM1NyAwIDg0MDAwMDAKKzM1NzggMCA4NDMzMDAwCis0NDk3IDAgODQ2NzAwMAorNDMxNCAwIDg1MDAwMDAKKzM4NTEgMCA4NTMzMDAwCiszODIyIDAgODU2NzAwMAorNDI1MiAwIDg2MDAwMDAKKzQ3NzUgMCA4NjMzMDAwCisxMjIwMyAwIDg2NjcwMDAKKzUwNzggMCA4NzAwMDAwCis1ODc2IDAgODczMzAwMAorNjEyNCAwIDg3NjcwMDAKKzQ0OTAgMCA4ODAwMDAwCiszNTM4IDAgODgzMzAwMAorMzQ1MCAwIDg4NjcwMDAKKzM2MTEgMCA4OTAwMDAwCisyODQ3IDAgODkzMzAwMAorMjYwNSAwIDg5NjcwMDAKKzEyMjQzIDAgOTAwMDAwMAorMTk0NiAwIDkwMzMwMDAKKzE4NDcgMCA5MDY3MDAwCisyMDM1IDAgOTEwMDAwMAorMjU3MiAwIDkxMzMwMDAKKzIzMjYgMCA5MTY3MDAwCisyNjQ1IDAgOTIwMDAwMAorMjkzOCAwIDkyMzMwMDAKKzI0OTUgMCA5MjY3MDAwCisyNjA5IDAgOTMwMDAwMAorOTc0NCAwIDkzMzMwMDAKKzE3OTYgMCA5MzY3MDAwCisxOTg1IDAgOTQwMDAwMAorMTc1OSAwIDk0MzMwMDAKKzIyNTkgMCA5NDY3MDAwCisyMjMzIDAgOTUwMDAwMAorMjA0NCAwIDk1MzMwMDAKKzI1MDIgMCA5NTY3MDAwCisyMzA3IDAgOTYwMDAwMAorMjczOSAwIDk2MzMwMDAKKzExNzA3IDAgOTY2NzAwMAorNTE2OCAwIDk3MDAwMDAKKzQ0ODMgMCA5NzMzMDAwCiszMDQ0IDAgOTc2NzAwMAorNDI0MSAwIDk4MDAwMDAKKzQzOTIgMCA5ODMzMDAwCis0OTM0IDAgOTg2NzAwMAorNTkzNCAwIDk5MDAwMDAKKzU2NDcgMCA5OTMzMDAwCis1MzI2IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorNjkzOSAxIDAKKzY4MTggMCAxNzAwMAorMzEwIDAgMzMwMDAKKzI3MyAwIDUwMDAwCisyNjcgMCA2NzAwMAorMjM5IDAgODMwMDAKKzIzMiAwIDEwMDAwMAorMjIyIDAgMTE3MDAwCisxODYgMCAxMzMwMDAKKzE5NCAwIDE1MDAwMAorMTg5IDAgMTY3MDAwCisxOCAwIDE4MzAwMAorMjAxNCAwIDIwMDAwMAorMjk3IDAgMjE3MDAwCisyODcgMCAyMzMwMDAKKzIzNyAwIDI1MDAwMAorMjYzIDAgMjY3MDAwCisyMzggMCAyODMwMDAKKzI1NyAwIDMwMDAwMAorMjI5IDAgMzE3MDAwCisxODcgMCAzMzMwMDAKKzE5MSAwIDM1MDAwMAorMTggMCAzNjcwMDAKKzIyMDMgMCAzODMwMDAKKzI2NSAwIDQwMDAwMAorMjI0IDAgNDE3MDAwCisyNTQgMCA0MzMwMDAKKzI1MiAwIDQ1MDAwMAorMjczIDAgNDY3MDAwCisyMDggMCA0ODMwMDAKKzE1NCAwIDUwMDAwMAorMTgyIDAgNTE3MDAwCisxMzggMCA1MzMwMDAKKzE4IDAgNTUwMDAwCisyNTAyIDAgNTY3MDAwCisyODYgMCA1ODMwMDAKKzMwNCAwIDYwMDAwMAorMzQxIDAgNjE3MDAwCisyNTkgMCA2MzMwMDAKKzI3NSAwIDY1MDAwMAorMjIyIDAgNjY3MDAwCisyNTQgMCA2ODMwMDAKKzI1MyAwIDcwMDAwMAorMjI1IDAgNzE3MDAwCisxOCAwIDczMzAwMAorMjUwMSAwIDc1MDAwMAorMjgyIDAgNzY3MDAwCisyOTggMCA3ODMwMDAKKzI1MiAwIDgwMDAwMAorMjQyIDAgODE3MDAwCisyNTAgMCA4MzMwMDAKKzI2MCAwIDg1MDAwMAorMjE4IDAgODY3MDAwCisyMTMgMCA4ODMwMDAKKzE0NCAwIDkwMDAwMAorMTggMCA5MTcwMDAKKzIzMyAwIDkzMzAwMAorMjU0IDAgOTUwMDAwCisyMjkgMCA5NjcwMDAKKzIzOSAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOTY3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzU0OTE4IDEgMAorNDYyODAgMCAzMzAwMAorMjAwNiAwIDY3MDAwCisyODQxIDAgMTAwMDAwCiszMDQ0IDAgMTMzMDAwCiszNDI5IDAgMTY3MDAwCiszMTk2IDAgMjAwMDAwCisyOTI2IDAgMjMzMDAwCisyODIxIDAgMjY3MDAwCisxMTUwIDAgMzAwMDAwCiszNiAwIDMzMzAwMAorMzgwODQgMCAzNjcwMDAKKzM2ODkgMCA0MDAwMDAKKzM0NzMgMCA0MzMwMDAKKzMwMTEgMCA0NjcwMDAKKzMwOTAgMCA1MDAwMDAKKzI1MTYgMCA1MzMwMDAKKzI3NzEgMCA1NjcwMDAKKzMyNTAgMCA2MDAwMDAKKzExNTkgMCA2MzMwMDAKKzM0IDAgNjY3MDAwCiszOTY5MCAwIDcwMDAwMAorMzYxNSAwIDczMzAwMAorMjQ5NCAwIDc2NzAwMAorMjg5MyAwIDgwMDAwMAorMzMyOSAwIDgzMzAwMAorMjkzOSAwIDg2NzAwMAorMjM1MiAwIDkwMDAwMAorMjczMiAwIDkzMzAwMAorMTc0NiAwIDk2NzAwMAorMzMgMCAxMDAwMDAwCis0MTUwMSAwIDEwMzMwMDAKKzI5OTcgMCAxMDY3MDAwCisyNjY2IDAgMTEwMDAwMAorMzU4MiAwIDExMzMwMDAKKzI2MTYgMCAxMTY3MDAwCisyOTIzIDAgMTIwMDAwMAorMjY5NiAwIDEyMzMwMDAKKzE2MjggMCAxMjY3MDAwCisxODg3IDAgMTMwMDAwMAorMzMgMCAxMzMzMDAwCis0Mjg3NiAwIDEzNjcwMDAKKzI1ODggMCAxNDAwMDAwCiszMzE2IDAgMTQzMzAwMAorMjI4NyAwIDE0NjcwMDAKKzMzNzUgMCAxNTAwMDAwCisyMTA4IDAgMTUzMzAwMAorMjk2MSAwIDE1NjcwMDAKKzE3MzAgMCAxNjAwMDAwCisxODAwIDAgMTYzMzAwMAorMzQgMCAxNjY3MDAwCis0Mzc5NyAwIDE3MDAwMDAKKzI0ODQgMCAxNzMzMDAwCisyNTU2IDAgMTc2NzAwMAorMjY3MSAwIDE4MDAwMDAKKzIzMzggMCAxODMzMDAwCiszMTMzIDAgMTg2NzAwMAorMjAwMiAwIDE5MDAwMDAKKzE3OTQgMCAxOTMzMDAwCisxMjc5IDAgMTk2NzAwMAorMzIgMCAyMDAwMDAwCis0MjY0MiAwIDIwMzMwMDAKKzI2ODYgMCAyMDY3MDAwCisyMjAyIDAgMjEwMDAwMAorMjE0NSAwIDIxMzMwMDAKKzI1NjYgMCAyMTY3MDAwCisyMTkwIDAgMjIwMDAwMAorMTU4MCAwIDIyMzMwMDAKKzE3MTEgMCAyMjY3MDAwCis2NDggMCAyMzAwMDAwCiszMiAwIDIzMzMwMDAKKzQwNDA5IDAgMjM2NzAwMAorMjYyOCAwIDI0MDAwMDAKKzE5NzMgMCAyNDMzMDAwCisyMzYwIDAgMjQ2NzAwMAorMzA0MyAwIDI1MDAwMDAKKzE3MzAgMCAyNTMzMDAwCisxNDU2IDAgMjU2NzAwMAorMjMxMiAwIDI2MDAwMDAKKzM2OSAwIDI2MzMwMDAKKzMyIDAgMjY2NzAwMAorNDEzOTEgMCAyNzAwMDAwCisyOTY3IDAgMjczMzAwMAorMjQ1NCAwIDI3NjcwMDAKKzE4MjUgMCAyODAwMDAwCisxODUzIDAgMjgzMzAwMAorMTc0NiAwIDI4NjcwMDAKKzIzNDcgMCAyOTAwMDAwCisxMzYyIDAgMjkzMzAwMAorNDQxIDAgMjk2NzAwMAorMzQgMCAzMDAwMDAwCis0MjUwMyAwIDMwMzMwMDAKKzE4NzcgMCAzMDY3MDAwCisxNjkwIDAgMzEwMDAwMAorMTM2NyAwIDMxMzMwMDAKKzE1MjAgMCAzMTY3MDAwCisxMjQwIDAgMzIwMDAwMAorMTA5NCAwIDMyMzMwMDAKKzczOSAwIDMyNjcwMDAKKzM5MiAwIDMzMDAwMDAKKzMzIDAgMzMzMzAwMAorMzUxMDQgMCAzMzY3MDAwCisxNDYzIDAgMzQwMDAwMAorMjAyOSAwIDM0MzMwMDAKKzE2MjYgMCAzNDY3MDAwCisxOTU2IDAgMzUwMDAwMAorNzk5IDAgMzUzMzAwMAorNTU2IDAgMzU2NzAwMAorNTg0IDAgMzYwMDAwMAorMTkxIDAgMzYzMzAwMAorMzYgMCAzNjY3MDAwCiszNzY1MiAwIDM3MDAwMDAKKzg2MiAwIDM3MzMwMDAKKzUyNCAwIDM3NjcwMDAKKzY0MSAwIDM4MDAwMDAKKzU4NCAwIDM4MzMwMDAKKzM2MCAwIDM4NjcwMDAKKzM2NSAwIDM5MDAwMDAKKzM2MSAwIDM5MzMwMDAKKzE1NCAwIDM5NjcwMDAKKzM2IDAgNDAwMDAwMAorMTI1NzQwIDAgNDAzMzAwMAorMzMyIDAgNDA2NzAwMAorMzgxIDAgNDEwMDAwMAorNDIwIDAgNDEzMzAwMAorNDY0IDAgNDE2NzAwMAorMjg4IDAgNDIwMDAwMAorMjY2MCAwIDQyMzMwMDAKKzEyNzU2NCAxIDQyNjcwMDAKKzMwNjk2IDAgNDMwMDAwMAorMzQyMyAwIDQzMzMwMDAKKzMzMTAgMCA0MzY3MDAwCiszNTEzIDAgNDQwMDAwMAorMzczNSAwIDQ0MzMwMDAKKzMzNTggMCA0NDY3MDAwCiszMTA4IDAgNDUwMDAwMAorMjgwMCAwIDQ1MzMwMDAKKzE3NTEgMCA0NTY3MDAwCis0MSAwIDQ2MDAwMDAKKzM5ODYyIDAgNDYzMzAwMAorMzczOSAwIDQ2NjcwMDAKKzM3NTUgMCA0NzAwMDAwCiszNDA4IDAgNDczMzAwMAorMzc4MyAwIDQ3NjcwMDAKKzM0MjMgMCA0ODAwMDAwCisyODAxIDAgNDgzMzAwMAorMjU0OSAwIDQ4NjcwMDAKKzE0NjEgMCA0OTAwMDAwCis0MCAwIDQ5MzMwMDAKKzQxNjY3IDAgNDk2NzAwMAorMzYyMyAwIDUwMDAwMDAKKzMzNTYgMCA1MDMzMDAwCiszNDI0IDAgNTA2NzAwMAorMzU0OCAwIDUxMDAwMDAKKzMxMTkgMCA1MTMzMDAwCisyOTA1IDAgNTE2NzAwMAorMjc3MiAwIDUyMDAwMDAKKzE2MjMgMCA1MjMzMDAwCis0MyAwIDUyNjcwMDAKKzQ2NzgzIDAgNTMwMDAwMAorMzQ2MiAwIDUzMzMwMDAKKzM0NzAgMCA1MzY3MDAwCiszNjc3IDAgNTQwMDAwMAorMzY4NCAwIDU0MzMwMDAKKzMyNjYgMCA1NDY3MDAwCiszMTI3IDAgNTUwMDAwMAorMjgwOSAwIDU1MzMwMDAKKzE3NTAgMCA1NTY3MDAwCis0MCAwIDU2MDAwMDAKKzQ2MjE1IDAgNTYzMzAwMAorMzU5OSAwIDU2NjcwMDAKKzM1NTggMCA1NzAwMDAwCiszNTQ0IDAgNTczMzAwMAorMzYzMiAwIDU3NjcwMDAKKzM1NDggMCA1ODAwMDAwCisyOTY4IDAgNTgzMzAwMAorMjcxNSAwIDU4NjcwMDAKKzE3MjkgMCA1OTAwMDAwCis0MSAwIDU5MzMwMDAKKzQ1OTU4IDAgNTk2NzAwMAorMzc3NiAwIDYwMDAwMDAKKzM1MjUgMCA2MDMzMDAwCiszNjQ0IDAgNjA2NzAwMAorMzc4NiAwIDYxMDAwMDAKKzMyMjIgMCA2MTMzMDAwCisyOTIzIDAgNjE2NzAwMAorMjc1MiAwIDYyMDAwMDAKKzE1OTIgMCA2MjMzMDAwCis0MSAwIDYyNjcwMDAKKzQ2MDMxIDAgNjMwMDAwMAorMzUyMCAwIDYzMzMwMDAKKzMzODAgMCA2MzY3MDAwCiszMzcxIDAgNjQwMDAwMAorMzQyNyAwIDY0MzMwMDAKKzMxMzUgMCA2NDY3MDAwCisyOTg4IDAgNjUwMDAwMAorMjczMCAwIDY1MzMwMDAKKzE2NzEgMCA2NTY3MDAwCis0MSAwIDY2MDAwMDAKKzQ1ODQ2IDAgNjYzMzAwMAorMzUzNSAwIDY2NjcwMDAKKzM1MDcgMCA2NzAwMDAwCiszNDI5IDAgNjczMzAwMAorMzQ5MSAwIDY3NjcwMDAKKzMzMjUgMCA2ODAwMDAwCisyOTc5IDAgNjgzMzAwMAorMjgwMCAwIDY4NjcwMDAKKzE2MTAgMCA2OTAwMDAwCis0MCAwIDY5MzMwMDAKKzQ1OTU4IDAgNjk2NzAwMAorMzc2MiAwIDcwMDAwMDAKKzMyNTQgMCA3MDMzMDAwCiszNDA4IDAgNzA2NzAwMAorMzg2MCAwIDcxMDAwMDAKKzMxOTggMCA3MTMzMDAwCisyOTY2IDAgNzE2NzAwMAorMjg4MiAwIDcyMDAwMDAKKzE3NjMgMCA3MjMzMDAwCis0MiAwIDcyNjcwMDAKKzQ2MTMwIDAgNzMwMDAwMAorMzU5MyAwIDczMzMwMDAKKzM1MjMgMCA3MzY3MDAwCiszOTM5IDAgNzQwMDAwMAorMzk4MCAwIDc0MzMwMDAKKzM0NzAgMCA3NDY3MDAwCiszMTkxIDAgNzUwMDAwMAorMjk2OSAwIDc1MzMwMDAKKzE3NDAgMCA3NTY3MDAwCis0MSAwIDc2MDAwMDAKKzQ2MzAwIDAgNzYzMzAwMAorMzczOSAwIDc2NjcwMDAKKzM3ODEgMCA3NzAwMDAwCiszOTY0IDAgNzczMzAwMAorNDAyMyAwIDc3NjcwMDAKKzM0ODAgMCA3ODAwMDAwCiszMDY1IDAgNzgzMzAwMAorMjkzNCAwIDc4NjcwMDAKKzE4MDUgMCA3OTAwMDAwCis0MiAwIDc5MzMwMDAKKzM4MTY2IDAgNzk2NzAwMAorNDA2MiAwIDgwMDAwMDAKKzM4NDQgMCA4MDMzMDAwCis0NTQ3IDAgODA2NzAwMAorOTM0IDAgODEwMDAwMAorMzY1IDAgODEzMzAwMAorMTgxIDAgODE2NzAwMAorNDYzIDAgODIwMDAwMAorNDE5IDAgODIzMzAwMAorMzggMCA4MjY3MDAwCis5NzAyIDAgODMwMDAwMAorMzQ0IDAgODMzMzAwMAorMjc2IDAgODM2NzAwMAorMTM1MCAwIDg0MDAwMDAKKzE3MDMgMCA4NDMzMDAwCisxODQzIDAgODQ2NzAwMAorMTIyOCAwIDg1MDAwMDAKKzM1NTgwIDEgODUzMzAwMAorMjc0NTggMCA4NTY3MDAwCisyMTQ0IDAgODYwMDAwMAorMjQ4MiAwIDg2MzMwMDAKKzIwMDQgMCA4NjY3MDAwCisyODIyIDAgODcwMDAwMAorMjU3MCAwIDg3MzMwMDAKKzE3MjYgMCA4NzY3MDAwCisxMjQ4IDAgODgwMDAwMAorODQ0IDAgODgzMzAwMAorMzUgMCA4ODY3MDAwCisxNDIwNyAwIDg5MDAwMDAKKzEwMzcgMCA4OTMzMDAwCis3NDkgMCA4OTY3MDAwCis4MjkgMCA5MDAwMDAwCis5MTUgMCA5MDMzMDAwCis2ODUgMCA5MDY3MDAwCis3NjcgMCA5MTAwMDAwCis3OTggMCA5MTMzMDAwCiszNDIgMCA5MTY3MDAwCiszMSAwIDkyMDAwMDAKKzEyNTkwIDAgOTIzMzAwMAorOTIzIDAgOTI2NzAwMAorODE5IDAgOTMwMDAwMAorNzc2IDAgOTMzMzAwMAorODYzIDAgOTM2NzAwMAorNzI5IDAgOTQwMDAwMAorNDcxIDAgOTQzMzAwMAorNjM4IDAgOTQ2NzAwMAorMjc2IDAgOTUwMDAwMAorMzggMCA5NTMzMDAwCisxNzI3MiAwIDk1NjcwMDAKKzg1NiAwIDk2MDAwMDAKKzExNTggMCA5NjMzMDAwCisyMTcyIDAgOTY2NzAwMAorMjc1MSAwIDk3MDAwMDAKKzIxNDIgMCA5NzMzMDAwCisxMjY3IDAgOTc2NzAwMAorMTk2NSAwIDk4MDAwMDAKKzE1MTAgMCA5ODMzMDAwCiszNCAwIDk4NjcwMDAKKzI2OTIgMCA5OTAwMDAwCisyNzc4IDAgOTkzMzAwMAorMjU4NSAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUyMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFmMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCkBAIC0wLDAgKzEsODMzIEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzMyIDEgNDAwMDAKKzMyIDEgNjAwMDAKKzMyIDEgODAwMDAKKzMyIDEgMTAwMDAwCiszMiAxIDEyMDAwMAorMzIgMSAxNDAwMDAKKzMyIDEgMTYwMDAwCiszMiAxIDE4MDAwMAorMzIgMSAyMDAwMDAKKzMyIDEgMjIwMDAwCiszMiAxIDI0MDAwMAorMzIgMSAyNjAwMDAKKzMyIDEgMjgwMDAwCiszMiAxIDMwMDAwMAorMzIgMSAzMjAwMDAKKzMyIDEgMzQwMDAwCiszMiAxIDM2MDAwMAorMzIgMSAzODAwMDAKKzMyIDEgNDAwMDAwCiszMiAxIDQyMDAwMAorMzIgMSA0NDAwMDAKKzMyIDEgNDYwMDAwCiszMiAxIDQ4MDAwMAorMzIgMSA1MDAwMDAKKzMyIDEgNTIwMDAwCiszMiAxIDU0MDAwMAorMzIgMSA1NjAwMDAKKzMyIDEgNTgwMDAwCiszMiAxIDYwMDAwMAorMzIgMSA2MjAwMDAKKzMyIDEgNjQwMDAwCiszMiAxIDY2MDAwMAorMzIgMSA2ODAwMDAKKzMyIDEgNzAwMDAwCiszMiAxIDcyMDAwMAorMzIgMSA3NDAwMDAKKzMyIDEgNzYwMDAwCiszMiAxIDc4MDAwMAorMzIgMSA4MDAwMDAKKzMyIDEgODIwMDAwCiszMiAxIDg0MDAwMAorMzIgMSA4NjAwMDAKKzMyIDEgODgwMDAwCiszMiAxIDkwMDAwMAorMzIgMSA5MjAwMDAKKzMyIDEgOTQwMDAwCiszMiAxIDk2MDAwMAorMzIgMSA5ODAwMDAKKzMyIDEgMTAwMDAwMAorMzIgMSAxMDIwMDAwCiszMiAxIDEwNDAwMDAKKzMyIDEgMTA2MDAwMAorMzIgMSAxMDgwMDAwCiszMiAxIDExMDAwMDAKKzMyIDEgMTEyMDAwMAorMzIgMSAxMTQwMDAwCiszMiAxIDExNjAwMDAKKzMyIDEgMTE4MDAwMAorMzIgMSAxMjAwMDAwCiszMiAxIDEyMjAwMDAKKzMyIDEgMTI0MDAwMAorMzIgMSAxMjYwMDAwCiszMiAxIDEyODAwMDAKKzMyIDEgMTMwMDAwMAorMzIgMSAxMzIwMDAwCiszMiAxIDEzNDAwMDAKKzMyIDEgMTM2MDAwMAorMzIgMSAxMzgwMDAwCiszMiAxIDE0MDAwMDAKKzMyIDEgMTQyMDAwMAorMzIgMSAxNDQwMDAwCiszMiAxIDE0NjAwMDAKKzMyIDEgMTQ4MDAwMAorMzIgMSAxNTAwMDAwCiszMiAxIDE1MjAwMDAKKzMyIDEgMTU0MDAwMAorMzIgMSAxNTYwMDAwCiszMiAxIDE1ODAwMDAKKzMyIDEgMTYwMDAwMAorMzIgMSAxNjIwMDAwCiszMiAxIDE2NDAwMDAKKzMyIDEgMTY2MDAwMAorMzIgMSAxNjgwMDAwCiszMiAxIDE3MDAwMDAKKzMyIDEgMTcyMDAwMAorMzIgMSAxNzQwMDAwCiszMiAxIDE3NjAwMDAKKzMyIDEgMTc4MDAwMAorMzIgMSAxODAwMDAwCiszMiAxIDE4MjAwMDAKKzMyIDEgMTg0MDAwMAorMzIgMSAxODYwMDAwCiszMiAxIDE4ODAwMDAKKzMyIDEgMTkwMDAwMAorMzIgMSAxOTIwMDAwCiszMiAxIDE5NDAwMDAKKzMyIDEgMTk2MDAwMAorMzIgMSAxOTgwMDAwCiszMiAxIDIwMDAwMDAKKzMyIDEgMjAyMDAwMAorMzIgMSAyMDQwMDAwCiszMiAxIDIwNjAwMDAKKzMyIDEgMjA4MDAwMAorMzIgMSAyMTAwMDAwCiszMiAxIDIxMjAwMDAKKzMyIDEgMjE0MDAwMAorMzIgMSAyMTYwMDAwCiszMiAxIDIxODAwMDAKKzMyIDEgMjIwMDAwMAorMzIgMSAyMjIwMDAwCiszMiAxIDIyNDAwMDAKKzMyIDEgMjI2MDAwMAorMzIgMSAyMjgwMDAwCiszMiAxIDIzMDAwMDAKKzMyIDEgMjMyMDAwMAorMzIgMSAyMzQwMDAwCiszMiAxIDIzNjAwMDAKKzMyIDEgMjM4MDAwMAorMzIgMSAyNDAwMDAwCiszMiAxIDI0MjAwMDAKKzMyIDEgMjQ0MDAwMAorMzIgMSAyNDYwMDAwCiszMiAxIDI0ODAwMDAKKzMyIDEgMjUwMDAwMAorMzIgMSAyNTIwMDAwCiszMiAxIDI1NDAwMDAKKzMyIDEgMjU2MDAwMAorMzIgMSAyNTgwMDAwCiszMiAxIDI2MDAwMDAKKzMyIDEgMjYyMDAwMAorMzIgMSAyNjQwMDAwCiszMiAxIDI2NjAwMDAKKzMyIDEgMjY4MDAwMAorMzIgMSAyNzAwMDAwCiszMiAxIDI3MjAwMDAKKzMyIDEgMjc0MDAwMAorMzIgMSAyNzYwMDAwCiszMiAxIDI3ODAwMDAKKzMyIDEgMjgwMDAwMAorMzIgMSAyODIwMDAwCiszMiAxIDI4NDAwMDAKKzMyIDEgMjg2MDAwMAorMzIgMSAyODgwMDAwCiszMiAxIDI5MDAwMDAKKzMyIDEgMjkyMDAwMAorMzIgMSAyOTQwMDAwCiszMiAxIDI5NjAwMDAKKzMyIDEgMjk4MDAwMAorMzIgMSAzMDAwMDAwCiszMiAxIDMwMjAwMDAKKzMyIDEgMzA0MDAwMAorMzIgMSAzMDYwMDAwCiszMiAxIDMwODAwMDAKKzMyIDEgMzEwMDAwMAorMzIgMSAzMTIwMDAwCiszMiAxIDMxNDAwMDAKKzMyIDEgMzE2MDAwMAorMzIgMSAzMTgwMDAwCiszMiAxIDMyMDAwMDAKKzMyIDEgMzIyMDAwMAorMzIgMSAzMjQwMDAwCiszMiAxIDMyNjAwMDAKKzMyIDEgMzI4MDAwMAorMzIgMSAzMzAwMDAwCiszMiAxIDMzMjAwMDAKKzMyIDEgMzM0MDAwMAorMzIgMSAzMzYwMDAwCiszMiAxIDMzODAwMDAKKzMyIDEgMzQwMDAwMAorMzIgMSAzNDIwMDAwCiszMiAxIDM0NDAwMDAKKzMyIDEgMzQ2MDAwMAorMzIgMSAzNDgwMDAwCiszMiAxIDM1MDAwMDAKKzMyIDEgMzUyMDAwMAorMzIgMSAzNTQwMDAwCiszMiAxIDM1NjAwMDAKKzMyIDEgMzU4MDAwMAorMzIgMSAzNjAwMDAwCiszMiAxIDM2MjAwMDAKKzMyIDEgMzY0MDAwMAorMzIgMSAzNjYwMDAwCiszMiAxIDM2ODAwMDAKKzMyIDEgMzcwMDAwMAorMzIgMSAzNzIwMDAwCiszMiAxIDM3NDAwMDAKKzMyIDEgMzc2MDAwMAorMzIgMSAzNzgwMDAwCiszMiAxIDM4MDAwMDAKKzMyIDEgMzgyMDAwMAorMzIgMSAzODQwMDAwCiszMiAxIDM4NjAwMDAKKzMyIDEgMzg4MDAwMAorMzIgMSAzOTAwMDAwCiszMiAxIDM5MjAwMDAKKzMyIDEgMzk0MDAwMAorMzIgMSAzOTYwMDAwCiszMiAxIDM5ODAwMDAKKzMyIDEgNDAwMDAwMAorMzIgMSA0MDIwMDAwCiszMiAxIDQwNDAwMDAKKzMyIDEgNDA2MDAwMAorMzIgMSA0MDgwMDAwCiszMiAxIDQxMDAwMDAKKzMyIDEgNDEyMDAwMAorMzIgMSA0MTQwMDAwCiszMiAxIDQxNjAwMDAKKzMyIDEgNDE4MDAwMAorMzIgMSA0MjAwMDAwCiszMiAxIDQyMjAwMDAKKzMyIDEgNDI0MDAwMAorMzIgMSA0MjYwMDAwCiszMiAxIDQyODAwMDAKKzMyIDEgNDMwMDAwMAorMzIgMSA0MzIwMDAwCiszMiAxIDQzNDAwMDAKKzMyIDEgNDM2MDAwMAorMzIgMSA0MzgwMDAwCiszMiAxIDQ0MDAwMDAKKzMyIDEgNDQyMDAwMAorMzIgMSA0NDQwMDAwCiszMiAxIDQ0NjAwMDAKKzMyIDEgNDQ4MDAwMAorMzIgMSA0NTAwMDAwCiszMiAxIDQ1MjAwMDAKKzMyIDEgNDU0MDAwMAorMzIgMSA0NTYwMDAwCiszMiAxIDQ1ODAwMDAKKzMyIDEgNDYwMDAwMAorMzIgMSA0NjIwMDAwCiszMiAxIDQ2NDAwMDAKKzMyIDEgNDY2MDAwMAorMzIgMSA0NjgwMDAwCiszMiAxIDQ3MDAwMDAKKzMyIDEgNDcyMDAwMAorMzIgMSA0NzQwMDAwCiszMiAxIDQ3NjAwMDAKKzMyIDEgNDc4MDAwMAorMzIgMSA0ODAwMDAwCiszMiAxIDQ4MjAwMDAKKzMyIDEgNDg0MDAwMAorMzIgMSA0ODYwMDAwCiszMiAxIDQ4ODAwMDAKKzMyIDEgNDkwMDAwMAorMzIgMSA0OTIwMDAwCiszMiAxIDQ5NDAwMDAKKzMyIDEgNDk2MDAwMAorMzIgMSA0OTgwMDAwCiszMiAxIDUwMDAwMDAKKzMyIDEgNTAyMDAwMAorMzIgMSA1MDQwMDAwCiszMiAxIDUwNjAwMDAKKzMyIDEgNTA4MDAwMAorMzIgMSA1MTAwMDAwCiszMiAxIDUxMjAwMDAKKzMyIDEgNTE0MDAwMAorMzIgMSA1MTYwMDAwCiszMiAxIDUxODAwMDAKKzMyIDEgNTIwMDAwMAorMzIgMSA1MjIwMDAwCiszMiAxIDUyNDAwMDAKKzMyIDEgNTI2MDAwMAorMzIgMSA1MjgwMDAwCiszMiAxIDUzMDAwMDAKKzMyIDEgNTMyMDAwMAorMzIgMSA1MzQwMDAwCiszMiAxIDUzNjAwMDAKKzMyIDEgNTM4MDAwMAorMzIgMSA1NDAwMDAwCiszMiAxIDU0MjAwMDAKKzMyIDEgNTQ0MDAwMAorMzIgMSA1NDYwMDAwCiszMiAxIDU0ODAwMDAKKzMyIDEgNTUwMDAwMAorMzIgMSA1NTIwMDAwCiszMiAxIDU1NDAwMDAKKzMyIDEgNTU2MDAwMAorMzIgMSA1NTgwMDAwCiszMiAxIDU2MDAwMDAKKzMyIDEgNTYyMDAwMAorMzIgMSA1NjQwMDAwCiszMiAxIDU2NjAwMDAKKzMyIDEgNTY4MDAwMAorMzIgMSA1NzAwMDAwCiszMiAxIDU3MjAwMDAKKzMyIDEgNTc0MDAwMAorMzIgMSA1NzYwMDAwCiszMiAxIDU3ODAwMDAKKzMyIDEgNTgwMDAwMAorMzIgMSA1ODIwMDAwCiszMiAxIDU4NDAwMDAKKzMyIDEgNTg2MDAwMAorMzIgMSA1ODgwMDAwCiszMiAxIDU5MDAwMDAKKzMyIDEgNTkyMDAwMAorMzIgMSA1OTQwMDAwCiszMiAxIDU5NjAwMDAKKzMyIDEgNTk4MDAwMAorMzIgMSA2MDAwMDAwCiszMiAxIDYwMjAwMDAKKzMyIDEgNjA0MDAwMAorMzIgMSA2MDYwMDAwCiszMiAxIDYwODAwMDAKKzMyIDEgNjEwMDAwMAorMzIgMSA2MTIwMDAwCiszMiAxIDYxNDAwMDAKKzMyIDEgNjE2MDAwMAorMzIgMSA2MTgwMDAwCiszMiAxIDYyMDAwMDAKKzMyIDEgNjIyMDAwMAorMzIgMSA2MjQwMDAwCiszMiAxIDYyNjAwMDAKKzMyIDEgNjI4MDAwMAorMzIgMSA2MzAwMDAwCiszMiAxIDYzMjAwMDAKKzMyIDEgNjM0MDAwMAorMzIgMSA2MzYwMDAwCiszMiAxIDYzODAwMDAKKzMyIDEgNjQwMDAwMAorMzIgMSA2NDIwMDAwCiszMiAxIDY0NDAwMDAKKzMyIDEgNjQ2MDAwMAorMzIgMSA2NDgwMDAwCiszMiAxIDY1MDAwMDAKKzMyIDEgNjUyMDAwMAorMzIgMSA2NTQwMDAwCiszMiAxIDY1NjAwMDAKKzMyIDEgNjU4MDAwMAorMzIgMSA2NjAwMDAwCiszMiAxIDY2MjAwMDAKKzMyIDEgNjY0MDAwMAorMzIgMSA2NjYwMDAwCiszMiAxIDY2ODAwMDAKKzMyIDEgNjcwMDAwMAorMzIgMSA2NzIwMDAwCiszMiAxIDY3NDAwMDAKKzMyIDEgNjc2MDAwMAorMzIgMSA2NzgwMDAwCiszMiAxIDY4MDAwMDAKKzMyIDEgNjgyMDAwMAorMzIgMSA2ODQwMDAwCiszMiAxIDY4NjAwMDAKKzMyIDEgNjg4MDAwMAorMzIgMSA2OTAwMDAwCiszMiAxIDY5MjAwMDAKKzMyIDEgNjk0MDAwMAorMzIgMSA2OTYwMDAwCiszMiAxIDY5ODAwMDAKKzMyIDEgNzAwMDAwMAorMzIgMSA3MDIwMDAwCiszMiAxIDcwNDAwMDAKKzMyIDEgNzA2MDAwMAorMzIgMSA3MDgwMDAwCiszMiAxIDcxMDAwMDAKKzMyIDEgNzEyMDAwMAorMzIgMSA3MTQwMDAwCiszMiAxIDcxNjAwMDAKKzMyIDEgNzE4MDAwMAorMzIgMSA3MjAwMDAwCiszMiAxIDcyMjAwMDAKKzMyIDEgNzI0MDAwMAorMzIgMSA3MjYwMDAwCiszMiAxIDcyODAwMDAKKzMyIDEgNzMwMDAwMAorMzIgMSA3MzIwMDAwCiszMiAxIDczNDAwMDAKKzMyIDEgNzM2MDAwMAorMzIgMSA3MzgwMDAwCiszMiAxIDc0MDAwMDAKKzMyIDEgNzQyMDAwMAorMzIgMSA3NDQwMDAwCiszMiAxIDc0NjAwMDAKKzMyIDEgNzQ4MDAwMAorMzIgMSA3NTAwMDAwCiszMiAxIDc1MjAwMDAKKzMyIDEgNzU0MDAwMAorMzIgMSA3NTYwMDAwCiszMiAxIDc1ODAwMDAKKzMyIDEgNzYwMDAwMAorMzIgMSA3NjIwMDAwCiszMiAxIDc2NDAwMDAKKzMyIDEgNzY2MDAwMAorMzIgMSA3NjgwMDAwCiszMiAxIDc3MDAwMDAKKzMyIDEgNzcyMDAwMAorMzIgMSA3NzQwMDAwCiszMiAxIDc3NjAwMDAKKzMyIDEgNzc4MDAwMAorMzIgMSA3ODAwMDAwCiszMiAxIDc4MjAwMDAKKzMyIDEgNzg0MDAwMAorMzIgMSA3ODYwMDAwCiszMiAxIDc4ODAwMDAKKzMyIDEgNzkwMDAwMAorMzIgMSA3OTIwMDAwCiszMiAxIDc5NDAwMDAKKzMyIDEgNzk2MDAwMAorMzIgMSA3OTgwMDAwCiszMiAxIDgwMDAwMDAKKzMyIDEgODAyMDAwMAorMzIgMSA4MDQwMDAwCiszMiAxIDgwNjAwMDAKKzMyIDEgODA4MDAwMAorMzIgMSA4MTAwMDAwCiszMiAxIDgxMjAwMDAKKzMyIDEgODE0MDAwMAorMzIgMSA4MTYwMDAwCiszMiAxIDgxODAwMDAKKzMyIDEgODIwMDAwMAorMzIgMSA4MjIwMDAwCiszMiAxIDgyNDAwMDAKKzMyIDEgODI2MDAwMAorMzIgMSA4MjgwMDAwCiszMiAxIDgzMDAwMDAKKzMyIDEgODMyMDAwMAorMzIgMSA4MzQwMDAwCiszMiAxIDgzNjAwMDAKKzMyIDEgODM4MDAwMAorMzIgMSA4NDAwMDAwCiszMiAxIDg0MjAwMDAKKzMyIDEgODQ0MDAwMAorMzIgMSA4NDYwMDAwCiszMiAxIDg0ODAwMDAKKzMyIDEgODUwMDAwMAorMzIgMSA4NTIwMDAwCiszMiAxIDg1NDAwMDAKKzMyIDEgODU2MDAwMAorMzIgMSA4NTgwMDAwCiszMiAxIDg2MDAwMDAKKzMyIDEgODYyMDAwMAorMzIgMSA4NjQwMDAwCiszMiAxIDg2NjAwMDAKKzMyIDEgODY4MDAwMAorMzIgMSA4NzAwMDAwCiszMiAxIDg3MjAwMDAKKzMyIDEgODc0MDAwMAorMzIgMSA4NzYwMDAwCiszMiAxIDg3ODAwMDAKKzMyIDEgODgwMDAwMAorMzIgMSA4ODIwMDAwCiszMiAxIDg4NDAwMDAKKzMyIDEgODg2MDAwMAorMzIgMSA4ODgwMDAwCiszMiAxIDg5MDAwMDAKKzMyIDEgODkyMDAwMAorMzIgMSA4OTQwMDAwCiszMiAxIDg5NjAwMDAKKzMyIDEgODk4MDAwMAorMzIgMSA5MDAwMDAwCiszMiAxIDkwMjAwMDAKKzMyIDEgOTA0MDAwMAorMzIgMSA5MDYwMDAwCiszMiAxIDkwODAwMDAKKzMyIDEgOTEwMDAwMAorMzIgMSA5MTIwMDAwCiszMiAxIDkxNDAwMDAKKzMyIDEgOTE2MDAwMAorMzIgMSA5MTgwMDAwCiszMiAxIDkyMDAwMDAKKzMyIDEgOTIyMDAwMAorMzIgMSA5MjQwMDAwCiszMiAxIDkyNjAwMDAKKzMyIDEgOTI4MDAwMAorMzIgMSA5MzAwMDAwCiszMiAxIDkzMjAwMDAKKzMyIDEgOTM0MDAwMAorMzIgMSA5MzYwMDAwCiszMiAxIDkzODAwMDAKKzMyIDEgOTQwMDAwMAorMzIgMSA5NDIwMDAwCiszMiAxIDk0NDAwMDAKKzMyIDEgOTQ2MDAwMAorMzIgMSA5NDgwMDAwCiszMiAxIDk1MDAwMDAKKzMyIDEgOTUyMDAwMAorMzIgMSA5NTQwMDAwCiszMiAxIDk1NjAwMDAKKzMyIDEgOTU4MDAwMAorMzIgMSA5NjAwMDAwCiszMiAxIDk2MjAwMDAKKzMyIDEgOTY0MDAwMAorMzIgMSA5NjYwMDAwCiszMiAxIDk2ODAwMDAKKzMyIDEgOTcwMDAwMAorMzIgMSA5NzIwMDAwCiszMiAxIDk3NDAwMDAKKzMyIDEgOTc2MDAwMAorMzIgMSA5NzgwMDAwCiszMiAxIDk4MDAwMDAKKzMyIDEgOTgyMDAwMAorMzIgMSA5ODQwMDAwCiszMiAxIDk4NjAwMDAKKzMyIDEgOTg4MDAwMAorMzIgMSA5OTAwMDAwCiszMiAxIDk5MjAwMDAKKzMyIDEgOTk0MDAwMAorMzIgMSA5OTYwMDAwCiszMiAxIDk5ODAwMDAKKzMyIDEgMTAwMDAwMDAKKzMyIDEgMTAwMjAwMDAKKzMyIDEgMTAwNDAwMDAKKzMyIDEgMTAwNjAwMDAKKzMyIDEgMTAwODAwMDAKKzMyIDEgMTAxMDAwMDAKKzMyIDEgMTAxMjAwMDAKKzMyIDEgMTAxNDAwMDAKKzMyIDEgMTAxNjAwMDAKKzMyIDEgMTAxODAwMDAKKzMyIDEgMTAyMDAwMDAKKzMyIDEgMTAyMjAwMDAKKzMyIDEgMTAyNDAwMDAKKzMyIDEgMTAyNjAwMDAKKzMyIDEgMTAyODAwMDAKKzMyIDEgMTAzMDAwMDAKKzMyIDEgMTAzMjAwMDAKKzMyIDEgMTAzNDAwMDAKKzMyIDEgMTAzNjAwMDAKKzMyIDEgMTAzODAwMDAKKzMyIDEgMTA0MDAwMDAKKzMyIDEgMTA0MjAwMDAKKzMyIDEgMTA0NDAwMDAKKzMyIDEgMTA0NjAwMDAKKzMyIDEgMTA0ODAwMDAKKzMyIDEgMTA1MDAwMDAKKzMyIDEgMTA1MjAwMDAKKzMyIDEgMTA1NDAwMDAKKzMyIDEgMTA1NjAwMDAKKzMyIDEgMTA1ODAwMDAKKzMyIDEgMTA2MDAwMDAKKzMyIDEgMTA2MjAwMDAKKzMyIDEgMTA2NDAwMDAKKzMyIDEgMTA2NjAwMDAKKzMyIDEgMTA2ODAwMDAKKzMyIDEgMTA3MDAwMDAKKzMyIDEgMTA3MjAwMDAKKzMyIDEgMTA3NDAwMDAKKzMyIDEgMTA3NjAwMDAKKzMyIDEgMTA3ODAwMDAKKzMyIDEgMTA4MDAwMDAKKzMyIDEgMTA4MjAwMDAKKzMyIDEgMTA4NDAwMDAKKzMyIDEgMTA4NjAwMDAKKzMyIDEgMTA4ODAwMDAKKzMyIDEgMTA5MDAwMDAKKzMyIDEgMTA5MjAwMDAKKzMyIDEgMTA5NDAwMDAKKzMyIDEgMTA5NjAwMDAKKzMyIDEgMTA5ODAwMDAKKzMyIDEgMTEwMDAwMDAKKzMyIDEgMTEwMjAwMDAKKzMyIDEgMTEwNDAwMDAKKzMyIDEgMTEwNjAwMDAKKzMyIDEgMTEwODAwMDAKKzMyIDEgMTExMDAwMDAKKzMyIDEgMTExMjAwMDAKKzMyIDEgMTExNDAwMDAKKzMyIDEgMTExNjAwMDAKKzMyIDEgMTExODAwMDAKKzMyIDEgMTEyMDAwMDAKKzMyIDEgMTEyMjAwMDAKKzMyIDEgMTEyNDAwMDAKKzMyIDEgMTEyNjAwMDAKKzMyIDEgMTEyODAwMDAKKzMyIDEgMTEzMDAwMDAKKzMyIDEgMTEzMjAwMDAKKzMyIDEgMTEzNDAwMDAKKzMyIDEgMTEzNjAwMDAKKzMyIDEgMTEzODAwMDAKKzMyIDEgMTE0MDAwMDAKKzMyIDEgMTE0MjAwMDAKKzMyIDEgMTE0NDAwMDAKKzMyIDEgMTE0NjAwMDAKKzMyIDEgMTE0ODAwMDAKKzMyIDEgMTE1MDAwMDAKKzMyIDEgMTE1MjAwMDAKKzMyIDEgMTE1NDAwMDAKKzMyIDEgMTE1NjAwMDAKKzMyIDEgMTE1ODAwMDAKKzMyIDEgMTE2MDAwMDAKKzMyIDEgMTE2MjAwMDAKKzMyIDEgMTE2NDAwMDAKKzMyIDEgMTE2NjAwMDAKKzMyIDEgMTE2ODAwMDAKKzMyIDEgMTE3MDAwMDAKKzMyIDEgMTE3MjAwMDAKKzMyIDEgMTE3NDAwMDAKKzMyIDEgMTE3NjAwMDAKKzMyIDEgMTE3ODAwMDAKKzMyIDEgMTE4MDAwMDAKKzMyIDEgMTE4MjAwMDAKKzMyIDEgMTE4NDAwMDAKKzMyIDEgMTE4NjAwMDAKKzMyIDEgMTE4ODAwMDAKKzMyIDEgMTE5MDAwMDAKKzMyIDEgMTE5MjAwMDAKKzMyIDEgMTE5NDAwMDAKKzMyIDEgMTE5NjAwMDAKKzMyIDEgMTE5ODAwMDAKKzMyIDEgMTIwMDAwMDAKKzMyIDEgMTIwMjAwMDAKKzMyIDEgMTIwNDAwMDAKKzMyIDEgMTIwNjAwMDAKKzMyIDEgMTIwODAwMDAKKzMyIDEgMTIxMDAwMDAKKzMyIDEgMTIxMjAwMDAKKzMyIDEgMTIxNDAwMDAKKzMyIDEgMTIxNjAwMDAKKzMyIDEgMTIxODAwMDAKKzMyIDEgMTIyMDAwMDAKKzMyIDEgMTIyMjAwMDAKKzMyIDEgMTIyNDAwMDAKKzMyIDEgMTIyNjAwMDAKKzMyIDEgMTIyODAwMDAKKzMyIDEgMTIzMDAwMDAKKzMyIDEgMTIzMjAwMDAKKzMyIDEgMTIzNDAwMDAKKzMyIDEgMTIzNjAwMDAKKzMyIDEgMTIzODAwMDAKKzMyIDEgMTI0MDAwMDAKKzMyIDEgMTI0MjAwMDAKKzMyIDEgMTI0NDAwMDAKKzMyIDEgMTI0NjAwMDAKKzMyIDEgMTI0ODAwMDAKKzMyIDEgMTI1MDAwMDAKKzMyIDEgMTI1MjAwMDAKKzMyIDEgMTI1NDAwMDAKKzMyIDEgMTI1NjAwMDAKKzMyIDEgMTI1ODAwMDAKKzMyIDEgMTI2MDAwMDAKKzMyIDEgMTI2MjAwMDAKKzMyIDEgMTI2NDAwMDAKKzMyIDEgMTI2NjAwMDAKKzMyIDEgMTI2ODAwMDAKKzMyIDEgMTI3MDAwMDAKKzMyIDEgMTI3MjAwMDAKKzMyIDEgMTI3NDAwMDAKKzMyIDEgMTI3NjAwMDAKKzMyIDEgMTI3ODAwMDAKKzMyIDEgMTI4MDAwMDAKKzMyIDEgMTI4MjAwMDAKKzMyIDEgMTI4NDAwMDAKKzMyIDEgMTI4NjAwMDAKKzMyIDEgMTI4ODAwMDAKKzMyIDEgMTI5MDAwMDAKKzMyIDEgMTI5MjAwMDAKKzMyIDEgMTI5NDAwMDAKKzMyIDEgMTI5NjAwMDAKKzMyIDEgMTI5ODAwMDAKKzMyIDEgMTMwMDAwMDAKKzMyIDEgMTMwMjAwMDAKKzMyIDEgMTMwNDAwMDAKKzMyIDEgMTMwNjAwMDAKKzMyIDEgMTMwODAwMDAKKzMyIDEgMTMxMDAwMDAKKzMyIDEgMTMxMjAwMDAKKzMyIDEgMTMxNDAwMDAKKzMyIDEgMTMxNjAwMDAKKzMyIDEgMTMxODAwMDAKKzMyIDEgMTMyMDAwMDAKKzMyIDEgMTMyMjAwMDAKKzMyIDEgMTMyNDAwMDAKKzMyIDEgMTMyNjAwMDAKKzMyIDEgMTMyODAwMDAKKzMyIDEgMTMzMDAwMDAKKzMyIDEgMTMzMjAwMDAKKzMyIDEgMTMzNDAwMDAKKzMyIDEgMTMzNjAwMDAKKzMyIDEgMTMzODAwMDAKKzMyIDEgMTM0MDAwMDAKKzMyIDEgMTM0MjAwMDAKKzMyIDEgMTM0NDAwMDAKKzMyIDEgMTM0NjAwMDAKKzMyIDEgMTM0ODAwMDAKKzMyIDEgMTM1MDAwMDAKKzMyIDEgMTM1MjAwMDAKKzMyIDEgMTM1NDAwMDAKKzMyIDEgMTM1NjAwMDAKKzMyIDEgMTM1ODAwMDAKKzMyIDEgMTM2MDAwMDAKKzMyIDEgMTM2MjAwMDAKKzMyIDEgMTM2NDAwMDAKKzMyIDEgMTM2NjAwMDAKKzMyIDEgMTM2ODAwMDAKKzMyIDEgMTM3MDAwMDAKKzMyIDEgMTM3MjAwMDAKKzMyIDEgMTM3NDAwMDAKKzMyIDEgMTM3NjAwMDAKKzMyIDEgMTM3ODAwMDAKKzMyIDEgMTM4MDAwMDAKKzMyIDEgMTM4MjAwMDAKKzMyIDEgMTM4NDAwMDAKKzMyIDEgMTM4NjAwMDAKKzMyIDEgMTM4ODAwMDAKKzMyIDEgMTM5MDAwMDAKKzMyIDEgMTM5MjAwMDAKKzMyIDEgMTM5NDAwMDAKKzMyIDEgMTM5NjAwMDAKKzMyIDEgMTM5ODAwMDAKKzMyIDEgMTQwMDAwMDAKKzMyIDEgMTQwMjAwMDAKKzMyIDEgMTQwNDAwMDAKKzMyIDEgMTQwNjAwMDAKKzMyIDEgMTQwODAwMDAKKzMyIDEgMTQxMDAwMDAKKzMyIDEgMTQxMjAwMDAKKzMyIDEgMTQxNDAwMDAKKzMyIDEgMTQxNjAwMDAKKzMyIDEgMTQxODAwMDAKKzMyIDEgMTQyMDAwMDAKKzMyIDEgMTQyMjAwMDAKKzMyIDEgMTQyNDAwMDAKKzMyIDEgMTQyNjAwMDAKKzMyIDEgMTQyODAwMDAKKzMyIDEgMTQzMDAwMDAKKzMyIDEgMTQzMjAwMDAKKzMyIDEgMTQzNDAwMDAKKzMyIDEgMTQzNjAwMDAKKzMyIDEgMTQzODAwMDAKKzMyIDEgMTQ0MDAwMDAKKzMyIDEgMTQ0MjAwMDAKKzMyIDEgMTQ0NDAwMDAKKzMyIDEgMTQ0NjAwMDAKKzMyIDEgMTQ0ODAwMDAKKzMyIDEgMTQ1MDAwMDAKKzMyIDEgMTQ1MjAwMDAKKzMyIDEgMTQ1NDAwMDAKKzMyIDEgMTQ1NjAwMDAKKzMyIDEgMTQ1ODAwMDAKKzMyIDEgMTQ2MDAwMDAKKzMyIDEgMTQ2MjAwMDAKKzMyIDEgMTQ2NDAwMDAKKzMyIDEgMTQ2NjAwMDAKKzMyIDEgMTQ2ODAwMDAKKzMyIDEgMTQ3MDAwMDAKKzMyIDEgMTQ3MjAwMDAKKzMyIDEgMTQ3NDAwMDAKKzMyIDEgMTQ3NjAwMDAKKzMyIDEgMTQ3ODAwMDAKKzMyIDEgMTQ4MDAwMDAKKzMyIDEgMTQ4MjAwMDAKKzMyIDEgMTQ4NDAwMDAKKzMyIDEgMTQ4NjAwMDAKKzMyIDEgMTQ4ODAwMDAKKzMyIDEgMTQ5MDAwMDAKKzMyIDEgMTQ5MjAwMDAKKzMyIDEgMTQ5NDAwMDAKKzMyIDEgMTQ5NjAwMDAKKzMyIDEgMTQ5ODAwMDAKKzMyIDEgMTUwMDAwMDAKKzMyIDEgMTUwMjAwMDAKKzMyIDEgMTUwNDAwMDAKKzMyIDEgMTUwNjAwMDAKKzMyIDEgMTUwODAwMDAKKzMyIDEgMTUxMDAwMDAKKzMyIDEgMTUxMjAwMDAKKzMyIDEgMTUxNDAwMDAKKzMyIDEgMTUxNjAwMDAKKzMyIDEgMTUxODAwMDAKKzMyIDEgMTUyMDAwMDAKKzMyIDEgMTUyMjAwMDAKKzMyIDEgMTUyNDAwMDAKKzMyIDEgMTUyNjAwMDAKKzMyIDEgMTUyODAwMDAKKzMyIDEgMTUzMDAwMDAKKzMyIDEgMTUzMjAwMDAKKzMyIDEgMTUzNDAwMDAKKzMyIDEgMTUzNjAwMDAKKzMyIDEgMTUzODAwMDAKKzMyIDEgMTU0MDAwMDAKKzMyIDEgMTU0MjAwMDAKKzMyIDEgMTU0NDAwMDAKKzMyIDEgMTU0NjAwMDAKKzMyIDEgMTU0ODAwMDAKKzMyIDEgMTU1MDAwMDAKKzMyIDEgMTU1MjAwMDAKKzMyIDEgMTU1NDAwMDAKKzMyIDEgMTU1NjAwMDAKKzMyIDEgMTU1ODAwMDAKKzMyIDEgMTU2MDAwMDAKKzMyIDEgMTU2MjAwMDAKKzMyIDEgMTU2NDAwMDAKKzMyIDEgMTU2NjAwMDAKKzMyIDEgMTU2ODAwMDAKKzMyIDEgMTU3MDAwMDAKKzMyIDEgMTU3MjAwMDAKKzMyIDEgMTU3NDAwMDAKKzMyIDEgMTU3NjAwMDAKKzMyIDEgMTU3ODAwMDAKKzMyIDEgMTU4MDAwMDAKKzMyIDEgMTU4MjAwMDAKKzMyIDEgMTU4NDAwMDAKKzMyIDEgMTU4NjAwMDAKKzMyIDEgMTU4ODAwMDAKKzMyIDEgMTU5MDAwMDAKKzMyIDEgMTU5MjAwMDAKKzMyIDEgMTU5NDAwMDAKKzMyIDEgMTU5NjAwMDAKKzMyIDEgMTU5ODAwMDAKKzMyIDEgMTYwMDAwMDAKKzMyIDEgMTYwMjAwMDAKKzMyIDEgMTYwNDAwMDAKKzMyIDEgMTYwNjAwMDAKKzMyIDEgMTYwODAwMDAKKzMyIDEgMTYxMDAwMDAKKzMyIDEgMTYxMjAwMDAKKzMyIDEgMTYxNDAwMDAKKzMyIDEgMTYxNjAwMDAKKzMyIDEgMTYxODAwMDAKKzMyIDEgMTYyMDAwMDAKKzMyIDEgMTYyMjAwMDAKKzMyIDEgMTYyNDAwMDAKKzMyIDEgMTYyNjAwMDAKKzMyIDEgMTYyODAwMDAKKzMyIDEgMTYzMDAwMDAKKzMyIDEgMTYzMjAwMDAKKzMyIDEgMTYzNDAwMDAKKzMyIDEgMTYzNjAwMDAKKzMyIDEgMTYzODAwMDAKKzMyIDEgMTY0MDAwMDAKKzMyIDEgMTY0MjAwMDAKKzMyIDEgMTY0NDAwMDAKKzMyIDEgMTY0NjAwMDAKKzMyIDEgMTY0ODAwMDAKKzMyIDEgMTY1MDAwMDAKKzMyIDEgMTY1MjAwMDAKKzMyIDEgMTY1NDAwMDAKKzMyIDEgMTY1NjAwMDAKKzMyIDEgMTY1ODAwMDAKKzMyIDEgMTY2MDAwMDAKKzMyIDEgMTY2MjAwMDAKKzMyIDEgMTY2NDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NmVhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDgwNyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCis2NCAxIDQwMDAwCis2NCAxIDgwMDAwCis2NCAxIDEyMDAwMAorOTYgMSAxNjAwMDAKKzk2IDEgMjIwMDAwCis5NiAxIDI4MDAwMAorOTYgMSAzNDAwMDAKKzEyOCAxIDQwMDAwMAorMTI4IDEgNDgwMDAwCisxMjggMSA1NjAwMDAKKzEyOCAxIDY0MDAwMAorMTI4IDEgNzIwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmI3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWcyIiwgbXBlZzJ9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LCB7ImF2MSIsIGF2MX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisKKyAgICAgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBtVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzSGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHNIaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0c0hpdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2Q7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICh2b2lkKW1Dc2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzIsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgYXYxLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDEpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXZjLAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCJ9LAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aGV2YywKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMifSwKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWcyLAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiJ9LAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoMjYzLAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMifSwKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnNCwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2In0sCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOCwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCJ9LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSJ9LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2MSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmF2MSIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5hdjEifSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmluZm8iLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAoMSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICAgIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfUChDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhlcywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoMCwgMSkpOworCisvLyBBZGFwdGl2ZSBUZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgQWRhcHRpdmVEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkFkYXB0aXZlIERlY29kZSBUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fAorICAgICAgICAgIG1Db21wTmFtZSA9PSB2cDkgfHwgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgeworICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgICAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisKKyAgICAgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcE1heCA9IDA7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBPZmZzZXQ7CisgICAgICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBNYXggPCB0aW1lc3RhbXApIHRpbWVzdGFtcE1heCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBPZmZzZXQgPSB0aW1lc3RhbXBNYXg7CisgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAorICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAoaW50KShJbmZvLnNpemUoKSAtIG9mZnNldCksIGZhbHNlKSk7CisKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG9mZnNldCA9IChpbnQpSW5mby5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2VuZCBFT1MKKyAgICAvLyBUT0RPIEFkZCBmdW5jdGlvbiB0byBzZW5kIEVPUyB3b3JrIGl0ZW0KKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gKChJbmZvLnNpemUoKSkgKyAxKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSArIDEpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lURVJBVElPTlM7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgICAgICBzaXplX3QgaiA9IC0xOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoSW5mb1tqXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tqXS5mbGFncyAtIDEpOworCisgICAgICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGogKyAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZWxlYXNlKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworCisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmVuY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIGJvb2wgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KTsKKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHVpbnQzMl90IG1GYWlsZWRXb3JrUmVjZWl2ZWQ7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1HcmFwaGljUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JmlucHV0U2l6ZX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogVVJMKSB7CisgICAgc3RyY2F0KFVSTCwgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Iik7Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGdyYXBoaWNQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgZnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRnJhbWVzLCB1aW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoZWQgPSBmYWxzZSxib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIEMyX09LLAorICAgICAgICAgICAgZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gR3JhcGhpYyBWaWV3CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCogcFUgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QqIHBWID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIG1lbWNweShwWSwgZGF0YSwgbldpZHRoICogbkhlaWdodCk7CisgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG5XaWR0aCAqIG5IZWlnaHQsIChuV2lkdGggKiBuSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgbWVtY3B5KHBWLCBkYXRhICsgKG5XaWR0aCAqIG5IZWlnaHQgKiA1ID4+IDIpLCBuV2lkdGggKiBuSGVpZ2h0ID4+IDIpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBFTkNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkVuY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIEVOQ19OVU1fRlJBTUVTLCBuV2lkdGgsIG5IZWlnaHQpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gRU5DX05VTV9GUkFNRVMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICVkIiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBFTkNfTlVNX0ZSQU1FUyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIW1Dc2QgJiYgKG1Db21wTmFtZSAhPSB2cDggJiYgbUNvbXBOYW1lICE9IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CisgICAgfQorCisgICAgaWYgKG1Dc2QgJiYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCBleHBlY3RlZCI7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0KSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgSW52YWxpZEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZmVlZGluZyBsYXJnZXIvc21hbGxlciBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgbGFyZ2VyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBuV2lkdGgqMiwgbkhlaWdodCoyLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgc21hbGxlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgbldpZHRoLzIsIG5IZWlnaHQvMiwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gMykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogMyIsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobUZhaWxlZFdvcmtSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBmYWlsZWQgZnJhbWUgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZEZyYW1lc1JlY2VpdmVkIDogJWQiLCBtRmFpbGVkV29ya1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIFJlc29sdXRpb25UZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVuY29kaW5nIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HRCgiVHJ5aW5nIGVuY29kZSBmb3Igd2lkdGggJWQgaGVpZ2h0ICVkIiwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBtRW9zID0gZmFsc2U7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgXSwKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmU1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMCwwICsxLDEzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQ2xpZW50IgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBMaXN0IG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcyBpbiB0aGUgZGVjcmVhc2luZyBvcmRlciBvZiBwcmVmZXJlbmNlLgorY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lc1tdID0geworICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICJzb2Z0d2FyZSIsCisgICAgfTsKKworLy8gTnVtYmVyIG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KK2NvbnN0ZXhwciBzaXplX3Qga051bUNsaWVudHMgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrQ2xpZW50TmFtZXMpPjo6dmFsdWU7CisKK3R5cGVkZWYgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piwga051bUNsaWVudHM+IENsaWVudExpc3Q7CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gb2J0YWluIGtub3duIGNsaWVudHMuCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoc2l6ZV90IGluZGV4KSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5tZWRpYS5jb2RlYzIiLCB1aW50MzJfdCgwKSk7CisgICAgcmV0dXJuIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBrQ2xpZW50TmFtZXNbaW5kZXhdLAorICAgICAgICAgICAgKHNlcnZpY2VNYXNrICYgKDEgPDwgaW5kZXgpKSAhPSAwKTsKK30KKworQ2xpZW50TGlzdCBnZXRDbGllbnRMaXN0KCkgeworICAgIENsaWVudExpc3QgbGlzdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbGlzdFtpXSA9IGdldENsaWVudChpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK30gLy8gdW5uYW1lZAorCisvLyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQKKworY29uc3QgQzJTdHJpbmcmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWU7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KAorICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYmFzZSkKKyAgICAgIDogbUJhc2V7YmFzZX0sCisgICAgICAgIG1OYW1le1tiYXNlXSgpIC0+IEMyU3RyaW5nIHsKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBvdXROYW1lOworICAgICAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UtPmdldE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJm91dE5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1N0YXR1cy5pc09rKCkgPyBvdXROYW1lIDogIiI7CisgICAgICAgICAgICB9KCl9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICB9CisgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgfQorICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnkoCisgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5IC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gZXJyb3Igd2hpbGUgcGFyc2luZyBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJiAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHN0YWNrUGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9IHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gc2tpcHBlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIHBhcmFtIHVwZGF0ZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbVBvaW50ZXItPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXh0cmEgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50Ojpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgUGFyYW1zIGhpZGxQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZoaWRsUGFyYW1zLCBwYXJhbXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25maWcoCisgICAgICAgICAgICBoaWRsUGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZwYXJhbXMsIGZhaWx1cmVzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtcyYgbykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBmYWlsdXJlcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLT5yZXNpemUoaSArIGYuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNmIDogZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmKCpmYWlsdXJlcylbaSsrXSwgc2YpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBTZXR0aW5nUmVzdWx0IHJldHVybmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVQYXJhbXNGcm9tQmxvYihwYXJhbXMsIG8pKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBwYXJzZSByZXR1cm5lZCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IENhY2hlIGFuZCBxdWVyeSBwcm9wZXJseSEKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIHBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+JiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gcGFyYW1zLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZXNpemUoaSArIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgc3AgOiBwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKnBhcmFtcylbaSsrXSwgc3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIHJldHVybmVkIFBhcmFtRGVzY3JpcHRvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGluRmllbGRzKGZpZWxkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZpbkZpZWxkc1tpXSwgZmllbGRzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gYmFkIGlucHV0IjsKKyAgICAgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgaW5GaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJmluRmllbGRzLCAmZmllbGRzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+JiByKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLnNpemUoKSAhPSBmaWVsZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYW5kIG91dHB1dCBsaXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgZGlmZmVyZW50IHNpemVzLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZmllbGRzW2ldLCBpbkZpZWxkc1tpXSwgcltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmV0dXJuZWQgdmFsdWUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lciA6IHB1YmxpYyBJQ29tcG9uZW50TGlzdGVuZXIgeworICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uV29ya0RvbmUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtczsKKyAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtJdGVtcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFdvcmtCdW5kbGUuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpbnB1dCBidWZmZXJzIHBvdGVudGlhbGx5IGhlbGQgYnkgdGhlIGNvbXBvbmVudCBmcm9tIHF1ZXVlCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnQubG9jaygpOworICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPmhhbmRsZU9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lKGNvbXBvbmVudCwgd29ya0l0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4mIHNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMlNldHRpbmdSZXN1bHRzKAorICAgICAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+IGMyU2V0dGluZ1Jlc3VsdDsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZjMlNldHRpbmdSZXN1bHQsIHNldHRpbmdSZXN1bHRzW2ldKSkgeworICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSByZWNlaXZlZCBjb3JydXB0ZWQgU2V0dGluZ1Jlc3VsdC4iOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMlNldHRpbmdSZXN1bHRzW2ldID0gc3RkOjptb3ZlKGMyU2V0dGluZ1Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25UcmlwcGVkKGNvbXBvbmVudCwgYzJTZXR0aW5nUmVzdWx0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvblRyaXBwZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FcnJvcihTdGF0dXMgcywgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIm9uRXJyb3IgLS0iCisgICAgICAgICAgICAgICAgICAgPDwgIiBzdGF0dXMgPSAiIDw8IHMKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvckNvZGUgPSAiIDw8IGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3IoY29tcG9uZW50LCBzID09IFN0YXR1czo6T0sgPworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgOiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25GcmFtZXNSZW5kZXJlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgUmVuZGVyZWRGcmFtZSYgcmVuZGVyZWRGcmFtZSA6IHJlbmRlcmVkRnJhbWVzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25GcmFtZVJlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLmJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuc2xvdElkLAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnRpbWVzdGFtcE5zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJbnB1dEJ1ZmZlcj4mIGlucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IElucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6IGlucHV0QnVmZmVycykgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvbklucHV0QnVmZmVyc1JlbGVhc2VkIC0tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWQgZGVhdGggbm90aWZpY2F0aW9uIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5wdXQgYnVmZmVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lSW5kZXggPSAiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKK307CisKKy8vIENvZGVjMkNsaWVudAorQ29kZWMyQ2xpZW50OjpDb2RlYzJDbGllbnQoY29uc3Qgc3A8SUNvbXBvbmVudFN0b3JlPiYgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbUxpc3RlZHtmYWxzZX0sCisgICAgICAgIG1TZXJ2aWNlTmFtZXtzZXJ2aWNlTmFtZX0geworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IHRyYW5zUmVzdWx0ID0gYmFzZS0+Z2V0UG9vbENsaWVudE1hbmFnZXIoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJnZXRQb29sQ2xpZW50TWFuYWdlciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8c3A8SUNsaWVudE1hbmFnZXI+Pih0cmFuc1Jlc3VsdCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgeworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIHNwPENvbXBvbmVudDo6SGlkbExpc3RlbmVyPiBoaWRsTGlzdGVuZXIgPSBuZXcgQ29tcG9uZW50OjpIaWRsTGlzdGVuZXJ7fTsKKyAgICBoaWRsTGlzdGVuZXItPmJhc2UgPSBsaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICBbJnN0YXR1cywgY29tcG9uZW50LCBoaWRsTGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKKyAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSBpZiAoISpjb21wb25lbnQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gbnVsbCBjb21wb25lbnQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKmNvbXBvbmVudCktPnNldERlYXRoTGlzdGVuZXIoKmNvbXBvbmVudCwgbGlzdGVuZXIpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gZmFpbGVkIHRvIHNldCB1cCBkZWF0aCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorCisgICAgKCpjb21wb25lbnQpLT5tQnVmZmVyUG9vbFNlbmRlci5zZXRSZWNlaXZlcihtSG9zdFBvb2xNYW5hZ2VyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnRlcmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudEludGVyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnRlcmZhY2UoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnN0YXR1cywgaW5wdXRTdXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW5wdXRTdXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNyZWF0ZUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Omxpc3RDb21wb25lbnRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1MaXN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHNMaXN0OworICAgIH0KKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+bGlzdENvbXBvbmVudHMoCisgICAgICAgICAgICBbdGhpc10oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+JiB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJsaXN0Q29tcG9uZW50cyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYWl0c0xpc3QucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJm1UcmFpdHNMaXN0W2ldLCB0W2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAibGlzdENvbXBvbmVudHMgLS0gY29ycnVwdGVkIG91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1UcmFpdHNMaXN0W2ldLm93bmVyID0gbVNlcnZpY2VOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImxpc3RDb21wb25lbnRzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBtTGlzdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gbVRyYWl0c0xpc3Q7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y29weUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQ/CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICBMT0coRVJST1IpIDw8ICJjb3B5QnVmZmVyIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPgorICAgICAgICBDb2RlYzJDbGllbnQ6OmdldFBhcmFtUmVmbGVjdG9yKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGV4cG9zZWQgYXMgQzJQYXJhbVJlZmxlY3RvciBvbiB0aGUgY2xpZW50IHNpZGU7IGluc3RlYWQsIGl0CisgICAgLy8gc2hvdWxkIHJlZmxlY3QgdGhlIEhBTCBBUEkuCisgICAgc3RydWN0IFNpbXBsZVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoMSk7CisgICAgICAgICAgICBpbmRpY2VzWzBdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oY29yZUluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIFsmZGVzY3JpcHRvcl0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4mIHNkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgdmVjdG9yIG9mIHNpemUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2Quc2l6ZSgpIDw8ICIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgMS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZGVzY3JpcHRvciwgc2RbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJ1cHRlZCBkYXRhLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZVBhcmFtUmVmbGVjdG9yKHNwPEJhc2U+IGJhc2UpCisgICAgICAgICAgICA6IG1CYXNlKGJhc2UpIHsgfQorCisgICAgICAgIHNwPEJhc2U+IG1CYXNlOworICAgIH07CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVQYXJhbVJlZmxlY3Rvcj4obUJhc2UpOworfTsKKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsIGJvb2wgd2FpdEZvclNlcnZpY2UpIHsKKyAgICBpZiAoIXNlcnZpY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxCYXNlPiBiYXNlU3RvcmUgPSB3YWl0Rm9yU2VydmljZSA/CisgICAgICAgICAgICBCYXNlOjpnZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKSA6CisgICAgICAgICAgICBCYXNlOjp0cnlHZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICBpZiAoIWJhc2VTdG9yZSkgeworICAgICAgICBpZiAod2FpdEZvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ29kZWMyLjAgc2VydmljZSBcIiIgPDwgc2VydmljZU5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5hY2Nlc3NpYmxlLiBDaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb2RlYzIuMCBzZXJ2aWNlIFwiIiA8PCBzZXJ2aWNlTmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5hdmFpbGFibGUgYXQgdGhlIG1vbWVudC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhaXQgb3IgY2hlY2sgdGhlIGRldmljZSBtYW5pZmVzdC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ+KGJhc2VTdG9yZSwgc2VydmljZU5hbWUpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkZvckFsbFN0b3JlcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPgorICAgICAgICAgICAgcHJlZGljYXRlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfTk9fSU5JVDsgIC8vIG5vIElDb21wb25lbnRTdG9yZXMgcHJlc2VudAorCisgICAgLy8gQ2FjaGUgdGhlIG1hcHBpbmcga2V5IC0+IGluZGV4IG9mIENvZGVjMkNsaWVudCBpbiBnZXRDbGllbnQoKS4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBrZXkySW5kZXhNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNpemVfdD4ga2V5MkluZGV4OworCisgICAgLy8gQnkgZGVmYXVsdCB0cnkgYWxsIHN0b3Jlcy4gSG93ZXZlciwgdHJ5IHRoZSBsYXN0IGtub3duIGNsaWVudCBmaXJzdC4gSWYKKyAgICAvLyB0aGUgbGFzdCBrbm93biBjbGllbnQgZmFpbHMsIHJldHJ5IG9uY2UuIFdlIGRvIHRoaXMgYnkgcHVzaGluZyB0aGUgbGFzdAorICAgIC8vIGtub3duIGNsaWVudCBpbiBmcm9udCBvZiB0aGUgbGlzdCBvZiBhbGwgY2xpZW50cy4KKyAgICBzdGQ6OmRlcXVlPHNpemVfdD4gaW5kaWNlczsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IGtOdW1DbGllbnRzOyBpbmRleCA+IDA7ICkgeworICAgICAgICBpbmRpY2VzLnB1c2hfZnJvbnQoLS1pbmRleCk7CisgICAgfQorCisgICAgYm9vbCB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soa2V5MkluZGV4TXV0ZXgpOworICAgIGF1dG8gaXQgPSBrZXkySW5kZXguZmluZChrZXkpOworICAgIGlmIChpdCAhPSBrZXkySW5kZXguZW5kKCkpIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KGl0LT5zZWNvbmQpOworICAgICAgICB3YXNNYXBwZWQgPSB0cnVlOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworCisgICAgZm9yIChzaXplX3QgaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpbmRleCk7CisgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHByZWRpY2F0ZShjbGllbnQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGtleTJJbmRleFtrZXldID0gaW5kZXg7IC8vIHVwZGF0ZSBsYXN0IGtub3duIGNsaWVudCBpbmRleAorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhc01hcHBlZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDb3VsZCBub3QgZmluZCBcIiIgPDwga2V5IDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHRoZSBsYXN0IGluc3RhbmNlLiBSZXRyeWluZy4uLiI7CisgICAgICAgICAgICB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOyAgLy8gcmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBmcm9tIGEgdmFsaWQgY2xpZW50Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgJmxpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUNvbXBvbmVudChcIiIgPDwgY29tcG9uZW50TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgY29tcG9uZW50IFwiIiA8PCBjb21wb25lbnROYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgW293bmVyLCAmaW50ZXJmYWNlLCBpbnRlcmZhY2VOYW1lXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUludGVyZmFjZShpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUludGVyZmFjZShcIiIgPDwgaW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIFwiIiA8PCBpbnRlcmZhY2VOYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5zdGFnZWZyaWdodC5jMmlucHV0c3VyZmFjZSIsIHVpbnQzMl90KDApKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1DbGllbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKCgxIDw8IGkpICYgc2VydmljZU1hc2spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgaWYgKGNsaWVudCAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNyZWF0ZUlucHV0U3VyZmFjZSgmaW5wdXRTdXJmYWNlKSA9PSBDMl9PSyAmJgorICAgICAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgImZyb20gYW55IENvZGVjMi4wIHNlcnZpY2VzLiI7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHNMaXN0ID0gW10oKXsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdDsKKyAgICAgICAgc2l6ZV90IGxpc3RTaXplID0gMDsKKyAgICAgICAgQ2xpZW50TGlzdCBjbGllbnRMaXN0ID0gZ2V0Q2xpZW50TGlzdCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdFNpemUgKz0gY2xpZW50LT5saXN0Q29tcG9uZW50cygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LnJlc2VydmUobGlzdFNpemUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIGxpc3QuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0oKTsKKworICAgIHJldHVybiB0cmFpdHNMaXN0OworfQorCisvLyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyCisKK0NvZGVjMkNsaWVudDo6TGlzdGVuZXI6On5MaXN0ZW5lcigpIHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UKK0NvZGVjMkNsaWVudDo6SW50ZXJmYWNlOjpJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHRyYW5zUmVzdWx0MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+Pih0cmFuc1Jlc3VsdDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdDIuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdDIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye251bGxwdHJ9IHsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6On5Db21wb25lbnQoKSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlkKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBibG9ja1Bvb2xJZCwgY29uZmlndXJhYmxlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlLT5yZXNldCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqYmxvY2tQb29sSWQgPSBzdGF0aWNfY2FzdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4ocElkKTsKKyAgICAgICAgICAgICAgICAqY29uZmlndXJhYmxlID0gc3RkOjptYWtlX3NoYXJlZDxDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRlc3Ryb3lCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCit2b2lkIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpoYW5kbGVPbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKHdvcmtJdGVtcywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWUoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCAqaXRlbXMsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gYmFkIGlucHV0LiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Zmx1c2goCisgICAgICAgICAgICBbJnN0YXR1cywgZmx1c2hlZFdvcmtdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgV29ya0J1bmRsZSYgd2IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJmbHVzaCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KGZsdXNoZWRXb3JrLCB3YikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZsdXNoIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKCpmbHVzaGVkV29yaywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRyYWluKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkcmFpbiAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkcmFpbiAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+c3RhcnQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdGFydCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdGFydCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdG9wKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdG9wIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlc2V0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlc2V0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlbGVhc2UoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJyZWxlYXNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlbGVhc2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPQorICAgICAgICAgICAgc3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KCk7CisKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgaWdicCA9IG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihzdXJmYWNlKTsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwgaWdicCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgpOworICAgICAgICBpZiAobU91dHB1dElnYnAgIT0gc3VyZmFjZSkgeworICAgICAgICAgICAgbU91dHB1dElnYnAgPSBzdXJmYWNlOworICAgICAgICAgICAgaWYgKCFzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJxSWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmbU91dHB1dEJxSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IG9idGFpbiBidWZmZXJxdWV1ZSBpZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PdXRwdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dElnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicVNsb3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGF0dGFjaGluZyBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIG5vbi1idWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIW91dHB1dElnYnApIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBvdXRwdXQgc3VyZmFjZSBpcyBudWxsLiI7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQgfHwgZ2VuZXJhdGlvbiAhPSBvdXRwdXRHZW5lcmF0aW9uKSB7CisgICAgICAgIGlmICghaG9sZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2ssIG1PdXRwdXRJZ2JwLCBtT3V0cHV0QnFJZCwgbU91dHB1dEdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBtaWdyYXRpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGNvcnJ1cHRlZCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LiI7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICgheWllbGRCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBjYW5ub3QgeWllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJxdWV1ZS1iYXNlZCBibG9jayB0byB0aGUgYnVmZmVycXVldWUuIjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPm1CYXNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBwcm9kdWNlciwgc291cmNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvT214SW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25EZWF0aCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+bUJhc2UtPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldERlYXRoTGlzdGVuZXIgLS0gbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1Jlc3VsdCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2Vye25ldworICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6CisgICAgICAgICAgICBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoW2Jhc2VdKCkgLT4gc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkpfSB7Cit9CisKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+CisgICAgICAgIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9CisKK3NwPElJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRIYWxJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24KK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6ZGlzY29ubmVjdCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1Jlc3VsdCA9IG1CYXNlLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4Y2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX0NMSUVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX0NMSUVOVF9ICisKKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBDb2RlYzIuMCBISURMIGludGVyZmFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ29uZmlndXJhYmxlOworc3RydWN0IElDb21wb25lbnQ7CitzdHJ1Y3QgSUNvbXBvbmVudEludGVyZmFjZTsKK3N0cnVjdCBJQ29tcG9uZW50U3RvcmU7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CitzdHJ1Y3QgSUNsaWVudE1hbmFnZXI7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygb3RoZXIgY2xhc3NlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9IC8vIG5hbWVzcGFjZSBWMV8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAvLyBuYW1lc3BhY2UgZ3JhcGhpY3MKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2Ugb214IHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIG9teAorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUsIGJ1dCBmb3J3YXJkCisvLyBkZWNsYXJhdGlvbiBvZiBhbiBpbm5lciBjbGFzcyBpcyBub3QgcG9zc2libGUuCitzdHJ1Y3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIEJhc2U7CisKKyAgICBjb25zdCBDMlN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDb25maWd1cmFibGVDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgQzJTdHJpbmcgbU5hbWU7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQgOiBwdWJsaWMgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUgQmFzZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHR5cGVkZWYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IENvbmZpZ3VyYWJsZTsKKworICAgIHN0cnVjdCBDb21wb25lbnQ7CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQgU3RvcmU7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2aWNlTmFtZTsgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIGxpc3RDb21wb25lbnRzKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgZHN0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsCisgICAgICAgICAgICBib29sIHdhaXRGb3JTZXJ2aWNlID0gdHJ1ZSk7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UsIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgLy8gRmluZHMgdGhlIGZpcnN0IHN0b3JlIHdoZXJlIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBPSywgYW5kIHJldHVybnMgdGhlIGxhc3QKKyAgICAvLyBwcmVkaWNhdGUgcmVzdWx0LiBVc2VzIGtleSB0byByZW1lbWJlciB0aGUgbGFzdCBzdG9yZSBmb3VuZCwgYW5kIGlmIGNhY2hlZCwKKyAgICAvLyBpdCB0cmllcyB0aGF0IHN0b3JlIGJlZm9yZSB0cnlpbmcgYWxsIHN0b3JlcyAob25lIHJldHJ5KS4KKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mKT4gcHJlZGljYXRlKTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgbXV0YWJsZSBib29sIG1MaXN0ZWQ7CisgICAgc3RkOjpzdHJpbmcgbVNlcnZpY2VOYW1lOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW50ZXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50SW50ZXJmYWNlIEJhc2U7CisKKyAgICBJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcHJvZHVjZXMgc29tZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBnb2VzIGludG8gYSB0cmlwcGVkIHN0YXRlLgorICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzCisgICAgICAgICAgICApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBlbmNvdW50ZXJzIGFuIGVycm9yLgorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIHRoYXQgaG9zdHMgdGhlIGNvbXBvbmVudCBzaHV0cyBkb3duCisgICAgLy8gdW5leHBlY3RlZGx5LgorICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KKyAgICAvLyBJbnB1dCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IG9uV29ya0RvbmUoKSBvciBmbHVzaCgpIHdpbGwgbm90CisgICAgLy8gdHJpZ2dlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgYSBmcmFtZSBiZWluZworICAgIC8vIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgorICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgQ29tcG9uZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworICAgIH5Db21wb25lbnQoKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtT3V0cHV0QnVmZmVyUXVldWVNdXRleDsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBtT3V0cHV0R2VuZXJhdGlvbjsKKworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisKKyAgICBzdHJ1Y3QgSGlkbExpc3RlbmVyOworICAgIHZvaWQgaGFuZGxlT25Xb3JrRG9uZShjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlIEJhc2U7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICAgICAgICAgIENvbm5lY3Rpb25CYXNlOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgdW5kZXJseWluZyBJSW5wdXRTdXJmYWNlLgorICAgIHNwPEJhc2U+IGdldEhhbEludGVyZmFjZSgpIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfQ0xJRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIsCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorICAgIHNvY19zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgc3JjczogWworICAgICAgICAidmVuZG9yLmNwcCIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIHZlbmRvciBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CitpZmVxICgkKFRBUkdFVF9BUkNIKSwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICAgIGVsc2UKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKKyAgICBlbmRpZgorZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBhbmRyb2lkLWhhcmR3YXJlLW1lZGlhLWMyLWhhbC0xLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1pbmlqYWlsLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisvLyBPbXhTdG9yZSBpcyBhZGRlZCBmb3IgdmlzaWJpbGl0eSBieSBkdW1wc3RhdGUuCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorCisvLyBUaGlzIGlzIGNyZWF0ZWQgYnkgbW9kdWxlICJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Ii4gVGhpcyBjYW4gYmUgbW9kaWZpZWQuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0Jhc2VTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiOworCisvLyBBZGRpdGlvbmFsIGRldmljZS1zcGVjaWZpYyBzZWNjb21wIHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCBpbiB0aGlzIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0V4dFNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5leHQucG9saWN5IjsKKworY2xhc3MgRHVtbXlDMlN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIER1bW15QzJTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkR1bW15QzJTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBzdGFja1BhcmFtcyAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiAvKiBoZWFwUGFyYW1JbmRpY2VzICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCAvKiBoZWFwUGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBwYXJhbXMgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IC8qIGZhaWx1cmVzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IC8qIHBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgLyogZmllbGRzICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxEdW1teUMyU3RvcmU+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTI2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDU5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJQaXBlbGluZVdhdGNoZXIuY3BwIiwKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAiLAorICAgICAgICAiU2tpcEN1dEJ1ZmZlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q4NTlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSB7CisgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgIGlmICghc3RybmNtcChjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgImMyLmFuZHJvaWQuIiwgMTEpKSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgIGlmIChpbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemUgPT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXIsIHNvdXJjZSA9IGdldFNvdXJjZSgpXShDMkJ1ZmZlciAqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVyLCAtMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgKHZvaWQpcGFyYW1ldGVyTmFtZTsKKyAgICAqaW5kZXggPSBPTVhfSW5kZXhNYXg7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSYgbXNnKSB7CisgICAgaWYgKG1zZy50eXBlICE9IG9teF9tZXNzYWdlOjpFVkVOVCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmIChtc2cudS5ldmVudF9kYXRhLmV2ZW50ICE9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpbXNnLnUuZXZlbnRfZGF0YS5kYXRhMTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1zZy51LmV2ZW50X2RhdGEuZGF0YTM7CisKKyAgICAvLyBUT0RPOiBzZXQgZGF0YXNwYWNlIG9uIGNvbXBvbmVudCB0byBzZWUgaWYgaXQgaW1wYWN0cyBjb2xvciBhc3BlY3RzCisgICAgQUxPR0QoImRhdGFzcGFjZSBjaGFuZ2VkIHRvICUjeCBwaXhlbCBmb3JtYXQ6ICUjeCIsIGRhdGFTcGFjZSwgcGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SU9NWEJ1ZmZlclNvdXJjZT4gQzJPTVhOb2RlOjpnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJTb3VyY2U7Cit9CisKK3ZvaWQgQzJPTVhOb2RlOjpzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBnZXRTb3VyY2UoKTsKKyAgICB2b2lkIHNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTMyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE3MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDQ29kZWMuaCIKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBCR3JhcGhpY0J1ZmZlclNvdXJjZSA9IDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2U7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENDb2RlY1dhdGNoZG9nIDogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludDY0X3Qga1dhdGNoSW50ZXJ2YWxVcyA9IDMzMDAwMDA7ICAvLyAzLjMgc2VjcworCitwdWJsaWM6CisgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBpbnN0YW5jZShuZXcgQ0NvZGVjV2F0Y2hkb2cpOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZzsKKyAgICAgICAgLy8gQ2FsbCBJbml0KCkgb25seSBvbmNlLgorICAgICAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBJbml0LCBpbnN0YW5jZSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICB+Q0NvZGVjV2F0Y2hkb2coKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdhdGNoKHNwPENDb2RlYz4gY29kZWMpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgIC8vIElmIGEgd2F0Y2ggbWVzc2FnZSBpcyBpbiBmbGlnaHQsIHBpZ2d5LWJhY2sgdGhpcyBpbnN0YW5jZSBhcyB3ZWxsLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3N0IGEgbmV3IHdhdGNoIG1lc3NhZ2UuCisgICAgICAgICAgICBzaG91bGRQb3N0ID0gY29kZWNzLT5lbXB0eSgpOworICAgICAgICAgICAgY29kZWNzLT5lbXBsYWNlKGNvZGVjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgQUxPR1YoInBvc3Rpbmcgd2F0Y2ggbWVzc2FnZSIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3Qoa1dhdGNoSW50ZXJ2YWxVcyk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigid2F0Y2ggZm9yICV6dSBjb2RlY3MiLCBjb2RlY3MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNzLT5iZWdpbigpOyBpdCAhPSBjb2RlY3MtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPENDb2RlYz4gY29kZWMgPSBpdC0+cHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWNzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoIkNDb2RlY1dhdGNoZG9nOiB1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlY1dhdGNoZG9nKCkgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSB7fQorCisgICAgc3RhdGljIHZvaWQgSW5pdChjb25zdCBzcDxDQ29kZWNXYXRjaGRvZz4gJnRoaXopIHsKKyAgICAgICAgQUxPR1YoIkluaXQiKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c2V0TmFtZSgiQ0NvZGVjV2F0Y2hkb2ciKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXopOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+PiBtQ29kZWNzVG9XYXRjaDsKK307CisKK2NsYXNzIEMySW5wdXRTdXJmYWNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMklucHV0U3VyZmFjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+ICZzdXJmYWNlKSA6CisgICAgICAgIG1TdXJmYWNlKHN1cmZhY2UpIHsKKyAgICB9CisKKyAgICB+QzJJbnB1dFN1cmZhY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChjb21wLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UobVN1cmZhY2UsICZtQ29ubmVjdGlvbikpOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSW5wdXRTdXJmYWNlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIHN0YXJ0ZWQgc3RhdGUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nIGVvcyh0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3VyZmFjZS0+Y29uZmlnKHsmZW9zfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24+IG1Db25uZWN0aW9uOworfTsKKworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisvLyAgICBleHBsaWNpdCBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcihjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkgOiBtU291cmNlKHNvdXJjZSkge30KKyAgICBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeworICAgICAgICBtRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICB9CisgICAgfkdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob2RlID0gbmV3IEMyT01YTm9kZShjb21wKTsKKyAgICAgICAgbU5vZGUtPnNldEZyYW1lU2l6ZShtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCisgICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKG1Ob2RlLCBtRGF0YVNwYWNlKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ob2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkdCU1dyYXBwZXI6OmRpc2Nvbm5lY3Q6IG5vZGUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBPTVhCdWZmZXJTb3VyY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc291cmNlLT5vbk9teElkbGUoKTsKKyAgICAgICAgc291cmNlLT5vbk9teExvYWRlZCgpOworICAgICAgICBtTm9kZS5jbGVhcigpOworICAgIH0KKworICAgIHN0YXR1c190IEdldFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmc3RhdHVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmluZGVyIHN0YXR1cyBmYWlsZWQsIGJ1dCB0aGVyZSBpcyBubyBzZXJ2aWUgb3IgdHJhbnNhY3Rpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga051bVNsb3RzID0gMTY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlLT5vbk9teEV4ZWN1dGluZygpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEdldFN0YXR1cyhtU291cmNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZykgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIC8vIGhhbmRsZSBlYWNoIGNvbmZpZ3VyYXRpb24gZ3JhbnVhbGx5LCBpbiBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gZWxzZXdoZXJlCisKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgZnJhbWUgZGVsYXkgcmVwZWF0aW5nCisgICAgICAgIGlmIChjb25maWcubU1pbkZwcyA+IDAgJiYgY29uZmlnLm1NaW5GcHMgIT0gbUNvbmZpZy5tTWluRnBzKSB7CisgICAgICAgICAgICBpbnQ2NF90IHVzID0gMWU2IC8gY29uZmlnLm1NaW5GcHMgKyAwLjU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXModXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1pbkZwcz0iIDw8IGNvbmZpZy5tTWluRnBzIDw8ICIgPT4gcmVwZWF0RGVsYXlVcz0iIDw8IHVzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1pbkZwcyA9IGNvbmZpZy5tTWluRnBzOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHRzIGdhcAorICAgICAgICBpZiAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDAgfHwgY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCkgeworICAgICAgICAgICAgaWYgKG1Ob2RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSBwdHJHYXBQYXJhbSA9IHt9OworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5TaXplID0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uVTMyID0gKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBjMl9taW4oSU5UMzJfTUFYICsgMC4sIDFlNiAvIGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGMyX21heCgwLiAtIElOVDMyX01BWCwgLTFlNiAvIGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyAtIDAuNSk7CisgICAgICAgICAgICAgICAgKHZvaWQpbU5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckdhcFBhcmFtLCBzaXplb2YocHRyR2FwUGFyYW0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heCBmcHMKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgbWF4IGZwcyB0byAwIHVubGVzcyB1c2luZyBmaXhlZCBmcHMKKyAgICAgICAgaWYgKChjb25maWcubU1heEZwcyA+IDAgfHwgKGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDAgJiYgY29uZmlnLm1NYXhGcHMgPT0gMCkpCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm1NYXhGcHMgIT0gbUNvbmZpZy5tTWF4RnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0TWF4RnBzKGNvbmZpZy5tTWF4RnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtYXhGcHM9IiA8PCBjb25maWcubU1heEZwczsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NYXhGcHMgPSBjb25maWcubU1heEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVRpbWVPZmZzZXRVcyAhPSBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lT2Zmc2V0VXMoY29uZmlnLm1UaW1lT2Zmc2V0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVPZmZzZXQgIiA8PCBjb25maWcubVRpbWVPZmZzZXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVRpbWVPZmZzZXRVcyA9IGNvbmZpZy5tVGltZU9mZnNldFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tQ2FwdHVyZUZwcyAhPSBtQ29uZmlnLm1DYXB0dXJlRnBzIHx8IGNvbmZpZy5tQ29kZWRGcHMgIT0gbUNvbmZpZy5tQ29kZWRGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVMYXBzZUNvbmZpZyhjb25maWcubUNvZGVkRnBzLCBjb25maWcubUNhcHR1cmVGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVMYXBzZSAiIDw8IGNvbmZpZy5tQ2FwdHVyZUZwcyA8PCAiZnBzIGFzICIgPDwgY29uZmlnLm1Db2RlZEZwcyA8PCAiZnBzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1DYXB0dXJlRnBzID0gY29uZmlnLm1DYXB0dXJlRnBzOworICAgICAgICAgICAgbUNvbmZpZy5tQ29kZWRGcHMgPSBjb25maWcubUNvZGVkRnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RhcnRBdFVzICE9IG1Db25maWcubVN0YXJ0QXRVcworICAgICAgICAgICAgICAgIHx8IChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiAhY29uZmlnLm1TdG9wcGVkKSkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0YXJ0VGltZVVzKGNvbmZpZy5tU3RhcnRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdGFydCBhdCAiIDw8IGNvbmZpZy5tU3RhcnRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RhcnRBdFVzID0gY29uZmlnLm1TdGFydEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3VzcGVuZC1yZXN1bWUKKyAgICAgICAgaWYgKGNvbmZpZy5tU3VzcGVuZGVkICE9IG1Db25maWcubVN1c3BlbmRlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN1c3BlbmQoY29uZmlnLm1TdXNwZW5kZWQsIGNvbmZpZy5tU3VzcGVuZEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiICIgPDwgKGNvbmZpZy5tU3VzcGVuZGVkID8gInN1c3BlbmQiIDogInJlc3VtZSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgYXQgIiA8PCBjb25maWcubVN1c3BlbmRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZGVkID0gY29uZmlnLm1TdXNwZW5kZWQ7CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kQXRVcyA9IGNvbmZpZy5tU3VzcGVuZEF0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgY29uZmlnLm1TdG9wcGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RvcFRpbWVVcyhjb25maWcubVN0b3BBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdG9wIGF0ICIgPDwgY29uZmlnLm1TdG9wQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgZGVsYXlVcyI7CisgICAgICAgICAgICAgICAgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoJmNvbmZpZy5tSW5wdXREZWxheVVzKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIj0iIDw8IGNvbmZpZy5tSW5wdXREZWxheVVzIDw8ICJ1cyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25maWcubUlucHV0RGVsYXlVcyA9IGNvbmZpZy5tSW5wdXREZWxheVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RvcEF0VXMgPSBjb25maWcubVN0b3BBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbG9yIGFzcGVjdHMgKGFuZHJvaWQuX2NvbG9yLWFzcGVjdHMpCisKKyAgICAgICAgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnJXMiLCBzdGF0dXMuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEMyT01YTm9kZT4gbU5vZGU7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgQ29uZmlnIG1Db25maWc7Cit9OworCitjbGFzcyBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisKK3B1YmxpYzoKKyAgICBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5Db2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIHsKKyAgICAgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7CisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+KCk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENDb2RlYzo6Q2xpZW50TGlzdGVuZXIKKworc3RydWN0IENDb2RlYzo6Q2xpZW50TGlzdGVuZXIgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICBleHBsaWNpdCBDbGllbnRMaXN0ZW5lcihjb25zdCB3cDxDQ29kZWM+ICZjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpZXJyb3JDb2RlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICB7IC8vIExvZyB0aGUgZGVhdGggb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBkaWVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBcIiVzXCIgZGllZC4iLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdG8gTWVkaWFDb2RlYy4KKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYyB8fCAhY29kZWMtPm1DYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoREVBRF9PQkpFQ1QsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8Q0NvZGVjPiBtQ29kZWM7Cit9OworCisvLyBDQ29kZWNDYWxsYmFja0ltcGwKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsIDogcHVibGljIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNDYWxsYmFja0ltcGwoQ0NvZGVjICpjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisgICAgfkNDb2RlY0NhbGxiYWNrSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgIHtSZW5kZXJlZEZyYW1lSW5mbyhtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zKX0pOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjICptQ29kZWM7Cit9OworCisvLyBDQ29kZWMKKworQ0NvZGVjOjpDQ29kZWMoKQorICAgIDogbUNoYW5uZWwobmV3IENDb2RlY0J1ZmZlckNoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxDQ29kZWNDYWxsYmFja0ltcGw+KHRoaXMpKSkgeworfQorCitDQ29kZWM6On5DQ29kZWMoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gQ0NvZGVjOjpnZXRCdWZmZXJDaGFubmVsKCkgeworICAgIHJldHVybiBtQ2hhbm5lbDsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKSB7CisgICAgc3RhdHVzX3QgZXJyID0gam9iKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgYXV0byBzZXRBbGxvY2F0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IGNvZGVjSW5mbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZjb2RlY0luZm8pKTsKKyAgICAvLyBGb3IgQ29kZWMgMi4wIGNvbXBvbmVudHMsIGNvbXBvbmVudE5hbWUgPT0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKS4KKworICAgIHNwPEFNZXNzYWdlPiBhbGxvY01zZyhuZXcgQU1lc3NhZ2Uoa1doYXRBbGxvY2F0ZSwgdGhpcykpOworICAgIGFsbG9jTXNnLT5zZXRPYmplY3QoImNvZGVjSW5mbyIsIGNvZGVjSW5mbyk7CisgICAgYWxsb2NNc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKSB7CisgICAgaWYgKGNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoImFsbG9jYXRlKCVzKSIsIGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgIG1DbGllbnRMaXN0ZW5lci5yZXNldChuZXcgQ2xpZW50TGlzdGVuZXIodGhpcykpOworCisgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CisKKyAgICAvLyBzZXQgdXAgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSB0byBhY2Nlc3MgdmVuZG9yIHN0b3JlIHBhcmFtZXRlcnMKKyAgICBjbGllbnQgPSBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0IiwgZmFsc2UpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWcucmVzZXQobmV3IElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZ3t9KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMpOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGRlc2lyZWQgY29sb3IgZm9ybWF0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAtMTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsc28gaGFuZGxlIGRlZmF1bHQgY29sb3IgZm9ybWF0IChlbmNvZGVycyByZXF1aXJlIGNvbG9yIGZvcm1hdCwgc28gdGhpcyBpcyBvbmx5CisgICAgICAgICAgICAgICAgICogbmVlZGVkIGZvciBkZWNvZGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIShjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IChzdXJmYWNlID09IG51bGxwdHIpID8gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIDogQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAgICAgLy8gTk9URTogV2UgdXNlZCB0byBpZ25vcmUgInZpZGVvLWJpdHJhdGUiIGF0IGNvbmZpZ3VyZTsgcmVwbGljYXRlCisgICAgICAgIC8vICAgICAgIHRoZSBiZWhhdmlvciBoZXJlLgorICAgICAgICBzcDxBTWVzc2FnZT4gc2RrUGFyYW1zID0gbXNnOworICAgICAgICBpbnQzMl90IHZpZGVvQml0cmF0ZTsKKyAgICAgICAgaWYgKHNka1BhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgJnZpZGVvQml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHNka1BhcmFtcyA9IG1zZy0+ZHVwKCk7CisgICAgICAgICAgICBzZGtQYXJhbXMtPnJlbW92ZUVudHJ5QXQoc2RrUGFyYW1zLT5maW5kRW50cnlCeU5hbWUoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbXAsIHNka1BhcmFtcywgQ29uZmlnOjpJU19DT05GSUcsIEMyX0RPTlRfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbnZlcnQgY29uZmlndXJhdGlvbiB0byBjMiBwYXJhbXMiKTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb25maWd1cmUgYzIgcGFyYW1zIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IHVzYWdlKDB1LCAwdSk7CisgICAgICAgIEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0IG1heElucHV0U2l6ZSgwdSwgMHUpOworCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CisgICAgICAgIH07CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUgfSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBjMmVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY29tcG9uZW50IGludGVyZmFjZTogJWQiLCBjMmVycik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSBpbmRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBvbmVudCByZXR1cm5zIHdyb25nIG51bWJlciBvZiBwYXJhbXM6IGV4cGVjdGVkICV6dSBhY3R1YWwgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5zaXplKCksIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlICYmICh1c2FnZS52YWx1ZSAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBibGluZGx5IHVzZSBjbGllbnQgc3BlY2lmaWVkIGlucHV0IHNpemUgaWYgc3BlY2lmaWVkIGFzIGNsaWVudHMKKyAgICAgICAgLy8gYXQgdGltZXMgc3BlY2lmeSB0b28gc21hbGwgc2l6ZS4gSW5zdGVhZCwgbWltaWMgdGhlIGJlaGF2aW9yIGZyb20gT01YLCB3aGVyZSB0aGUKKyAgICAgICAgLy8gY2xpZW50IHNwZWNpZmllZCBzaXplIGlzIG9ubHkgdXNlZCB0byBhc2sgZm9yIGJpZ2dlciBidWZmZXJzIHRoYW4gY29tcG9uZW50IHN1Z2dlc3RlZAorICAgICAgICAvLyBzaXplLgorICAgICAgICBpbnQzMl90IGNsaWVudElucHV0U2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplID0KKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNsaWVudElucHV0U2l6ZSkgJiYgY2xpZW50SW5wdXRTaXplID4gMDsKKyAgICAgICAgLy8gVEVNUDogZW5mb3JjZSBtaW5pbXVtIGJ1ZmZlciBzaXplIG9mIDFNQiBmb3IgdmlkZW8gZGVjb2RlcnMKKyAgICAgICAgLy8gYW5kIDE2SyAvIDRLIGZvciBhdWRpbyBlbmNvZGVycy9kZWNvZGVycworICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gZW5jb2RlciA/IDE2Mzg0IDogNDA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSAxMDQ4NTc2dTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IENTRCBmaXRzIGludG8gdGhpcyBzaXplIChpZiBkZWZpbmVkKQorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgbWF4SW5wdXRTaXplLnZhbHVlID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBtc2ctPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJXp1IiwgaXgpLmNfc3RyKCksICZjc2QpOyArK2l4KSB7CisgICAgICAgICAgICAgICAgaWYgKGNzZCAmJiBjc2QtPnNpemUoKSA+IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBkbyB0aGlzIGJhc2VkIG9uIGNvbXBvbmVudCByZXF1aXJpbmcgbGluZWFyIGFsbG9jYXRvciBmb3IgaW5wdXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpIHx8IChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIFdhcm4gdGhhdCB3ZSdyZSBvdmVycmlkaW5nIGNsaWVudCdzIG1heCBpbnB1dCBzaXplIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWNsaWVudElucHV0U2l6ZSA8IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCBtYXggaW5wdXQgc2l6ZSAlZCwgd2hpY2ggaXMgc21hbGxlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQgY29tcG9uZW50IHJlY29tbWVuZGVkICgldSk7IG92ZXJyaWRpbmcgd2l0aCBjb21wb25lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjb21tZW5kYXRpb24uIiwgY2xpZW50SW5wdXRTaXplLCBtYXhJbnB1dFNpemUudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiVGhpcyBiZWhhdmlvciBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHAgZGV2ZWxvcGVycyBkb3VibGUgY2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbnB1dCBzaXplIGlzIGluIHJlYXNvbmFibGUgcmFuZ2UuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY2xpZW50SW5wdXRTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFBhc3MgbWF4IGlucHV0IHNpemUgb24gaW5wdXQgZm9ybWF0IHRvIHRoZSBidWZmZXIgY2hhbm5lbCAoaWYgc3VwcGxpZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgb3IgYnkgYSBkZWZhdWx0KQorICAgICAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9NQVhfSU5QVVRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMl9taW4obWF4SW5wdXRTaXplLnZhbHVlLCB1aW50MzJfdChJTlQzMl9NQVgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgLy8gcHJvcGFnYXRlIEhEUiBzdGF0aWMgaW5mbyB0byBvdXRwdXQgZm9ybWF0IGZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycworICAgICAgICAgICAgLy8gaWYgY29tcG9uZW50IHN1cHBvcnRzIHRoaXMgaW5mbywgd2Ugd2lsbCB1cGRhdGUgZnJvbSBjb21wb25lbnQsIGJ1dCBvbmx5IHRoZSByYXcgcG9ydCwKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHByb3BhZ2F0ZSBpZiBjb21wb25lbnQgYWxyZWFkeSBmaWxsZWQgaXQgaW4uCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHJJbmZvOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBoZHJJbmZvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRlc2lyZWQgY29sb3IgZm9ybWF0IGZyb20gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb3BhZ2F0ZSBlbmNvZGVyIGRlbGF5IGFuZCBwYWRkaW5nIHRvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaW50IGRlbGF5ID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLWRlbGF5IiwgZGVsYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgIGludDMyX3QgbWFzazsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyBhbmQgb3V0cHV0OiAlcyIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGRvQ29uZmlnKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgbUNhbGxiYWNrLT5vbkNvbXBvbmVudENvbmZpZ3VyZWQoY29uZmlnLT5tSW5wdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiByZWFkIGl0IGZyb20gaW50ZigpIHByb3Blcmx5LgorICAgICAgICBpZiAoc3RhdGUtPmNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKSktPnBvc3QoKTsKK30KKworc3A8UGVyc2lzdGVudFN1cmZhY2U+IENDb2RlYzo6Q3JlYXRlT214SW5wdXRTdXJmYWNlKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OnV0aWxzOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXMgT214U3RhdHVzOworICAgIGFuZHJvaWQ6OnNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2UgSEdyYXBoaWNCdWZmZXJTb3VyY2U7CisgICAgT214U3RhdHVzIHM7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyU291cmNlPiBnYnM7CisgICAgYW5kcm9pZDo6UmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gb214LT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnMsICZnYnAsICZnYnNdKAorICAgICAgICAgICAgICAgICAgICBPbXhTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKSB7CisgICAgICAgICAgICAgICAgcyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICBnYnAgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBnYnMgPSBzb3VyY2U7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAodHJhbnNTdGF0dXMuaXNPaygpICYmIHMgPT0gT214U3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2JwKSwKKyAgICAgICAgICAgICAgICBzcDw6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyU291cmNlPihuZXcgTFdHcmFwaGljQnVmZmVyU291cmNlKGdicykpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3A8UGVyc2lzdGVudFN1cmZhY2U+IENDb2RlYzo6Q3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZShDcmVhdGVJbnB1dFN1cmZhY2UoKSk7CisKKyAgICBpZiAoc3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN1cmZhY2UgPSBDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKwordm9pZCBDQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBwZXJzaXN0ZW50U3VyZmFjZSA9IENyZWF0ZUNvbXBhdGlibGVJbnB1dFN1cmZhY2UoKTsKKworICAgIGlmIChwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpKSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGhpZGxJbnB1dFN1cmZhY2UgPSBJSW5wdXRTdXJmYWNlOjpjYXN0RnJvbSgKKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpKTsKKyAgICAgICAgaWYgKCFoaWRsSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29ycnVwdGVkIGlucHV0IHN1cmZhY2UiKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaGlkbElucHV0U3VyZmFjZSk7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8QzJJbnB1dFN1cmZhY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBpbnB1dFN1cmZhY2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KTsKKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN1cmZhY2UtPmdldEJ1ZmZlclNvdXJjZSgpLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIGJ1ZmZlclByb2R1Y2VyID0gcGVyc2lzdGVudFN1cmZhY2UtPmdldEJ1ZmZlclByb2R1Y2VyKCk7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0ZWQoCisgICAgICAgICAgICBpbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIG5ldyBCdWZmZXJQcm9kdWNlcldyYXBwZXIoYnVmZmVyUHJvZHVjZXIpKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjpzZXR1cElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gdHJ1ZTsKKworICAgIC8vIHdlIGFyZSBub3cgdXNpbmcgc3VyZmFjZSAtIGFwcGx5IGRlZmF1bHQgY29sb3IgYXNwZWN0cyB0byBpbnB1dCBmb3JtYXQgLSBhcyB3ZWxsIGFzCisgICAgLy8gZ2V0IGRhdGFzcGFjZQorICAgIGJvb2wgaW5wdXRGb3JtYXRDaGFuZ2VkID0gY29uZmlnLT51cGRhdGVGb3JtYXRzKGNvbmZpZy0+SVNfSU5QVVQpOworICAgIEFMT0dEKCJpbnB1dCBmb3JtYXQgJXMgdG8gJXMiLAorICAgICAgICAgICAgaW5wdXRGb3JtYXRDaGFuZ2VkID8gImNoYW5nZWQiIDogInVuY2hhbmdlZCIsCisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIC8vIGNvbmZpZ3VyZSBkYXRhc3BhY2UKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQzMl90KSA9PSBzaXplb2YoYW5kcm9pZF9kYXRhc3BhY2UpLCAiZGF0YXNwYWNlIHNpemUgbWlzbWF0Y2giKTsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgKHZvaWQpY29uZmlnLT5tSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QqKSZkYXRhU3BhY2UpOworICAgIHN1cmZhY2UtPnNldERhdGFTcGFjZShkYXRhU3BhY2UpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUNoYW5uZWwtPnNldElucHV0U3VyZmFjZShzdXJmYWNlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIC8vIHVuZG8gaW5wdXQgZm9ybWF0IHVwZGF0ZQorICAgICAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgKHZvaWQpY29uZmlnLT51cGRhdGVGb3JtYXRzKGNvbmZpZy0+SVNfSU5QVVQpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworCisgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgIHN1cmZhY2UtPmNvbmZpZ3VyZSgqY29uZmlnLT5tSVNDb25maWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJJU0NvbmZpZzogbm8gY29uZmlndXJhdGlvbiIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CisgICAgYXV0byBoaWRsVGFyZ2V0ID0gc3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpOworICAgIGlmIChoaWRsVGFyZ2V0KSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICAgICAgSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oaGlkbFRhcmdldCk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBpbnB1dCBzdXJmYWNlOiBDb3JydXB0ZWQgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUFjY2VwdGVkKGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICBhdXRvIHNldFN0YXJ0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVEFSVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFN0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0YXJ0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhcnRpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKHRvU3RhdHVzVChlcnIsIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHN0YXR1c190IGVycjIgPSBPSzsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBlcnIyID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXJyMiA9IG1DaGFubmVsLT5zdGFydChpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKKyAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzZXRSdW5uaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSdW5uaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DYWxsYmFjay0+b25TdGFydENvbXBsZXRlZCgpOworCisgICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgIGlmIChrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgICAgIGluaXRpYXRlU3RvcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluaXRpYXRlUmVsZWFzZSgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU3RvcCgpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBBTExPQ0FURUQKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgID09IFJFTEVBU0VECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFNUT1BQSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBzdG9wcGVkLCByZWxlYXNlZCwgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoU1RPUFBJTkcpOworICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c3RvcCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCBvciByZWxlYXNlIGlzIGluIHByb2dyZXNzLgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGNvbXAtPnN0b3AoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGNvbnZlcnQgZXJyIGludG8gc3RhdHVzX3QKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayAvKiA9IHRydWUgKi8pIHsKKyAgICBib29sIGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHJlbGVhc2VkIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIC8vIFdpdGggdGhlIGFsdGVyZWQgc3RhdGUgYWxsb2NhdGUoKSB3b3VsZCBmYWlsIGFuZCBjbGVhbiB1cC4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFNUQVJUSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFJVTk5JTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIC8vIElucHV0IHN1cmZhY2UgbWF5IGhhdmUgYmVlbiBzdGFydGVkLCBzbyBjbGVhbiB1cCBpcyBuZWVkZWQuCisgICAgICAgICAgICBjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0lORyk7CisgICAgfQorCisgICAgaWYgKGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQpIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIC8vIHRoaXogaG9sZHMgc3Ryb25nIHJlZiB0byB0aGlzIHdoaWxlIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KKyAgICBzcDxDQ29kZWM+IHRoaXoodGhpcyk7CisgICAgc3RkOjp0aHJlYWQoW3RoaXosIHNlbmRDYWxsYmFja10geyB0aGl6LT5yZWxlYXNlKHNlbmRDYWxsYmFjayk7IH0pLmRldGFjaCgpOworfQorCit2b2lkIENDb2RlYzo6cmVsZWFzZShib29sIHNlbmRDYWxsYmFjaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgY29tcC0+cmVsZWFzZSgpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS0+Y29tcC5yZXNldCgpOworICAgIH0KKyAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICByZXR1cm4gbUNoYW5uZWwtPnNldFN1cmZhY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxGbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChGTFVTSElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Zmx1c2goKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tGbHVzaGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tGbHVzaGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIGZsdXNoZWRXb3JrLnNwbGljZShmbHVzaGVkV29yay5lbmQoKSwgKnF1ZXVlKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPmZsdXNoKGZsdXNoZWRXb3JrKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KEZMVVNIRUQpOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICBhdXRvIHNldFJlc3VtaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVTVU1JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSZXN1bWluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5zdGFydChudWxscHRyLCBudWxscHRyKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFU1VNSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja1N0YXRlID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tTdGF0ZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5PVEU6IFdlIHVzZWQgdG8gaWdub3JlICJiaXRyYXRlIiBhdCBzZXRQYXJhbWV0ZXJzOyByZXBsaWNhdGUKKyAgICAvLyAgICAgICB0aGUgYmVoYXZpb3IgaGVyZS4KKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbXNnOworICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgcGFyYW1zID0gbXNnLT5kdXAoKTsKKyAgICAgICAgcGFyYW1zLT5yZW1vdmVFbnRyeUF0KHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKEtFWV9CSVRfUkFURSkpOworICAgIH0KKworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSAmJiBjb25maWctPm1JbnB1dFN1cmZhY2UgJiYgY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tVGltZU9mZnNldFVzKTsKKworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0YXJ0QXRVcykpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJzdG9wLXRpbWUtdXMiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdG9wQXRVcykpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgJnZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyk7CisgICAgICAgIH0KKworICAgICAgICAodm9pZCljb25maWctPm1JbnB1dFN1cmZhY2UtPmNvbmZpZ3VyZSgqY29uZmlnLT5tSVNDb25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgY29uZmlnLT5tSVNDb25maWctPm1JbnB1dERlbGF5VXMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgKHZvaWQpY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgY29tcCwgcGFyYW1zLCBDb25maWc6OklTX1BBUkFNLCBDMl9NQVlfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgIC8vIFByZWZlciB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGJ1ZmZlciBjaGFubmVsLCBzbyB0aGV5IGNhbiBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZnJhbWVzLgorICAgIC8vIFBhcmFtZXRlciBzeW5jaHJvbml6YXRpb24gaXMgbm90IGRlZmluZWQgd2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlLiBGb3Igbm93LCByb3V0ZQorICAgIC8vIHRoZXNlIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9PSBudWxscHRyCisgICAgICAgICAgICAmJiAocHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19kZWxheWVkX3BhcmFtcyIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICB8fCBjb21wLT5nZXROYW1lKCkuZmluZCgiYzIuYW5kcm9pZC4iKSA9PSAwKSkgeworICAgICAgICBtQ2hhbm5lbC0+c2V0UGFyYW1ldGVycyhjb25maWdVcGRhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKWNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX01BWV9CTE9DSyk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICBtQ2FsbGJhY2stPm9uU2lnbmFsZWRJbnB1dEVPUyhtQ2hhbm5lbC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJubyBJRFIgcmVxdWVzdCBzZW50IHNpbmNlIGNvbXBvbmVudCBpcyByZWxlYXNlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgQUxPR1YoInJlcXVlc3QgSURSIik7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PigwdSwgdHJ1ZSkpOworICAgIGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBwYXJhbXMsIEMyX01BWV9CTE9DSyk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgcXVldWUtPnNwbGljZShxdWV1ZS0+ZW5kKCksIHdvcmtJdGVtcyk7CisgICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIG1DaGFubmVsLT5vbklucHV0QnVmZmVyRG9uZShmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKK30KKwordm9pZCBDQ29kZWM6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgVGltZVBvaW50IG5vdyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIENDb2RlY1dhdGNoZG9nOjpnZXRJbnN0YW5jZSgpLT53YXRjaCh0aGlzKTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MG1zLCAiYWxsb2NhdGUiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOworICAgICAgICAgICAgYWxsb2NhdGUoKE1lZGlhQ29kZWNJbmZvICopb2JqLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50Ojpjb21taXRfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDI1MG1zLCAiY29uZmlndXJlIik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgY29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdGFydCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0YXJ0Iik7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdG9wKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RvcCIpOworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Zmx1c2hfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDUwbXMsICJmbHVzaCIpOworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJjcmVhdGVJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldElucHV0U3VyZmFjZTogeworICAgICAgICAgICAgLy8gU3VyZmFjZSBvcGVyYXRpb25zIG1heSBiZSBicmllZmx5IGJsb2NraW5nLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxMDBtcywgInNldElucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2Uoc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHF1ZXVlLT5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgc2hvdWxkUG9zdCA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KKyAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrIDogYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQoc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3RkR2Z4SW5mb3MgPSB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBzdGRHZnhJbmZvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVmLT5oYXNJbmZvKGl4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKGl4LndpdGhTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihpbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPm9uV29ya0RvbmUoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrKSwgY2hhbmdlZCA/IGNvbmZpZy0+bU91dHB1dEZvcm1hdCA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGluaXREYXRhLmhhc0NoYW5nZWQoKSA/IGluaXREYXRhLnVwZGF0ZSgpLmdldCgpIDogbnVsbHB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKKyAgICAgICAgICAgIC8vIHdhdGNoIG1lc3NhZ2UgYWxyZWFkeSBwb3N0ZWQ7IG5vLW9wLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0UoInVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXREZWFkbGluZShUaW1lUG9pbnQ6Om1heCgpLCAwbXMsICJub25lIik7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXREZWFkbGluZSgKKyAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpbnQzMl90IG11bHQgPSBzdGQ6Om1heCgxLCBwcm9wZXJ0eV9nZXRfaW50MzIoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY190aW1lb3V0X211bHQiLCAxKSk7CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRGVhZGxpbmUpOworICAgIGRlYWRsaW5lLT5zZXQobm93ICsgKHRpbWVvdXQgKiBtdWx0KSwgbmFtZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBwZW5kaW5nRGVhZGxpbmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSA8IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSB7CisgICAgICAgICAgICBuYW1lID0gZGVhZGxpbmUtPmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpICE9IFRpbWVQb2ludDo6bWF4KCkpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBjb25zdGV4cHIgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24ga1dvcmtEdXJhdGlvblRocmVzaG9sZCA9IDNzOworICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBlbGFwc2VkID0gbUNoYW5uZWwtPmVsYXBzZWQoKTsKKyAgICAgICAgaWYgKGVsYXBzZWQgPj0ga1dvcmtEdXJhdGlvblRocmVzaG9sZCkgeworICAgICAgICAgICAgbmFtZSA9ICJxdWV1ZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsYXBzZWQgPiAwcykgeworICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdlJ3JlIG5vdCBzdHVjay4KKyAgICAgICAgaWYgKHBlbmRpbmdEZWFkbGluZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBzdHVjayB5ZXQgYnV0IHN0aWxsIGhhcyBkZWFkbGluZSBjb21pbmcgdXAsCisgICAgICAgICAgICAvLyBwb3N0IHdhdGNoIG1lc3NhZ2UgdG8gY2hlY2sgYmFjayBsYXRlci4KKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXYXRjaCwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJwcmV2aW91cyBjYWxsIHRvICVzIGV4Y2VlZGVkIHRpbWVvdXQiLCBuYW1lLmNfc3RyKCkpOworICAgIGluaXRpYXRlUmVsZWFzZShmYWxzZSk7CisgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpDb2RlY0Jhc2UgKkNyZWF0ZUNvZGVjKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q0NvZGVjOworfQorCisvLyBDcmVhdGUgQ29kZWMgMi4wIGlucHV0IHN1cmZhY2UKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIENvZGVjMidzIGlucHV0IHN1cmZhY2UuCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICBpZiAoIWlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkOjpzcDxhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4+KAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2UoKSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiM2M0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19IXworI2RlZmluZSBDX0NPREVDX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisKKyNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlcjsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworY2xhc3MgQ0NvZGVjIDogcHVibGljIENvZGVjQmFzZSB7CitwdWJsaWM6CisgICAgQ0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gZ2V0QnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSBvdmVycmlkZTsKKworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBUaW1lUG9pbnQ7CisKKyAgICBzdGF0dXNfdCB0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKTsKKworICAgIHZvaWQgaW5pdGlhdGVTdG9wKCk7CisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2sgPSB0cnVlKTsKKworICAgIHZvaWQgYWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pOworICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHN0YXJ0KCk7CisgICAgdm9pZCBzdG9wKCk7CisgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgcmVsZWFzZShib29sIHNlbmRDYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGlucHV0IHN1cmZhY2UgZm9yIHRoZSBjdXJyZW50IGRldmljZSBjb25maWd1cmF0aW9uIGNvbXBhdGlibGUgd2l0aCBDQ29kZWMuCisgICAgICogVGhpcyBjb3VsZCBiZSBiYWNrZWQgYnkgdGhlIEMyIEhBTCBvciB0aGUgT01YIEhBTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZUNvbXBhdGlibGVJbnB1dFN1cmZhY2UoKTsKKworICAgIC8vLyBDcmVhdGVzIGFuIGlucHV0IHN1cmZhY2UgdG8gdGhlIE9NWCBIQUwKKyAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZU9teElucHV0U3VyZmFjZSgpOworCisgICAgLy8vIGhhbmRsZSBhIGNyZWF0ZSBpbnB1dCBzdXJmYWNlIGNhbGwKKyAgICB2b2lkIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZvaWQgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIHZvaWQgc2V0RGVhZGxpbmUoCisgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEFsbG9jYXRlLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRGbHVzaCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldElucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzLAorCisgICAgICAgIGtXaGF0V29ya0RvbmUsCisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBSRUxFQVNFRCwKKyAgICAgICAgQUxMT0NBVEVELAorICAgICAgICBGTFVTSEVELAorICAgICAgICBSVU5OSU5HLAorCisgICAgICAgIEFMTE9DQVRJTkcsICAvLyBSRUxFQVNFRCAtPiBBTExPQ0FURUQKKyAgICAgICAgU1RBUlRJTkcsICAgIC8vIEFMTE9DQVRFRCAtPiBSVU5OSU5HCisgICAgICAgIFNUT1BQSU5HLCAgICAvLyBSVU5OSU5HIC0+IEFMTE9DQVRFRAorICAgICAgICBGTFVTSElORywgICAgLy8gUlVOTklORyAtPiBGTFVTSEVECisgICAgICAgIFJFU1VNSU5HLCAgICAvLyBGTFVTSEVEIC0+IFJVTk5JTkcKKyAgICAgICAgUkVMRUFTSU5HLCAgIC8vIHtBTlkgRVhDRVBUIFJFTEVBU0VEfSAtPiBSRUxFQVNFRAorICAgIH07CisKKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgICAgICBpbmxpbmUgU3RhdGUoKSA6IG1TdGF0ZShSRUxFQVNFRCkge30KKyAgICAgICAgaW5saW5lIGludCBnZXQoKSBjb25zdCB7IHJldHVybiBtU3RhdGU7IH0KKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KGludCBuZXdTdGF0ZSkgeyBtU3RhdGUgPSBuZXdTdGF0ZTsgfQorCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbVN0YXRlOworICAgIH07CisKKyAgICBzdHJ1Y3QgTmFtZWRUaW1lUG9pbnQgeworICAgICAgICBOYW1lZFRpbWVQb2ludCgpIDogbVRpbWVQb2ludChUaW1lUG9pbnQ6Om1heCgpKSwgbU5hbWUoIiIpIHt9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmdGltZVBvaW50LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgICAgIG1UaW1lUG9pbnQgPSB0aW1lUG9pbnQ7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgVGltZVBvaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lUG9pbnQ7IH0KKyAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVQb2ludCBtVGltZVBvaW50OworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICB9OworCisgICAgTXV0ZXhlZDxTdGF0ZT4gbVN0YXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsPiBtQ2hhbm5lbDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1DbGllbnRMaXN0ZW5lcjsKKyAgICBzdHJ1Y3QgQ2xpZW50TGlzdGVuZXI7CisKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50PiBtRGVhZGxpbmU7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWcgQ29uZmlnOworICAgIE11dGV4ZWQ8Q29uZmlnPiBtQ29uZmlnOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj4gbVdvcmtEb25lUXVldWU7CisKKyAgICBmcmllbmQgY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NvZGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ19DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDQ0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSwyOTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlckNoYW5uZWwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKKwordXNpbmcgQ2FzU3RhdHVzID0gaGFyZHdhcmU6OmNhczo6VjFfMDo6U3RhdHVzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJCdWZmZXJzIikKKyAgICAgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgICAgICBtQ2hhbm5lbE5hbWUoc3RkOjpzdHJpbmcoY29tcG9uZW50TmFtZSkgKyAiOiIgKyBuYW1lKSwKKyAgICAgICAgICBtTmFtZShtQ2hhbm5lbE5hbWUuY19zdHIoKSkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5CdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGZvcm1hdCBmb3IgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgICAgICBDSEVDSyhmb3JtYXQgIT0gbnVsbHB0cik7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiBjdXJyZW50IGZvcm1hdC4KKyAgICAgKi8KKyAgICBzcDxBTWVzc2FnZT4gZHVwRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gbUZvcm1hdCAhPSBudWxscHRyID8gbUZvcm1hdC0+ZHVwKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVycyBhcmUgb3BlcmF0aW5nIHVuZGVyIGFycmF5IG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIHRoZSB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjQnVmZmVyJ3MgaWYgaW4gYXJyYXkgbW9kZTsgb3RoZXJ3aXNlLAorICAgICAqIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICopIGNvbnN0IHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGNsaWVudCBvd25zLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsgLy8vPCBuYW1lIG9mIGNvbXBvbmVudCBmb3IgZGVidWdnaW5nCisgICAgc3RkOjpzdHJpbmcgbUNoYW5uZWxOYW1lOyAvLy88IG5hbWUgb2YgY2hhbm5lbCBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBjaGFubmVsIG5hbWUKKyAgICAvLyBGb3JtYXQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhCdWZmZXJzKTsKK307CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJJbnB1dFtdIikKKyAgICAgICAgOiBCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfklucHV0QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldCBhIGJsb2NrIHBvb2wgdG8gb2J0YWluIGlucHV0IG1lbW9yeSBibG9ja3MuCisgICAgICovCisgICAgdm9pZCBzZXRQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsgbVBvb2wgPSBwb29sOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgTWVkaWFDb2RlY0J1ZmZlciBmb3IgaW5wdXQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGluZGV4LgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgbm8gbmV3IGJ1ZmZlciBjYW4gYmUgb2J0YWluZWQgYXQgdGhlIG1vbWVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciB0aGF0IGlzIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSBjb2RlYyBwcm9jZXNzLiBSZXR1cm4KKyAgICAgKiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUgYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIGlucHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZXF1ZXN0TmV3QnVmZmVyKCkuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gUG9vbCB0byBvYnRhaW4gYmxvY2tzIGZvciBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRCdWZmZXJzKTsKK307CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVycyB7CitwdWJsaWM6CisgICAgT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dCIpCisgICAgICAgIDogQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5PdXRwdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgb3V0cHV0IEMyQnVmZmVyIGZyb20gdGhlIGNvbXBvbmVudCBhbmQgb2J0YWluIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBpbmRleCBhbmQgTWVkaWFDb2RlY0J1ZmZlciBvYmplY3QuIFJldHVybnMgZmFsc2UgaWYgcmVnaXN0cmF0aW9uCisgICAgICogZmFpbHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBjb2RlYyBzcGVjaWZpYyBkYXRhIGFzIGEgYnVmZmVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICAgICAqIE1lZGlhQ29kZWMgYmVoYXZpb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKiAvKiBjc2QgKi8sCisgICAgICAgICAgICBzaXplX3QgKiAvKiBpbmRleCAqLywKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICogLyogY2xpZW50QnVmZmVyICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIG91dHB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVnaXN0ZXJCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRTa2lwQ3V0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgaW50MzJfdCBwYWRkaW5nLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIENIRUNLKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpOworICAgICAgICBtRGVsYXkgPSBkZWxheTsKKyAgICAgICAgbVBhZGRpbmcgPSBwYWRkaW5nOworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4gTm8tb3AgaWYgaXQncyBuZXZlciBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVNraXBDdXRCdWZmZXIoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZGVsYXkgPSBtRGVsYXk7CisgICAgICAgIGludDMyX3QgcGFkZGluZyA9IG1QYWRkaW5nOworICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgZGVsYXkgPSAoKGludDY0X3QpZGVsYXkgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgcGFkZGluZyA9ICgoaW50NjRfdClwYWRkaW5nICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgfQorICAgICAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Ym1pdCBidWZmZXIgdG8gU2tpcEN1dEJ1ZmZlciBvYmplY3QsIGlmIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5zdWJtaXQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIFNraXBDdXRCdWZmZXIgb2JqZWN0IHRvIHRoZSBvdGhlciBCdWZmZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihjb25zdCBzcDxTa2lwQ3V0QnVmZmVyPiAmc2NiKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gc2NiOworICAgIH0KKworICAgIHZvaWQgaGFuZGxlSW1hZ2VEYXRhKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGFDYW5kaWRhdGUgPSBidWZmZXItPmdldEltYWdlRGF0YSgpOworICAgICAgICBpZiAoaW1hZ2VEYXRhQ2FuZGlkYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpCisgICAgICAgICAgICAgICAgfHwgaW1hZ2VEYXRhQ2FuZGlkYXRlLT5zaXplKCkgIT0gaW1hZ2VEYXRhLT5zaXplKCkKKyAgICAgICAgICAgICAgICB8fCBtZW1jbXAoaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCksIGltYWdlRGF0YS0+ZGF0YSgpLCBpbWFnZURhdGEtPnNpemUoKSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgaW1hZ2UtZGF0YSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBkdXBGb3JtYXQoKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhQ2FuZGlkYXRlKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIqKWltYWdlRGF0YUNhbmRpZGF0ZS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDAgJiYgaW1nLT5tVHlwZSAhPSBpbWctPk1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TVFJJREUsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgc3RyaWRlID0gJWQiLCBtTmFtZSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMSAmJiBzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCkgLyBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NMSUNFX0hFSUdIVCwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHZzdHJpZGUgPSAlZCIsIG1OYW1lLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRGb3JtYXQobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0Rm9ybWF0KG5ld0Zvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTa2lwQ3V0QnVmZmVyPiBtU2tpcEN1dEJ1ZmZlcjsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1EZWxheTsKKyAgICBpbnQzMl90IG1QYWRkaW5nOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBwcmV2U2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBpZiAocHJldlNpemUgIT0gMHUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICV6dSBieXRlcyIsIG1OYW1lLCBwcmV2U2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0QnVmZmVycyk7Cit9OworCituYW1lc3BhY2UgeworCitjb25zdCBzdGF0aWMgc2l6ZV90IGtTbW9vdGhuZXNzRmFjdG9yID0gNDsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga1JlbmRlcmluZ0RlcHRoID0gMzsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga0xpbmVhckJ1ZmZlclNpemUgPSAxMDQ4NTc2OworLy8gVGhpcyBjYW4gZml0IDRLIFJHQkEgZnJhbWUsIGFuZCBtb3N0IGxpa2VseSBjbGllbnQgd29uJ3QgbmVlZCBtb3JlIHRoYW4gdGhpcy4KK2NvbnN0IHN0YXRpYyBzaXplX3Qga01heExpbmVhckJ1ZmZlclNpemUgPSAzODQwICogMjE2MCAqIDQ7CisKKy8qKgorICogU2ltcGxlIGxvY2FsIGJ1ZmZlciBwb29sIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAqLworY2xhc3MgTG9jYWxCdWZmZXJQb29sIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TG9jYWxCdWZmZXJQb29sPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExvY2FsQnVmZmVyUG9vbCBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbENhcGFjaXR5ICBtYXggdG90YWwgc2l6ZSBvZiBidWZmZXJzIG1hbmFnZWQgYnkgdGhpcyBwb29sLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBuZXdseSBjcmVhdGVkIHBvb2wgb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBDcmVhdGUoc2l6ZV90IHBvb2xDYXBhY2l0eSkgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4obmV3IExvY2FsQnVmZmVyUG9vbChwb29sQ2FwYWNpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gQUJ1ZmZlciBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCB8Y2FwYWNpdHl8LgorICAgICAqCisgICAgICogXHBhcmFtICAgY2FwYWNpdHkgIHJlcXVlc3RlZCBjYXBhY2l0eQorICAgICAqIFxyZXR1cm4gIG51bGxwdHIgaWYgdGhlIHBvb2wgY2FwYWNpdHkgaXMgcmVhY2hlZAorICAgICAqICAgICAgICAgIGFuIEFCdWZmZXIgb2JqZWN0IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbVBvb2wuYmVnaW4oKSwgbVBvb2wuZW5kKCksCisgICAgICAgICAgICAgICAgW2NhcGFjaXR5XShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMuY2FwYWNpdHkoKSA+PSBjYXBhY2l0eTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Qb29sLmVuZCgpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSgqaXQpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgbVBvb2wuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Qb29sLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtVXNlZFNpemUgLT0gbVBvb2wuYmFjaygpLmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAgbVBvb2wucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibVVzZWRTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSwgbVBvb2xDYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtVXNlZFNpemUsIGNhcGFjaXR5LCBtUG9vbENhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMoY2FwYWNpdHkpOworICAgICAgICBtVXNlZFNpemUgKz0gdmVjLmNhcGFjaXR5KCk7CisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSh2ZWMpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBBQnVmZmVyIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAgICAgKi8KKyAgICBjbGFzcyBWZWN0b3JCdWZmZXIgOiBwdWJsaWMgOjphbmRyb2lkOjpBQnVmZmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBWZWN0b3JCdWZmZXIgYnkgdGFraW5nIHRoZSBvd25lcnNoaXAgb2Ygc3VwcGxpZWQgdmVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmVjICAgYmFja2luZyB2ZWN0b3Igb2YgdGhlIGJ1ZmZlci4gdGhpcyBvYmplY3QgdGFrZXMKKyAgICAgICAgICogICAgICAgICAgICAgIG93bmVyc2hpcCBhdCBjb25zdHJ1Y3Rpb24uCisgICAgICAgICAqIFxwYXJhbSBwb29sICBhIExvY2FsQnVmZmVyUG9vbCBvYmplY3QgdG8gcmV0dXJuIHRoZSB2ZWN0b3IgYXQKKyAgICAgICAgICogICAgICAgICAgICAgIGRlc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgVmVjdG9yQnVmZmVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmcG9vbCkKKyAgICAgICAgICAgIDogQUJ1ZmZlcih2ZWMuZGF0YSgpLCB2ZWMuY2FwYWNpdHkoKSksCisgICAgICAgICAgICAgIG1WZWMoc3RkOjptb3ZlKHZlYykpLAorICAgICAgICAgICAgICBtUG9vbChwb29sKSB7CisgICAgICAgIH0KKworICAgICAgICB+VmVjdG9yQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gcG9vbCA9IG1Qb29sLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChwb29sKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgcG9vbCBpcyBhbGl2ZSwgcmV0dXJuIHRoZSB2ZWN0b3IgYmFjayB0byB0aGUgcG9vbCBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gaXQgY2FuIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgICAgIHBvb2wtPnJldHVyblZlY3RvcihzdGQ6Om1vdmUobVZlYykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtVmVjOworICAgICAgICBzdGQ6OndlYWtfcHRyPExvY2FsQnVmZmVyUG9vbD4gbVBvb2w7CisgICAgfTsKKworICAgIE11dGV4IG1NdXRleDsKKyAgICBzaXplX3QgbVBvb2xDYXBhY2l0eTsKKyAgICBzaXplX3QgbVVzZWRTaXplOworICAgIHN0ZDo6bGlzdDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbVBvb2w7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY29uc3RydWN0aW5nIG5vbi1tYW5hZ2VkIExvY2FsQnVmZmVyUG9vbC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBMb2NhbEJ1ZmZlclBvb2woc2l6ZV90IHBvb2xDYXBhY2l0eSkKKyAgICAgICAgOiBtUG9vbENhcGFjaXR5KHBvb2xDYXBhY2l0eSksIG1Vc2VkU2l6ZSgwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSBiYWNrIHRoZSBvd25lcnNoaXAgb2YgdmVjIGZyb20gdGhlIGRlc3RydWN0ZWQgVmVjdG9yQnVmZmVyIGFuZCBwdXQKKyAgICAgKiBpdCBpbiBmcm9udCBvZiB0aGUgcG9vbC4KKyAgICAgKi8KKyAgICB2b2lkIHJldHVyblZlY3RvcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBtUG9vbC5wdXNoX2Zyb250KHN0ZDo6bW92ZSh2ZWMpKTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMb2NhbEJ1ZmZlclBvb2wpOworfTsKKworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZsb2NhbEJ1ZmZlclBvb2wpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBsYWNrcyB3aWR0aCBvciBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmZXRjaCBncmFwaGljIGJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgW2xvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQnVmZmVyUG9vbC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIH0pOworfQorCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisvKioKKyAqIEZsZXhpYmxlIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgRmxleEJ1ZmZlcnNJbXBsIHsKK3B1YmxpYzoKKyAgICBGbGV4QnVmZmVyc0ltcGwoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBtSW1wbE5hbWUoc3RkOjpzdHJpbmcobmFtZSkgKyAiLkltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gZW1wdHkgc2xvdCBmb3IgYSBidWZmZXIgYW5kIHJldHVybiB0aGUgaW5kZXguIElmIHRoZXJlJ3Mgbm8KKyAgICAgKiBlbXB0eSBzbG90LCBqdXN0IGFkZCBvbmUgYXQgdGhlIGVuZCBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlcltpbl0gIGEgbmV3IGJ1ZmZlciB0byBhc3NpZ24gYSBzbG90LgorICAgICAqIFxyZXR1cm4gICAgICAgICAgICBpbmRleCBvZiB0aGUgYXNzaWduZWQgc2xvdC4KKyAgICAgKi8KKyAgICBzaXplX3QgYXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGJ1ZmZlciwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSB9KTsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2xvdCBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXNseSBhc3NpZ25lZCBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlCisgICAgICogdW50aWwgdGhlIHJldHVybmVkIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBhc3NpZ25lZCBhIHNsb3QuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkIGZyb20gYSBzbG90CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZWxlYXNlU2xvdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAocmVsZWFzZSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wQnVmZmVyIHx8IGNvbXBCdWZmZXIgIT0gYzJidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGJ1ZmZlciAjJXp1IiwgbU5hbWUsIGkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBBTE9HVigiWyVzXSBidWZmZXJzIGFyZSBmbHVzaGVkICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCkpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5iZWdpbigpLCBtQnVmZmVycy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeS5jbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCisvKioKKyAqIFN0YXRpYyBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBmaXhlZC1zaXplIGFycmF5LgorICovCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzQXJyYXlJbXBsKCkKKyAgICAgICAgOiBtSW1wbE5hbWUoIkJ1ZmZlcnNBcnJheUltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGJ1ZmZlciBhcnJheSBmcm9tIHRoZSBvcmlnaW5hbCB8aW1wbHwuIFRoZSBidWZmZXJzIGtub3duIGJ5CisgICAgICogdGhlIGNsaWVudCBpcyBwcmVzZXJ2ZWQsIGFuZCB0aGUgZW1wdHkgc2xvdHMgYXJlIHBvcHVsYXRlZCBzbyB0aGF0IHRoZQorICAgICAqIGFycmF5IHNpemUgaXMgYXQgbGVhc3QgfG1pblNpemV8LgorICAgICAqCisgICAgICogXHBhcmFtIGltcGxbaW5dICAgICAgRmxleEJ1ZmZlcnNJbXBsIG9iamVjdCB1c2VkIHNvIGZhci4KKyAgICAgKiBccGFyYW0gbWluU2l6ZVtpbl0gICBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBhcnJheS4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGVbaW5dICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBhIGNsaWVudCBidWZmZXIgZm9yIGFuIGVtcHR5IHNsb3QuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGxOYW1lID0gaW1wbC5tSW1wbE5hbWUgKyAiW05dIjsKKyAgICAgICAgbU5hbWUgPSBtSW1wbE5hbWUuY19zdHIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbXBsLm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IGltcGwubUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50ID0gKGNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgIGlmICghb3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IGFsbG9jYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBjbGllbnRCdWZmZXIsIGltcGwubUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlciwgb3duZWRCeUNsaWVudCB9KTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb252ZXJ0ZWQgJXp1IGJ1ZmZlcnMgdG8gYXJyYXkgbW9kZSBvZiAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpLCBtaW5TaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyBpIDwgbWluU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvY2F0ZSgpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWIgYSBidWZmZXIgZnJvbSB0aGUgdW5kZXJseWluZyBhcnJheSB3aGljaCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleFtvdXRdICAgIGluZGV4IG9mIHRoZSBzbG90LgorICAgICAqIFxwYXJhbSBidWZmZXJbb3V0XSAgIHRoZSBtYXRjaGluZyBidWZmZXIuCisgICAgICogXHBhcmFtIG1hdGNoW2luXSAgICAgYSBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgdGhlIGJ1ZmZlciBtYXRjaGVzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhIG9yIG5vdC4KKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICBpZiBzdWNjZXNzZnVsLAorICAgICAqICAgICAgICAgV09VTERfQkxPQ0sgIGlmIHNsb3RzIGFyZSBiZWluZyB1c2VkLAorICAgICAqICAgICAgICAgTk9fTUVNT1JZICAgIGlmIG5vIHNsb3QgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGV2ZW4gdGhvdWdoIGl0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBncmFiQnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gKmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpPiBtYXRjaCA9CisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKSB7IHJldHVybiB0cnVlOyB9KSB7CisgICAgICAgIC8vIGFsbEJ1ZmZlcnNEb250TWF0Y2ggcmVtYWlucyB0cnVlIGlmIGFsbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgYnV0CisgICAgICAgIC8vIG1hdGNoKCkgcmV0dXJucyBmYWxzZSBmb3IgZXZlcnkgYnVmZmVyLgorICAgICAgICBib29sIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2gobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+c2V0UmFuZ2UoMCwgKCpidWZmZXIpLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxCdWZmZXJzRG9udE1hdGNoID8gTk9fTUVNT1JZIDogV09VTERfQkxPQ0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBzbG90IGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUgdW50aWwgdGhlIHJldHVybmVkCisgICAgICogQzJCdWZmZXIgb2JqZWN0IGlzIGZyZWVkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyW2luXSAgICAgICAgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IGdyYWJiZWQuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkCisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZXR1cm5CdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gQ2xpZW50IHJldHVybmVkIGEgYnVmZmVyIGl0IGRvZXMgbm90IG93biBhY2NvcmRpbmcgdG8gb3VyIHJlY29yZDogJXp1IiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSAlczogbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIChpbmRleD0lenUpIiwgbU5hbWUsIF9fZnVuY19fLCBpbmRleCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IGNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb2RlYyByZWxlYXNlZCBhIGJ1ZmZlciBvd25lZCBieSBjbGllbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKGluZGV4ICV6dSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dShhcnJheSBtb2RlKSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciAoYXJyYXkgbW9kZSkiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB8YXJyYXl8IHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqCisgICAgICogXHBhcmFtIGFycmF5W291dF0gIGFuIGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKi8KKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgICAgICBmb3IgKGNvbnN0IEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBhcnJheS0+cHVzaChlbnRyeS5jbGllbnRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBmb3IgKEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBlbnRyeS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2Moc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2MoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5vd25lZEJ5Q2xpZW50OworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworY2xhc3MgSW5wdXRCdWZmZXJzQXJyYXkgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBJbnB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W05dIikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgfklucHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworICAgIH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoaW5kZXgsICZjMkJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICAgICAqYnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZXR1cm5CdWZmZXIoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCdWZmZXJzQXJyYXlJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFySW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFySW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMUQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICh2b2lkKW1Gb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBpbnB1dCBzaXplCisgICAgICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gYWxsb2MoKHNpemVfdCljYXBhY2l0eSk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjFELUlucHV0W05dIikpOworICAgICAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgW3RoaXMsIGNhcGFjaXR5XSAoKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsgcmV0dXJuIGFsbG9jKGNhcGFjaXR5KTsgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiBhbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhzaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIDogcHVibGljIExpbmVhcklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICZkZWFsZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvLAorICAgICAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtLAorICAgICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIkVuY3J5cHRlZElucHV0IikKKyAgICAgICAgOiBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbVVzYWdlKHswLCAwfSksCisgICAgICAgICAgbURlYWxlcihkZWFsZXIpLAorICAgICAgICAgIG1DcnlwdG8oY3J5cHRvKSwKKyAgICAgICAgICBtSGVhcFNlcU51bShoZWFwU2VxTnVtKSB7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQsIDAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSW5wdXRTbG90czsgKytpKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnkgPSBtRGVhbGVyLT5hbGxvY2F0ZShjYXBhY2l0eSk7CisgICAgICAgICAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gZGVhbGVyOiBvbmx5ICV6dSBzbG90cyBhbGxvY2F0ZWQiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVtb3J5VmVjdG9yLnB1c2hfYmFjayh7c3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPigpLCBtZW1vcnl9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIH5FbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvYyhzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7CisgICAgICAgIHNpemVfdCBzbG90ID0gMDsKKyAgICAgICAgZm9yICg7IHNsb3QgPCBtTWVtb3J5VmVjdG9yLnNpemUoKTsgKytzbG90KSB7CisgICAgICAgICAgICBpZiAobU1lbW9yeVZlY3RvcltzbG90XS5ibG9jay5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBtZW1vcnkgPSBtTWVtb3J5VmVjdG9yW3Nsb3RdLm1lbW9yeTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhzaXplLCBtVXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBtTWVtb3J5VmVjdG9yW3Nsb3RdLmJsb2NrID0gYmxvY2s7CisgICAgICAgIHJldHVybiBuZXcgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIobUZvcm1hdCwgYmxvY2ssIG1lbW9yeSwgbUhlYXBTZXFOdW0pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMk1lbW9yeVVzYWdlIG1Vc2FnZTsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtTWVtb3J5VmVjdG9yOworfTsKKworY2xhc3MgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtTWV0YUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpLAorICAgICAgICAgIG1TdG9yZShHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCkpIHsgfQorICAgIH5HcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3RvcmUtPmZldGNoQWxsb2NhdG9yKG1Qb29sLT5nZXRBbGxvY2F0b3JJZCgpLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3A8R3JhcGhpY01ldGFkYXRhQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgR3JhcGhpY01ldGFkYXRhQnVmZmVyKG1Gb3JtYXQsIGFsbG9jKTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjJELU1ldGFJbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtmb3JtYXQgPSBtRm9ybWF0LCBhbGxvY10oKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIoZm9ybWF0LCBhbGxvYyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IG1TdG9yZTsKK307CisKK2NsYXNzIEdyYXBoaWNJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljSW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgIGtNYXhMaW5lYXJCdWZmZXJTaXplICogbnVtSW5wdXRTbG90cykpIHsgfQorICAgIH5HcmFwaGljSW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBpbnB1dCBzaXplCisgICAgICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBuZXdCdWZmZXIgPSBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtQkItSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBsYnApOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKiwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqLCBib29sKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gMHU7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAmYzJCdWZmZXIsCisgICAgICAgICAgICAgICAgW2NzZF0oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmJhc2UoKSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50QnVmZmVyLT5jYXBhY2l0eSgpID49IGNzZC0+ZmxleENvdW50KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGMyQnVmZmVyLT5iYXNlKCksIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGMyQnVmZmVyLT5zZXRSYW5nZSgwLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWZsdXNoZWRXb3JrOworICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jOworICAgICAgICBzd2l0Y2ggKGMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSOiB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2sgPSBjMmJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA8IGtNYXhMaW5lYXJCdWZmZXJTaXplIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gYmxvY2suc2l6ZSgpICogMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbG9jID0gW2Zvcm1hdCA9IG1Gb3JtYXQsIHNpemVdIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemUpKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydAorICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM6ICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpJTlZBTElEOiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1M6ICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1M6ICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIHR5cGU6ICVkIiwgKGludCljMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1JbXBsLnJlYWxsb2MoYWxsb2MpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCdWZmZXJzQXJyYXlJbXBsIG1JbXBsOworfTsKKworY2xhc3MgRmxleE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRmxleE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlZ2lzdGVyZWQgYnVmZmVyICV6dSIsIG1OYW1lLCAqaW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBMb2NhbExpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgdHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKG1Ta2lwQ3V0QnVmZmVyKTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBhbGxvY2F0ZUFycmF5QnVmZmVyKCk7IH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwLgorICAgICAqCisgICAgICogXHJldHVybiAgYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCB0byB3cmFwIHxidWZmZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3QgZm9yIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlCisgICAgICogdXNlZCBhcyBhbiBlbXB0eSBhcnJheSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIEZsZXhPdXRwdXRCdWZmZXJzOjpmbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcigwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm9uLWxpbmVhciBidWZmZXIgJWQiLCBtTmFtZSwgYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBsaW5lYXIgb3V0cHV0IGJ1ZmZlcnMgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgICAgICAvLyBXZSBleHBlY3Qgb25lIGFuZCBvbmx5IG9uZSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBidWZmZXIpOworICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBvdXRwdXQgc2l6ZQorICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfQorfTsKKworY2xhc3MgR3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0KTsKKyAgICB9Cit9OworCitjbGFzcyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1PdXRwdXRTbG90cykpIHsgfQorICAgIH5SYXdHcmFwaGljT3V0cHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyYnVmZmVyID0gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICByZXR1cm4gYzJidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDo6UXVldWVHdWFyZCgKKyAgICAgICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jICZzeW5jKSA6IG1TeW5jKHN5bmMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU3luYy5tR3VhcmRMb2NrKTsKKyAgICAvLyBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCB0aGF0IG1TeW5jIGlzIG5vdCB1bmRlciBzdGF0ZSB0cmFuc2l0aW9uLAorICAgIC8vIGFzIHdlIGFyZSBob2xkaW5nIGl0cyBtdXRleC4KKworICAgIE11dGV4ZWQ8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1TeW5jLm1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICsrY291bnQtPnZhbHVlOworICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgfQorfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjp+UXVldWVHdWFyZCgpIHsKKyAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgLy8gV2UgYXJlIG5vdCBob2xkaW5nIG1HdWFyZExvY2sgYXQgdGhpcyBwb2ludCBzbyB0aGF0IFF1ZXVlU3luYzo6c3RvcCgpIGNhbgorICAgICAgICAvLyBrZWVwIGhvbGRpbmcgdGhlIGxvY2sgdW50aWwgbUNvdW50IHJlYWNoZXMgemVyby4KKyAgICAgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICAgICAgLS1jb3VudC0+dmFsdWU7CisgICAgICAgIGNvdW50LT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIC8vIElmIHN0b3BwZWQsIGl0IGdvZXMgdG8gcnVubmluZyBzdGF0ZTsgb3RoZXJ3aXNlIG5vLW9wLgorICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgY291bnQtPnZhbHVlID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBIb2xkaW5nIG1HdWFyZExvY2sgaGVyZSBibG9ja3MgY3JlYXRpb24gb2YgYWRkaXRpb25hbCBRdWV1ZUd1YXJkIG9iamVjdHMsIHNvCisgICAgLy8gbUNvdW50IGNhbiBvbmx5IGRlY3JlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRocmVhZHMgdGhhdCBhY3F1aXJlZCB0aGUgbG9jaworICAgIC8vIGFyZSBhbGxvd2VkIHRvIGZpbmlzaCBleGVjdXRpb24gYnV0IGFkZGl0aW9uYWwgdGhyZWFkcyB0cnlpbmcgdG8gYWNxdWlyZQorICAgIC8vIHRoZSBsb2NrIGF0IHRoaXMgcG9pbnQgd2lsbCBibG9jaywgYW5kIHRoZW4gZ2V0IFF1ZXVlR3VhcmQgYXQgU1RPUFBFRAorICAgIC8vIHN0YXRlLgorICAgIHdoaWxlIChjb3VudC0+dmFsdWUgIT0gMCkgeworICAgICAgICBjb3VudC53YWl0Rm9yQ29uZGl0aW9uKGNvdW50LT5jb25kKTsKKyAgICB9CisgICAgY291bnQtPnZhbHVlID0gLTE7Cit9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OlJlb3JkZXJTdGFzaCgpIHsKKyAgICBjbGVhcigpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Y2xlYXIoKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKKyAgICBtRGVwdGggPSAwOworICAgIG1LZXkgPSBDMkNvbmZpZzo6T1JESU5BTDsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmZsdXNoKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXREZXB0aCh1aW50MzJfdCBkZXB0aCkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtRGVwdGggPSBkZXB0aDsKK30KK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGF1dG8gaXQgPSBtU3Rhc2guYmVnaW4oKTsKKyAgICBmb3IgKDsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXNoLmVtcGxhY2UoaXQsIGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1OdW1JbnB1dFNsb3RzKGtTbW9vdGhuZXNzRmFjdG9yKSwKKyAgICAgIG1OdW1PdXRwdXRTbG90cyhrU21vb3RobmVzc0ZhY3RvciksCisgICAgICBtRGVsYXkoMCksCisgICAgICBtRnJhbWVJbmRleCgwdSksCisgICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXgoMHUpLAorICAgICAgbU1ldGFNb2RlKE1PREVfTk9ORSksCisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICBtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzID0ga1Ntb290aG5lc3NGYWN0b3IgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycygiIikpOworfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjp+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpIHsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1EZWFsZXIgIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA+PSAwKSB7CisgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChtSGVhcFNlcU51bSk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgbUNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC0+Z2V0TmFtZSgpICsgU3RyaW5nUHJpbnRmKCIjJWQiLCBpbnQodWludHB0cl90KGNvbXBvbmVudC5nZXQoKSkgJSA5OTcpKTsKKyAgICBtTmFtZSA9IG1Db21wb25lbnROYW1lLmNfc3RyKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgQUxPR1YoIlslc10gc2V0SW5wdXRTdXJmYWNlIiwgbU5hbWUpOworICAgIG1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5jb25uZWN0KG1Db21wb25lbnQpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbUlucHV0U3VyZmFjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVycyBhZnRlciBFT1MgaWdub3JlZCAoJWxsZCB1cykiLCBtTmFtZSwgKGxvbmcgbG9uZyl0aW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaW50MzJfdCB0bXAgPSAwOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIC8vIFdPUktBUk9VTkQ6IHVudGlsIGNvZGVjcyBzdXBwb3J0IGhhbmRsaW5nIHdvcmsgYWZ0ZXIgRU9TIGFuZCBtYXggb3V0cHV0IHNpemluZywgdXNlIHRpbWVzdGFtcAorICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhY2hpZXZlIGltYWdlIGVuY29kaW5nIHZpYSB2aWRlbyBjb2RlYywgYW5kIHRvIGNvbnN0cmFpbiBlbmNvZGVkIG91dHB1dC4KKyAgICAvLyBLZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICB1aW50NjRfdCBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gcXVldWVkQnVmZmVyczsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgIH0gZWxzZSBpZiAoZW9zKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIC8vIFRPRE86IGZpbGwgaW5mbydzCisKKyAgICB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrUXVldWVkKAorICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKKyAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUocXVldWVkRnJhbWVJbmRleCk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBlb3MgJiYgYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgLy8gV09SS0FST1VORDoga2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5jbGVhcigpOworCisgICAgICAgIGl0ZW1zLmNsZWFyKCk7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCisgICAgICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgYm9vbCByZWxlYXNlZCA9ICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyICVzcmVsZWFzZWQiLCBtTmFtZSwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CisgICAgfQorCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBzZXRQYXJhbWV0ZXJzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBydW5uaW5nIHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIG1QYXJhbXNUb0JlU2V0Lmluc2VydChtUGFyYW1zVG9CZVNldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuZW5kKCkpKTsKKyAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGJvb2wgc2VjdXJlLCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisKKyAgICBpZiAoIWhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgc3A8RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI+IGVuY3J5cHRlZEJ1ZmZlcigoRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgKilidWZmZXIuZ2V0KCkpOworCisgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKKyAgICBzc2l6ZV90IGNvZGVjRGF0YU9mZnNldCA9IDA7CisgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0cikgeworICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9IGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNvdXJjZSk7CisgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoCisgICAgICAgICAgICAgICAga2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBidWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50KG1EZWNyeXB0RGVzdGluYXRpb24sIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNyY0J1ZmZlcik7CisKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEU7CisgICAgICAgICAgICBkc3RCdWZmZXIuc2VjdXJlTWVtb3J5ID0gaGlkbF9oYW5kbGUoZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQ2FzU3RhdHVzIHN0YXR1cyA9IENhc1N0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBzY3RybCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhc1N0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBDYXNTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkLCByZXN1bHQ9JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlslc10gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIG1OYW1lLCByZXN1bHQpOworCisgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCkgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR1YoIlslc10gV2UncmUgbm90IHJ1bm5pbmcgLS0tIG5vIGlucHV0IGJ1ZmZlciByZXBvcnRlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpIHsKKyAgICBpZiAobUlucHV0TWV0RW9zIHx8CisgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgfHwKKyAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtT3V0cHV0U2xvdHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtSW5wdXRTbG90cykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZpbkJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBuZXcgYnVmZmVyIGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBuZXcgaW5wdXQgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgaW5CdWZmZXIuZ2V0KCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGluQnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIEFMT0dWKCJbJXNdIHJlbmRlck91dHB1dEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOworICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTk9URTogc29tZSBhcHBzIHRyeSB0byByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCB0aW1lc3RhbXAgYW5kL29yIHJlbmRlcgorICAgIC8vICAgICAgIHNldCB0byB0cnVlLgorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgLy8gaW5wdXQgYnVmZmVyIGZlZWRpbmcgbWF5IGhhdmUgYmVlbiBnYXRlZCBieSBwZW5kaW5nIG91dHB1dCBidWZmZXJzCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICBpZiAoIWMyQnVmZmVyKSB7CisgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gVGhlIGFwcCBpcyBjYWxsaW5nIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3IgcmVuZGVyPXRydWUgd2l0aCBub24tdmlkZW8gYnVmZmVycy4gQXBwcyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgImNhbGwgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggcmVuZGVyPWZhbHNlIGZvciB0aG9zZS4iLAorICAgICAgICAgICAgICAgICAgbU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyNpZiAwCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm9QYXJhbXMgPSBjMkJ1ZmZlci0+aW5mbygpOworICAgIEFMT0dWKCJbJXNdIHF1ZXVpbmcgZ2Z4IGJ1ZmZlciB3aXRoICV6dSBpbmZvcyIsIG1OYW1lLCBpbmZvUGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGluZm9QYXJhbXMpIHsKKyAgICAgICAgQVN0cmluZyByZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggKyAzIDwgaW5mby0+c2l6ZSgpOyBpeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoaXgpIHJlcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICByZXMuYXBwZW5kKCooKGludDMyX3QqKWluZm8uZ2V0KCkgKyAoaXggLyA0KSkpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIgIFslc10iLCByZXMuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+IHJvdGF0aW9uID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKKyAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CisgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfSCA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gMTgwIGRlZ3JlZXMKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfViA6IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8vIDkwIGRlZ3JlZXMgY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4gc3VyZmFjZVNjYWxpbmcgPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIHVpbnQzMl90IHZpZGVvU2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c7CisgICAgaWYgKHN1cmZhY2VTY2FsaW5nKSB7CisgICAgICAgIHZpZGVvU2NhbGluZ01vZGUgPSBzdXJmYWNlU2NhbGluZy0+dmFsdWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGFzcGFjZSBmcm9tIGZvcm1hdCBhcyBpdCBoYXMgdGhlIGRlZmF1bHQgYXNwZWN0cyBhbHJlYWR5IGFwcGxpZWQKKyAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisgICAgKHZvaWQpYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpOworCisgICAgLy8gSERSIHN0YXRpYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBoZHJTdGF0aWNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgLy8gSERSMTAgcGx1cyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3MuZnJvbnQoKTsKKworICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgdGltZXN0YW1wTnMsCisgICAgICAgICAgICBmYWxzZSwgLy8gZHJvcHBhYmxlCisgICAgICAgICAgICBkYXRhU3BhY2UsCisgICAgICAgICAgICBSZWN0KGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5sZWZ0LAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkucmlnaHQoKSwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKKyAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCisgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOworICAgIGlmIChoZHJTdGF0aWNJbmZvIHx8IGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgSGRyTWV0YWRhdGEgaGRyOworICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgeworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0geworICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAgICAgLm1heENvbnRlbnRMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzID0gSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMzsKKyAgICAgICAgICAgIGhkci5zbXB0ZTIwODYgPSBzbXB0ZTIwODZfbWV0YTsKKyAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CisgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBxYmkuc2V0SGRyTWV0YWRhdGEoaGRyKTsKKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgaGF2ZSBkaXJ0eSByZWdpb25zCisgICAgcWJpLnNldFN1cmZhY2VEYW1hZ2UoUmVnaW9uOjpJTlZBTElEX1JFR0lPTik7CisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAwOworICAgICh2b2lkKWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CisgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKG1lZGlhVGltZVVzLCB0aW1lc3RhbXBOcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OmRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIEFMT0dWKCJbJXNdIGRpc2NhcmRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMgJiYgKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgcmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE1lZGlhQ29kZWMgZGlzY2FyZGVkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICB9CisKKyAgICAoKmJ1ZmZlcnMpLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1PdXRwdXRTbG90cyk7CisgICAgfQorCisgICAgKCpidWZmZXJzKS0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KDApOworICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5KDApOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJmlTdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJm9TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJnJlb3JkZXJEZXB0aCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlcktleSwKKyAgICAgICAgICAgICAgICAmaW5wdXREZWxheSwKKyAgICAgICAgICAgICAgICAmcGlwZWxpbmVEZWxheSwKKyAgICAgICAgICAgICAgICAmb3V0cHV0RGVsYXksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgaWYgKGVyciA9PSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgaWYgKCFpU3RyZWFtRm9ybWF0IHx8ICFvU3RyZWFtRm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHJlb3JkZXJEZXB0aCkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVvcmRlcktleSkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgaW5wdXREZWxheVZhbHVlID0gaW5wdXREZWxheSA/IGlucHV0RGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXlWYWx1ZSA9IHBpcGVsaW5lRGVsYXkgPyBwaXBlbGluZURlbGF5LnZhbHVlIDogMDsKKyAgICB1aW50MzJfdCBvdXRwdXREZWxheVZhbHVlID0gb3V0cHV0RGVsYXkgPyBvdXRwdXREZWxheS52YWx1ZSA6IDA7CisKKyAgICBtTnVtSW5wdXRTbG90cyA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIG1OdW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5VmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICBtRGVsYXkgPSBpbnB1dERlbGF5VmFsdWUgKyBwaXBlbGluZURlbGF5VmFsdWUgKyBvdXRwdXREZWxheVZhbHVlOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQXJyYXlNb2RlID0gZmFsc2U7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZXRhTW9kZSA9PSBNT0RFX0FOVykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNJbnB1dEJ1ZmZlcnMobU51bUlucHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURlYWxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKGNhcGFjaXR5LCBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAobU51bUlucHV0U2xvdHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0RGVzdGluYXRpb24gPSBtRGVhbGVyLT5hbGxvY2F0ZSgoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKG1EZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgbURlYWxlciwgbUNyeXB0bywgbUhlYXBTZXFOdW0sIChzaXplX3QpY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgICAgICBmb3JjZUFycmF5TW9kZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQoaW5wdXRGb3JtYXQpOworCisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICgqYnVmZmVycyktPnNldFBvb2wocG9vbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvcmNlQXJyYXlNb2RlKSB7CisgICAgICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRTdXJmYWNlOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlID0gb3V0cHV0LT5zdXJmYWNlID8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkXzsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworCisgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBhbGxvY2F0b3IgSUQuCisgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvciBpZgorICAgICAgICAgICAgLy8gdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0ICpvdXRwdXRBbGxvY2F0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEFsbG9jYXRvcnMgJiYgb3V0cHV0QWxsb2NhdG9ycy0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Iob3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBidWZmZXJxdWV1ZSBpZiBvdXRwdXR0aW5nIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAvLyBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBzdXJmYWNlIGFsbG9jYXRvciByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgKnN1cmZhY2VBbGxvY2F0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlQWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Ioc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIHN1cmZhY2Ugb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXJyICE9IEMyX09LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHBvb2xNYXNrID4+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsICZwb29scy0+b3V0cHV0UG9vbElkLCAmcG9vbHMtPm91dHB1dFBvb2xJbnRmKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBDcmVhdGVkIG91dHB1dCBibG9jayBwb29sIHdpdGggYWxsb2NhdG9ySUQgJXUgPT4gcG9vbElEICVsbHUgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29scy0+b3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgYmFzaWMgcG9vbCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdXRwdXQgYmxvY2sgcG9vbCBJRCBhcyBwYXJhbWV0ZXIgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0IHRvCisgICAgICAgICAgICAvLyBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29sSWRzVHVuaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7IHBvb2xzLT5vdXRwdXRQb29sSWQgfSk7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7IHBvb2xJZHNUdW5pbmcuZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uZmlndXJlZCBvdXRwdXQgYmxvY2sgcG9vbCBpZHMgJWxsdSA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZHNUdW5pbmctPm0udmFsdWVzWzBdLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIG91dHB1dFBvb2xJZF8gPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhtTnVtT3V0cHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQtPmR1cCgpKTsKKworCisgICAgICAgIC8vIFRyeSB0byBzZXQgb3V0cHV0IHN1cmZhY2UgdG8gY3JlYXRlZCBibG9jayBwb29sIGlmIGdpdmVuLgorICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgbUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkXywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgLy8gV09SS0FST1VORDogaWYgd2UncmUgdXNpbmcgZWFybHkgQ1NEIHdvcmthcm91bmQgd2UgY29udmVydCB0bworICAgICAgICAgICAgLy8gICAgICAgICAgICAgYXJyYXkgbW9kZSwgdG8gYXBwZWFzZSBhcHBzIGFzc3VtaW5nIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAgICAgICAgICgqYnVmZmVycykgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworCisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAwOzsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5IHx8IHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIGFuZCB3ZSdyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVycyktPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLm91dHB1dERlbGF5KG91dHB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnNtb290aG5lc3NGYWN0b3Ioa1Ntb290aG5lc3NGYWN0b3IpOworICAgICAgICB3YXRjaGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIG1JbnB1dE1ldEVvcyA9IGZhbHNlOworICAgIG1TeW5jLnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiB0b0JlUXVldWVkOworICAgIC8vIFRPRE86IHVzZSBwcm9wZXIgYnVmZmVyIGRlcHRoIGluc3RlYWQgb2YgdGhpcyByYW5kb20gdmFsdWUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnksIG9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBidWZmZXIgJXp1IGF2YWlsYWJsZSIsIG1OYW1lLCBpbmRleCk7CisgICAgICAgICAgICBib29sIHBvc3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFjb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5jYXBhY2l0eSgpID49IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmJhc2UoKSwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNhcGFjaXR5IHRvbyBzbWFsbCBmb3IgdGhlIGNvbmZpZyAoJXp1IDwgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvc3QpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvQmVRdWV1ZWQuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyIDogdG9CZVF1ZXVlZCkgeworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGluaXRpYWwgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c3RvcCgpIHsKKyAgICBtU3luYy5zdG9wKCk7CisgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFN1cmZhY2UucmVzZXQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Zmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIHsKKyAgICBBTE9HVigiWyVzXSBmbHVzaCIsIG1OYW1lKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlJlYWRWaWV3IHZpZXcgPQorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGZhaWxlZCB0byBtYXAgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YTogJWQiLCBtTmFtZSwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ3MtPnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkodmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSkpOworICAgICAgICAgICAgQUxPR1YoIlslc10gc3Rhc2hlZCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhIChzaXplPSV1KSIsIG1OYW1lLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaCgpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5mbHVzaCgpOworICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5mbHVzaCgpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSkgeworICAgIGlmIChoYW5kbGVXb3JrKHN0ZDo6bW92ZSh3b3JrKSwgb3V0cHV0Rm9ybWF0LCBpbml0RGF0YSkpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gKCpidWZmZXJzKS0+ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6aGFuZGxlV29yaygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKCh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggLSBtRmlyc3RWYWxpZEZyYW1lSW5kZXgubG9hZCgpKS5wZWVrKCkgPCAwKSB7CisgICAgICAgIC8vIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4KKyAgICAgICAgQUxPR0QoIlslc10gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSB7CisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ID09IEMyX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRCgiWyVzXSBmbHVzaGVkIHdvcms7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHdvcmsgZmFpbGVkIHRvIGNvbXBsZXRlOiAlZCIsIG1OYW1lLCB3b3JrLT5yZXN1bHQpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3Iod29yay0+cmVzdWx0LCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSB3b3JrbGV0CisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIHdvcmtsZXRzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gJndvcmtsZXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgb3V0cHV0IHN0cmVhbS4KKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgYnVmZmVyczogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIGJ1ZmZlciA9IHdvcmtsZXQtPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogbnVsbHB0ciBmb3VuZCBpbiBidWZmZXJzOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlcktleS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGtleSB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGtleSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVucmVjb2duaXplZCBjb25maWcgdXBkYXRlICglMDhYKSIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlcnMpLT51cGRhdGVTa2lwQ3V0QnVmZmVyKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCBvdXRwdXQgdGltZXN0YW1wIGJhc2VkIG9uIGNsaWVudCBpbnB1dCB0aW1lc3RhbXAgYW5kIGNvZGVjCisgICAgLy8gaW5wdXQgdGltZXN0YW1wLiBDb2RlYyBvdXRwdXQgdGltZXN0YW1wIChpbiB0aGUgdGltZXN0YW1wIGZpZWxkKSBzaGFsbCBjb3JyZXNwb25kIHRvCisgICAgLy8gdGhlIGNvZGVjIGlucHV0IHRpbWVzdGFtcCwgYnV0IGNsaWVudCBvdXRwdXQgdGltZXN0YW1wIHNob3VsZCAocmVwb3J0ZWQgaW4gdGltZVVzKQorICAgIC8vIHNoYWxsIGNvcnJlc3BvbmQgdG8gdGhlIGNsaWVudCBpbnB1dCB0aW1lc2FtcCAoaW4gY3VzdG9tT3JkaW5hbCkuIEJ5IHVzaW5nIHRoZQorICAgIC8vIGRlbHRhIGJldHdlZW4gdGhlIHR3bywgdGhpcyBhbGxvd3MgZm9yIHNvbWUgdGltZXN0YW1wIGRldmlhdGlvbiAtIGUuZy4gaWYgb25lIGlucHV0CisgICAgLy8gcHJvZHVjZXMgbXVsdGlwbGUgb3V0cHV0LgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcCA9CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCArIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbAorICAgICAgICAgICAgICAgIC0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogaW5wdXQgJWxsZCwgY29kZWMgJWxsZCA9PiBvdXRwdXQgJWxsZCA9PiAlbGxkIiwKKyAgICAgICAgICBtTmFtZSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHRpbWVzdGFtcC5wZWVrbGwoKSk7CisKKyAgICBpZiAoaW5pdERhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPnJlZ2lzdGVyQ3NkKGluaXREYXRhLCAmaW5kZXgsICZvdXRCdWZmZXIpID09IE9LKSB7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVzdGFtcC5wZWVrKCkpOworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGNzZCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNzZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgYnVmZmVycy5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJ1ZmZlciAmJiAhZmxhZ3MpIHsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogTm90IHJlcG9ydGluZyBvdXRwdXQgYnVmZmVyICglbGxkKSIsCisgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmZmVyLT5pbmZvKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHByb3Blcmx5IHRyYW5zbGF0ZSB0aGVzZSB0byBtZXRhZGF0YQorICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBpZiAoKChDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm8gKilpbmZvLmdldCgpKS0+dmFsdWUgJiBDMkNvbmZpZzo6U1lOQ19GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5lbXBsYWNlKGJ1ZmZlciwgdGltZXN0YW1wLnBlZWsoKSwgZmxhZ3MsIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgICAgICAvLyBGbHVzaCByZW9yZGVyIHN0YXNoCisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNlbmRPdXRwdXRCdWZmZXJzKCkgeworICAgIFJlb3JkZXJTdGFzaDo6RW50cnkgZW50cnk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIGlmICghcmVvcmRlci0+aGFzUGVuZGluZygpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlb3JkZXItPnBvcCgmZW50cnkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmJ1ZmZlcnMpLT5yZWdpc3RlckJ1ZmZlcihlbnRyeS5idWZmZXIsICZpbmRleCwgJm91dEJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoISgqYnVmZmVycyktPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcnMgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPdXRwdXRCdWZmZXJzQXJyYXkgKmFycmF5ID0gKE91dHB1dEJ1ZmZlcnNBcnJheSAqKWJ1ZmZlcnMtPmdldCgpOworICAgICAgICAgICAgICAgIGFycmF5LT5yZWFsbG9jKGVudHJ5LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHVuYWJsZSB0byByZWdpc3RlciBvdXRwdXQgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmVvcmRlci0+ZGVmZXIoZW50cnkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7CisgICAgICAgIEFMT0dWKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiBvdXQgYnVmZmVyIGluZGV4ID0gJXp1IFslcF0gPT4gJXAgKyAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpLCBvdXRCdWZmZXItPmRhdGEoKSwgb3V0QnVmZmVyLT5zaXplKCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBvdXRCdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmbmV3U3VyZmFjZSkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pY191aW50MzJfdCBzdXJmYWNlR2VuZXJhdGlvbnswfTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gKGdldHBpZCgpIDw8IDEwKSB8CisgICAgICAgICAgICAoKHN1cmZhY2VHZW5lcmF0aW9uLmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSArIDEpCisgICAgICAgICAgICAgICAgJiAoKDEgPDwgMTApIC0gMSkpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgaWYgKG5ld1N1cmZhY2UpIHsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0U2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKyAgICAgICAgcHJvZHVjZXIgPSBuZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHByb2R1Y2VyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgb3V0cHV0IHN1cmZhY2UgdG8gbnVsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKyAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgb3V0cHV0UG9vbEludGYgPSBwb29scy0+b3V0cHV0UG9vbEludGY7CisgICAgfQorCisgICAgaWYgKG91dHB1dFBvb2xJbnRmKSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgb3V0cHV0LT5zdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7CisgICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgorICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bworICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICBzaXplX3QgbiA9IG1JbnB1dE1ldEVvcyA/IDAgOiBtRGVsYXk7CisgICAgcmV0dXJuIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5lbGFwc2VkKFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpLCBuKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKSB7CisgICAgbU1ldGFNb2RlID0gbW9kZTsKK30KKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCkgeworICAgIC8vIEMyX09LIGlzIGFsd2F5cyB0cmFuc2xhdGVkIHRvIE9LLgorICAgIGlmIChjMnMgPT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIE9wZXJhdGlvbi1kZXBlbmRlbnQgdHJhbnNsYXRpb24KKyAgICAvLyBUT0RPOiBBZGQgYXMgbmVjZXNzYXJ5CisgICAgc3dpdGNoIChjMm9wKSB7CisgICAgY2FzZSBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0OgorICAgICAgICBzd2l0Y2ggKGMycykgeworICAgICAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEJhY2t1cCBvcGVyYXRpb24tYWdub3N0aWMgdHJhbnNsYXRpb24KKyAgICBzd2l0Y2ggKGMycykgeworICAgIGNhc2UgQzJfQkFEX0lOREVYOgorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIGNhc2UgQzJfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQzJfQkxPQ0tJTkc6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEMyX0RVUExJQ0FURToKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGNhc2UgQzJfTk9fSU5JVDoKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgY2FzZSBDMl9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBjYXNlIEMyX1RJTUVEX09VVDoKKyAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICBjYXNlIEMyX0JBRF9TVEFURToKKyAgICBjYXNlIEMyX0NBTkNFTEVEOgorICAgIGNhc2UgQzJfQ0FOTk9UX0RPOgorICAgIGNhc2UgQzJfQ09SUlVQVEVEOgorICAgIGNhc2UgQzJfT01JVFRFRDoKKyAgICBjYXNlIEMyX1JFRlVTRUQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGMycyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMjliNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjZGVmaW5lIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5RGVhbGVyOworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSA9IDA7Cit9OworCisvKioKKyAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBDQ29kZWMuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWwKKyAgICA6IHB1YmxpYyBCdWZmZXJDaGFubmVsQmFzZSwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0J1ZmZlckNoYW5uZWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spOworICAgIHZpcnR1YWwgfkNDb2RlY0J1ZmZlckNoYW5uZWwoKTsKKworICAgIC8vIEJ1ZmZlckNoYW5uZWxCYXNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBiZWxvdyBhcmUgaW50ZXJmYWNlIGZvciBDQ29kZWMgdG8gdXNlLgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wb25lbnQgb2JqZWN0IGZvciBidWZmZXIgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLyoqCisgICAgICogU2V0IG91dHB1dCBncmFwaGljIHN1cmZhY2UgZm9yIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNldCBHcmFwaGljQnVmZmVyU291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgZXh0cmFjdHMgaW5wdXQKKyAgICAgKiBidWZmZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2lnbmFsIEVPUyB0byBpbnB1dCBzdXJmYWNlLgorICAgICAqLworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBiZWZvcmUgdGhpcyBjYWxsIGhhcyBjb21wbGV0ZWQuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IGNsaWVudC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworCisgICAgLyoqCisgICAgICogU3RvcCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYWZ0ZXIgdGhpcyBjYWxsLCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGlucHV0IGNsaWVudCBhYm91dCB3b3JrIGRvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya0l0ZW1zICAgZmluaXNoZWQgd29yayBpdGVtLgorICAgICAqIEBwYXJhbSBvdXRwdXRGb3JtYXQgbmV3IG91dHB1dCBmb3JtYXQgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICogQHBhcmFtIGluaXREYXRhICAgIG5ldyBpbml0IGRhdGEgKENTRCkgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGlucHV0IGJ1ZmZlciBhdmFpbGFibGUgZm9yIHRoZSBjbGllbnQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAqIGJ5IHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBvZiBpbnB1dCB3b3JrCisgICAgICogQHBhcmFtIGFycmF5SW5kZXggVGhlIGluZGV4IG9mIGJ1ZmZlciBpbiB0aGUgaW5wdXQgd29yayBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCisgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCgpOworCisgICAgZW51bSBNZXRhTW9kZSB7CisgICAgICAgIE1PREVfTk9ORSwKKyAgICAgICAgTU9ERV9BTlcsCisgICAgfTsKKworICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CisKKyAgICAvLyBJbnRlcm5hbCBjbGFzc2VzCisgICAgY2xhc3MgQnVmZmVyczsKKyAgICBjbGFzcyBJbnB1dEJ1ZmZlcnM7CisgICAgY2xhc3MgT3V0cHV0QnVmZmVyczsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBRdWV1ZUd1YXJkOworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBtdXRleC1saWtlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKgorICAgICAqIC0gQXQgU1RPUFBFRCBzdGF0ZSAoaW5pdGlhbCwgb3IgYWZ0ZXIgc3RvcCgpKQorICAgICAqICAgLSBRdWV1ZUd1YXJkIG9iamVjdCBnZXRzIGNyZWF0ZWQgYXQgU1RPUFBFRCBzdGF0ZSwgYW5kIHRoZSBjbGllbnQgaXMKKyAgICAgKiAgICAgc3VwcG9zZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqIC0gQXQgUlVOTklORyBzdGF0ZSAoYWZ0ZXIgc3RhcnQoKSkKKyAgICAgKiAgIC0gRWFjaCBRdWV1ZUd1YXJkIG9iamVjdAorICAgICAqLworICAgIGNsYXNzIFF1ZXVlU3luYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQXQgY29uc3RydWN0aW9uIHRoZSBzeW5jIG9iamVjdCBpcyBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFF1ZXVlU3luYygpIHt9CisgICAgICAgIH5RdWV1ZVN5bmMoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zaXRpb24gdG8gUlVOTklORyBzdGF0ZSB3aGVuIHN0b3BwZWQuIE5vLW9wIGlmIGFscmVhZHkgaW4gUlVOTklORworICAgICAgICAgKiBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RhcnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXQgUlVOTklORyBzdGF0ZSwgd2FpdCB1bnRpbCBhbGwgUXVldWVHdWFyZCBvYmplY3QgY3JlYXRlZCBkdXJpbmcKKyAgICAgICAgICogUlVOTklORyBzdGF0ZSBhcmUgZGVzdHJveWVkLCBhbmQgdGhlbiB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqIE5vLW9wIGlmIGFscmVhZHkgaW4gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RvcCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgTXV0ZXggbUd1YXJkTG9jazsKKworICAgICAgICBzdHJ1Y3QgQ291bnRlciB7CisgICAgICAgICAgICBpbmxpbmUgQ291bnRlcigpIDogdmFsdWUoLTEpIHt9CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQ29uZGl0aW9uIGNvbmQ7CisgICAgICAgIH07CisgICAgICAgIE11dGV4ZWQ8Q291bnRlcj4gbUNvdW50OworCisgICAgICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOworICAgIH07CisKKyAgICBjbGFzcyBRdWV1ZUd1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1ZXVlR3VhcmQoUXVldWVTeW5jICZzeW5jKTsKKyAgICAgICAgflF1ZXVlR3VhcmQoKTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNSdW5uaW5nKCkgeyByZXR1cm4gbVJ1bm5pbmc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFF1ZXVlU3luYyAmbVN5bmM7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBoYW5kbGVXb3JrKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisgICAgdm9pZCBzZW5kT3V0cHV0QnVmZmVycygpOworCisgICAgUXVldWVTeW5jIG1TeW5jOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgY29tcG9uZW50IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY29tcG9uZW50IG5hbWUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+IG1DQ29kZWNDYWxsYmFjazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1JbnB1dEFsbG9jYXRvcjsKKyAgICBRdWV1ZVN5bmMgbVF1ZXVlU3luYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1QYXJhbXNUb0JlU2V0OworCisgICAgc2l6ZV90IG1OdW1JbnB1dFNsb3RzOworICAgIHNpemVfdCBtTnVtT3V0cHV0U2xvdHM7CisgICAgc2l6ZV90IG1EZWxheTsKKworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+IG1JbnB1dEJ1ZmZlcnM7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+PiBtRmx1c2hlZENvbmZpZ3M7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+IG1PdXRwdXRCdWZmZXJzOworCisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZpcnN0VmFsaWRGcmFtZUluZGV4OworCisgICAgc3A8TWVtb3J5RGVhbGVyPiBtYWtlTWVtb3J5RGVhbGVyKHNpemVfdCBoZWFwU2l6ZSk7CisKKyAgICBzdHJ1Y3QgT3V0cHV0U3VyZmFjZSB7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIGludCBtYXhEZXF1ZXVlQnVmZmVyczsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29scyB7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gaW5wdXRQb29sOworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIH07CisgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPiBtQmxvY2tQb29sczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworCisgICAgTWV0YU1vZGUgbU1ldGFNb2RlOworCisgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+IG1QaXBlbGluZVdhdGNoZXI7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBmbHVzaCgpOworICAgICAgICB2b2lkIHNldERlcHRoKHVpbnQzMl90IGRlcHRoKTsKKyAgICAgICAgdm9pZCBzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KTsKKyAgICAgICAgYm9vbCBwb3AoRW50cnkgKmVudHJ5KTsKKyAgICAgICAgdm9pZCBlbXBsYWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpOworICAgICAgICB2b2lkIGRlZmVyKGNvbnN0IEVudHJ5ICZlbnRyeSk7CisgICAgICAgIGJvb2wgaGFzUGVuZGluZygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUGVuZGluZzsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtU3Rhc2g7CisgICAgICAgIHVpbnQzMl90IG1EZXB0aDsKKyAgICAgICAgQzJDb25maWc6Om9yZGluYWxfa2V5X3QgbUtleTsKKworICAgICAgICBib29sIGxlc3MoY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKTsKKyAgICB9OworICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPiBtUmVvcmRlclN0YXNoOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtSW5wdXRNZXRFb3M7CisKKyAgICBpbmxpbmUgYm9vbCBoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkgeworICAgICAgICByZXR1cm4gbUNyeXB0byAhPSBudWxscHRyIHx8IG1EZXNjcmFtYmxlciAhPSBudWxscHRyOworICAgIH0KK307CisKKy8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCisvLyBvcGVyYXRpb24gdGhhdCByZXR1cm5zIHRoZSBjMl9zdGF0dXNfdCB2YWx1ZS4KK2VudW0gYzJfb3BlcmF0aW9uX3QgeworICAgIEMyX09QRVJBVElPTl9OT05FLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY29ubmVjdFRvT214SW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY3JlYXRlQmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGVzdHJveUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZHJhaW4sCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9mbHVzaCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3F1ZXVlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVsZWFzZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3Jlc2V0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc2V0T3V0cHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RvcCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY29weUJ1ZmZlciwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUludGVyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX2NvbmZpZywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5LAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRQYXJhbXMsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFZhbHVlcywKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlX2Nvbm5lY3RUb0NvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlQ29ubmVjdGlvbl9kaXNjb25uZWN0LAorfTsKKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCA9IEMyX09QRVJBVElPTl9OT05FKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMmU3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gYzIgZXF1aXZhbGVudHMgZm9yICVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX01BUFBFUlM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZvdW5kICV6dSBlcXMgZm9yICVzIiwgaXQtPnNlY29uZC5zaXplKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFNESyA8PT4gQ29kZWMgMi4wIHBhcmFtZXRlciBtYXBwaW5nLiBNdWx0aXBsZSBDb2RlYyAyLjAgcGFyYW1ldGVycyBtYXkgbWFwIHRvIGEKKyAgICAgKiBzaW5nbGUgU0RLIGtleSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNoYWxsIGJlIG9yZGVyZWQgZnJvbSBsZWFzdCBhdXRob3JpdGF0aXZlIHRvIG1vc3QKKyAgICAgKiBhdXRob3JpdGF0aXZlLiBXaGVuIGNvbnN0cnVjdGluZyBTREsgZm9ybWF0cywgdGhlIGxhc3QgbWFwcGVkIENvZGVjIDIuMCBwYXJhbWV0ZXIgdGhhdAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IHdpbGwgZGV0ZXJtaW5lIHRoZSBleHBvc2VkIHZhbHVlLiAoVE9ETzogcGVyaGFwcyByZXN0cmljdCB0aGlzCisgICAgICogYnkgZG9tYWluLikKKyAgICAgKi8KKyAgICB2b2lkIGFkZChjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGNtLm1lZGlhS2V5KCkpOworICAgICAgICBBTE9HVigiJWMlYyVjJWMgJWMlYyVjICUwNHggJTlzICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfSU5QVVQpID8gJ0knIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfT1VUUFVUKSA/ICdPJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPREVEKSA/ICdDJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JBVykgPyAnUicgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT05GSUcpID8gJ2MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUEFSQU0pID8gJ3AnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkVBRCkgPyAncicgOiAnICcpLAorICAgICAgICAgICAgICBjbS5kb21haW4oKSwKKyAgICAgICAgICAgICAgaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkgPyAiYWRkaW5nIiA6ICJleHRlbmRpbmciLAorICAgICAgICAgICAgICBjbS5tZWRpYUtleSgpLmNfc3RyKCksIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IGVxcyA9IHsgY20gfTsKKyAgICAgICAgICAgIG1Db25maWdNYXBwZXJzLmVtcGxhY2UoY20ubWVkaWFLZXkoKSwgZXFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQucHVzaF9iYWNrKGNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGhzIGZvciBhIHNwZWNpZmljIGRvbWFpbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbnkgbWF4aW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgZG9tYWlucworICAgICAqICAgICAgICAgICAgaW4gdGhlIG1hc2suCisgICAgICogXHBhcmFtIGFsbCBtaW5pbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYWxsIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAgICAqICAgICAgICAgICAgbWFzay4gVGhpcyBpcyByZXN0cmljdGVkIHRvIHRoZSBiaXRzIG9mIHRoZSBtYXhpbXVtIG1hc2suCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAorICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImZpbHRlcmluZyAlcyAleCAleCAleCAleCIsIGNtLnBhdGgoKS5jX3N0cigpLCBjbS5kb21haW4oKSwgYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtLmRvbWFpbigpICYgYW55KSwgKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSk7CisgICAgICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGFueSkgJiYgKChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkgPT0gKGFueSAmIGFsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soY20ucGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNESyA8PT4gQ29kZWMgMi4wIG1hcHBpbmdzLgorICAgICAqCisgICAgICogVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJldHRlciBtZXRob2RzIGFzIHRoaXMgZXhwb3NlcyB0aGUgaW5uZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gZ2V0S2V5cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWdNYXBwZXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IG1Db25maWdNYXBwZXJzOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBTdGFuZGFyZFBhcmFtczo6Tk9fTUFQUEVSUzsKKworCitDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCisgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorCit2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgeworICAgIHR5cGVkZWYgRG9tYWluIEQ7CisgICAgbVN0YW5kYXJkUGFyYW1zID0gc3RkOjptYWtlX3NoYXJlZDxTdGFuZGFyZFBhcmFtcz4oKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBhZGQgPQorICAgICAgICBbcGFyYW1zID0gbVN0YW5kYXJkUGFyYW1zXShjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgICAgICBwYXJhbXMtPmFkZChjbSk7CisgICAgfTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBkZXByZWNhdGVkID0gYWRkOworCisgICAgLy8gYWxsb3cgaW50MzIgb3IgZmxvYXQgU0RLIHZhbHVlcyBhbmQgcmVwcmVzZW50IHRoZW0gYXMgZmxvYXQKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBtYWtlRmxvYXQgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KWkzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZwVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbmVnYXRlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUsICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUICYgRDo6UkVBRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSwgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpQQVJBTSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IG1vZGU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmbW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZIGFuZCBuZXcgbW9kZXMKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfQklUUkFURV9NT0RFLCAiY29kZWQuYml0cmF0ZS1tb2RlIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GUkFNRV9SQVRFLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCAiY29kZWQubWF4LWZyYW1lLXNpemUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKworICAgIC8vIFJvdGF0aW9uCisgICAgLy8gTm90ZTogU0RLIHJvdGF0aW9uIGlzIGNsb2NrLXdpc2UsIHdoaWxlIEMyIHJvdGF0aW9uIGlzIGNvdW50ZXItY2xvY2std2lzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9WVUlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworCisgICAgLy8gYW5kcm9pZCAndmlkZW8tc2NhbGluZycKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl92aWRlby1zY2FsaW5nIiwgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6REVDT0RFUiAmIEQ6OlJBVykpOworCisgICAgLy8gQ29sb3IgQXNwZWN0cworICAgIC8vCisgICAgLy8gY29uZmlndXJlIGRlZmF1bHQgZm9yIGRlY29kZXJzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworCisgICAgLy8gcmVhZCBiYWNrIGZpbmFsIGZvciBkZWNvZGVyIG91dHB1dCAoYWxzbywgY29uZmlndXJlIGZpbmFsIGFzcGVjdHMgYXMgd2VsbC4gVGhpcyBzaG91bGQgYmUKKyAgICAvLyBvdmVyd3JpdHRlbiBiYXNlZCBvbiBjb2RlZC9kZWZhdWx0IHZhbHVlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29sb3IgYXNwZWN0cywgYnV0IGlzIHVzZWQKKyAgICAvLyBhcyBmaW5hbCB2YWx1ZXMgaWYgY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQgYXNwZWN0cyBhdCBhbGwpCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIGNvbmZpZ3VyZSBzb3VyY2UgYXNwZWN0cyBmb3IgZW5jb2RlcnMgYW5kIHJlYWQgdGhlbSBiYWNrIG9uIHRoZSBjb2RlZCghKSBwb3J0LgorICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIG11eGluZyB0aGUgZGVzaXJlZCBhc3BlY3RzIGludG8gdGhlIGNvbnRhaW5lci4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisKKyAgICAvLyByZWFkIGJhY2sgY29kZWQgYXNwZWN0cyBmb3IgZW5jb2RlcnMgKG9uIHRoZSByYXcgcG9ydCksIGJ1dCBhbHNvIGNvbmZpZ3VyZQorICAgIC8vIGRlc2lyZWQgYXNwZWN0cyBoZXJlLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gRGF0YXNwYWNlCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgQzJfUEFSQU1LRVlfREFUQV9TUEFDRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICAvLyBIRFIKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1heC1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5taW4tbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1jbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtY2xsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1mYWxsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWZhbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcoS0VZX0ZFQVRVUkVfKSArIEZFQVRVUkVfU2VjdXJlUGxheWJhY2ssCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TRUNVUkVfTU9ERSwgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGluZy5hZGQtY3NkLXRvLXN5bmMtZnJhbWVzIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIC8vIGNvbnZlcnQgdG8gdGltZXN0YW1wIGJhc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMLCAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICAgICAgaW50MzJfdCBpMzJWYWx1ZTsKKyAgICAgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KDEwMDAwMDApICogaTMyVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KGMyX21pbigxMDAwMDAwICogZnBWYWx1ZSArIDAuNSwgKGRvdWJsZSlJTlQ2NF9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIHByb3BlciBjb2RpbmcuZ29wIChhZGQgc3VwcG9ydCBmb3IgY2FsY3VsYXRpbmcgZ29wKQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJpLWZyYW1lLXBlcmlvZCIsICJjb2RpbmcuZ29wIiwgImludHJhLXBlcmlvZCIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCwgInBlcmlvZCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcucmVxdWVzdC1zeW5jIiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURSwgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNIHwgRDo6Q09ORklHKSAvLyB3cml0ZS1vbmx5CisgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIC8vIEMyIHByaW9yaXRpZXMgYXJlIGludmVydGVkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgQzJfUEFSQU1LRVlfUFJJT1JJVFksICAgICAgICAgICAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgICJjdHJsLm9wZXJhdGluZy1yYXRlIiwgICAgICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgImN0cmwucHJpb3JpdHkiLCAgICAgICAgICAgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfV0lEVEgsICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSEVJR0hULCAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1sZWZ0IiwgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAibGVmdCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXRvcCIsICAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ0b3AiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC13aWR0aCIsICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1oZWlnaHQiLCAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX1dJRFRILCAgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0hFSUdIVCwgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgLy8gUGl4ZWwgRm9ybWF0ICh1c2UgbG9jYWwga2V5IGZvciBhY3R1YWwgcGl4ZWwgZm9ybWF0IGFzIHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAvLyBTREsgbGF5b3V0cyBmb3IgZmxleGlibGUgZm9ybWF0IGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgU0RLIGNvbG9yIGZvcm1hdCBpbiB0aGUgbWVkaWEgZm9ybWF0KQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSwgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIHBvcnQgZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgICAgICBpbnQzMl90IHRvOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyID0gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwUHJvZmlsZShjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEVWRUwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJsZXZlbCIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyID0gTEVWRUxfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwTGV2ZWwoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExFVkVMX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcExldmVsKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0NVVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGVmZmVjdCB0eXBlICh0aGVzZSBtYXAgdG8gU0RLIHZhbHVlcykgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZhbHVlIGlzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9PRkY7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEU7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICsgMTsgLy8gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29tcGxleGl0eSIsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfQ09MVU1OUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJjb2x1bW5zIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX1JPV1MsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAicm93cyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9XSURUSCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX0hFSUdIVCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLmhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MQVRFTkNZLCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsICJ2YWx1ZSIpKTsKKworICAgIC8qIHN0aWxsIHRvIGRvCisgICAgY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKKworICAgICAgIG5vdCB5ZXQgdXNlZCBieSBNZWRpYUNvZGVjLCBidXQgZGVmaW5lZCBhcyBNZWRpYUZvcm1hdAorICAgIEtFWV9BVURJT19TRVNTSU9OX0lEIC8vIHdlIHVzZSAiYXVkaW8taHctc3luYyIKKyAgICBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEgKKyAgICAqLworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW4oQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUik7CisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kKEMyQ29tcG9uZW50OjpLSU5EX09USEVSKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyAmZG9tYWluLCAma2luZCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgZG9tYWluICYga2luZCBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUga2luZCBmcm9tIGNvbXBvbmVudCBuYW1lCisgICAgICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGRvbWFpbiBmcm9tIG1lZGlhIHR5cGUgKHBvcnQgKHByZWZlcnJlZCkgb3Igc3RyZWFtICMwKQorICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbURvbWFpbiA9IChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyA/IERvbWFpbjo6SVNfVklERU8gOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgPyBEb21haW46OklTX0lNQUdFIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPID8gRG9tYWluOjpJU19BVURJTyA6IERvbWFpbjo6T1RIRVJfRE9NQUlOKQorICAgICAgICAgICAgfCAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSID8gRG9tYWluOjpJU19ERUNPREVSIDoKKyAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IERvbWFpbjo6SVNfRU5DT0RFUiA6IERvbWFpbjo6T1RIRVJfS0lORCk7CisKKyAgICBtSW5wdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfREVDT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19JTlBVVCk7CisgICAgbU91dHB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19FTkNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX09VVFBVVCk7CisKKyAgICBBTE9HVigiZG9tYWluIGlzICUjeCAoJXUgJXUpIiwgbURvbWFpbiwgZG9tYWluLnZhbHVlLCBraW5kLnZhbHVlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBwYXJhbUluZGljZXM7CisgICAgc3dpdGNoIChraW5kLnZhbHVlKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZShmYWxzZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gIiI7CisgICAgfQorCisgICAgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtUGFyYW1EZXNjcyk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgbVBhcmFtRGVzY3Muc2l6ZSgpLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogbVBhcmFtRGVzY3MpIHsKKyAgICAgICAgbVN1cHBvcnRlZEluZGljZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBtUmVmbGVjdG9yID0gY2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIGlmIChtUmVmbGVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGFyYW0gcmVmbGVjdG9yIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIGVudW1lcmF0ZSBhbGwgZmllbGRzCisgICAgbVBhcmFtVXBkYXRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPigpOworICAgIG1QYXJhbVVwZGF0ZXItPmNsZWFyKCk7CisgICAgbVBhcmFtVXBkYXRlci0+c3VwcG9ydFdob2xlUGFyYW0oCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpDT1JFX0lOREVYKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbVBhcmFtRGVzY3MpOworCisgICAgLy8gVEVNUDogYWRkIHNvbWUgc3RhbmRhcmQgZmllbGRzIGV2ZW4gaWYgbm90IHJlZmxlY3RlZAorICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9JTklUX0RBVEEpOworICAgIH0KKyAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgfHwgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgIT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9DUk9QX1JFQ1QpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dCgwdSwgMXUsIDF1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUElYRUxfQVNQRUNUX1JBVElPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLCBDMl9QQVJBTUtFWV9ST1RBVElPTik7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfREFUQV9TUEFDRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8gc3Vic2NyaWJlIHRvIGFsbCBzdXBwb3J0ZWQgc3RhbmRhcmQgKGV4cG9zZWQpIHBhcmFtcworICAgIC8vIFRPRE86IGxpbWl0IHRoaXMgdG8gcGFyYW1zIHRoYXQgYXJlIGFjdHVhbGx5IGluIHRoZSBkb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZm9ybWF0S2V5cyA9IG1TdGFuZGFyZFBhcmFtcy0+Z2V0UGF0aHNGb3JEb21haW4oRG9tYWluKDEgPDwgMzApKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGb3JLZXlzKGZvcm1hdEtleXMsICZpbmRpY2VzKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisKKyAgICAvLyBhbHNvIHN1YnNjcmliZSB0byBzb21lIG5vbi1TREsgc3RhbmRhcmQgcGFyYW1ldGVycworICAgIC8vIGZvciBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBmb3Igb3V0cHV0IGJ1ZmZlciBhcnJheSBhbGxvY2F0aW9uCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBpbml0IGRhdGEgKENTRCkKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisgICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgd2hlbiBjb21wb25lbnRzIG5vIGxvbmdlciBjcmFzaCBvbiB0aGlzIGNvbmZpZworICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgJiYgZmFsc2UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXM7CisgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBtU3Vic2NyaWJlZEluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBzdWJzY3JpYmVUdW5pbmcgPQorICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdHM7CisgICAgICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5jb25maWcoeyBzdWJzY3JpYmVUdW5pbmcuZ2V0KCkgfSwgYmxvY2tpbmcsICZyZXN1bHRzKTsKKyAgICAgICAgaWYgKGMyRXJyICE9IEMyX09LICYmIGMyRXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBzdWJzY3JpYmUgdG8gcGFyYW1ldGVycyA9PiAlcyIsIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTdWJzY3JpYmVkIHRvICV6dSBwYXJhbXMiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSA9IG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIC8vIHF1ZXJ5IGFsbCBzdWJzY3JpYmVkIHBhcmFtZXRlcnMKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyhtU3Vic2NyaWJlZEluZGljZXMuYmVnaW4oKSwgbVN1YnNjcmliZWRJbmRpY2VzLmVuZCgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9NQVlfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0koInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyAoJXMpIiwgcXVlcmllZC5zaXplKCksIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgfQorCisgICAgdXBkYXRlQ29uZmlndXJhdGlvbihxdWVyaWVkLCBBTEwpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbikgeworICAgIEFMT0dWKCJ1cGRhdGluZyBjb25maWd1cmF0aW9uIHdpdGggJXp1IHBhcmFtcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCkpOworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChwICYmICpwKSB7CisgICAgICAgICAgICBhdXRvIGluc2VydGlvbiA9IG1DdXJyZW50Q29uZmlnLmVtcGxhY2UocC0+aW5kZXgoKSwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uLnNlY29uZCB8fCAqaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgIT0gKnApIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KHAtPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJhY2sgY2hhbmdlcyBpbiBzdXBwb3J0ZWQgKHJlZmxlY3RlZCBvciBsb2NhbCkgaW5kaWNlcworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYW4gdW5saXN0ZWQgY29uZmlnIHdhcyAlczogJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb24uc2Vjb25kID8gImFkZGVkIiA6ICJ1cGRhdGVkIiwgcC0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigidXBkYXRlZCBjb25maWd1cmF0aW9uIGhhcyAlenUgcGFyYW1zICglcykiLCBtQ3VycmVudENvbmZpZy5zaXplKCksCisgICAgICAgICAgICBjaGFuZ2VkID8gIkNIQU5HRUQiIDogIm5vIGNoYW5nZSIpOworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVGb3JtYXRzKGRvbWFpbik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbikgeworICAgIC8vIGdldCBhZGRyZXNzZXMgb2YgcGFyYW1zIGluIHRoZSBjdXJyZW50IGNvbmZpZworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBtQ3VycmVudENvbmZpZykgeworICAgICAgICBwYXJhbVBvaW50ZXJzLnB1c2hfYmFjayhpdC5zZWNvbmQuZ2V0KCkpOworICAgIH0KKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCByZWZsZWN0ZWQgPSBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbXMocGFyYW1Qb2ludGVycyk7CisgICAgQUxPR0QoImMyIGNvbmZpZyBpcyAlcyIsIHJlZmxlY3RlZC5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRvbWFpbiAmIG1JbnB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbUlucHV0Rm9ybWF0OworICAgICAgICBtSW5wdXRGb3JtYXQgPSBtSW5wdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOworICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIG91dHB1dCBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtT3V0cHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbU91dHB1dERvbWFpbikpOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVl9JRihjaGFuZ2VkLCAiZm9ybWF0KHMpIGNoYW5nZWQiKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0NvbmZpZzo6Z2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIHBvcnREb21haW4pIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBwb3J0RG9tYWluKSA9PSAwIC8vIGlucHV0LW91dHB1dC1jb2RlZC1yYXcKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBtRG9tYWluKSAhPSBtRG9tYWluIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIElTX1JFQUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSByZWZsZWN0ZWQuZmluZChjbS5wYXRoKCkpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlZmxlY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBjbS5tYXBUb01lc3NhZ2UoYzJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoYnVmVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHN0clZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIENvZGVjIDIuMCByZWN0IHRvIE1lZGlhRm9ybWF0IHJlY3QgYW5kIGFkZCBjcm9wIHJlY3QgaWYgbm90IHByZXNlbnQKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJmxlZnQpICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXdpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZ0b3ApICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgbGVmdCA+PSAwICYmIHdpZHRoID49MCAmJiB3aWR0aCA8PSBJTlQzMl9NQVggLSBsZWZ0CisgICAgICAgICAgICAgICAgJiYgdG9wID49IDAgJiYgaGVpZ2h0ID49MCAmJiBoZWlnaHQgPD0gSU5UMzJfTUFYIC0gdG9wKSB7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtbGVmdCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC10b3AiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3Atd2lkdGgiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtaGVpZ2h0IikpOworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGggLSAxLCB0b3AgKyBoZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCB0ZW1wb3JhbCBsYXllcmluZyB0byBzY2hlbWEKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nICpsYXllcmluZyA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpGcm9tKEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcgJiYgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPCBsYXllcmluZy0+bS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB3ZWJydGMgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC4yNWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMl0gPT0gLjZmKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJydGMudnA4LiV1LWxheWVyIiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUrJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmxheWVyQ291bnQgLSBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChwcmltYXJpZXMsIG1hdHJpeCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItcHJpbWFyaWVzIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1tYXRyaXgiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkYXRhc3BhY2UgZm9yIHJhdyBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IHNwZWNpZmllZCBieSBjb21wb25lbnQsIG9yIGlmCisgICAgICAgIC8vIHVzaW5nIHN1cmZhY2Ugd2l0aCB1bnNwZWNpZmllZCBhc3BlY3RzIChhcyB0aG9zZSBtdXN0IGJlIGRlZmF1bHRlZCB3aGljaCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRoZSBkYXRhc3BhY2UpCisgICAgICAgIGlmICgocG9ydERvbWFpbiAmIElTX1JBVykgJiYgKG1Eb21haW4gJiAoSVNfSU1BR0UgfCBJU19WSURFTykpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2U7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0cyA9IHsKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkCisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIG9yaWdBc3BlY3RzID0gYXNwZWN0czsKKyAgICAgICAgICAgIGlmIChtVXNpbmdTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGltYWdlIHNpemUgKGRlZmF1bHQgdG8gSEQpCisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IDEyODA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSA3MjA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0RGVmYXVsdENvZGVjQ29sb3JBc3BlY3RzSWZOZWVkZWQoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUmFuZ2UgIT0gb3JpZ0FzcGVjdHMubVJhbmdlCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVByaW1hcmllcyAhPSBvcmlnQXNwZWN0cy5tUHJpbWFyaWVzCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVRyYW5zZmVyICE9IG9yaWdBc3BlY3RzLm1UcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgIT0gb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcykgeworICAgICAgICAgICAgICAgIGRhdGFzcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbworCisgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsICZoZHIubWFzdGVyaW5nLnJlZC54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCAmaGRyLm1hc3RlcmluZy5yZWQueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsICZoZHIubWFzdGVyaW5nLmdyZWVuLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCAmaGRyLm1hc3RlcmluZy5ibHVlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCAmaGRyLm1hc3RlcmluZy5ibHVlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgJmhkci5tYXhDbGwpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsICZoZHIubWF4RmFsbCkpIHsKKyAgICAgICAgICAgIGlmIChoZHIubWFzdGVyaW5nLnJlZC54ID49IDAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPj0gMCAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPD0gNi41NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPj0gMCAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPj0gMCAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPD0gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIG1ldGE7CisgICAgICAgICAgICAgICAgbWV0YS5tSUQgPSBtZXRhLmtUeXBlMTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi54ID0gaGRyLm1hc3RlcmluZy5yZWQueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueSA9IGhkci5tYXN0ZXJpbmcucmVkLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnggPSBoZHIubWFzdGVyaW5nLmdyZWVuLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnkgPSBoZHIubWFzdGVyaW5nLmdyZWVuLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnggPSBoZHIubWFzdGVyaW5nLmJsdWUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueSA9IGhkci5tYXN0ZXJpbmcuYmx1ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy54ID0gaGRyLm1hc3RlcmluZy53aGl0ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy55ID0gaGRyLm1hc3RlcmluZy53aGl0ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJjb252ZXJ0ZWQgdG8gU0RLIHZhbHVlcyBhcyAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOworfQorCisvLy8gY29udmVydHMgYW4gQU1lc3NhZ2UgdmFsdWUgdG8gYSBQYXJhbVVwZGF0ZXIgdmFsdWUKK3N0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZmcm9tLCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICp0bykgeworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKworICAgIGlmIChmcm9tLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50NjRWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGJ1ZlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoc3RyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KEMyVmFsdWUoZmxvYXRWYWx1ZSkpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgLy8gY29udmVydCBkb3VibGUgdG8gZmxvYXQKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKChmbG9hdClkb3VibGVWYWx1ZSkpOworICAgIH0KKyAgICAvLyBpZ25vcmUgYWxsIG90aGVyIEFNZXNzYWdlIHR5cGVzCit9CisKKy8vLyByZWxheGVzIENvZGVjIDIuMCBzcGVjaWZpYyB2YWx1ZSB0eXBlcyB0byBTREsgdHlwZXMgKG1haW5seSByZW1vdmVzIHNpZ25lZG5lc3MgYW5kIGNvdW50ZXJuZXNzCisvLy8gZnJvbSAzMi82NC1iaXQgdmFsdWVzLikKK3N0YXRpYyB2b2lkIHJlbGF4VmFsdWVzKFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJml0ZW0pIHsKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAodm9pZClpdGVtLmZpbmQoJmMyVmFsdWUpOworICAgIGlmIChjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkgfHwgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgQ0NvZGVjQ29uZmlnOjpnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zXywgRG9tYWluIGNvbmZpZ0RvbWFpbikgY29uc3QgeworICAgIC8vIGNyZWF0ZSBhIG1vZGlmaWFibGUgY29weSBvZiBwYXJhbXMKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gcGFyYW1zXy0+ZHVwKCk7CisgICAgQUxPR1YoImZpbHRlcmluZyB3aXRoIGNvbmZpZyBkb21haW4gJXgiLCBjb25maWdEb21haW4pOworCisgICAgLy8gY29udmVydCBzb21lIG1hY3JvIHBhcmFtZXRlcnMgdG8gQ29kZWMgMi4wIHNwZWNpZmljIGV4cHJlc3Npb25zCisKKyAgICB7IC8vIG1ha2UgaS1mcmFtZS1pbnRlcnZhbCBmcmFtZSBiYXNlZAorICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImktZnJhbWUtcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVJhdGUgPD0gMCB8fCBpRnJhbWVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xIC8qIG5vIHN5bmMgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KWMyX21pbihpRnJhbWVJbnRlcnZhbCAqIGZyYW1lUmF0ZSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClJTlQzMl9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRG9tYWluID09IChJU19WSURFTyB8IElTX0VOQ09ERVIpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY2FwdHVyZS1yYXRlIGludG8gaW5wdXQtdGltZS1zdHJldGNoCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSwgY2FwdHVyZVJhdGU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPmZpbmRBc0Zsb2F0KCJ0aW1lLWxhcHNlLWZwcyIsICZjYXB0dXJlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcHR1cmVSYXRlID4gMCAmJiBmcmFtZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgICAvLyByZWZsZWN0IHRlbXBvcmFsIGxheWVyaW5nIGludG8gYSBiaW5hcnkgYmxvYgorICAgICAgICBBU3RyaW5nIHNjaGVtYTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZzY2hlbWEpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIGludCB0YWdzOworICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbGF5ZXJpbmc7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIDF1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjZmIH0sIDB1LCAydSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC40ZiwgLjZmIH0sIDB1LCAzdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuMjVmLCAuNGYsIC42ZiB9LCAwdSwgNHUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIG51bUxheWVycyArIG51bUJMYXllcnMsIG51bUJMYXllcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCBzY2hlbWEuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobGF5ZXJpbmcuZ2V0KCksIGxheWVyaW5nLT5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIE1lZGlhRm9ybWF0IHJlY3QgdG8gQ29kZWMgMi4wIHJlY3QKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3QgZW5kOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1yaWdodCIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXJpZ2h0Iik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC13aWR0aCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1ib3R0b20iLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1ib3R0b20iKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLWhlaWdodCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJnByaW1hcmllcywgJm1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1wcmltYXJpZXMiLCBwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJNZXRhOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJNZXRhKQorICAgICAgICAgICAgICAgICYmIGhkck1ldGEtPnNpemUoKSA9PSBzaXplb2YoSERSU3RhdGljSW5mbykpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gKm1ldGEgPSAoSERSU3RhdGljSW5mbyopaGRyTWV0YS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKG1ldGEtPm1JRCA9PSBtZXRhLT5rVHlwZTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCBtZXRhLT5zVHlwZTEubVIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsIG1ldGEtPnNUeXBlMS5tUi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCBtZXRhLT5zVHlwZTEubUcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgbWV0YS0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgbWV0YS0+c1R5cGUxLm1CLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgbWV0YS0+c1R5cGUxLm1CLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsIG1ldGEtPnNUeXBlMS5tVy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCBtZXRhLT5zVHlwZTEubVcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCBtZXRhLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeVN0cmljdCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfc3RyaWN0X3R5cGUiLCBmYWxzZSk7CisgICAgLy8gdGhpcyBpcyB0byBhbGxvdyB2ZW5kb3JzIHRvIHVzZSB0aGUgd3Jvbmcgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5TGF4ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19sYXhfdHlwZSIsIGZhbHNlKTsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBmaWx0ZXJlZDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGFyYW1zLT5jb3VudEVudHJpZXMoKTsgKytpeCkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBBU3RyaW5nIG5hbWUgPSBwYXJhbXMtPmdldEVudHJ5TmFtZUF0KGl4LCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtc2dJdGVtID0gcGFyYW1zLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSBpdGVtOworICAgICAgICBjb252ZXJ0KG1zZ0l0ZW0sICZpdGVtKTsgLy8gY29udmVydCBpdGVtIHRvIHBhcmFtIHVwZGF0ZXIgaXRlbQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZlbmRvci4iKSkgeworICAgICAgICAgICAgLy8gdmVuZG9yIHBhcmFtcyBwYXNzIHRocm91Z2ggYXMgaXMKKyAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UobmFtZS5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHN0YW5kYXJkIHBhcmFtZXRlcnMgbWF5IGdldCBtb2RpZmllZCwgZmlsdGVyZWQgb3IgZHVwbGljYXRlZAorICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtU3RhbmRhcmRQYXJhbXMtPmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkobmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgLy8gbm90ZTogd2UgaWdub3JlIHBvcnQgZG9tYWluIGZvciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgY29uZmlnRG9tYWluKQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNtLmRvbWFpbigpICYgbURvbWFpbikgPT0gbURvbWFpbikgeworICAgICAgICAgICAgICAgIC8vIG1hcCBhcml0aG1ldGljIHZhbHVlcywgcGFzcyB0aHJvdWdoIHN0cmluZyBvciBidWZmZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IG1hcCBzZXR0aW5ncyB3aXRoIG1hcHBlcnMgYXMgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIDw9PiB1bnNpZ25lZCBtYXBwZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZSBwcmVjaXNlIGFib3V0IHNpZ25lZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeVN0cmljdCB8fCBjbS5tYXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGNtLm1hcEZyb21NZXNzYWdlKHBhcmFtcy0+Z2V0RW50cnlBdChpeCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGFsbG93IHRvIHJlbGF4IHR5cGUgc3RyaWN0bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlMYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhWYWx1ZXMoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShjbS5wYXRoKCksIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmaWx0ZXJlZCAlcyB0byAlcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKKyAgICAgICAgICAgIGZpbHRlcmVkLmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgIHJldHVybiBmaWx0ZXJlZDsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBjb25maWdEb21haW4sCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3QgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBwYXJhbXMgPSBnZXRSZWZsZWN0ZWRGb3JtYXQoc2RrUGFyYW1zLCBjb25maWdEb21haW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UocGFyYW1zLCAmaW5kaWNlcyk7CisgICAgaWYgKGluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgibm8gcmVjb2duaXplZCBwYXJhbXMgaW46ICVzIiwgcGFyYW1zLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25maWdVcGRhdGUtPmNsZWFyKCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN1cHBvcnRlZEluZGljZXM7CisgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IGluZGljZXMpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGl4KSkgeworICAgICAgICAgICAgc3VwcG9ydGVkSW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpeCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdVcGRhdGUtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCppdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgfSwgc3VwcG9ydGVkSW5kaWNlcywgYmxvY2tpbmcsIGNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLT5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKworICAgIGlmIChjb25maWdVcGRhdGUtPnNpemUoKSkgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShwYXJhbXMsIGNvbmZpZ1VwZGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzZXRQYXJhbWV0ZXJzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKGNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtVmVjdG9yOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBjb21wb25lbnQgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbVZlY3Rvci5wdXNoX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2socGFyYW0tPmluZGV4KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBtTG9jYWxQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDMlBhcmFtOjpDb3B5KCpwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdG9yKGNvcHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVkIGxvY2FsIHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW3BhcmFtLT5pbmRleCgpXSA9IHN0ZDo6bW92ZShjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBzZXQgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgc3Vic2NyaWJlZCBwYXJhbSBpbmRpY2VzCisgICAgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29tcG9uZW50LCBpbmRpY2VzLCBibG9ja2luZyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5jb25maWcocGFyYW1WZWN0b3IsIGJsb2NraW5nLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImNvbmZpZyBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBub24tZmF0YWwuCisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICBzd2l0Y2ggKGZhaWx1cmUtPmZhaWx1cmUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgICAgICAgICAgQUxPR0QoIkJhZCBwYXJhbWV0ZXIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsdXJlID0gJWQiLCBpbnQoZmFpbHVyZS0+ZmFpbHVyZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmUtcXVlcnkgcGFyYW1ldGVyIHZhbHVlcyBpbiBjYXNlIGNvbmZpZyBjb3VsZCBub3QgdXBkYXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY3VycmVudAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgYmxvY2tpbmcsICZjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKyAgICAodm9pZCl1cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZ1VwZGF0ZSwgQUxMKTsKKworICAgIC8vIFRPRE86IGVycm9yIHZhbHVlCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgQzJQYXJhbSAqQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWZlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfQ09ORklHX0hfCisjZGVmaW5lIENfQ09ERUNfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBTdGFuZGFyZFBhcmFtczsKKworLyoqCisgKiBTdHJ1Y3QgbWFuYWdpbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIENDb2RlYy4KKyAqLworc3RydWN0IENDb2RlY0NvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBEb21haW4gY29uc2lzdHMgb2YgYSBiaXRtYXNrIGRpdmlkZWQgaW50byBmaWVsZHMsIGFuZCBzcGVjaWZpZXJzIHdvcmsgYnkgZXhjbHVkaW5nIG90aGVyCisgICAgICogdmFsdWVzIGluIHRob3NlIGRvbWFpbnMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgZG9tYWlucyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIElTXyBjb25zdGFudHMsIGUuZy4KKyAgICAgKiBJU19ERUNPREVSIHwgSVNfQVVESU8uCisgICAgICoKKyAgICAgKiBDb25maWcgc3BlY2lmaWVycyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIG1hc2sgY29uc3RhbnRzLCBhbmQKKyAgICAgKiBhbmQtaW5nIHRoZXNlIGdyb3VwczogZS5nLiAoREVDT0RFUiB8IEVOQ09ERVIpICYgQVVESU8uCisgICAgICoKKyAgICAgKiBUaGUgbmFtaW5nIG9mIHRoZXNlIGNvbnN0YW50cyB3YXMgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBtYXNrIG5hbWVzIGFzIHRoZXNlIGFyZSB1c2VkIG1vcmUKKyAgICAgKiBjb21tb25seSBhcyBtYXNrcy4KKyAgICAgKi8KKyAgICBlbnVtIERvbWFpbiA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiAoZG9tYWluICYga2luZCkKKyAgICAgICAgR1VBUkRfQklUICAgPSAoMSA8PCAxKSwgICAvLy88IHRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IGFjY2lkZW50YWwgJiYgb3IgfHwgdXNhZ2UKKyAgICAgICAgSVNfQVVESU8gICAgPSAoMSA8PCAyKSwgICAvLy88IGZvciBhdWRpbyBjb2RlY3MKKyAgICAgICAgSVNfVklERU8gICAgPSAoMSA8PCAzKSwgICAvLy88IGZvciB2aWRlbyBjb2RlY3MKKyAgICAgICAgSVNfSU1BR0UgICAgPSAoMSA8PCA0KSwgICAvLy88IGZvciBpbWFnZSBjb2RlY3MKKyAgICAgICAgT1RIRVJfRE9NQUlOID0gKDEgPDwgNSksICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgSVNfRU5DT0RFUiAgPSAoMSA8PCA2KSwgICAvLy88IGZvciBlbmNvZGVycworICAgICAgICBJU19ERUNPREVSICA9ICgxIDw8IDcpLCAgIC8vLzwgZm9yIGRlY29kZXJzCisgICAgICAgIE9USEVSX0tJTkQgID0gKDEgPDwgOCksICAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIC8vIGNvbmZpZyBkb21haW4KKyAgICAgICAgSVNfUEFSQU0gICAgPSAoMSA8PCA5KSwgICAvLy88IGZvciBzZXRQYXJhbWV0ZXIKKyAgICAgICAgSVNfQ09ORklHICAgPSAoMSA8PCAxMCksICAvLy88IGZvciBjb25maWd1cmUKKyAgICAgICAgSVNfUkVBRCAgICAgPSAoMSA8PCAxMSksICAvLy88IGZvciBnZXRGb3JtYXQKKworICAgICAgICAvLyBwb3J0IGRvbWFpbgorICAgICAgICBJU19JTlBVVCAgICA9ICgxIDw8IDEyKSwgIC8vLzwgZm9yIGlucHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfT1VUUFVUICAgPSAoMSA8PCAxMyksICAvLy88IGZvciBvdXRwdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19SQVcgICAgICA9ICgxIDw8IDE0KSwgIC8vLzwgZm9yIHJhdyBwb3J0IChpbnB1dC1lbmNvZGVyLCBvdXRwdXQtZGVjb2RlcikKKyAgICAgICAgSVNfQ09ERUQgICAgPSAoMSA8PCAxNSksICAvLy88IGZvciBjb2RlZCBwb3J0IChpbnB1dC1kZWNvZGVyLCBvdXRwdXQtZW5jb2RlcikKKworICAgICAgICBBTEwgICAgID0gfjBVLAorICAgICAgICBOT05FICAgID0gMCwKKworICAgICAgICBBVURJTyAgID0gfihJU19JTUFHRSB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgVklERU8gICA9IH4oSVNfQVVESU8gfCBJU19JTUFHRSB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIElNQUdFICAgPSB+KElTX0FVRElPIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorCisgICAgICAgIERFQ09ERVIgPSB+KElTX0VOQ09ERVIgfCBPVEhFUl9LSU5EKSwKKyAgICAgICAgRU5DT0RFUiA9IH4oSVNfREVDT0RFUiB8IE9USEVSX0tJTkQpLAorCisgICAgICAgIFBBUkFNICAgPSB+KElTX0NPTkZJRyB8IElTX1JFQUQpLAorICAgICAgICBDT05GSUcgID0gfihJU19QQVJBTSAgfCBJU19SRUFEKSwKKyAgICAgICAgUkVBRCAgICA9IH4oSVNfQ09ORklHIHwgSVNfUEFSQU0pLAorCisgICAgICAgIElOUFVUICAgPSB+KElTX09VVFBVVCB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgT1VUUFVUICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBSQVcgICAgID0gfihJU19JTlBVVCAgfCBJU19PVVRQVVQgfCBJU19DT0RFRCksCisgICAgICAgIENPREVEICAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX09VVFBVVCksCisgICAgfTsKKworICAgIC8vIHRoaW5ncyByZXF1aXJlZCB0byBtYW5hZ2UgZm9ybWF0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1QYXJhbURlc2NzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4gbVBhcmFtVXBkYXRlcjsKKworICAgIERvbWFpbiBtRG9tYWluOyAvLyBjb21wb25lbnQgZG9tYWluCisgICAgRG9tYWluIG1JbnB1dERvbWFpbjsgLy8gaW5wdXQgcG9ydCBkb21haW4KKyAgICBEb21haW4gbU91dHB1dERvbWFpbjsgLy8gb3V0cHV0IHBvcnQgZG9tYWluCisgICAgc3RkOjpzdHJpbmcgbUNvZGluZ01lZGlhVHlwZTsgIC8vIG1lZGlhIHR5cGUgb2YgdGhlIGNvZGVkIHN0cmVhbQorCisgICAgLy8gc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhbmRhcmRQYXJhbXM+IG1TdGFuZGFyZFBhcmFtczsKKworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3VwcG9ydGVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdWJzY3JpYmVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHRvIHN1YnNjcmliZSB0bworICAgIHNpemVfdCBtU3Vic2NyaWJlZEluZGljZXNTaXplOyAvLy88IGNvdW50IG9mIGN1cnJlbnRseSBzdWJzY3JpYmVkIGluZGljZXMKKworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICBib29sIG1Vc2luZ1N1cmZhY2U7IC8vLzwgdXNpbmcgaW5wdXQgb3Igb3V0cHV0IHN1cmZhY2UKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWc+IG1JU0NvbmZpZzsKKworICAgIC8vLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBVcGRhdGVkIGFmdGVyIGNvbmZpZ3VyZSgpIGFuZCBiYXNlZCBvbiBjb25maWdVcGRhdGUgaW4KKyAgICAvLy8gb25Xb3JrRG9uZQorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1DdXJyZW50Q29uZmlnOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYpPiBMb2NhbFBhcmFtVmFsaWRhdG9yOworCisgICAgLy8vIFBhcmFtZXRlciBpbmRpY2VzIHRyYWNrZWQgaW4gY3VycmVudCBjb25maWcgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgIC8vLyB0aGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiByZW1haW4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAvLy8gYXMgc3VjaCwgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGRlcGVuZGVuY2llcy4gVE9ETzogdXNlIEMySW50ZXJmYWNlSGVscGVyIGZvciB0aGlzLgorICAgIC8vLyBGb3Igbm93IHN1cHBvcnQgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBMb2NhbFBhcmFtVmFsaWRhdG9yPiBtTG9jYWxQYXJhbXM7CisKKyAgICBDQ29kZWNDb25maWcoKTsKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKKyAgICAvLy8gcmVmbGVjdGVkIHBhcmFtIGhlbHBlciwgZG9tYWluLCBzdGFuZGFyZCBwYXJhbXMsIGFuZCBzdWJzY3JpYmVzIHRvIHN0YW5kYXJkCisgICAgLy8vIGluZGljZXMuCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZQorICAgICAqIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpbiBjYXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRTsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSB8fCBtTG9jYWxQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoImlnbm9yaW5nIGxvY2FsIHBhcmFtICVzICglI3gpIGFzIGl0IGlzIGFscmVhZHkgJXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICh1aW50MzJfdClpbmRleCwgbVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpID8gInN1cHBvcnRlZCIgOiAibG9jYWwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCBvciBhbHJlYWR5IGFkZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIHR5cGVkIHZhbGlkYXRvciBpbnRvIHVudHlwZWQgdmFsaWRhdG9yCisgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yOworICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgdmFsaWRhdG9yID0gW3ZhbGlkYXRvcl9dKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCl7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiB0eXBlZChzdGF0aWNfY2FzdDxUKj4ocC5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHR5cGVkCisgICAgICAgICAgICAgICAgaWYgKFQ6OkZyb20odHlwZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRvcl8odHlwZWQpOworICAgICAgICAgICAgICAgICAgICBwLnJlc2V0KHR5cGVkLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbUxvY2FsUGFyYW1zLmVtcGxhY2UoaW5kZXgsIHZhbGlkYXRvcik7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08VD4obmFtZSwgYXR0cmliKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGVmYXVsdF8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBpZiAoYWRkTG9jYWxQYXJhbTxUPihuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pKSB7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHZhbGlkYXRvcl8oZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImRlZmF1bHQgdmFsdWUgZm9yICVzIGlzIGludmFsaWQgPT4gJXMiLCBuYW1lLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbVDo6UEFSQU1fVFlQRV0gPSBzdGQ6Om1vdmUoZGVmYXVsdF8pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgVCAqZGVmYXVsdF8sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NhbFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxUPihkZWZhdWx0XyksIG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXyk7CisgICAgfQorCisgICAgLy8vIEFwcGxpZXMgY29uZmlndXJhdGlvbiB1cGRhdGVzLCBhbmQgdXBkYXRlcyBmb3JtYXQgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdHMgd2VyZSB1cGRhdGVkCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pOworCisgICAgLy8vIFVwZGF0ZXMgZm9ybWF0cyBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBmb3JtYXRzIGhhdmUgY2hhbmdlZC4KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKTsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgU0RLIGNvbmZpZ3VyYXRpb25zIGluIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkb21haW4uCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBkb21haW4sCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSB0byB0aGUgY29tcG9uZW50LgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyk7CisKKyAgICAvLy8gUXVlcmllcyBzdWJzY3JpYmVkIGluZGljZXMgKHdoaWNoIGNvbnRhaW5zIGFsbCBTREstZXhwb3NlZCB2YWx1ZXMpIGFuZCB1cGRhdGVzCisgICAgLy8vIGlucHV0L291dHB1dCBmb3JtYXRzLgorICAgIHN0YXR1c190IHF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvLy8gUXVlcmllcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAvLy8gcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAgY29uc3QgQzJQYXJhbSAqZ2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhbmQgaWYgdGhleSBjaGFuZ2UuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgV2F0Y2hlciB7CisgICAgICAgIH5XYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAgICAgICBib29sIGhhc0NoYW5nZWQoKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgJiYgbVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZSAhPSAqbVZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbVZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgaXQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IHVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdhdGNoZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IENDb2RlY0NvbmZpZyAqcGFyZW50KQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCksIG1JbmRleChpbmRleCkgeworICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RydWN0IENDb2RlY0NvbmZpZzsKKworICAgICAgICBjb25zdCBDQ29kZWNDb25maWcgKm1QYXJlbnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiBtVmFsdWU7CisgICAgICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdGNoZXIgb2JqZWN0IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFdhdGNoZXI8VD4gd2F0Y2goQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFKSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleC50eXBlKCkgIT0gVDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHZvaWQgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLy8gQWRkcyBpbmRpY2VzIHRvIHRoZSBzdWJzY3JpYmVkIGluZGljZXMsIGFuZCB1cGRhdGVkIHN1YnNjcmlwdGlvbiB0byBjb21wb25lbnQKKyAgICAvLy8gXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgIHN0YXR1c190IHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgc3A8QU1lc3NhZ2U+IGdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gZG9tYWluKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhbiBBTWVzc2FnZSB0byBhIGxpc3Qgb2YgcGF0aC1iYXNlZCBDb2RlYworICAgICAqIDIuMCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICovCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmY29uZmlnLCBEb21haW4gZG9tYWluKSBjb25zdDsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyhDQ29kZWNDb25maWc6OkRvbWFpbikKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNTczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENvZGVjMkJ1ZmZlcgorCitib29sIENvZGVjMkJ1ZmZlcjo6Y2FuQ29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICBpZiAoY29uc3RfY2FzdDxDb2RlYzJCdWZmZXIgKj4odGhpcyktPmJhc2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA+IDF1KSB7CisgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIGNvcHkgbW9yZSB0aGFuIG9uZSBibG9ja3MuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgLy8gSXQgd29uJ3QgZml0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjMkJ1ZmZlcjo6Y29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2FuQ29weUxpbmVhcigpIGNoZWNrcyBwYXNzZWQuCisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID09IDB1CisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgc2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJFcnJvciB3aGlsZSBtYXBwaW5nOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuY2FwYWNpdHkoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkMyQ29uc3RMaW5lYXJCbG9jayBsaWVkIC0tLSBpdCBhY3R1YWxseSBkb2Vzbid0IGZpdDogdmlldygldSkgPiB0aGlzKCV6dSkiLAorICAgICAgICAgICAgICAgIHZpZXcuY2FwYWNpdHkoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KGJhc2UoKSwgdmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgc2V0UmFuZ2UoMCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzJCdWZmZXI6OnNldEltYWdlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKSB7CisgICAgbUltYWdlRGF0YSA9IGltYWdlRGF0YTsKK30KKworLy8gTG9jYWxMaW5lYXJCdWZmZXIKKworYm9vbCBMb2NhbExpbmVhckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FuQ29weUxpbmVhcihidWZmZXIpOworfQorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHJldHVybiBjb3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKKy8vIER1bW15Q29udGFpbmVyQnVmZmVyCisKK3N0YXRpYyB1aW50OF90IHNEdW1teUJ5dGVbMV0gPSB7IDAgfTsKKworRHVtbXlDb250YWluZXJCdWZmZXI6OkR1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc0R1bW15Qnl0ZSwgMSkpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpIHsKKyAgICBzZXRSYW5nZSgwLCBidWZmZXIgPyAxIDogMCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gRHVtbXlDb250YWluZXJCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1CdWZmZXJSZWY7Cit9CisKK2Jvb2wgRHVtbXlDb250YWluZXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICBzZXRSYW5nZSgwLCBtQnVmZmVyUmVmID8gMSA6IDApOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPExpbmVhckJsb2NrQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgQzJXcml0ZVZpZXcgd3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgaWYgKHdyaXRlVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHdyaXRlVmlldyksIGJsb2NrKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihtQmxvY2stPnNoYXJlKG9mZnNldCgpLCBzaXplKCksIEMyRmVuY2UoKSkpOworfQorCitib29sIExpbmVhckJsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworTGluZWFyQmxvY2tCdWZmZXI6OkxpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJXcml0ZVZpZXcmJiB3cml0ZVZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcih3cml0ZVZpZXcuZGF0YSgpLCB3cml0ZVZpZXcuc2l6ZSgpKSksCisgICAgICBtV3JpdGVWaWV3KHdyaXRlVmlldyksCisgICAgICBtQmxvY2soYmxvY2spIHsKK30KKworLy8gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3KGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpKTsKKyAgICBpZiAocmVhZFZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHJlYWRWaWV3KSwgYnVmZmVyKTsKK30KKworQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIEMyUmVhZFZpZXcmJiByZWFkVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoCisgICAgICAgICAgICAvLyBOT1RFOiBBQnVmZmVyIG9ubHkgdGFrZXMgbm9uLWNvbnN0IHBvaW50ZXIgYnV0IHRoaXMgZGF0YSBpcworICAgICAgICAgICAgLy8gICAgICAgc3VwcG9zZWQgdG8gYmUgcmVhZC1vbmx5LgorICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KHJlYWRWaWV3LmRhdGEoKSksIHJlYWRWaWV3LmNhcGFjaXR5KCkpKSwKKyAgICAgIG1SZWFkVmlldyhyZWFkVmlldyksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworLy8gR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcgorCituYW1lc3BhY2UgeworCitjbGFzcyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgQzJHcmFwaGljVmlldyA8PT4gTWVkaWFJbWFnZSBjb252ZXJ0ZXIKKyAgICAgKgorICAgICAqIFxwYXJhbSB2aWV3IEMyR3JhcGhpY1ZpZXcgb2JqZWN0CisgICAgICogXHBhcmFtIGNvbG9yRm9ybWF0IGRlc2lyZWQgU0RLIGNvbG9yIGZvcm1hdCBmb3IgdGhlIE1lZGlhSW1hZ2UgKGlmIHRoaXMgaXMgYSBmbGV4aWJsZSBmb3JtYXQsCisgICAgICogICAgICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzaW1wbHkgcmVwcmVzZW50IHRoZSBncmFwaGljIHZpZXcgYXMgYSBmbGV4aWJsZSBTREsgZm9ybWF0CisgICAgICogICAgICAgIHdpdGhvdXQgYSBtZW1jcHkpCisgICAgICovCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcigKKyAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGludDMyX3QgY29sb3JGb3JtYXQpCisgICAgICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgICAgICBtVmlldyh2aWV3KSwKKyAgICAgICAgICBtV2lkdGgodmlldy53aWR0aCgpKSwKKyAgICAgICAgICBtSGVpZ2h0KHZpZXcuaGVpZ2h0KCkpLAorICAgICAgICAgIG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCisgICAgICAgICAgbUFsbG9jYXRlZERlcHRoKDApLAorICAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgICBtTWVkaWFJbWFnZShuZXcgQUJ1ZmZlcihzaXplb2YoTWVkaWFJbWFnZTIpKSkgeworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB2aWV3LmVycm9yKCkgPSAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lZGlhSW1hZ2UyICptZWRpYUltYWdlID0gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICAgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IDAgcGxhbmVzIik7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbXNldChtZWRpYUltYWdlLCAwLCBzaXplb2YoKm1lZGlhSW1hZ2UpKTsKKyAgICAgICAgbUFsbG9jYXRlZERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aDsKKyAgICAgICAgdWludDMyX3QgYml0RGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmJpdERlcHRoOworCisgICAgICAgIC8vIGFsaWduIHdpZHRoIGFuZCBoZWlnaHQgdG8gc3VwcG9ydCBzdWJzYW1wbGluZyBjbGVhbmx5CisgICAgICAgIHVpbnQzMl90IG1TdHJpZGUgPSBhbGlnbihtV2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICB1aW50MzJfdCBtVlN0cmlkZSA9IGFsaWduKG1IZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgeyAgLy8gdHJ5IHRvIG1hcCBkaXJlY3RseS4gY2hlY2sgaWYgdGhlIHBsYW5lcyBhcmUgbmVhciBvbmUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZVNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBtaW5PZmZzZXQgPSBwbGFuZS5taW5PZmZzZXQobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGFuIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IGdyYWxsb2MgZG9lcyBhc3N1bWUgYSBjb250aWd1b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Sb3dJbmMgPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLCBtYXhQdHIgLSBtaW5QdHIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKiA1IC8gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aCA9IGJpdERlcHRoOworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGhBbGxvY2F0ZWQgPSBtQWxsb2NhdGVkRGVwdGg7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicmlnaHRTaGlmdCB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLnJpZ2h0U2hpZnQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoID4gOCAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IEMyUGxhbmVJbmZvOjpOQVRJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZW5kaWFubmVzcyB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLmVuZGlhbm5lc3MpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IG1BbGxvY2F0ZWREZXB0aCB8fCBwbGFuZS5iaXREZXB0aCAhPSBiaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaWZmZXJlbnQgYWxsb2NhdGVkRGVwdGgvYml0RGVwdGggcGVyIHBsYW5lIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJTaXplICs9IG1TdHJpZGUgKiBtVlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbUluaXRDaGVjazsgfQorCisgICAgdWludDMyX3QgYmFja0J1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQmFja0J1ZmZlclNpemU7IH0KKworICAgIC8qKgorICAgICAqIFdyYXAgQzJHcmFwaGljVmlldyB1c2luZyBhIE1lZGlhSW1hZ2UyLiBOb3RlIHRoYXQgaWYgbm90IHdyYXBwZWQsIHRoZSBjb250ZW50IGlzIG5vdCBtYXBwZWQKKyAgICAgKiBpbiB0aGlzIGZ1bmN0aW9uIC0tLSB0aGUgY2FsbGVyIHNob3VsZCB1c2UgQ29weUdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2UoKSBmdW5jdGlvbiB0byBjb3B5IHRoZQorICAgICAqIGRhdGEgaW50byBhIGJhY2tpbmcgYnVmZmVyIGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIG1lZGlhIGJ1ZmZlci4gVGhpcyBpcyBudWxsIGlmIHdyYXBwaW5nIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiB3cmFwKCkgY29uc3QgeworICAgICAgICBpZiAobUJhY2tCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgc2V0QmFja0J1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYmFja0J1ZmZlcikgeworICAgICAgICBpZiAoYmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhY2tCdWZmZXItPmNhcGFjaXR5KCkgPCBtQmFja0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBiYWNrQnVmZmVyLT5zZXRSYW5nZSgwLCBtQmFja0J1ZmZlclNpemUpOworICAgICAgICBtQmFja0J1ZmZlciA9IGJhY2tCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgQzJHcmFwaGljVmlldyB0byBNZWRpYUltYWdlMi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb3B5VG9NZWRpYUltYWdlKCkgeworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltYWdlQ29weShtQmFja0J1ZmZlci0+YmFzZSgpLCBnZXRNZWRpYUltYWdlKCksIG1WaWV3KTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbU1lZGlhSW1hZ2U7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgY29uc3QgQzJHcmFwaGljVmlldyBtVmlldzsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Db2xvckZvcm1hdDsgIC8vLzwgU0RLIGNvbG9yIGZvcm1hdCBmb3IgTWVkaWFJbWFnZQorICAgIHNwPEFCdWZmZXI+IG1XcmFwcGVkOyAgLy8vPCB3cmFwcGVkIGJ1ZmZlciAoaWYgd2UgY2FuIG1hcCBDMkJ1ZmZlciB0byBhbiBBQnVmZmVyKQorICAgIHVpbnQzMl90IG1BbGxvY2F0ZWREZXB0aDsKKyAgICB1aW50MzJfdCBtQmFja0J1ZmZlclNpemU7CisgICAgc3A8QUJ1ZmZlcj4gbU1lZGlhSW1hZ2U7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBtQWxsb2M7CisKKyAgICBzcDxBQnVmZmVyPiBtQmFja0J1ZmZlcjsgICAgLy8vPCBiYWNraW5nIGJ1ZmZlciBpZiB3ZSBoYXZlIHRvIGNvcHkgQzJCdWZmZXIgPD0+IEFCdWZmZXIKKworICAgIE1lZGlhSW1hZ2UyICpnZXRNZWRpYUltYWdlKCkgeworICAgICAgICByZXR1cm4gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gR3JhcGhpY0Jsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBDMkdyYXBoaWNWaWV3IHZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJDMkdyYXBoaWNCbG9jazo6bWFwIGZhaWxlZDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcih2aWV3LCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IGNvbnZlcnRlci53cmFwKCk7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyIGZhaWxlZCB0byBzZXQgYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHdyYXBwZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIGNvbnZlcnRlci5pbWFnZURhdGEoKSwKKyAgICAgICAgICAgIHdyYXBwZWQpOworfQorCitHcmFwaGljQmxvY2tCdWZmZXI6OkdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgYm9vbCB3cmFwcGVkKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgYnVmZmVyKSwKKyAgICAgIG1WaWV3KHZpZXcpLAorICAgICAgbUJsb2NrKGJsb2NrKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgdWludDMyX3Qgd2lkdGggPSBtVmlldy53aWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1WaWV3LmhlaWdodCgpOworICAgIGlmICghbVdyYXBwZWQpIHsKKyAgICAgICAgKHZvaWQpSW1hZ2VDb3B5KG1WaWV3LCBiYXNlKCksIGltYWdlRGF0YSgpKTsKKyAgICB9CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbUJsb2NrLT5zaGFyZShDMlJlY3Qod2lkdGgsIGhlaWdodCksIEMyRmVuY2UoKSkpOworfQorCisvLyBHcmFwaGljTWV0YWRhdGFCdWZmZXIKK0dyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6R3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2MpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpKSwKKyAgICAgIG1BbGxvYyhhbGxvYykgeworICAgICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKSktPnBCdWZmZXIgPSBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyNpZm5kZWYgX19MUDY0X18KKyAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICptZXRhID0gKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYXNlKCk7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIgKiltZXRhLT5wQnVmZmVyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiVmlkZW9OYXRpdmVNZXRhZGF0YSBjb250YWlucyBudWxsIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBBTE9HVigiVmlkZW9OYXRpdmVNZXRhZGF0YTogJWR4JWQiLCBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCk7CisgICAgQzJIYW5kbGUgKmhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICBidWZmZXItPndpZHRoLAorICAgICAgICAgICAgYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICBidWZmZXItPnN0cmlkZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvYy0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHdyYXAgVmlkZW9OYXRpdmVNZXRhZGF0YSBpbnRvIEMyR3JhcGhpY0FsbG9jYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICBtZXRhLT5wQnVmZmVyID0gMDsKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKKyNlbHNlCisgICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGFCdWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSB2aWV3LgorICAgICAgICBob2xkZXIgPSBzdGQ6Om1vdmUodmlldyk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2Mod2lkdGggKiBoZWlnaHQgKiA0KSk7CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBmYWxzZSk7Cit9CisKK0NvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgIGJvb2wgd3JhcHBlZCkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIGFCdWZmZXIpLAorICAgICAgbVZpZXcoc3RkOjptb3ZlKHZpZXcpKSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICBtVmlldy5yZXNldCgpOworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKG1XcmFwcGVkIHx8IG1CdWZmZXJSZWYpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiAlc3dyYXBwZWQgOyBidWZmZXIgcmVmICVzIiwKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA/ICIiIDogIm5vdCAiLCBtQnVmZmVyUmVmID8gImV4aXN0cyIgOiAiZG9lc24ndCBleGlzdCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogYnVmZmVyIHByZWNvbmRpdGlvbiB1bnNhdGlzZmllZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogdG9vIG1hbnkgYmxvY2tzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYmFzZSgpLCBjYXBhY2l0eSgpKTsKKyAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGFCdWZmZXIpKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogc2V0IGJhY2sgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDYxOGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbUltYWdlRGF0YTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgKi8KK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgd2l0aCBsb2NhbCBsaW5lYXIgYnVmZmVyIGZvcgorICAgICAqIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqLworICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBHcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBncmFwaGljIEMyQnVmZmVyIG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBleHBvc2VzIHRoZSB1bmRlcmx5aW5nIGJpdHMgdmlhIGFjY2Vzc29yIEFQSXMgYW5kICJpbWFnZS1kYXRhIgorICogbWV0YWRhdGEsIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhdCBhbGxvY2F0aW9uIHRpbWUuCisgKi8KK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKiBJZiB8YnVmZmVyfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3aGljaCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggbm8gd3JhcHBpbmcgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3A8QUJ1ZmZlcj4gbUltYWdlRGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyTGluZWFyQmxvY2sgZm9yIGNvbXBvbmVudAorICogYW5kIElNZW1vcnkgZm9yIGNsaWVudC4gVW5kZXJseWluZyBDMkxpbmVhckJsb2NrIHdvbid0IGJlIG1hcHBlZCBmb3Igc2VjdXJlCisgKiB1c2VjYXNlcy4uCisgKi8KK2NsYXNzIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEVuY3J5cHRlZExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrCisgICAgICogb2JqZWN0IGFuZCB3cml0YWJsZSBJTWVtb3J5IHJlZ2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICAgICAgQzJMaW5lYXJCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgbWVtb3J5ICAgICAgSU1lbW9yeSBvYmplY3QgdG8gc3RvcmUgZW5jcnlwdGVkIGNvbnRlbnQuCisgICAgICogXHBhcmFtICAgaGVhcFNlcU51bSAgSGVhcCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBJQ3J5cHRvOyAtMSBpZiBOL0EKKyAgICAgKi8KKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnksCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0gPSAtMSk7CisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgfkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIHRoZSBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGJhc2VkIG9uCisgICAgICogaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc291cmNlICBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB0byBmaWxsLgorICAgICAqLworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcihJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgKnNvdXJjZSk7CisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIHxkZWNyeXB0ZWR8IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuIFRoaXMgc2hhbGwKKyAgICAgKiBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgZGVjcnlwdGVkICAgZGVjcnlwdGVkIGNvbnRlbnQgdG8gY29weSBmcm9tLgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudChjb25zdCBzcDxJTWVtb3J5PiAmZGVjcnlwdGVkLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4KKyAgICAgKiBUaGlzIHNoYWxsIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG5hdGl2ZSBoYW5kbGUgb2Ygc2VjdXJlIGJ1ZmZlciB1bmRlcnN0b29kIGJ5IElDcnlwdG8uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNlY3VyZSBidWZmZXIgaGFuZGxlCisgICAgICovCisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSBjb25zdDsKKworcHJpdmF0ZToKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMGE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkluZm9CdWlsZGVyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiQ29kZWMySW5mb0J1aWxkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBUcmFpdHMgPSBDMkNvbXBvbmVudDo6VHJhaXRzOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2Jvb2wgaGFzUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICBzaXplX3QgcHJlZml4TGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgcmV0dXJuIHMuY29tcGFyZSgwLCBwcmVmaXhMZW4sIHByZWZpeCkgPT0gMDsKK30KKworYm9vbCBoYXNTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgIHNpemVfdCBzdWZmaXhMZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICByZXR1cm4gc3VmZml4TGVuID4gcy5zaXplKCkgPyBmYWxzZSA6CisgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOworfQorCit2b2lkIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWVkaWEgdHlwZSwgcGFzcyB0aHJvdWdoIGFsbCB2YWx1ZXMgdW5tYXBwZWQKKworICAgIC8vIFRPRE86IHdlIGNhbm5vdCBmaW5kIGxldmVscyB0aGF0IGFyZSBsb2NhbCAnbWF4aW1hJyB3aXRob3V0IGtub3dpbmcgdGhlIGNvZGluZworICAgIC8vIGUuZy4gSC4yNjMgbGV2ZWwgNDUgYW5kIGxldmVsIDMwIGNvdWxkIGJlIHR3byB2YWx1ZXMgZm9yIGhpZ2hlc3QgbGV2ZWwgYXMKKyAgICAvLyB0aGV5IGRvbid0IGluY2x1ZGUgb25lIGFub3RoZXIuIEZvciBub3cgd2UgdXNlIHRoZSBsYXN0IHN1cHBvcnRlZCB2YWx1ZS4KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvIHBsKGVuY29kZXIgLyogb3V0cHV0ICovLCAwdSk7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBwcm9maWxlUXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLnByb2ZpbGUpKQorICAgIH07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhwcm9maWxlUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgcHJvZmlsZXMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LIHx8IHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIG9ubHkgaGFuZGxlIGVudW1lcmF0ZWQgdmFsdWVzCisgICAgaWYgKHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICBib29sIHN1cHBvcnRzSGRyID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKKyAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOworICAgIGlmIChlcnIxID09IEMyX09LKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKHVpbnQzMl90KWRlc2MtPmluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIxMFBsdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0hkciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIFZQOSwgdGhlIHN0YXRpYyBpbmZvIGlzIGFsd2F5cyBwcm9wYWdhdGVkIGJ5IGZyYW1ld29yay4KKyAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSk7CisKKyAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSBwcm9maWxlIDogcHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgcGwucHJvZmlsZSA9IChDMkNvbmZpZzo6cHJvZmlsZV90KXByb2ZpbGUucmVmPHVpbnQzMl90PigpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGVyciA9IGludGYtPmNvbmZpZyh7JnBsfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQUxPR1YoInNldCBwcm9maWxlIHRvICV1IC0+ICVzIiwgcGwucHJvZmlsZSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbGV2ZWxRdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudChDMlBhcmFtRmllbGQoJnBsLCAmcGwubGV2ZWwpKQorICAgICAgICB9OworICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhsZXZlbFF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBsZXZlbHMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKGxldmVsUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgbGV2ZWxRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUworICAgICAgICAgICAgICAgIHx8IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUgbGV2ZWwgPSBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuYmFjaygpOworICAgICAgICBwbC5sZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdClsZXZlbC5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0aW5nIGxldmVsOiAldSIsIHBsLmxldmVsKTsKKyAgICAgICAgaW50MzJfdCBzZGtQcm9maWxlLCBzZGtMZXZlbDsKKyAgICAgICAgaWYgKG1hcHBlciAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChwbC5sZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgLy8gYWxzbyBsaXN0IEhEUiBwcm9maWxlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgSERSCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaGRyTWFwcGVyICYmIGhkck1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIxMFBsdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5tZWRpYVR5cGUsIHRydWUgLyppc0hkcjEwUGx1cyovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcHBlcikgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBILjI2MyBhbHNvIGFkdmVydGlzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgaWYgdGhlCisgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMAorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gc29tZSBmb3JtIG9mIGEgc2V0dGluZyBzbyBpdCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGJlIGhlcmUKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBuZXh0TGV2ZWwgPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KXYucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1ICYmIGxldmVsID4gbmV4dExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXh0TGV2ZWwgIT0gQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICAmJiBuZXh0TGV2ZWwgIT0gcGwubGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChuZXh0TGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgICh2b2lkKWludGY7CisKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCisgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPworICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gdmVuZG9yIHZpZGVvIGNvZGVjcyBwcmVmZXIgb3BhcXVlIGZvcm1hdAorICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworICAgICAgICAvLyBmcmFtZXdvcmsgdmlkZW8gZW5jb2RlcnMgbXVzdCBzdXBwb3J0IHN1cmZhY2UgZm9ybWF0LCB0aG91Z2ggaXQgaXMgdW5jbGVhcgorICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgaWYgKGVuY29kZXIgJiYgdHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IENvZGVjMkluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgcnVuLXRpbWUgY29uZmlndXJhdGlvbnMgb25jZSBhbGwgY29kZWNzIGFyZSB3b3JraW5nCisgICAgLy8gcHJvcGVybHkuIChBc3N1bWUgImZ1bGwiIGJlaGF2aW9yIGV2ZW50dWFsbHkuKQorICAgIC8vCisgICAgLy8gZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIHN1cHBvcnRzIDUgdmFsdWVzLgorICAgIC8vICAgMCAtIE5vIENvZGVjIDIuMCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gICAxIC0gQXVkaW8gZGVjb2RlcnMgYW5kIGVuY29kZXJzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZQorICAgIC8vICAgICAgIGFuZCByYW5rZWQgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIHdpdGgKKyAgICAvLyAgICAgICB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAyIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMyAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgNCAtIEFsbCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSAoYm9vdCB0aW1lKSBpcyAxLgorICAgIC8vCisgICAgLy8gTm90ZTogQ3VycmVudGx5LCBPTVggY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDEwMCwgd2hpbGUgYWxsCisgICAgLy8gQ29kZWMyLjAgc29mdHdhcmUgY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDIwMC4KKyAgICBpbnQgb3B0aW9uID0gOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIiwgMSk7CisKKyAgICAvLyBPYnRhaW4gQ29kZWMyQ2xpZW50CisgICAgc3RkOjp2ZWN0b3I8VHJhaXRzPiB0cmFpdHMgPSBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCk7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX2MyLnhtbCIsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlX2MyLnhtbCIpOworICAgIGlmIChwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJYTUwgcGFyc2VyIG5vIGdvb2QiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGZvciAoY29uc3QgVHJhaXRzJiB0cmFpdCA6IHRyYWl0cykgeworICAgICAgICBDMkNvbXBvbmVudDo6cmFua190IHJhbmsgPSB0cmFpdC5yYW5rOworCisgICAgICAgIC8vIEludGVyZmFjZSBtdXN0IGJlIGFjY2Vzc2libGUgZm9yIHVzIHRvIGxpc3QgdGhlIGNvbXBvbmVudCwgYW5kIHRoZXJlIGFsc28KKyAgICAgICAgLy8gbXVzdCBiZSBhbiBYTUwgZW50cnkgZm9yIHRoZSBjb2RlYy4gQ29kZWMgYWxpYXNlcyBsaXN0ZWQgaW4gdGhlIHRyYWl0cworICAgICAgICAvLyBhbGxvdyBhZGRpdGlvbmFsIFhNTCBlbnRyaWVzIHRvIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBhbGlhcy4gVGhlc2Ugd2lsbAorICAgICAgICAvLyBiZSBsaXN0ZWQgYXMgc2VwYXJhdGUgY29kZWNzLiBJZiBubyBYTUwgZW50cnkgaXMgc3BlY2lmaWVkIGZvciBhbiBhbGlhcywKKyAgICAgICAgLy8gdGhvc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgYWxpYXMgc3BlY2lmaWVkIGluIHRoZSBYTUwgZW50cnkKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmZhY2UgbmFtZS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVBbmRBbGlhc2VzID0gdHJhaXQuYWxpYXNlczsKKyAgICAgICAgbmFtZUFuZEFsaWFzZXMuaW5zZXJ0KG5hbWVBbmRBbGlhc2VzLmJlZ2luKCksIHRyYWl0Lm5hbWUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lT3JBbGlhcyA6IG5hbWVBbmRBbGlhc2VzKSB7CisgICAgICAgICAgICBib29sIGlzQWxpYXMgPSB0cmFpdC5uYW1lICE9IG5hbWVPckFsaWFzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KKyAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmICghaW50ZikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBmb3IgJXMnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpYXMgPyAiYWxpYXMgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyc2VyLmdldENvZGVjTWFwKCkuY291bnQobmFtZU9yQWxpYXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNBbGlhcykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGJhc2VDb2RlY0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5maW5kTWVkaWFDb2RlY0luZm8odHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlQ29kZWNJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sIGJ1dCBjYW5vbmljYWwgY29kZWMgaW5mbyAnJXMnIG1pc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFsaWFzICclcycgbm90IGZvdW5kIGluIHhtbDsgdXNlIGFuIFhNTCA8QWxpYXM+IHRhZyBmb3IgdGhpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxpYXMgaW50byBleGlzdGluZyBjb2RlYworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNvZGVjSW5mby0+YWRkQWxpYXMobmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcG9uZW50ICclcycgbm90IGZvdW5kIGluIHhtbCIsIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2Fub25OYW1lID0gdHJhaXQubmFtZTsKKworICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmxvY2sgb25jZSBhbGwgY29kZWNzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0LmRvbWFpbiA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgY29kZWMgZW50cnkgZm9yICclcyciLCBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gY29kZWNJbmZvID0gd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXROYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRPd25lcigoImNvZGVjMjo6IiArIHRyYWl0Lm93bmVyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0KKyAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q29kZWNNYXAoKS5hdChuYW1lT3JBbGlhcyk7CisKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJzb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJ2ZW5kb3Itc29mdHdhcmUiKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMucXVpcmtTZXQuZmluZCgiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb2RlYy5xdWlya1NldC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIGlmICghY29kZWMucmFuay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeG1sUmFuazsKKyAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoY29kZWMucmFuay5jX3N0cigpLCAiJXUlYyIsICZ4bWxSYW5rLCAmZHVtbXkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHhtbFJhbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlhcyA6IGNvZGVjLmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGFsaWFzICclcyciLCBhbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZEFsaWFzKGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZhdHRyTWFwID0gdHlwZUl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZE1lZGlhVHlwZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGF0dHJJdCA9IGF0dHJNYXAuYmVnaW4oKTsgYXR0ckl0ICE9IGF0dHJNYXAuZW5kKCk7ICsrYXR0ckl0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGllKGtleSwgdmFsdWUpID0gKmF0dHJJdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5maW5kKCJmZWF0dXJlLSIpID09IDAgJiYga2V5LmZpbmQoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50VmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRyYWlsaW5nIGJhZCBjaGFyYWN0ZXJzIGFuZCBkZWZhdWx0IHRvIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzc2NhbmYodmFsdWUuY19zdHIoKSwgIiVkIiwgJmludFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpDcmVhdGVCdWlsZGVyKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q29kZWMySW5mb0J1aWxkZXI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisjZGVmaW5lIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ29kZWMySW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CitwdWJsaWM6CisgICAgQ29kZWMySW5mb0J1aWxkZXIoKSA9IGRlZmF1bHQ7CisgICAgfkNvZGVjMkluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9JTkZPX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKyNkZWZpbmUgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXBwZXIgaW50ZXJmYWNlIGFyb3VuZCBJbnB1dFN1cmZhY2UuCisgKi8KK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIElucHV0U3VyZmFjZVdyYXBwZXIoKQorICAgICAgICA6IG1EYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGhlIHN1cmZhY2Ugd2l0aCB8Y29tcHwuIEEgc3VyZmFjZSBjYW4KKyAgICAgKiBjb25uZWN0IHRvIGF0IG1vc3Qgb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB8Y29tcHwKKyAgICAgKiBccmV0dXJuIEFMUkVBRFlfRVhJU1RTICAgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYW5vdGhlciBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgPSAwOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCB0aGUgc3VyZmFjZSBmcm9tIHRoZSBjb21wb25lbnQgaWYgYW55LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RhcnQgcHVzaGluZyBidWZmZXJzIHRvIHRoZSBzdXJmYWNlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWY6IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgLy8vIElucHV0IFN1cmZhY2UgY29uZmlndXJhdGlvbgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICAvLyBJTiBQQVJBTVMgKEdCUykKKyAgICAgICAgZmxvYXQgbU1pbkZwczsgLy8gbWluaW11bSBmcHMgKHJlcGVhdCBmcmFtZSB0byBhY2hpZXZlIHRoaXMpCisgICAgICAgIGZsb2F0IG1NYXhGcHM7IC8vIG1heCBmcHMgKHZpYSBmcmFtZSBkcm9wKQorICAgICAgICBmbG9hdCBtQ2FwdHVyZUZwczsgLy8gY2FwdHVyZSBmcHMKKyAgICAgICAgZmxvYXQgbUNvZGVkRnBzOyAgIC8vIGNvZGVkIGZwcworICAgICAgICBib29sIG1TdXNwZW5kZWQ7IC8vIHN1c3BlbmRlZAorICAgICAgICBpbnQ2NF90IG1UaW1lT2Zmc2V0VXM7IC8vIHRpbWUgb2Zmc2V0IChpbnB1dCA9PiBjb2RlYykKKyAgICAgICAgaW50NjRfdCBtU3VzcGVuZEF0VXM7IC8vIHN1c3BlbmQvcmVzdW1lIHRpbWUKKyAgICAgICAgaW50NjRfdCBtU3RhcnRBdFVzOyAvLyBzdGFydCB0aW1lCisgICAgICAgIGJvb2wgbVN0b3BwZWQ7IC8vIHN0b3BwZWQKKyAgICAgICAgaW50NjRfdCBtU3RvcEF0VXM7IC8vIHN0b3AgdGltZQorCisgICAgICAgIC8vIE9VVCBQQVJBTVMgKEdCUykKKyAgICAgICAgaW50NjRfdCBtSW5wdXREZWxheVVzOyAvLyBkZWxheSBiZXR3ZWVuIGVuY29kZXIgaW5wdXQgYW5kIHN1cmZhY2UgaW5wdXQKKworICAgICAgICAvLyBJTiBQQVJBTVMgKENPREVDIFdSQVBQRVIpCisgICAgICAgIGZsb2F0IG1GaXhlZEFkanVzdGVkRnBzOyAvLyBmaXhlZCBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICAgICAgZmxvYXQgbU1pbkFkanVzdGVkRnBzOyAvLyBtaW5pbXVtIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGlucHV0IHN1cmZhY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gY29uZmlnIGNvbmZpZ3VyYXRpb24uIFRoaXMgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCB0byBwcm92aWRlIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycywgYnV0IG5vdCB0byBwcm92aWRlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycyAodG8gYXZvaWQgY29udGludWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgIHJlY29uZmlndXJpbmcpCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgZGVzaXJlZCBkYXRhIHNwYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGFTcGFjZSBkZXNpcmVkIGRhdGEgc3BhY2UKKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXREYXRhU3BhY2UoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODFkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQaXBlbGluZVdhdGNoZXIiCisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtSW5wdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtUGlwZWxpbmVEZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6Om91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbU91dHB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6c21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIG1TbW9vdGhuZXNzRmFjdG9yID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrUXVldWVkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxdWV1ZWRBdCkgeworICAgIEFMT0dWKCJvbldvcmtRdWV1ZWQoZnJhbWVJbmRleD0lbGx1LCBidWZmZXJzKHNpemU9JXp1KSwgcXVldWVkQXQ9JWxsZCkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwKKyAgICAgICAgICBidWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAobG9uZyBsb25nKXF1ZXVlZEF0LnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgIT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uV29ya1F1ZXVlZDogRHVwbGljYXRlIGZyYW1lIGluZGV4ICglbGx1KTsgcHJldmlvdXMgZW50cnkgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLmVyYXNlKGl0KTsKKyAgICB9CisgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUudHJ5X2VtcGxhY2UoZnJhbWVJbmRleCwgc3RkOjptb3ZlKGJ1ZmZlcnMpLCBxdWV1ZWRBdCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gUGlwZWxpbmVXYXRjaGVyOjpvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4PSVsbHUsIGFycmF5SW5kZXg9JXp1KSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChpdC0+c2Vjb25kLmJ1ZmZlcnMuc2l6ZSgpIDw9IGFycmF5SW5kZXgpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogYnVmZmVycyBhdCAlbGx1OiBzaXplICV6dSwgcmVxdWVzdGVkIGluZGV4OiAlenUiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGl0LT5zZWNvbmQuYnVmZmVycy5zaXplKCksIGFycmF5SW5kZXgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIoc3RkOjptb3ZlKGl0LT5zZWNvbmQuYnVmZmVyc1thcnJheUluZGV4XSkpOworICAgIEFMT0dEX0lGKCFidWZmZXIsICJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGJ1ZmZlciBhbHJlYWR5IHJlbGVhc2VkICglbGx1OiV6dSkiLAorICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6Om9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCkgeworICAgIEFMT0dWKCJvbldvcmtEb25lKGZyYW1lSW5kZXg9JWxsdSkiLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCA9PSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZTogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS5lcmFzZShpdCk7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpmbHVzaCgpIHsKKyAgICBtRnJhbWVzSW5QaXBlbGluZS5jbGVhcigpOworfQorCitib29sIFBpcGVsaW5lV2F0Y2hlcjo6cGlwZWxpbmVGdWxsKCkgY29uc3QgeworICAgIGlmIChtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgPj0KKyAgICAgICAgICAgIG1JbnB1dERlbGF5ICsgbVBpcGVsaW5lRGVsYXkgKyBtT3V0cHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBmcmFtZXMgaW4gcGlwZWxpbmUgKCV6dSkiLCBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IHNpemVXaXRoSW5wdXRSZWxlYXNlZCA9IHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5iZWdpbigpLAorICAgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBkZWNsdHlwZShtRnJhbWVzSW5QaXBlbGluZSk6OnZhbHVlX3R5cGUgJnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgOiB2YWx1ZS5zZWNvbmQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc2l6ZVdpdGhJbnB1dFJlbGVhc2VkID49CisgICAgICAgICAgICBtUGlwZWxpbmVEZWxheSArIG1PdXRwdXREZWxheSArIG1TbW9vdGhuZXNzRmFjdG9yKSB7CisgICAgICAgIEFMT0dWKCJwaXBlbGluZUZ1bGw6IHRvbyBtYW55IGZyYW1lcyBpbiBwaXBlbGluZSwgd2l0aCBpbnB1dCByZWxlYXNlZCAoJXp1KSIsCisgICAgICAgICAgICAgIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigicGlwZWxpbmUgaGFzIHJvb20gKHRvdGFsOiAlenUsIGlucHV0IHJlbGVhc2VkOiAlenUpIiwKKyAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCksIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBQaXBlbGluZVdhdGNoZXI6OmVsYXBzZWQoCisgICAgICAgIGNvbnN0IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgJm5vdywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBpZiAobUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpIDw9IG4pIHsKKyAgICAgICAgcmV0dXJuIENsb2NrOjpkdXJhdGlvbjo6emVybygpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxDbG9jazo6ZHVyYXRpb24+IGR1cmF0aW9uczsKKyAgICBmb3IgKGNvbnN0IGRlY2x0eXBlKG1GcmFtZXNJblBpcGVsaW5lKTo6dmFsdWVfdHlwZSAmdmFsdWUgOiBtRnJhbWVzSW5QaXBlbGluZSkgeworICAgICAgICBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG5vdyAtIHZhbHVlLnNlY29uZC5xdWV1ZWRBdDsKKyAgICAgICAgQUxPR1YoImVsYXBzZWQ6IGZyYW1lSW5kZXggPSAlbGx1IGVsYXBzZWQgPSAlbGxkbXMiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXZhbHVlLmZpcnN0LAorICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbGFwc2VkKS5jb3VudCgpKTsKKyAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhlbGFwc2VkKTsKKyAgICB9CisgICAgc3RkOjpudGhfZWxlbWVudChkdXJhdGlvbnMuYmVnaW4oKSwgZHVyYXRpb25zLmVuZCgpLCBkdXJhdGlvbnMuYmVnaW4oKSArIG4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8Q2xvY2s6OmR1cmF0aW9uPigpKTsKKyAgICByZXR1cm4gZHVyYXRpb25zW25dOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUElQRUxJTkVfV0FUQ0hFUl9IXworI2RlZmluZSBQSVBFTElORV9XQVRDSEVSX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUGlwZWxpbmVXYXRjaGVyIHdhdGNoZXMgdGhlIHBpcGVsaW5lIGFuZCBpbmZlcnMgdGhlIHN0YXR1cyBvZiB3b3JrIGl0ZW1zIGZyb20KKyAqIGV2ZW50cy4KKyAqLworY2xhc3MgUGlwZWxpbmVXYXRjaGVyIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2sgQ2xvY2s7CisKKyAgICBQaXBlbGluZVdhdGNoZXIoKQorICAgICAgICA6IG1JbnB1dERlbGF5KDApLAorICAgICAgICAgIG1QaXBlbGluZURlbGF5KDApLAorICAgICAgICAgIG1PdXRwdXREZWxheSgwKSwKKyAgICAgICAgICBtU21vb3RobmVzc0ZhY3RvcigwKSB7fQorICAgIH5QaXBlbGluZVdhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBpbnB1dCBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZpbnB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHBpcGVsaW5lIGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgb3V0cHV0IGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJm91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHNtb290aG5lc3MgZmFjdG9yIHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnNtb290aG5lc3NGYWN0b3IodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQ2xpZW50IHF1ZXVlZCBhIHdvcmsgaXRlbSB0byB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4IG9mIHRoaXMgd29yaworICAgICAqIFxwYXJhbSBidWZmZXJzICAgICBpbnB1dCBidWZmZXJzIG9mIHRoZSBxdWV1ZWQgd29yayBpdGVtCisgICAgICogXHBhcmFtIHF1ZXVlZEF0ICAgIHRpbWUgd2hlbiB0aGUgY2xpZW50IHF1ZXVlZCB0aGUgYnVmZmVyCisgICAgICovCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZidWZmZXJzLAorICAgICAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnF1ZXVlZEF0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgcmVsZWFzZWQgaW5wdXQgYnVmZmVycyBmcm9tIGEgd29yayBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4CisgICAgICogXHBhcmFtIGFycmF5SW5kZXggIGluZGV4IG9mIHRoZSBidWZmZXIgYXQgdGhlIG9yaWdpbmFsIHxidWZmZXJzfCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICBvbldvcmtRdWV1ZWQoKS4KKyAgICAgKiBccmV0dXJuICBidWZmZXJzW2FycmF5SW5kZXhdCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB3b3JrIGl0ZW0uCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgcGlwZWxpbmUuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgcGlwZWxpbmUgZG9lcyBub3QgbmVlZCBtb3JlIHdvcmsgaXRlbXMgdG8gcHJvY2VlZAorICAgICAqICAgICAgICAgICAgICAgIHNtb290aGx5LCBjb25zaWRlcmluZyBkZWxheXMgYW5kIHNtb290aG5lc3MgZmFjdG9yOworICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBpcGVsaW5lRnVsbCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGVsYXBzZWQgcHJvY2Vzc2luZyB0aW1lIG9mIGEgd29yayBpdGVtLCBudGggZnJvbSB0aGUgbG9uZ2VzdAorICAgICAqIHByb2Nlc3NpbmcgdGltZSB0byB0aGUgc2hvcnRlc3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm93IGN1cnJlbnQgdGltZXN0YW1wCisgICAgICogXHBhcmFtIG4gICBudGggd29yayBpdGVtLCBmcm9tIHRoZSBsb25nZXN0IHByb2Nlc3NpbmcgdGltZSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHNob3J0ZXN0LiBJdCdzIGEgMC1iYXNlZCBpbmRleC4KKyAgICAgKiBccmV0dXJuICBlbGFwc2VkIHByb2Nlc3NpbmcgdGltZSBvZiBudGggd29yayBpdGVtLgorICAgICAqLworICAgIENsb2NrOjpkdXJhdGlvbiBlbGFwc2VkKGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZub3csIHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSW5wdXREZWxheTsKKyAgICB1aW50MzJfdCBtUGlwZWxpbmVEZWxheTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RGVsYXk7CisgICAgdWludDMyX3QgbVNtb290aG5lc3NGYWN0b3I7CisKKyAgICBzdHJ1Y3QgRnJhbWUgeworICAgICAgICBGcmFtZShzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmIsCisgICAgICAgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxKQorICAgICAgICAgICAgOiBidWZmZXJzKGIpLAorICAgICAgICAgICAgICBxdWV1ZWRBdChxKSB7fQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCBxdWV1ZWRBdDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBGcmFtZT4gbUZyYW1lc0luUGlwZWxpbmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBJUEVMSU5FX1dBVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZDRhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3Q6OmRlYnVnU3RyaW5nKHNpemVfdCBpbmRlbnRfKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgaW5kZW50KGluZGVudF8sICcgJyk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJEaWN0IHsiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiAqdGhpcykgeworICAgICAgICBzIDw8IGluZGVudCA8PCAiICAiOworCisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYzJWYWx1ZS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppMzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnUzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFIzMjoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmMzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppNjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnU2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFI2NDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmM2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkZMT0FUOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpmbG9hdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGZsb2F0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoZXNlIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dW5zdXBwb3J0ZWQgIiA8PCBpdC5maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgImludDMyX3QgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50NjRfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAic3RyaW5nICIgPDwgaXQuZmlyc3QgPDwgIiA9IFwiIiA8PCBzdHJWYWx1ZS5jX3N0cigpIDw8ICJcIiI7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiQnVmZmVyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICI7CisgICAgICAgICAgICBpZiAoYnVmVmFsdWUgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+ZGF0YSgpICE9IG51bGxwdHIgJiYgYnVmVmFsdWUtPnNpemUoKSA8PSA2NCkgeworICAgICAgICAgICAgICAgIHMgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZlZhbHVlLT5kYXRhKCksIGJ1ZlZhbHVlLT5zaXplKCksIGluZGVudF8gKyA0LCAmdG1wKTsKKyAgICAgICAgICAgICAgICBzIDw8IHRtcC5jX3N0cigpIDw8IGluZGVudCA8PCAiICB9IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA8PCAodm9pZCopYnVmVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkdW1wIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVidWdnaW5nLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgICBzIDw8ICJ1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICB9CisgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzIDw8IGluZGVudCA8PCAifSI7CisKKyAgICByZXR1cm4gcy5zdHIoKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtRGVzYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBkZXNjcmliZSAlcyIsIGRlc2MtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCB0cnVlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgIH0KKworICAgIC8vIFRFTVA6IGFsc28gYWRkIHZlbmRvciBwYXJhbWV0ZXJzIGFzIG5vbi12ZW5kb3IKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIGlmICghZGVzYy0+aW5kZXgoKS5pc1ZlbmRvcigpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCBmYWxzZSAvKiBtYXJrVmVuZG9yICovKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBkZXNjLAorICAgICAgICBDMlN0cmluZyBwYXRoLAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0RGVzYy5iZWdpbigpOyBpdCAhPSBzdHJ1Y3REZXNjLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEMyU3RyaW5nIGZpZWxkTmFtZSA9IHBhdGggKyAiLiIgKyBpdC0+bmFtZSgpOworICAgICAgICBpZiAoaXQtPnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgaWYgKHJlZmxlY3RvciA9PSBudWxscHRyIHx8IGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgc3RydWN0IGZpZWxkICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzY18gPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXgoaXQtPnR5cGUoKSkuY29yZUluZGV4KCkpOworICAgICAgICAgICAgaWYgKHN0cnVjdERlc2NfID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlIHN0cnVjdHVyZSBvZiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFBhcmFtU3RydWN0RGVzYyhkZXNjLCBmaWVsZE5hbWUsIG9mZnNldCArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0RGVzY18sIHJlZmxlY3Rvcik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSBleHRlbnQgYW5kIHR5cGUKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJleHRlbnQoKSAhPSAxIGZvciBzaW5nbGUgdmFsdWUgdHlwZTogJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyByZWdpc3RlcmVkIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIHByb3BlciBzaXplIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBmaWVsZHMuCisgICAgICAgIC8vIG9ubHkgaW5zZXJ0IGZpZWxkcyB0aGUgdmVyeSBmaXJzdCB0aW1lCisgICAgICAgIG1NYXAuZW1wbGFjZShmaWVsZE5hbWUsIEZpZWxkRGVzYyB7CisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgICAgIGl0LT50eXBlKCksIGl0LT5leHRlbnQoKSwgaXQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZSgqaXQpKSwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsIGJvb2wgbWFya1ZlbmRvcikgeworICAgIEMyU3RyaW5nIHBhcmFtTmFtZSA9IGRlc2MtPm5hbWUoKTsKKworICAgIC8vIHByZWZpeCB2ZW5kb3IgcGFyYW1ldGVycworICAgIGlmIChkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkgJiYgbWFya1ZlbmRvcikgeworICAgICAgICBwYXJhbU5hbWUgPSAidmVuZG9yLiIgKyBwYXJhbU5hbWU7CisgICAgfQorICAgIG1QYXJhbU5hbWVzLmVtcGxhY2UoZGVzYy0+aW5kZXgoKSwgcGFyYW1OYW1lKTsKKworICAgIC8vIGFsc28gYWxsb3cgc2V0dGluZyB3aG9sZSBwYXJhbWV0ZXJzIGluIGEgYmluYXJ5IGZhc2hpb24gdmlhIEJ5dGVCdWZmZXIKKyAgICAvLyB0aGlzIGlzIG9wdC1pbiBmb3Igbm93CisgICAgYXV0byBpdCA9IG1XaG9sZVBhcmFtcy5maW5kKHBhcmFtTmFtZSk7CisgICAgaWYgKGl0ICE9IG1XaG9sZVBhcmFtcy5lbmQoKSAmJiBpdC0+c2Vjb25kLmNvcmVJbmRleCgpID09IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgbU1hcC5lbXBsYWNlKHBhcmFtTmFtZSwgRmllbGREZXNjeyBkZXNjLCBudWxscHRyLCAwIC8qIG9mZnNldCAqLyB9KTsKKyAgICAgICAgLy8gZG9uJ3QgYWRkIGZpZWxkcyBvZiB3aG9sZSBwYXJhbWV0ZXJzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIHBhcmFtTmFtZSwgMCAvKiBvZmZzZXQgKi8sIHN0cnVjdERlc2MsIHJlZmxlY3Rvcik7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICBtV2hvbGVQYXJhbXMuZW1wbGFjZShuYW1lLCBpbmRleCk7Cit9CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1QYXJhbU5hbWVzLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCAhPSBtUGFyYW1OYW1lcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXQ7CisgICAgcmV0IDw8ICI8dW5rbm93biAiIDw8IGluZGV4IDw8ICI+IjsKKyAgICByZXR1cm4gcmV0LnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZpbmRpY2VzXShjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSB7CisgICAgICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgfSk7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisgICAgdmVjLT5jbGVhcigpOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleU1hcChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCkpOworCisgICAgQUxPR1YoImluIGdldFBhcmFtSW5kaWNlc0ZvcktleXMgd2l0aCAlenUga2V5cyBhbmQgbWFwIG9mICV6dSBlbnRyaWVzIiwKKyAgICAgICAgICAgIGtleU1hcC5zaXplKCksIG1NYXAuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgQUxPR1YoImNvdW50IG9mICVzIGlzICV6dSIsIG5hbWUuY19zdHIoKSwga2V5TWFwLmNvdW50KG5hbWUpKTsKKyAgICAgICAgaWYgKGtleU1hcC5jb3VudChuYW1lKSA+IDApIHsKKyAgICAgICAgICAgIGluZGljZXMuaW5zZXJ0KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDogaW5kaWNlcykgeworICAgICAgICB2ZWMtPnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6dXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Kj4gcGFyYW1zTWFwOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6ICp2ZWMpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9ICZwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgIFsmcGFyYW1zTWFwXShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgRmllbGREZXNjICZkZXNjLCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICpwYXJhbSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYXV0byBwYXJhbUl0ID0gcGFyYW1zTWFwLmZpbmQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbUl0ID09IHBhcmFtc01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMgZm91bmQsIGJ1dCBwYXJhbSAjJWQgaXNuJ3QgcHJlc2VudCB0byB1cGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKGludDMyX3QpZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1JdC0+c2Vjb25kOworCisgICAgICAgICAgICAgICAgc3RydWN0IF9DMlBhcmFtIDogcHVibGljIEMyUGFyYW0geworICAgICAgICAgICAgICAgICAgICB1c2luZyBDMlBhcmFtOjpDMlBhcmFtOworICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbSh1aW50MzJfdCBzaXplLCB1aW50MzJfdCBpbmRleCkgOiBDMlBhcmFtKHNpemUsIGluZGV4KSB7IH0KKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBoYW5kbGUgd2hvbGUgcGFyYW0gdXBkYXRlcyBhcyBwYXJ0IG9mIGEgZmxleGlibGUgcGFyYW0gdXBkYXRlIHVzaW5nCisgICAgICAgICAgICAgICAgLy8gYSB6ZXJvIG9mZnNldC4KKyAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgbWluT2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZGVzY3JpcHRvciBoYXMgYSBmaWVsZCwgdXNlIHRoZSBvZmZzZXQgYW5kIHNpemUgYW5kIGVuc3VyZSB0aGF0IG9mZnNldAorICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBwYXJ0IG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluT2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgb3IgdHJpbSBmbGV4aWJsZSBwYXJhbSAob3Igd2hvbGUgcGFyYW0pIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MgLyogd2hvbGUgcGFyYW0gKi8gfHwgZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBwYXJhbSBpZiBtb3JlIHNwYWNlIGlzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmdldCgpLT5zaXplKCkgPCBvZmZzZXQgKyBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAtIG9mZnNldCB8fCBvZmZzZXQgPCBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIHRvbyBsb25nIG9yIG9mZnNldCB0b28gZWFybHkgLSBhYmFuZG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSAqbmV3UGFyYW0gPSAoQzJQYXJhbSAqKTo6b3BlcmF0b3IgbmV3KG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChuZXdQYXJhbSkgX0MyUGFyYW0ob2Zmc2V0ICsgc2l6ZSwgcGFyYW0tPmdldCgpLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobmV3UGFyYW0gKyAxLCBwYXJhbS0+Z2V0KCkgKyAxLCBvZmZzZXQgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnJlc2V0KG5ld1BhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA+IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gcGFyYW1ldGVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpUcmltUGFyYW0ocGFyYW0tPmdldCgpLCBvZmZzZXQgKyBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzYy5maWVsZERlc2MtPnR5cGUoKSA9PSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQikgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIGZpbGwgYmxvYnMgaWYgdXBkYXRpbmcgd2l0aCBzbWFsbGVyIGJsb2IKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0ICsgc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgLSBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0LCBwdHIsIHNpemUpOworICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmLCBjb25zdCB2b2lkICosIHNpemVfdCk+IHdvcmspIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgYXV0byBwYXJhbSA9IHBhcmFtcy5maW5kKG5hbWUpOworICAgICAgICBpZiAocGFyYW0gPT0gcGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbWV0ZXJzCisgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJnRtcCkgJiYgdG1wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICp0bXBBc1BhcmFtID0gQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGlmICh0bXBBc1BhcmFtICYmIHRtcEFzUGFyYW0tPnR5cGUoKS50eXBlKCkgPT0gZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiUGFyYW0gYmxvYiBkb2VzIG5vdCBtYXRjaCBwYXJhbSBmb3IgJyVzJyAoJXAsICV4IHZzICV4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCB0bXBBc1BhcmFtLCB0bXBBc1BhcmFtID8gdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA6IDB4REVBRHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQ2NF90KikmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogeworICAgICAgICAgICAgICAgIGZsb2F0IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZ0bXAsIHNpemVvZih0bXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXh0ZW50ID4gMCAmJiB0bXAuc2l6ZSgpID49IGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHJ1bmNhdGVkKHRtcCwgMCwgZmllbGRFeHRlbnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlN0cmluZyB2YWx1ZSB0b28gbG9uZyB0byBmaXQ6IG9yaWdpbmFsIFwiJXNcIiB0cnVuY2F0ZWQgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAuY19zdHIoKSwgdHJ1bmNhdGVkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0cnVuY2F0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLmNfc3RyKCksIHRtcC5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSB8fCB0bXAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC0+c2l6ZSgpID4gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkJsb2IgdmFsdWUgdG9vIGxvbmcgdG8gZml0LiBUcnVuY2F0aW5nLiIpOworICAgICAgICAgICAgICAgICAgICB0bXAtPnNldFJhbmdlKHRtcC0+b2Zmc2V0KCksIGZpZWxkRXh0ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0CitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXNfKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzaXplKHBhcmFtc18uc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShwYXJhbXNfLmJlZ2luKCksIHBhcmFtc18uZW5kKCksIHBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCkgLT4gQzJQYXJhbSogeyByZXR1cm4gcC5nZXQoKTsgfSk7CisgICAgcmV0dXJuIGdldFBhcmFtcyhwYXJhbXMpOworfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKSBjb25zdCB7CisgICAgRGljdCByZXQ7CisKKyAgICAvLyBjb252ZXJ0IHZlY3RvciB0byBtYXAKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgQzJQYXJhbSAqPiBwYXJhbXNNYXA7CisgICAgZm9yIChDMlBhcmFtICpwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gIT0gbnVsbHB0ciAmJiAqcGFyYW0pIHsKKyAgICAgICAgICAgIHBhcmFtc01hcFtwYXJhbS0+aW5kZXgoKV0gPSBwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBpZiAocGFyYW1zTWFwLmNvdW50KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtICpwYXJhbSA9IHBhcmFtc01hcFtkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKV07CisgICAgICAgIFZhbHVlIHZhbHVlOworCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbXMgZmlyc3QKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHBhcmFtLCBwYXJhbS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pICsgZGVzYy5vZmZzZXQKKyAgICAgICAgICAgICAgICArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKmRlc2MuZmllbGREZXNjKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopcGFyYW0gKyBvZmZzZXQ7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgZmllbGRUeXBlID0gZGVzYy5maWVsZERlc2MtPnR5cGUoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zaXplKCkgPCBsZW5ndGggfHwgcGFyYW0tPnNpemUoKSAtIGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicGFyYW0gdG9vIHNtYWxsIGZvciBzdHJpbmc6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KEFTdHJpbmcoKGNoYXIgKilkYXRhLCBzdHJubGVuKChjaGFyICopZGF0YSwgbGVuZ3RoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGJsb2I6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWx1ZVNpemUgPSBDMlZhbHVlOjpTaXplRm9yKChDMlZhbHVlOjp0eXBlX3QpZmllbGRUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IHZhbHVlU2l6ZSB8fCBwYXJhbS0+c2l6ZSgpIC0gdmFsdWVTaXplIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGMydmFsdWU6IHNpemUgJXp1IG9mZnNldCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogIGMyVmFsdWUgPSAqKChpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGMyVmFsdWUgPSAqKCh1aW50MzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOiBjMlZhbHVlID0gKigoYzJfY250cjMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgYzJWYWx1ZSA9ICooKGludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogYzJWYWx1ZSA9ICooKHVpbnQ2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IGMyVmFsdWUgPSAqKChjMl9jbnRyNjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBjMlZhbHVlID0gKigoZmxvYXQgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGZvciAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KGMyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldC5lbXBsYWNlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmNsZWFyKCkgeworICAgIG1NYXAuY2xlYXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworI2RlZmluZSBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gcXVlcnkgYW5kIHVwZGF0ZSBDb2RlYyAyLjAgY29uZmlndXJhdGlvbiB2YWx1ZXMuIFVzZSBjdXN0b20gZGljdGlvbmFyeSBhcworICogQU1lc3NhZ2UgY2Fubm90IHJlcHJlc2VudCBhbGwgdHlwZXMgb2YgQ29kZWMgMi4wIHBhcmFtZXRlcnMgYW5kIEMyVmFsdWUgY2Fubm90IHJlcHJlc2VudAorICogYWxsIHR5cGVzIG9mIFNESyB2YWx1ZXMuIFdlIHdhbnQgdG8gYmUgcHJlY2lzZSB3aGVuIHNldHRpbmcgc3RhbmRhcmQgcGFyYW1ldGVycyAodXNlIEMyVmFsdWUKKyAqIGZvciBhcml0aG1ldGljIHZhbHVlcyksIGJ1dCBhbHNvIHN1cHBvcnQgaW50MzIgYW5kIGludDY0IGZvciBTREsgdmFsdWVzIHNwZWNpZmljYWxseSBmb3IKKyAqIHZlbmRvciBwYXJhbWV0ZXJzIChhcyBTREsgQVBJIGRvZXMgbm90IGFsbG93IHNwZWNpZnlpbmcgcHJvcGVyIHR5cGUuKSBXaGVuIHF1ZXJ5aW5nIGZpZWxkcywKKyAqIHdlIGNhbiB1c2UgQzJWYWx1ZXMgYXMgdGhleSBhcmUgZGVmaW5lZC4KKyAqCisgKiAgICAgIEl0ZW0gPT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBpbmdzOgorICogICAgIENWYWx1ZTo6dHlwZSA9PiB0eXBlCisgKiAgICAgaW50MzIgPT4gaW50MzIsIGN0cjMyIG9yIHVpbnQzMgorICogICAgIGludDY0ID0+IGludDY0LCBjdHI2NCBvciB1aW50NjQKKyAqICAgICBBU3RyaW5nID0+IHN0cmluZworICogICAgIEFCdWZmZXIgPT4gYmxvYgorICogICAgICdSZWN0JyA9PiBDMlJlY3RTdHJ1Y3QgKG5vdCBleHBvc2VkIGluIFNESyBhcyBhIHJlY3RhbmdsZSkKKyAqLworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHsKK3B1YmxpYzoKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIoKSA9IGRlZmF1bHQ7CisgICAgflJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEVsZW1lbnQgZm9yIHZhbHVlcworICAgICAqLworICAgIHN0cnVjdCBWYWx1ZSA6IHB1YmxpYyBBRGF0YTxDMlZhbHVlLCBpbnQzMl90LCBpbnQ2NF90LCBBU3RyaW5nLCBzcDxBQnVmZmVyPj46OkJhc2ljIHsKKyAgICAgICAgLy8gYWxsb3cgY29uc3RydWN0aW9uIGZyb20gYmFzZSB0eXBlcworICAgICAgICBWYWx1ZSgpID0gZGVmYXVsdDsKKyAgICAgICAgZXhwbGljaXQgVmFsdWUoQzJWYWx1ZSBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDMyX3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShpbnQ2NF90IGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3QgQVN0cmluZyAmaSkgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGNvbnN0IHNwPEFCdWZmZXI+ICZpKSB7IHNldChpKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgRGljdCA6IHB1YmxpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVmFsdWU+IHsKKyAgICAgICAgRGljdCgpID0gZGVmYXVsdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudCA9IDApIGNvbnN0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBmaWVsZHMgb2YgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBzdXBwbGllZCwgc28gdGhhdCB0aGlzIG9wYmplY3QgY2FuIGxhdGVyCisgICAgICogcXVlcnkgYW5kIHVwZGF0ZSB0aGVzZS4KKyAgICAgKgorICAgICAqIEZvciBub3cgb25seSBmaXJzdC1sZXZlbCBmaWVsZHMgYXJlIHN1cHBvcnRlZC4gQWxzbywgYXJyYXkgZmllbGRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24uCisgICAgICogXHBhcmFtIHBhcmFtRGVzY3MgIHZlY3RvciBvZiBDMlBhcmFtRGVzY3JpcHRvciBvYmplY3RzIHRoYXQgdGhpcyBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd291bGQgcmVjb2duaXplIHdoZW4gYnVpbGRpbmcgcGFyYW1zLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmcGFyYW1EZXNjcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0YW5kYXJkIHBhcmFtZXRlciAodGhhdCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvcgorICAgICAqIG9yIG1heSBub3QgYmUgbGlzdGVkIGFzIGEgc3VwcG9ydGVkIHZhbHVlIGJ5IHRoZSBjb21wb25lbnQpLiBJZiB0aGUgcGFyYW1ldGVyIG5hbWUgaXMKKyAgICAgKiB1c2VkIGZvciBhbm90aGVyIHBhcmFtZXRlciwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4gKFRlY2huaWNhbGx5LCB0aGlzIGlzIGJ5IGZpZWxkcykuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCBzdGFuZGFyZCBwYXJhbWV0ZXIgdHlwZQorICAgICAqIFxwYXJhbSBuYW1lIHBhcmFtZXRlciBuYW1lCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGFkZFN0YW5kYXJkUGFyYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZKSB7CisgICAgICAgIGFkZFBhcmFtRGVzYyhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChUOjpQQVJBTV9UWVBFKSwgYXR0cmliLCBuYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0ciksIG51bGxwdHIgLyogZGVzY3JpcHRvciAqLyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgKG9yIGEgcGFyYW1lYXRlcikgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYKKyAgICAgKiByZWZsZWN0b3IgaXMgcHJvdmlkZWQsIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbAorICAgICAqIGZ1bmRhbWVudGFsIHR5cGVkIGZpZWxkcyAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHBhdGggcGF0aC9uYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgKGZpZWxkIG9yIHBhcmVudCBwYXJhbWV0ZXIpCisgICAgICogXHBhcmFtIG9mZnNldCBvZmZzZXQgb2YgdGhlIHN0cnVjdHVyZSBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbVN0cnVjdERlc2MoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYywgQzJTdHJpbmcgcGF0aCwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSB0aGUgc3RydWN0IGRlc2NyaXB0b3IuIElmIHJlZmxlY3RvciBpcyBwcm92aWRlZCwKKyAgICAgKiBmaWVsZHMgb2Ygc3ViLXN0cnVjdHVyZXMgYXJlIGFsc28gYWRkZWQuIE90aGVyd2lzZSwgb25seSB0b3AtbGV2ZWwgZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzCisgICAgICogKGFyaXRobWV0aWMsIHN0cmluZyBhbmQgYmxvYikgYXJlIGFkZGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtRGVzYyBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSBmaWVsZERlc2MgZmllbGQgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSByZWZsZWN0b3IgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24gKG1heSBiZSBudWxsKQorICAgICAqIFxwYXJhbSBtYXJrVmVuZG9yIFRFTVAgaWYgdHJ1ZSwgcHJlZml4IHZlbmRvciBwYXJhbWV0ZXIgbmFtZXMgd2l0aCAidmVuZG9yLiIKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtRGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGJvb2wgbWFya1ZlbmRvciA9IHRydWUpOworCisgICAgLyoqCisgICAgICogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgYSBwYXJhbWV0ZXIgYXMgYSBiaW5hcnkgYmxvYi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBjb3JlSW5kZXggcGFyYW1ldGVyIChjb3JlKSBpbmRleAorICAgICAqLworICAgIHZvaWQgc3VwcG9ydFdob2xlUGFyYW0oc3RkOjpzdHJpbmcgbmFtZSwgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgZm9yIGFuIGluZGV4LgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldFBhcmFtTmFtZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBwYXJhbSBpbmRpY2VzIGZyb20gZmllbGQgbmFtZXMgYW5kIHZhbHVlcyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCBiZSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tvdXRdICAgIHZlY3RvciB0byBzdG9yZSB0aGUgaW5kaWNlcyBmcm9tIHxwYXJhbXN8LgorICAgICAqLworICAgIHZvaWQgZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyAob25seSkgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIFZlY3RvciBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZrZXlzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgQzJQYXJhbSBvYmplY3RzIGZyb20gZmllbGQgbmFtZSBhbmQgdmFsdWUgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgRGljdCBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lIHRvIHZhbHVlIHBhaXJzLgorICAgICAqIFxwYXJhbSB2ZWNbaW4sb3V0XSAgIHZlY3RvciBvZiB0aGUgQzJQYXJhbSBvYmplY3RzIHRvIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBmaWVsZHMgZnJvbSBDMlBhcmFtIG9iamVjdHMgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgcXVlcmllZAorICAgICAqIFxyZXR1cm4gYSBEaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBrbm93biBwYXJhbWV0ZXJzCisgICAgICovCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIERpY3QgZ2V0UGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXIgcGFyYW0gZGVzY3JpcHRvcnMgaW4gdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBGaWVsZERlc2MgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZERlc2M7CisgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRmllbGREZXNjPiBtTWFwOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnN0cmluZz4gbVBhcmFtTmFtZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkNvcmVJbmRleD4gbVdob2xlUGFyYW1zOworCisgICAgdm9pZCBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3Q7CisKKyAgICBDMl9ET19OT1RfQ09QWShSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWRlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNraXBDdXRCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NraXBDdXRCdWZmZXI6OlNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkJpdENoYW5uZWxzKSB7CisKKyAgICBtV3JpdGVIZWFkID0gMDsKKyAgICBtUmVhZEhlYWQgPSAwOworICAgIG1DYXBhY2l0eSA9IDA7CisgICAgbUN1dEJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBpZiAobnVtMTZCaXRDaGFubmVscyA9PSAwIHx8IG51bTE2Qml0Q2hhbm5lbHMgPiBJTlQzMl9NQVggLyAyKSB7CisgICAgICAgIEFMT0dXKCIjIGNoYW5uZWxzIG91dCBvZiByYW5nZTogJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwgbnVtMTZCaXRDaGFubmVscyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IG51bTE2Qml0Q2hhbm5lbHMgKiAyOworICAgIGlmIChza2lwID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplIHx8IGN1dCA+IElOVDMyX01BWCAvIGZyYW1lU2l6ZQorICAgICAgICAgICAgfHwgY3V0ICogZnJhbWVTaXplID4gSU5UMzJfTUFYIC0gNDA5NikgeworICAgICAgICBBTE9HVygib3V0IG9mIHJhbmdlIHNraXAvY3V0OiAlenUvJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBza2lwLCBjdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNraXAgKj0gZnJhbWVTaXplOworICAgIGN1dCAqPSBmcmFtZVNpemU7CisKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXAgPSBza2lwOworICAgIG1CYWNrUGFkZGluZyA9IGN1dDsKKyAgICBtQ2FwYWNpdHkgPSBjdXQgKyA0MDk2OworICAgIG1DdXRCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhclttQ2FwYWNpdHldOworICAgIEFMT0dWKCJza2lwY3V0YnVmZmVyICV6dSAlenUgJWQiLCBza2lwLCBjdXQsIG1DYXBhY2l0eSk7Cit9CisKK1NraXBDdXRCdWZmZXI6On5Ta2lwQ3V0QnVmZmVyKCkgeworICAgIGRlbGV0ZVtdIG1DdXRCdWZmZXI7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKChjaGFyKikgYnVmZmVyLT5kYXRhKCkpICsgb2Zmc2V0OworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPnNpemUoKSk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgY29waWVkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBkYXRhIGZyb20gdGhlIGJ1ZmZlciBpZiBuZWVkZWQKKyAgICBpZiAobUZyb250UGFkZGluZyA+IDApIHsKKyAgICAgICAgLy8gc3RpbGwgZGF0YSBsZWZ0IHRvIGRyb3AKKyAgICAgICAgaW50MzJfdCB0b19kcm9wID0gKGJ1ZmxlbiA8IG1Gcm9udFBhZGRpbmcpID8gYnVmbGVuIDogbUZyb250UGFkZGluZzsKKyAgICAgICAgb2Zmc2V0ICs9IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmxlbiAtPSB0b19kcm9wOworICAgICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICB3cml0ZShzcmMsIGJ1Zmxlbik7CisKKworICAgIC8vIHRoZSBtZWRpYWJ1ZmZlciBpcyBub3cgZW1wdHkuIEZpbGwgaXQgZnJvbSBjdXRidWZmZXIsIGFsd2F5cyBsZWF2aW5nCisgICAgLy8gYXQgbGVhc3QgbUJhY2tQYWRkaW5nIGJ5dGVzIGluIHRoZSBjdXRidWZmZXIKKyAgICBjaGFyICpkc3QgPSAoY2hhciopIGJ1ZmZlci0+YmFzZSgpOworICAgIHNpemVfdCBjb3BpZWQgPSByZWFkKGRzdCwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIGNvcGllZCk7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgc3VibWl0SW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpjbGVhcigpIHsKKyAgICBtV3JpdGVIZWFkID0gbVJlYWRIZWFkID0gMDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXA7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6d3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKSB7CisgICAgaW50MzJfdCBzaXpldXNlZCA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoc2l6ZXVzZWQgPCAwKSBzaXpldXNlZCArPSBtQ2FwYWNpdHk7CisKKyAgICAvLyBFdmVyeXRoaW5nIG11c3QgZml0LiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBhIGxpdHRsZSBsYXJnZXIgdGhhbiBuZWVkZWQsCisgICAgLy8gc28gdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFzIHRvIHdoZXRoZXIgbVdyaXRlSGVhZCA9PSBtUmVhZEhlYWQgbWVhbnMgYnVmZmVyCisgICAgLy8gZnVsbCBvciBlbXB0eQorICAgIHNpemVfdCBhdmFpbGFibGUgPSBtQ2FwYWNpdHkgLSBzaXpldXNlZCAtIDMyOworICAgIGlmIChhdmFpbGFibGUgPCBudW0pIHsKKyAgICAgICAgaW50MzJfdCBuZXdjYXBhY2l0eSA9IG1DYXBhY2l0eSArIChudW0gLSBhdmFpbGFibGUpOworICAgICAgICBjaGFyICogbmV3YnVmZmVyID0gbmV3IGNoYXJbbmV3Y2FwYWNpdHldOworICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyLCBtQ2FwYWNpdHkpOworICAgICAgICBkZWxldGUgW10gbUN1dEJ1ZmZlcjsKKyAgICAgICAgbUNhcGFjaXR5ID0gbmV3Y2FwYWNpdHk7CisgICAgICAgIG1DdXRCdWZmZXIgPSBuZXdidWZmZXI7CisgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlZCBidWZmZXIgYXQgc2l6ZSAlZCIsIG5ld2NhcGFjaXR5KTsKKyAgICB9CisKKyAgICBzaXplX3QgY29weWZpcnN0ID0gKG1DYXBhY2l0eSAtIG1Xcml0ZUhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShtQ3V0QnVmZmVyICsgbVdyaXRlSGVhZCwgc3JjLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBzcmMgKz0gY29weWZpcnN0OworICAgICAgICBtV3JpdGVIZWFkICs9IGNvcHlmaXJzdDsKKyAgICAgICAgQ0hFQ0tfTEUobVdyaXRlSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1Xcml0ZUhlYWQgPT0gbUNhcGFjaXR5KSBtV3JpdGVIZWFkID0gMDsKKyAgICAgICAgaWYgKG51bSkgeworICAgICAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIsIHNyYywgbnVtKTsKKyAgICAgICAgICAgIG1Xcml0ZUhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6cmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKworICAgIGF2YWlsYWJsZSAtPSBtQmFja1BhZGRpbmc7CisgICAgaWYgKGF2YWlsYWJsZSA8PTApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhdmFpbGFibGUgPCBpbnQzMl90KG51bSkpIHsKKyAgICAgICAgbnVtID0gYXZhaWxhYmxlOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoY29weWZpcnN0ID4gbnVtKSBjb3B5Zmlyc3QgPSBudW07CisgICAgaWYgKGNvcHlmaXJzdCkgeworICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyICsgbVJlYWRIZWFkLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBkc3QgKz0gY29weWZpcnN0OworICAgICAgICBtUmVhZEhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtUmVhZEhlYWQsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtUmVhZEhlYWQgPT0gbUNhcGFjaXR5KSBtUmVhZEhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyLCBudW0pOworICAgICAgICAgICAgbVJlYWRIZWFkICs9IG51bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6c2l6ZSgpIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTY5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNkZWZpbmUgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIHV0aWxpdHkgY2xhc3MgdG8gY3V0IHRoZSBzdGFydCBhbmQgZW5kIG9mZiBhIHN0cmVhbSBvZiBkYXRhIGluIE1lZGlhQnVmZmVycworICoKKyAqLworY2xhc3MgU2tpcEN1dEJ1ZmZlcjogcHVibGljIFJlZkJhc2UgeworIHB1YmxpYzoKKyAgICAvLyAnc2tpcCcgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcCBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAvLyAnY3V0JyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBjdXQgZnJvbSB0aGUgZW5kCisgICAgLy8gJ251bTE2Qml0Q2hhbm5lbHMnIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIHdoaWNoIGFyZSBhc3N1bWVkIHRvIGJlIDE2IGJpdCB3aWRlIGVhY2gKKyAgICBTa2lwQ3V0QnVmZmVyKHNpemVfdCBza2lwLCBzaXplX3QgY3V0LCBzaXplX3QgbnVtMTZDaGFubmVscyk7CisKKyAgICAvLyBTdWJtaXQgb25lIE1lZGlhQnVmZmVyIGZvciBza2lwcGluZyBhbmQgY3V0dGluZy4gVGhpcyBtYXkgY29uc3VtZSBhbGwgb3IKKyAgICAvLyBzb21lIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIsIG9yIGl0IG1heSBhZGQgZGF0YSB0byBpdC4KKyAgICAvLyBBZnRlciB0aGlzLCB0aGUgY2FsbGVyIHNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBidWZmZXIgYXMgdXN1YWwuCisgICAgdm9pZCBzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7ICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFuIEFCdWZmZXIKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgY2xlYXIoKTsKKyAgICBzaXplX3Qgc2l6ZSgpOyAvLyBob3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYnVmZmVyCisKKyBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U2tpcEN1dEJ1ZmZlcigpOworCisgcHJpdmF0ZToKKyAgICB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSk7CisgICAgc2l6ZV90IHJlYWQoY2hhciAqZHN0LCBzaXplX3QgbnVtKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpOworICAgIGludDMyX3QgbVNraXA7CisgICAgaW50MzJfdCBtRnJvbnRQYWRkaW5nOworICAgIGludDMyX3QgbUJhY2tQYWRkaW5nOworICAgIGludDMyX3QgbVdyaXRlSGVhZDsKKyAgICBpbnQzMl90IG1SZWFkSGVhZDsKKyAgICBpbnQzMl90IG1DYXBhY2l0eTsKKyAgICBjaGFyKiBtQ3V0QnVmZmVyOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNraXBDdXRCdWZmZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZjU1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjY29kZWNfdW5pdF90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWNfc2FuaXR5X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM2ODdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjU2FuaXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhQ29kZWNTYW5pdHlUZXN0KCkKKyAgICAgICAgOiBsb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgICAgIGNmZyhuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIGlmbXQobmV3IEFNZXNzYWdlKSwKKyAgICAgICAgICBvZm10KG5ldyBBTWVzc2FnZSkgeworICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB+TWVkaWFDb2RlY1Nhbml0eVRlc3QoKSB7CisgICAgICAgIGlmIChjb2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGxvb3Blci0+c3RvcCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gY2ZnOworICAgIHNwPEFNZXNzYWdlPiBpZm10OworICAgIHNwPEFNZXNzYWdlPiBvZm10OworfTsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrTGluZWFyQnVmZmVyU2l6ZSA9IDEwNDg1NzY7CisKKy8vIGRhdGEgZm9yIGEgY29kZWMgaW5wdXQgZnJhbWUKK3N0cnVjdCBGcmFtZURhdGEgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgdGVtcGxhdGU8c2l6ZV90IE4+CisgICAgY29uc3RleHByIEZyYW1lRGF0YShjb25zdCB1aW50OF90KCZkYXRhXylbTl0pIDogZGF0YShkYXRhXyksIHNpemUoTikgeyB9Cit9OworCisvLyBvbmUgeWVsbG93IGZyYW1lIG9mIDI0MHgxODAgKGFsYmVpdCA0OjQ6NCkKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0ExW10gPSB7IC8vIElEUiBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4NjQsIDB4MDAsIDB4MGQsIDB4YWMsIDB4ZDksIDB4NDEsIDB4NDEsIDB4ZmEsIDB4MTAsIDB4MDAsIDB4MDAsCisgICAgMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgyMCwgMHhmMSwgMHg0MiwgMHg5OSwgMHg2MCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZWIsIDB4ZTMsIDB4Y2IsIDB4MjIsIDB4YzAsCisKKyAgICAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDg4LCAweDg0LCAweDAwLCAweDJiLCAweGZmLCAweGZlLCAweGQ4LCAweGU3LCAweGYzLCAweDJjLCAweGE1LCAweDYwLAorICAgIDB4Y2EsIDB4YmIsIDB4ZjEsIDB4NWMsIDB4NDQsIDB4N2MsIDB4OWEsIDB4YTUsIDB4YzMsIDB4YWIsIDB4MmYsIDB4NzcsIDB4MGEsIDB4OTQsIDB4MGQsIDB4MTksCisgICAgMHg0MywgMHgzYiwgMHg0ZiwgMHgyNSwgMHhlYSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgzNSwgMHg1ZiwgMHhjMiwgMHgzNCwgMHg4OSwgMHhkMSwKKyAgICAweGE1LCAweDYwLCAweDA5LCAweDk4LCAweDAwLCAweDAxLCAweDFiLCAweDBlLCAweGNiLCAweDBkLCAweDA0LCAweDg2LCAweDk0LCAweGUyLCAweDMyLCAweDNjLAorICAgIDB4ZGQsIDB4MGYsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0FbXSBfX3VudXNlZCA9IHsgYXZjU3RyZWFtX0ExIH07CisKKy8vIEFWQyBzdHJlYW0gb2YgMiB5ZWxsb3cgZnJhbWVzICgyNDB4MTgwKQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwYywgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDgwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MzMsIDB4ZmYsIDB4ZmUsIDB4ZGYsIDB4MzIsIDB4ZjgsIDB4MTQsIDB4ZDYsIDB4MjUsCisgICAgMHhkMCwgMHg3NCwgMHg0MiwgMHg1MCwgMHg4NCwgMHg2ZiwgMHhmNCwgMHhjMiwgMHg1YywgMHg3NiwgMHgzNywgMHgxNywgMHg3MiwgMHhhYywgMHg1MiwgMHhmYywKKyAgICAweGQ2LCAweDFmLCAweGQyLCAweGQwLCAweDYwLCAweGIyLCAweDIwLCAweDAwLCAweDEwLCAweDNkLCAweDJhLCAweGMwLCAweGU0LCAweDI3LCAweGNiLCAweGNlLAorICAgIDB4ZWEsIDB4MjUsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4NDAsIDB4YmMsIDB4ODEsIDB4MTUsIDB4YzEsIDB4NjUsIDB4MjAsIDB4ODAsIDB4ODEsCisgICAgMHg3YSwgMHg1NywgMHg1MSwKK307CisKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0IyW10gPSB7IC8vIFAgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDlhLCAweDIxLCAweDZjLCAweDQyLCAweGJmLCAweGZlLCAweDM4LCAweDQwLCAweDAwLCAweDBkLCAweDQ4LAorfTsKKworRnJhbWVEYXRhIGF2Y1N0cmVhbV9CW10gPSB7IGF2Y1N0cmVhbV9CMSwgYXZjU3RyZWFtX0IyIH07CisKK2NsYXNzIE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXZjRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdFZpZGVvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQudnA4LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX1ZQOCk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdEF1ZGlvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDQ0MTAwKTsKKyAgICBjZmctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMik7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgY29uc3QgaW50MzJfdCBJbnB1dFNpemUgPSBHZXRQYXJhbSgpOworICAgIGlmIChJbnB1dFNpemUgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIElucHV0U2l6ZSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRGb3JtYXQoJmlmbXQpLCBPSyk7CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCAxIDw8IDE5KTsgLy8gNTEyIEtCCisgICAgICAgIH0KKyAgICAgICAgbWF4SW5wdXRTaXplID0ga0xpbmVhckJ1ZmZlclNpemU7IC8vIGlucHV0IHNpemUgaXMgc2V0IGJ5IGNoYW5uZWwKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5wdXRTaXplcywgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKC0xLCAxMjM0LCAxMjM0NTY3OCkpOworCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RBdmNEZWNvZGVySGRyU3RhdGljSW5mbykgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0IpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9CKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgJm9pbmZvKSk7CisgICAgQVNTRVJUX0VRKG9pbmZvLT5zaXplKCksIHNpemVvZihpbmZvKSk7CisgICAgRVhQRUNUX0VRKG1lbWNtcChvaW5mby0+ZGF0YSgpLCAmaW5mbywgc2l6ZW9mKGluZm8pKSwgIDApOworfQorCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RWaWRlb0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK2NsYXNzIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCA6IHB1YmxpYyBNZWRpYUNvZGVjU2FuaXR5VGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIFRlc3RWaWRlb0RlY29kZXI0MjBQbGFuYXIpIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIik7CisvLyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBjb25zdCBpbnQzMl90IENvbG9yID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoQ29sb3IgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDb2xvcik7CisgICAgfQorICAgIGludDMyX3QgeGNvbG9yID0gQ29sb3IgPT0gLTEgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDb2xvcjsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBpbnQzMl90IG9jb2xvciA9IC0xOworICAgIEVYUEVDVF9UUlVFKG9mbXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJm9jb2xvcikpOworICAgIEVYUEVDVF9FUShvY29sb3IsIHhjb2xvcik7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0EpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9BKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKSA8PCBvZm10LT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpIDw8IGJ1Zi0+bWV0YSgpLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpOworICAgIC8vIGV4cGVjdCBhbiBpbWFnZS1kYXRhIGluIGJvdGggZm9ybWF0IGFuZCBtZXRhCisgICAgc3A8QUJ1ZmZlcj4gaW1nQnVmLCBpbWdCdWYyOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmKSk7CisgICAgQVNTRVJUX1RSVUUoYnVmLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmMikpOworICAgIEVYUEVDVF9FUShpbWdCdWYtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgQVNTRVJUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBpbWdCdWYyLT5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoaW1nQnVmLT5kYXRhKCksIGltZ0J1ZjItPmRhdGEoKSwgaW1nQnVmLT5zaXplKCkpKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWdCdWYtPmRhdGEoKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tVHlwZSwgaW1nLT5NRURJQV9JTUFHRV9UWVBFX1lVVik7CisgICAgRVhQRUNUX0VRKGltZy0+bU51bVBsYW5lcywgM3UpOworICAgIEVYUEVDVF9FUShpbWctPm1XaWR0aCwgMzIwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUhlaWdodCwgMjQwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoLCA4dSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoQWxsb2NhdGVkLCA4dSk7CisKKyAgICAvLyByZWFkIHN0cmlkZXMgZnJvbSBmb3JtYXQKKyAgICBpbnQzMl90IHN0cmlkZSwgdnN0cmlkZTsKKyAgICBvZm10LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpICAgICAgICAgIHx8IG9mbXQtPmZpbmRJbnQzMigid2lkdGgiLCAmc3RyaWRlKTsKKyAgICBvZm10LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZ2c3RyaWRlKSAgIHx8IG9mbXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJnZzdHJpZGUpOworCisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUhvcml6U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tVmVydFN1YnNhbXBsaW5nLCAxdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisKKyAgICBzd2l0Y2ggKHhjb2xvcikgeworICAgICAgICAvLyBkZWZpbmVkIGZvcm1hdHMKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCwgMHUpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0KSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSAvIDIpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0ICsgc3RyaWRlIC8gMiAqIDExOSArIDE2MCkpOworICAgICAgICAgICAgRVhQRUNUX0xFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyAxKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICsgc3RyaWRlICogMTE5ICsgMzIwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgLy8gYW55dGhpbmcgZ29lcywgYnV0IHN0cmlkZSBzaG91bGQgbWF0Y2ggWSBwbGFuZQorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCArIDIzOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMTkgKiBpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMgKyAxIH0pKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB2YWxpZGF0ZSBhbGwgcGl4ZWxzCisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiTWVkaWFJbWFnZSB7IEYoJXV4JXUpIEAldSslZCslZCBAJXUrJWQrJWQgQCV1KyVkKyVkIH1cbiIsCisgICAgICAgICAgICBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0LAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMF0ubUNvbEluYywgaW1nLT5tUGxhbmVbMF0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzFdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzFdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVsyXS5tQ29sSW5jLCBpbWctPm1QbGFuZVsyXS5tUm93SW5jKTsKKyNlbmRpZgorICAgIGZvciAoaXggPSAwOyBpeCA8IDM7ICsraXgpIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsgMjEwLCAxNiwgMTQ2IH07CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbWctPm1IZWlnaHQgLyBpbWctPm1QbGFuZVtpeF0ubVZlcnRTdWJzYW1wbGluZyA7ICsreSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGltZy0+bVdpZHRoIC8gaW1nLT5tUGxhbmVbaXhdLm1Ib3JpelN1YnNhbXBsaW5nOyArK3gpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZhbCA9IGJ1Zi0+ZGF0YSgpW2ltZy0+bVBsYW5lW2l4XS5tT2Zmc2V0ICsgaW1nLT5tUGxhbmVbaXhdLm1Db2xJbmMgKiB4CisgICAgICAgICAgICAgICAgICAgICAgICArIGltZy0+bVBsYW5lW2l4XS5tUm93SW5jICogeV07CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZhbCwgZXhwZWN0ZWRbaXhdKSA8PCAiaW5jb3JyZWN0IHZhbHVlIGZvciBwbGFuZSAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpeCA8PCAiIGF0IHg9IiA8PCB4IDw8ICIsIHk9IiA8PCB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAtMSwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGIwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPFJlZmxlY3RlZFBhcmFtVXBkYXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4VGVzdFN0YXJ0ID0gMHgxMDAwLAorICAgIGtQYXJhbUluZGV4SW50LAorICAgIGtQYXJhbUluZGV4U3RyaW5nLAorICAgIGtQYXJhbUluZGV4Q29tcG9zaXRlLAorICAgIGtQYXJhbUluZGV4RmxleFN0cmluZywKKworICAgIGtQYXJhbUluZGV4TG9uZyA9IEMyUGFyYW06OlRZUEVfSU5ERVhfVkVORE9SX1NUQVJULAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleEludD4gQzJJbnRJbmZvOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleExvbmc+IEMyTG9uZ0luZm87CisKK3N0cnVjdCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCB7CisgICAgY2hhciB2YWx1ZVsxMl07CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoRml4ZWRTaXplU3RyaW5nKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJGaXhlZFNpemVTdHJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4U3RyaW5nPiBDMlN0cmluZ0luZm87CisKK3N0cnVjdCBDMkNvbXBvc2l0ZVN0cnVjdCB7CisgICAgaW50MzJfdCBpMzI7CisgICAgdWludDY0X3QgdTY0OworICAgIGNoYXIgc3RyWzEyXTsKKyAgICB1aW50OF90IGJsb2JbOF07CisgICAgdWludDhfdCBmbGV4QmxvYltdOworCisgICAgQzJDb21wb3NpdGVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChDb21wb3NpdGUsIGZsZXhCbG9iKQorICAgIEMyRklFTEQoaTMyLCAiaTMyIikKKyAgICBDMkZJRUxEKHU2NCwgInU2NCIpCisgICAgQzJGSUVMRChzdHIsICJzdHIiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoZmxleEJsb2IsICJmbGV4LWJsb2IiKQorfTsKK3N0YXRpY19hc3NlcnQoQzJDb21wb3NpdGVTdHJ1Y3Q6OkZMRVhfU0laRSA9PSAxLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9DMkZsZXhIZWxwZXI8QzJDb21wb3NpdGVTdHJ1Y3Q+OjpGTEVYX1NJWkUgPT0gMSwgIiIpOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJDb21wb3NpdGVTdHJ1Y3QsIGtQYXJhbUluZGV4Q29tcG9zaXRlPiBDMkNvbXBvc2l0ZUluZm87CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4RmxleFN0cmluZz4gQzJGbGV4U3RyaW5nSW5mbzsKKworI2RlZmluZSBTVVBQT1JURURfVFlQRVMgICBcCisgICAgQzJJbnRJbmZvLCAgICAgICAgICAgIFwKKyAgICBDMkxvbmdJbmZvLCAgICAgICAgICAgXAorICAgIEMyU3RyaW5nSW5mbywgICAgICAgICBcCisgICAgQzJDb21wb3NpdGVJbmZvLCAgICAgIFwKKyAgICBDMkZsZXhTdHJpbmdJbmZvCisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDxULCBUWVBFUy4uLj4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IFQ6OkNPUkVfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlX2ltcGw8VFlQRVMuLi4+OjpkZXNjcmliZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBkZXNjcmliZV9pbXBsPD4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgY2hhciAqR2V0TmFtZSgpICAgICAgICB7IHJldHVybiBudWxscHRyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJJbnRJbmZvPigpICAgICAgIHsgcmV0dXJuICJpbnQiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJMb25nSW5mbz4oKSAgICAgIHsgcmV0dXJuICJsb25nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyU3RyaW5nSW5mbz4oKSAgICB7IHJldHVybiAic3RyaW5nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyQ29tcG9zaXRlSW5mbz4oKSB7IHJldHVybiAiY29tcG9zaXRlIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyRmxleFN0cmluZ0luZm8+KCkgeyByZXR1cm4gImZsZXgtc3RyaW5nIjsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUWVBFUz4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHZvaWQgZmlsbChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqdmVjKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxUWVBFUy4uLj46OmZpbGwodmVjKTsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fVFlQRSwgQzJQYXJhbURlc2NyaXB0b3I6OklTX1BFUlNJU1RFTlQsIEdldE5hbWU8VD4oKSkpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDw+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICopIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUICpDYXN0UGFyYW0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSkgeworICAgIHJldHVybiAoVCAqKXBhcmFtLmdldCgpOworfQorCitjbGFzcyBQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKKyAgICB+UGFyYW1SZWZsZWN0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpkZXNjcmliZShwYXJhbUluZGV4KTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QoKSA6IG1SZWZsZWN0b3IobmV3IFBhcmFtUmVmbGVjdG9yKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpmaWxsKCZtRGVzY3JpcHRvcnMpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1EZXNjcmlwdG9yczsKK307CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTaW5nbGVWYWx1ZVRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImludC52YWx1ZSIsIGludDMyX3QoMTIpKTsKKyAgICBtc2cuZW1wbGFjZSgidmVuZG9yLmxvbmcudmFsdWUiLCBpbnQ2NF90KDM0KSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMySW50SW5mbyk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJMb25nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTIsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMzQsIENhc3RQYXJhbTxDMkxvbmdJbmZvPihwYXJhbXNbMV0pLT52YWx1ZSk7CisKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlID0gMDsKKyAgICBpbnQ2NF90IGludDY0VmFsdWUgPSAwOworICAgIG1zZyA9IHVwZGF0ZXIuZ2V0UGFyYW1zKHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImludC52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJpbnQudmFsdWUiXS5maW5kKCZjMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDEyLCBpbnQzMlZhbHVlKTsKKworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJ2ZW5kb3IubG9uZy52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJ2ZW5kb3IubG9uZy52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMzQsIGludDY0VmFsdWUpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgU3RyaW5nVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgic3RyaW5nLnZhbHVlIiwgQVN0cmluZygiNTYiKSk7CisgICAgbXNnLmVtcGxhY2UoImZsZXgtc3RyaW5nLnZhbHVlIiwgQVN0cmluZygiU29tZSBzdHJpbmciKSk7CisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkZsZXhTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmluZ0luZm8pOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZVswXSk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkZsZXhTdHJpbmdJbmZvOjpBbGxvY1VuaXF1ZSgwKSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIGNoYXIgKmZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiNTYiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDEydSwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlNvbWUgc3RyaW5nIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9ORShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKyAgICBmbGV4U3RyaW5nRGF0YSA9ICZDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZVswXTsKKworICAgIC8vIHZlcmlmeSB0cnVuY2F0aW9uIGFuZCBpbi1wbGFjZSB1cGRhdGUKKyAgICBtc2dbInN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCIxMjM0NTY3ODkwQUJDREUiKSk7CisgICAgbXNnWyJmbGV4LXN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCJhYmMiKSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiMTIzNDU2Nzg5MEEiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDR1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9FUShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgic3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInN0cmluZy52YWx1ZSJdLmZpbmQoJnN0clZhbHVlKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIHN0clZhbHVlLmNfc3RyKCkpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImZsZXgtc3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImFiYyIsIHN0clZhbHVlLmNfc3RyKCkpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIGludDMyX3QoNzgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnU2NCIsIGludDY0X3QoOTEwKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5zdHIiLCBBU3RyaW5nKCIxMTEyIikpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmZmVyMDgiLCA4KSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImZsZXgtYnVmZmVyLTE0IiwgMTQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiXDBcMFwwXDBcMFwwXDBcMCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCkpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIHVpbnQ4X3QgKmZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSg3OCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSg5MTB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX1NUUkVRKCIxMTEyIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5zdHIpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZmZlcjA4IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVN0cmluZyBoZXg7CisgICAgaGV4ZHVtcChDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgsIDAsICZoZXgpOworICAgIHByaW50ZigiJXNcbiIsIGhleC5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9ORShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKyAgICBmbGV4QmxvYkRhdGEgPSAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgemVybyBleHRlbmRpbmcgc2hvcnRlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmMDUiLCA1KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZjA1XDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHNldHRpbmcgYW5kIHRyaW1taW5nIGxhcmdlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiUmVhbGx5TG9uZ0J1ZmZlciIsIDE2KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoIlJlYWxseUxvIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHRyaW1taW5nIGZsZXggYmxvYiBpbi1wbGFjZQorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuZmxleC1ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDV1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDUiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCA1KSk7CisgICAgRVhQRUNUX0VRKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlUGFydGlhbFRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5pMzIiLCBDMlZhbHVlKDEzMTQpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjE1MTYiKSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2soQzJDb21wb3NpdGVJbmZvOjpBbGxvY1VuaXF1ZSgxMnUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDEzMTQsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uaTMyKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjE1MTYiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZjAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMk1hcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4NjYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBjb3B5IGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgdWludDhfdCwgY29uc3QgdWludDhfdD46OnR5cGUgKmltZ1JvdyA9CisgICAgICAgICAgICBpbWdCYXNlICsgaW1nLT5tUGxhbmVbaV0ubU9mZnNldDsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIGNvbnN0IHVpbnQ4X3QsIHVpbnQ4X3Q+Ojp0eXBlICp2aWV3Um93ID0KKyAgICAgICAgICAgIHZpZXdSb3cgPSB2aWV3LmRhdGEoKVtpXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgaWYgKHBsYW5lLmNvbFNhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucm93U2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IGltZy0+bUJpdERlcHRoQWxsb2NhdGVkCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIC8vIE1lZGlhSW1hZ2Ugb25seSBzdXBwb3J0cyBNU0IgdmFsdWVzCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgfHwgKGJwcCA+IDEgJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBwbGFuZS5OQVRJVkUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CisgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgeworICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkNvcHlCeVJvdykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdSb3csIHZpZXdSb3csIHN0ZDo6bWluKHBsYW5lLnJvd0luYywgaW1nLT5tUGxhbmVbaV0ubVJvd0luYykpOworICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW1nUm93KSBpbWdQdHIgPSBpbWdSb3c7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwbGFuZVc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1B0ciwgdmlld1B0ciwgYnBwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgICAgIHZpZXdQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2aWV3Um93ICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICh2aWV3LndpZHRoKCkgIT0gaW1nLT5tV2lkdGggfHwgdmlldy5oZWlnaHQoKSAhPSBpbWctPm1IZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHx8IChJc0k0MjAodmlldykgJiYgSXNOVjEyKGltZykpKSB7CisgICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgorICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgICAgICB1aW50OF90KiBkc3RfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgICAgICBpZiAoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAodmlldy53aWR0aCgpICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuaGVpZ2h0KCkgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB8fCAoSXNJNDIwKGltZykgJiYgSXNOVjEyKHZpZXcpKSkgeworICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKKyAgICAgICAgdWludDhfdCogZHN0X3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICAgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICAgICAgdWludDhfdCogZHN0X3YgPSB2aWV3LmRhdGEoKVsyXTsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfSW1hZ2VDb3B5PGZhbHNlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOworfQorCitib29sIElzWVVWNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5udW1QbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgbGF5b3V0LnR5cGUgPT0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93U2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd1NhbXBsaW5nID09IDIpOworfQorCitib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAxKTsKK30KKworYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5yb290UGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLm9mZnNldCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm9vdEl4ID09IGxheW91dC5QTEFORV9WCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5vZmZzZXQgPT0gMCk7Cit9CisKK2Jvb2wgSXNZVVY0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIHJldHVybiAoaW1nLT5tVHlwZSA9PSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYKKyAgICAgICAgICAgICYmIGltZy0+bU51bVBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aEFsbG9jYXRlZCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tVmVydFN1YnNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubVZlcnRTdWJzYW1wbGluZyA9PSAyKTsKK30KKworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIChpbWctPm1QbGFuZVsyXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCA9PSAxKSk7Cit9CisKK2Jvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKGltZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0ID4gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCk7Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKiA1IC8gNCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CisgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKKyAgICAgICAgLm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLAorICAgICAgICAubU51bVBsYW5lcyA9IDMsCisgICAgICAgIC5tV2lkdGggPSB3aWR0aCwKKyAgICAgICAgLm1IZWlnaHQgPSBoZWlnaHQsCisgICAgICAgIC5tQml0RGVwdGggPSA4LAorICAgICAgICAubUJpdERlcHRoQWxsb2NhdGVkID0gOCwKKyAgICAgICAgLm1QbGFuZSA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKyAxLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMiwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICB9OworfQorCitzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKSB7CisgICAgQ0hFQ0soZHN0WSAhPSBudWxscHRyKTsKKyAgICBDSEVDSygoc3JjLndpZHRoKCkgJiAxKSA9PSAwKTsKKyAgICBDSEVDSygoc3JjLmhlaWdodCgpICYgMSkgPT0gMCk7CisKKyAgICBpZiAoZHN0U3RyaWRlICogZHN0VlN0cmlkZSAqIDMgLyAyID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRCgiY29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVViIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RZICsgZHN0U3RyaWRlICogZHN0VlN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RTdHJpZGUgPj4gMSkgKiAoZHN0VlN0cmlkZSA+PiAxKTsKKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBzcmMubGF5b3V0KCk7CisgICAgY29uc3QgdWludDhfdCAqcFJlZCAgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfUl07CisgICAgY29uc3QgdWludDhfdCAqcEdyZWVuID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfR107CisgICAgY29uc3QgdWludDhfdCAqcEJsdWUgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfQl07CisKKyNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVkID0gKnBSZWQ7CisgICAgICAgICAgICB1aW50OF90IGdyZWVuID0gKnBHcmVlbjsKKyAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZSA9ICpwQmx1ZTsKKworICAgICAgICAgICAgLy8gdXNpbmcgSVRVLVIgQlQuNjAxIGNvbnZlcnNpb24gbWF0cml4CisgICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KKyAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2KSwgMjU1KTsKKworICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7CisKKyAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9CisgICAgICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjgpLCAyNTUpOworCisgICAgICAgICAgICAgICAgZHN0VVt4ID4+IDFdID0gVTsKKyAgICAgICAgICAgICAgICBkc3RWW3ggPj4gMV0gPSBWOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYzsKKyAgICAgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmM7CisgICAgICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBwUmVkICAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBHcmVlbiAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEJsdWUgIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0ucm93SW5jOworICAgICAgICBwR3JlZW4gKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10ucm93SW5jOworICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0ucm93SW5jOworCisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBibG9jayBvZiByYXcgYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrIHsKKyAgICBNZW1vcnlCbG9ja1Bvb2xCbG9jayhzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtRGF0YShuZXcgdWludDhfdFtzaXplXSksIG1TaXplKG1EYXRhID8gc2l6ZSA6IDApIHsgfQorCisgICAgfk1lbW9yeUJsb2NrUG9vbEJsb2NrKCkgeworICAgICAgICBkZWxldGVbXSBtRGF0YTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xCbG9jayk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworfTsKKworLyoqCisgKiBBIHNpbXBsZSByYXcgbWVtb3J5IGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKKyAgICB2b2lkIHJlbGVhc2Uoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgLy8gcmV0dXJuIGJsb2NrIHRvIGZyZWUgYmxvY2tzIGlmIGl0IGlzIHRoZSBjdXJyZW50IHNpemU7IG90aGVyd2lzZSwgZGlzY2FyZAorICAgICAgICBpZiAoYmxvY2stPnNpemUoKSA9PSBtQ3VycmVudFNpemUpIHsKKyAgICAgICAgICAgIG1GcmVlQmxvY2tzLnNwbGljZShtRnJlZUJsb2Nrcy5iZWdpbigpLCBtQmxvY2tzSW5Vc2UsIGJsb2NrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5lcmFzZShibG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBmZXRjaChzaXplX3Qgc2l6ZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRnJlZUJsb2Nrcy5yZW1vdmVfaWYoW3NpemVdKGNvbnN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrICZibG9jaykgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gYmxvY2suc2l6ZSgpICE9IHNpemU7CisgICAgICAgIH0pOworICAgICAgICBtQ3VycmVudFNpemUgPSBzaXplOworICAgICAgICBpZiAobUZyZWVCbG9ja3MuZW1wdHkoKSkgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVtcGxhY2VfZnJvbnQoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2Uuc3BsaWNlKG1CbG9ja3NJblVzZS5iZWdpbigpLCBtRnJlZUJsb2NrcywgbUZyZWVCbG9ja3MuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CbG9ja3NJblVzZS5iZWdpbigpOworICAgIH0KKworICAgIE1lbW9yeUJsb2NrUG9vbEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xJbXBsKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+IG1GcmVlQmxvY2tzOworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUJsb2Nrc0luVXNlOworICAgIHNpemVfdCBtQ3VycmVudFNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sOjpJbXBsIDogTWVtb3J5QmxvY2tQb29sSW1wbCB7Cit9OworCitzdHJ1Y3QgTWVtb3J5QmxvY2s6OkltcGwgeworICAgIEltcGwoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2ssCisgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gcG9vbCkKKyAgICAgICAgOiBtQmxvY2soYmxvY2spLCBtUG9vbChwb29sKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIG1Qb29sLT5yZWxlYXNlKG1CbG9jayk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbG9jay0+ZGF0YSgpOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIG1CbG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gbVBvb2w7Cit9OworCitNZW1vcnlCbG9jayBNZW1vcnlCbG9ja1Bvb2w6OmZldGNoKHNpemVfdCBzaXplKSB7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgcG9vbEJsb2NrID0gbUltcGwtPmZldGNoKHNpemUpOworICAgIHJldHVybiBNZW1vcnlCbG9jayhzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrOjpJbXBsPigKKyAgICAgICAgICAgIHBvb2xCbG9jaywgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PE1lbW9yeUJsb2NrUG9vbEltcGw+KG1JbXBsKSkpOworfQorCitNZW1vcnlCbG9ja1Bvb2w6Ok1lbW9yeUJsb2NrUG9vbCgpCisgICAgOiBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrUG9vbDo6SW1wbD4oKSkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrOjpJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK01lbW9yeUJsb2NrOjp+TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK2NvbnN0IHVpbnQ4X3QqIE1lbW9yeUJsb2NrOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbCA/IG1JbXBsLT5kYXRhKCkgOiBudWxscHRyOworfQorCitzaXplX3QgTWVtb3J5QmxvY2s6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPnNpemUoKSA6IDA7Cit9CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrOjpBbGxvY2F0ZShzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBNZW1vcnlCbG9ja1Bvb2woKS5mZXRjaChzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCisjZGVmaW5lIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvbnZlcnRzIGFuIFJHQiB2aWV3IHRvIHBsYW5hciBZVVYgNDIwIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBkc3RZICAgICAgIHBvaW50ZXIgdG8gbWVkaWEgaW1hZ2UgYnVmZmVyCisgKiBccGFyYW0gZHN0U3RyaWRlICBzdHJpZGUgaW4gYnl0ZXMKKyAqIFxwYXJhbSBkc3RWU3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBidWZmZXJTaXplIG1lZGlhIGltYWdlIGJ1ZmZlciBzaXplCisgKiBccGFyYW0gc3JjIHNvdXJjZSBpbWFnZQorICoKKyAqIFxyZXR2YWwgTk9fTUVNT1JZIG1lZGlhIGltYWdlIGlzIHRvbyBzbWFsbAorICogXHJldHZhbCBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpOworCisvKioKKyAqIFJldHVybnMgYSBwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpOworCisvKioKKyAqIFJldHVybnMgYSBzZW1pcGxhbmFyIFlVViA0MjAgOC1iaXQgbWVkaWEgaW1hZ2UgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBzdHJpZGUgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHZzdHJpZGUgdmVydGljYWwgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICovCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBTZW1pUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogQ29waWVzIGEgZ3JhcGhpYyB2aWV3IGludG8gYSBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIENvcGllcyBhIG1lZGlhIGltYWdlIGludG8gYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weShDMkdyYXBoaWNWaWV3ICZ2aWV3LCBjb25zdCB1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBZVVYgNDIwIDg4OCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNZVVY0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgTlYxMiBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjEyKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgWVVWIDQyMCA4ODggbGF5b3V0LgorICovCitib29sIElzWVVWNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBOVjEyIGxheW91dC4KKyAqLworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgorICoKKyAqIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIEMyTGluZWFyQmxvY2tzIGZyb20gYSBwcml2YXRlIEMyQmxvY2tQb29sCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPHVpbnQ4X3Q+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbmxpbmUgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y29uc3QgTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZXMgYW4gdW5tYW5hZ2VkIGJsb2NrIChub3QgaW4gYSBwb29sKQorICAgIHN0YXRpYyBNZW1vcnlCbG9jayBBbGxvY2F0ZShzaXplX3QpOworCisgICAgLy8gbWVtb3J5IGJsb2NrIHdpdGggbm8gYWN0dWFsIG1lbW9yeSAoc2l6ZSBpcyAwLCBkYXRhIGlzIG51bGwpCisgICAgTWVtb3J5QmxvY2soKTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIE1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlCbG9jaygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSByYXcgbWVtb3J5IG1pbmktcG9vbC4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbCB7CisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJsb2NrIHdpdGggYSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcworICAgICAqLworICAgIE1lbW9yeUJsb2NrIGZldGNoKHNpemVfdCBzaXplKTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCgpOworICAgIH5NZW1vcnlCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMTMxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0wLDAgKzEsOTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIGZvciBJTlQzMl9NQVgKKworI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQWFjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsICAgICAgICAgQUFDT2JqZWN0TEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOLCAgICAgICBBQUNPYmplY3RNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSLCAgICAgICAgQUFDT2JqZWN0U1NSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQLCAgICAgICAgQUFDT2JqZWN0TFRQIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsICAgICAgICAgQUFDT2JqZWN0SEUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDLCAgICAgIEFBQ09iamVjdEVSTEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgQUFDT2JqZWN0RVJTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELCAgICAgICAgIEFBQ09iamVjdExEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsICAgICAgQUFDT2JqZWN0SEVfUFMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsICAgICAgICBBQUNPYmplY3RFTEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUsICAgICAgICBBQUNPYmplY3RYSEUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsICAgIEFWQ0xldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgICBBVkNMZXZlbDFiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwgIEFWQ0xldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCAgQVZDTGV2ZWwxMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsICBBVkNMZXZlbDEzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsICAgIEFWQ0xldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsICBBVkNMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwgIEFWQ0xldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgICAgQVZDTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgIEFWQ0xldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCAgQVZDTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180LCAgICBBVkNMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCAgQVZDTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsICBBVkNMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsICAgIEFWQ0xldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsICBBVkNMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiwgIEFWQ0xldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNiwgICAgQVZDTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSwgIEFWQ0xldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8yLCAgQVZDTGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXZjUHJvZmlsZXMgPSB7CisgICAgLy8gdHJlYXQgcmVzdHJpY3RlZCBwcm9maWxlcyBhcyBmdWxsIHByb2ZpbGUgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCAtIHdoaWNoIHdvcmtzIGZvcgorICAgIC8vIGRlY29kZXJzLCBidXQgbm90IGZvciBlbmNvZGVycworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90PiBzQml0cmF0ZU1vZGVzID0geworICAgIHsgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsICAgICAgQklUUkFURV9NT0RFX0NCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUsICAgQklUUkFURV9NT0RFX1ZCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFLCAgICAgQklUUkFURV9NT0RFX0NRIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4gc0NvbG9yTWF0cmljZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNjAxLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfMjQwTSwgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhTTVBURTI0ME0gfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAsICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMENvbnN0YW50IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfT1RIRVIsICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnByaW1hcmllc190LCBDb2xvckFzcGVjdHM6OlByaW1hcmllcz4gc0NvbG9yUHJpbWFyaWVzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsICBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDksICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNzA5XzUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDQ3MF9NLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ0NzBfNk0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV82MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl82MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV81MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl81MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19HRU5FUklDX0ZJTE0sIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAsICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQyMDIwIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19SUDQzMSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FRzQzMiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FQlUzMjEzLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc090aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnJhbmdlX3QsIGludDMyX3Q+IHNDb2xvclJhbmdlcyA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgIENPTE9SX1JBTkdFX0ZVTEwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIENPTE9SX1JBTkdFX0xJTUlURUQgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgQ29sb3JBc3BlY3RzOjpSYW5nZT4gc0NvbG9yUmFuZ2VzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9GVUxMLCAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsICAgICBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBpbnQzMl90PiBzQ29sb3JUcmFuc2ZlcnMgPSB7CisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVIsIENPTE9SX1RSQU5TRkVSX0xJTkVBUiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCwgQ09MT1JfVFJBTlNGRVJfU1QyMDg0IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9ITEcsICAgIENPTE9SX1RSQU5TRkVSX0hMRyB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyPiBzQ29sb3JUcmFuc2ZlcnNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyTGluZWFyIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TUkdCLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNSR0IgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUxNzBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyLCAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjgsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVySExHIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8yNDBNLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfWFZZQ0MsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJYdllDQyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfQlQxMzYxLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJCVDEzNjEgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUNDI4LCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1Q0MjggfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSLCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvbkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzMwLCAgRG9sYnlWaXNpb25MZXZlbEhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgRG9sYnlWaXNpb25MZXZlbEZoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzYwLCBEb2xieVZpc2lvbkxldmVsRmhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8yNCwgRG9sYnlWaXNpb25MZXZlbFVoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCisKKyAgICAvLyBoaWdoIHRpZXJzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBvbiBhbmRyb2lkLCBmb3Igbm93IG1hcCB0aGVtIHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl9QRVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfREVSLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERU4sIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0biB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfRFRILCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfMDksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0gyNjNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwgSDI2M0xldmVsMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLCBIMjYzTGV2ZWwyMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsIEgyNjNMZXZlbDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwgSDI2M0xldmVsNDAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1LCBIMjYzTGV2ZWw0NSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAsIEgyNjNMZXZlbDUwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M182MCwgSDI2M0xldmVsNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwLCBIMjYzTGV2ZWw3MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSDI2M1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgICAgICAgICAgSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwLCAgICAgICAgICAgICAgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiwgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMywgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OLCAgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQsICAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJuZXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJMQUNFLCAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJsYWNlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSwgICAgICBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSGV2Y0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDTWFpblRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCAgICAgIEhFVkNNYWluVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsICAgIEhFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82LCAgICAgIEhFVkNNYWluVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEsICAgIEhFVkNNYWluVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDYyIH0sCisKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIsICAgIEhFVkNIaWdoVGllckxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2MiB9LAorCisgICAgLy8gbWFwIGhpZ2ggdGllciBsZXZlbHMgYmVsb3cgNCB0byBtYWluIHRpZXIKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEsIEhFVkNQcm9maWxlTWFpbjEwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNIZHIxMFBsdXNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICBNUEVHMkxldmVsSDE0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdILCAgICAgICAgTVBFRzJMZXZlbEhMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCwgICAgICAgTVBFRzJMZXZlbEhQIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnMlByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICBNUEVHMlByb2ZpbGVTTlIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZTQyMiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWc0TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMCwgICBNUEVHNExldmVsMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsICBNUEVHNExldmVsMGIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsICAgTVBFRzRMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsICAgTVBFRzRMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsICAgTVBFRzRMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLCAgTVBFRzRMZXZlbDNiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LCAgIE1QRUc0TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwgIE1QRUc0TGV2ZWw0YSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNSwgICBNUEVHNExldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNiwgICBNUEVHNExldmVsNiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUNvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU5iaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgIE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90PiBzUGNtRW5jb2RpbmdzID0geworICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsICAgIFZQOUxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsICBWUDlMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsICAgIFZQOUxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsICBWUDlMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsICAgIFZQOUxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsICBWUDlMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsICAgIFZQOUxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsICBWUDlMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsICAgIFZQOUxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEsICBWUDlMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiwgIFZQOUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNiwgICAgVlA5TGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSwgIFZQOUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yLCAgVlA5TGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0F2MUxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwgICAgQVYxTGV2ZWwyICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsICBBVjFMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwgIEFWMUxldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8zLCAgQVYxTGV2ZWwyMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zLCAgICBBVjFMZXZlbDMgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSwgIEFWMUxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLCAgQVYxTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzMsICBBVjFMZXZlbDMzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzQsICAgIEFWMUxldmVsNCAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8xLCAgQVYxTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzIsICBBVjFMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMywgIEFWMUxldmVsNDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNSwgICAgQVYxTGV2ZWw1ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzEsICBBVjFMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiwgIEFWMUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8zLCAgQVYxTGV2ZWw1MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82LCAgICBBVjFMZXZlbDYgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMSwgIEFWMUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yLCAgQVYxTGV2ZWw2MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzMsICBBVjFMZXZlbDYzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzcsICAgIEFWMUxldmVsNyAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xLCAgQVYxTGV2ZWw3MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzIsICBBVjFMZXZlbDcyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMywgIEFWMUxldmVsNzMgfSwKK307CisKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xLCBBVjFQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIsIEFWMVByb2ZpbGUyIH0sCit9OworCisKKy8qKgorICogQSBoZWxwZXIgdGhhdCBwYXNzZXMgdGhyb3VnaCB2ZW5kb3IgZXh0ZW5zaW9uIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcy4KKyAqLworc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciA6IEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSA9IDA7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGJvb2wgcGFzc1Rocm91Z2hNYXAoVCBmcm9tLCBVICp0bykgeworICAgICAgICAvLyBhbGxvdyAoYW5kIHBhc3MgdGhyb3VnaCkgdmVuZG9yIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKGZyb20gPj0gKFQpQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgJiYgZnJvbSA8IChUKUlOVDMyX01BWCkgeworICAgICAgICAgICAgKnRvID0gKFUpZnJvbTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaW1wbGVNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gQUFDIG9ubHkgdXNlcyBwcm9maWxlcywgbWFwIGFsbCBsZXZlbHMgdG8gdW51c2VkIG9yIDAKK3N0cnVjdCBBYWNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25MZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEgyNjNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNIZHI7CisgICAgYm9vbCBtSXNIZHIxMFBsdXM7Cit9OworCitzdHJ1Y3QgTXBlZzJQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKKy8vIFZQOCBoYXMgbm8gcHJvZmlsZXMgYW5kIGxldmVscyBpbiBDb2RlYyAyLjAsIGJ1dCB3ZSB1c2UgbWFpbiBwcm9maWxlIGFuZCBsZXZlbCAwIGluIE1lZGlhQ29kZWMKKy8vIG1hcCBhbGwgcHJvZmlsZXMgYW5kIGxldmVscyB0byB0aGF0Lgorc3RydWN0IFZwOFByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gVlA4TGV2ZWxfVmVyc2lvbjA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhQcm9maWxlTWFpbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVnA5UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBWcDlQcm9maWxlTGV2ZWxNYXBwZXIoYm9vbCBpc0hkciA9IGZhbHNlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UpIDoKKyAgICAgICAgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyKCksCisgICAgICAgIG1Jc0hkcihpc0hkciksIG1Jc0hkcjEwUGx1cyhpc0hkcjEwUGx1cykge30KKworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSkgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEFhY1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEgyNjNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWcyUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDhQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cykgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPih0cnVlLCBpc0hkcjEwUGx1cyk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4odHJ1ZSwgaXNIZHIxMFBsdXMpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yUmFuZ2VzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZSBzZlJhbmdlOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sICZzZlJhbmdlKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgaWYgKGZyb20gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgZnJvbSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgc2ZSYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICp0byA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZShzZlJhbmdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisgICAgICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKGZyb20sICZzZlJhbmdlKTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChzZlJhbmdlLCB0bykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgICp0byA9IChDMkNvbG9yOjpyYW5nZV90KXNmUmFuZ2U7CisgICAgICAgICAgICBpZiAoKnRvIDwgQzJDb2xvcjo6UkFOR0VfVkVORE9SX1NUQVJUIHx8ICp0byA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgKnRvID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnJhbmdlX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpSYW5nZSAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeCwgaW50MzJfdCAqc3RhbmRhcmQpIHsKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJnNmUHJpbWFyaWVzKSkgeworICAgICAgICAvLyBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZSBhbmQgdXNlIHN0YXRpYyBjYXN0CisgICAgICAgIGlmIChwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8IHByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG5vbi1leHRlbnNpb24gdmFsdWVzIG1hcCB0byAnT3RoZXInCisgICAgICAgICAgICBzZlByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKXByaW1hcmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAobWF0cml4LCAmc2ZNYXRyaXgpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgaWYgKG1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmTWF0cml4ID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZNYXRyaXggPSAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMpbWF0cml4OworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHNmUHJpbWFyaWVzLCBzZk1hdHJpeCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IHN0YW5kYXJkLCBDMkNvbG9yOjpwcmltYXJpZXNfdCAqcHJpbWFyaWVzLCBDMkNvbG9yOjptYXRyaXhfdCAqbWF0cml4KSB7CisgICAgLy8gZmlyc3QgbWFwIHRvIHN0YWdlZnJpZ2h0IGZvdW5kYXRpb24gYXNwZWN0cyA9PiB0aGVzZSBhY3R1YWxseSBtYXAgbmVhcmx5IDE6MSB0bworICAgIC8vIENvZGVjIDIuMCBhc3BlY3RzCisgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgc2ZQcmltYXJpZXM7CisgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgc2ZNYXRyaXg7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmc2ZQcmltYXJpZXMsICZzZk1hdHJpeCk7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHNmUHJpbWFyaWVzLCBwcmltYXJpZXMpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgKnByaW1hcmllcyA9IChDMkNvbG9yOjpwcmltYXJpZXNfdClzZlByaW1hcmllczsKKyAgICAgICAgaWYgKCpwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8ICpwcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAoc2ZNYXRyaXgsIG1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqbWF0cml4ID0gKEMyQ29sb3I6Om1hdHJpeF90KXNmTWF0cml4OworICAgICAgICBpZiAoKm1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgKm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgKm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIGZyb20sIEMyQ29sb3I6OnByaW1hcmllc190ICp0bykgeworICAgIHJldHVybiBzQ29sb3JQcmltYXJpZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjptYXRyaXhfdCBmcm9tLCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBmcm9tLCBDMkNvbG9yOjptYXRyaXhfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyIHNmVHJhbnNmZXI7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgJnNmVHJhbnNmZXIpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKHNmVHJhbnNmZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnRyYW5zZmVyX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoZnJvbSwgJnNmVHJhbnNmZXIpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHNmVHJhbnNmZXIsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnRyYW5zZmVyX3Qpc2ZUcmFuc2ZlcjsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoCisgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2UsIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyLCB1aW50MzJfdCAqZGF0YVNwYWNlKSB7CisjaWYgMAorICAgIC8vIHB1cmUgcmVpbXBsZW1lbnRhdGlvbgorICAgICpkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047IC8vIHRoaXMgaXMgMAorCisgICAgc3dpdGNoIChyYW5nZSkgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0ZVTEw6ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9GVUxMOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpSQU5HRV9MSU1JVEVEOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfUkFOR0VfTElNSVRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVI6ICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTElORUFSOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQjogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NSR0I7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSXzE3ME06ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TTVBURV8xNzBNOyBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyODogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0dBTU1BMl84OyAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NDogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQ7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9ITEc6ICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfSExHOyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNjI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDoKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5UCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjBfQ09OU1RBTlRfTFVNSU5BTkNFCisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX006CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyNlbHNlCisgICAgLy8gZm9yIG5vdyB1c2UgbGVnYWN5IGltcGxlbWVudGF0aW9uCisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAocmFuZ2UsICZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgYXNwZWN0cy5tUmFuZ2UgPSBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJmFzcGVjdHMubVByaW1hcmllcykpIHsKKyAgICAgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpKSB7CisgICAgICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHRyYW5zZmVyLCAmYXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIH0KKyAgICAqZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM2ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgdG8gbWFwIENvZGVjIDIuMCB2YWx1ZXMgdG8gYW5kcm9pZCB2YWx1ZXMuCisgICAgICovCisgICAgc3RydWN0IEMyTWFwcGVyIHsKKyAgICAgICAgc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgflByb2ZpbGVMZXZlbE1hcHBlcigpID0gZGVmYXVsdDsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGJpdHJhdGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwY20gZW5jb2RpbmdzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwaWN0dXJlIHR5cGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBjb2xvciBhc3BlY3RzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnByaW1hcmllc190KiwgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoCisgICAgICAgICAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBDMkNvbG9yOjp0cmFuc2Zlcl90LAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhU3BhY2UpOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlJhbmdlLCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLCBDMkNvbG9yOjpwcmltYXJpZXNfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6bWF0cml4X3QsIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcywgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXIqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKyAgICB9OworfQorCisjZW5kaWYgIC8vIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U2ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3OSBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl9jb3JlX3BhcmFtX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJQYXJhbV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJfdGVzdC5jcHAiLAorICAgICAgICAiQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAiLAorICAgICAgICAiQzJVdGlsVGVzdC5jcHAiLAorICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2lmICFkZWZpbmVkKFVOVVNFRCkKKyNkZWZpbmUgVU5VU0VEKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpKGV4cHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIWRlZmluZWQoVU5VU0VEKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gYWxsb2NfdW5pcXVlX2NzdHIoY29uc3QgY2hhciAqY3N0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY3N0cik7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHB0ciA9IFQ6OkFsbG9jVW5pcXVlKGxlbik7CisgICAgbWVtY3B5KHB0ci0+bS52YWx1ZSwgY3N0ciwgbGVuKTsKKyAgICByZXR1cm4gcHRyOworfQorCitjbGFzcyBDMkNvbXBJbnRmVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIEMyQ29tcEludGZUZXN0KCkge30KKyAgICB+QzJDb21wSW50ZlRlc3QoKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZXRDb21wb25lbnQoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKSB7CisgICAgICAgIG1JbnRmID0gaW50ZjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0UmVzdWx0cygpIHsKKyAgICAgICAgbUludGYgPSBudWxscHRyOworICAgICAgICBtUGFyYW1SZXN1bHRzLmNsZWFyKCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlc3RTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gdGVzdFJlYWRPbmx5UGFyYW0oKSBhbmQgdGVzdFdyaXRhYmxlUGFyYW0oKSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zIGZvciB0ZXN0aW5nIGEgcGFyYW1ldGVyLgorICAgIC8vIEEgY2FsbGVyIHNob3VsZCBmaW5kIG91dCBpZiBhIHRlc3RlZCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZW0KKyAgICAvLyBhbmQgaXQgbXVzdCBjYWxsIG9uZSBvZiB0aGUgY29ycmVzcG9uZGVkIHRoZW0uCisKKyAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCByZWFkLW9ubHkgcGFyYW1ldGVyIHxwcmVQYXJhbXwuIFRoZSB0ZXN0IGV4cGVjdHMgZmFpbHVyZSB3aGlsZSBjb25maWcoKSB3aXRoIHxuZXdQYXJhbXwsCisgICAgLy8gYW5kIG1ha2Ugc3VyZSB8cHJlUGFyYW18IHN0YXkgdW5jaGFuZ2VkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgdGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlIHRoaXMgaXMgY2FsbGVkLgorICAgIC8vIFRlc3Qgb25lIGZpbGVkIHx3cml0YWJsZUZpZWxkfCBmb3IgZ2l2ZW4gd3JpdGFibGUgcGFyYW1ldGVyIHxwYXJhbXwuCisgICAgLy8gfHZhbGlkVmFsdWVzfCBjb250YWlucyBhbGwgdmFsdWVzIG9idGFpbmVkIGZyb20gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoKSBmb3IgfHdyaXRhYmxlRmllbGR8LgorICAgIC8vIFRoZSB0ZXN0IGNoZWNrcyB2YWxpZGl0eSBmb3IgY29uZmlnKCkgd2l0aCBlYWNoIHZhbHVlLCBhbmQgbWFrZSBzdXJlIHZhbHVlcyBhcmUgY29uZmlnLWVkCisgICAgLy8gYnkgcXVlcnkoKSB0aGVtIG91dC4gfGludmFsaWRWYWx1ZXN8IGNvbnRhaW5zIHNvbWUgdmFsdWVzIHdoaWNoIGFyZSBub3QgaW4gfHZhbGlkVmFsdWVzfC4KKyAgICAvLyBUaGUgdGVzdCBleHBlY3RzIEMyX0JBRF9WQUxVRSB3aGlsZSBjb25maWcoKSB3aXRoIHRoZXNlIHZhbHVlcywKKyAgICAvLyBhbmQgfHBhcmFtfCBzaG91bGQgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgorICAgIHZvaWQgdGVzdFdyaXRhYmxlUGFyYW0oVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBUZXN0IGFsbCB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIGluIEMyUGFyYW0uaC4KKyAgICB2b2lkIHRlc3RNYWluKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb21wb25lbnROYW1lKTsKKworICAgIC8vIENoZWNrIHBlcm1pc3Npb24gb2YgcGFyYW1ldGVyIHR5cGUgfFR8IGZvciB0ZXN0aW5nIGludGVyZmFjZS4KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZmlyc3Qgb2YgdGhlIHRlc3RpbmcgcGVyIHBhcmFtZXRlciB0eXBlLAorICAgIC8vIHRoZXJlZm9yZSBkaWZmZXJlbnQgdGVzdGluZyBwcm9jZXNzIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBwZXJtaXNzaW9uIHR5cGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjaGVja1BhcmFtUGVybWlzc2lvbigKKyAgICAgICAgICAgIGludCAqY29uc3Qgd3JpdGFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc3VwcG9ydGVkUGFyYW1zKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFBhcmFtUGVybWlzc2lvbiA6IGludCB7CisgICAgICAgIFdSSVRBQkxFLAorICAgICAgICBSRUFET05MWSwKKyAgICAgICAgVU5TVVBQT1JURUQsCisgICAgfTsKKworICAgIHN0cnVjdCBwYXJhbVRlc3RJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgcGFyYW1UZXN0SW5mbyhjb25zdCBjaGFyICpuYW1lXywgaW50IHJlc3VsdF8pCisgICAgICAgICAgICA6IG5hbWUobmFtZV8pLCByZXN1bHQocmVzdWx0Xykge30KKyAgICB9OworCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X3ZiKCkgYW5kCisgICAgLy8gY2hlY2sgaWYgYSBjb21wb25lbnQgaGFzIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgfFR8LgorICAgIC8vIElmIGEgY29tcG9uZW50IGhhcywgdGhlIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQgaW50byBhbiBhcmd1bWVudCwgdGhhdCBpcworICAgIC8vIHxwfCBpbiBxdWVyeU9uU3RhY2soKSBhbmQgfGhlYXBQYXJhbXN8IGluIHF1ZXJ5T25IZWFwKCkuCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBjMl9zdGF0dXNfdCAoZS5nLiBDMl9PSykuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IHF1ZXJ5T25TdGFjayhUICpjb25zdCBwKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGMyX3N0YXR1c190IHF1ZXJ5T25IZWFwKGNvbnN0IFQgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcyk7CisKKyAgICAvLyBHZXQgYSB2YWx1ZSB3aG9zZSB0eXBlIGlzIHxUfCBpbiBhIGNvbXBvbmVudC4gVGhlIHZhbHVlIGlzIGNvcGllZCB0byB8cGFyYW18LgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiBjb21wb25lbnQgaXMgZXF1YWwgdG8gfGV4cGVjdGVkfCBhbmQKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlPbkhlYXAoKSBhcmUgc3VjY2VlZGVkLiBXaGVuIHRoaXMgZnVuY3Rpb24gY2FsbGVkLAorICAgIC8vIGl0IHNob3VsZCBiZSBndWFyYW50ZWVkIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKTsKKworICAgIC8vIFRlc3QgaWYgcXVlcnkgZnVuY3Rpb25zIHdvcmtzIGNvcnJlY3RseSBmb3Igc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gVGVzdCBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciB1bnN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIC8vICJVbnN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlVbnN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBFeGVjdXRlIGFuIGludGVyZmFjZSdzIGNvbmZpZ192YigpLiB8VHwgaXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUsIG5vdCBzdGQ6OnZlY3Rvci4KKyAgICAvLyBjb25maWcoKSBjcmVhdGVzIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX3ZiKCkuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QKKyAgICBjb25maWcoVCAqY29uc3QgcCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcyk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgZm9yIHJlYWQtb25seSBwYXJhbWV0ZXJzLgorICAgIC8vIEJlY2F1c2UgdGhlIGZhaWx1cmUgb2YgY29uZmlnKCkgaXMgYXNzdW1lZCwgfG5ld1BhcmFtfCBkb2Vzbid0IG1hdHRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3Igd3JpdGFibGUgcGFyYW1ldGVycy4KKyAgICAvLyBUaGlzIGNoYW5nZXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHRvIHxuZXdQYXJhbXwuCisgICAgLy8gfHN0Q29uZmlnfCBpcyBhIHJldHVybiB2YWx1ZSBvZiBjb25maWcoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKnN0Q29uZmlnKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBpbiB0aGUgY2FzZSBhbiBpbnZhbGlkIHZhbHVlIHxuZXdQYXJhbXwgaXMgdHJpZWQgdG8gd3JpdGUKKyAgICAvLyB0byBhbiB3cml0YWJsZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBDcmVhdGUgdmFsdWVzIGZvciB0ZXN0aW5nIGZyb20gfHZhbGlkVmFsdWVJbmZvc3wuIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IDogdmFsaWQgdmFsdWVzLCB3aGljaCBjYW4gYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyB8SW52YWxpZFZhbHVlc3wgOiBpbnZhbGlkIHZhbHVlcywgd2hpY2ggY2Fubm90IGJlIHdyaXR0ZW4gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgLy8gICAgICAgICAgICAgICAgICAgY29uZmlnKCkgc2hvdWxkIGJlIGZhaWxlZCBpZiB0aGVzZSB2YWx1ZXMgYXJlIHVzZWQgYXMgbmV3IHZhbHVlcy4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igd3JpdGFibGUgYW5kIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCBnZXRUZXN0VmFsdWVzKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpOworCisgICAgLy8gT3V0cHV0IHRoZSBzdW1tYXJ5IG9mIHRlc3QgcmVzdWx0cy4gQ2F0ZWdvcml6ZXMgcGFyYW1ldGVycyB3aXRoIHRoZWlyIGNvbmZpZ3VyYXRpb24uCisgICAgdm9pZCBvdXRwdXRSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8cGFyYW1UZXN0SW5mbz4gbVBhcmFtUmVzdWx0czsKKyAgICBzdGQ6OnN0cmluZyBtQ3VycmVudFBhcmFtTmFtZTsKK307CisKKy8vIGZhY3RvcnkgZnVuY3Rpb24KKy8vIFRPRE8oaGlyb2gpOiBBZGQgZmFjdG9yeSBmdW5jdGlvbnMgZm9yIG90aGVyIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW0oKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8VD4oKTsKK30KKwordGVtcGxhdGUgPD4gc3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtYWtlUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IFNldCBtb3JlIHByZWNpc2UgbGVuZ3RoLgorICAgIHJldHVybiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMTAwKTsKK30KKworI2RlZmluZSBUUkFDRURfRkFJTFVSRShmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKG1DdXJyZW50UGFyYW1OYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICBmdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7ICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlPblN0YWNrKFQgKmNvbnN0IHApIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gc3RhY2tQYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uSGVhcCgKKyAgICAgICAgY29uc3QgVCAmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgeworICAgIHVpbnQzMl90IGluZGV4ID0gcC5pbmRleCgpICYgfjB4MDNGRTAwMDA7CisgICAgaWYgKHAuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgaW5kZXggfD0gKChwLnN0cmVhbSgpIDw8IDE3KSAmIDB4MDFGRTAwMDApIHwgMHgwMjAwMDAwMDsKKyAgICB9CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwge2luZGV4fSwgQzJfRE9OVF9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRWYWx1ZShUICpjb25zdCBwYXJhbSkgeworICAgIC8vIFdoZW4gZ2V0VmFsdWUoKSBpcyBjYWxsZWQsIGEgY29tcG9uZW50IGhhcyB0byBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uU3RhY2socGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVBhcmFtQXNFeHBlY3RlZChjb25zdCBUICZleHBlY3RlZCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjaygmc3RhY2spKTsKKworICAgIC8vIHxzdGFja3wgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgc2l6ZSBzaG91bGRuJ3QgYmUgMC4KKyAgICBFWFBFQ1RfTkUoMHUsIHN0YWNrLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YWNrLCBleHBlY3RlZCk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25IZWFwKCpwSGVhcCwgJmhlYXBQYXJhbXMpKTsKKworICAgIC8vIHwqaGVhcFBhcmFtc1swXXwgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBzaXplIG9mIHxoZWFwUGFyYW1zfCBoYXMgdG8gYmUgb25lLgorICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGhlYXBQYXJhbXNbMF0pOworICAgIEVYUEVDVF9FUSgqaGVhcFBhcmFtc1swXSwgZXhwZWN0ZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhY3F1aXJlZCBieSBnZXRWYWx1ZSgpLCB3aGljaCBzaG91bGQgYmUgc3VjY2VlZGVkLgorICAgIGdldFZhbHVlKHBhcmFtLmdldCgpKTsKKyAgICBxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgLy8gSWYgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIsIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpCisgICAgLy8gc2hvdWxkIHJldHVybiBDMl9CQURfSU5ERVguCisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPblN0YWNrKCZzdGFjaykpOworICAgIEVYUEVDVF9GQUxTRShzdGFjayk7CisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworICAgIEVYUEVDVF9FUSgwdSwgaGVhcFBhcmFtcy5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0Ojpjb25maWcoCisgICAgICAgIFQgKmNvbnN0IHAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3B9OworICAgIHJldHVybiBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgZmFpbHVyZXMpOworfQorCisvLyBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIGNvcGllZCBmcm9tIHxwfC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZVBhcmFtRnJvbShjb25zdCBUICZwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHJldFAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBFWFBFQ1RfVFJVRShyZXRQLT51cGRhdGVGcm9tKHApKTsKKyAgICBFWFBFQ1RfVFJVRShtZW1jbXAocmV0UC5nZXQoKSwgJnAsIHNpemVvZihUKSkgPT0gMCk7CisgICAgcmV0dXJuIHJldFA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnUmVhZE9ubHlQYXJhbShjb25zdCBUICZuZXdQYXJhbSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkIGJlY2F1c2UgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5LgorICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0sIGMyX3N0YXR1c190ICpjb25maWdSZXN1bHQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gSW4gbW9zdCBjYXNlcywgY29uZmlnX3ZiIHJldHVybiBDMl9PSyBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHNob3VsZCBiZSBjaGFuZ2VkCisgICAgLy8gdG8gfG5ld1BhcmFtfCwgd2hpY2ggaXMgY29uZmlybWVkIGluIGEgY2FsbGVyIG9mIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWx1ZVZhbHVlKCkuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gcmV0dXJuIH5+fn4gYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZXMgaXMgbm90IGNoYW5nZWQsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBtYXkgYmUgZGVwZW5kZW50IGxpbWl0YXRpb25zIGJldHdlZW4gZmllbGRzIG9yIGJldHdlZW4gcGFyYW1ldGVycy4KKyAgICAvLyBUT0RPKGhpcm9oKTogSSBoYXZlIHRvIGZpbGwgdGhlIHJldHVybiB2YWx1ZS4gQ29tbWVudHMgaW4gQzJDb21wb25lbnQuaCBkb2Vzbid0IG1lbnRpb24KKyAgICAvLyBhYm91dCB0aGUgcmV0dXJuIHZhbHVlIHdoZW4gY29uZmxpY3QgaGFwcGVucy4gSSBzZXQgQzJfQkFEX1ZBTFVFIHRvIGl0IHRlbXBvcmFyaWx5IG5vdy4KKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZyA9IG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgc3RDb25maWcpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7CisgICAgfQorICAgICpjb25maWdSZXN1bHQgPSBzdENvbmZpZzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIEFsdGhvdWdoIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlLCBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCwKKyAgICAvLyBiZWNhdXNlIGEgbmV3IHZhbHVlIGlzIGludmFsaWQuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKworLy8gVGhlcmUgaXMgb25seSB1c2VkIGVudW0gdHlwZSBmb3IgdGhlIGZpZWxkIHR5cGUsIHRoYXQgaXMgQzJDb21wb25lbnQ6OmRvbWFpbl90LgorLy8gSWYgYW5vdGhlciBmaWVsZCB0eXBlIGlzIGFkZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIGZ1bmN0aW9uIGZvciB0aGF0LgordGVtcGxhdGUgPD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFRlc3RWYWx1ZXMoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OmRvbWFpbl90PiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50Ojpkb21haW5fdD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpIHsKKyAgICBVTlVTRUQodmFsaWRWYWx1ZUluZm9zKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKworICAgIC8vIFRoZXJlIGlzIG5vIGludmFsaWQgdmFsdWUuCisgICAgVU5VU0VEKGludmFsaWRWYWx1ZXMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIHVzaW5nIFRTdG9yYWdlID0gdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxURmllbGQ+Ojp0eXBlOworCisgICAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IEMyVmFsdWVzLiBDMlZhbHVlOjpQcmltaXRpdmUgbmVlZHMgdG8KKyAgICAvLyBiZSB0cmFuc2Zvcm1lZCB0byBhIHByaW1pdGl2ZSB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBpcyBvbmUgdG8gZG8gdGhhdC4KKyAgICBhdXRvIHByaW0yVmFsdWUgPSBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnByaW0pIC0+IFRGaWVsZCB7CisgICAgICAgIHJldHVybiAoVEZpZWxkKXByaW0ucmVmPFRTdG9yYWdlPigpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgaW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCB1aW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGZsb2F0Pjo6dmFsdWUsICJJbnZhbGlkIFRGaWVsZCB0eXBlLiIpOworICAgIH07CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB2YWxpZFZhbHVlSW5mb3MgaXMgb25lLgorICAgIGNvbnN0IGF1dG8gJmMyRlNWID0gdmFsaWRWYWx1ZUluZm9zOworCisgICAgc3dpdGNoIChjMkZTVi50eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkVNUFRZOiB7CisgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoMCkpOworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IFNob3VsZCBvdGhlciBpbnZhbGlkIHZhbHVlcyBiZSB0ZXN0ZWQ/CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6UkFOR0U6IHsKKyAgICAgICAgY29uc3QgYXV0byAmcmFuZ2UgPSBjMkZTVi5yYW5nZTsKKyAgICAgICAgYXV0byBybWluID0gcHJpbTJWYWx1ZShyYW5nZS5taW4pOworICAgICAgICBhdXRvIHJtYXggPSBwcmltMlZhbHVlKHJhbmdlLm1heCk7CisgICAgICAgIGF1dG8gcnN0ZXAgPSBwcmltMlZhbHVlKHJhbmdlLnN0ZXApOworCisgICAgICAgIEFTU0VSVF9MRShybWluLCBybWF4KTsKKworICAgICAgICBpZiAocnN0ZXAgIT0gMCkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgbGluZWFyCisgICAgICAgICAgICBmb3IgKGF1dG8gdiA9IHJtaW47IHYgPD0gcm1heDsgdiA9IFRGaWVsZCh2ICsgcnN0ZXApKSB7CisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdGVwID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgdHdvIGNhc2VzLCBleGNlcHQgbGluZWFyIGNhc2UuCisgICAgICAgICAgICAvLyAxLiBpbnRlZ2VyIGdlb21ldHJpYyBjYXNlCisgICAgICAgICAgICAvLyAyLiBmbG9hdCBnZW9tZXRyaWMgY2FzZQorCisgICAgICAgICAgICBhdXRvIG51bSA9IHByaW0yVmFsdWUocmFuZ2UubnVtKTsKKyAgICAgICAgICAgIGF1dG8gZGVub20gPSBwcmltMlZhbHVlKHJhbmdlLmRlbm9tKTsKKworICAgICAgICAgICAgLy8gSWYgYm90aCByYW5nZS5udW0gYW5kIHJhbmdlLmRlbm9tIGFyZSAxIGFuZCBzdGVwIGlzIDAsIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIFZBTFVFUywgc2hvdWxkbid0IHdlPworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG51bSA9PSAxICYmIGRlbm9tID09IDEpOworCisgICAgICAgICAgICAvLyAobnVtIC8gZGVub20pIGlzIG5vdCBsZXNzIHRoYW4gMS4KKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShkZW5vbSA9PSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9MRShkZW5vbSwgbnVtKTsKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKiBudW0gLyBkZW5vbSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm1pbiA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtaW4gLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1heCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtYXggKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdCgxKSAtIHZhbGlkVmFsdWVzLT5hdCgwKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KDApICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gdmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlZBTFVFUzogeworICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSA6IGMyRlNWLnZhbHVlcykgeworICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhwcmltMlZhbHVlKHByaW0pKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG1pbnYgPSAqc3RkOjptaW5fZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgYXV0byBtYXh2ID0gKnN0ZDo6bWF4X2VsZW1lbnQodmFsaWRWYWx1ZXMtPmJlZ2luKCksIHZhbGlkVmFsdWVzLT5lbmQoKSk7CisgICAgICAgIGlmIChtaW52IC0gMSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWludiAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4diArIDEgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKG1heHYgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpGTEFHUzogeworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IEltcGxlbWVudCB0aGUgY2FzZSB0aGF0IHBhcmFtLnR5cGUgaXMgRkxBR1MuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnUmVhZE9ubHlQYXJhbShuZXdQYXJhbSkpOworICAgIC8vIFBhcmFtZXRlciB2YWx1ZSBtdXN0IG5vdCBiZSBjaGFuZ2VkCisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQocHJlUGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFdyaXRhYmxlUGFyYW0oCisgICAgICAgIFRQYXJhbSAqY29uc3QgcGFyYW0sIFRSZWFsRmllbGQgKmNvbnN0IHdyaXRhYmxlRmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RDb25maWc7CisKKyAgICAvLyBHZXQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIHRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHZhbHVlIGF0IHRoZSBlbmQuCisgICAgVFJBQ0VEX0ZBSUxVUkUoZ2V0VmFsdWUocGFyYW0pKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBkZWZhdWx0UGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAvLyBUZXN0IHZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogdmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gcHJlUGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAgICAgLy8gUGFyYW0gaXMgdHJ5IHRvIGJlIGNoYW5nZWQKKyAgICAgICAgKndyaXRhYmxlRmllbGQgPSB2YWw7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKCpwYXJhbSwgJnN0Q29uZmlnKSk7CisgICAgICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnBhcmFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJhbSBpcyB1bmNoYW5nZWQgYmVjYXVzZSBhIGZpZWxkIHZhbHVlIGNvbmZsaWN0cyB3aXRoIG90aGVyIGZpZWxkIG9yIHBhcmFtZXRlci4KKyAgICAgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwcmVQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGluIG9yZGVyIHRvIHRlc3QgfHBhcmFtfCBpcyB1bmNoYW5nZWQKKyAgICAvLyBhZnRlciB0cnlpbmcgdG8gd3JpdGUgYW4gaW52YWxpZCB2YWx1ZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBsYXN0VmFsaWRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgaW52YWxpZCB2YWx1ZXMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbCA6IGludmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgLy8gUGFyYW0gaXMgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZSgqcGFyYW0pKTsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKmxhc3RWYWxpZFBhcmFtKSk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBwYXJhbWV0ZXIgYnkgY29uZmlnKCkuCisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKmRlZmF1bHRQYXJhbSwgJnN0Q29uZmlnKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVVuc3VwcG9ydGVkUGFyYW08VD4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0U3VwcG9ydGVkUGFyYW0oKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlTdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKworYm9vbCBpc1N1cHBvcnRlZFBhcmFtKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnNQYXJhbXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBkIDogc1BhcmFtcykgeworICAgICAgICBpZiAocGFyYW0udHlwZSgpID09IHBkLT5pbmRleCgpLnR5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgIGludCAqY29uc3QgcmVzdWx0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKworICAgIGlmICghaXNTdXBwb3J0ZWRQYXJhbSgqcGFyYW0sIHN1cHBvcnRlZFBhcmFtcykpIHsKKyAgICAgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLCBpdCBqdXN0IGZpbmlzaCBhZnRlciBjYWxsaW5nIHRlc3RVbnN1cHBvcnRlZFBhcmFtKCkuCisgICAgICAgIHRlc3RVbnN1cHBvcnRlZFBhcmFtPFQ+KCk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlVOU1VQUE9SVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGVzdFN1cHBvcnRlZFBhcmFtPFQ+KCk7CisKKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbS5nZXQoKSkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBDb25maWcgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXIsIGJlY2F1c2UgcGFyYW0gaXMgdGhlIHByZXNlbnQgcGFyYW0uCisgICAgLy8gVGhpcyBjb25maWcgaXMgZXhlY3V0ZWQgdG8gZmluZCBvdXQgaWYgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlLgorICAgIGMyX3N0YXR1c190IHN0U3RhY2sgPSBjb25maWcocGFyYW0uZ2V0KCksICZmYWlsdXJlcyk7CisgICAgaWYgKHN0U3RhY2sgPT0gQzJfQkFEX1ZBTFVFKSB7CisgICAgICAgIC8vIFJlYWQtb25seQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gbmV3UGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAgICAgdGVzdFJlYWRPbmx5UGFyYW0oKnBhcmFtLCAqbmV3UGFyYW0pOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpSRUFET05MWTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0YWJsZQorICAgICAgICBFWFBFQ1RfRVEoc3RTdGFjaywgQzJfT0spOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpXUklUQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQzJDb21wSW50ZlRlc3Q6Om91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFyYW1zWzNdOworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdEluZm8gOiBtUGFyYW1SZXN1bHRzKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0ZXN0SW5mby5yZXN1bHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKDAgPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSAyKTsKKyAgICAgICAgcGFyYW1zW3Jlc3VsdF0uZW1wbGFjZV9iYWNrKHRlc3RJbmZvLm5hbWUpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpyZXN1bHRTdHJpbmdbXSA9IHsiV3JpdGFibGUiLCAiUmVhZC1Pbmx5IiwgIlVuc3VwcG9ydGVkIn07CisgICAgcHJpbnRmKCJcbi0tLS1URVNUIFJFU1VMVFMgKCVzKS0tLS1cblxuIiwgbmFtZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBwcmludGYoIlsgJXMgXVxuIiwgcmVzdWx0U3RyaW5nW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogcGFyYW1zW2ldKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCB0LmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGZpZWxkX25hbWVfKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW1fPiBwYXJhbSA9IG1ha2VQYXJhbTxUUGFyYW1fPigpOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gdmFsaWRWYWx1ZUluZm9zID0geyAgICBcCisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChwYXJhbS5nZXQoKSwgJmZpZWxkX3R5cGVfbmFtZV86OmZpZWxkX25hbWVfKSkgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHZhbGlkVmFsdWVJbmZvcywgQzJfRE9OVF9CTE9DSykpOyAgICAgXAorICAgICAgICBBU1NFUlRfRVEoMXUsIHZhbGlkVmFsdWVJbmZvcy5zaXplKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiB2YWxpZFZhbHVlczsgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiBpbnZhbGlkVmFsdWVzOyAgICAgICAgXAorICAgICAgICBnZXRUZXN0VmFsdWVzKHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXMsICZ2YWxpZFZhbHVlcywgJmludmFsaWRWYWx1ZXMpOyAgIFwKKyAgICAgICAgdGVzdFdyaXRhYmxlUGFyYW0ocGFyYW0uZ2V0KCksICZwYXJhbS0+ZmllbGRfbmFtZV8sIHZhbGlkVmFsdWVzLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB3aWR0aCk7ICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBoZWlnaHQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX1UzMl9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKyNkZWZpbmUgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgIFwKKyAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlKQorCisvLyBUT0RPKGhpcm9oKTogU3VwcG9ydCBwYXJhbWV0ZXJzIGJhc2VkIG9uIGNoYXJbXSBhbmQgdWludDMyX3RbXS4KKy8vI2RlZmluZSBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIG0udmFsdWUpCisvLyNkZWZpbmUgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRChUcGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIHVpbnQzMl90W10sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlcykKKworI2RlZmluZSBFQUNIX1RFU1QoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdGVzdF9uYW1lKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHJlc3VsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGhpcy0+bUN1cnJlbnRQYXJhbU5hbWUgPSAjVFBhcmFtXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hlY2tQYXJhbVBlcm1pc3Npb248VFBhcmFtXz4oJnJlc3VsdCwgc3VwcG9ydGVkUGFyYW1zKTsgICAgICAgICAgXAorICAgICAgaWYgKHJlc3VsdCA9PSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRlc3RfbmFtZShUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbVBhcmFtUmVzdWx0cy5lbXBsYWNlX2JhY2soI1RQYXJhbV8sIHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFQUNIX1RFU1RfU0VMRih0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV8sIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9JTlBVVCh0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV86OmlucHV0LCB0eXBlXywgdGVzdF9uYW1lKQorI2RlZmluZSBFQUNIX1RFU1RfT1VUUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6b3V0cHV0LCB0eXBlXywgdGVzdF9uYW1lKQordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpIHsKKyAgICBzZXRDb21wb25lbnQoaW50Zik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBzdXBwb3J0ZWRQYXJhbXM7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnN1cHBvcnRlZFBhcmFtcykpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRBY3R1YWxEZWxheVR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudFR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluU2V0dGluZywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBvdXRwdXRSZXN1bHRzKGNvbXBvbmVudE5hbWUpOworICAgIHJlc2V0UmVzdWx0cygpOworfQorCitURVNUX0YoQzJDb21wSW50ZlRlc3QsIEMyVjRMMkNvZGVjSW50ZikgeworCisgICAgLy8gUmVhZCBhIHNoYXJlZCBvYmplY3QgbGlicmFyeS4KKyAgICB2b2lkKiBjb21wTGliID0gZGxvcGVuKCJzeXN0ZW0vbGliL2xpYnY0bDJfY29kZWMyLnNvIiwgUlRMRF9OT1cpOworCisgICAgaWYgKCFjb21wTGliKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gbGlicmFyeTogJXMuXG4iLCBkbGVycm9yKCkpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyQ29tcG9uZW50U3RvcmUqIGNyZWF0ZV90KCk7CisgICAgY3JlYXRlX3QqIGNyZWF0ZV9zdG9yZT0gKGNyZWF0ZV90KikgZGxzeW0oY29tcExpYiwgImNyZWF0ZV9zdG9yZSIpOworICAgIGNvbnN0IGNoYXIqIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBjcmVhdGU6ICVzLlxuIiwgZGxzeW1fZXJyb3IpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHZvaWQgZGVzdHJveV90KEMyQ29tcG9uZW50U3RvcmUqKTsKKyAgICBkZXN0cm95X3QqIGRlc3Ryb3lfc3RvcmUgPSAoZGVzdHJveV90KikgZGxzeW0oY29tcExpYiwgImRlc3Ryb3lfc3RvcmUiKTsKKyAgICBkbHN5bV9lcnJvciA9IGRsZXJyb3IoKTsKKyAgICBpZiAoZGxzeW1fZXJyb3IpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbG9hZCBzeW1ib2wgZGVzdHJveTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZShjcmVhdGVfc3RvcmUoKSwgZGVzdHJveV9zdG9yZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wb25lbnRJbnRmOworICAgIGNvbXBvbmVudFN0b3JlLT5jcmVhdGVJbnRlcmZhY2UoInY0bDIuZGVjb2RlciIsICZjb21wb25lbnRJbnRmKTsKKyAgICBhdXRvIGNvbXBvbmVudE5hbWUgPSAiQzJWNEwyQ29kZWMiOworICAgIHRlc3RNYWluKGNvbXBvbmVudEludGYsIGNvbXBvbmVudE5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQYXJhbV90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCit2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmaWQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgICpvcyA8PCAiQCIgPDwgaWQuX21PZmZzZXQgPDwgIisiIDw8IGlkLl9tU2l6ZTsKK30KKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiOworICAgIFByaW50VG8oZmQuX21GaWVsZElkLCBvcyk7CisgICAgKm9zIDw8ICIqIiA8PCBmZC5leHRlbnQoKSA8PCAiKSI7Cit9CisKK2VudW0gQzJQYXJhbUluZGV4VHlwZSA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAga1BhcmFtSW5kZXhOdW1iZXIsCisgICAga1BhcmFtSW5kZXhOdW1iZXJzLAorICAgIGtQYXJhbUluZGV4TnVtYmVyMiwKKyAgICBrUGFyYW1JbmRleFZlbmRvclN0YXJ0ID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCisgICAga1BhcmFtSW5kZXhWZW5kb3JOdW1iZXJzLAorfTsKKwordm9pZCBmZmZmKGludCgqKShpbnQpKSB7fQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVFJVQ1QgREVDTEFSQVRJT04gQU5EIERFU0NSSVBUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3R5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3IgRkQ7CisKK2NsYXNzIEMyUGFyYW1UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitjbGFzcyBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdAorICAgICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PiB7Cit9OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0QSwKKyAgICBrUGFyYW1JbmRleFRlc3RCLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTMzIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemUsCit9OworCitzdHJ1Y3QgQzJTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFNpemUgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgorICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Cit9OworCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCisKKy8vIFRlc3QgMS4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYW55IGhlbHBlciBtZXRob2RzCisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIHsKKyAgICByZXR1cm4gYS50eXBlKCkgPT0gYi50eXBlKCkKKyAgICAgICAgICAgICYmIGEuZXh0ZW50KCkgPT0gYi5leHRlbnQoKQorICAgICAgICAgICAgJiYgYS5uYW1lKCkgPT0gYi5uYW1lKCkKKyAgICAgICAgICAgICYmIGEuX21GaWVsZElkID09IGIuX21GaWVsZElkOworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0EgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0EgX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUID0KKyAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCisgICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAorICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKKyAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCisgICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAorICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCisgICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OworCitURVNUX1AoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBHZXRQYXJhbSgpLCBleHBlY3RlZCA9IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVDsKKworICAgIC8vIHZlcmlmeSBmaXJzdCBmaWVsZCBkZXNjcmlwdG9yCisgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzWzBdLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJzMzIiLCBmaWVsZHNbMF0ubmFtZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzWzBdLmV4dGVudCgpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgZmllbGRzWzBdLl9tRmllbGRJZCk7CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMF0sIGZpZWxkc1swXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzFdLCBmaWVsZHNbMV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFsyXSwgZmllbGRzWzJdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbM10sIGZpZWxkc1szXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzRdLCBmaWVsZHNbNF0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs1XSwgZmllbGRzWzVdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNl0sIGZpZWxkc1s2XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzddLCBmaWVsZHNbN10pOworICAgIGZvciAoc2l6ZV90IGkgPSA4OyBpIDwgZmllbGRzLnNpemUoKSAmJiBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBmaWVsZHNbaV0pOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5pdGlhbGl6ZXJMaXN0LCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUKSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgcG9pbnRlciBjb25zdHJ1Y3RvcgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5mcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCkpOworCisvLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIG1lbWJlci1wb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVtYmVyUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QpKTsKKworLy8gVGVzdCAyLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCB0d28tc3RlcCBoZWxwZXIgbWV0aG9kcworCitzdHJ1Y3QgQzJUZXN0QVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBERUZJTkVfQzJTVFJVQ1QoVGVzdEEpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RBLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChzaWduZWQ2NCwgInM2NCIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDMyLCAidTMyIikKKyAgICBDMkZJRUxEKHVuc2lnbmVkNjQsICJ1NjQiKQorICAgIEMyRklFTEQoZnAzMiwgImZwIikKKyAgICBDMkZJRUxEKHN6LCAic2l6ZSIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChzdHJpbmcsICJzdHIiKQorICAgIC8vIEMyRklFTEQoeWVzTm8sICJ5LW4iKQorfSkgLy8gOyBvcHRpb25hbAorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDJTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QVN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCAzLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBvbmUtc3RlcCBoZWxwZXIgbWV0aG9kCisKK3N0cnVjdCBDMlRlc3RCU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEIpCisKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDFTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QlN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCA0LiBmbGV4aWJsZSBtZW1iZXJzCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyB0eXBlX3Q9RkQ6OnR5cGVfdDsKKworICAgIC8vIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICAgICAgICAgIEdldExpc3RzKCk7CisKKyAgICBjb25zdGV4cHIgc3RhdGljIHR5cGVfdCBGbGV4VHlwZSA9CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlID8gRkQ6OklOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6SU5UNjQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgPyBGRDo6VUlOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlID8gRkQ6OlVJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSA/IEZEOjpGTE9BVCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlID8gRkQ6OkJMT0IgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IEZEOjpTVFJJTkcgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIEMyU2l6ZVN0cnVjdD46OnZhbHVlID8gQzJTaXplU3RydWN0OjpUWVBFIDogKHR5cGVfdCkwOworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IEZMRVhfU0laRSA9IHNpemVvZihUKTsKK307CisKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxpbnQzMl90LCBpbnQ2NF90LCBDMlNpemVTdHJ1Y3Q+IEZsZXhUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIEZsZXhUeXBlcyk7CisKK1RZUEVEX1RFU1QoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKKyAgICBmb3IgKGF1dG8gYSA6IHRoaXMtPkdldExpc3RzKCkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGE7CisgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDAsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzBdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzMyIHsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXgsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzMyIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgMCwgNCB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50MzJfdCBtRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4RW5kLCBGTEVYX1NJWkUgPSA0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDMyX3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDQsIDQgfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCA9IHsKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPnNpZ25lZDMyLCAiczMyIiksCisgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5tRmxleCwgImZsZXgiKSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4UzMyU3RydWN0IHsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTMzIsIG1GbGV4U2lnbmVkMzIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgbUZsZXhTaWduZWQzMikKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50MzJfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0LAorICAgICAgICBDMlRlc3RGbGV4UzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzY0IHsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCAwLCA4IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1TaWduZWQ2NEZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50NjRfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgNCwgOCB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzY0LCBtRmxleFNpZ25lZDY0KQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgbUZsZXhTaWduZWQ2NCkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50NjRfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4UzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSB7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDAsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1TaXplRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCA0LCBzaXplb2YoQzJTaXplU3RydWN0KSB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTaXplU3RydWN0IHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4U2l6ZSwgbUZsZXhTaXplKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplMiwgbUZsZXhTaXplKQorICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxDMlNpemVTdHJ1Y3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGaWVsZElkKSB7CisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKworICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IgaW4gQzJQYXJhbQorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0uc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSopMCktPm0ubUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOworCisgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tRmxleFNpemUpKTsKKworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U6Om0ubUZsZXhTaXplKSk7CisKKworfQorCitzdHJ1Y3QgUzMyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgUzMyKGNvbnN0IFQqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgIH0KK307CisKK3N0cnVjdCBGTFggeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBGTFgoY29uc3QgVCosIGNvbnN0IFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxUPjo6dmFsdWUgPT0gMCwgInNob3VsZCBiZSBhbiBhcnJheSBvZiAwIGV4dGVudCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBVPjo6dmFsdWUsICJzaG91bGQgYmUgdHlwZSBVIik7CisgICAgfQorfTsKKworc3RydWN0IE1QIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFeHBlY3RlZFUsIHR5cGVuYW1lIFVuZXhwZWN0ZWRVPgorICAgIGlubGluZSBNUChUIFU6OiosIGNvbnN0IEV4cGVjdGVkVSosIGNvbnN0IFVuZXhwZWN0ZWRVKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VSwgVW5leHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGJhc2UgdHlwZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxVLCBFeHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgZGVyaXZlZCB0eXBlIik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4KKyAgICBpbmxpbmUgTVAoVCBEOjoqLCBjb25zdCBEKikgeyB9Cit9OworCit2b2lkIGNvbXBpbGVkU3RhdGljX2FycmF5VHlwZVByb3BhZ2F0aW9uVGVzdCgpIHsKKyAgICAodm9pZClTMzIoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5zaWduZWQzMik7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4UzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgLy8gVFJJQ0tZOiAmZGVyaXZlZENsYXNzOjpiYXNlTWVtYmVyIGhhcyB0eXBlIG9mIGJhc2VDbGFzczo6KgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpLCBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6Oio+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYXNlIG1lbWJlciBwb2ludGVyIHNob3VsZCBoYXZlIGJhc2UgY2xhc3MgaW4gdHlwZSIpOworCisgICAgLy8gdGhlcmVmb3JlLCBtZW1iZXIgcG9pbnRlciBleHBhbmRzIHRvIGJhc2VDbGFzczo6KiBpbiB0ZW1wbGF0ZXMKKyAgICAodm9pZClNUCgmQzJUZXN0QUluZm86OnNpZ25lZDMyLAorICAgICAgICAgICAgIChDMlRlc3RBU3RydWN0KikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QUluZm8qKTAgLyogdW5leHBlY3RlZCAqLyk7CisgICAgLy8gYnV0IGNhbiBiZSBjYXN0IHRvIGRlcml2ZWRDbGFzczo6KgorICAgICh2b2lkKU1QKChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFJbmZvKikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QVN0cnVjdCopMCAvKiB1bmV4cGVjdGVkICovKTsKKworICAgIC8vIFRSSUNLWTogYmFzZUNsYXNzOjoqIGRvZXMgbm90IGF1dG9jb252ZXJ0IHRvIGRlcml2ZWRDbGFzczo6KiBldmVuIGluIHRlbXBsYXRlcworICAgIC8vICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsIChDMlRlc3RBSW5mbyopMCk7Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgTWVtYmVyUG9pbnRlckNhc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0QUluZm8sIHNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KiBzMzJwdHIgPSAmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9kZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KikmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9jYXN0MmRlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBSW5mbzo6KilzMzJwdHI7CisgICAgQzJUZXN0QUluZm8gKmluZm8gPSAoQzJUZXN0QUluZm8gKikyNTY7CisgICAgQzJUZXN0QVN0cnVjdCAqc3RydWt0ID0gKEMyVGVzdEFTdHJ1Y3QgKilpbmZvOworICAgIGludDMyX3QgKmluZm9fczMyX2Rlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzJfY2FzdDJkZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Nhc3QyZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzIgPSAmKGluZm8tPipzMzJwdHIpOworICAgIGludDMyX3QgKnN0cnVrdF9zMzIgPSAmKHN0cnVrdC0+KnMzMnB0cik7CisKKyAgICBFWFBFQ1RfRVEoMjU2dSwgKHVpbnRwdHJfdClpbmZvKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3QpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Rlcml2ZWQpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Nhc3QyZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzIpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdF9zMzIpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5zaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSwgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBBUkFNIFVTQUdFIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IEMyTnVtYmVyU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJTdHJ1Y3QoKSB7fQorICAgIEMyTnVtYmVyU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE51bWJlcikKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyQmFzZVN0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyOworICAgIEMyTnVtYmVyQmFzZVN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoTnVtYmVyQmFzZSkKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoTnVtYmVycywgbU51bWJlcnMpCisgICAgQzJGSUVMRChtTnVtYmVycywgIm51bWJlcnMiKQorfTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgIkMyTnVtYmVyc1N0cnVjdCBoYXMgaW5jb3JyZWN0IHNpemUiKTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVySW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJUdW5pbmc7Cit0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclBvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclN0cmVhbVR1bmluZzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1R1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNQb3J0VHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1N0cmVhbVR1bmluZzsKKworLy8KKyNpZiAwCisKK3ZvaWQgdGVzdCgpIHsKKyAgICBDMk51bWJlclN0cnVjdCBzKDEwKTsKKyAgICAodm9pZClDMk51bWJlclN0cnVjdDo6RmllbGRMaXN0KCk7Cit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXJCPiBDMk51bWJlckNvbmZpZzQ7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMk51bWJlckNvbmZpZzM7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMlZpZGVvTmFtZUNvbmZpZzsKKwordm9pZCB0ZXN0MygpIHsKKyAgICBDMk51bWJlckNvbmZpZzMgcygxMCk7CisgICAgcy52YWx1ZSA9IDExOworICAgIHMgPSAxMjsKKyAgICAodm9pZClDMk51bWJlckNvbmZpZzM6OkZpZWxkTGlzdCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvTmFtZUNvbmZpZz4gbiA9IEMyVmlkZW9OYW1lQ29uZmlnOjpBbGxvY1NoYXJlZCgyNSk7CisgICAgc3RyY3B5KG4tPm0udmFsdWUsICJsYWpvcyIpOworICAgIEMyTnVtYmVyQ29uZmlnNCB0KGZhbHNlLCAwLCAxMSk7CisgICAgdC52YWx1ZSA9IDE1OworfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIGVudW0geyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhOdW1iZXIgfTsKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIEZMRVgoQzJOdW1iZXJzU3RydWN0LCBtTnVtYmVycyk7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJ5ZXMiKTsKKworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc0luZm87CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpfRklFTERfTElTVCA9CisvLyAgICB7IHsgRkQ6OklOVDMyLCAwLCAid2lkdGhzIiB9IH07CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMk51bWJlcnNTdHJ1Y3QqKShudWxscHRyKSktPm1OdW1iZXJzLCAibnVtYmVyIikgfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyQ29uZmlnOworCitzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbXlMaXN0ID0gQzJOdW1iZXJDb25maWc6OkZpZWxkTGlzdCgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBfX3Rlc3RfZGVzY3JpYmUodWludDMyX3QgcGFyYW1UeXBlKSB7CisgICAgICAgIHN0ZDo6bGlzdDxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpYmVDMlBhcmFtczxDMk51bWJlckNvbmZpZz4oKTsKKworICAgICAgICBhdXRvIHdpZHRocyA9IEMyTnVtYmVyc0luZm86OkFsbG9jU2hhcmVkKDUpOworICAgICAgICB3aWR0aHMtPmZsZXhDb3VudCgpOworICAgICAgICB3aWR0aHMtPm0ubU51bWJlcnNbNF0gPSAxOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgdGVzdDMoKTsKKworICAgICAgICBDMk51bWJlckNvbmZpZyBvdXRwdXRXaWR0aChmYWxzZSwgMTIzKTsKKworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleChwYXJhbVR5cGUpOworICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZSkgeworICAgICAgICBjYXNlIEMyTnVtYmVyQ29uZmlnOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4obmV3IEMyUGFyYW1EZXNjcmlwdG9yeworICAgICAgICAgICAgICAgIHRydWUgLyogaXNSZXF1aXJlZCAqLywKKyAgICAgICAgICAgICAgICAibnVtYmVyIiwKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2FuU2V0UG9ydChUICZvLCBib29sIG91dHB1dCkgeyByZXR1cm4gby5zZXRQb3J0KG91dHB1dCk7IH0KK2Jvb2wgY2FuU2V0UG9ydCguLi4pIHsgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKCgoUyopMCktPnNldFBvcnQodHJ1ZSkpPgorc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9jYW5DYWxsU2V0UG9ydChpbnQpOwordGVtcGxhdGU8dHlwZW5hbWU+CitzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9jYW5DYWxsU2V0UG9ydCguLi4pOworI2RlZmluZSBjYW5DYWxsU2V0UG9ydCh4KSBkZWNsdHlwZShfY2FuQ2FsbFNldFBvcnQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKHgpPjo6dHlwZT4oMCkpOjp2YWx1ZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8aW50Pjo6dmFsdWUsICJpbnQgaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8dm9pZD46OnZhbHVlLCAidm9pZCBpcyBjb21wYXJhYmxlIik7CisKK3N0cnVjdCBDMl9ISURFIF90ZXN0MCB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MCYpOworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDAmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDEgeworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDEmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDIgeworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDImKTsKK307CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QwPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGFuZCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MT46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0Mj46OnZhbHVlLCAiY2xhc3Mgd2l0aCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQzJQQVJBTSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRnJvbUJhc2VUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRmxleFRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCk7Cit9OworCisvLyBURVNUX0YoX0MyUGFyYW1JbnNwZWN0b3IsIFN0YXRpY1Rlc3QpIHsKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY1Rlc3QoKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJOdW1iZXJTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk51bWJlclR1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSA9PSAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0Zyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDMxMDIgfTsKKyAgICB0eXBlZGVmIEMyTnVtYmVyQmFzZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTZXR0aW5nOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0U2V0dGluZzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtU2V0dGluZzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk15U2V0dGluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4VGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlcnNTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyc1R1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3RlbXBsYXRlPGJvb2wsIHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmcgeyB9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCAuLi5OPgorc3RydWN0IF9wcmludF9hc193YXJuaW5nPHRydWUsIE4uLi4+IDogc3RkOjp0cnVlX3R5cGUgeyB9OworCisjZGVmaW5lIHN0YXRpY19hc3NlcnRfZXF1YWxzKGEsIGIsIG1zZykgXAorc3RhdGljX2Fzc2VydChfcHJpbnRfYXNfd2FybmluZzwoYSkgPT0gKGIpLCBhLCBiPjo6dmFsdWUsIG1zZykKKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleEZyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDEyMDMgfTsKKyAgICB0eXBlZGVmIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlJbmZvOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0SW5mbzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtSW5mbzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlJbmZvOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpDT1JFX0lOREVYLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0X2VxdWFscyhDMk15SW5mbzo6UEFSQU1fVFlQRSwgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0SW5mbzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0SW5mbzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0SW5mbzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtSW5mbzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1JbmZvOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbUluZm86Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbU9wc1Rlc3QpIHsKKyAgICBjb25zdCBDMk51bWJlclN0cnVjdCBzdHIoMTAwKTsKKyAgICBDMk51bWJlclN0cnVjdCBic3RyOworCisgICAgeworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHIubU51bWJlcik7CisgICAgICAgIGJzdHIubU51bWJlciA9IDEwMDsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyVHVuaW5nIHR1bigxMDApOworICAgIEMyTnVtYmVyVHVuaW5nIGJ0dW47CisKKyAgICB7CisgICAgICBDMk51bWJlckluZm8gaW5mKDEwMCk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKworICAgICAgRVhQRUNUX0VRKHR1bi5jb3JlSW5kZXgoKSwgaW5mLmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4uY29yZUluZGV4KCksIHR1bl8tPmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCBpbmYudHlwZSgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCB0dW5fLT50eXBlKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IHR1biwgYnR1biB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZQorICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuID09IGJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLm9wZXJhdG9yPT0oYnR1bikpOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4gIT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi5vcGVyYXRvciE9KGJ0dW4pKTsKKyAgICAgICAgYnR1bi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEodHVuLCBidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnR5cGUoKSwgQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZ0dW4pLCAmdHVuKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGJ0dW4pKSwgYnR1bik7CisgICAgICAgIGJ0dW4uaW52YWxpZGF0ZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoQzJQYXJhbTo6Q29weShidHVuKSk7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nIG91dHAxKHRydWUsIDEwMCksIGlucDEoZmFsc2UsIDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nIGJvdXRwMSwgYmlucDEsIGJpbnAzKGZhbHNlLCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgaW5wMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgYmlucDI7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgb3V0cDIoMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBib3V0cDI7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShib3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGlucDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHAyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworCisgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBpbnAyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgb3V0cDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIG91dHAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgYmlucDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0cDEudHlwZSgpLCBib3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEsIGJvdXRwMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0cDEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gaW5wMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IG91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDEgPT0gYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDIgIT0gYm91dHAyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7CisgICAgICAgIGJpbnAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiAhPSBiaW5wMik7CisgICAgICAgIGJpbnAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDIgPT0gYmlucDIpOworCisgICAgICAgIGJpbnAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7CisgICAgICAgIGJvdXRwMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCFib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyICE9IGJvdXRwMik7CisgICAgICAgIGJvdXRwMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiA9PSBib3V0cDIpOworCisgICAgICAgIGJvdXRwMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYm91dHAxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAxKSwgJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMSksICZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJm91dHAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCopJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksICZpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQqKSZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCAmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5wMSkpLCBpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAyKSksIGlucDIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAxKSksIG91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRwMikpLCBvdXRwMik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmcgb3V0czEodHJ1ZSwgMXUsIDEwMCksIGluczEoZmFsc2UsIDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nIGJvdXRzMSwgYmluczEsIGJpbnMzKGZhbHNlLCAxdSwgMTAwKTsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgaW5zMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgYmluczI7CisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBvdXRzMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGJvdXRzMjsKKworICAgIEVYUEVDVF9FUShpbnMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGJpbnMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgb3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBib3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIG91dHMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgYmluczEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0czEudHlwZSgpLCBib3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEsIGJvdXRzMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0czEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5zMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLnN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHMxIH0gKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5zMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLm1OdW1iZXIpOworCisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czIuc3RyZWFtKCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGluczIpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBvdXRzMik7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMxID09IGJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMyICE9IGJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7CisgICAgICAgIGJpbnMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgPT0gYmluczIpOworCisgICAgICAgIGJpbnMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7CisgICAgICAgIGJvdXRzMi5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiA9PSBib3V0czIpOworCisgICAgICAgIGJvdXRzMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYm91dHMxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMxKSwgJmluczEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMSksICZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZvdXRzMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KikmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCAmaW5zMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Kikmb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCAmb3V0czIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5zMSkpLCBpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMyKSksIGluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMxKSksIG91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRzMikpLCBvdXRzMik7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwgMTAwIH07CisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUocDEsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RhdGljVGVzdEFkZENvcmVJbmRleCgpIHsKKyAgICBzdHJ1Y3Qgbm9iYXNlIHt9OworICAgIHN0cnVjdCBiYXNlIHsgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IDEgfTsgfTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9DMkFkZENvcmVJbmRleDxub2Jhc2UsIDI+OjpDT1JFX0lOREVYID09IDIsICJzaG91bGQgYmUgMiIpOworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PGJhc2UsIDE+OjpDT1JFX0lOREVYID09IDEsICJzaG91bGQgYmUgMSIpOworfQorCitjbGFzcyBUZXN0RmxleEhlbHBlciB7CisgICAgc3RydWN0IF9GbGV4IHsKKyAgICAgICAgaW50MzJfdCBhOworICAgICAgICBjaGFyIGJbXTsKKyAgICAgICAgX0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9GbGV4LCBiKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Cb0ZsZXggeworICAgICAgICBfRmxleCBhOworICAgICAgICBfQm9GbGV4KCkge30KKyAgICAgICAgRkxFWChfQm9GbGV4LCBhKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Ob25GbGV4IHsKKyAgICB9OworCisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCkgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXI+OjpGbGV4VHlwZSwgdm9pZD46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyW10+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0JvRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoX0MyRmxleGlibGU8X0ZsZXg+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbGV4aWJsZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFfQzJGbGV4aWJsZTxfTm9uRmxleD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBmbGV4aWJsZSIpOworICAgIH0KK307CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgRmxleFBhcmFtT3BzVGVzdCkgeworLy8gICAgY29uc3QgQzJOdW1iZXJzU3RydWN0IHN0cnsxMDB9OworICAgIEMyTnVtYmVyc1N0cnVjdCBic3RyOworICAgIHsKKy8vICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHItPm0ubU51bWJlcnNbMF0pOworICAgICAgICAodm9pZCkmYnN0ci5tTnVtYmVyc1swXTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKyAgICB0dW5fLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNUdW5pbmc+IHR1biA9IHN0ZDo6bW92ZSh0dW5fKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzVHVuaW5nPiBidHVuID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1NoYXJlZCgxKTsKKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNUdW5pbmcgKlRbXSA9IHsgdHVuLmdldCgpLCBidHVuLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogVCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCp0dW4gPT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLT5vcGVyYXRvcj09KCpidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCp0dW4gIT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4tPm9wZXJhdG9yIT0oKmJ0dW4pKTsKKyAgICAgICAgYnR1bi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX0VRKCp0dW4sICpidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi0+dHlwZSgpLCBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCB0dW4uZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKnR1bikpLCAqdHVuKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDFfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jVW5pcXVlKDEsIHRydWUpKSwKKyAgICAgICAgICAgIGlucDFfID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UpOworICAgIG91dHAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBpbnAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDEgPSBzdGQ6Om1vdmUob3V0cDFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gaW5wMSA9IHN0ZDo6bW92ZShpbnAxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IGJvdXRwMShDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxKSksCisgICAgICAgICAgICBiaW5wMSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpLAorICAgICAgICAgICAgYmlucDMgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxLCBmYWxzZSk7CisgICAgYmlucDMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIGlucDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMiA9IHN0ZDo6bW92ZShpbnAyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBiaW5wMihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEpKTsKKyAgICBvdXRwMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDIgPSBzdGQ6Om1vdmUob3V0cDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBib3V0cDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUFtdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSwgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqUElbXSA9IHsgaW5wMi5nZXQoKSwgYmlucDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQgKlBPW10gPSB7IG91dHAyLmdldCgpLCBib3V0cDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAyW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAzW10gPSB7IGJvdXRwMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAzKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDItPm0ubU51bWJlcnNbMF0pOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICppbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpvdXRwMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMSA9PSAqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAyICE9ICpib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOworICAgICAgICBiaW5wMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgIT0gKmJpbnAyKTsKKyAgICAgICAgYmlucDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAyID09ICpiaW5wMik7CisKKyAgICAgICAgYmlucDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOworICAgICAgICBib3V0cDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiAhPSAqYm91dHAyKTsKKyAgICAgICAgYm91dHAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgPT0gKmJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBpbnAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilpbnAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBvdXRwMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKW91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQqKWlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIGlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQqKW91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAxKSksICppbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5wMikpLCAqaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAxKSksICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAyKSksICpvdXRwMik7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSwgMXUpKTsKKyAgICBvdXRzMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czEgPSBzdGQ6Om1vdmUob3V0czFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jVW5pcXVlKDEsIGZhbHNlLCAxdSkpOworICAgIGluczFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczEgPSBzdGQ6Om1vdmUoaW5zMV8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJvdXRzMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlLCAxdSkpOworICAgIGJpbnMzLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIGluczJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyID0gc3RkOjptb3ZlKGluczJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gYmluczIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIG91dHMyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyID0gc3RkOjptb3ZlKG91dHMyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBib3V0czIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlNbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCksIGJvdXRzMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCAqU0lbXSA9IHsgaW5zMi5nZXQoKSwgYmluczIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqU09bXSA9IHsgb3V0czIuZ2V0KCksIGJvdXRzMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTMltdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMyKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC0+c3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzNbXSA9IHsgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLT5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmluczIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKm91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMxID09ICpib3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczIgIT0gKmJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOworICAgICAgICBiaW5zMi0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgPT0gKmJpbnMyKTsKKworICAgICAgICBiaW5zMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKKyAgICAgICAgYm91dHMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgPT0gKmJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIGluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilpbnMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKW91dHMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KilpbnMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIGluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQqKW91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgb3V0czIuZ2V0KCkpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczEpKSwgKmluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnMyKSksICppbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czEpKSwgKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czIpKSwgKm91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50MzJWYWx1ZSBpbnQzMlZhbHVlKElOVDMyX01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDMyVmFsdWUudmFsdWUpLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UMzJfTUlOLCBpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQzMlZhbHVlIHVpbnQzMlZhbHVlKFVJTlQzMl9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50MzJWYWx1ZS52YWx1ZSksIHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQzMl9NQVgsIHVpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQzMlZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50NjRWYWx1ZSBpbnQ2NFZhbHVlKElOVDY0X01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDY0VmFsdWUudmFsdWUpLCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UNjRfTUlOLCBpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UNjQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQ2NFZhbHVlIHVpbnQ2NFZhbHVlKFVJTlQ2NF9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50NjRWYWx1ZS52YWx1ZSksIHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQ2NF9NQVgsIHVpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQ2NFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyRmxvYXRWYWx1ZSBmbG9hdFZhbHVlKDEyMy40Zik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGZsb2F0VmFsdWUudmFsdWUpLCBmbG9hdD46OnZhbHVlLCAic2hvdWxkIGJlIGZsb2F0Iik7CisgICAgICAgIEVYUEVDVF9FUSgxMjMuNGYsIGZsb2F0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZmxvYXRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpGTE9BVCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgaW5pdFZhbHVlW10gPSAiQUJDRCI7CisgICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyQmxvYlZhbHVlLCAwPiBCbG9iU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsb2JTZXR0aW5nPiBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBibG9iVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkMiLCAzKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdGV4cHIgY2hhciBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwgMD4gU3RyaW5nU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZ1NldHRpbmc+IHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDYsIGluaXRWYWx1ZSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZ1ZhbHVlLT5tLnZhbHVlKSwgY2hhcltdPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhcltdIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHN0cmluZ1ZhbHVlLT5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpTVFJJTkcsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQiIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoMTEsICJpbml0VmFsdWUiKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgImluaXRWYWx1ZVwwIiwgMTEpKTsKKyAgICAgICAgRVhQRUNUX0VRKDExdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKGluaXRWYWx1ZSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEIiwgNSkpOworICAgICAgICBFWFBFQ1RfRVEoNXUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSh7ICdBJywgJ0InLCAnQycsICdEJyB9KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDQpKTsKKyAgICAgICAgRVhQRUNUX0VRKDR1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICp2c3QgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShwMSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCB2c3QpOworICAgICAgICBpZiAodnN0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHZzdC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgdnN0LT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTZ1LCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSwgMTAxLCAxMDIgfTsKKworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDE2dSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKnZwdCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZwdCk7CisgICAgICAgIGlmICh2cHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgdnB0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAxLCB2cHQtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMiwgdnB0LT5tLm1OdW1iZXJzWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgQzJWYWx1ZVRlc3QpIHsKKyAgICBDMlZhbHVlIHZhbDsKKyAgICBpbnQzMl90IGkzMiA9IC0zMjsKKyAgICBpbnQ2NF90IGk2NCA9IC02NDsKKyAgICB1aW50MzJfdCB1MzIgPSAzMjsKKyAgICB1aW50NjRfdCB1NjQgPSA2NDsKKyAgICBmbG9hdCBmcCA9IDEuNWY7CisKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6Tk9fSU5JVCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyLCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50MzJfdCgtMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDMyX3QoMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQzMiwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50NjRfdCgtNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDY0LCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IHVpbnQ2NF90KDY0MzIpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSAxNS4yNWY7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OkZMT0FULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMTUuMjVmLCBmcCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU2FtcGxlQ29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitjbGFzcyBDMlNhbXBsZUNvbXBvbmVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgeworICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOworICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7CisgICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOworICAgIGlmIChmZC5leHRlbnQoKSA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5leHRlbnQoKSA8PCAiXSI7CisgICAgfSBlbHNlIGlmIChmZC5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICpvcyA8PCAiW10iOworICAgIH0KKyAgICAqb3MgPDwgIiAoIiA8PCBmZC5fbUZpZWxkSWQgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworQzJFTlVNKAorICAgIE1ldGFkYXRhVHlwZSwgaW50MzJfdCwKKyAgICBrSW52YWxpZCA9IC0xLAorICAgIGtOb25lID0gMCwKKyAgICBrR3JhbGxvYywKKyAgICBrTmF0aXZlSGFuZGxlLAorICAgIGtBTmF0aXZlV2luZG93LAorICAgIGtDYW1lcmEsCispCisKK2VudW0geworICAgIGtQYXJhbUluZGV4VmlkZW9Db25maWcgPSAweDEyMzQsCit9OworCitzdHJ1Y3QgQzJWaWRlb0NvbmZpZ1N0cnVjdCB7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgTWV0YWRhdGFUeXBlIG1ldGFkYXRhVHlwZTsKKyAgICBpbnQzMl90IHN1cHBvcnRlZEZvcm1hdHNbXTsKKworICAgIEMyVmlkZW9Db25maWdTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvQ29uZmlnLCBzdXBwb3J0ZWRGb3JtYXRzKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobWV0YWRhdGFUeXBlLCAibWV0YWRhdGEtdHlwZSIpCisgICAgQzJGSUVMRChzdXBwb3J0ZWRGb3JtYXRzLCAiZm9ybWF0cyIpCit9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlZpZGVvQ29uZmlnU3RydWN0PiBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzsKKworY2xhc3MgTXlDb21wb25lbnRJbnN0YW5jZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLy8gXHRvZG8gdGhpcyBzZWVtcyB0b28gc3BlY2lmaWMKKyAgICAgICAgcmV0dXJuICJzYW1wbGUuaW50ZXJmYWNlIjsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyBob3cgYXJlIHRoZXNlIHNoYXJlZD8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgaWYgKCEqcGFyYW0pIHsgLy8gcGFyYW0gaXMgYWxyZWFkeSBpbnZhbGlkIC0gcmVtZW1iZXIgaXQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBkb2VzIG5vdCBoYW5kbGUgc3RyZWFtIHBhcmFtcyAoc2hvdWxkIHVzZSBpbmRleC4uLikKKyAgICAgICAgICAgIGlmICghbU15UGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgbXkgcGFyYW0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChteVBhcmFtLnNpemUoKSAhPSBwYXJhbS0+c2l6ZSgpKSB7IC8vIGluY29ycmVjdCBzaXplCisgICAgICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20obXlQYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaWYgKG1NeVBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKGluZGV4KS0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbUNvcHkoQzJQYXJhbTo6Q29weShteVBhcmFtKSk7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbUNvcHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0gJj4gbU15UGFyYW1zOworCisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIG1Eb21haW5JbmZvOworCisgICAgTXlDb21wb25lbnRJbnN0YW5jZSgpIHsKKyAgICAgICAgbU15UGFyYW1zLmluc2VydCh7bURvbWFpbkluZm8uaW5kZXgoKSwgbURvbWFpbkluZm99KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGNsYXNzIE15UGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmluc3RhbmNlOworCisgICAgcHVibGljOgorICAgICAgICBNeVBhcmFtUmVmbGVjdG9yKGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmkpIDogaW5zdGFuY2UoaSkgeyB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbUluZGV4LnR5cGVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPihuZXcgQzJTdHJ1Y3REZXNjcmlwdG9yeworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+bURvbWFpbkluZm8udHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShpbnN0YW5jZS0+bURvbWFpbkluZm8pOjpGaWVsZExpc3QoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeS5maWVsZCgpID09IEMyUGFyYW1GaWVsZCgmbURvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZsYWcgKi8sCisgICAgICAgICAgICAgICAgICAgICZtRG9tYWluSW5mby52YWx1ZQorICAgICAgICAgICAgICAgICAgICAvLywKKyAgICAgICAgICAgICAgICAgICAgLy97KGludDMyX3QpQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFT30KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPihuZXcgTXlQYXJhbVJlZmxlY3Rvcih0aGlzKSk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSk7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgbmV3IEMyUGFyYW1EZXNjcmlwdG9yKHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+TXlDb21wb25lbnRJbnN0YW5jZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIGJvb2wgUz1zdGQ6OmlzX2VudW08RT46OnZhbHVlPgorc3RydWN0IGdldHRlciB7CisgICAgaW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC5pMzI7CisgICAgfQorICAgIGludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAuaTY0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50MzJfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTMyOworICAgIH0KKyAgICB1aW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTY0OworICAgIH0KKyAgICBmbG9hdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBmbG9hdCopIHsKKyAgICAgICAgcmV0dXJuIHAuZnA7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3N0cnVjdCBnZXR0ZXI8RSwgdHJ1ZT4geworICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgICAgICAgdXNpbmcgdT10eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICAgICAgIHJldHVybiBnZXR0ZXI8dT4oKS5nZXQocCwgKHUqKTApOworICAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGU8VCwgZmFsc2U+IHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEU+Cit0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldCgKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgIHJldHVybiBnZXR0ZXI8RT4oKS5nZXQocCwgKEUqKTApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBkdW1wRlNWKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2LCBUKnQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgPyAoc3RkOjppc19zaWduZWQ8dHlwZW5hbWUgbGF4X3VuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlID8gImkiIDogInUiKQorICAgICAgICAgICAgIDogc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiaSIgOiAidSIgOiAiZiIpCisgICAgICAgICA8PCAoOCAqIHNpemVvZihUKSk7CisgICAgaWYgKHN2LnR5cGUgPT0gc3YuUkFOR0UpIHsKKyAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgZ2V0KHN2LnJhbmdlLm1pbiwgdCk7CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2Uuc3RlcCwgdCkgIT0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5zdGVwLCB0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLm51bSwgdCkgIT0gMSB8fCBnZXQoc3YucmFuZ2UuZGVub20sIHQpICE9IDEpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5udW0sIHQpIDw8ICIvIiA8PCBnZXQoc3YucmFuZ2UuZGVub20sIHQpOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgZ2V0KHN2LnJhbmdlLm1heCwgdCkgPDwgIikiOworICAgIH0KKyAgICBpZiAoc3YudmFsdWVzLnNpemUoKSkgeworICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IHN2LkZMQUdTID8gIi5mbGFncygiIDogIi5saXN0KCIpOworICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAgOiBzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IGdldChwLCB0KTsKKyAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKKyAgICBpZiAodHlwZS5mb3JJbnB1dCgpKSB7CisgICAgICAgIGNvdXQgPDwgIklucHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yT3V0cHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiT3V0cHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yUG9ydCgpICYmICF0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlBvcnQiOworICAgIH0KKyAgICBpZiAodHlwZS5mb3JTdHJlYW0oKSkgeworICAgICAgICBjb3V0IDw8ICJTdHJlYW0iOworICAgIH0KKworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCk7CisKKyAgICBzd2l0Y2ggKHR5cGUua2luZCgpKSB7CisgICAgY2FzZSBDMlBhcmFtOjpJTkZPOiBjb3V0IDw8ICJJbmZvIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTRVRUSU5HOiBjb3V0IDw8ICJTZXR0aW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpUVU5JTkc6IGNvdXQgPDwgIlR1bmluZyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6U1RSVUNUOiBjb3V0IDw8ICJTdHJ1Y3QiOyBicmVhazsKKyAgICBkZWZhdWx0OiBjb3V0IDw8ICJLaW5kIiA8PCAoaW50MzJfdCl0eXBlLmtpbmQoKTsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OkNvcmVJbmRleCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCkgPDwgIlN0cnVjdCI7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiBjb3V0IDw8ICJibG9iICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8ICJmbG9hdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCAiaW50MzJfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogY291dCA8PCAiaW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgInVpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCAidWludDY0X3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBjb3V0IDw8ICJjaGFyICI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgICAgICBkdW1wVHlwZSgoQzJQYXJhbTo6VHlwZSl0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBTdHJ1Y3QoY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoc2QuY29yZUluZGV4KCkpOworICAgIGNvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIC8vQzJGaWVsZERlc2NyaXB0b3IgJmY7CisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZiA6IHNkKSB7CisgICAgICAgIFByaW50VG8oZiwgJmNvdXQpOworICAgICAgICBjb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKGYubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIi5uYW1lZCgiOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmcCA6IGYubmFtZWRWYWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IHAuZmlyc3QgPDwgIj0iOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDY0X3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogY291dCA8PCBnZXQocC5zZWNvbmQsIChmbG9hdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBjb3V0IDw8ICI/Pz8iOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291dCA8PCAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKK30KKwordm9pZCBkdW1wRGVzYyhjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGlmIChwZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgY291dCA8PCAicmVxdWlyZWQgIjsKKyAgICB9CisgICAgaWYgKHBkLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgIGNvdXQgPDwgInBlcnNpc3RlbnQgIjsKKyAgICB9CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZShwZC5pbmRleCgpLnR5cGUoKSkpOworICAgIGNvdXQgPDwgIiAiIDw8IHBkLm5hbWUoKSA8PCAiOyIgPDwgZW5kbDsKK30KKworVEVTVF9GKEMyU2FtcGxlQ29tcG9uZW50VGVzdCwgUmVmbGVjdG9yVGVzdCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW5JbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNeUNvbXBvbmVudEluc3RhbmNlPiBteUNvbXAobmV3IE15Q29tcG9uZW50SW5zdGFuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcCA9IG15Q29tcDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2N7CisgICAgICAgIG15Q29tcC0+Z2V0UGFyYW1SZWZsZWN0b3IoKS0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKX07CisgICAgZHVtcFN0cnVjdCgqZGVzYyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICB7IEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpLAorICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCB9LAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpKSwKKyAgICB9OworCisgICAgRVhQRUNUX0VRKEMyX09LLCBjb21wLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihxdWVyeSwgQzJfRE9OVF9CTE9DSykpOworCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnEgOiBxdWVyeSkgeworICAgICAgICBkdW1wRlNWKHEudmFsdWVzLCAmZG9tYWluSW5mby52YWx1ZSk7CisgICAgfQorfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1Rlc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCAwPiBVaW50MzJUZXN0SW5mbzsKKyAgICBVaW50MzJUZXN0SW5mbyB0OworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMCwgMTAsIDEpKTsgIC8vIG1pbiwgbWF4LCBzdGVwCisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKDEsIDY0LCAyLCAxKSk7ICAvLyBtaW4sIG1heCwgbnVtLCBkZW4KKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHsxLCAyLCAzfSkpOyAgLy8gZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdAorICAgIHVpbnQzMl90IHZhbFtdID0gezEsIDMsIDUsIDd9OworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB2KHN0ZDo6YmVnaW4odmFsKSwgc3RkOjplbmQodmFsKSk7CisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlLCB2KSk7ICAvLyBmbGFncywgc3RkOjp2ZWN0b3IKKworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YgOiB2YWx1ZXMpIHsKKyAgICAgICAgZHVtcEZTVihzdiwgJnQudmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2QzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyVXRpbFRlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPF9DMk1hY3JvVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworLyoqIFxmaWxlCisgKiBUZXN0cyBmb3Igdm5kay91dGlsLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJNYWNyb1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSksICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0KSwgInNob3VsZCBiZSA2NCIpOworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoLCksICJzaG91bGQgYmUgMCIpOworc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEsKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiwpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCksICJzaG91bGQgYmUgNjQiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJFbnVtVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDMlV0aWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitDMkVOVU0oRW51bTEsIHVpbnQzMl90LAorICAgIEVudW0xVmFsdWUxLAorICAgIEVudW0xVmFsdWUyLAorICAgIEVudW0xVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAorKTsKKworQzJFTlVNX0NVU1RPTV9QUkVGSVgoRW51bTIsIHVpbnQzMl90LCAiRW51bSIsCisgICAgRW51bTJWYWx1ZTEsCisgICAgRW51bTJWYWx1ZTIsCisgICAgRW51bTJWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX05BTUVTKEVudW0zLCB1aW50OF90LAorICAgICh7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAorICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSksCisgICAgRW51bTNWYWx1ZTEsCisgICAgRW51bTNWYWx1ZTIsCisgICAgRW51bTNWYWx1ZTQgPSBFbnVtM1ZhbHVlMiArIDIsCisgICAgSW52YWxpZCwKKyk7CisKK1RFU1RfRihDMlV0aWxUZXN0LCBFbnVtVXRpbHNUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nLCBFbnVtMz4+IHBhaXJzICggeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAorICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOworICAgIEVudW0zIGUzOworICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CisKKyAgICAvLyB1cHBlciBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX05PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX19OTyIpKTsKKyAgICBFWFBFQ1RfRVEoImEyZHAiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJBMkRQIikpOworICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyX1RTIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCTE9DS18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QRUdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSElEREVOX1ZBTFVFIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUyIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUUyIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFXzIiKSk7CisKKyAgICAvLyBjYW1lbCBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5vIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNfTm8iKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUcyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWcydHMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlblZhbHVlIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWUyIikpOworCisgICAgLy8gbWl4ZWQgY2FzZQorICAgIEVYUEVDVF9FUSgibXAydC1zIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVF9zIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9ja18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTItZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMl9EIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18ydHMiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlbl9fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZV8yIikpOworICAgIEVYUEVDVF9FUSgiXzIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl9fMjMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfXzIzIikpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTlmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMl90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3RlbXBsYXRlPGludCBOPgorc3RydWN0IGMyX2NvbnN0X2NoZWNrZXIKK3sKKyAgICBpbmxpbmUgY29uc3RleHByIHN0YXRpYyBpbnQgbnVtKCkgeyByZXR1cm4gTjsgfQorfTsKKworY29uc3RleHByIGF1dG8gbWluX2kzMl9pMzIgPSBjMl9taW4oaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5faTMyX2k2NCA9IGMyX21pbihpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pOF9pMzIgPSBjMl9taW4oaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pMzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2k2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWluX3UzMl91MzIgPSBjMl9taW4odWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91NjQgPSBjMl9taW4odWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTY0KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91OCA9IGMyX21pbih1aW50MzJfdCgweGZmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U4KSwgY29uc3QgdWludDhfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91NjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U4Pjo6bnVtKCkgPT0gMHhmZiwgInNob3VsZCBiZSAweGZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTMyID0gYzJfbWF4KGludDMyX3QoMSksIGludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pNjQgPSBjMl9tYXgoaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaThfaTMyID0gYzJfbWF4KGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pNjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTMyID0gYzJfbWF4KHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTY0ID0gYzJfbWF4KHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U2NCksIGNvbnN0IHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTggPSBjMl9tYXgodWludDMyX3QoMHg3ZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91OCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91NjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U4Pjo6bnVtKCkgPT0gMHg3ZmZmZmZmZiwgInNob3VsZCBiZSAweDdmZmZmZmZmIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT1VOVEVSIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGMyX2NudHJfc3RhdGljX3Rlc3QoKSB7CisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgY29uc3RydWN0aW9uL2Fzc2lnbm1lbnQKKyAgICBjb25zdGV4cHIgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjb25zdGV4cHIgYzJfY250cjY0X3QgYzY0X2EoLTQ1Nik7CisgICAgYzJfY250cjMyX3QgYzMyX2IgX191bnVzZWQgPSBjNjRfYTsKKyAgICAvLyBjMzJfYiA9IDY0LjsgLy8gRElTQUxMT1dFRAorICAgIC8vIGMyX2NudHI2NF90IGM2NF9iID0gYzMyX2E7IC8vIERJU0FMTE9XRUQKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHNvbWUgY29uc3RleHByIG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICsgYzY0X2EpLCBkZWNsdHlwZShjNjRfYSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIjEyMyArIC00NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGMzMl9hID09IGMyX2NudHIzMl90KDI0NiksICIxMjMgKyAxMjMgPSAyNDYiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoLTMzMyksICItNDU2ICsgMTIzID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyAxKSwgZGVjbHR5cGUoMSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyA0NTYgPT0gYzJfY250cjMyX3QoNTc5KSwgIjEyMyArIDQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICsgYzY0X2EgPT0gYzJfY250cjY0X3QoMCksICI0NTYgKyAtNDU2ID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjNjRfYSA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzIC0gLTQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgwKSwgIjEyMyAtIDEyMyA9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hIC0gYzMyX2EgPT0gYzJfY250cjMyX3QoLTU3OSksICItNDU2IC0gMTIzID0gLTU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gMSksIGRlY2x0eXBlKDEgLSBjMzJfYSk+Ojp2YWx1ZSwgIi0gc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gNDU2ID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzIC0gNDU2ID0gLTMzMyIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2IC0gYzY0X2EgPT0gYzJfY250cjY0X3QoOTEyKSwgIjQ1NiAtIC00NTYgPSA5MTIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzY0X2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIjEyMyAqIC00NTYgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoMTUxMjkpLCAiMTIzICogMTIzID0gMTUxMjkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIi00NTYgKiAxMjMgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIDEpLCBkZWNsdHlwZSgxICogYzMyX2EpPjo6dmFsdWUsICIqIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NjA4OCksICIxMjMgKiA0NTYgPSA1NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICogYzY0X2EgPT0gYzJfY250cjY0X3QoLTIwNzkzNiksICI0NTYgKiAtNDU2ID0gLTIwNzkzNiIpOworCisgICAgc3RhdGljX2Fzc2VydCgoYzMyX2EgPDwgMjZ1KSA9PSBjMl9jbnRyMzJfdCgweEVDMDAwMDAwKSwgIjEyMyA8PCAyNiA9IDB4RUMwMDAwMDAiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHVuYXJ5IG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gK2MyX2NudHIzMl90KDEpLCAiMSA9PSArMSIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gLWMyX2NudHIzMl90KC0xKSwgIjEgPT0gLS0xIik7CisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb21wYXJpc29uCisgICAgdXNpbmcgYzhfdCA9IGMyX2NudHJfdDx1aW50OF90PjsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID4gYzhfdCgweDdmKSwgIjgwID4gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID49IGM4X3QoMHg3ZiksICI4MCA+PSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA+IGM4X3QoMHg3ZSksICI3RiA+IDdFIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID49IGM4X3QoMHg3ZSksICI3RiA+PSA3RSIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPj0gYzhfdCgwKSksICI4MCAhPj0gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPiBjOF90KC0weDgwKSksICI4MCAhPiA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgtMHg4MCksICI4MCA+PSA4MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA9PSBjOF90KDB4ODApLCAiODAgPT0gODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPT0gYzhfdCgwKSksICI4MCAhPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSAhPSBjOF90KDB4N2YpLCAiODAgIT0gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgweDdmKSAhPSBjOF90KDB4N2YpKSwgIjgwICE9IDdGIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPCBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPD0gYzhfdCgtMHg4MCksICI3RiA8IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2UpIDwgYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPD0gYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KDB4NDApKSwgIi00MCAhPCA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8PSBjOF90KDB4NDApKSwgIi00MCAhPD0gNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KC0weDQwKSksICItNDAgITwgLTQwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDQwKSA8PSBjOF90KC0weDQwKSwgIi00MCA8PSAtNDAiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoLTB4N2ZmZmZmZmYgLSAxKSA+IGMyX2NudHIzMl90KDB4N2ZmZmZmZmYpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09IGMyX2NudHIzMl90KGMyX2NudHI2NF90KDB4MTAwMDAwMDAxdWwpKSwgIjEgPT0gMSIpOworfQorCitjbGFzcyBDMlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihDMlRlc3QsIENvdW50ZXJUZXN0KSB7CisgICAgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gMywgYzJfY250cjMyX3QoMTI2KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICs9IGM2NF9hLCBjMl9jbnRyMzJfdCgtMzMwKSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIDw8PSAydSwgYzJfY250cjMyX3QoLTEzMjApKTsKKyAgICBFWFBFQ1RfRVEoYzY0X2EgKj0gMywgYzJfY250cjY0X3QoLTEzNjgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gYzY0X2EsIGMyX2NudHIzMl90KDQ4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIC09IDQwLCBjMl9jbnRyMzJfdCg4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICo9IGMzMl9hLCBjMl9jbnRyMzJfdCg2NCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5OTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNTZWdtZW50VGVzdCgpIHsKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkub2Zmc2V0ID09IDEyMywgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zaXplID09IDQ1NiwgIiIpOworCisgICAgICAgIC8vIGVtcHR5CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pc0VtcHR5KCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmlzRW1wdHkoKSwgIiIpOworCisgICAgICAgIC8vIHZhbGlkCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzVmFsaWQoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmlzVmFsaWQoKSwgIiIpOworCisgICAgICAgIC8vIGJvb2woKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KChib29sKUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisKKyAgICAgICAgLy8gIQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEhQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAwKSwgIiIpOworCisgICAgICAgIC8vIGNvbnRhaW5zCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjJ1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyNHUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI1dSwgMnUpKSwgIiIpOworCisgICAgICAgIC8vID09CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyNHUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMSArIH4xMjR1KSwgIiIpOworCisgICAgICAgIC8vICE9CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTI0dSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpICE9IEMyU2VnbWVudCgxMjR1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpICE9IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDwgQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpIDwgQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyMnUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTI0dSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID4gQzJTZWdtZW50KDEyMnUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID4gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIGVuZAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5lbmQoKSA9PSA1Nzl1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KS5lbmQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5lbmQoKSA9PSAweGZmZmZmZmZmdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmVuZCgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gaW50ZXJzZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjR1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoNTc5dSwgNDYwdSkpID09IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1ODl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU4OXUsIH45dSAvKiAtMTAgKi8pLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU1dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTIzdSkpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyMnUgLyogLTEyMyAqLyksICIiKTsKKworICAgICAgICAvLyBub3JtYWxpemUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGVtcHR5IHNlZ21lbnRzKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsaXplIGNhbm5vdCBiZSB1c2VkIHRvIG1ha2UgdGhpcyB3b3JrCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gc2F0dXJhdGUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGZ1bGwgc2VnbWVudHMgdXAgdG8gbWF4KQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogc2F0dXJhdGUgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsgYnV0IG9ubHkgcGFydGlhbGx5CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEwMDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoNTc5dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMDAwdSwgMHUpLCAiIik7CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNMaW5lYXJSYW5nZUFuZENhcGFjaXR5VGVzdCgpIHsKKyAgICAgICAgY2xhc3MgVGVzdENhcGFjaXR5IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKyAgICAgICAgICAgIHVzaW5nIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OjpfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdDsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUZXN0UmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KDB1KS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisgICAgICAgIGNvbnN0ZXhwciBUZXN0Q2FwYWNpdHkgY2FwKDEyM3UpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkobnVsbHB0cikuY2FwYWNpdHkoKSA9PSAwdSwgIiIpOworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5UmFuZ2UKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLm9mZnNldCgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLnNpemUoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgICAgICBjb25zdGV4cHIgVGVzdFJhbmdlIHJhbmdlKCZjYXAsIDUwdSwgMTAwdSk7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5vZmZzZXQoKSA9PSA1MHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5zaXplKCkgPT0gNzN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2UuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLm9mZnNldCgpID09IDIwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuc2l6ZSgpID09IDMwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gNTB1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5vZmZzZXQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuc2l6ZSgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgfQorCit9OworCisKK2NsYXNzIEMyQnVmZmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEMyQnVmZmVyVGVzdCgpCisgICAgICAgIDogbUJsb2NrUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICAgICAgbUxpbmVhckFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPignaScpKSwKKyAgICAgICAgICBtU2l6ZSgwdSksCisgICAgICAgICAgbUFkZHIobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KCdnJykpIHsKKyAgICB9CisKKyAgICB+QzJCdWZmZXJUZXN0KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhbGxvY2F0ZUxpbmVhcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUxpbmVhckFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtTGluZWFyQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcExpbmVhcihzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDhfdCAqKmFkZHIpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmbUFkZHIpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyTGluZWFyQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbUFkZHIpOworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltQWRkcjsKKyAgICB9CisKKyAgICB2b2lkIHVubWFwTGluZWFyKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIEFTU0VSVF9ORSgwdSwgbVNpemUpOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUxpbmVhckFsbG9jYXRpb24tPnVubWFwKG1BZGRyLCBtU2l6ZSwgbnVsbHB0cikpOworICAgICAgICBtU2l6ZSA9IDB1OworICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlTGluZWFyQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGVHcmFwaGljKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJm1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3R3JhcGhpY0FsbG9jYXRpb24oKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtYXBHcmFwaGljKEMyUmVjdCByZWN0LCBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRpb24tPm1hcCgKKyAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgICAgICAgICAgICAgYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJHcmFwaGljQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBtTWFwcGVkUmVjdCA9IHJlY3Q7CisgICAgICAgIG1lbWNweShtQWRkckdyYXBoaWMsIGFkZHIsIHNpemVvZih1aW50OF90KikgKiBDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVMpOworICAgIH0KKworICAgIHZvaWQgdW5tYXBHcmFwaGljKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUdyYXBoaWNBbGxvY2F0aW9uLT51bm1hcChtQWRkckdyYXBoaWMsIG1NYXBwZWRSZWN0LCBudWxscHRyKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtTGluZWFyQWxsb2NhdGlvbjsKKyAgICBzaXplX3QgbVNpemU7CisgICAgdm9pZCAqbUFkZHI7CisgICAgQzJSZWN0IG1NYXBwZWRSZWN0OworICAgIHVpbnQ4X3QqIG1BZGRyR3JhcGhpY1tDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUdyYXBoaWNBbGxvY2F0aW9uOworfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTGluZWFyQWxsb2NhdGlvblRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBhbGxvY2F0ZUxpbmVhcihrQ2FwYWNpdHkpOworCisgICAgdWludDhfdCAqYWRkciA9IG51bGxwdHI7CisgICAgbWFwTGluZWFyKDB1LCBrQ2FwYWNpdHksICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGFkZHJbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB1bm1hcExpbmVhcigpOworICAgIGFkZHIgPSBudWxscHRyOworCisgICAgbWFwTGluZWFyKGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ2FwYWNpdHkgLyAzOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDAsIGFkZHJbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHdyaXRlVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcgPSB3cml0ZVZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCB3cml0ZVZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSwgd3JpdGVWaWV3LmNhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSgwdSwgd3JpdGVWaWV3Lm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuc2l6ZSgpKTsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBkYXRhW2ldID0gaSAlIDEwMHU7CisgICAgfQorCisgICAgd3JpdGVWaWV3LnNldE9mZnNldChrQ2FwYWNpdHkgLyAzKTsKKyAgICBkYXRhID0gd3JpdGVWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3cml0ZVZpZXcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBkYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGkKKyAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSk7CisgICAgfQorCisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsIGZlbmNlKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiByZWFkVmlld0hvbGRlciA9IGNvbnN0QmxvY2subWFwKCk7CisgICAgQzJSZWFkVmlldyByZWFkVmlldyA9IHJlYWRWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgcmVhZFZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSAvIDMsIHJlYWRWaWV3LmNhcGFjaXR5KCkpOworCisgICAgLy8gVE9ETzogZmVuY2UKKyAgICBjb25zdCB1aW50OF90ICpjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSkKKyAgICAgICAgICAgICAgICA8PCAiOyBjb25zdERhdGEgPSAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oY29uc3REYXRhKTsKKyAgICB9CisKKyAgICByZWFkVmlldyA9IHJlYWRWaWV3LnN1YlZpZXcoMzMzdSwgMTAwdSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoMTAwdSwgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICBjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsgMzMzdSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgY29uc3REYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGk7CisgICAgfQorfQorCit2b2lkIGZpbGxQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgYWRkcltyb3dPZmZzZXQgKyBjb2xPZmZzZXRdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgdmVyaWZ5UGxhbmUoY29uc3QgQzJSZWN0IHJlY3QsIGNvbnN0IEMyUGxhbmVJbmZvIGluZm8sIGNvbnN0IHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHJlY3QuaGVpZ2h0IC8gaW5mby5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgaW50MzJfdCByb3dPZmZzZXQgPSAocm93ICsgcmVjdC50b3AgLyBpbmZvLnJvd1NhbXBsaW5nKSAqIGluZm8ucm93SW5jOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHJlY3Qud2lkdGggLyBpbmZvLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgaW50MzJfdCBjb2xPZmZzZXQgPSAoY29sICsgcmVjdC5sZWZ0IC8gaW5mby5jb2xTYW1wbGluZykgKiBpbmZvLmNvbEluYzsKKyAgICAgICAgICAgIGlmIChhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBhbGxvY2F0ZUdyYXBoaWMoa1dpZHRoLCBrSGVpZ2h0KTsKKworICAgIHVpbnQ4X3QgKmFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICBDMlJlY3QgcmVjdChrV2lkdGgsIGtIZWlnaHQpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dDsKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgdWludDhfdCAqeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUocmVjdCwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZShyZWN0LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIHVubWFwR3JhcGhpYygpOworCisgICAgbWFwR3JhcGhpYyhyZWN0LCAmbGF5b3V0LCBhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKworICAgIHkgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHUgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHYgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCB2LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKSk7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNCbG9ja1Bvb2xUZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VHcmFwaGljQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgsCisgICAgICAgICAgICBrSGVpZ2h0LAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gZ3JhcGhpY1ZpZXdIb2xkZXIgPSBibG9jay0+bWFwKCk7CisgICAgQzJHcmFwaGljVmlldyBncmFwaGljVmlldyA9IGdyYXBoaWNWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgZ3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGdyYXBoaWNWaWV3LmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhID0gZ3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKworICAgIHVpbnQ4X3QgKnkgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBDMlBsYW5lSW5mbyB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHVpbnQ4X3QgKnUgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBDMlBsYW5lSW5mbyB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVpbnQ4X3QgKnYgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICBDMlBsYW5lSW5mbyB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKTsKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB2SW5mbywgdiwgMCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMik7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1Nik7CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZShDMlJlY3Qoa1dpZHRoLCBrSGVpZ2h0KSwgZmVuY2UpOworICAgIGJsb2NrLnJlc2V0KCk7CisKKyAgICBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gY29uc3RWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IGNvbnN0R3JhcGhpY1ZpZXcgPSBjb25zdFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBjb25zdEdyYXBoaWNWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGNvbnN0R3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGNvbnN0R3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmNvbnN0RGF0YSA9IGNvbnN0R3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworCisgICAgY29uc3QgdWludDhfdCAqY3kgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgY29uc3QgdWludDhfdCAqY3UgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgY29uc3QgdWludDhfdCAqY3YgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIGN5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCBjdSwgMHgzNCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgY3YsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB2SW5mbywgY3YsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB2SW5mbywgY3YsIDApKTsKK30KKworY2xhc3MgQnVmZmVyRGF0YSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9Cit9OworCitjbGFzcyBCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyKGJsb2Nrcykge30KK307CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJ1ZmZlckRhdGFUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBsaW5lYXJCbG9ja1Bvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGdyYXBoaWNCbG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoMSA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodDEgPSAyNDA7CisgICAgY29uc3RleHByIEMyUmVjdCBrQ3JvcDEoa1dpZHRoMSwga0hlaWdodDEpOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgyID0gMTc2OworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MiA9IDE0NDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMihrV2lkdGgyLCBrSGVpZ2h0Mik7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkxID0gMTAyNHU7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkyID0gMjA0OHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazI7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkxLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkyLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2syKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNCbG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoMSwKKyAgICAgICAgICAgIGtIZWlnaHQxLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmZ3JhcGhpY0Jsb2NrMSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgyLAorICAgICAgICAgICAga0hlaWdodDIsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2syKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJEYXRhPiBkYXRhKG5ldyBCdWZmZXJEYXRhKHsgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpLAorICAgICAgICBsaW5lYXJCbG9jazItPnNoYXJlKDAsIGtDYXBhY2l0eTIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2syLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpHUkFQSElDLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxdSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+bGluZWFyQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpLAorICAgICAgICBncmFwaGljQmxvY2syLT5zaGFyZShrQ3JvcDIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgydSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKK30KKwordm9pZCBEZXN0cm95Q2FsbGJhY2soY29uc3QgQzJCdWZmZXIgKiAvKiBidWYgKi8sIHZvaWQgKmFyZykgeworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKmNiID0gKHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKilhcmc7CisgICAgKCpjYikoKTsKK30KKworZW51bSA6IHVpbnQzMl90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlcjEsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcjE+IEMyTnVtYmVyMUluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMj4gQzJOdW1iZXIySW5mbzsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYWxsb2MobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYWxsb2MtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworCisgICAgc3RkOjphdG9taWNfYm9vbCBkZXN0cm95ZWQoZmFsc2UpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYXJnID0gWyZkZXN0cm95ZWRdKCl7IGRlc3Ryb3llZCA9IHRydWU7IH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcihuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX0RVUExJQ0FURSwgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgRVhQRUNUX1RSVUUoZGVzdHJveWVkKTsKKworICAgIGJ1ZmZlci5yZXNldChuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIGRlc3Ryb3llZCA9IGZhbHNlOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssIG51bGxwdHIpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8xKG5ldyBDMk51bWJlcjFJbmZvKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMihuZXcgQzJOdW1iZXIySW5mbygyKSk7CisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5pbmZvKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMSkpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8xLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8yKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCpyZW1vdmVkLCAqaW5mbzEpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8yLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzMobmV3IEMyTnVtYmVyMkluZm8oMykpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8zKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8yLT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgqaW5mbzMsICpyZW1vdmVkKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTXVsdGlwbGVMaW5lYXJNYXBUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJXcml0ZVZpZXc+IHdWaWV3czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJSZWFkVmlldz4gclZpZXdzOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjEzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTAyIEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJEZWJ1Zy5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyUGFyYW1VdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgY29tcG9uZW50cworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyIsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsIC8vIGZvciBDMl9MT0cKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBmcmFtZXdvcmsgdXRpbGl0aWVzCisvLyBUSElTIElTIE9OTFkgRk9SIEZSQU1FV09SSyBVU0UgT05MWQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW50ZXJuYWwtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICBdLAorCisgICAgLy8gVE9ETzogc2VwYXJhdGUgaW50ZXJuYWwgaGVhZGVycyBzbyB0aGV5IGNhbiBiZSBleHBvc2VkIGhlcmUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5OGJmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9yR3JhbGxvYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYWxsb2NhdG9yLzIuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9tYXBwZXIvMi4wL0lNYXBwZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2FnZSBtYXNrIHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggZnJvbSBncmFsbG9jIHRvIENvZGVjIDIuMCB1c2FnZS4KKyAgICAgICAgICovCisgICAgICAgIFBBU1NUSFJPVUdIX1VTQUdFX01BU0sgPQorICAgICAgICAgICAgfihHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSyB8IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKQorICAgIH07CisKKyAgICAvLyB2ZXJpZnkgdGhhdCBwYXNzdGhyb3VnaCBtYXNrIGlzIHdpdGhpbiB0aGUgcGxhdGZvcm0gbWFzaworICAgIHN0YXRpY19hc3NlcnQoKH5DMk1lbW9yeVVzYWdlOjpQTEFURk9STV9NQVNLICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykgPT0gMCwgIiIpOworfQorCitDMk1lbW9yeVVzYWdlIEMyQW5kcm9pZE1lbW9yeVVzYWdlOjpGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiBDMk1lbW9yeVVzYWdlKAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpID8gQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAodXNhZ2UgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VpbnQ2NF90IEMyQW5kcm9pZE1lbW9yeVVzYWdlOjphc0dyYWxsb2NVc2FnZSgpIGNvbnN0IHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuICgoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgPyBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEKSA/IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKGV4cGVjdGVkICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YWxsb2NhdG9yOjpWMl8wOjpJQWxsb2NhdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6QnVmZmVyVXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkJ1ZmZlckRlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpFcnJvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OklNYXBwZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpZQ2JDckxheW91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyB7CisgICAgSU1hcHBlcjo6QnVmZmVyRGVzY3JpcHRvckluZm8gbWFwcGVySW5mbzsKKyAgICB1aW50MzJfdCBzdHJpZGU7Cit9OworCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGMyX3N0YXR1c190IG1hcGVycjJlcnJvcihFcnJvciBtYXBlcnIpIHsKKyAgICBzd2l0Y2ggKG1hcGVycikgeworICAgICAgICBjYXNlIEVycm9yOjpOT05FOiAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIEVycm9yOjpCQURfREVTQ1JJUFRPUjogcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX0JVRkZFUjogICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9WQUxVRTogICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpOT19SRVNPVVJDRVM6ICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgY2FzZSBFcnJvcjo6VU5TVVBQT1JURUQ6ICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3N0YXRpYworYm9vbCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUpIHsKKyAgICAvLyBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb24gb2YgYSBuYXRpdmUgaGFuZGxlCisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIG51bGwgaGFuZGxlIGlzIGNvbnNpZGVyZWQgdmFsaWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChzaXplX3QpaGFuZGxlLT52ZXJzaW9uICE9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA8IDAgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IDAgfHwKKyAgICAgICAgICAgIC8vIGZvciBzYW5pdHkgYXNzdW1lIGhhbmRsZXMgbXVzdCBvY2N1cHkgbGVzcyBtZW1vcnkgdGhhbiBJTlRfTUFYIGJ5dGVzCisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBoYW5kbGUtPm51bUludHMpOworfQorCitjbGFzcyBDMkhhbmRsZUdyYWxsb2MgOiBwdWJsaWMgQzJIYW5kbGUgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRXh0cmFEYXRhIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50MzJfdCB1c2FnZV9sbzsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfaGk7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9sbzsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9oaTsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90OworICAgICAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE5VTV9JTlRTID0gc2l6ZW9mKEV4dHJhRGF0YSkgLyBzaXplb2YoaW50KSwKKyAgICB9OworICAgIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBNQUdJQyA9ICdceGMyZ3JceDAwJzsKKworICAgIHN0YXRpYworICAgIGNvbnN0IEV4dHJhRGF0YSogZ2V0RXh0cmFEYXRhKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkKKyAgICAgICAgICAgICAgICB8fCBoYW5kbGUtPm51bUludHMgPCBOVU1fSU5UUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0cmFEYXRhKj4oCisgICAgICAgICAgICAgICAgJmhhbmRsZS0+ZGF0YVtoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTXSk7CisgICAgfQorCisgICAgc3RhdGljCisgICAgRXh0cmFEYXRhICpnZXRFeHRyYURhdGEoQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHRyYURhdGEgKj4oZ2V0RXh0cmFEYXRhKGNvbnN0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUgKmNvbnN0PihoYW5kbGUpKSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBnZXRJZ2JwRGF0YSh1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICplZCA9IGdldEV4dHJhRGF0YSh0aGlzKTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSBlZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZChlZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZChlZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0gZWQtPmlnYnBfc2xvdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICpjb25zdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIpIHsgLy8gbnVsbCBoYW5kbGUgaXMgYWx3YXlzIHZhbGlkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKG8pOworICAgICAgICAvLyB3ZSBjYW5ub3QgdmFsaWRhdGUgd2lkdGgvaGVpZ2h0L2Zvcm1hdC91c2FnZSB3aXRob3V0IGFjY2Vzc2luZyBncmFsbG9jIGRyaXZlcgorICAgICAgICByZXR1cm4geGQgIT0gbnVsbHB0ciAmJiB4ZC0+bWFnaWMgPT0gTUFHSUM7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIC8vQ0hFQ0soaGFuZGxlICE9IG51bGxwdHIpOworICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBOVU1fSU5UUyAtIGhhbmRsZS0+bnVtRmRzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgeGQgPSB7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVpbnQzMl90KHVzYWdlICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KHVzYWdlID4+IDMyKSwKKyAgICAgICAgICAgIHN0cmlkZSwgZ2VuZXJhdGlvbiwgdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdChpZ2JwX2lkID4+IDMyKSwKKyAgICAgICAgICAgIGlnYnBfc2xvdCwgTUFHSUMKKyAgICAgICAgfTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOworICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNsb25lID0gbmF0aXZlX2hhbmRsZV9jbG9uZShoYW5kbGUpOworICAgICAgICBpZiAoY2xvbmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgQzJIYW5kbGVHcmFsbG9jICpyZXMgPSBXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICBjbG9uZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworICAgICAgICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNsb25lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgQzJIYW5kbGVHcmFsbG9jKiBJbXBvcnQoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAorICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICp3aWR0aCA9IHhkLT53aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IHhkLT5oZWlnaHQ7CisgICAgICAgICpmb3JtYXQgPSB4ZC0+Zm9ybWF0OworICAgICAgICAqdXNhZ2UgPSB4ZC0+dXNhZ2VfbG8gfCAodWludDY0X3QoeGQtPnVzYWdlX2hpKSA8PCAzMik7CisgICAgICAgICpzdHJpZGUgPSB4ZC0+c3RyaWRlOworICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHhkLT5pZ2JwX2lkX2xvIHwgKHVpbnQ2NF90KHhkLT5pZ2JwX2lkX2hpKSA8PCAzMik7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZUdyYWxsb2MgKj4oaGFuZGxlKTsKKyAgICB9Cit9OworCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUpOworfQorCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6V3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK2NsYXNzIEMyQWxsb2NhdGlvbkdyYWxsb2MgOiBwdWJsaWMgQzJHcmFwaGljQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QzJBbGxvY2F0aW9uR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAoCisgICAgICAgICAgICB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQWxsb2NhdG9ySWQ7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTG9ja2VkSGFuZGxlID8gOiBtSGFuZGxlOyB9CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICAvLyB8aGFuZGxlfCB3aWxsIGJlIG1vdmVkLgorICAgIEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvICZpbmZvLAorICAgICAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyPiAmbWFwcGVyLAorICAgICAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKTsKKyAgICBpbnQgZHVwKCkgY29uc3Q7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gbUluZm87CisgICAgY29uc3Qgc3A8SU1hcHBlcj4gbU1hcHBlcjsKKyAgICBjb25zdCBoaWRsX2hhbmRsZSBtSGlkbEhhbmRsZTsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1IYW5kbGU7CisgICAgYnVmZmVyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptTG9ja2VkSGFuZGxlOworICAgIGJvb2wgbUxvY2tlZDsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtQWxsb2NhdG9ySWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6OkMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gJmluZm8sCisgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcj4gJm1hcHBlciwKKyAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCkKKyAgICA6IEMyR3JhcGhpY0FsbG9jYXRpb24oaW5mby5tYXBwZXJJbmZvLndpZHRoLCBpbmZvLm1hcHBlckluZm8uaGVpZ2h0KSwKKyAgICAgIG1JbmZvKGluZm8pLAorICAgICAgbU1hcHBlcihtYXBwZXIpLAorICAgICAgbUhpZGxIYW5kbGUoc3RkOjptb3ZlKGhpZGxIYW5kbGUpKSwKKyAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgIG1CdWZmZXIobnVsbHB0ciksCisgICAgICBtTG9ja2VkSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUxvY2tlZChmYWxzZSksCisgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpIHsKK30KKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6fkMyQWxsb2NhdGlvbkdyYWxsb2MoKSB7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIGFkZHJlc3NzIGFuZCByZWN0CisgICAgICAgIHVpbnQ4X3QqIGFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXSA9IHt9OworICAgICAgICB1bm1hcChhZGRyLCBDMlJlY3QoKSwgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgIG1NYXBwZXItPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlcikpOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPihtSGFuZGxlKSkpOworICAgIH0KKyAgICBpZiAobUxvY2tlZEhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+KG1Mb2NrZWRIYW5kbGUpKSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjptYXAoCisgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJtYXBwaW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICAvLyBUT0RPCisgICAgKHZvaWQpIGZlbmNlOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGlmIChtQnVmZmVyICYmIG1Mb2NrZWQpIHsKKyAgICAgICAgQUxPR0QoImFscmVhZHkgbWFwcGVkIik7CisgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgfQorICAgIGlmICghbGF5b3V0IHx8ICFhZGRyKSB7CisgICAgICAgIEFMT0dEKCJ3cm9uZyBwYXJhbSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBtTWFwcGVyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUhpZGxIYW5kbGUsIFsmZXJyLCB0aGlzXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IHN0YXRpY19jYXN0PGJ1ZmZlcl9oYW5kbGVfdD4oYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIHJldHVybmVkIG51bGwgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICB1aW50NjRfdCBpZ2JwX2lkID0gMDsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90ID0gMDsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG1IYW5kbGUtPmdldElnYnBEYXRhKCZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIH0KKyAgICAgICAgbUxvY2tlZEhhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8ubWFwcGVySW5mby53aWR0aCwgbUluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mby5tYXBwZXJJbmZvLnVzYWdlLCBtSW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JbmZvLm1hcHBlckluZm8uZm9ybWF0KSB7CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfMTAxMDEwMjogeworICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCisgICAgICAgICAgICAvLyBTdXJmYWNlLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgUkdCQS4gV2UgZG9uJ3Qga25vdyB3aGljaCBjYXNlIGl0IGlzIGhlcmUsIHNvCisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFlVViBmb3Igbm93LgorICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRyZWF0IGFzIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQTsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9BLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCQV84ODg4OgorICAgICAgICAgICAgLy8gVE9ETzogYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQlhfODg4ODogeworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSAodWludDhfdCAqKXBvaW50ZXIgKyAxOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSAodWludDhfdCAqKXBvaW50ZXIgKyAyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9SLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9HLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9CLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpZVjEyOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIFlDYkNyTGF5b3V0IHljYmNyTGF5b3V0OworICAgICAgICAgICAgbU1hcHBlci0+bG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IG1hcExheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2tZQ2JDciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY2I7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueVN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUxvY2tlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6OnVubWFwKAorICAgICAgICB1aW50OF90ICoqYWRkciwgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSB7CisgICAgLy8gVE9ETzogY2hlY2sgYWRkciBhbmQgc2l6ZSwgdXNlIGZlbmNlCisgICAgKHZvaWQpYWRkcjsKKyAgICAodm9pZClyZWN0OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIG1NYXBwZXItPnVubG9jaygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgWyZlcnIsICZmZW5jZV0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZyZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICh2b2lkKSByZWxlYXNlRmVuY2U7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgbUxvY2tlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEMyQWxsb2NhdGlvbkdyYWxsb2M6OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG90aGVyICYmIG90aGVyLT5oYW5kbGUoKSA9PSBoYW5kbGUoKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKTsKKworICAgIGlkX3QgZ2V0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5pZDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0czsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzcDxJQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgYm9vbCBtQnVmZmVyUXVldWU7Cit9OworCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCx1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICh2b2lkKUMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6SW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgIDogbUluaXQoQzJfT0spLCBtQnVmZmVyUXVldWUoYnVmZmVyUXVldWUpIHsKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGFsbG9jYXRvcgorICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfSwgbWF4VXNhZ2UgPSB7IH4odWludDY0X3QpMCwgfih1aW50NjRfdCkwIH07CisgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmdyYWxsb2MiLCBpZCwgQzJBbGxvY2F0b3I6OkdSQVBISUMsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yOjpUcmFpdHM+KHRyYWl0cyk7CisKKyAgICAvLyBncmFsbG9jIGFsbG9jYXRvciBpcyBhIHNpbmdsZXRvbiwgc28gYWxsIG9iamVjdHMgc2hhcmUgYSBnbG9iYWwgc2VydmljZQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCk7CisgICAgbU1hcHBlciA9IElNYXBwZXI6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUFsbG9jYXRvciA9PSBudWxscHRyIHx8IG1NYXBwZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigiYWxsb2NhdGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAxdSwgIC8vIGxheWVyQ291bnQKKyAgICAgICAgICAgIChQaXhlbEZvcm1hdClmb3JtYXQsCisgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgIH0sCisgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBCdWZmZXJEZXNjcmlwdG9yIGRlc2M7CisgICAgbU1hcHBlci0+Y3JlYXRlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGluZm8ubWFwcGVySW5mbywgWyZlcnIsICZkZXNjXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBJQWxsb2NhdG9yIHNoYXJlcyBJTWFwcGVyIGVycm9yIGNvZGVzLgorICAgIGhpZGxfaGFuZGxlIGJ1ZmZlcjsKKyAgICBtQWxsb2NhdG9yLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAxdSwKKyAgICAgICAgICAgIFsmZXJyLCAmYnVmZmVyLCAmaW5mb10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZzdHJpZGUsIGF1dG8gJmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJzWzBdOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICBpbmZvLCBtTWFwcGVyLCBidWZmZXIsCisgICAgICAgICAgICBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWluZm8ubWFwcGVySW5mby5mb3JtYXQsIGluZm8ubWFwcGVySW5mby51c2FnZSwgaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1CdWZmZXJRdWV1ZSA/IH4wIDogMCksCisgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvOworICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBpZ2JwX2lkOworICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmdyYWxsb2NIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OkltcG9ydCgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQzMl90ICopJmluZm8ubWFwcGVySW5mby5mb3JtYXQsICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsICZpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgaWYgKGdyYWxsb2NIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGhpZGxfaGFuZGxlIGhpZGxIYW5kbGU7CisgICAgaGlkbEhhbmRsZS5zZXRUbyhDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShncmFsbG9jSGFuZGxlKSwgdHJ1ZSk7CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYyhpbmZvLCBtTWFwcGVyLCBoaWRsSGFuZGxlLCBncmFsbG9jSGFuZGxlLCBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICAgICAgOiBtSW1wbChuZXcgSW1wbChpZCwgYnVmZmVyUXVldWUpKSB7fQorCitDMkFsbG9jYXRvckdyYWxsb2M6On5DMkFsbG9jYXRvckdyYWxsb2MoKSB7IGRlbGV0ZSBtSW1wbDsgfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvckdyYWxsb2M6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SWQoKTsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0TmFtZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUcmFpdHMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZhYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvcklvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxpb24vaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworfQorCisvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50TG8oc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gaW50KHMgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRIaShzaXplX3QgcykgeworICAgIC8vIGNhc3QgdG8gdWludDY0X3QgYXMgc2l6ZV90IG1heSBiZSAzMiBiaXRzIHdpZGUKKyAgICByZXR1cm4gaW50KCh1aW50NjRfdChzKSA+PiAzMikgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBzaXplX3QgaW50czJzaXplKGludCBpbnRMbywgaW50IGludEhpKSB7CisgICAgLy8gY29udmVydCBpbiAyIHN0YWdlcyB0byA2NCBiaXRzIGFzIGludEhpIG1heSBiZSBuZWdhdGl2ZQorICAgIHJldHVybiBzaXplX3QodW5zaWduZWQoaW50TG8pKSB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChpbnRIaSkpIDw8IDMyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIElPTiBoYW5kbGUKKyAqCisgKiBUaGVyZSBjYW4gYmUgb25seSBhIHNvbGUgaW9uIGNsaWVudCBwZXIgcHJvY2VzcywgdGhpcyBpcyBjYXB0dXJlZCBpbiB0aGUgaW9uIGZkIHRoYXQgaXMgcGFzc2VkCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGlzIHNob3VsZCBiZSBtYW5hZ2VkIGJ5IHRoZSBpb24gYnVmZmVyIGFsbG9jYXRvci9tYXBwZXIuCisgKgorICogaW9uIHVzZXMgaW9uX3VzZXJfaGFuZGxlX3QgZm9yIGJ1ZmZlcnMuIFdlIGRvbid0IHN0b3JlIHRoaXMgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgYXMKKyAqIGl0IHJlcXVpcmVzIGFuIGlvbl9mcmVlIHRvIGRlY3JlZi4gSW5zdGVhZCwgd2Ugc2hhcmUgdGhlIGJ1ZmZlciB0byBnZXQgYW4gZmQgdGhhdCBhbHNvIGhvbGRzCisgKiBhIHJlZmNvdW50LgorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEgZ2xvYmFsIG11dGV4LgorICovCisKK3N0cnVjdCBDMkhhbmRsZUlvbiA6IHB1YmxpYyBDMkhhbmRsZSB7CisgICAgLy8gaW9uIGhhbmRsZSBvd25zIGlvbkZkKCEpIGFuZCBidWZmZXJGZAorICAgIEMySGFuZGxlSW9uKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKKyAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtQnVmZmVyOyAvLyBzaGFyZWQgaW9uIGJ1ZmZlcgorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgLy8gbG93IDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbVNpemVIaTsgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVJb24gX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvL2NvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVJb246OmNIZWFkZXIgPSB7CisgICAgQzJIYW5kbGVJb246OnZlcnNpb24sCisgICAgQzJIYW5kbGVJb246Om51bUZkcywKKyAgICBDMkhhbmRsZUlvbjo6bnVtSW50cywKKyAgICB7fQorfTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworICAgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KG8pOworICAgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworLy8gVE9ETzogaXMgdGhlIGR1cCBvZiBhbiBpb24gZmQgaWRlbnRpY2FsIHRvIGlvbl9zaGFyZT8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRpb25Jb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbklvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBJbXBsICptSW1wbDsKKworICAgIC8vIFRPRE86IHdlIGNvdWxkIG1ha2UgdGhpcyBlbmNhcHN1bGF0ZSBzaGFyZWRfcHRyIGFuZCBjb3BpYWJsZQorICAgIEMyX0RPX05PVF9DT1BZKEMyQWxsb2NhdGlvbklvbik7Cit9OworCitjbGFzcyBDMkFsbG9jYXRpb25Jb246OkltcGwgeworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gYnVmZmVyICAgIGlvbiBidWZmZXIgdXNlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGwoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBtSW9uRmQoaW9uRmQpLAorICAgICAgICAgIG1IYW5kbGUoYnVmZmVyRmQsIGNhcGFjaXR5KSwKKyAgICAgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW5pdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oZXJyKSksCisgICAgICAgICAgbU1hcEZkKC0xKSB7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgLy8gY2xvc2UgaW9uRmQgbm93IG9uIGVycm9yCisgICAgICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICAgICAgICAgIG1Jb25GZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyRmQgPCAwKTsKKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlciA8IDApOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBpbXBvcnRpbmcgYSBzaGFyZWQgYnVmZmVyIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGltcG9ydCBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIgPSAtMTsKKyAgICAgICAgaW50IHJldCA9IGlvbl9pbXBvcnQoaW9uRmQsIGJ1ZmZlckZkLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBhbGxvY2F0aW5nIGFuIGlvbiBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBhbGlnbiAgICAgZGVzaXJlZCBhbGlnbm1lbnQgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBoZWFwTWFzayAgbWFzayBvZiBoZWFwcyBjb25zaWRlcmVkCisgICAgICogXHBhcmFtIGZsYWdzICAgICBpb24gYWxsb2NhdGlvbiBmbGFncworICAgICAqCisgICAgICogXHJldHVybiBjcmVhdGVkIGlvbiBhbGxvY2F0aW9uIChpbXBsZW1lbnRhdGlvbikgd2hpY2ggbWF5IGJlIGludmFsaWQgaWYgdGhlCisgICAgICogYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkFsbG9jKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgICAgICBpbnQgYnVmZmVyRmQgPSAtMTsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIHNpemVfdCBhbGlnbmVkU2l6ZSA9IGFsaWduID09IDAgPyBzaXplIDogKHNpemUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworICAgICAgICBpbnQgcmV0ID0gaW9uX2FsbG9jKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlcik7CisgICAgICAgIEFMT0dWKCJpb25fYWxsb2MoaW9uRmQgPSAlZCwgc2l6ZSA9ICV6dSwgYWxpZ24gPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSA7IGJ1ZmZlciA9ICVkIiwKKyAgICAgICAgICAgICAgaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlcik7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlciBmZCBmb3IgbmF0aXZlIGhhbmRsZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgcmV0ID0gaW9uX3NoYXJlKGlvbkZkLCBidWZmZXIsICZidWZmZXJGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpb25fZnJlZShpb25GZCwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgICAgICAodm9pZClmZW5jZTsgLy8gVE9ETzogd2FpdCBmb3IgZmVuY2UKKyAgICAgICAgKmFkZHIgPSBudWxscHRyOworICAgICAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVigibXVsdGlwbGUgbWFwIik7CisgICAgICAgICAgICAvLyBUT0RPOiB0ZWNobmljYWxseSB3ZSBzaG91bGQgcmV0dXJuIERVUExJQ0FURSBoZXJlLCBidXQgb3VyIGJsb2NrIHZpZXdzIGRvbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSB1bm1hcCwgc28gd2UgZW5kIHVwIHJlbWFwcGluZyBhbiBpb24gYnVmZmVyIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwcm90ID0gUFJPVF9OT05FOworICAgICAgICBpbnQgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgeworICAgICAgICAgICAgcHJvdCB8PSBQUk9UX1JFQUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfV1JJVEU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXMgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisgICAgICAgIHNpemVfdCBtYXBPZmZzZXQgPSBvZmZzZXQgLSBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IG1hcFNpemUgPSBzaXplICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIE1hcHBpbmcgbWFwID0geyBudWxscHRyLCBhbGlnbm1lbnRCeXRlcywgbWFwU2l6ZSB9OworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICBpZiAobU1hcEZkID09IC0xKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gaW9uX21hcChtSW9uRmQsIG1CdWZmZXIsIG1hcFNpemUsIHByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbWFwT2Zmc2V0LCAodW5zaWduZWQgY2hhcioqKSZtYXAuYWRkciwgJm1NYXBGZCk7CisgICAgICAgICAgICBBTE9HVigiaW9uX21hcChpb25GZCA9ICVkLCBoYW5kbGUgPSAlZCwgc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAib2Zmc2V0ID0gJXp1KSByZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1hcE9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBtYXAuYWRkciA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPigtcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1hcC5hZGRyICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXAuYWRkciA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmIChtYXAuYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgbWFwLmFkZHIgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopbWFwLmFkZHIgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWFwLmFkZHIpIHsKKyAgICAgICAgICAgIG1NYXBwaW5ncy5wdXNoX2JhY2sobWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBpZiAobU1hcEZkIDwgMCB8fCBtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoInRyaWVkIHRvIHVubWFwIHVubWFwcGVkIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTWFwcGluZ3MuYmVnaW4oKTsgaXQgIT0gbU1hcHBpbmdzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoYWRkciAhPSAodWludDhfdCAqKWl0LT5hZGRyICsgaXQtPmFsaWdubWVudEJ5dGVzIHx8CisgICAgICAgICAgICAgICAgICAgIHNpemUgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgIT0gaXQtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBlcnIgPSBtdW5tYXAoaXQtPmFkZHIsIGl0LT5zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJtdW5tYXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsgLy8gbm90IHVzaW5nIGZlbmNlcworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpbU1hcHBpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgdW5tYXBwZWQ6ICVkIiwgbUJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInVubWFwIGZhaWxlZCB0byBmaW5kIHNwZWNpZmllZCBtYXAiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nICZtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICAodm9pZCltdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcEZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1NYXBGZCk7CisgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICh2b2lkKWlvbl9mcmVlKG1Jb25GZCwgbUJ1ZmZlcik7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1Jb25GZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1IYW5kbGU7CisgICAgfQorCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50IG1Jb25GZDsKKyAgICBDMkhhbmRsZUlvbiBtSGFuZGxlOworICAgIGlvbl91c2VyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUlkOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGludCBtTWFwRmQ7IC8vIG9ubHkgb25lIGZvciBub3cKKyAgICBzdHJ1Y3QgTWFwcGluZyB7CisgICAgICAgIHZvaWQgKmFkZHI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8TWFwcGluZz4gbU1hcHBpbmdzOworfTsKKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjptYXAoCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgIHJldHVybiBtSW1wbC0+bWFwKG9mZnNldCwgc2l6ZSwgdXNhZ2UsIGZlbmNlLCBhZGRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjp1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICByZXR1cm4gbUltcGwtPnVubWFwKGFkZHIsIHNpemUsIGZlbmNlKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0aW9uSW9uOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uSW9uOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgaWYgKCFvdGhlciB8fCBvdGhlci0+Z2V0QWxsb2NhdG9ySWQoKSAhPSBnZXRBbGxvY2F0b3JJZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gZ2V0IHVzZXIgaGFuZGxlIHRvIGNvbXBhcmUgb2JqZWN0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IG90aGVyQXNJb24gPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJBbGxvY2F0aW9uSW9uPihvdGhlcik7CisgICAgcmV0dXJuIG1JbXBsLT5pb25IYW5kbGUoKSA9PSBvdGhlckFzSW9uLT5tSW1wbC0+aW9uSGFuZGxlKCk7Cit9CisKK2NvbnN0IEMySGFuZGxlICpDMkFsbG9jYXRpb25Jb246OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRpb25Jb246On5DMkFsbG9jYXRpb25Jb24oKSB7CisgICAgZGVsZXRlIG1JbXBsOworfQorCitDMkFsbG9jYXRpb25Jb246OkMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6QWxsb2MoaW9uRmQsIHNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIGlkKSkgeyB9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwKKyAgICAgIG1JbXBsKEltcGw6OkltcG9ydChpb25GZCwgc2l6ZSwgc2hhcmVGZCwgaWQpKSB7IH0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0MyQWxsb2NhdG9ySW9uOjpDMkFsbG9jYXRvcklvbihpZF90IGlkKQorICAgIDogbUluaXQoQzJfT0spLAorICAgICAgbUlvbkZkKGlvbl9vcGVuKCkpIHsKKyAgICBpZiAobUlvbkZkIDwgMCkgeworICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgIGNhc2UgRU5PRU5UOiAgICBtSW5pdCA9IEMyX09NSVRURUQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgbUluaXQgPSBjMl9tYXBfZXJybm88RUFDQ0VTPihlcnJubyk7IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9OworICAgICAgICBDMk1lbW9yeVVzYWdlIG1heFVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5pb24iLCBpZCwgTElORUFSLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICAgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgICAgICBtQmxvY2tTaXplID0gOjpnZXRwYWdlc2l6ZSgpOworICAgIH0KK30KKworQzJBbGxvY2F0b3JJb246On5DMkFsbG9jYXRvcklvbigpIHsKKyAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgaW9uX2Nsb3NlKG1Jb25GZCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvcklvbjo6Z2V0SWQoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworfQorCitDMlN0cmluZyBDMkFsbG9jYXRvcklvbjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyQWxsb2NhdG9ySW9uOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK3ZvaWQgQzJBbGxvY2F0b3JJb246OnNldFVzYWdlTWFwcGVyKAorICAgICAgICBjb25zdCBVc2FnZU1hcHBlckZuICZtYXBwZXIsIHVpbnQ2NF90IG1pblVzYWdlLCB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgbVVzYWdlTWFwcGVyQ2FjaGUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXJMcnUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXIgPSBtYXBwZXI7CisgICAgVHJhaXRzIHRyYWl0cyA9IHsKKyAgICAgICAgbVRyYWl0cy0+bmFtZSwgbVRyYWl0cy0+aWQsIExJTkVBUiwKKyAgICAgICAgQzJNZW1vcnlVc2FnZShtaW5Vc2FnZSksIEMyTWVtb3J5VXNhZ2UobWF4VXNhZ2UpCisgICAgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKK30KKworc3RkOjpzaXplX3QgQzJBbGxvY2F0b3JJb246Ok1hcHBlcktleUhhc2g6Om9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICZrKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShrLmZpcnN0KSBeIHN0ZDo6aGFzaDxzaXplX3Q+e30oay5zZWNvbmQpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bWFwVXNhZ2UoCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAvLyBhbGlnbiBjYXBhY2l0eQorICAgIGNhcGFjaXR5ID0gKGNhcGFjaXR5ICsgbUJsb2NrU2l6ZSAtIDEpICYgfihtQmxvY2tTaXplIC0gMSk7CisgICAgTWFwcGVyS2V5IGtleSA9IHN0ZDo6bWFrZV9wYWlyKHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgYXV0byBlbnRyeSA9IG1Vc2FnZU1hcHBlckNhY2hlLmZpbmQoa2V5KTsKKyAgICBpZiAoZW50cnkgPT0gbVVzYWdlTWFwcGVyQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlcikgeworICAgICAgICAgICAgcmVzID0gbVVzYWdlTWFwcGVyKHVzYWdlLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYWxpZ24gPSAwOyAvLyBUT0RPIG1ha2UgdGhpcyAxCisgICAgICAgICAgICAqaGVhcE1hc2sgPSB+MDsgLy8gZGVmYXVsdCBtYXNrCisgICAgICAgICAgICAqZmxhZ3MgPSAwOyAvLyBkZWZhdWx0IGZsYWdzCisgICAgICAgICAgICByZXMgPSBDMl9OT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB1c2FnZSB0byBjYWNoZQorICAgICAgICBNYXBwZXJWYWx1ZSB2YWx1ZSA9IHN0ZDo6bWFrZV90dXBsZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpOworICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuZW1wbGFjZV9mcm9udChrZXksIHZhbHVlKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZW1wbGFjZShzdGQ6Om1ha2VfcGFpcihrZXksIG1Vc2FnZU1hcHBlckxydS5iZWdpbigpKSk7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXJDYWNoZS5zaXplKCkgPiBVU0FHRV9MUlVfQ0FDSEVfU0laRSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIExSVSBlbnRyeQorICAgICAgICAgICAgTWFwcGVyS2V5IGxydUtleSA9IG1Vc2FnZU1hcHBlckxydS5mcm9udCgpLmZpcnN0OworICAgICAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZXJhc2UobHJ1S2V5KTsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckxydS5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW92ZSBlbnRyeSB0byBNUlUKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnNwbGljZShtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSwgbVVzYWdlTWFwcGVyTHJ1LCBlbnRyeS0+c2Vjb25kKTsKKyAgICAgICAgY29uc3QgTWFwcGVyVmFsdWUgJnZhbHVlID0gZW50cnktPnNlY29uZC0+c2Vjb25kOworICAgICAgICBzdGQ6OnRpZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBpZiAoYWxsb2NhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYWxsb2NhdGlvbi0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHNpemVfdCBhbGlnbiA9IDA7CisgICAgdW5zaWduZWQgaGVhcE1hc2sgPSB+MDsKKyAgICB1bnNpZ25lZCBmbGFncyA9IDA7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gbWFwVXNhZ2UodXNhZ2UsIGNhcGFjaXR5LCAmYWxpZ24sICZoZWFwTWFzaywgJmZsYWdzKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSBDMl9OT19JTklUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gYWxsb2MKKyAgICAgICAgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdGlvbklvbj4oZHVwKG1Jb25GZCksIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCBtVHJhaXRzLT5pZCk7CisgICAgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBpZiAoIUMySGFuZGxlSW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBnZXQgY2FwYWNpdHkgYW5kIHZhbGlkYXRlIGl0CisgICAgY29uc3QgQzJIYW5kbGVJb24gKmggPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KGhhbmRsZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gYWxsb2MKKyAgICAgICAgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdGlvbklvbj4oZHVwKG1Jb25GZCksIGgtPnNpemUoKSwgaC0+YnVmZmVyRmQoKSwgbVRyYWl0cy0+aWQpOworICAgIGMyX3N0YXR1c190IHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVJb246OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGI1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKworbmFtZXNwYWNlIHsKKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlclBvb2xBbGxvY2F0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SU5WQUxJRF9DT05ORUNUSU9OSUQ7CisKKy8vIFRoaXMgYW5vbnltb3VzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgaGVscGVyIGNsYXNzZXMgdGhhdCBhbGxvdyBvdXIgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlCisvLyBibG9jay9idWZmZXIgb2JqZWN0cy4KKy8vCisvLyBJbmhlcml0IGZyb20gdGhlIHBhcmVudCwgc2hhcmUgd2l0aCB0aGUgZnJpZW5kLgorY2xhc3MgUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMlJlYWRWaWV3IHsKKyAgICB1c2luZyBDMlJlYWRWaWV3OjpDMlJlYWRWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIFdyaXRlVmlld0J1ZGR5IDogcHVibGljIEMyV3JpdGVWaWV3IHsKKyAgICB1c2luZyBDMldyaXRlVmlldzo6QzJXcml0ZVZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkNvbnN0TGluZWFyQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBMaW5lYXJCbG9ja0J1ZGR5IDogcHVibGljIEMyTGluZWFyQmxvY2sgeworICAgIHVzaW5nIEMyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCYXNpY0xpbmVhckJsb2NrUG9vbDsKK307CisKK2NsYXNzIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdExpbmVhckJsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyR3JhcGhpY1ZpZXcgeworICAgIHVzaW5nIEMyR3JhcGhpY1ZpZXc6OkMyR3JhcGhpY1ZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVDb25zdEdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZUdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdEdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJDb25zdEdyYXBoaWNCbG9jazo6QzJDb25zdEdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyR3JhcGhpY0Jsb2NrIHsKKyAgICB1c2luZyBDMkdyYXBoaWNCbG9jazo6QzJHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBCdWZmZXJEYXRhQnVkZHkgOiBwdWJsaWMgQzJCdWZmZXJEYXRhIHsKKyAgICB1c2luZyBDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJ1ZmZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gMUQgQkxPQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgMUQgYmxvY2sgYW5kIHZpZXcgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHVuZGVybHlpbmcgMUQgYWxsb2NhdGlvbiBhbmQgdGhlIHJhbmdlIG9mIHRoZQorICogYWxsb3RlZCBwb3J0aW9uIHRvIHRoaXMgYmxvY2suIFRoZXJlIGlzIGFsc28gYSBwbGFjZWhvbGRlciBmb3IgYSBibG9ja3Bvb2wgZGF0YS4KKyAqLworY2xhc3MgQzJfSElERSBfQzJCbG9jazFESW1wbCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgX0MyQmxvY2sxREltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGFsbG9jLmdldCgpLCBvZmZzZXQsIHNpemUpLAorICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwKKyAgICAgICAgICBtUG9vbERhdGEocG9vbERhdGEpIHsgfQorCisgICAgX0MyQmxvY2sxREltcGwoY29uc3QgX0MyQmxvY2sxREltcGwgJm90aGVyLCBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZvdGhlciwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihvdGhlci5tQWxsb2NhdGlvbiksCisgICAgICAgICAgbVBvb2xEYXRhKG90aGVyLm1Qb29sRGF0YSkgeyB9CisKKyAgICAvKiogcmV0dXJucyBwb29sIGRhdGEgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IHBvb2xEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvb2xEYXRhOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIG5hdGl2ZSBoYW5kbGUgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+aGFuZGxlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICAvLyBCQURfSUQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoaXMgSW1wbCBjbGFzcyBpcyBpbml0aWFsaXplZCBmb3IgYSB2aWV3IC0gbmV2ZXIgZm9yIGEgYmxvY2suCisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5nZXRBbGxvY2F0b3JJZCgpIDogQzJBbGxvY2F0b3I6OkJBRF9JRDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBnZXRBbGxvY2F0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGE7Cit9OworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1hcHBlZCBkYXRhIHBvaW50ZXIsIGFuZCB0aGUgcG90ZW50aWFsIGVycm9yLgorICoKKyAqIHJhbmdlIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiAod2hpY2ggaXMgcGFydCBvZiB0aGUgYWxsb3R0ZWQKKyAqIHJhbmdlKS4KKyAqLworY2xhc3MgQzJfSElERSBfQzJNYXBwZWRCbG9jazFESW1wbCA6IHB1YmxpYyBfQzJCbG9jazFESW1wbCB7CitwdWJsaWM6CisgICAgX0MyTWFwcGVkQmxvY2sxREltcGwoY29uc3QgX0MyQmxvY2sxREltcGwgJmJsb2NrLCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyQmxvY2sxREltcGwoYmxvY2ssIG9mZnNldCwgc2l6ZSksIG1EYXRhKGRhdGEpLCBtRXJyb3IoQzJfT0spIHsgfQorCisgICAgX0MyTWFwcGVkQmxvY2sxREltcGwoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgICAgIDogX0MyQmxvY2sxREltcGwobnVsbHB0ciksIG1EYXRhKG51bGxwdHIpLCBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhKCkgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRXJyb3I7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKm1EYXRhOworICAgIGMyX3N0YXR1c190IG1FcnJvcjsKK307CisKKy8qKgorICogQmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyQmxvY2sxRDo6SW1wbCA6IHB1YmxpYyBfQzJCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyQmxvY2sxREltcGw6Ol9DMkJsb2NrMURJbXBsOworfTsKKworY29uc3QgQzJIYW5kbGUgKkMyQmxvY2sxRDo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9OworCitDMkFsbG9jYXRvcjo6aWRfdCBDMkJsb2NrMUQ6OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK307CisKK0MyQmxvY2sxRDo6QzJCbG9jazFEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UpCisgICAgLy8gYWx3YXlzIGNsYW1wIHN1YnJhbmdlIHRvIHBhcmVudCAoaW1wbCkgcmFuZ2UgZm9yIHNhZmV0eQorICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoaW1wbC5nZXQoKSwgcmFuZ2Uub2Zmc2V0KCksIHJhbmdlLnNpemUoKSksIG1JbXBsKGltcGwpIHsKK30KKworLyoqCisgKiBSZWFkIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKgorICogcmFuZ2Ugb2YgSW1wbCBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuIHJhbmdlIG9mIFZpZXcgaXMgMCB0byBjYXBhY2l0eSgpIChub3QgcmVwcmVzZW50ZWQgYXMgYW4gYWN0dWFsIHJhbmdlKS4gVGhpcyBtYXBzIHRvIGEKKyAqIHN1YnJhbmdlIG9mIEltcGwgcmFuZ2Ugc3RhcnRpbmcgYXQgbUltcGwtPm9mZnNldCgpICsgX21PZmZzZXQuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyUmVhZFZpZXc6OkMyUmVhZFZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLnNpemUoKSksCisgICAgICBtSW1wbChpbXBsKSwKKyAgICAgIG1PZmZzZXQoQzJMaW5lYXJDYXBhY2l0eShpbXBsLT5zaXplKCkpLnJhbmdlKG9mZnNldCwgc2l6ZSkub2Zmc2V0KCkpIHsgfQorCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKQorICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoMHUpLCBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGVycm9yKSksIG1PZmZzZXQoMHUpIHsKKyAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7Cit9CisKK2NvbnN0IHVpbnQ4X3QgKkMyUmVhZFZpZXc6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpID8gbnVsbHB0ciA6IG1JbXBsLT5kYXRhKCkgKyBtT2Zmc2V0OworfQorCitjMl9zdGF0dXNfdCBDMlJlYWRWaWV3OjplcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVycm9yKCk7Cit9CisKK0MyUmVhZFZpZXcgQzJSZWFkVmlldzo6c3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgIEMyTGluZWFyUmFuZ2Ugc3ViUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIEMyUmVhZFZpZXcobUltcGwsIG1PZmZzZXQgKyBzdWJSYW5nZS5vZmZzZXQoKSwgc3ViUmFuZ2Uuc2l6ZSgpKTsKK30KKworLyoqCisgKiBXcml0ZSB2aWV3IGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMldyaXRlVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2sxREltcGw6Ol9DMk1hcHBlZEJsb2NrMURJbXBsOworfTsKKworQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorLy8gVUdMWTogX0MyTGluZWFyUmFuZ2VBc3BlY3QgcmVxdWlyZXMgYSBib25hLWZpZGUgb2JqZWN0IGZvciBjYXBhY2l0eSB0byBwcmV2ZW50IHNwb29maW5nLCBzbworLy8gdGhpcyBpcyB3aGF0IHdlIGhhdmUgdG8gZG8uCisvLyBUT0RPOiB1c2UgY2hpbGRSYW5nZQorICAgIDogX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdChzdGQ6Om1ha2VfdW5pcXVlPEMyTGluZWFyQ2FwYWNpdHk+KGltcGwtPnNpemUoKSkuZ2V0KCkpLCBtSW1wbChpbXBsKSB7IH0KKworQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3KGMyX3N0YXR1c190IGVycm9yKQorICAgIDogX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdChudWxscHRyKSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpIHt9CisKK3VpbnQ4X3QgKkMyV3JpdGVWaWV3OjpiYXNlKCkgeyByZXR1cm4gbUltcGwtPmRhdGEoKTsgfQorCit1aW50OF90ICpDMldyaXRlVmlldzo6ZGF0YSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCkgKyBvZmZzZXQoKTsgfQorCitjMl9zdGF0dXNfdCBDMldyaXRlVmlldzo6ZXJyb3IoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZXJyb3IoKTsgfQorCisvKioKKyAqIENvbnN0IGxpbmVhciBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJDb25zdExpbmVhckJsb2NrOjpDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBmZW5jZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSksIG1GZW5jZShmZW5jZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBDMkNvbnN0TGluZWFyQmxvY2s6Om1hcCgpIGNvbnN0IHsKKyAgICB2b2lkICpiYXNlID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsZW4gPSBzaXplKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICBvZmZzZXQoKSwgbGVuLCB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCAwIH0sIG51bGxwdHIsICZiYXNlKTsKKyAgICAvLyBUT0RPOiB3YWl0IG9uIGZlbmNlCisgICAgaWYgKGVycm9yID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZWFkVmlld0J1ZGR5OjpJbXBsPiBydmkgPSBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFJlYWRWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCAodWludDhfdCAqKWJhc2UsIG9mZnNldCgpLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFJlYWRWaWV3QnVkZHk6OkltcGwgKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpaS0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChiYXNlLCBsZW4sIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KHJ2aSwgMCwgbGVuKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFJlYWRWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkNvbnN0TGluZWFyQmxvY2s6OnN1YkJsb2NrKHNpemVfdCBvZmZzZXRfLCBzaXplX3Qgc2l6ZV8pIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCptSW1wbCwgb2Zmc2V0Xywgc2l6ZV8pOworICAgIHJldHVybiBDMkNvbnN0TGluZWFyQmxvY2sobUltcGwsIHN1YlJhbmdlLCBtRmVuY2UpOworfQorCisvKioKKyAqIExpbmVhciBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJMaW5lYXJCbG9jazo6QzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIDogQzJCbG9jazFEKGltcGwsIHJhbmdlKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiBDMkxpbmVhckJsb2NrOjptYXAoKSB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sIG51bGxwdHIsICZiYXNlKTsKKyAgICAvLyBUT0RPOiB3YWl0IG9uIGZlbmNlCisgICAgaWYgKGVycm9yID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFdyaXRlVmlld0J1ZGR5OjpJbXBsPigKKyAgICAgICAgICAgICAgICBuZXcgV3JpdGVWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCAodWludDhfdCAqKWJhc2UsIDAsIGxlbiksCisgICAgICAgICAgICAgICAgW2Jhc2UsIGxlbl0oV3JpdGVWaWV3QnVkZHk6OkltcGwgKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpaS0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChiYXNlLCBsZW4sIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkocnZpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBXcml0ZVZpZXdCdWRkeShlcnJvcikpOworICAgIH0KK30KKworQzJDb25zdExpbmVhckJsb2NrIEMyTGluZWFyQmxvY2s6OnNoYXJlKHNpemVfdCBvZmZzZXRfLCBzaXplX3Qgc2l6ZV8sIEMyRmVuY2UgZmVuY2UpIHsKKyAgICByZXR1cm4gQ29uc3RMaW5lYXJCbG9ja0J1ZGR5KG1JbXBsLCBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXRfLCBzaXplXyksIGZlbmNlKTsKK30KKworQzJCYXNpY0xpbmVhckJsb2NrUG9vbDo6QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7IH0KKworYzJfc3RhdHVzX3QgQzJCYXNpY0xpbmVhckJsb2NrUG9vbDo6ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGJsb2NrLT5yZXNldCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbihjYXBhY2l0eSwgdXNhZ2UsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdHJ1Y3QgQzJfSElERSBDMlBvb2xlZEJsb2NrUG9vbERhdGEgOiBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlBPT0w7CisgICAgfQorCisgICAgdm9pZCBnZXRCdWZmZXJQb29sRGF0YShzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpkYXRhKSBjb25zdCB7CisgICAgICAgICpkYXRhID0gbURhdGE7CisgICAgfQorCisgICAgQzJQb29sZWRCbG9ja1Bvb2xEYXRhKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIDogbURhdGEoZGF0YSkge30KKworICAgIHZpcnR1YWwgfkMyUG9vbGVkQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlIHt9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtRGF0YTsKK307CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXJQb29sRGF0YSkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0wpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICBwb29sRGF0YS0+Z2V0QnVmZmVyUG9vbERhdGEoYnVmZmVyUG9vbERhdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2sxRDo6SW1wbD4gaW1wbCA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCbG9jazFEOjpJbXBsPihhbGxvYywgZGF0YSwgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+KG5ldyBDMkxpbmVhckJsb2NrKGltcGwsICppbXBsKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEoCisgICAgICAgIGNvbnN0IEMyQmxvY2sxRCAmYmxvY2spIHsKKyAgICBpZiAoYmxvY2subUltcGwpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLm1JbXBsLT5wb29sRGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JJb24+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9ySW9uPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MpOworICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JJb24+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9ySW9uPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgcGFyYW1zPworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKworLyoqCisgKiBXcmFwcGVkIEMyQWxsb2NhdG9yIHdoaWNoIGlzIGluamVjdGVkIHRvIGJ1ZmZlciBwb29sIG9uIGJlaGFsZiBvZgorICogQzJCbG9ja1Bvb2wuCisgKi8KK2NsYXNzIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKKyAgICB+X0MyQnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICAgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgZm9yIGNvZGVjMiBjb21wb25lbnQgKEMyQmxvY2tQb29sKS4KKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGxpbmVhciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIEMyQWxsb2NhdG9yIHRvIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkgICAgICBzaXplIG9mIGxpbmVhciBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHVzYWdlICAgICAgICAgbWVtb3J5IHVzYWdlIHBhdHRlcm4gZm9yIGxpbmVhciBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBidWZmZXIgcG9vbAorICAgICAqLworICAgIHZvaWQgZ2V0TGluZWFyUGFyYW1zKHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBncmFwaGljIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCAgICAgICAgIHdpZHRoIG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBoZWlnaHQgICAgICAgIGhlaWdodCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZm9ybWF0ICAgICAgICBjb2xvciBmb3JtYXQgb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXIgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRHcmFwaGljUGFyYW1zKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYW4gQzJMaW5lYXJBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckxpbmVhckFsbG9jYXRpb24KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYW4gQzJHcmFwaGljQWxsY2F0aW9uLgorICAgICAqIFdyYXBwZXIgdG8gQzJBbGxvY2F0b3IjcHJpb3JHcmFwaGljQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhJbnRQYXJhbXMgPSA1OyAvLyBsYXJnZSBlbm91Z2ggbnVtYmVyOworCisgICAgZW51bSBBbGxvY1R5cGUgOiB1aW50OF90IHsKKyAgICAgICAgQUxMT0NfTk9ORSA9IDAsCisKKyAgICAgICAgQUxMT0NfTElORUFSLAorICAgICAgICBBTExPQ19HUkFQSElDLAorICAgIH07CisKKyAgICB1bmlvbiBBbGxvY1BhcmFtcyB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBBbGxvY1R5cGUgYWxsb2NUeXBlOworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZTsKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtc1trTWF4SW50UGFyYW1zXTsKKyAgICAgICAgfSBkYXRhOworICAgICAgICB1aW50OF90IGFycmF5WzBdOworCisgICAgICAgIEFsbG9jUGFyYW1zKCkgOiBkYXRhe0FMTE9DX05PTkUsIHswLCAwfSwgezB9fSB7fQorICAgICAgICBBbGxvY1BhcmFtcyhDMk1lbW9yeVVzYWdlIHVzYWdlLCB1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgICAgICAgIDogZGF0YXtBTExPQ19MSU5FQVIsIHVzYWdlLCB7WzBdID0gY2FwYWNpdHl9fSB7fQorICAgICAgICBBbGxvY1BhcmFtcygKKyAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCkKKyAgICAgICAgICAgICAgICA6IGRhdGF7QUxMT0NfR1JBUEhJQywgdXNhZ2UsIHt3aWR0aCwgaGVpZ2h0LCBmb3JtYXR9fSB7fQorICAgIH07CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitzdHJ1Y3QgTGluZWFyQWxsb2NhdGlvbkR0b3IgeworICAgIExpbmVhckFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworfTsKKworc3RydWN0IEdyYXBoaWNBbGxvY2F0aW9uRHRvciB7CisgICAgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MpCisgICAgICAgIDogbUFsbG9jYXRpb24oYWxsb2MpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitSZXN1bHRTdGF0dXMgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmcGFyYW1zLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtczsKKyAgICBtZW1jcHkoJmMyUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfQkFEX1ZBTFVFOworICAgIHN3aXRjaChjMlBhcmFtcy5kYXRhLmFsbG9jVHlwZSkgeworICAgICAgICBjYXNlIEFMTE9DX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19MSU5FQVI6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGMyTGluZWFyOworICAgICAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sIGMyUGFyYW1zLmRhdGEudXNhZ2UsICZjMkxpbmVhcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyTGluZWFyKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihjMkxpbmVhci0+aGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIExpbmVhckFsbG9jYXRpb25EdG9yKGMyTGluZWFyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY1NpemUgPSAoc2l6ZV90KWMyUGFyYW1zLmRhdGEucGFyYW1zWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBTExPQ19HUkFQSElDOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYzJHcmFwaGljOworICAgICAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMl0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEudXNhZ2UsICZjMkdyYXBoaWMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBjMkdyYXBoaWMpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyR3JhcGhpYy0+aGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIEdyYXBoaWNBbGxvY2F0aW9uRHRvcihjMkdyYXBoaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdICogYzJQYXJhbXMuZGF0YS5wYXJhbXNbMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmbmV3UGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJm9sZFBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIG5ld0FsbG9jOworICAgIEFsbG9jUGFyYW1zIG9sZEFsbG9jOworICAgIG1lbWNweSgmbmV3QWxsb2MsIG5ld1BhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG5ld1BhcmFtcy5zaXplKCkpKTsKKyAgICBtZW1jcHkoJm9sZEFsbG9jLCBvbGRQYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBvbGRQYXJhbXMuc2l6ZSgpKSk7CisKKyAgICAvLyBUT0RPOiBzdXBwb3J0IG5vdCBleGFjdCBtYXRjaGluZy4gZS5nKSBuZXdDYXBhY2l0eSA8IG9sZENhcGFjaXR5CisgICAgaWYgKG5ld0FsbG9jLmRhdGEuYWxsb2NUeXBlID09IG9sZEFsbG9jLmRhdGEuYWxsb2NUeXBlICYmCisgICAgICAgICAgICBuZXdBbGxvYy5kYXRhLnVzYWdlLmV4cGVjdGVkID09IG9sZEFsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4SW50UGFyYW1zOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChuZXdBbGxvYy5kYXRhLnBhcmFtc1tpXSAhPSBvbGRBbGxvYy5kYXRhLnBhcmFtc1tpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmdldExpbmVhclBhcmFtcygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtcyh1c2FnZSwgY2FwYWNpdHkpOworICAgIHBhcmFtcy0+YXNzaWduKGMyUGFyYW1zLmFycmF5LCBjMlBhcmFtcy5hcnJheSArIHNpemVvZihBbGxvY1BhcmFtcykpOworfQorCit2b2lkIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmdldEdyYXBoaWNQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworICAgIHBhcmFtcy0+YXNzaWduKGMyUGFyYW1zLmFycmF5LCBjMlBhcmFtcy5hcnJheSArIHNpemVvZihBbGxvY1BhcmFtcykpOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGMyQWxsb2NhdGlvbik7Cit9CisKK2NsYXNzIEMyUG9vbGVkQmxvY2tQb29sOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgICAgIDogbUluaXQoQzJfT0spLAorICAgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXIoQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSksCisgICAgICAgICAgICAgIG1BbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxfQzJCdWZmZXJQb29sQWxsb2NhdG9yPihhbGxvY2F0b3IpKSB7CisgICAgICAgIGlmIChtQWxsb2NhdG9yICYmIG1CdWZmZXJQb29sTWFuYWdlcikgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJQb29sTWFuYWdlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCkgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5pdCA9IEMyX05PX0lOSVQ7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICAgICAgbUJ1ZmZlclBvb2xNYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRMaW5lYXJQYXJhbXMoY2FwYWNpdHksIHVzYWdlLCAmcGFyYW1zKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJQb29sRGF0YTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1CdWZmZXJQb29sTWFuYWdlci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgcGFyYW1zLCAmY0hhbmRsZSwgJmJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEgJiYgYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEsIDAsIGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICAgICAgbUFsbG9jYXRvci0+Z2V0R3JhcGhpY1BhcmFtcyh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmcGFyYW1zKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJQb29sRGF0YTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1CdWZmZXJQb29sTWFuYWdlci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgcGFyYW1zLCAmY0hhbmRsZSwgJmJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEgJiYgYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2MsIHBvb2xEYXRhLCBDMlJlY3Qod2lkdGgsIGhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUluaXQgIT0gQzJfT0sgPyBJTlZBTElEX0NPTk5FQ1RJT05JRCA6IG1Db25uZWN0aW9uSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1CdWZmZXJQb29sTWFuYWdlcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsgLy8gbG9jYWxseQorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworQzJQb29sZWRCbG9ja1Bvb2w6OkMyUG9vbGVkQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMlBvb2xlZEJsb2NrUG9vbDo6fkMyUG9vbGVkQmxvY2tQb29sKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworaW50NjRfdCBDMlBvb2xlZEJsb2NrUG9vbDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDJEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgMkQgYmxvY2tzIGFuZCB2aWV3cy4KKyAqCisgKiBGb3IgYmxvY2tzJyBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIGFsbG90dGVkIGNyb3AsIGV2ZW4gaWYgaXQgaXMgYSBzdWIgYmxvY2suCisgKgorICogRm9yIHZpZXdzJyBJbXBsJ3MgY3JvcCBpcyB0aGUgbWFwcGVkIHBvcnRpb24gLSB3aGljaCBmb3Igbm93IGlzIGFsd2F5cyB0aGUKKyAqIGFsbG90dGVkIGNyb3AuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2syREltcGwgOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBvciBwYXJ0IG9mIHRoZSBhbGxvdHRlZCBjcm9wIG9mIHRoZSBhbGxvY2F0aW9uLgorICAgICAqLworICAgIF9DMkJsb2NrMkRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGFsbG9jLmdldCgpLCBhbGxvdHRlZENyb3ApLAorICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwKKyAgICAgICAgICBtUG9vbERhdGEocG9vbERhdGEpIHsgfQorCisgICAgdmlydHVhbCB+X0MyQmxvY2syREltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogcmV0dXJucyBwb29sIGRhdGEgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IHBvb2xEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvb2xEYXRhOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIG5hdGl2ZSBoYW5kbGUgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+aGFuZGxlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICAvLyBCQURfSUQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoaXMgSW1wbCBjbGFzcyBpcyBpbml0aWFsaXplZCBmb3IgYSB2aWV3IC0gbmV2ZXIgZm9yIGEgYmxvY2suCisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5nZXRBbGxvY2F0b3JJZCgpIDogQzJBbGxvY2F0b3I6OkJBRF9JRDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsCisgICAgOiBwdWJsaWMgX0MyQmxvY2syREltcGwsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9DMk1hcHBpbmdCbG9jazJESW1wbD4geworcHVibGljOgorICAgIHVzaW5nIF9DMkJsb2NrMkRJbXBsOjpfQzJCbG9jazJESW1wbDsKKworICAgIHZpcnR1YWwgfl9DMk1hcHBpbmdCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1hcHBlZCBkYXRhIHBvaW50ZXIsIGFuZCB0aGUgcG90ZW50aWFsIGVycm9yLgorICAgICAqLworICAgIHN0cnVjdCBNYXBwZWQgeworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBfQzJNYXBwaW5nQmxvY2syREltcGw7CisKKyAgICAgICAgTWFwcGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gJmltcGwsIGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlIF9fdW51c2VkKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSwgbVdyaXRhYmxlKHdyaXRhYmxlKSB7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgY29uc3QgQzJSZWN0IGNyb3AgPSBtSW1wbC0+Y3JvcCgpOworICAgICAgICAgICAgLy8gZ3JhbGxvYyByZXF1aXJlcyBtYXBwaW5nIHRoZSB3aG9sZSByZWdpb24gb2YgaW50ZXJlc3QgYXMgd2UgY2Fubm90CisgICAgICAgICAgICAvLyBtYXAgbXVsdGlwbGUgcmVnaW9ucworICAgICAgICAgICAgbUVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgICAgICAgICBjcm9wLAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCB3cml0YWJsZSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDAgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgJm1MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgIG1EYXRhKTsKKyAgICAgICAgICAgIGlmIChtRXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBwbGFuZSBsYXlvdXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGRhdGEgcG9pbnRlcnMgdG8gdGhlIGNyb3AgcmVnaW9uJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAgICAgICAgICAgIC8vIGZhaWwgaWYgaXQgaXMgbm90IG9uIGEgc3Vic2FtcGxpbmcgYm91bmRhcnkKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBwbGFuZUl4ID0gMDsgcGxhbmVJeCA8IG1MYXlvdXQubnVtUGxhbmVzOyArK3BsYW5lSXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY29sU2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgcm93U2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3AubGVmdCAlIGNvbFNhbXBsaW5nIHx8IGNyb3AucmlnaHQoKSAlIGNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3JvcC50b3AgJSByb3dTYW1wbGluZyB8fCBjcm9wLmJvdHRvbSgpICUgcm93U2FtcGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjYWxjdWxhdGUgZGF0YSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgY3JvcCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FcnJvciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0RGF0YVtwbGFuZUl4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVtwbGFuZUl4XSArIChzc2l6ZV90KWNyb3AubGVmdCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbEluYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzc2l6ZV90KWNyb3AudG9wICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93SW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cGxpY2l0IE1hcHBlZChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgICAgIDogbUltcGwobnVsbHB0ciksIG1Xcml0YWJsZShmYWxzZSksIG1FcnJvcihlcnJvcikgeworICAgICAgICAgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgfk1hcHBlZCgpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YVswXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIG1JbXBsLT5jcm9wKCksIG51bGxwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgbWFwcGluZyBzdGF0dXMgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdCB7IHJldHVybiBtRXJyb3I7IH0KKworICAgICAgICAvKiogcmV0dXJucyBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0RGF0YTsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHRoZSBwbGFuZSBsYXlvdXQgKi8KKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbUxheW91dDsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgd3JpdGFibGUgKi8KKyAgICAgICAgYm9vbCB3cml0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1Xcml0YWJsZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiBtSW1wbDsKKyAgICAgICAgYm9vbCBtV3JpdGFibGU7CisgICAgICAgIGMyX3N0YXR1c190IG1FcnJvcjsKKyAgICAgICAgdWludDhfdCAqbURhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgdWludDhfdCAqbU9mZnNldERhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbUxheW91dDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogTWFwcyB0aGUgYWxsb3R0ZWQgcmVnaW9uLgorICAgICAqCisgICAgICogSWYgYWxyZWFkeSBtYXBwZWQgYW5kIGl0IGlzIGN1cnJlbnRseSBpbiB1c2UsIHJldHVybnMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuCisgICAgICogSWYgZmVuY2UgaXMgcHJvdmlkZWQsIGFuIGFjcXVpcmUgZmVuY2UgaXMgc3RvcmVkIHRoZXJlLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IG1hcChib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IGV4aXN0aW5nID0gbU1hcHBlZC5sb2NrKCk7CisgICAgICAgIGlmICghZXhpc3RpbmcpIHsKKyAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChzaGFyZWRfZnJvbV90aGlzKCksIHdyaXRhYmxlLCBmZW5jZSkpOworICAgICAgICAgICAgbU1hcHBlZCA9IGV4aXN0aW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgd2UgbWFwcGVkIHRoZSByZWdpb24gcmVhZC1vbmx5LCB3ZSBjYW5ub3QgcmVtYXAgaXQgcmVhZC13cml0ZQorICAgICAgICAgICAgaWYgKHdyaXRhYmxlICYmICFleGlzdGluZy0+d3JpdGFibGUoKSkgeworICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChDMl9DQU5OT1RfRE8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleGlzdGluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp3ZWFrX3B0cjxNYXBwZWQ+IG1NYXBwZWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2syREltcGwgOiBwdWJsaWMgX0MyQmxvY2syREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMkRJbXBsKGNvbnN0IF9DMkJsb2NrMkRJbXBsICZpbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZykKKyAgICAgICAgOiBfQzJCbG9jazJESW1wbChpbXBsKSwgbU1hcHBpbmcobWFwcGluZykgeworICAgIH0KKworICAgIHZpcnR1YWwgfl9DMk1hcHBlZEJsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKCkgY29uc3QgeyByZXR1cm4gbU1hcHBpbmc7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1NYXBwaW5nOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazJEOjpJbXBsIDogcHVibGljIF9DMk1hcHBpbmdCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpfQzJNYXBwaW5nQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMkQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkJsb2NrMkQ6OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworQzJCbG9jazJEOjpDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgLy8gYWx3YXlzIGNsYW1wIHN1YnNlY3Rpb24gdG8gcGFyZW50IChpbXBsKSBjcm9wIGZvciBzYWZldHkKKyAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogR3JhcGhpYyB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uLiByYW5nZSBvZiBWaWV3IGlzIHRoZSBjdXJyZW50CisgKiBjcm9wLgorICovCitjbGFzcyBDMkdyYXBoaWNWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazJESW1wbDo6X0MyTWFwcGVkQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK0MyR3JhcGhpY1ZpZXc6OkMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKK2NvbnN0IHVpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK3VpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK2NvbnN0IEMyUGxhbmFyTGF5b3V0IEMyR3JhcGhpY1ZpZXc6OmxheW91dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+bGF5b3V0KCk7Cit9CisKK2NvbnN0IEMyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworYzJfc3RhdHVzX3QgQzJHcmFwaGljVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmVycm9yKCk7Cit9CisKKy8qKgorICogQ29uc3QgZ3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJDb25zdEdyYXBoaWNCbG9jazo6QzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24sIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbiksIG1GZW5jZShmZW5jZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBDMkNvbnN0R3JhcGhpY0Jsb2NrOjptYXAoKSBjb25zdCB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKGZhbHNlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVDb25zdEdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpzdWJCbG9jayhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJDb25zdEdyYXBoaWNCbG9jayhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpLmludGVyc2VjdChyZWN0KSksIG1GZW5jZSk7Cit9CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrKAorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pIHsgfQorCitDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gQzJHcmFwaGljQmxvY2s6Om1hcCgpIHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAodHJ1ZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyR3JhcGhpY0Jsb2NrOjpzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpIHsKKyAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWRkeShtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCksIGZlbmNlKTsKK30KKworLyoqCisgKiBCYXNpYyBibG9jayBwb29sIGltcGxlbWVudGF0aW9ucy4KKyAqLworQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK2MyX3N0YXR1c190IEMyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2syRDo6SW1wbD4gaW1wbCA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCbG9jazJEOjpJbXBsPihhbGxvYywgZGF0YSwgYWxsb3R0ZWRDcm9wKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPihuZXcgQzJHcmFwaGljQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgIGNvbnN0IEMyQmxvY2syRCAmYmxvY2spIHsKKyAgICBpZiAoYmxvY2subUltcGwpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLm1JbXBsLT5wb29sRGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBzZXR1cD8KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQlVGRkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2NsYXNzIEMyQnVmZmVyRGF0YTo6SW1wbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVR5cGUoYmxvY2tzLnNpemUoKSA9PSAxID8gTElORUFSIDogTElORUFSX0NIVU5LUyksCisgICAgICAgICAgbUxpbmVhckJsb2NrcyhibG9ja3MpIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVR5cGUoYmxvY2tzLnNpemUoKSA9PSAxID8gR1JBUEhJQyA6IEdSQVBISUNfQ0hVTktTKSwKKyAgICAgICAgICBtR3JhcGhpY0Jsb2NrcyhibG9ja3MpIHsKKyAgICB9CisKKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmbGluZWFyQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gbUxpbmVhckJsb2NrczsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZncmFwaGljQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gbUdyYXBoaWNCbG9ja3M7IH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgbVR5cGU7CisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBtTGluZWFyQmxvY2tzOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IG1HcmFwaGljQmxvY2tzOworfTsKKworQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CitDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CisKK0MyQnVmZmVyRGF0YTo6dHlwZV90IEMyQnVmZmVyRGF0YTo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT50eXBlKCk7IH0KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBDMkJ1ZmZlckRhdGE6OmxpbmVhckJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmxpbmVhckJsb2NrcygpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBDMkJ1ZmZlckRhdGE6OmdyYXBoaWNCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5ncmFwaGljQmxvY2tzKCk7Cit9CisKK2NsYXNzIEMyQnVmZmVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKEMyQnVmZmVyICp0aGl6LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVRoaXModGhpeiksIG1EYXRhKGJsb2Nrcykge30KKyAgICBJbXBsKEMyQnVmZmVyICp0aGl6LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbU5vdGlmeSkgeworICAgICAgICAgICAgcGFpci5maXJzdChtVGhpcywgcGFpci5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgQzJCdWZmZXJEYXRhICZkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KKworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCAhPSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZW1wbGFjZV9iYWNrKG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbU5vdGlmeS5iZWdpbigpLCBtTm90aWZ5LmVuZCgpLAorICAgICAgICAgICAgICAgIFtvbkRlc3Ryb3lOb3RpZnksIGFyZ10gKGNvbnN0IGF1dG8gJnBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3QgPT0gb25EZXN0cm95Tm90aWZ5ICYmIHBhaXIuc2Vjb25kID09IGFyZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ID09IG1Ob3RpZnkuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmeS5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mbygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IHJlc3VsdChtSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbUluZm9zLmJlZ2luKCksIG1JbmZvcy5lbmQoKSwgcmVzdWx0LmJlZ2luKCksCisgICAgICAgICAgICAgICAgW10gKGNvbnN0IGF1dG8gJmVsZW0pIHsgcmV0dXJuIGVsZW0uc2Vjb25kOyB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzZXRJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+ICZpbmZvKSB7CisgICAgICAgIC8vIFRvICJ1cGRhdGUiIHlvdSBuZWVkIHRvIGVyYXNlIHRoZSBleGlzdGluZyBvbmUgaWYgYW55LCBhbmQgdGhlbiBpbnNlcnQuCisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaW5mby0+Y29yZUluZGV4KCkpOworICAgICAgICAodm9pZCkgbUluZm9zLmluc2VydCh7IGluZm8tPmNvcmVJbmRleCgpLCBpbmZvIH0pOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYm9vbCBoYXNJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbmZvcy5jb3VudChpbmRleC5jb3JlSW5kZXgoKSkgPiAwOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUluZm9zLmZpbmQoaW5kZXguY29yZUluZGV4KCkpOworICAgICAgICBpZiAoaXQgPT0gbUluZm9zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RkOjpjb25zdF9wb2ludGVyX2Nhc3Q8Y29uc3QgQzJJbmZvPihpdC0+c2Vjb25kKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmV0ID0gaXQtPnNlY29uZDsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQnVmZmVyICogY29uc3QgbVRoaXM7CisgICAgQnVmZmVyRGF0YUJ1ZGR5IG1EYXRhOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4+IG1JbmZvczsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPE9uRGVzdHJveU5vdGlmeSwgdm9pZCAqPj4gbU5vdGlmeTsKK307CisKK0MyQnVmZmVyOjpDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbXBsKG5ldyBJbXBsKHRoaXMsIGJsb2NrcykpIHt9CisKK2NvbnN0IEMyQnVmZmVyRGF0YSBDMkJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkob25EZXN0cm95Tm90aWZ5LCBhcmcpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkob25EZXN0cm95Tm90aWZ5LCBhcmcpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gQzJCdWZmZXI6OmluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmZvKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpzZXRJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+ICZpbmZvKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRJbmZvKGluZm8pOworfQorCitib29sIEMyQnVmZmVyOjpoYXNJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhc0luZm8oaW5kZXgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBDMkJ1ZmZlcjo6Z2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gQzJCdWZmZXI6OnJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+cmVtb3ZlSW5mbyhpbmRleCk7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jaykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KG5ldyBDMkJ1ZmZlcih7IGJsb2NrIH0pKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjgwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQ29uZmlnIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvKioKKyAqIERlZmluZSBhbmQgaW5pdGlhbGl6ZSBnbG9iYWwgY29uZmlnIGZpZWxkIGRlc2NyaXB0b3JzIGluIHRoaXMgY3BwIGZpbGUKKyAqLworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQ29uZmlnOjpwcm9maWxlX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCB9LAorICAgICAgICB7ICJhYWMtbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMgfSwKKyAgICAgICAgeyAiYWFjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTUFJTiB9LAorICAgICAgICB7ICJhYWMtc3NyIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NTUiB9LAorICAgICAgICB7ICJhYWMtbHRwIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xUUCB9LAorICAgICAgICB7ICJhYWMtaGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUgfSwKKyAgICAgICAgeyAiYWFjLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1lci1sYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9MQyB9LAorICAgICAgICB7ICJhYWMtZXItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAiYWFjLWxkIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xEIH0sCisgICAgICAgIHsgImFhYy1oZS1wcyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUyB9LAorICAgICAgICB7ICJhYWMtZWxkIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCB9LAorICAgICAgICB7ICJhYWMteGhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRSB9LAorICAgICAgICB7ICJtcDJ2LXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFIH0sCisgICAgICAgIHsgIm1wMnYtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LXNuci1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtc3BhdGlhbGx5LXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TUEFUSUFMTFlfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXAydi1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIgfSwKKyAgICAgICAgeyAibXAydi1tdWx0aXZpZXciLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01VTFRJVklFVyB9LAorICAgICAgICB7ICJoMjYzLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSB9LAorICAgICAgICB7ICJoMjYzLWgzMjAiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0gzMjAgfSwKKyAgICAgICAgeyAiaDI2My12MWJjIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19WMUJDIH0sCisgICAgICAgIHsgImgyNjMtaXN3djIiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyIH0sCisgICAgICAgIHsgImgyNjMtaXN3djMiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YzIH0sCisgICAgICAgIHsgImgyNjMtaGlnaC1jb21wcmVzc2lvbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiB9LAorICAgICAgICB7ICJoMjYzLWludGVybmV0IiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUk5FVCB9LAorICAgICAgICB7ICJoMjYzLWludGVybGFjZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJMQUNFIH0sCisgICAgICAgIHsgImgyNjMtaGlnaC1sYXRlbmN5IiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1kgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtY29yZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSB9LAorICAgICAgICB7ICJtcDR2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX01BSU4gfSwKKyAgICAgICAgeyAibXA0di1uYml0IiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9OQklUIH0sCisgICAgICAgIHsgIm1wNHYtYXJ0cyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXA0di1hY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FDRSB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPIH0sCisgICAgICAgIHsgIm1wNHYtY29yZS1zdHVkaW8iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU1RVRElPIH0sCisgICAgICAgIHsgIm1wNHYtYWR2YW5jZWQtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1mZ3MiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0ZHUyB9LAorICAgICAgICB7ICJhdmMtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4gfSwKKyAgICAgICAgeyAiYXZjLWV4dGVuZGVkIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VYVEVOREVEIH0sCisgICAgICAgIHsgImF2Yy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXByb2dyZXNzaXZlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCB9LAorICAgICAgICB7ICJhdmMtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLXByb2dyZXNzaXZlLWhpZ2gtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSF8xMCB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LXByZWRpY3RpdmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQyMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWNhdmxjLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DQVZMQ180NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1jb25zdHJhaW5lZC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2gtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtbXVsdGl2aWV3LWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXN0ZXJlby1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NURVJFT19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfSElHSCB9LAorICAgICAgICB7ICJhdmMtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW1mYy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1lbmhhbmNlZC1tdWx0aXZpZXctZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FTkhBTkNFRF9NVUxUSVZJRVdfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJoZXZjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xNi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xNi1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xNi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTZfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0LTE0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCB9LAorICAgICAgICB7ICJoZXZjLW11bHRpdmlldy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9ubyIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OTyB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTE2IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzE2IH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtM2QtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfM0RfTUFJTiB9LAorICAgICAgICB7ICJ2cDktMCIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wIH0sCisgICAgICAgIHsgInZwOS0xIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTIiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zIH0sCisgICAgICAgIHsgImF2MS0wIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAgfSwKKyAgICAgICAgeyAiYXYxLTEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMSB9LAorICAgICAgICB7ICJhdjEtMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8yIH0sCit9KSkKKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6bGV2ZWxfdCwgKHsKKyAgICAgICAgeyAidW51c2VkIiwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCB9LAorICAgICAgICB7ICJtcDJ2LWxvdyIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVyB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaC0xNDQwIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSF8xNDQwIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0ggfSwKKyAgICAgICAgeyAibXAydi1oaWdocCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hQIH0sCisgICAgICAgIHsgImgyNjMtMTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCB9LAorICAgICAgICB7ICJoMjYzLTIwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAgfSwKKyAgICAgICAgeyAiaDI2My0zMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwIH0sCisgICAgICAgIHsgImgyNjMtNDAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCB9LAorICAgICAgICB7ICJoMjYzLTQ1IiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUgfSwKKyAgICAgICAgeyAiaDI2My01MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzUwIH0sCisgICAgICAgIHsgImgyNjMtNjAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M182MCB9LAorICAgICAgICB7ICJoMjYzLTcwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNzAgfSwKKyAgICAgICAgeyAibXA0di0wIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMCB9LAorICAgICAgICB7ICJtcDR2LTBiIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMEIgfSwKKyAgICAgICAgeyAibXA0di0xIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMSB9LAorICAgICAgICB7ICJtcDR2LTIiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yIH0sCisgICAgICAgIHsgIm1wNHYtMyIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMgfSwKKyAgICAgICAgeyAibXA0di0zYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCIH0sCisgICAgICAgIHsgIm1wNHYtNCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQgfSwKKyAgICAgICAgeyAibXA0di00YSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzRBIH0sCisgICAgICAgIHsgIm1wNHYtNSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUgfSwKKyAgICAgICAgeyAibXA0di02IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNiB9LAorICAgICAgICB7ICJhdmMtMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMSB9LAorICAgICAgICB7ICJhdmMtMWIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCIH0sCisgICAgICAgIHsgImF2Yy0xLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSB9LAorICAgICAgICB7ICJhdmMtMS4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzIgfSwKKyAgICAgICAgeyAiYXZjLTEuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8zIH0sCisgICAgICAgIHsgImF2Yy0yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yIH0sCisgICAgICAgIHsgImF2Yy0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSB9LAorICAgICAgICB7ICJhdmMtMi4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIgfSwKKyAgICAgICAgeyAiYXZjLTMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzMgfSwKKyAgICAgICAgeyAiYXZjLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xIH0sCisgICAgICAgIHsgImF2Yy0zLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiB9LAorICAgICAgICB7ICJhdmMtNCIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNCB9LAorICAgICAgICB7ICJhdmMtNC4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ180XzEgfSwKKyAgICAgICAgeyAiYXZjLTQuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8yIH0sCisgICAgICAgIHsgImF2Yy01IiwgQzJDb25maWc6OkxFVkVMX0FWQ181IH0sCisgICAgICAgIHsgImF2Yy01LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSB9LAorICAgICAgICB7ICJhdmMtNS4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIgfSwKKyAgICAgICAgeyAiYXZjLTYiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzYgfSwKKyAgICAgICAgeyAiYXZjLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8xIH0sCisgICAgICAgIHsgImF2Yy02LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTMiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82IH0sCisgICAgICAgIHsgImhldmMtbWFpbi02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC01IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81IH0sCisgICAgICAgIHsgImhldmMtaGlnaC01LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzYgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMiB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMSB9LAorICAgICAgICB7ICJ2cDktMS4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEgfSwKKyAgICAgICAgeyAidnA5LTIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xIH0sCisgICAgICAgIHsgInZwOS0zIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zIH0sCisgICAgICAgIHsgInZwOS0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSB9LAorICAgICAgICB7ICJ2cDktNCIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNCB9LAorICAgICAgICB7ICJ2cDktNC4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEgfSwKKyAgICAgICAgeyAidnA5LTUiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUgfSwKKyAgICAgICAgeyAidnA5LTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8xIH0sCisgICAgICAgIHsgInZwOS01LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiB9LAorICAgICAgICB7ICJ2cDktNiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNiB9LAorICAgICAgICB7ICJ2cDktNi4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV82XzEgfSwKKyAgICAgICAgeyAidnA5LTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yIH0sCisgICAgICAgIHsgImF2MS0yIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yIH0sCisgICAgICAgIHsgImF2MS0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSB9LAorICAgICAgICB7ICJhdjEtMi4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIgfSwKKyAgICAgICAgeyAiYXYxLTIuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8zIH0sCisgICAgICAgIHsgImF2MS0zIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zIH0sCisgICAgICAgIHsgImF2MS0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSB9LAorICAgICAgICB7ICJhdjEtMy4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzIgfSwKKyAgICAgICAgeyAiYXYxLTMuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18zIH0sCisgICAgICAgIHsgImF2MS00IiwgQzJDb25maWc6OkxFVkVMX0FWMV80IH0sCisgICAgICAgIHsgImF2MS00LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMSB9LAorICAgICAgICB7ICJhdjEtNC4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzIgfSwKKyAgICAgICAgeyAiYXYxLTQuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8zIH0sCisgICAgICAgIHsgImF2MS01IiwgQzJDb25maWc6OkxFVkVMX0FWMV81IH0sCisgICAgICAgIHsgImF2MS01LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMSB9LAorICAgICAgICB7ICJhdjEtNS4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzIgfSwKKyAgICAgICAgeyAiYXYxLTUuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8zIH0sCisgICAgICAgIHsgImF2MS02IiwgQzJDb25maWc6OkxFVkVMX0FWMV82IH0sCisgICAgICAgIHsgImF2MS02LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMSB9LAorICAgICAgICB7ICJhdjEtNi4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzIgfSwKKyAgICAgICAgeyAiYXYxLTYuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8zIH0sCisgICAgICAgIHsgImF2MS03IiwgQzJDb25maWc6OkxFVkVMX0FWMV83IH0sCisgICAgICAgIHsgImF2MS03LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMSB9LAorICAgICAgICB7ICJhdjEtNy4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzIgfSwKKyAgICAgICAgeyAiYXYxLTcuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18zIH0sCit9KSkKKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkJ1ZmZlckRhdGE6OnR5cGVfdCwgKHsKKyAgICAgICAgeyAiaW52YWxpZCIsICAgICAgICBDMkJ1ZmZlckRhdGE6OklOVkFMSUQgfSwKKyAgICAgICAgeyAibGluZWFyIiwgICAgICAgICBDMkJ1ZmZlckRhdGE6OkxJTkVBUiB9LAorICAgICAgICB7ICJsaW5lYXItY2h1bmtzIiwgIEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUyB9LAorICAgICAgICB7ICJncmFwaGljIiwgICAgICAgIEMyQnVmZmVyRGF0YTo6R1JBUEhJQyB9LAorICAgICAgICB7ICJncmFwaGljLWNodW5rcyIsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1MgfSwKK30pKQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlciIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oIgorCisvKiBzdGF0aWMgKi8gYW5kcm9pZDo6TXV0ZXggQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzTXV0ZXg7CisvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzSW5zdGFuY2U7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga1N0b3JlUGx1Z2luUGF0aFtdID0gImxpYmMycGx1Z2luX3N0b3JlLnNvIjsKKworfSAgLy8gdW5uYW1lZAorCitDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQorICAgIDogbUNyZWF0ZUJsb2NrUG9vbChudWxscHRyKSB7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DcmVhdGVCbG9ja1Bvb2wgPSAoQ3JlYXRlQmxvY2tQb29sRnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQmxvY2tQb29sIik7CisgICAgaWYgKG1DcmVhdGVCbG9ja1Bvb2wgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVCbG9ja1Bvb2wgKCVzKSIsIGRsZXJyb3IoKSk7CisgICAgfQorICAgIG1DcmVhdGVBbGxvY2F0b3IgPSAoQ3JlYXRlQWxsb2NhdG9yRnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQWxsb2NhdG9yIik7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVBbGxvY2F0b3IgKCVzKSIsIGRsZXJyb3IoKSk7CisgICAgfQorfQorCitDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6On5DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiQ2xvc2luZyBoYW5kbGUiKTsKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICA6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLCA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKSB7CisgICAgaWYgKG1DcmVhdGVCbG9ja1Bvb2wgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUJsb2NrUG9vbCBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OkMyQmxvY2tQb29sPiBwdHIobUNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgYmxvY2tQb29sSWQpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAgICpwb29sID0gcHRyOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQmxvY2tQb29sIGJ5IGFsbG9jYXRvciBpZDogJXUiLCBhbGxvY2F0b3JJZCk7CisgICAgcmV0dXJuIEMyX0JBRF9JTkRFWDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVBbGxvY2F0b3IoCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcikgeworICAgIGlmIChtQ3JlYXRlQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkhhbmRsZSBvciBDcmVhdGVBbGxvY2F0b3Igc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9DT1JSVVBURUQ7CisgICAgYWxsb2NhdG9yLT5yZXNldChtQ3JlYXRlQWxsb2NhdG9yKGFsbG9jYXRvcklkLCAmcmVzKSk7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIENyZWF0ZUFsbG9jYXRvciBieSBpZDogJXUsIHJlczogJWQiLCBhbGxvY2F0b3JJZCwgcmVzKTsKKyAgICAgICAgYWxsb2NhdG9yLT5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIHN0YXRpYworY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKSB7CisgICAgYW5kcm9pZDo6TXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihrU3RvcmVQbHVnaW5QYXRoKSk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApAQCAtMCwwICsxLDk5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJTdG9yZSIKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyB0byBhY2Nlc3MgaXRzIGludGVyZmFjZS4KKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogVGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBwcm92aWRlcyBiYXNpYyBhbGxvY2F0b3ItdHlwZXMgZm9yIHRoZSBmcmFtZXdvcmsgYmFzZWQgb24gaW9uIGFuZAorICogZ3JhbGxvYy4gQWxsb2NhdG9ycyBhcmUgbm90IG1lYW50IHRvIGJlIHVwZGF0YWJsZS4KKyAqCisgKiBcdG9kbyBQcm92aWRlIGFsbG9jYXRvciBiYXNlZCBvbiBhc2htZW0KKyAqIFx0b2RvIE1vdmUgaW9uIGFsbG9jYXRpb24gaW50byBpdHMgSElETCBvciBwcm92aWRlIHNvbWUgbWFwcGluZyBmcm9tIG1lbW9yeSB1c2FnZSB0byBpb24gZmxhZ3MKKyAqIFx0b2RvIE1ha2UgdGhpcyBhbGxvY2F0b3Igc3RvcmUgZXh0ZW5kYWJsZQorICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsIDogcHVibGljIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4gbGlzdEFsbG9jYXRvcnNfbmIoKQorICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PigpOyAvLy8gXHRvZG8KKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiYW5kcm9pZC5hbGxvY2F0b3Itc3RvcmUiOworICAgIH0KKworICAgIHZvaWQgc2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKTsKKworICAgIH5DMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBpb24gYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaElvbkFsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBidWZmZXJxdWV1ZSBzdXBwb3J0aW5nIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gY29tcG9uZW50IHN0b3JlIHRvIHVzZQorICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVNldExvY2s7IC8vIHByb3RlY3RzIHRoZSBlbnRpcmUgdXBkYXRpbmcgX21Db21wb25lbnRTdG9yZSBhbmQgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlUmVhZExvY2s7IC8vIG11c3QgcHJvdGVjdCBvbmx5IHJlYWQvd3JpdGUgb2YgX21Db21wb25lbnRTdG9yZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBfbUNvbXBvbmVudFN0b3JlOworfTsKKworQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgeworICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgLy8gVE9ETzogc2hvdWxkIHdlIGltcGxlbWVudCBhIGdlbmVyaWMgcmVnaXN0cnkgZm9yIGFsbCwgYW5kIHVzZSB0aGF0PworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICBjMl9zdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQWxsb2NhdG9yKGlkLCBhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjptdXRleCBnSW9uQWxsb2NhdG9yTXV0ZXg7CitzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9ySW9uPiBnSW9uQWxsb2NhdG9yOworCit2b2lkIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgQzJBbGxvY2F0b3JJb246OlVzYWdlTWFwcGVyRm4gbWFwcGVyOworICAgIHVpbnQ2NF90IG1pblVzYWdlID0gMDsKKyAgICB1aW50NjRfdCBtYXhVc2FnZSA9IEMyTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkuZXhwZWN0ZWQ7CisgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKyAgICAvLyBxdWVyeSBtaW4gYW5kIG1heCB1c2FnZSBhcyB3ZWxsIGFzIGJsb2NrIHNpemUgdmlhIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbzsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby51c2FnZSkpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby5jYXBhY2l0eSkpLAorICAgIH07CisgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUyAmJiAhZnN2LnZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWluVXNhZ2UgPSBmc3YudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgICAgICAgICBtYXhVc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VXNhZ2UgfD0gdi51NjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVsxXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzFdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSAmJiBmc3YucmFuZ2Uuc3RlcC51MzIgPiAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gZnN2LnJhbmdlLnN0ZXAudTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFwcGVyID0gW3N0b3JlXShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm8gPSB7IHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSB9OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOyAvLyBUT0RPOiByZW1vdmUKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5jb25maWdfc20oeyZ1c2FnZUluZm99LCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICphbGlnbiA9IHVzYWdlSW5mby5taW5BbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgKmhlYXBNYXNrID0gdXNhZ2VJbmZvLmhlYXBNYXNrOworICAgICAgICAgICAgICAgICpmbGFncyA9IHVzYWdlSW5mby5hbGxvY0ZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBhbGxvY2F0b3ItPnNldFVzYWdlTWFwcGVyKG1hcHBlciwgbWluVXNhZ2UsIG1heFVzYWdlLCBibG9ja1NpemUpOworfQorCit9CisKK3ZvaWQgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6c2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgLy8gdGVjaG5pY2FsbHkgdGhpcyBzZXQgbG9jayBpcyBub3QgbmVlZGVkLCBidXQgaXMgaGVyZSBmb3Igc2FmZXR5IGluIGNhc2Ugd2UgYWRkIG1vcmUKKyAgICAvLyBnZXR0ZXIgb3JkZXJzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVNldExvY2spOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgX21Db21wb25lbnRTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgICAgIGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgc3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaElvbkFsbG9jYXRvcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0b3JlID0gX21Db21wb25lbnRTdG9yZTsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTik7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgY29tcG9uZW50U3RvcmUpOworICAgICAgICBnSW9uQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoR3JhbGxvY0FsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQyk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIHRydWUpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCituYW1lc3BhY2UgeworICAgIHN0ZDo6bXV0ZXggZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZTsKKworICAgIHN0ZDo6bXV0ZXggZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleDsKKyAgICBzdGQ6OndlYWtfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gc3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RvcmUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+KCk7CisgICAgICAgIHN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpKTsKKyAgICAgICAgZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZSkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsgLy8gZG9uJ3QgaW50ZXJsZXZlIHNldC1zCisKKyAgICAvLyB1cGRhdGUgcHJlZmVycmVkIHN0b3JlCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgICAgIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA9IGNvbXBvbmVudFN0b3JlOworICAgIH0KKworICAgIC8vIHVwZGF0ZSBwbGF0Zm9ybSBhbGxvY2F0b3IncyBzdG9yZSBhcyB3ZWxsIGlmIGl0IGlzIGFsaXZlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGFsbG9jYXRvclN0b3JlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgICAgIGFsbG9jYXRvclN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yU3RvcmUpIHsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUtPnNldENvbXBvbmVudFN0b3JlKGNvbXBvbmVudFN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgcmV0dXJuIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA/IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA6IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgX0MyQmxvY2tQb29sQ2FjaGUgeworcHVibGljOgorICAgIF9DMkJsb2NrUG9vbENhY2hlKCkgOiBtQmxvY2tQb29sU2VxSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUICsgMSkge30KKworICAgIGMyX3N0YXR1c190IF9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0KKyAgICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICAgICAgc3dpdGNoKGFsbG9jYXRvcklkKSB7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgICAgICAgICByZXMgPSBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcklkLCBwb29sSWQsICZwdHIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHJldHVybiBfY3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIG1CbG9ja1Bvb2xTZXFJZCsrLCBwb29sKTsKKyAgICB9CisKKyAgICBib29sIGdldEJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmUgaXRlcmF0b3IgZm9yIG11bHRpcGxlIGJsb2NrcG9vbCB0eXBlIHNjYWxhYmlsaXR5LgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgYXV0byBpdCA9IG1CbG9ja1Bvb2xzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICBpZiAoaXQgIT0gbUJsb2NrUG9vbHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHB0ciA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgICAgICAgICBtQmxvY2tQb29scy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudHMuZXJhc2UoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNvbXBvbmVudHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBmb3VuZC0+c2Vjb25kLmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbFNlcUlkOworCisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IG1Db21wb25lbnRzOworfTsKKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxfQzJCbG9ja1Bvb2xDYWNoZT4gc0Jsb2NrUG9vbENhY2hlID0KKyAgICBzdGQ6Om1ha2VfdW5pcXVlPF9DMkJsb2NrUG9vbENhY2hlPigpOworc3RhdGljIHN0ZDo6bXV0ZXggc0Jsb2NrUG9vbENhY2hlTXV0ZXg7CisKK30gLy8gYW55bnltb3VzIG5hbWVzcGFjZQorCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICBpZiAoaWQgPj0gQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSB7CisgICAgICAgIGlmIChzQmxvY2tQb29sQ2FjaGUtPmdldEJsb2NrUG9vbChpZCwgY29tcG9uZW50LCBwb29sKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcy4gdGhpcyBpcyB0ZW1wb3JhcnkKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVDoKKyAgICAgICAgcmVzID0gc0Jsb2NrUG9vbENhY2hlLT5fY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIGNvbXBvbmVudCwgaWQsIHBvb2wpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICByZXR1cm4gc0Jsb2NrUG9vbENhY2hlLT5jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgcG9vbCk7Cit9CisKK2NsYXNzIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKKyAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworICAgIHZpcnR1YWwgfkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBwcm92aWRlIGEgd2F5IHRvIGFkZCB0cmFpdHMgdG8ga25vd24gY29tcG9uZW50cyBoZXJlIHRvIGF2b2lkIGxvYWRpbmcgdGhlIC5zby1zCisgICAgICogZm9yIGxpc3RDb21wb25lbnRzCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudE1vZHVsZSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDb21wb25lbnRNb2R1bGU+IHsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIEludGVyZmFjZURlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpIG92ZXJyaWRlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBccmV0dXJucyB0aGUgdHJhaXRzIG9mIHRoZSBjb21wb25lbnQgaW4gdGhpcyBtb2R1bGUuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gZ2V0VHJhaXRzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbmFtZVtpbl0gIGNvbXBvbmVudCBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TW9kdWxlKCkKKyAgICAgICAgICAgIDogbUluaXQoQzJfTk9fSU5JVCksCisgICAgICAgICAgICAgIG1MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgICAgICAgIGNyZWF0ZUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBtQ29tcG9uZW50RmFjdG9yeShudWxscHRyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBjb21wb25lbnQgbW9kdWxlIHdpdGggYSBnaXZlbiBsaWJyYXJ5IHBhdGguIE11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGxpYlBhdGhbaW5dIGxpYnJhcnkgcGF0aAorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgbG9hZCB0aGUgbW9kdWxlIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGluaXQoc3RkOjpzdHJpbmcgbGliUGF0aCk7CisKKyAgICAgICAgdmlydHVhbCB+Q29tcG9uZW50TW9kdWxlKCkgb3ZlcnJpZGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6cmVjdXJzaXZlX211dGV4IG1Mb2NrOyAvLy88IGxvY2sgcHJvdGVjdGluZyBtVHJhaXRzCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzOyAvLy88IGNhY2hlZCBjb21wb25lbnQgdHJhaXRzCisKKyAgICAgICAgYzJfc3RhdHVzX3QgbUluaXQ7IC8vLzwgaW5pdGlhbGl6YXRpb24gcmVzdWx0CisKKyAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsgLy8vPCBsb2FkZWQgbGlicmFyeSBoYW5kbGUKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYyBjcmVhdGVGYWN0b3J5OyAvLy88IGxvYWRlZCBjcmVhdGUgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMgZGVzdHJveUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGRlc3Ryb3kgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5ICptQ29tcG9uZW50RmFjdG9yeTsgLy8vPCBsb2FkZWQvY3JlYXRlZCBjb21wb25lbnQgZmFjdG9yeQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRhYmxlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBlbnVtZXJhdGlvbnMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TG9hZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBjb21wb25lbnQgbW9kdWxlIGlmIGl0IGlzIGFscmVhZHkgY3VycmVudGx5IGxvYWRlZCwgb3IKKyAgICAgICAgICogYXR0ZW1wdHMgdG8gbG9hZCBpdCBpZiBpdCBpcyBub3QuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBtb2R1bGVbb3V0XSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgbG9hZGVkIG1vZHVsZSBzaGFsbCBiZSBzdG9yZWQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgYmUgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBmZXRjaE1vZHVsZShzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBsb2NhbE1vZHVsZSA9IG1Nb2R1bGUubG9jaygpOworICAgICAgICAgICAgaWYgKGxvY2FsTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbE1vZHVsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcG9uZW50TW9kdWxlPigpOworICAgICAgICAgICAgICAgIHJlcyA9IGxvY2FsTW9kdWxlLT5pbml0KG1MaWJQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgbG9hZGVyIGZvciBhIHNwZWNpZmljIGxpYnJhcnkgcGF0aCAob3IgbmFtZSkuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRMb2FkZXIoc3RkOjpzdHJpbmcgbGliUGF0aCkKKyAgICAgICAgICAgIDogbUxpYlBhdGgobGliUGF0aCkge30KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAvLy88IG11dGV4IGd1YXJkaW5nIHRoZSBtb2R1bGUKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnRNb2R1bGU+IG1Nb2R1bGU7IC8vLzwgd2VhayByZWZlcmVuY2UgdG8gdGhlIGxvYWRlZCBtb2R1bGUKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxpYlBhdGg7IC8vLzwgbGlicmFyeSBwYXRoCisgICAgfTsKKworICAgIHN0cnVjdCBJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZUlvblVzYWdlSW5mbz4gbUlvblVzYWdlSW5mbzsKKworICAgICAgICBJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgeworICAgICAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgICAgICBzdHJ1Y3QgU2V0dGVyIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgQzJSIHNldElvblVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlSW9uVXNhZ2VJbmZvPiAmbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuaGVhcE1hc2sgPSB+MDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm1pbkFsaWdubWVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Jb25Vc2FnZUluZm8sICJpb24tdXNhZ2UiKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdG9yZUlvblVzYWdlSW5mbygpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIHVzYWdlKS5mbGFncyh7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGNhcGFjaXR5KS5pblJhbmdlKDAsIFVJTlQzMl9NQVgsIDEwMjQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgaGVhcE1hc2spLmFueSgpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgYWxsb2NGbGFncykuZmxhZ3Moe30pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgbWluQWxpZ25tZW50KS5lcXVhbFRvKDApCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI6OnNldElvblVzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBvbmVudCBtb2R1bGUgZm9yIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIG1vZHVsZSBwb2ludGVyIHRvIGEgc2hhcmVkX3BvaW50ZXIgd2hlcmUgdGhlIGNvbXBvbmVudCBtb2R1bGUgd2lsbCBiZSBzdG9yZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGxvYWRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9jYXRlIHRoZSBjb21wb25lbnQgbG9hZGVyCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IHRvIGJlIGxvYWRlZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbG9hZGVyIGNvdWxkIG5vdCBiZSBpZGVudGlmaWVkIGR1ZSB0byBzb21lIG1vZHVsZXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb3JydXB0ZWQgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhbiBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBjb21wb25lbnQgYnV0IHNvbWUgY29tcG9uZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJhZCBsaWJyYXJ5KQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGZpbmQgdGhlIGNvbXBvbmVudCBsb2FkZXIgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkgaWRlbnRpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGxhY2sgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucykKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaW5kQ29tcG9uZW50KEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+ICptb2R1bGUpOworCisgICAgLyoqCisgICAgICogTG9hZHMgZWFjaCBjb21wb25lbnQgbW9kdWxlIGFuZCBkaXNjb3ZlciBpdHMgY29udGVudHMuCisgICAgICovCisgICAgdm9pZCB2aXNpdENvbXBvbmVudHMoKTsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAvLy88IG11dGV4IGd1YXJkaW5nIHRoZSBjb21wb25lbnQgbGlzdHMgZHVyaW5nIGNvbnN0cnVjdGlvbgorICAgIGJvb2wgbVZpc2l0ZWQ7IC8vLzwgY29tcG9uZW50IG1vZHVsZXMgdmlzaXRlZAorICAgIHN0ZDo6bWFwPEMyU3RyaW5nLCBDb21wb25lbnRMb2FkZXI+IG1Db21wb25lbnRzOyAvLy88IHBhdGggLT4gY29tcG9uZW50IG1vZHVsZQorICAgIHN0ZDo6bWFwPEMyU3RyaW5nLCBDMlN0cmluZz4gbUNvbXBvbmVudE5hbWVUb1BhdGg7IC8vLzwgbmFtZSAtPiBwYXRoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBtQ29tcG9uZW50TGlzdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBJbnRlcmZhY2UgbUludGVyZmFjZTsKK307CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjppbml0KAorICAgICAgICBzdGQ6OnN0cmluZyBsaWJQYXRoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIEFMT0dWKCJsb2FkaW5nIGRsbCIpOworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5jX3N0cigpLCBSVExEX05PV3xSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIGNvdWxkIGJlIGFjY2Vzcy9zeW1ib2wgb3Igc2ltcGx5IG5vdCBiZWluZyB0aGVyZQorICAgICAgICBBTE9HRCgiY291bGQgbm90IGRsb3BlbiAlczogJXMiLCBsaWJQYXRoLmNfc3RyKCksIGRsZXJyb3IoKSk7CisgICAgICAgIG1Jbml0ID0gQzJfQ09SUlVQVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIGNyZWF0ZUZhY3RvcnkgPQorICAgICAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUNvZGVjMkZhY3RvcnkiKTsKKyAgICAgICAgZGVzdHJveUZhY3RvcnkgPQorICAgICAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJEZXN0cm95Q29kZWMyRmFjdG9yeSIpOworCisgICAgICAgIG1Db21wb25lbnRGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeSgpOworICAgICAgICBpZiAobUNvbXBvbmVudEZhY3RvcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBpbiAlcyIsIGxpYlBhdGguY19zdHIoKSk7CisgICAgICAgICAgICBtSW5pdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGY7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gY3JlYXRlSW50ZXJmYWNlKDAsICZpbnRmKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0cyhuZXcgKHN0ZDo6bm90aHJvdykgQzJDb21wb25lbnQ6OlRyYWl0cyk7CisgICAgaWYgKHRyYWl0cykgeworICAgICAgICB0cmFpdHMtPm5hbWUgPSBpbnRmLT5nZXROYW1lKCk7CisKKyAgICAgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICAgICAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7ICZraW5kLCAmZG9tYWluIH0sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOworICAgICAgICBib29sIGZpeERvbWFpbiA9IHJlcyAhPSBDMl9PSzsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgdHJhaXRzLT5raW5kID0ga2luZC52YWx1ZTsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gZG9tYWluLnZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZmFsbC1iYWNrCisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZSBmb3Iga2luZCBhbmQgZG9tYWluOiAlZCIsIHJlcyk7CisKKyAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9CisgICAgICAgICAgICAgICAgKHRyYWl0cy0+bmFtZS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA6CisgICAgICAgICAgICAgICAgKHRyYWl0cy0+bmFtZS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiA6CisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBtZWRpYVR5cGVJbmRleCA9CisgICAgICAgICAgICAgICAgdHJhaXRzLT5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgPyBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICA6IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgbWVkaWFUeXBlSW5kZXggfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6IHVuZXhwZWN0ZWQgdmVjdG9yIHNpemU6ICV6dSIsIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmcgKm1lZGlhVHlwZUNvbmZpZyA9IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgaWYgKG1lZGlhVHlwZUNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IG1lZGlhIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICB0cmFpdHMtPm1lZGlhVHlwZSA9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyhtZWRpYVR5cGVDb25maWctPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJubGVuKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwgbWVkaWFUeXBlQ29uZmlnLT5mbGV4Q291bnQoKSkpOworCisgICAgICAgIGlmIChmaXhEb21haW4pIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJpbWFnZS8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBwcm9wZXJseSBmcm9tIHRoZSBzdG9yZSBkdXJpbmcgZW1wbGFjZQorICAgICAgICBzd2l0Y2ggKHRyYWl0cy0+ZG9tYWluKSB7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHRyYWl0cy0+cmFuayA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRyYWl0cy0+cmFuayA9IDUxMjsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpQQVJBTV9UWVBFIH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZyAqYWxpYXNlc1NldHRpbmcgPQorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChhbGlhc2VzU2V0dGluZykgeworICAgICAgICAgICAgICAgIC8vIFNwbGl0IGFsaWFzZXMgb24gJywnCisgICAgICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBzaW1wbGVyIGluIHBsYWluIEMgYW5kIGV2ZW4gc3RkOjpzdHJpbmcgd291bGQgc3RpbGwgbWFrZSBhIGNvcHkuCisgICAgICAgICAgICAgICAgY2hhciAqYWxpYXNlcyA9IDo6c3RybmR1cChhbGlhc2VzU2V0dGluZy0+bS52YWx1ZSwgYWxpYXNlc1NldHRpbmctPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJyVzJyBoYXMgYWxpYXNlczogJyVzJyIsIGludGYtPmdldE5hbWUoKS5jX3N0cigpLCBhbGlhc2VzKTsKKworICAgICAgICAgICAgICAgIGZvciAoY2hhciAqdG9rLCAqcHRyLCAqc3RyID0gYWxpYXNlczsgKHRvayA9IDo6c3RydG9rX3Ioc3RyLCAiLCIsICZwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzLT5hbGlhc2VzLnB1c2hfYmFjayh0b2spOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWRkaW5nIGFsaWFzOiAnJXMnIiwgdG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShhbGlhc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtVHJhaXRzID0gdHJhaXRzOworCisgICAgcmV0dXJuIG1Jbml0OworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6fkNvbXBvbmVudE1vZHVsZSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKGRlc3Ryb3lGYWN0b3J5ICYmIG1Db21wb25lbnRGYWN0b3J5KSB7CisgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG1Db21wb25lbnRGYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKG1MaWJIYW5kbGUpIHsKKyAgICAgICAgQUxPR1YoInVubG9hZGluZyBkbGwiKTsKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSB7CisgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgaWQsIGludGVyZmFjZSwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnRJbnRlcmZhY2UgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGludGVyZmFjZSBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gZGVsZXRlcikgeworICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGlkLCBjb21wb25lbnQsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50ICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBjb21wb25lbnQgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpnZXRUcmFpdHMoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkKKyAgICA6IG1WaXNpdGVkKGZhbHNlKSwKKyAgICAgIG1SZWZsZWN0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSksCisgICAgICBtSW50ZXJmYWNlKG1SZWZsZWN0b3IpIHsKKworICAgIGF1dG8gZW1wbGFjZSA9IFt0aGlzXShjb25zdCBjaGFyICpsaWJQYXRoKSB7CisgICAgICAgIG1Db21wb25lbnRzLmVtcGxhY2UobGliUGF0aCwgbGliUGF0aCk7CisgICAgfTsKKworICAgIC8vIFRPRE86IG1vdmUgdGhpcyBhbHNvIGludG8gYSAuc28gc28gaXQgY2FuIGJlIHVwZGF0ZWQKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1yd2JkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2MWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9mbGFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2dzbWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaGV2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9vcHVzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfb3B1c2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMuc28iKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjb3B5QnVmZmVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBzcmMsIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdCkgeworICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBDMl9NQVlfQkxPQ0ssIGhlYXBQYXJhbXMpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvbmZpZ19zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKK30KKwordm9pZCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnZpc2l0Q29tcG9uZW50cygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtVmlzaXRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byAmcGF0aEFuZExvYWRlciA6IG1Db21wb25lbnRzKSB7CisgICAgICAgIGNvbnN0IEMyU3RyaW5nICZwYXRoID0gcGF0aEFuZExvYWRlci5maXJzdDsKKyAgICAgICAgQ29tcG9uZW50TG9hZGVyICZsb2FkZXIgPSBwYXRoQW5kTG9hZGVyLnNlY29uZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgICAgICBpZiAobG9hZGVyLmZldGNoTW9kdWxlKCZtb2R1bGUpID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzID0gbW9kdWxlLT5nZXRUcmFpdHMoKTsKKyAgICAgICAgICAgIGlmICh0cmFpdHMpIHsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TGlzdC5wdXNoX2JhY2sodHJhaXRzKTsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbXBsYWNlKHRyYWl0cy0+bmFtZSwgcGF0aCk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMlN0cmluZyAmYWxpYXMgOiB0cmFpdHMtPmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWVUb1BhdGguZW1wbGFjZShhbGlhcywgcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1WaXNpdGVkID0gdHJ1ZTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKCkgeworICAgIC8vIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgdmlzaXRDb21wb25lbnRzKCk7CisgICAgcmV0dXJuIG1Db21wb25lbnRMaXN0OworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmZpbmRDb21wb25lbnQoCisgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+ICptb2R1bGUpIHsKKyAgICAoKm1vZHVsZSkucmVzZXQoKTsKKyAgICB2aXNpdENvbXBvbmVudHMoKTsKKworICAgIGF1dG8gcG9zID0gbUNvbXBvbmVudE5hbWVUb1BhdGguZmluZChuYW1lKTsKKyAgICBpZiAocG9zICE9IG1Db21wb25lbnROYW1lVG9QYXRoLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50cy5hdChwb3MtPnNlY29uZCkuZmV0Y2hNb2R1bGUobW9kdWxlKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgeworICAgIC8vIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBmaW5kQ29tcG9uZW50KG5hbWUsICZtb2R1bGUpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogZ2V0IGEgdW5pcXVlIG5vZGUgSUQKKyAgICAgICAgcmVzID0gbW9kdWxlLT5jcmVhdGVDb21wb25lbnQoMCwgY29tcG9uZW50KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgeworICAgIC8vIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBmaW5kQ29tcG9uZW50KG5hbWUsICZtb2R1bGUpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogZ2V0IGEgdW5pcXVlIG5vZGUgSUQKKyAgICAgICAgcmVzID0gbW9kdWxlLT5jcmVhdGVJbnRlcmZhY2UoMCwgaW50ZXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKK30KKworQzJTdHJpbmcgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiYW5kcm9pZC5jb21wb25lbnRTdG9yZS5wbGF0Zm9ybSI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtUmVmbGVjdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBwbGF0Zm9ybVN0b3JlOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBwbGF0Zm9ybVN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlPigpOworICAgICAgICBwbGF0Zm9ybVN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBVbndyYXAgdGhlIG5hdGl2ZSBoYW5kbGUgZnJvbSBhIENvZGVjMiBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4KKyAqCisgKiBAcGFyYW0gaGFuZGxlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MuIFRoaXMgaW5jbHVkZXMgaGFuZGxlcyByZXR1cm5lZCBmb3IgYQorICogZ3JhcGhpYyBibG9jayBhbGxvY2F0aW9uIGhhbmRsZSByZXR1cm5lZC4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgbmF0aXZlIGhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpOworCisvKioKKyAqIFdyYXAgdGhlIGdyYWxsb2MgaGFuZGxlIGFuZCBtZXRhZGF0YSBpbnRvIENvZGVjMiBoYW5kbGUgcmVjb2duaXplZCBieQorICogQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBDMkhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworQzJIYW5kbGUgKldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMCwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApOworCisvKioKKyAqIFx0b2RvIEdldCB0aGlzIGZyb20gdGhlIGJ1ZmZlcgorICovCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpOworCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2MgOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlID0gZmFsc2UpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvckdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwNTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQWxsb2NhdG9ySW9uIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoYWxpZ24sIGhlYXBNYXNrLCBmbGFncykKKyAgICAvLworICAgIC8vIGNhcGFjaXR5IGlzIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgYmxvY2stc2l6ZSAoZGVmYXVsdHMgdG8gcGFnZSBzaXplKSB0byByZWR1Y2UgY2FjaGluZworICAgIC8vIG92ZXJoZWFkCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KEMyTWVtb3J5VXNhZ2UsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QqLCB1bnNpZ25lZCosIHVuc2lnbmVkKik+IFVzYWdlTWFwcGVyRm47CisKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JJb24oaWRfdCBpZCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKKyAgICAgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHVzYWdlIG1hc2tzIGFuZCBkZWZhdWx0IGJsb2NrLXNpemUgdG8gdXNlIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UgdG8gaW9uIGZsYWdzCisgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IHRoZSBpb24gZGV2aWNlCisgICAgICogXHBhcmFtIG1pblVzYWdlIG1pbmltdW0gYnVmZmVyIHVzYWdlIHJlcXVpcmVkIGZvciBzdXBwb3J0ZWQgYWxsb2NhdGlvbnMgKGRlZmF1bHRzIHRvIDApCisgICAgICogXHBhcmFtIG1heFVzYWdlIG1heGltdW0gYnVmZmVyIHVzYWdlIHN1cHBvcnRlZCBieSB0aGUgaW9uIGFsbG9jYXRvciAoZGVmYXVsdHMgdG8gU1dfUkVBRAorICAgICAqICAgICAgICB8IFNXX1dSSVRFKQorICAgICAqIFxwYXJhbSBibG9ja1NpemUgYWxpZ25tZW50IHVzZWQgcHJpb3IgdG8gY2FsbGluZyB8bWFwcGVyfCBmb3IgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKiAgICAgICAgVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZiBjYWNoZSByZXF1aXJlZCBmb3IgY2FjaGluZyBtYXBwZXIgcmVzdWx0cy4KKyAgICAgKiAgICAgICAgKGRlZmF1bHRzIHRvIHRoZSBwYWdlIHNpemUpCisgICAgICovCisgICAgdm9pZCBzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpOworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1Jb25GZDsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmKSBjb25zdDsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp0dXBsZTxzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzFhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbElkOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKT4gT25SZW5kZXJDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFNldHMgcmVuZGVyIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHBhcmFtIHJlbmRlckNhbGxiYWsgY2FsbGJhY2sgdG8gY2FsbCBmb3IgYWxsIGRlcXVldWUgYnVmZmVyLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjayA9IE9uUmVuZGVyQ2FsbGJhY2soKSk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGFuIElHQlAgaW4gb3JkZXIgdG8gY3JlYXRlIGJsb2Nrcy4gQSBuZXdseSBjcmVhdGVkIGJsb2NrIGlzCisgICAgICogZGVxdWV1ZWQgZnJvbSB0aGUgY29uZmlndXJlZCBJR0JQLiBVbmlxdWUgSWQgb2YgSUdCUCBhbmQgdGhlIHNsb3QgbnVtYmVyIG9mCisgICAgICogYmxvY2tzIGFyZSBwYXNzZWQgdmlhIG5hdGl2ZV9oYW5kbGUuIE1hbmFnaW5nIElHQlAgaXMgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVyLgorICAgICAqIFdoZW4gSUdCUCBpcyBub3QgY29uZmlndXJlZCwgYmxvY2sgd2lsbCBiZSBjcmVhdGVkIHZpYSBhbGxvY2F0b3IuCisgICAgICogU2luY2UgemVybyBpcyBub3QgdXNlZCBmb3IgVW5pcXVlIElkIG9mIElHQlAsIGlmIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQgb3IgcHJvZHVjZXIKKyAgICAgKiBpcyBjb25maWd1cmVkIGFzIG51bGxwdHIsIHVuaXF1ZSBpZCB3aGljaCBpcyBidW5kbGVkIGluIG5hdGl2ZV9oYW5kbGUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwcm9kdWNlciAgICAgIHRoZSBJR0JQLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggYmxvY2tzCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKworY2xhc3MgQzJCYXNpY0xpbmVhckJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0xpbmVhckJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfTElORUFSOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICAvLyBUT0RPOiBmZXRjaENpcmN1bGFyQmxvY2sKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19HUkFQSElDOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJQb29sZWRCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpb24gSWQgZm9yIHVuZGVybHlpbmcgYnVmZmVycG9vbAorICAgICAqLworICAgIGludDY0X3QgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2Vzc29yIHdoaWNoIGlzIHVzZWQgYnkgdW5kZXJseWluZyBidWZmZXJwb29sLiAoSXQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHJlY2VpdmluZyBwcm9jZXNzLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBhY2Nlc3NvciAgICAgICAgICBJQWNjZXNzb3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb3V0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSAgICAgICAgICAgICBJQWNlc3NvciBpcyB3cml0ZW4gc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR1cm4gZmFsc2UgICAgICAgICAgICBJQWNjZXNzb3IgaXMgbm90IHdyaXR0ZW4uCisgICAgICovCisgICAgYm9vbCBnZXRBY2Nlc3NvcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbXBvbmVudCBmYWN0b3J5IG9iamVjdCB0aGF0IGVuYWJsZXMgdG8gY3JlYXRlIGEgY29tcG9uZW50IGFuZC9vciBpbnRlcmZhY2UgZnJvbSBhIGR5bmFtaWNhbGx5CisgKiBsaW5rZWQgbGlicmFyeS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50L2ludGVyZmFjZXMgYXJlIG1hbmFnZWQgb2JqZWN0cywgYnV0IHdlCisgKiBjYW5ub3Qgc2FmZWx5IGNyZWF0ZSBhIG1hbmFnZWQgb2JqZWN0IGFuZCBwYXNzIGl0IGluIEMuCisgKgorICogQ29tcG9uZW50cy9pbnRlcmZhY2VzIHR5cGljYWxseSBpbmhlcml0IGZyb20gc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgYnV0IEMgcmVxdWlyZXMKKyAqIHBhc3Npbmcgc2ltcGxlIHBvaW50ZXIsIGFuZCBzaGFyZWRfcHRyIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGtub3cgdGhlIGNsYXNzIHRvIGJlIGNvbnN0cnVjdGVkCisgKiBkZXJpdmVzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgKgorICovCitjbGFzcyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gQ29tcG9uZW50RGVsZXRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IEludGVyZmFjZURlbGV0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IElEIGZvciB0aGUgY3JlYXRlZCBjb21wb25lbnQKKyAgICAgKiBccGFyYW0gY29tcG9uZW50IHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlIElEIGZvciB0aGUgY3JlYXRlZCBpbnRlcmZhY2UKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIDo6QzJDb21wb25lbnRGYWN0b3J5KiAoKkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpKDo6QzJDb21wb25lbnRGYWN0b3J5Kik7Cit9OworCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorCisvLyBUbyBhbGxvdyBhcmJpdHJhcnkgb3JkZXJpbmcgb2YgQzJEZWJ1Zy5oIGFuZCBBUEkgaGVhZGVycyBhbmQgdG8ga2VlcCBkZWJ1ZyB1dGlsaXRpZXMgc2VwYXJhdGVseQorLy8gZnJvbSB0aGUgQVBJIGRlZmluaXRpb25zLCB3ZSBwcm92aWRlIEFQSSBoZWFkZXIgc3BlY2lmaWMgZGVidWcgaGVhZGVycy4KKyNpZmRlZiBDMlBBUkFNX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8QzIuaD4KKworLy8gc3RhbmRhcmQgRVJSTk8gbWFwcGluZ3MKK3RlbXBsYXRlPGludCBOPiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsKCk7Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8MD4oKSAgICAgICB7IHJldHVybiBDMl9PSzsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVJTlZBTD4oKSAgeyByZXR1cm4gQzJfQkFEX1ZBTFVFOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUFDQ0VTPigpICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RVBFUk0+KCkgICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RU5PTUVNPigpICB7IHJldHVybiBDMl9OT19NRU1PUlk7IH0KKworLy8gbWFwIHN0YW5kYXJkIGVycm5vLXMgdG8gdGhlIGVxdWl2YWxlbnQgYzJfc3RhdHVzX3QKK3RlbXBsYXRlPGludC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsOwordGVtcGxhdGU8aW50IEUsIGludCAuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDxFLCBOLi4uPiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRSkgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9lcnJubzJzdGF0dXNfaW1wbCA8RT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDw+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAwID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8aW50Li4uIE4+CitjMl9zdGF0dXNfdCBjMl9tYXBfZXJybm8oaW50IHJlc3VsdCkgeworICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworfQorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgKiBccGFyZW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkJsb2NrUG9vbCwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQmxvY2tQb29sKiAoKkNyZWF0ZUJsb2NrUG9vbEZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QpOworCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgKiBccGFyYW0gc3RhdHVzICAgICAgdGhlIHJldHVybmVkIHN0YXR1cyBmcm9tIGNyZWF0aW5nIGFsbG9jYXRvci4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkFsbG9jYXRvciwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQWxsb2NhdG9yKiAoKkNyZWF0ZUFsbG9jYXRvckZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6YzJfc3RhdHVzX3QqKTsKKworY2xhc3MgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEdldEluc3RhbmNlKCk7CisgICAgfkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAgICAgKiBccGFyYW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAgICAgKiBccGFyYW0gcG9vbCAgICAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYmxvY2sgcG9vbCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCg6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdG9yIGlzIG5vdCBjcmVhdGVkIGFzIHNoYXJlZCBzaW5nbGV0b24gYXMgQzJBbGxvY2F0b3JTdG9yZSBkb2VzLCBiZWNhdXNlCisgICAgICogQyBpbnRlcmZhY2Ugb25seSBhbGxvd3MgcmF3IHBvaW50ZXIgdHJhbnNtaXNzaW9uIGZvciBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3IgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUFsbG9jYXRvcig6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzTXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKKworICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgQ3JlYXRlQmxvY2tQb29sRnVuYyBtQ3JlYXRlQmxvY2tQb29sOworICAgIENyZWF0ZUFsbG9jYXRvckZ1bmMgbUNyZWF0ZUFsbG9jYXRvcjsKK307CisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisKKy8qKgorICogUGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIElEcworICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgOiBwdWJsaWMgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgZW51bSA6IGlkX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGlvbiBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBjb25zaXN0cyBvZjoKKyAgICAgICAgICogICBmZCAgc2hhcmVkIGlvbiBidWZmZXIgaGFuZGxlCisgICAgICAgICAqICAgaW50IHNpemUgKGxvIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IHNpemUgKGhpIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IG1hZ2ljICdceGMyaW9ceDAwJworICAgICAgICAgKi8KKyAgICAgICAgSU9OID0gUExBVEZPUk1fU1RBUlQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBncmFsbG9jIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgZ3JhbGxvYyBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEdSQUxMT0MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBidWZmZXJxdWV1ZSBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEJVRkZFUlFVRVVFLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgcGxhdGZvcm0gYWxsb2NhdG9yIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIGFsd2F5cyBwdXQgdGhpcyBtYWNybyBpbiB0aGUgbGFzdCBwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXh0ZW5kZWQgcGxhdGZvcm0gc3RvcmUgcGx1Z2luIHNob3VsZCB1c2UgdGhpcyBtYWNybyBhcyB0aGUgc3RhcnQgSUQgb2YgaXRzIG93biBhbGxvY2F0b3IKKyAgICAgICAgICogdHlwZXMuCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9FTkQsCisgICAgfTsKK307CisKKy8qKgorICogUmV0cmlldmVzIGEgYmxvY2sgcG9vbCBmb3IgYSBjb21wb25lbnQuCisgKgorICogXHBhcmFtIGlkICAgICAgICB0aGUgbG9jYWwgSUQgb2YgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBibG9jayBwb29sIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBmZXRjaCB0aGUgYmxvY2sgcG9vbCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbiAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICovCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJsb2NrIHBvb2wuCisgKiBccGFyYW0gYWxsb2NhdG9ySWQgIHRoZSBhbGxvY2F0b3IgSUQgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MKKyAqIFxwYXJhbSBjb21wb25lbnQgICAgIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmUgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdG9yIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYSBibG9jayBwb29sCisgKi8KK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cworICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAorICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCisgKiBjb21wb25lbnQgc3RvcmUgaXMgdXNlZC4KKyAqLwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisKKy8qCisgKiBBbmRyb2lkIHByb3ZpZGVzIGxvZ2dpbmcgYW5kIGRlYnVnIG1hY3Jvcy4gUmVkZWZpbmUgdGhlbSB3aXRoIEMyIHByZWZpeCBhbmQgYWRkIHN1cHBvcnQgZm9yCisgKiBvcHRpbmcgb3V0IG9mIHZlcmJvc2UgbG9ncy4KKyAqLworCisjaWZkZWYgQzJfTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIEMyX0xPR19UQUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2lmZGVmIEMyX0xPR19WRVJCT1NFCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZWxzZQorLyoqCisgKiBVc2UgYXMgZm9sbG93czoKKyAqCisgKiAjZGVmaW5lIEMyX0xPR19UQUcgInRhZyIKKyAqIC8vI2RlZmluZSBDMl9MT0dfVkVSQk9TRSAgLy8gZW5hYmxlIHZlcmJvc2UgbG9ncyBpbiB0aGlzIGZpbGUKKyAqICNpbmNsdWRlIDxDMkRlYnVnLmg+CisgKgorICogQzJfTE9HKERFQlVHKSA8PCBleHByIC4uLjsKKyAqCisgKiBMb2cgbGV2ZWxzIGFyZTogVkVSQk9TRSwgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBGQVRBTCAoYWJvcnRzKS4KKyAqCisgKiBObyBlbmRsIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgXAorICAgICAgICAoOjphbmRyb2lkOjpiYXNlOjpMRVZFTCAhPSA6OmFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpICYmIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2VuZGlmCisKKyNkZWZpbmUgQzJfQ0hFQ0sgICAgQ0hFQ0sKKyNkZWZpbmUgQzJfQ0hFQ0tfTFQgQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfQ0hFQ0tfTEUgQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfQ0hFQ0tfRVEgQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfQ0hFQ0tfR0UgQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfQ0hFQ0tfR1QgQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfQ0hFQ0tfTkUgQ0hFQ0tfTkUKKworI2RlZmluZSBDMl9EQ0hFQ0sgICAgRENIRUNLCisjZGVmaW5lIEMyX0RDSEVDS19MVCBEQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfRENIRUNLX0xFIERDSEVDS19MRQorI2RlZmluZSBDMl9EQ0hFQ0tfRVEgRENIRUNLX0VRCisjZGVmaW5lIEMyX0RDSEVDS19HRSBEQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfRENIRUNLX0dUIERDSEVDS19HVAorI2RlZmluZSBDMl9EQ0hFQ0tfTkUgRENIRUNLX05FCisKKyNlbmRpZiAgLy8gQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19CQVNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcgcHJpbnQgdXRpbGl0aWVzIGZvciBDb2RlYyAyLjAgYmFzZSBvYmplY3RzLgorICovCisKKyNkZWZpbmUgQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKHR5cGUpIFwKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKHR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/Iik7IFwKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgdHlwZSAmaSkgeyBcCisgICAgcmV0dXJuIG9zIDw8IGFzU3RyaW5nKGkpOyBcCit9CisKK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChjMl9zdGF0dXNfdCkKKworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzE4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0xPR19IXworCisvLyBQbGF0Zm9ybSBzcGVjaWZpYyBkZWJ1ZyB1dGlsaXRpZXMKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJEZWJ1Zy1sb2cuaD4KKyNlbHNlCisvLyBUT0RPOiBpbXBsZW1lbnQgYmFzZSBkZWJ1ZyB1dGlscworI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzFkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19QQVJBTV9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1Zy9wcmludCBkZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgZGVmaW5lZCBpbiBDMlBhcmFtLmgKKyAqLworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QpCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjQzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApAQCAtMCwwICsxLDc1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoqCisgKiBJbnRlcmZhY2UgSGVscGVyCisgKi8KK3VzaW5nIEMyUiA9IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxULCB0cnVlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IHBhcmFtZXRlciByZWZsZWN0b3JzLiBUaGlzIGNsYXNzIGlzIGR5bmFtaWMgYW5kIGlzIGRlc2lnbmVkIHRvIGJlCisgKiBzaGFyZWQgYnkgbXVsdGlwbGUgaW50ZXJmYWNlcy4gVGhpcyBhbGxvd3MgaW50ZXJmYWNlcyB0byBhZGQgc3RydWN0dXJlIGRlc2NyaXB0b3JzIGFzIG5lZWRlZC4KKyAqLworY2xhc3MgQzJSZWZsZWN0b3JIZWxwZXIgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CitwdWJsaWM6CisgICAgQzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZSgKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBQYXJhbXMgdHlwZXMgb2YgY29kZWMgMi4wIHN0cnVjdHMgKG9yIHBhcmFtZXRlcnMpIHRvIGRlc2NyaWJlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdHM7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyBhIHNwZWNpZmljIHN0cnVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1a3QgZGVzY3JpcHRvciBmb3IgdGhlIHN0cnVjdCB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0LgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpOworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBjbGFzcyBDMl9ISURFIF9UdXBsZSB7IH07CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzLgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVjdHMgTGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdG8gYWRkIHN1cHBvcnQgZm9yCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopOworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzIGluIGEgcmVjdXJzaXZlIG1hbm5lcgorICAgICAqIG9uZSBzdHJ1Y3R1cmUgYXQgYSB0aW1lIHVzaW5nIGEgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdGVtcG9yYXJ5LgorICAgICAqCisgICAgICogXHBhcmFtIFQgdGhlIHR5cGUgb2YgY29kZWMgMi4wIHN0cnVjdCB0byBkZXNjcmliZQorICAgICAqIFxwYXJhbSBQYXJhbXMgcmVzdCBvZiB0aGUgc3RydWN0cworICAgICAqIFxwYXJhbSBzdHJ1Y3RzIFRlbXBvcmFyeSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB1c2VkIHRvIG9wdGltaXplIHRoZSBvcGVyYXRpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPFQsIFBhcmFtcy4uLj4gKikgeworICAgICAgICBzdHJ1Y3RzLmVtcGxhY2VfYmFjaygoVCopbnVsbHB0cik7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIG11dGFibGUgc3RkOjptdXRleCBfbU11dGV4OworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yPiBfbVN0cnVjdHM7IC8vLzwgZGVzY3JpcHRvcnMKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvZGVjIDIuMCBpbnRlcmZhY2UgQVBJLXMgZm9yIHNvbWUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZC4KKyAqLworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2Ugb2Zmc2V0IG9mIGEgZmllbGQgYXQgfG9mZnNldHwgdGhhdCBjb3VsZCBiZSBwYXJ0IG9mIGFuIGFycmF5IG9yIHBhcnQgb2YgYQorICAgICAqIHN1Yi1zdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBmaWVsZCBzaXplIHZlcmlmaWNhdGlvbiwgZS5nLiBpZiBvZmZzZXQgaWYgb2J0YWluZWQgZnJvbSBhIHN0cnVjdHVyZSwKKyAgICAgKiBpdCB3aWxsIG5vdCBzdG9wIGF0IHRoZSBzdHJ1Y3R1cmUgYm91bmRhcnkgLSB0aGlzIGlzIG9rYXksIGFzIHdlIGp1c3Qgd2FudCB0aGUgYmFzZSBvZmZzZXQKKyAgICAgKiBoZXJlLCB3aGljaCBpcyB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzaXplX3QgR2V0QmFzZU9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBzaXplX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgaGVscGVyIGNsYXNzIHVzZXMgcmVmZXJlbmNlcyB0byBzdGQ6OnNoYXJlZF9wdHI8VD4gY29uZmlnIHBhcmFtZXRlcnMuCisgICAgICogSW50ZXJuYWxseSwgdGhlc2UgbmVlZCB0byBiZSBnZW5lcmFsaXplZCB0byBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gcmVmcywgYnV0IHRoZSBjYXN0IGlzCisgICAgICogbm90IGFsbG93ZWQgKGFzIHRoZXNlIGFyZSByZWZlcmVuY2VzKS4gQXMgc3VjaCwgdGhpcyBjbGFzcyBuZXZlciByZXR1cm5zIHBvaW50ZXIgdG8gdGhlCisgICAgICogc2hhcmVkX3B0cnMuCisgICAgICovCisgICAgc3RydWN0IFBhcmFtUmVmIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgZW5hYmxlPQorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8VCwgQzJQYXJhbT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaW5saW5lIEMyX0hJREUgUGFyYW1SZWYoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSkKKyAgICAgICAgICAgIDogX21SZWYocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4qPigmcGFyYW0pKSB7IH0KKworICAgICAgICAvLyB1c2VkIGJ5IGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIGNvbnRhaW5lcnMKKyAgICAgICAgb3BlcmF0b3Igc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICooKSBjb25zdCB7IHJldHVybiBfbVJlZjsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXQoKSBjb25zdCB7IHJldHVybiAqX21SZWY7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqX21SZWY7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZpZWxkIGhlbHBlci4KKyAgICAgKgorICAgICAqIENvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZDogcG9zc2libGUgdmFsdWVzLCBhbmQgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAqIHZhbHVlcy4KKyAgICAgKi8KKyAgICBjbGFzcyBGaWVsZEhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBoZWxwZXIgZm9yIGEgZmllbGQgd2l0aCBnaXZlbiBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgcmVmZXJlbmNlLiBUaGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhpcworICAgICAgICAgKiAgICAgICAgcG9pbnQuCisgICAgICAgICAqIFxwYXJhbSBmaWVsZCBmaWVsZCBpZGVudGlmaWVyCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZmllbGQKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBwYXJhbS1maWVsZCBpZGVudGlmaWVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICAgICAqIHVuZGVybHlpbmcgcGFyYW1ldGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAgICAgKgorICAgICAgICAgKiBcYXJhbSBpbmRleAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEMyUGFyYW1GaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkIG1ha2VQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1vdmVkIG91dAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHBvc3NpYmxlIHZhbHVlcworICAgICAgICAgKiBpZiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB3ZXJlIG5ldmVyIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRvIGltcGwgZm9yIHNhZmV0eQorICAgICAgICBQYXJhbVJlZiBtUGFyYW07CisgICAgICAgIF9DMkZpZWxkSWQgbUZpZWxkSWQ7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtUG9zc2libGU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtU3VwcG9ydGVkOyAvLy88IGlmIGRpZmZlcmVudCBmcm9tIHBvc3NpYmxlCisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW07CisgICAgY2xhc3MgUGFyYW1IZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGlzIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIHBhcmFtZXRlciBoZWxwZXJzIGZyb20gYSBzdGQ6OnNoYXJlZF9wdHI8VD4gJi4KKyAgICAgKi8KKyAgICBjbGFzcyBGYWN0b3J5IHsKKyAgICAgICAgLy8gXHRvZG8gdGhpcyBtYXkgYmUgYWxyZWFkeSBpbiBQYXJhbUhlbHBlcgorICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGdldFBhcmFtSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSkgY29uc3QgPSAwOworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5GYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFBhcmFtPFQ+IGdldChzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8VD4gYWx0VmFsdWUgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW08VD4oZ2V0UGFyYW1IZWxwZXIoUGFyYW1SZWYocGFyYW0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRWYWx1ZSA9PSBudWxscHRyID8gcGFyYW0gOiBhbHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWZsZWN0b3IoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgZmllbGQgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEZpZWxkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gaGVscGVyIGhlbHBlciBmb3IgdGhpcyBmaWVsZAorICAgICAgICAgKiBccGFyYW0gaW5kZXggIHBhcmFtZXRlciBpbmRleCAodGhpcyBpcyBuZWVkZWQgYXMgaXQgaXMgbm90IGF2YWlsYWJsZSBkdXJpbmcgcGFyYW1ldGVyCisgICAgICAgICAqICAgICAgICBjb25zdHJ1Y3Rpb24pIFx0b2RvIHJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgRmllbGQoc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIsIEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICBib29sIHN1cHBvcnRzQXRBbGwoVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRQb3NzaWJsZVZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIHN1cHBvcnRzTm93KFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0U3VwcG9ydGVkVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgcmVzb2x1dGlvbiBzdWdnZXN0aW9uIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IHNob3VsZEJlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBidWlsZGVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkCisgICAgICAgICAqIGZvciBub24tY29uc3QgZmllbGRzIHRvIGRpc2FsbG93IHNldHRpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBtdXN0QmUoKTsKKworICAgICAgICBvcGVyYXRvciBDMlBhcmFtRmllbGQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX21GaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgQzJSIHZhbGlkYXRlUG9zc2libGUoY29uc3QgVCAmdmFsdWUgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vLyBUT0RPCisgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgICAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB9OworCisgICAgY2xhc3MgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiYpOworICAgICAgICBQYXJhbUhlbHBlcihQYXJhbUhlbHBlciAmJik7CisgICAgICAgIH5QYXJhbUhlbHBlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciByZWYgZm9yIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IFBhcmFtUmVmIHJlZigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIG1vZGlmaWFibGUuIFRoZSBjb25zdG5lc3Mgb2YgdGhpcworICAgICAgICAvLy8gb2JqZWN0IGRldGVybWluZXMgdGhlIGNvbnN0bmVzcyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIGNvbnN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIHJlcXVlc3QgZm9yIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWUgICAgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmcgYXNzaWduZWQgdG8gdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGNvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBUaGlzIG11c3Qgbm90IGNoYW5nZS4KKyAgICAgICAgICogXHBhcmFtIG1heUJsb2NrIHdoZXRoZXIgYmxvY2tpbmcgaXMgYWxsb3dlZAorICAgICAgICAgKiBccGFyYW0gZW5kVmFsdWUgdGhlIHJlc3VsdGluZyB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZmFjdG9yeSAgcGFyYW1ldGVyIGZhY3RvcnkgKHRvIGFjY2VzcyBkZXBlbmRlbmNpZXMpCisgICAgICAgICAqIFxwYXJhbSBmYWlsdXJlcyB2ZWN0b3Igb2YgZmFpbHVyZXMgdG8gYXBwZW5kIGFueSBmYWlsdXJlcyBmcm9tIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgIG9wZXJhdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBjb25maWd1cmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHZhbHVlIGlzIGluY29ycmVjdCAoVEJEKQorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBhc3NpZ25tZW50CisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvbmZpZ3VyYXRpb24gdGltZWQgb3V0CisgICAgICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgYmxvY2tpbmcgdG8gYmUgYWxsb3dlZAorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBpbnRlcmZhY2UgaXMgY29ycnVwdGVkCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgYm9vbCAqY2hhbmdlZCwKKyAgICAgICAgICAgICAgICBGYWN0b3J5ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCisgICAgICAgIC8vLyByZXR1cm5zIHBhcmFtZXRlciBpbmRpY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIGFkZHMgYSBkZXBlbmRlbnQgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoYXQgcGFyYW1ldGVyIHJlZnMgZm9yIHBhcmFtZXRlcnMgdGhhdCBkZXBlbmQgb24gdGhpcworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW5kIG1vdmVzIG91dCBzdG9yZWQgc3RydWN0IGRlc2NyaXB0b3IKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yPiBnZXREZXNjcmlwdG9yKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlcyBwYXJhbSBoZWxwZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBub3csIHRoaXMgZmlsbHMgZmllbGQgaW5mbyBmb3IgY29uc3QgcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBhZGRlZCBhcyBzdWNoCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgICAgICBhdHRyaWJfdCYgYXR0cmliKCk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgc2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldFNldHRlcihzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZ2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgIHZvaWQgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gcmVmcyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGZpZWxkcyBhbmQgdGhlaXIgc3VwcG9ydGVkIHZhbHVlcworICAgICAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKTsKKworICAgICAgICAvLy8gYnVpbGQgdGhpcyBpbnRvIGEgZmluYWwgUGFyYW1IZWxwZXIgb2JqZWN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKTsKKworICAgICAgICBjbGFzcyBJbXBsOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIHBhcmFtZXRlciBoZWxwZXIuIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIG1lbWJlcnMgYXMgd2VsbCBhcyBmaWVsZCBoZWxwZXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW0geworICAgICAgICBQYXJhbSgKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciwgc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiB2KCpwYXJhbS5nZXQoKSksCisgICAgICAgICAgICAgIF9tVHlwZWRQYXJhbShwYXJhbSksCisgICAgICAgICAgICAgIF9tSGVscGVyKGhlbHBlciksCisgICAgICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgdXNpbmcgRmllbGRUeXBlID0gRmllbGQ8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGU+Ojp0eXBlPjo6dHlwZT47CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzID0gKHVpbnRwdHJfdCkmZmllbGQgLSAodWludHB0cl90KSZnZXQoKTsKKyAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBmYWxsIGVpdGhlciB3aXRoaW4gc2l6ZW9mKFQpICsgRkxFWF9TSVpFIG9yIHBhcmFtLT5zaXplKCkKKyAgICAgICAgICAgIC8vIHNpemVfdCBzaXplID0gc2l6ZW9mKGZpZWxkKTsKKyAgICAgICAgICAgIC8vIG1QYXJhbSBtYXkgYmUgbnVsbAorICAgICAgICAgICAgc2l6ZV90IGJhc2VTaXplID0gc2l6ZW9mKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZSk7CisgICAgICAgICAgICBzaXplX3QgYmFzZU9mZnMgPSBHZXRCYXNlT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBfbVJlZmxlY3RvciwgVDo6Q09SRV9JTkRFWCwgb2ZmcyAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICBpZiAofmJhc2VPZmZzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDMl9MT0coRkFUQUwpIDw8ICJ1bmtub3duIGZpZWxkIGF0IG9mZnNldCAiIDw8IG9mZnMgPDwgIiBzaXplICIgPDwgc2l6ZW9mKFMpCisgICAgICAgICAgICAgICAgLy8gICAgICAgPDwgIiBiYXNlLXNpemUgIiA8PCBiYXNlU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlT2ZmcyArPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyID0gX21IZWxwZXItPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZTxTPihoZWxwZXIsIF9tVHlwZWRQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdCBQYXJhbSBoYXZlIGNvbnN0IEZpZWxkczsgaG93ZXZlciwgcmVtb3ZlIGNvbnN0IGZyb20gUworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBjb25zdCBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgRmllbGRUeXBlPFM+Pihjb25zdF9jYXN0PFBhcmFtICo+KHRoaXMpLT5GKGZpZWxkKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IHJlZiB2YWx1ZSBvZiB0aGlzIGNvbnN0IHBhcmFtLgorICAgICAgICBjb25zdCBUICZnZXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgbW9kaWZpYWJsZSByZWYgdmFsdWUgb2YgdGhpcyBub24tY29uc3QgcGFyYW0uCisgICAgICAgIFQgJnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIENvbnN0LXJlZmVyZW5jZSB0byB0aGUgdmFsdWUucworICAgICAgICBUIGNvbnN0ICZ2OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IF9tVHlwZWRQYXJhbTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIEMyUCA9IFBhcmFtPFQ+OworCisgICAgLyoqCisgICAgICogVGVtcGxhdGVkIG1vdmUgYnVpbGRlciBjbGFzcyBmb3IgYSBwYXJhbWV0ZXIgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgQzJfSElERSBQYXJhbUJ1aWxkZXIgOiBwcml2YXRlIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlciBidWlsZGVyIGZyb20gbWluaW1hbCBpbmZvIHJlcXVpcmVkLiAqLworICAgICAgICBQYXJhbUJ1aWxkZXIoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgICAgICA6IFBhcmFtSGVscGVyKHBhcmFtLCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IoKFQqKW51bGxwdHIpKSwKKyAgICAgICAgICAgICAgbVR5cGVkUGFyYW0oJnBhcmFtKSB7CisgICAgICAgICAgICBhdHRyaWIoKSA9IGF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVkLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZyZXF1aXJlZCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRVFVSVJFRDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciB0cmFuc2llbnQgKG5vdCBwZXJzaXN0ZW50KS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmdHJhbnNpZW50KCkgeworICAgICAgICAgICAgYXR0cmliKCkgJj0gfmF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGhpZGRlbiAobm90IGV4cG9zZWQgaW4gSkFWQSBBUEkpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZoaWRkZW4oKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSElEREVOOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGludGVybmFsIChub3QgZXhwb3NlZCB0byBxdWVyeS9zZXR0aW5ncykuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmludGVybmFsKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0lOVEVSTkFMOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgLy8gV0FSTl9JRighZGVmYXVsdF8pOyAvLyBjb3VsZCBiZSBudWxscHRyIGlmIE9PTQorICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHksIHRoaXMgY291bGQgYmUgaW4gdGhlIHBhcmVudAorICAgICAgICAgICAgKm1UeXBlZFBhcmFtID0gc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqZGVmYXVsdF8pLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0R2V0dGVyKFt0eXBlZFBhcmFtXShib29sKSAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4geworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJQYXJhbT4oKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGFsbCBmaWVsZHMgdG8gdGhpcyBwYXJhbWV0ZXIgd2l0aCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkc18pIHsKKyAgICAgICAgICAgIHNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzXykpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIENvbnN0IHBhcmFtZXRlcnMgYnkgZGVmaW5pdGlvbiBoYXZlIG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICAgICAgc2V0U2V0dGVyKFtkZWZhdWx0X10oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrIF9fdW51c2VkLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICYpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqdHlwZWRWYWx1ZSAhPSAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gUmVhZE9ubHkoKmRlZmF1bHRfKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoZGVmYXVsdF8pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIHN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIHN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIGNvbnN0IEMyUDxUPiAmLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19TVFJJQ1Q7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyUDxUPiBvbGRWYWx1ZSA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBvbGRWYWx1ZSwgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIG5vbi1zdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFya3MgdGhpcyBhIGNhbGN1bGF0ZWQgKHJlYWQtb25seSkgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyIChjYWxjdWxhdG9yKQorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmY2FsY3VsYXRlZEFzKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVBRF9PTkxZOworICAgICAgICAgICAgcmV0dXJuIHdpdGhTZXR0ZXIoZm4sIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShkZXBzKT4oZGVwcykuLi4pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW1IZWxwZXI6OmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICptVHlwZWRQYXJhbTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgUGFyYW1CdWlsZGVyPFQ+IERlZmluZVBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKSB7CisgICAgICAgIHJldHVybiBQYXJhbUJ1aWxkZXI8VD4ocGFyYW0sIG5hbWUpOworICAgIH0KKworcHVibGljOgorICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBpbXBsZW1lbnRpbmcgY29uZmlnIGNhbGxzIGFzIHdlbGwgYXMgb3RoZXIgY29uZmlndXJhdGlvbiB1cGRhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgdmlydHVhbCwgc28gaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIHdyYXBwZXJzIGFyb3VuZCBpdCAoYW5kIHBlcmZvcm0KKyAgICAgKiBhY3Rpb25zIGp1c3QgYmVmb3JlIGFuZCBhZnRlciBhIGNvbmZpZ3VyYXRpb24pLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtcworICAgICAqIFxwYXJhbSBtYXlCbG9jaworICAgICAqIFxwYXJhbSBmYWlsdXJlcworICAgICAqIFxwYXJhbSB1cGRhdGVQYXJhbXMgaWYgdHJ1ZSwgdGhlIHVwZGF0ZWQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29waWVkIGJhY2sgaW50byB0aGUgYXJndW1lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICBwYXNzZWQgaW4gfHBhcmFtc3wKKyAgICAgKiBccGFyYW0gY2hhbmdlcyAgICAgIHBvaW50ZWQgdG8gYSB2ZWN0b3IgdG8gcmVjZWl2ZSBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkLiBJZiBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQgYXJlIGFkZGVkIHRvIHRoaXMuCisgICAgICogXHJldHVybiByZXN1bHQgZnJvbSBjb25maWcKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlUGFyYW1zID0gdHJ1ZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgPSBudWxscHRyKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IGdldFJlZmxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1SZWZsZWN0b3I7CisgICAgfQorCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2s7CisKKyAgICAvKioKKyAgICAgKiBMb2NrcyB0aGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgbG9jay4gVGhpcyBsb2NrIG11c3QgYmUgdW5sb2NrZWQgb3IgcmVsZWFzZWQgd2l0aG91dAorICAgICAqIGNhbGxpbmcgYW55IG90aGVyIGJsb2NraW5nIGNhbGwuCisgICAgICovCisgICAgTG9jayBsb2NrKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKHVpbnRwdHJfdCBzdGFydCwgdWludHB0cl90IGVuZCkgeworICAgICAgICAvLyBUT0RPOiBleGNsdWRlIHRoaXMgaGVscGVyCisgICAgICAgICh2b2lkKXN0YXJ0OworICAgICAgICAodm9pZCllbmQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgc3RydWN0IEZhY3RvcnlJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxGYWN0b3J5SW1wbD4gX21GYWN0b3J5OworCisgICAgQzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhcmFtZXRlciB0byB0aGlzIGludGVyZmFjZS4KKyAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBDSEVDS3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlcGVuZGVuY3kgaW5kZXggZm9yIGEgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGl4IHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyCisgICAgICovCisgICAgc2l6ZV90IGdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMySW50ZXJmYWNlSGVscGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0cyBzdWJjbGFzcyBpbnN0YW5jZSdzIGFkZHJlc3MgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBcdG9kbyBhbGxvdyBzdWJjbGFzcyB0byBzcGVjaWZ5IHBhcmFtZXRlciBhZGRyZXNzIHJhbmdlIGRpcmVjdGx5IChlLmcuIGRvIG5vdCBhc3N1bWUgdGhhdAorICAgICAqICAgICAgIHRoZXkgYXJlIGxvY2FsIHRvIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSkKKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHR5cGUgb2YgdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKiBccGFyYW0gaW5zdGFuY2UgcG9pbnRlciB0byB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyX0hJREUgdm9pZCBzZXREZXJpdmVkSW5zdGFuY2UoVCAqaW5zdGFuY2UpIHsKKyAgICAgICAgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcygodWludHB0cl90KWluc3RhbmNlLCAodWludHB0cl90KShpbnN0YW5jZSArIDEpKTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShDMkludGVyZmFjZUhlbHBlcik7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIGNsYXNzIGZvciBhIGZpZWxkIG9mIGEgcGFyYW1ldGVyCisgKgorICogXHBhcmFtIHNwUGFyYW0gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpbiBhbiBpbnRlcmZhY2UgY2xhc3Mgc3ViY2xhc3NlZCBmcm9tIEMySW50ZXJmYWNlSGVscGVyLgorICogXHBhcmFtIGZpZWxkICAgYSBmaWVsZCBvZiBzdWNoIHBhcmFtZXRlcgorICovCisjZGVmaW5lIEMyRihzcFBhcmFtLCBmaWVsZCkgXAorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8IFwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8IFwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShzcFBhcmFtLT5maWVsZCk+Ojp0eXBlPjo6dHlwZT46OnR5cGU+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChzcFBhcmFtLmdldCgpLCAmc3BQYXJhbS0+ZmllbGQpKQorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMzdlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKQEAgLTAsMCArMSwxMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBtYXAgdW5kZXJseWluZyB0eXBlcyB0byBDMlZhbHVlIHR5cGVzIGFzIHdlbGwgYXMgdG8gcHJpbnQgZmllbGQgdmFsdWVzLiBUaGlzIGlzCisgKiBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgc2ltcGx5IHRoZSB1bmRlcmx5aW5nIHR5cGUgZXhjZXB0IGZvciBjaGFyYWN0ZXJzIChTVFJJTkcpIGFuZCBieXRlcyAoQkxPQikuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyIHsKKyAgICB0eXBlZGVmIFQgVmFsdWVUeXBlOworICAgIGlubGluZSBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBwLnJlZjxUPigpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8dWludDhfdD4geworICAgIHR5cGVkZWYgdWludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjxjaGFyPiB7CisgICAgdHlwZWRlZiBpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlIHJhbmdlIHV0aWxpdHkgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgbWltaWNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZSBmb3IgUkFOR0UgdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkUmFuZ2UgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworLy9wcml2YXRlOgorICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUFYX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9TVEVQID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgcmFuZ2Ugd2l0aCBubyBzdXBwb3J0ZWQgdmFsdWVzLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUFYX1ZBTFVFLCBNSU5fVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGFsbCB2YWx1ZXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gQW55KCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYSBzaW5nbGUgc3VwcG9ydGVkIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBzb2xlIHN1cHBvcnRlZCB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1BWF9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUFYX1ZBTFVFKSwgTUFYX1ZBTFVFKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlICsgTUlOX1NURVAsIE1BWF9WQUxVRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGxlc3MgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gR3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGdyZWF0ZXIgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gTGVzc1RoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNSU5fVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUlOX1ZBTFVFKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlIC0gTUlOX1NURVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgY29udGludW91cyBvciBhcml0aG1ldGljIHJhbmdlIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gTUlOX1NURVApIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWV0cmljIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCAwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2UgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHJhbmdlIGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgUkFOR0UgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IF9tTWF4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIHZhbGlkLgorICAgICAqCisgICAgICogUmFuZ2VzIGFyZSB2YWxpZCBpZiB0aGV5IGFyZSBjb250aW51b3VzIG9yIG1vbm90b25pYy4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG92ZXJmbG93IG9yIG5lZ2F0aXZlIHNlcmllcworICAgICAgICByZXR1cm4gX21EZW5vbSA+IDAgJiYgX21OdW0gPj0gX21EZW5vbSAmJiBfbU1pbiAqIChfbURlbm9tIC0gX21OdW0pIDwgX21TdGVwICogX21EZW5vbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHJhbmdlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHJhbmdlIGFuZCBhbm90aGVyLCBpZiBpdCBpcworICAgICAqIHJlcHJlc2VudGFibGUgYXMgYSByYW5nZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoX21NaW4sIF9tTWF4LCBfbVN0ZXAsIF9tTnVtLCBfbURlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtaW4oKSBjb25zdCAgIHsgcmV0dXJuIF9tTWluOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWF4KCkgY29uc3QgICB7IHJldHVybiBfbU1heDsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGVwIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgc3RlcCgpIGNvbnN0ICB7IHJldHVybiBfbVN0ZXA7ICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1lcmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBudW0oKSBjb25zdCAgIHsgcmV0dXJuIF9tTnVtOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlbm9taW5hdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgZGVub20oKSBjb25zdCB7IHJldHVybiBfbURlbm9tOyB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgYWxsIHZhbHVlcyBiZXR3ZWVuIF9tTWluIGFuZCBfbU1heC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc1NpbXBsZVJhbmdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID09IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKyBfbVN0ZXAsIHdoZXJlIF9tU3RlcCA+IDAgYW5kIF9tTWluIDw9IHhbaV0gPD0gX21NYXgKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0FyaXRobWV0aWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPiBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpXSA9IHhbMF0gKiAoX21OdW0gLyBfbURlbm9tKSBeIGkgKHdpdGggcm91bmRpbmcpLCB3aGVyZSBfbU51bSA+IF9tRGVub20gPiAwIGFuZCB4WzBdID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzR2VvbWV0cmljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiAwICYmIF9tU3RlcCA9PSAwICYmIF9tTnVtID4gX21EZW5vbSAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICogX21OdW0gLyBfbURlbm9tICsgX21TdGVwICh3aXRoIHJvdW5kaW5nKSwgd2hpbGUgeFtpICsgMV0gPiB4W2ldLCB3aGVyZQorICAgICAqIF9tU3RlcCAhPSAwLCBfbURlbm9tID4gMCBhbmQgX21OdW0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNNYWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgIT0gMCAmJiBfbU51bSA+IDAgJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBhcml0aG1ldGljIG9yIGNvbnRpbnVvdXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gVChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxKSkKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKDEpLCBfbURlbm9tKDEpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXJ0aWMgc29yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLiBUaGlzIGlzIDAgZm9yIGEgcHVyZSBnZW9tZXRyaWMKKyAgICAgKiAgICAgICAgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0obnVtKSwgX21EZW5vbShkZW4pIHsgfQorCisgICAgVCBfbU1pbjsgLy8vPCBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQKKyAgICBUIF9tTWF4OyAvLy88IHVwcGVyIGJvdW5kCisgICAgVCBfbVN0ZXA7IC8vLzwgc3RlcCBvZiBhbiBhcml0aG1ldGljIHNlcmllcyAoMCBpZiBjb250aW51b3VzIGZsb2F0aW5nIHBvaW50IHJhbmdlKQorICAgIFQgX21OdW07IC8vLzwgbnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworICAgIFQgX21EZW5vbTsgLy8vPCBkZW5vbWluYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRGbGFncyB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCBmbGFncyByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjppbml0aWFsaXplcl9saXN0PEMyVmFsdWU6OlByaW1pdGl2ZT4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgRkxBR1MgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXQgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgZmxhZyBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCFpc0VtcHR5KCkgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiBmbGFncygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluaW11bSBzZXQgb2YgZmxhZ3MgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIFQgbWluKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZGlyZWN0bHkgZnJvbSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGZsYWdzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMgYW5kIGEgbWluaW11bSBmbGFnIHNldAorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCB2YWx1ZSBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSB2YWx1ZSBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHsgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgVkFMVUVTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSB2YWx1ZSByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIGZsYWcgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBDMlZhbHVlOjpQcmltaXRpdmUgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcworICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBzdXBwb3J0ZWQgc2V0IG9mIHZhbHVlcworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIEMyRmllbGRTdXBwb3J0ZVZhbHVlcyBvYmplY3QgZm9yIGZpZWxkcyBvZiB2YXJpb3VzIHR5cGVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjsKKworLy8gdGVtcGxhdGVkIG9wZXJhdG9yIG11c3QgYmUgcHJlZGVjbGFyZWQgZm9yIGZyaWVuZCBkZWNsYXJhdGlvbgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGEgc3BlY2lmaWMgdHlwZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHN0cnVjdC4KKyAgICAgKi8KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvLyBUUklDS1k6IG5lZWRlZCBmb3Igc3RkOjp1bmlxdWVfcHRyPEltcGw+IGRlY2xhcmF0aW9uCisgICAgfkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyJiBvcGVyYXRvcj0oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdXNlIHBpbXBsIGFzIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZQorICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKyAgICAvL2ZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmaSk7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgYnVpbGRlciBjYW4gYmUgdXNlZCB0byBzdWNjZXNzaXZlbHkgcmVzdHJpY3QgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuIFVwb24KKyAqIGNyZWF0aW9uLCB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHZhbHVlcyBzcGVjaWZpZWQgLSB3aGljaCBmb3IgdGhpcyBidWlsZGVyIG1lYW5zIHRoYXQgYWxsCisgKiB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggbm8gZGVmaW5lZCB2YWx1ZXMgLSBidXQgaW1wbGljaXRseSBhbnkgdmFsdWUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpOworCisgICAgLyoqCisgICAgICogR2V0IEMyUGFyYW1GaWVsZFZhbHVlcyBmcm9tIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMlBhcmFtRmllbGRWYWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmFueSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBmcm9tIHRoZSBidWlsZGVyIGFzIGFsbCBwYXJhbXMgbXVzdCBoYXZlIHN1cHBvcnRlZAorICAgICAqICAgICAgIHZhbHVlcywgYnV0IGlzIGhlcmUgaW4gY2FzZSB0aGlzIGlzIHJlYWxseSB0aGUgY2FzZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub25lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmVxdWFsVG8oVCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdExlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSByYW5nZSBvZiBbIHxtaW58LCB8bWF4fCBdCisgICAgICogd2l0aCBvcHRpb25hbCB8c3RlcHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5SYW5nZSgKKyAgICAgICAgICAgIFQgbWluLCBUIG1heCwgVCBzdGVwID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyBUKDApIDogVCgxKSkgIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5SYW5nZShtaW4sIG1heCwgc3RlcCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgZ2VvbWV0cmljIHNlcmllcyBzdGFydGluZworICAgICAqIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5TZXJpZXMobWluLCBtYXgsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogc3RhcnRpbmcgZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwgYW5kIHxzdGVwfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5NYWNTZXJpZXMobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8ZmxhZ3N8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHx2YWx1ZXN8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyJiBvcGVyYXRvcj0oY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSByYW5nZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIGEgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAqLworY2xhc3MgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsaXN0IGNvbnRhaW5pbmcgYSBzaW5nbGUgc2V0dGluZyBjb25mbGljdC4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjb25mbGljdCB0byB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyBhbmQgcmV0dXJucyB0aGlzCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciYgd2l0aChDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIChhbmQgbW92ZXMgdGhlbSBvdXQgb2YgdGhpcyBidWlsZGVyLikKKyAgICAgKiAodGhpcyBpcyB3aHkgaXQgaXMgbm90IGNvbnN0KQorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gcmV0cmlldmVDb25mbGljdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBsaXN0IGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX21Db25mbGljdHMuZW1wdHkoKTsgfQorCisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBlbXB0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBfbUNvbmZsaWN0czsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHQgYnVpbGRlciBmb3IgYSBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IFJlYWRPbmx5KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW0pOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJhZC12YWx1ZSBvciBpbmZvaW5mb3JtYXRpb25hbCBiYWQtdmFsdWUgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgdGhlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIHBvc3NpYmxlIHZhbHVlcy4gQXMgc3VjaCwgdGhlcmUgYXJlIG5vCisgICAgICogY29uZmxpY3RzIGZvciB0aGlzIGNhc2UgZWl0aGVyLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCAob3IgaW5mb3JtYXRpb25hbCBjb25mbGljdCkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgdGFrZXMgRlNWIHNvIHVzZSBwYXJhbUZpZWxkVmFsdWVzIGFuZCBvcHRpb25hbCBjb25mbGljdHMuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBDb25mbGljdCgKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywKKyAgICAgICAgICAgIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLy8gVE9ETzogcmV0cmlldmUgcmVzdWx0cworCisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICBDMlNldHRpbmdSZXN1bHQgX21SZXN1bHQ7CisKKyAgICBDMlNldHRpbmdSZXN1bHRCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgJikgPSBkZWxldGU7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0cyAoUExVUkFMKSBidWlsZGVyLgorICoKKyAqIFNldHRpbmcgcmVzdWx0cyBjb250YWluIGEgZmFpbHVyZSBzdGF0dXMgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgZmFpbGluZyBmaWVsZHMgb3IgcGFyYW1zLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgeworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJikgPSBkZWxldGU7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyICZvcGVyYXRvcj0oQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworCisgICAgLyoqIFxyZXR1cm5zIChkZWZhdWx0KSBzdWNjZXNzZnVsIHJlc3VsdCB3aXRoIG5vIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBPaygpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX09LKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGlzIGluIGJhZCBzdGF0ZSwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBCYWRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0JBRF9TVEFURSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIHRpbWVkIG91dCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBUaW1lZE91dCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX1RJTUVEX09VVCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIGlzIGNvcnJ1cHRlZCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDb3JydXB0ZWQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9DT1JSVVBURUQpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgTm9NZW1vcnkoQzJQYXJhbTo6SW5kZXggaW5kZXhfIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE86IHRyeSB0byBhZGQgZmFpbHVyZSByZXN1bHQKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX05PX01FTU9SWSk7CisgICAgfQorCisgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RydWN0b3IKKyAgICAvKiogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBhIHNpbmdsZSBiYWQgdmFsdWUgc2V0dGluZyByZXN1bHQuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KTsKKworICAgIC8qKiBDb21iaW5lcyB0aGlzIHJlc3VsdHMgd2l0aCBvdGhlciByZXN1bHRzLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKTsKKworICAgIC8qKiBSZXRyaWV2ZSAoZ2V0IGFuZCBtb3ZlIG91dCkgZmFpbHVyZXMgYW5kIHJldHVybiB0aGUgZmFpbHVyZSBzdGF0dXMuICovCisgICAgYzJfc3RhdHVzX3QgcmV0cmlldmVGYWlsdXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworcHJpdmF0ZToKKyAgICAvKiogU2V0dGluZyByZXN1bHRzIGJhc2VkIG9uIGEgc2luZ2xlIHN0YXR1cy4gVGhpcyBpcyB1c2VkIHdoZW4gYWN0dWFsIHNldHRpbmcgY291bGQgbm90IGJlCisgICAgICogIGF0dGVtcHRlZCB0byBnZXQgYSBzaW5nbGUgQzJTZXR0aW5nUmVzdWx0LCBvciB3aGVuIGEgc2V0dGluZyBzdWNjZWVkZWQgd2l0aG91dAorICAgICAqICAnY29tcGxhaW50cycuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgLy8gc3RhdHVzIG11c3QgYmUgb25lIG9mIE9LLCBCQURfU1RBVEUsIFRJTUVEX09VVCwgQ09SUlVQVEVEIG9yIE5PX01FTU9SWQorICAgICAgICAvLyBtYWlubHk6IEJMT0NLSU5HLCBCQURfSU5ERVgsIEJBRF9WQUxVRSBhbmQgTk9fTUVNT1JZIHJlcXVpcmVzIGEgc2V0dGluZyBhdHRlbXB0LCBidXQKKyAgICAgICAgLy8gTk9fTUVNT1JZIG1heSBub3QgYWxsb3cgdXMgdG8gY3JlYXRlIGEgcmVzdWx0cyBzdHJ1Y3R1cmUuCisKKyAgICAvKioKKyAgICAgKiBPbmUgb2YgT0ssIEJBRF9JTkRFWCwgQkFEX1ZBTFVFLCBCQURfU1RBVEUsIE5PX01FTU9SWSwgVElNRURfT1VULCBCTE9DS0lORyBvciBDT1JSVVBURUQuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgX21TdGF0dXMgX191bnVzZWQ7CisKKyAgICAvKioKKyAgICAgKiBWZWN0b3Igb2YgaW5kaXZpZHVhbCBzZXR0aW5nIHJlc3VsdCBkZXRhaWxzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBfbVJlc3VsdHM7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gZW51bWVyYXRlIGZpZWxkcyBvZiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzIHsKKyAgICBzdHJ1Y3QgX0luc3BlY3RvcjsKKworICAgIC8qKgorICAgICAqIEFuIGV4dGVuZGVkIGZpZWxkIGRlc2NyaXB0b3Igb2JqZWN0IHdpdGggc3RydWN0dXJhbCBpbmZvcm1hdGlvbiAobGluZWFnZSBiYWNrIHRvIHRoZSByb290IG9mCisgICAgICogdGhlIHBhcmFtKS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlX3Q7IC8vLzwgZmllbGQgdHlwZQorICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgTmFtZWRWYWx1ZXNUeXBlOyAvLy88IG5hbWVkIHZhbHVlcyBsaXN0IHR5cGUKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKKyAgICAgICAgdHlwZV90IHR5cGUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJpbmdzIGZvciB0aGlzIGZpZWxkLiBUaGUgcmV0dXJuZWQgcmVmZXJlbmNlIGlzCisgICAgICAgICAqIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSB2YWxpZGl0eSBvZiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgTmFtZWRWYWx1ZXNUeXBlICZuYW1lZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYW4gaW5kZXggb2YgMCwgYW5kCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBoYXMgYW4gaW5kZXggb2YgMy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAgICAgLy8vIFRbXSBhcnJheXMgaWYgdGhpcyBpbmZvIGNvbWVzIGZyb20gYSBDMlBhcmFtOjpJbmRleCBvYmplY3QsIGFuZCB0aGUgY3VycmVudGx5IHVzZWQKKyAgICAgICAgLy8vIGV4dGVudCBpZiBpdCBjb21lcyBmcm9tIGEgQzJQYXJhbSBvYmplY3QuIFJldHVybnMgMSBmb3IgVFsxXSBhcnJheXMgYXMgd2VsbCBhcyBpZiB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICAgICAgc2l6ZV90IGV4dGVudCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgKHN0cnVjdHVyYWwpIGRlcHRoIG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YKKyAgICAgICAgICogIDAsIGFuZCBwYXJhbS5zdHJ1Y3QuZmllbGQgb3IgcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mIDEuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgZGVwdGgoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gdGhlIHBhcmFtZXRlciBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBvZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIEUuZy4gZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSB0aGlzIGlzIHRoZSBvZmZzZXQKKyAgICAgICAgICogb2YgaXRzIHNtYWxsZXN0IHNpYmxpbmc6IHBhcmFtLnN0cnVjdFsyXS5maWVsZFswXS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheU9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQncyBhcnJheS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGV4dGVudCgpICogc2l6ZSgpCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGJhc2UgZmllbGQuIFRoZSBiYXNlIGZpZWxkIGlzIGEgY291c2luIG9mIHRoZSBjdXJyZW50IGZpZWxkIHdoZXJlCisgICAgICAgICAqIGFsbCBpbmRpY2VzIGFyZSAwLiBFLmcuIHRoZSB0aGUgYmFzZSBmaWVsZCBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGlzCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXS4gQmFzZSBmaWVsZHMgYXJlIHVzZWQgdG8gc3BlY2lmeSBzdXBwb3J0ZWQgdmFsdWVzIGZvcgorICAgICAgICAgKiBhbGwgY291c2luIGZpZWxkcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBiYXNlRmllbGRPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgYW4gYXJpdGhtZXRpYyAoaW50ZWdyYWwsIGNvdW50ZXIgb3IgZmxvYXQpIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0FyaXRobWV0aWMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgY2FuIGhhdmUgYSBmbGV4aWJsZSBleHRlbnQuIGV4dGVudCgpIHJldHVybnMgdGhlIGN1cnJlbnQKKyAgICAgICAgICogZXh0ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIF9tSW1wbCAhPSBudWxscHRyOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZm8gZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyBmaWVsZCwgb3IgYW4gaW52YWxpZCBJbmZvIG9iamVjdCBpZiBpdCBoYXMgbm8KKyAgICAgICAgLy8vIHBhcmVudHMKKyAgICAgICAgSW5mbyBwYXJlbnQoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gX21JbXBsOworICAgICAgICBmcmllbmQgc3RydWN0IF9JbnNwZWN0b3I7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmF0b3Igb2JqZWN0IG92ZXIgZmllbGRzIHVzaW5nIEluZm8gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSXRlcmF0b3IgeworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgdmFsdWVfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgKiBwb2ludGVyOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgcmVmZXJlbmNlOworICAgICAgICB0eXBlZGVmIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAgIC8vLyByZXR1cm4gSW5mbyBhdCBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIHZpcnR1YWwgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgICAgIC8vLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkCisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQorCisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgZmllbGRzLgorICAgICAqLworICAgIHN0cnVjdCBMaXN0IHsKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgfkxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIExpc3Qoc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCAoYmFzZSkgZmllbGRzIGF0IGluZGV4IDAgb2YgdGhlIHBhcmFtZXRlci4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyB0aGUKKyAgICAgKiBmb2xsb3dpbmc6CisgICAgICogICBGaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgYXJlIGVudW1lcmF0ZWQgaW4gZmllbGQgb3JkZXIuIEhvd2V2ZXIsIHN1Yi1maWVsZHMgb2YgYSBzdHJ1Y3R1cmUKKyAgICAgKiAgIGFyZSBlbnVtZXJhdGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZmllbGQsIGFuZCBwcmlvciB0byBzaWJsaW5nIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEluIGVzc2VuY2UgdGhlIG9yZGVyIG9mIGVudW1lcmF0aW9uIGlzIGZpcnN0IGJ5IGluY3JlYXNpbmcgb2Zmc2V0LCB0aGVuIGJ5IGRlY3JlYXNpbmcgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gZW51bWVyYXRlIGl0cyBmaWVsZHMKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yIHBhcmFtZXRlciByZWZsZWN0b3IgdXNlZCBmb3IgZW51bWVyYXRpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlRmllbGRzKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBjb3VzaW4gZmllbGRzIHVwIHRvIGRlcHRoIC0gbGV2ZWwgZm9yIGEgZmllbGQuIElmIGxldmVsIGlzIDAsIGl0IGVudW1lcmF0ZXMKKyAgICAgKiBvbmx5IHRoZSBmaWVsZC4gRm9yIGxldmVsIDEsIGl0IGVudW1lcmF0ZXMgYWxsIGZpZWxkcyBpbiBpdHMgY3VycmVudCBhcnJheSAod2hpY2ggbWF5IGJlCisgICAgICogaXRzZWxmIGlmIGV4dGVudCBpcyAxKS4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyBieSBpbmNyZWFzaW5nIGZpZWxkIG9mZnNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVDb3VzaW5zKAorICAgICAgICAgICAgY29uc3QgSW5mbyAmZmllbGQsCisgICAgICAgICAgICB1aW50MzJfdCBsZXZlbCA9IH4wKTsKKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIGZpZWxkIGluIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgbGlzdCBvZiAyIGVsZW1lbnRzIC0gdGhlIG1vc3Qtc3BlY2lmaWMgZmllbGQKKyAgICAgKiBhcnJheSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBmaWVsZC4gSWYgdGhlIGZpZWxkIGlzIG5vdCBhIHZhbGlkIGZpZWxkCisgICAgICogc3BlY2lmaWVyIGZvciB0aGlzIHBhcmFtZXRlciAoZS5nLiBpdCBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIHBhcmFtZXRlciksIGl0IHJldHVybnMKKyAgICAgKiBhbiBlbXB0eSBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworfTsKKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWJkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19QQVJBTV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKK3N0cnVjdCBDMlBhcmFtOworCitjbGFzcyBDMlBhcmFtVXRpbHMgeworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X1BhcmFtVXRpbHNUZXN0X1Rlc3Q7CisKK3B1YmxpYzoKKworICAgIC8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorICAgIHN0YXRpYworICAgIEMyUGFyYW0gKlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpOworfTsKKworLy8vIFxlbmRjb25kCisKKyNlbmRpZiAgLy8gQzJVVElMU19QQVJBTV9VVElMU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmYzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YTsKKworfQorfQorfQorfQorCisvKioKKyAqIFN0b3JlcyBpbmZvcm1hdGlvbnMgZnJvbSBDMkJsb2NrUG9vbCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IEMyQmxvY2suCisgKi8KK3N0cnVjdCBDMl9ISURFIF9DMkJsb2NrUG9vbERhdGEgeworICAgIGVudW0gdHlwZV90IDogaW50IHsKKyAgICAgICAgVFlQRV9CVUZGRVJQT09MID0gMCwKKyAgICAgICAgVFlQRV9CVUZGRVJRVUVVRSwKKyAgICB9OworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIF9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworfTsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworCisvKioKKyAqIEludGVybmFsIG9ubHkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9ja3MgYnkgYmxvY2sgcG9vbC9idWZmZXIgcGFzc2luZyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogXHRvZG8gdGhpcyBtdXN0IGJlIGhpZGRlbgorICovCitzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5IHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBvZmZzZXQgYWxsb3R0ZWQgcmFuZ2Ugb2Zmc2V0CisgICAgICogXHBhcmFtIHNpemUgIGFsbG90dGVkIHNpemUKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gfihzaXplX3QpMCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgc2VjdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBjcm9wICBhbGxvdHRlZCBjcm9wIHJlZ2lvbgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMUQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDFEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2sxRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMkQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDJEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMkQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYnVmZmVycG9vbCBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhICAgICAgICAgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGJ1ZmZlclBvb2xEYXRhICAgIHBvaW50ZXIgdG8gYnVmZmVycG9vbCBkYXRhIHdoZXJlIHRoZSBidWZmZXJwb29sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHVybiB7XGNvZGUgdHJ1ZX0gd2hlbiB0aGVyZSBpcyB2YWxpZCBidWZmZXJwb29sIGRhdGEsIHtcY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgR2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICpidWZmZXJQb29sRGF0YSk7CisKKyAgICAvKgorICAgICAqIExpZmUgQ3ljbGUgTWFuYWdlbWVudCBvZiBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9ja3MKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBBIGJsb2NrIHRoYXQgaXMgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCByZXF1aXJlcyBzb21lCisgICAgICogc3BlY2lhbCB0cmVhdG1lbnQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBibG9jaworICAgICAqIGNvcnJlc3BvbmRzIHRvIGEgaGVsZCAoZGVxdWV1ZWQvYXR0YWNoZWQpIEdyYXBoaWNCdWZmZXIgaW4gYSBzbG90IG9mIGEKKyAgICAgKiBidWZmZXJxdWV1ZSwgaXRzIGRlc3RydWN0aW9uIHNob3VsZCB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAqIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlcigpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCisgICAgICogR3JhcGhpY0J1ZmZlciBpcyBub3QgaGVsZCwgaS5lLiwgaWYgaXQgaGFzIGJlZW4gcXVldWVkIG9yIGRldGFjaGVkLAorICAgICAqIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBub3QgYmUgY2FsbGVkIHVwb24gdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIF9DMkJsb2NrUG9vbERhdGEgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCBpbmNsdWRlcyB0d28KKyAgICAgKiBtYWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKKyAgICAgKiAgIC0gImhlbGQiIHN0YXR1czogV2hldGhlciBjYW5jZWxCdWZmZXIoKSBzaG91bGQgYmUgY2FsbGVkIHVwb24KKyAgICAgKiAgICAgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqICAgLSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50OiBUaGUgcXVhZHJ1cGxlIChpZ2JwLCBnZW5lcmF0aW9uLCBicUlkLAorICAgICAqICAgICBicVNsb3QpLCB3aGVyZSBpZ2JwIGlzIHRoZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgZ2VuZXJhdGlvbiBpcyB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyLCBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGJxSWQgaXMgdGhlIGdsb2JhbGx5IHVuaXF1ZSBpZCBvZiB0aGUgYnVmZmVycXVldWUsIGFuZAorICAgICAqICAgICBicVNsb3QgaXMgdGhlIHNsb3QgaW4gdGhlIGJ1ZmZlcnF1ZXVlLgorICAgICAqCisgICAgICogaWdicCBpcyB0aGUgaW5zdGFuY2Ugb2YgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBvbiB3aGljaCBjYW5jZWxCdWZmZXIoKQorICAgICAqIHdpbGwgYmUgY2FsbGVkIGlmICJoZWxkIiBzdGF0dXMgaXMgdHJ1ZSB3aGVuIHRoZSBibG9jayBpcyBkZXN0cm95ZWQuCisgICAgICogKGJxU2xvdCBpcyBhbiBpbnB1dCB0byBjYW5jZWxCdWZmZXIoKS4pIEhvd2V2ZXIsIG9ubHkgZ2VuZXJhdGlvbiwgYnFJZAorICAgICAqIGFuZCBicVNsb3QgYXJlIHJldGFpbmVkIHdoZW4gYSBibG9jayBpcyB0cmFuc2ZlcnJlZCBmcm9tIG9uZSBwcm9jZXNzIHRvCisgICAgICogYW5vdGhlci4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGJvdGggdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZworICAgICAqIHByb2Nlc3NlcyB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBvZiAiaGVsZCIgc3RhdHVzIGFuZCBpZ2JwLiBCZWxvdyBhcmUKKyAgICAgKiBmdW5jdGlvbnMgcHJvdmlkZWQgZm9yIHRoaXMgcHVycG9zZToKKyAgICAgKgorICAgICAqICAgLSBHZXRCdWZmZXJRdWV1ZURhdGEoKTogUmV0dXJucyBnZW5lcmF0aW9uLCBicUlkIGFuZCBicVNsb3QuCisgICAgICogICAtIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpOiBTZXRzICJoZWxkIiBzdGF0dXMgdG8gdHJ1ZS4KKyAgICAgKiAgIC0gWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIGZhbHNlLgorICAgICAqICAgLSBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQKKyAgICAgKiAgICAgImhlbGQiIHN0YXR1cy4KKyAgICAgKgorICAgICAqIEFsbCB0aGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBfQzJCbG9ja1Bvb2xEYXRhLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkKKyAgICAgKiBjYWxsaW5nIEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKCkuCisgICAgICoKKyAgICAgKiBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSB3aWxsIG1hcmsgdGhlIGJsb2NrIGFzIGhlbGQsIHdoaWxlCisgICAgICogWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSB3aWxsIGRvIHRoZSBvcHBvc2l0ZS4gVGhlc2UgdHdvIGZ1bmN0aW9ucyBkbworICAgICAqIG5vdCBtb2RpZnkgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQsIHNvIGl0IGlzIG5vdCB3cm9uZyB0byBjYWxsCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgYWZ0ZXIgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBpZiBpdCBjYW4gYmUKKyAgICAgKiBndWFyYW50ZWVkIHRoYXQgdGhlIGJsb2NrIGlzIG5vdCBkZXN0cm95ZWQgZHVyaW5nIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUKKyAgICAgKiB0d28gY2FsbHMuCisgICAgICoKKyAgICAgKiBBc3NpbmdCbG9ja1RvQnVmZmVyUXVldWUoKSBoYXMgYSAiaGVsZCIgc3RhdHVzIGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICoKKyAgICAgKiBNYWludGFpbmluZyBDb25zaXN0ZW5jeSB3aXRoIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgT3BlcmF0aW9ucworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBkZXF1ZXVlQnVmZmVyKCkKKyAgICAgKiAgIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGJsb2NrcG9vbC4gSXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAgICAgKiAgICAgbWFudWFsbHkuIFRoZSBibG9ja3Bvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBjb3JyZWN0CisgICAgICogICAgIGluZm9ybWF0aW9uIGZvciBfQzJCbG9ja1Bvb2xEYXRhLCB3aXRoICJoZWxkIiBzdGF0dXMgc2V0IHRvIHRydWUuCisgICAgICoKKyAgICAgKiBxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIHF1ZXVlQnVmZmVyKCkgaXMgY2FsbGVkLCBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQuCisgICAgICoKKyAgICAgKiBhdHRhY2hCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBhdHRhY2hCdWZmZXIoKSBpcyBjYWxsZWQsIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogZGV0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgZGV0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnF1ZXVlIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBccCBnZW5lcmF0aW9uIHNldCB0byBudWxscHRyIHdpbGwgcmV0dXJuCisgICAgICogd2hldGhlciB0aGUgYmxvY2sgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgYnV0IHdpbGwgbm90CisgICAgICogZmlsbCBpbiB0aGUgdmFsdWVzIGZvciBccCBnZW5lcmF0aW9uLCBccCBicUlkIG9yIFxwIGJxU2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHBvb2xEYXRhICAgYmxvY2twb29sIGRhdGEuCisgICAgICogXHBhcmFtW291dF0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbVtvdXRdIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIG93bmluZyB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtW291dF0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50NjRfdCogYnFJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFNldCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGFuZCAiaGVsZCIgc3RhdHVzIHRvIGEgYmxvY2sgY3JlYXRlZCBieSBhCisgICAgICogYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgZnJvbSB0aGUgZGVzaWduYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnF1ZXVlLgorICAgICAqIFxwYXJhbSBnZW5lcmF0aW9uIEdlbmVyYXRpb24gbnVtYmVyIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvLgorICAgICAqIFxwYXJhbSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSB0aGF0IHdpbGwgb3duIHRoZSBidWZmZXIgKGJsb2NrKS4KKyAgICAgKiBccGFyYW0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbSBoZWxkICAgICAgIFdoZXRoZXIgdGhlIGJsb2NrIGlzIGhlbGQuIFRoaXMgImhlbGQiIHN0YXR1cyBjYW4gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIGxhdGVyIGJ5IGNhbGxpbmcgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIGlmIFxwIHBvb2xEYXRhIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBOb3RlOiBccCBnZW5lcmF0aW9uIHNob3VsZCBtYXRjaCB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyIHNldCBvbiB0aGUKKyAgICAgKiBidWZmZXJxdWV1ZSwgYW5kIFxwIGJxSWQgc2hvdWxkIG1hdGNoIHRoZSB1bmlxdWUgaWQgZm9yIHRoZSBidWZmZXJxdWV1ZQorICAgICAqIChvYnRhaW5hYmxlIGJ5IGNhbGxpbmcgaWdicC0+Z2V0VW5pcXVlSWQoKSkuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBib29sIGhlbGQgPSB0cnVlKTsKKworICAgIC8qKgorICAgICAqIEhvbGQgYSBibG9jayBmcm9tIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSB0byBiZSBhc3NpZ25lZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2suIFRoaXMgaXMgbm90IG5lZWRlZCB3aGVuIHRoZSBibG9jayBpcyBsb2NhbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFlpZWxkIGEgYmxvY2sgdG8gdGhlIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUuIFRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbgorICAgICAqIG9mIHRoZSBibG9jayBub3QgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCk7CisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhKTsKKworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YThmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCitzdHJ1Y3QgQzJfSElERSBfQzJQYXJhbUluc3BlY3RvciB7CisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIFNldE9mZnNldChDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBmZC5fbUZpZWxkSWQuX21PZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRFbmRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBwYXJhbVNpemUgPSAwKSB7CisgICAgICAgIHVpbnQzMl90IGVuZE9mZnNldCA9IGZkLl9tRmllbGRJZC5fbU9mZnNldCArIGZkLl9tRXh0ZW50ICogZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICAgICAgLy8vIGZvciBmbGV4IHBhcmFtZXRlcnMgcmV0dXJuIHBhcmFtU2l6ZSBpZiBnaXZlbgorICAgICAgICByZXR1cm4gZmQuX21FeHRlbnQgPyBlbmRPZmZzZXQgOiBzdGQ6Om1heChlbmRPZmZzZXQsIHBhcmFtU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEluZGV4KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tSW5kZXg7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEF0dHJpYihjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICAgICAgcmV0dXJuIHBkLl9tQXR0cmliOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgb2Zmc2V0LCBzaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIF9DMkZpZWxkSWQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgZmllbGQuX21PZmZzZXQsIGZpZWxkLl9tU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIHZvaWQgVHJpbVBhcmFtKEMyUGFyYW0gKnBhcmFtLCB1aW50MzJfdCBuZXdTaXplKSB7CisgICAgICAgIGlmIChwYXJhbSAmJiAqcGFyYW0gJiYgcGFyYW0tPnNpemUoKSA+IG5ld1NpemUgJiYgbmV3U2l6ZSA+PSBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIHBhcmFtLT5fbVNpemUgPSBuZXdTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIEFkZE5hbWVkVmFsdWVzKAorICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlICYmbmFtZWRWYWx1ZXMpIHsKKyAgICAgICAgZmQuX21OYW1lZFZhbHVlcyA9IHN0ZDo6bW92ZShuYW1lZFZhbHVlcyk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyU3RydWN0RGVzY3JpcHRvciBDcmVhdGVTdHJ1Y3REZXNjcmlwdG9yKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJiZmaWVsZHMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3RydWN0RGVzY3JpcHRvcihpbmRleCwgc3RkOjptb3ZlKGZpZWxkcykpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMkZpZWxkRGVzY3JpcHRvciBPZmZzZXRGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBzaXplX3Qgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcihmZCwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBleHBvc2UgYXR0cmlidXRlcworICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTViM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCcUJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZURlZnMuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6QW53QnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFM7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbmRyb2lkTWVtb3J5VXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OkZlbmNlOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjp3cDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSA6IHB1YmxpYyBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIGJvb2wgaGVsZDsKKyAgICBib29sIGxvY2FsOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiBsb2NhbFBvb2w7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJRVUVVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSByZW1vdGUgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyID0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBsb2NhbCBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKKworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgICpnZW5lcmF0aW9uID0gcG9vbERhdGEtPmdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAoYnFJZCkgeworICAgICAgICAgICAgICAgICpicUlkID0gcG9vbERhdGEtPmJxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnFTbG90KSB7CisgICAgICAgICAgICAgICAgKmJxU2xvdCA9IHBvb2xEYXRhLT5icVNsb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGJvb2wgaGVsZCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICAgICAgcG9vbERhdGEtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7CisgICAgICAgIHBvb2xEYXRhLT5icVNsb3QgPSBicVNsb3Q7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gaGVsZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5sb2NhbCkgeworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgfQorICAgIGlmIChwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDY0X3QgdXNhZ2U7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3QgYnFJZDsKKyAgICAgICAgdWludDMyX3QgYnFTbG90OworICAgICAgICBhbmRyb2lkOjpfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICAgICAgICAgIGhhbmRsZSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgaWYgKGJxSWQgfHwgYnFTbG90KSB7CisgICAgICAgICAgICAgICAgLy8gQlFCQlAKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYnFTbG90KTsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4geworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEZyb21JZ2JwX2woCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIC8vIFdlIGhhdmUgYW4gSUdCUCBub3cuCisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZSBhbmRyb2lkVXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0Pihmb3JtYXQpOworICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgQUxPR1YoInRyaWVzIHRvIGRlcXVldWUgYnVmZmVyIik7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1Qcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCksIGZhbHNlLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2xvdCwgJmZlbmNlXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdFN0YXR1cywgaW50MzJfdCB0U2xvdCwgaGlkbF9oYW5kbGUgY29uc3QmIHRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHRUcykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICBzbG90ID0gdFNsb3Q7CisgICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKGZlbmNlLmdldCgpLCB0RmVuY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHRUczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgLy8gZGVxdWV1ZUJ1ZmZlciByZXR1cm5zIGZsYWcuCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpIHx8IHN0YXR1cyA8IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRCgiY2Fubm90IGRlcXVldWUgYnVmZmVyICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBhbmRyb2lkOjpUSU1FRF9PVVQgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OldPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVyIGlzIGJsb2NrZWQgdGVtcG9yYXJpbHkuIFJldHJ5aW5nIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOworICAgICAgICBoaWRsX2hhbmRsZSBmZW5jZUhhbmRsZTsKKyAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICBhbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJmZlbmNlSGFuZGxlLCAmbmgsICpmZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3RleHByIGludCBrRmVuY2VXYWl0VGltZU1zID0gMTA7CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZlbmNlLT53YWl0KGtGZW5jZVdhaXRUaW1lTXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAtRVRJTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBmZW5jZSBpcyBub3Qgc2lnbmFsbGVkIHlldC4KKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gZmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsVGltZSA+PSAwICYmIHNpZ25hbFRpbWUgPCBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlckNhbGxiYWNrKG1Qcm9kdWNlcklkLCBzbG90LCBzaWduYWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290IGZlbmNlIHNpZ25hbCB0aW1lIG9mICVsbGQiLCAobG9uZyBsb25nKXNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+ICZzbG90QnVmZmVyID0gbUJ1ZmZlcnNbc2xvdF07CisgICAgICAgIGlmIChzdGF0dXMgJiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXJdKGludDMyX3QgdFN0YXR1cywgQW53QnVmZmVyIGNvbnN0JiB0QnVmZmVyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhzbG90QnVmZmVyLmdldCgpLCB0QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXIgd3JhcHMgJWxsdSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgQzJIYW5kbGUgKmMySGFuZGxlID0gYW5kcm9pZDo6V3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgIGlmIChjMkhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGMySGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCwgc2xvdCwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJsb2NrIHdhcyBub3QgY3JlYXRlZC4gY2FsbCByZXF1ZXN0QnVmZmVyIyBhZ2FpbiBuZXh0IHRpbWUuCisgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUluaXQoQzJfT0spLCBtUHJvZHVjZXJJZCgwKSwgbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgIFJldHVybjxpbnQzMl90PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRyYW5zUmVzdWx0KSA9PSBhbmRyb2lkOjpOT19JTklUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaW50IGtNYXhJZ2JwUmV0cnkgPSAyMDsgLy8gVE9ETzogc21hbGwgbnVtYmVyIGNhbiBjYXVzZSBjcmFzaCBpbiByZWxlYXNpbmcuCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeURlbGF5VXMgPSAxMDAwMDsKKworICAgICAgICBpbnQgY3VyVHJ5ID0gMDsKKworICAgICAgICB3aGlsZSAoY3VyVHJ5KysgPCBrTWF4SWdicFJldHJ5KSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBDMl9OT19JTklUCisgICAgICAgICAgICBpZiAobVByb2R1Y2VySWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodWludDY0X3QpMCwgfjAsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnPworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGZldGNoRnJvbUlnYnBfbCh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX0JMT0NLSU5HKSB7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICA6OnVzbGVlcChrTWF4SWdicFJldHJ5RGVsYXlVcyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICB9CisKKyAgICB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1SZW5kZXJDYWxsYmFjayA9IHJlbmRlckNhbGxiYWNrOworICAgIH0KKworICAgIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gYW5kcm9pZDo6T0s7CisgICAgICAgIHVpbnQ2NF90IHByb2R1Y2VySWQgPSAwOworICAgICAgICBpZiAocHJvZHVjZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IHByb2R1Y2VyLT5nZXRVbmlxdWVJZCgKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZwcm9kdWNlcklkXShpbnQzMl90IHRTdGF0dXMsIGludDY0X3QgdFByb2R1Y2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcklkID0gdFByb2R1Y2VySWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlndXJlUHJvZHVjZXIgLS0gZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHByb2R1Y2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGludDMyX3Q+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHJhbnNSZXN1bHQpID09IGFuZHJvaWQ6Ok5PX0lOSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJvZHVjZXIgJiYgc3RhdHVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSBwcm9kdWNlcklkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworCisgICAgdm9pZCBjYW5jZWwodWludDY0X3QgaWdicF9pZCwgaW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKGlnYnBfaWQgPT0gbVByb2R1Y2VySWQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihpZ2JwX3Nsb3QsIG51bGxwdHIpLmlzT2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHVpbnQ2NF90IG1Qcm9kdWNlcklkOworICAgIE9uUmVuZGVyQ2FsbGJhY2sgbVJlbmRlckNhbGxiYWNrOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107Cit9OworCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIpIDoKKyAgICAgICAgaGVsZChwcm9kdWNlciAmJiBicUlkICE9IDApLCBsb2NhbChmYWxzZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICBpZ2JwKHByb2R1Y2VyKSwKKyAgICAgICAgbG9jYWxQb29sKCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpIDoKKyAgICAgICAgaGVsZCh0cnVlKSwgbG9jYWwodHJ1ZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICBpZ2JwKHBvb2wgPyBwb29sLT5tUHJvZHVjZXIgOiBudWxscHRyKSwKKyAgICAgICAgbG9jYWxQb29sKHBvb2wpIHsKK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIHsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsICYmIGxvY2FsUG9vbCkgeworICAgICAgICBsb2NhbFBvb2wtPmNhbmNlbChicUlkLCBicVNsb3QpOworICAgIH0gZWxzZSBpZiAoaWdicCkgeworICAgICAgICBpZ2JwLT5jYW5jZWxCdWZmZXIoYnFTbG90LCBudWxscHRyKTsKKyAgICB9Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkge30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNvbmZpZ3VyZVByb2R1Y2VyKHByb2R1Y2VyKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6c2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPnNldFJlbmRlckNhbGxiYWNrKHJlbmRlckNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhc1N0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyICphc1N0cmluZyhjMl9zdGF0dXNfdCBpLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDMl9PSzogICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcmV0dXJuICJCQURfVkFMVUUiOworICAgICAgICBjYXNlIEMyX0JBRF9JTkRFWDogcmV0dXJuICJCQURfSU5ERVgiOworICAgICAgICBjYXNlIEMyX0NBTk5PVF9ETzogcmV0dXJuICJDQU5OT1RfRE8iOworICAgICAgICBjYXNlIEMyX0RVUExJQ0FURTogcmV0dXJuICJEVVBMSUNBVEUiOworICAgICAgICBjYXNlIEMyX05PVF9GT1VORDogcmV0dXJuICJOT1RfRk9VTkQiOworICAgICAgICBjYXNlIEMyX0JBRF9TVEFURTogcmV0dXJuICJCQURfU1RBVEUiOworICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcmV0dXJuICJCTE9DS0lORyI7CisgICAgICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6ICByZXR1cm4gIkNBTkNFTEVEIjsKKyAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHJldHVybiAiTk9fTUVNT1JZIjsKKyAgICAgICAgY2FzZSBDMl9SRUZVU0VEOiAgIHJldHVybiAiUkVGVVNFRCI7CisgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiByZXR1cm4gIlRJTUVEX09VVCI7CisgICAgICAgIGNhc2UgQzJfT01JVFRFRDogICByZXR1cm4gIk9NSVRURUQiOworICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcmV0dXJuICJDT1JSVVBURUQiOworICAgICAgICBjYXNlIEMyX05PX0lOSVQ6ICAgcmV0dXJuICJOT19JTklUIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdCBjaGFyICphc1N0cmluZyhDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIHJldHVybiAidTgiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IHJldHVybiAiYzMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OiByZXR1cm4gImM2NCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgcmV0dXJuICJmcCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgcmV0dXJuICJpMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIHJldHVybiAiaTY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiByZXR1cm4gImNociI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogcmV0dXJuICJ1MzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IHJldHVybiAidTY0IjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIChpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA/ICJzdHJ1Y3QiIDogZGVmOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtQ29yZUluZGV4KGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVjJWMlMDN4IiwKKyAgICAgICAgICAgIGkuaXNGbGV4aWJsZSgpID8gJ0YnIDogJy0nLAorICAgICAgICAgICAgaS5pc1ZlbmRvcigpID8gJ1YnIDogJy0nLAorICAgICAgICAgICAgaS5jb3JlSW5kZXgoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJQYXJhbUluZGV4KAorICAgICAgICBjb25zdCBDMlBhcmFtOjpUeXBlICZpLCBib29sIGFkZFN0cmVhbSwgdW5zaWduZWQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gU3RyaW5nUHJpbnRmKCIlYyVjIiwKKyAgICAgICAgICAgIGkuZm9ySW5wdXQoKSA/ICdJJyA6IGkuZm9yT3V0cHV0KCkgPyAnTycgOiAnLScsCisgICAgICAgICAgICBpLmZvclN0cmVhbSgpID8gJ1MnIDogaS5mb3JQb3J0KCkgPyAnUCcgOiAnRycpOworICAgIGlmIChhZGRTdHJlYW0pIHsKKyAgICAgICAgaWYgKGkuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIHYgKz0gU3RyaW5nUHJpbnRmKCIlMDJkIiwgc3RyZWFtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiArPSAiLS0iOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHYKKyAgICAgICAgICAgICsgU3RyaW5nUHJpbnRmKCIlYyAiLAorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTVFJVQ1QgID8gJ1MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6SU5GTyAgICA/ICdpJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlRVTklORyAgPyAndCcgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTRVRUSU5HID8gJ3MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6Tk9ORSAgICA/ICctJyA6ICc/JykKKyAgICAgICAgICAgICsgYXR0cmliUGFyYW1Db3JlSW5kZXgoaSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgIlBhcmFtOjpDb3JlSW5kZXgoIiA8PCBhdHRyaWJQYXJhbUNvcmVJbmRleChpKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OlR5cGUoJTA4eDogIiwgaS50eXBlKCkpCisgICAgICAgICAgICA8PCBhdHRyaWJQYXJhbUluZGV4KGksIGZhbHNlLCAwKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIlBhcmFtOjpJbmRleCglMDh4OiAiLCAodWludDMyX3QpaSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgdHJ1ZSwgaS5zdHJlYW0oKSkgPDwgIikiOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliRmllbGRJZChjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiRmllbGQoQCUwMngrJTAyeCkiLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiPCIgPDwgYXR0cmliRmllbGRJZChpKSA8PCAiPiI7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKSB7CisgICAgb3MgPDwgYXR0cmliRmllbGRJZChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQoaSkpIDw8ICIgIjsKKyAgICBpZiAoaS5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICBvcyA8PCAiZW51bSAiOworICAgIH0KKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaS50eXBlKCkpIDw8ICIgIiA8PCBpLm5hbWUoKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJbJXp1XSIsIGkuZXh0ZW50KCkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpIHsKKyAgICBvcyA8PCAiPCIgPDwgQzJQYXJhbTo6SW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KGkpKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCI6OkZpZWxkKEAlMDJ4KyUwMngpPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShpKSk7CisgICAgcmV0dXJuIG9zOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkZpZWxkVmFsdWVIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgaWYgKGlzcHJpbnQocC5pMzIpKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIiclYyciLCBwLmkzMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJ1xceCUwMngnIiwgKHVpbnQzMl90KXAuaTMyKTsKKyAgICB9Cit9CisKK3N0ZDo6b3N0cmVhbSYgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90Pjo6cHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIjB4JTAyeCIsIHAudTMyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBjMl9jbnRyX3Q8VD4gJnYpIHsKKyAgICByZXR1cm4gb3MgPDwgImN0cigiIDw8IHYucGVla3UoKSA8PCAiKSI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSkgeworICAgIG9zIDw8ICJSYW5nZSgiOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgb3MgPDwgIi4uIjsKKyAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWF4KCkpOworICAgIG9zIDw8ICIgKj0gIiA8PCBpLm51bSgpIDw8ICIgLz0gIiA8PCBpLmRlbm9tKCkgPDwgIiArPSAiIDw8IGkuc3RlcCgpIDw8ICIpIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmaSkgeworICAgIG9zIDw8ICJGbGFnc1siOworICAgIGlmICghaS5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3MgPDwgIm1pbj0iOworICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWluKCkpOworICAgIH0KKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS5mbGFncygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSkgeworICAgIG9zIDw8ICJWYWx1ZXNbIjsKKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS52YWx1ZXMoKSkgeworICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgIG9zIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCB2KTsKKyAgICAgICAgY29tbWEgPSB0cnVlOworICAgIH0KKyAgICBvcyA8PCAiXSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IF9tVHlwZTsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFZhbHVlVHlwZT4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxWYWx1ZVR5cGU+IF9tRmxhZ3M7CisKK3B1YmxpYzoKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgJmkpOworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJbXBsICZpKTsKKyAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw6OnN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCB7CisgICAgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBvcyA8PCBfbVJhbmdlOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICBvcyA8PCBfbVZhbHVlczsKKyAgICB9IGVsc2UgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICBvcyA8PCBfbUZsYWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8ICJVbmtub3duIEZTViB0eXBlOiAiIDw8ICh1aW50MzJfdClfbVR5cGU7CisgICAgfQorICAgIHJldHVybiBvczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKSB7CisgICAgcmV0dXJuIGkuX21JbXBsLT5zdHJlYW1PdXQob3MpOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD4gJmkpOworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDdmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApAQCAtMCwwICsxLDg0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmxlY3RvckhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBmb3IgKEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWt0IDogc3RydWN0cykgeworICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBzdHJ1Y3R1cmUgZGVzY3JpcHRpb25zIGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgb25lcworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9yKHN0ZDo6bW92ZShzdHJ1a3QpKTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+CitDMlJlZmxlY3RvckhlbHBlcjo6ZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBhdXRvIGl0ID0gX21TdHJ1Y3RzLmZpbmQocGFyYW1JbmRleCk7CisgICAgaWYgKGl0ID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDMlN0cnVjdERlc2NyaXB0b3I+KGl0LT5zZWNvbmQpOworICAgIH0KK307CisKK3ZvaWQgQzJSZWZsZWN0b3JIZWxwZXI6OmFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KSB7CisgICAgaWYgKF9tU3RydWN0cy5maW5kKHN0cnVrdC5jb3JlSW5kZXgoKSkgIT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgYWRkZWQKKyAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCBkZXNjcmlwdG9yIG1hdGNoZXMgc3RvcmVkIGRlc2NyaXB0b3IKKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhhdCBhbGwgc3RydWN0IGZpZWxkcyBhcmUga25vd24gdG8gdGhpcyByZWZsZWN0b3IKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCA6IHN0cnVrdCkgeworICAgICAgICBpZiAoZmQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZmQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRzsKKyAgICAgICAgICAgIGlmIChfbVN0cnVjdHMuZmluZChjb3JlSW5kZXgpID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhJTkZPKSA8PCAibWlzc2luZyBzdHJ1Y3QgZGVzY3JpcHRvciAjIiA8PCBjb3JlSW5kZXggPDwgIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmQubmFtZSgpIDw8ICIgb2Ygc3RydWN0ICMiIDw8IHN0cnVrdC5jb3JlSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfbVN0cnVjdHMuZW1wbGFjZShzdHJ1a3QuY29yZUluZGV4KCksIHN0cnVrdCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJhbUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkKKyAgICAgICAgOiBtUGFyYW0ocGFyYW0pLCBtTmFtZShuYW1lKSwgX21TdHJ1Y3Qoc3RydWt0KSB7IH0KKworICAgIEltcGwoSW1wbCYmKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KSB7CisgICAgICAgIG1Eb3duRGVwZW5kZW5jaWVzLnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorCisgICAgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgYXR0cmliKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYjsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkgeworICAgICAgICAvLyBtb3ZlIGRlcGVuZGVuY2llcyBpbnRvIGRlc2NyaXB0b3IKKyAgICAgICAgbURlc2NyaXB0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBpbmRleCgpLCAoQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KW1BdHRyaWIsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG1OYW1lKSwgc3RkOjptb3ZlKG1EZXBlbmRlbmNpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZUZpZWxkc0FuZFN1cHBvcnRlZFZhbHVlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZiA6CisgICAgICAgICAgICAgICAgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoKm1EZWZhdWx0VmFsdWUsIHJlZmxlY3RvcikpIHsKKyAgICAgICAgICAgIGlmICghZi5pc0FyaXRobWV0aWMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IGZzdlBvaW50ZXI7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJyZWFrYWJsZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIGZzdjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBicmVhayBvdXQgb2YgZG8ge30gd2hpbGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnN2UG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oZnN2KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsKKworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW0sIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLCBzdGQ6Om1vdmUoZnN2UG9pbnRlcikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUZpZWxkcy5maW5kKF9DMkZpZWxkSWQoYmFzZU9mZnMsIGJhc2VTaXplKSk7CisgICAgICAgIGlmIChpdCA9PSBtRmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Eb3duRGVwZW5kZW5jaWVzOworICAgIH0KKworICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeworICAgICAgICBpZiAoIW1EZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgbWlzc2luZyBkZWZhdWx0IHZhbHVlXG4iLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURlZmF1bHRWYWx1ZS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBDMlN0cmluZyBuYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtOworICAgIH0KKworICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX21TdHJ1Y3QpOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgICAgICBtRGVmYXVsdFZhbHVlID0gZGVmYXVsdF87CisgICAgfQorCisgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgICAgIG1EZXBlbmRlbmNpZXMgPSBpbmRpY2VzOworICAgICAgICBtRGVwZW5kZW5jaWVzQXNSZWZzID0gcmVmczsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgICAgIC8vIGRvIG5vdCBhbGxvdyBhZGRpbmcgZmllbGRzIG11bHRpcGxlIHRpbWVzLCBvciB0byBjb25zdCB2YWx1ZXMKKyAgICAgICAgaWYgKCFtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byBhZGQgZmllbGRzIHRvIHBhcmFtICIgPDwgbU5hbWUgPDwgIiBtdWx0aXBsZSB0aW1lcyI7CisgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gY29uc3QgcGFyYW0gIiA8PCBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQzJQYXJhbUZpZWxkVmFsdWVzICZwZnYgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIG1GaWVsZHMuZW1wbGFjZV9oaW50KAorICAgICAgICAgICAgICAgICAgICBtRmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAvLyBfQzJGaWVsZElkIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxGaWVsZEhlbHBlcj4obVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGZ2LnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZnYudmFsdWVzKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcikgeworICAgICAgICBtR2V0dGVyID0gZ2V0dGVyOworICAgIH0KKworICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgQzJSIHJlc3VsdCA9IG1TZXR0ZXIodmFsdWUsIG1heUJsb2NrLCBjaGFuZ2VkLCBmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXRyaWV2ZUZhaWx1cmVzKGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBpZiAoIW1TZXR0ZXIgJiYgbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coV0FSTklORykgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyLCBtYWtpbmcgaXQgY29uc3QiOworICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBlbXB0eSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIG1BdHRyaWIgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICB9IGVsc2UgaWYgKCFtU2V0dGVyKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIHNldHRlciI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKHJlZmxlY3Rvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgZGVmYXVsdCBiYXNlZCBvbiBzZXR0ZXIgYW5kIHZlcmlmeSB0aGF0IEZTViBjb3ZlcnMgdGhlIHZhbHVlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBmaWVsZHMiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW0uZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgX0MyUGFyYW1JbnNwZWN0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgX21TdHJ1Y3Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG1EZWZhdWx0VmFsdWU7CisgICAgYXR0cmliX3QgbUF0dHJpYjsKKyAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gbVNldHRlcjsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gbUdldHRlcjsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURlcGVuZGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURvd25EZXBlbmRlbmNpZXM7IC8vIFRPRE86IHRoaXMgZG9lcyBub3Qgd29yayBmb3Igc3RyZWFtIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bWFwPF9DMkZpZWxkSWQsIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4+IG1GaWVsZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBtRGVzY3JpcHRvcjsKK307CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoCisgICAgICAgIFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgIDogbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OkltcGw+KAorICAgICAgICAgICAgcGFyYW0sIG5hbWUsIHN0ZDo6bW92ZShzdHJ1a3QpKSkgeyB9CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyICYmKSA9IGRlZmF1bHQ7CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6flBhcmFtSGVscGVyKCkgPSBkZWZhdWx0OworCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPmFkZERvd25EZXBlbmRlbmN5KGluZGV4KTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWIoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5hdHRyaWIoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpidWlsZCgpIHsKKyAgICBtSW1wbC0+YnVpbGQoKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI+KHN0ZDo6bW92ZSgqdGhpcykpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1SZWY+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlcGVuZGVuY2llc0FzUmVmcygpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREb3duRGVwZW5kZW5jaWVzKCk7Cit9CisKK0MyUGFyYW06OkluZGV4IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmRleCgpOworfQorCitDMlN0cmluZyBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6Om5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5uYW1lKCk7Cit9CisKK2NvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnJlZigpOworfQorCitDMlN0cnVjdERlc2NyaXB0b3IgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpyZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pIHsKKyAgICBtSW1wbC0+c2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlcGVuZGVuY2llcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgbUltcGwtPnNldERlcGVuZGVuY2llcyhpbmRpY2VzLCByZWZzKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0R2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgbUltcGwtPnNldEdldHRlcihnZXR0ZXIpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0U2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKSB7CisgICAgbUltcGwtPnNldFNldHRlcihzZXR0ZXIpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnRyeVNldCgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmYsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICByZXR1cm4gbUltcGwtPnRyeVNldCh2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYsIGZhaWx1cmVzKTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWxpZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gbUltcGwtPnZhbGlkYXRlKHJlZmxlY3Rvcik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbHVlKCkgeworICAgIHJldHVybiBtSW1wbC0+dmFsdWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJQYXJhbUZpZWxkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6bWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoaW5kZXgsIG1GaWVsZElkKTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKQorICAgIDogbVBhcmFtKHBhcmFtKSwKKyAgICAgIG1GaWVsZElkKGZpZWxkKSwKKyAgICAgIG1Qb3NzaWJsZShzdGQ6Om1vdmUodmFsdWVzKSkgeworICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZmllbGQgaGVscGVyICIgPDwgZmllbGQgPDwgIiAiCisgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PigqbVBvc3NpYmxlKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OnNldFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKSB7CisgICAgbVN1cHBvcnRlZCA9IHN0ZDo6bW92ZSh2YWx1ZXMpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1TdXBwb3J0ZWQgPyBtU3VwcG9ydGVkIDogbVBvc3NpYmxlKS5nZXQoKTsKK30KKworY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBvc3NpYmxlLmdldCgpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGZpZWxkLXN1cHBvcnRlZC12YWx1ZXMgYnVpbGRlciB0aGF0IGdldHMgc3RvcmVkIGluIHRoZQorICogZmllbGQgaGVscGVyIHdoZW4gdGhlIGJ1aWxkZXIgZ29lcyBvdXQgb2Ygc2NvcGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3VwcG9ydGVkVmFsdWVzQnVpbGRlciA6IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4geworICAgIFN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoCisgICAgICAgICAgICBDMlBhcmFtRmllbGQgJmZpZWxkLCBzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPiBoZWxwZXIpCisgICAgICAgIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPihmaWVsZCksIF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoZmllbGQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGJ1aWxkZXIgdmFsdWVzIG9uIGRlc3RydWN0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgflN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoKSBvdmVycmlkZSB7CisgICAgICAgIF9tSGVscGVyLT5zZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjptb3ZlKEMyUGFyYW1GaWVsZFZhbHVlcygqdGhpcykudmFsdWVzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnNob3VsZEJlKCkgY29uc3QgeworICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46Om11c3RCZSgpIHsKKyAgICByZXR1cm4gU3VwcG9ydGVkVmFsdWVzQnVpbGRlcjxUPihfbUZpZWxkLCBfbUhlbHBlcik7Cit9CisKKy8qCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnZhbGlkYXRlUG9zc2libGUoVCAmdmFsdWUpCitjb25zdCB7CisgICAgLy8vIFRPRE8KKyAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6Ok9rKCk7Cit9CisqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjpGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgOiBfbUhlbHBlcihoZWxwZXIpLCBfbUZpZWxkKGhlbHBlci0+bWFrZVBhcmFtRmllbGQoaW5kZXgpKSB7IH0KKwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50OF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8Y2hhcj47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50MzJfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxpbnQ2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5SW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlcjo6RmFjdG9yeSB7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gX21SZWZsZWN0b3I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+CisgICAgZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVBhcmFtcy5maW5kKHBhcmFtKS0+c2Vjb25kOworICAgIH0KKworcHVibGljOgorICAgIEZhY3RvcnlJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIHZpcnR1YWwgfkZhY3RvcnlJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGRQYXJhbShzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgICAgIF9tUGFyYW1zLmluc2VydCh7IHBhcmFtLT5yZWYoKSwgcGFyYW0gfSk7CisgICAgICAgIF9tSW5kZXhUb0hlbHBlci5pbnNlcnQoe3BhcmFtLT5pbmRleCgpLCBwYXJhbX0pOworCisgICAgICAgIC8vIGFkZCBkb3duLWRlcGVuZGVuY2llcyAoYW5kIHZhbGlkYXRlIGRlcGVuZGVuY2llcyBhcyBhIHJlc3VsdCkKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBQYXJhbVJlZiAmcmVmIDogcGFyYW0tPmdldERlcGVuZGVuY2llc0FzUmVmcygpKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgbXVzdCBhbHJlYWR5IGJlIGRlZmluZWQKKyAgICAgICAgICAgIGlmICghX21QYXJhbXMuY291bnQocmVmKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtZXRlciAiIDw8IHBhcmFtLT5uYW1lKCkgPDwgIiBoYXMgYSBkZXBlbmRlbmN5IGF0IGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgdGhhdCBpcyBub3QgeWV0IGRlZmluZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX21QYXJhbXMuZmluZChyZWYpLT5zZWNvbmQtPmFkZERvd25EZXBlbmRlbmN5KHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKworICAgICAgICBfbURlcGVuZGVuY3lJbmRleC5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBfbURlcGVuZGVuY3lJbmRleC5zaXplKCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW0oQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIHN0cmVhbXMgc2VwYXJhdGVseQorICAgICAgICBjb25zdCBhdXRvIGl0ID0gX21JbmRleFRvSGVscGVyLmZpbmQoaXgpOworICAgICAgICBpZiAoaXQgPT0gX21JbmRleFRvSGVscGVyLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiB0aGlzIGNvdWxkIHJldHVybiBhIGNvcHkgdXNpbmcgcHJvcGVyIHBvaW50ZXIgY2FzdC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0UGFyYW1WYWx1ZShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciA9IGdldFBhcmFtKGl4KTsKKyAgICAgICAgcmV0dXJuIGhlbHBlciA/IGhlbHBlci0+dmFsdWUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBfbVBhcmFtcykgeworICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIHNpZ25hdHVyZT8KKyAgICAgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxDMlBhcmFtRGVzY3JpcHRvcj4oaXQuc2Vjb25kLT5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZXJyb3JzCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4KEMyUGFyYW06OkluZGV4IGl4KSB7CisgICAgICAgIC8vIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgaGVscGVyIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc3RyZWFtIHNvCisgICAgICAgIC8vIHdlIGNhbiBsb29rIHVwIGRpcmVjdGx5IGJ5IGluZGV4CisgICAgICAgIGF1dG8gaXQgPSBfbURlcGVuZGVuY3lJbmRleC5maW5kKGl4KTsKKyAgICAgICAgcmV0dXJuIGl0ID09IF9tRGVwZW5kZW5jeUluZGV4LmVuZCgpID8gU0laRV9NQVggOiBpdC0+c2Vjb25kOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxQYXJhbVJlZiwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21QYXJhbXM7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4+IF9tSW5kZXhUb0hlbHBlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHNpemVfdD4gX21EZXBlbmRlbmN5SW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoQzJQYXJhbSAqcCkgeworICAgIGNoYXIgYWRkclsyMF07CisgICAgc3ByaW50ZihhZGRyLCAiJXA6WyIsIHApOworICAgIHN0ZDo6c3RyaW5nIHYgPSBhZGRyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcC0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBkWzRdOworICAgICAgICBzcHJpbnRmKGQsICIgJTAyeCIsICooKCh1aW50OF90ICopcCkgKyBpKSk7CisgICAgICAgIHYgKz0gZCArIChpID09IDApOworICAgIH0KKyAgICByZXR1cm4gdiArICJdIjsKK30KKworfQorCitDMkludGVyZmFjZUhlbHBlcjo6QzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgOiBtUmVmbGVjdG9yKHJlZmxlY3RvciksCisgICAgICBfbUZhY3Rvcnkoc3RkOjptYWtlX3NoYXJlZDxGYWN0b3J5SW1wbD4ocmVmbGVjdG9yKSkgeyB9CisKKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBwYXJhbSA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBwYXJhbSBzdHJ1Y3R1cmUgbm90IGRlc2NyaWJlZAorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkIDogKnBhcmFtKSB7CisgICAgICAgIHNpemVfdCBmaWVsZE9mZnNldCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRTaXplID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBmaWVsZC5leHRlbnQoKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA9PSBmaWVsZE9mZnNldCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLmV4dGVudCgpID09IDAgfHwgb2Zmc2V0IDwgZmllbGRPZmZzZXQgKyBmaWVsZFNpemUgKiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgLy8gcmVkdWNlIHRvIGZpcnN0IGVsZW1lbnQgaW4gY2FzZSBvZiBhcnJheQorICAgICAgICAgICAgb2Zmc2V0ID0gZmllbGRPZmZzZXQgKyAob2Zmc2V0IC0gZmllbGRPZmZzZXQpICUgZmllbGRTaXplOworICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUoKSA+PSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9mZnNldCBpcyB3aXRoaW4gYSBmaWVsZAorICAgICAgICAgICAgICAgIG9mZnNldCA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0b3IsIGZpZWxkLnR5cGUoKSAmIH5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBmaWVsZE9mZnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5vZmZzZXQgPyBmaWVsZE9mZnNldCArIG9mZnNldCA6IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OmFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtUmVmbGVjdG9yLT5hZGRTdHJ1Y3REZXNjcmlwdG9yKHBhcmFtLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcGFyYW0tPnZhbGlkYXRlKG1SZWZsZWN0b3IpOworICAgIGlmIChlcnIgIT0gQzJfQ09SUlVQVEVEKSB7CisgICAgICAgIF9tRmFjdG9yeS0+YWRkUGFyYW0ocGFyYW0pOworCisgICAgICAgIC8vIHJ1biBzZXR0ZXIgdG8gZW5zdXJlIGNvcnJlY3QgdmFsdWVzCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKXBhcmFtLT50cnlTZXQocGFyYW0tPnZhbHVlKCkuZ2V0KCksIEMyX01BWV9CTE9DSywgJmNoYW5nZWQsICpfbUZhY3RvcnksICZmYWlsdXJlcyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6Y29uZmlnKAorICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsIGJvb2wgdXBkYXRlUGFyYW1zLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgX191bnVzZWQgLyogVE9ETyAqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsgLy8gVE9ETyBpcyB0aGlzIHRoZSBzYW1lIGFzIGJhZCB2YWx1ZT8KKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmFkVmFsdWUgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmxvY2tpbmcgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtVGltZWRPdXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQ29ycnVwdGVkID0gZmFsc2U7CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICAvLyBkb3duIGRlcGVuZGVuY2llcyBhcmUgbWFya2VkIGRpcnR5LCBidXQgcGFyYW1zIHNldCBhcmUgbm90IGltbWVkaWF0ZWx5CisgICAgLy8gbWFya2VkIGRpcnR5ICh1bmxlc3MgdGhleSBiZWNvbWUgZG93biBkZXBlbmRlbmN5KSBzbyB0aGF0IHdlIGNhbgorICAgIC8vIGF2b2lkIHNldHRpbmcgdGhlbSBpZiB0aGV5IGRpZCBub3QgY2hhbmdlCisKKyAgICAvLyBUT0RPOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbmRpY2VzIGZvciB0aGUgc2FtZSBkZXBlbmRlbmN5IGluZGV4CisgICAgLy8geyBkZXBJeCwgcGFyYW1JeCB9IG1heSBiZSBhIHN1aXRhYmxlIGtleQorICAgIHN0ZDo6bWFwPHNpemVfdCwgc3RkOjpwYWlyPEMyUGFyYW06OkluZGV4LCBib29sPj4gZGVwZW5kZW5jaWVzOworCisgICAgLy8gd2UgY2Fubm90IGRldGVybWluZSB0aGUgbGFzdCB2YWxpZCBwYXJhbWV0ZXIsIHNvIGFkZCBhbiBleHRyYQorICAgIC8vIGxvb3AgaXRlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IHBhcmFtZXRlcgorICAgIGZvciAoc2l6ZV90IHBfaXggPSAwOyBwX2l4IDw9IHBhcmFtcy5zaXplKCk7ICsrcF9peCkgeworICAgICAgICBDMlBhcmFtICpwID0gbnVsbHB0cjsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggcGFyYW1JeCA9IDB1OworICAgICAgICBzaXplX3QgcGFyYW1EZXBJeCA9IFNJWkVfTUFYOworICAgICAgICBib29sIGxhc3QgPSBwX2l4ID09IHBhcmFtcy5zaXplKCk7CisgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgcCA9IHBhcmFtc1twX2l4XTsKKyAgICAgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1JeCA9IHAtPmluZGV4KCk7CisgICAgICAgICAgICBwYXJhbURlcEl4ID0gZ2V0RGVwZW5kZW5jeUluZGV4X2wocGFyYW1JeCk7CisgICAgICAgICAgICBpZiAocGFyYW1EZXBJeCA9PSBTSVpFX01BWCkgeworICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZmlyc3QgaW5zZXJ0IC0gbWFyayBub3QgZGlydHkKKyAgICAgICAgICAgIC8vIGl0IG1heSBoYXZlIGJlZW4gbWFya2VkIGRpcnR5IGJ5IGEgZGVwZW5kZW5jeSB1cGRhdGUKKyAgICAgICAgICAgIC8vIHRoaXMgZG9lcyBub3Qgb3ZlcnJ3cml0ZSghKQorICAgICAgICAgICAgKHZvaWQpZGVwZW5kZW5jaWVzLmluc2VydCh7IHBhcmFtRGVwSXgsIHsgcGFyYW1JeCwgZmFsc2UgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKHBhcmFtRGVwSXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRlcGVuZGVuY3kgZm9yIHNldHRpbmcgYXQgIyIgPDwgcGFyYW1EZXBJeCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGl0LT5zZWNvbmQuZmlyc3QgPDwgIiwgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGl0LT5zZWNvbmQuc2Vjb25kID8gImFsd2F5cyAoZGlydHkpIiA6ICJvbmx5IGlmIGNoYW5nZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgYW55IHJlbWFpbmluZyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGluZyBkaXJ0eSBkb3duIGRlcGVuZGVuY2llcyBhZnRlciBsYXN0IHNldHRpbmciOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcyBhbnkgZGlydGllZCBkb3duLWRlcGVuZGVuY2llcyB1bnRpbCB0aGUgbmV4dCBwYXJhbQorICAgICAgICB3aGlsZSAoZGVwZW5kZW5jaWVzLnNpemUoKSAmJiBkZXBlbmRlbmNpZXMuYmVnaW4oKS0+Zmlyc3QgPD0gcGFyYW1EZXBJeCkgeworICAgICAgICAgICAgYXV0byBtaW4gPSBkZXBlbmRlbmNpZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gbWluLT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICBib29sIGRpcnR5ID0gbWluLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmVyYXNlKG1pbik7CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0gPSBfbUZhY3RvcnktPmdldFBhcmFtKGl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAib2xkIHZhbHVlICIgPDwgYXNTdHJpbmcocGFyYW0tPnZhbHVlKCkuZ2V0KCkpOworICAgICAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJuZXcgdmFsdWUgIiA8PCBhc1N0cmluZyhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGFzdCAmJiAhZGlydHkgJiYgaXggPT0gcGFyYW1JeCAmJiAqcGFyYW0tPnZhbHVlKCkgPT0gKnApIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgaW4gdmFsdWUgLSBhbmQgZGVwZW5kZW5jaWVzIHdlcmUgbm90IHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZQorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaWdub3Jpbmcgc2V0dGluZyB1bmNoYW5nZWQgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXBwbHkgc2V0dGluZworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInNldHRpbmcgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBvbGRWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gcGFyYW0tPnRyeVNldCgKKyAgICAgICAgICAgICAgICAgICAgKCFsYXN0ICYmIHBhcmFtSXggPT0gaXgpID8gcCA6IHBhcmFtLT52YWx1ZSgpLmdldCgpLCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgJmNoYW5nZWQsICpfbUZhY3RvcnksIGZhaWx1cmVzKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBuZXdWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgQzJfQ0hFQ0tfRVEob2xkVmFsdWUgPT0gbmV3VmFsdWUsICpvbGRWYWx1ZSA9PSAqbmV3VmFsdWUpOworICAgICAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX09LOiBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcGFyYW1CYWRWYWx1ZSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOiBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHBhcmFtVGltZWRPdXQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcGFyYW1CbG9ja2luZyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiBwYXJhbUNvcnJ1cHRlZCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDsvLyBUT0RPIGZhdGFsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayByZXN1bHQgZm9yIGNvbmZpZ3VyZWQgdmFsdWVzIChvciBpbnZhbGlkYXRlIGlmIGl0IGRvZXMgbm90IGZpdCBvciBtYXRjaCkKKyAgICAgICAgICAgIGlmICh1cGRhdGVQYXJhbXMgJiYgIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgeworICAgICAgICAgICAgICAgIGlmICghcC0+dXBkYXRlRnJvbSgqcGFyYW0tPnZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgcHRycyBhcyBwYXJhbXMgYXJlIGNvcHkgb24gd3JpdGUKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJwYXJhbSAiIDw8IGl4IDw8ICIgdmFsdWUgY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgY2hhbmdlZCB1cGRhdGUgZG93bi1kZXBlbmRlbmNpZXMgYW5kIG1hcmsgdGhlbSBkaXJ0eQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaXggOiBwYXJhbS0+Z2V0RG93bkRlcGVuZGVuY2llcygpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBhdXRvIGluc2VydF9yZXMgPSBkZXBlbmRlbmNpZXMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpLCB7IGl4LCB0cnVlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnNlcnRfcmVzLnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKCppbnNlcnRfcmVzLmZpcnN0KS5zZWNvbmQuc2Vjb25kID0gdHJ1ZTsgLy8gbWFyayBkaXJ0eQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSk7CisgICAgICAgICAgICAgICAgICAgIEMyX0NIRUNLKGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRvd24gZGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSBhdCAjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSA8PCAiOiAiIDw8IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChwYXJhbUNvcnJ1cHRlZCA/IEMyX0NPUlJVUFRFRCA6CisgICAgICAgICAgICBwYXJhbUJsb2NraW5nID8gQzJfQkxPQ0tJTkcgOgorICAgICAgICAgICAgcGFyYW1UaW1lZE91dCA/IEMyX1RJTUVEX09VVCA6CisgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgIChwYXJhbUJhZFZhbHVlIHx8IHBhcmFtV2FzSW52YWxpZCkgPyBDMl9CQURfVkFMVUUgOgorICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6IEMyX09LKTsKK30KKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpnZXREZXBlbmRlbmN5SW5kZXhfbChDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgIHJldHVybiBfbUZhY3RvcnktPmdldERlcGVuZGVuY3lJbmRleChpeCk7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkIC8qIFRPRE8gKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGJvb2wgcGFyYW1XYXNJbnZhbGlkID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vdEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbURpZE5vdEZpdCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCBwIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShwLT5pbmRleCgpKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwLT51cGRhdGVGcm9tKCp2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKGl4KTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcCA9IEMyUGFyYW06OkNvcHkoKnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6CisgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBub3QgbWFya2VkIGluIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPyBDMl9PSyA6CisgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA/IEMyX09LIDogQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicXVlcnlpbmcgZmllbGQgIiA8PCBxdWVyeS5maWVsZCgpOworICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChxdWVyeS5maWVsZCgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBwYXJhbSI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgbVJlZmxlY3RvciwgaXgsCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChxdWVyeS5maWVsZCgpKSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIGlmICh+b2ZmcyA9PSAwKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIGNvdWxkIG5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJmaWVsZCByZXNvbHZlZCB0byAiCisgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJAJTAyengrJTAyeCIsIG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaWVsZCA9CisgICAgICAgICAgICBwYXJhbS0+ZmluZEZpZWxkKG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgaWYgKCFmaWVsZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgZmllbGQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICp2YWx1ZXMgPSBudWxscHRyOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5LnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgICAgICB2YWx1ZXMgPSBmaWVsZC0+Z2V0UG9zc2libGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgcXVlcnkgdHlwZTogIiA8PCBxdWVyeS50eXBlKCk7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlcykgeworICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gKnZhbHVlczsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAibm8gdmFsdWVzIHB1Ymxpc2hlZCBieSBjb21wb25lbnQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBDMkludGVyZmFjZUhlbHBlcjo6bG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PihtTXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlYzkxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKQEAgLTAsMCArMSwxMjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1wYXJhbWV0ZXIiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFsdWUiCisKKyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UKKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFJhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgcmFuZ2UgY2FsY3VsYXRpb25zLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEZQPXN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXIgeworICAgIC8qKgorICAgICAqIHR5cGUgb2YgcmFuZ2Ugc2l6ZTogYSAtIGIgaWYgYSA+PSBiIGFuZCBhIGFuZCBiIGFyZSBvZiB0eXBlIFQKKyAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZSBEaWZmVHlwZTsKKworICAgIC8qKgorICAgICAqIGNhbGN1bGF0ZSAoaGlnaCAtIGxvdykgbW9kIHN0ZXAKKyAgICAgKi8KKyAgICBzdGF0aWMgRGlmZlR5cGUgbW9kKFQgbG93LCBUIGhpZ2gsIFQgc3RlcCkgeworICAgICAgICByZXR1cm4gRGlmZlR5cGUoaGlnaCAtIGxvdykgJSBEaWZmVHlwZShzdGVwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXI8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgVCBEaWZmVHlwZTsKKworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBmbW9kKGhpZ2ggLSBsb3csIHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+OjpDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBfbU1pbiA9IHZhbHVlcy5yYW5nZS5taW4ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21NYXggPSB2YWx1ZXMucmFuZ2UubWF4LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tU3RlcCA9IHZhbHVlcy5yYW5nZS5zdGVwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tTnVtID0gdmFsdWVzLnJhbmdlLm51bS5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbURlbm9tID0gdmFsdWVzLnJhbmdlLmRlbm9tLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX21NaW4gPSBNQVhfVkFMVUU7CisgICAgICAgIF9tTWF4ID0gTUlOX1ZBTFVFOworICAgICAgICBfbVN0ZXAgPSBNSU5fU1RFUDsKKyAgICAgICAgX21OdW0gPSAwOworICAgICAgICBfbURlbm9tID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkUmFuZ2U8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGZhbGwgYmV0d2VlbiBtaW4gYW5kIG1heAorICAgIGlmICh2YWx1ZSA8IF9tTWluIHx8IHZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzaW1wbGUgcmFuZ2VzIGNvbnRhaW4gYWxsIHZhbHVlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKGlzU2ltcGxlUmFuZ2UoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gbWluIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSByYW5nZQorICAgIGlmICh2YWx1ZSA9PSBfbU1pbikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gc3RlcHBlZCByYW5nZXMgcmVxdWlyZSAodmFsIC0gbWluKSAlIHN0ZXAgdG8gYmUgemVybworICAgIGlmIChpc0FyaXRobWV0aWNTZXJpZXMoKSkgeworICAgICAgICByZXR1cm4gX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxUPjo6bW9kKF9tTWluLCB2YWx1ZSwgX21TdGVwKSA9PSAwOworICAgIH0KKyAgICAvLyBwdXJlIGdlb21ldHJpYyBzZXJpZXMgcmVxdWlyZSAodmFsIC8gbWluKSB0byBiZSBpbnRlZ2VyIG11bHRpcGxlIG9mIChudW0vZGVub20pCisgICAgaWYgKGlzR2VvbWV0cmljU2VyaWVzKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgbG9nMmJhc2UgPSBsb2cyKF9tTnVtIC8gX21EZW5vbSk7CisgICAgICAgIGRvdWJsZSBwb3dlciA9IGxscm91bmQobG9nMih2YWx1ZSAvIGRvdWJsZShfbU1pbikpIC8gbG9nMmJhc2UpOworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IHJlc3VsdCBmYWxscyB3aXRoaW4gcHJlY2lzaW9uIChvdGhlciB0aGFuIHJvdW5kKQorICAgICAgICByZXR1cm4gdmFsdWUgPT0gVChfbU1pbiAqIHBvdyhfbU51bSAvIF9tRGVub20sIHBvd2VyKSArIE1JTl9TVEVQIC8gMik7CisgICAgfQorICAgIC8vIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHJlcXVpcmUgdmFsaWRhdGluZyBieSB3YWxraW5nIHRocm91Z2ggdGhlIHNlcmllcworICAgIGlmIChpc01hY1NlcmllcygpKSB7CisgICAgICAgIGRvdWJsZSBsYXN0VmFsdWUgPSBfbU1pbjsKKyAgICAgICAgZG91YmxlIGJhc2UgPSBfbU51bSAvIF9tRGVub207CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhc3QgaXMgc2FmZSBhcyBfbU1pbiA8PSBsYXN0VmFsdWUgPD0gX21NYXgKKyAgICAgICAgICAgIGlmIChUKGxhc3RWYWx1ZSArIE1JTl9TVEVQIC8gMikgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvdWJsZSBuZXh0VmFsdWUgPSBmbWEobGFzdFZhbHVlLCBiYXNlLCBfbVN0ZXApOworICAgICAgICAgICAgaWYgKG5leHRWYWx1ZSA8PSBsYXN0VmFsdWUgfHwgbmV4dFZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNlcmllcyBpcyBubyBsb25nZXIgbW9ub3RvbmljIG9yIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdFZhbHVlID0gbmV4dFZhbHVlOworICAgICAgICB9OworICAgIH0KKyAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgcmFuZ2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+IEMyU3VwcG9ydGVkUmFuZ2U8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIC8vIFRPRE8gLSB0aGlzIG9ubHkgd29ya3MgZm9yIHNpbXBsZSByYW5nZXMKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om1heChfbU1pbiwgbGltaXQuX21NaW4pLCBzdGQ6Om1pbihfbU1heCwgbGltaXQuX21NYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoX21TdGVwLCBsaW1pdC5fbVN0ZXApKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCisvLyBmbG9hdCBmbGFncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IGRlZmluZSBhIGZldyBtZXRob2RzIHRvIHN1cHBvcnQgZ2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGNvZGUKK3RlbXBsYXRlPD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmNvbnRhaW5zKGZsb2F0IHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxmbG9hdD4oKTsKK30KKwordGVtcGxhdGU8PgorQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlczsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPD4KK2Zsb2F0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjptaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkRmxhZ3M8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGNvbnRhaW4gdGhlIG1pbmltYWwgbWFzaworICAgIFQgbWluTWFzayA9IG1pbigpOworICAgIGlmICh+dmFsdWUgJiBtaW5NYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgJj0gfm1pbk1hc2s7CisgICAgLy8gb3RoZXJ3aXNlLCByZW1vdmUgZmxhZ3MgZnJvbSB2YWx1ZSBhbmQgc2VlIGlmIHdlIGFycml2ZSBhdCAwCisgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh+dmFsdWUgJiB2LnJlZjxWYWx1ZVR5cGU+KCkpID09IDApIHsKKyAgICAgICAgICAgIHZhbHVlICY9IH52LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVlID09IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpmbGFncygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKGMyX21heChfbVZhbHVlcy5zaXplKCksIDF1KSAtIDEpOworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSArIDEsIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApLT5UIHsKKyAgICAgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gdmFsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkRmxhZ3M8VD4gQzJTdXBwb3J0ZWRGbGFnczxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBUIG1pbk1hc2sgPSBtaW4oKSB8IGxpbWl0Lm1pbigpOworICAgIC8vIG1pbmltdW0gbWFzayBtdXN0IGJlIGNvdmVyZWQgYnkgYm90aCB0aGlzIGFuZCBvdGhlcgorICAgIGlmIChsaW1pdC5jb250YWlucyhtaW5NYXNrKSAmJiBjb250YWlucyhtaW5NYXNrKSkgeworICAgICAgICB2YWx1ZXNbMF0gPSBtaW5NYXNrOworICAgICAgICAvLyBrZWVwIG9ubHkgZmxhZ3MgdGhhdCBhcmUgY292ZXJlZCBieSBsaW1pdAorICAgICAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0LCBtaW5NYXNrXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbWluTWFzayB8fCAhbGltaXQuY29udGFpbnModmFsdWUpOyB9KTsKKyAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGRvIGl0IHZpY2UgdmVyc2EKKyAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbWluTWFzayAmJiBjb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKChWYWx1ZVR5cGUpdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgQzJTdXBwb3J0ZWRGbGFnczxUPjo6bWluKCkgY29uc3QgeworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZnJvbnQoKS50ZW1wbGF0ZSByZWY8VmFsdWVUeXBlPigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBUKDApOworICAgIH0KK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHI2NF90PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRWYWx1ZVNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKF9tVmFsdWVzLmNiZWdpbigpLCBfbVZhbHVlcy5jZW5kKCksCisgICAgICAgICAgICBbdmFsdWVdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgICAgIH0pICE9IF9tVmFsdWVzLmNlbmQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OnZhbHVlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKF9tVmFsdWVzLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0oX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLCBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIC0+IFQgeworICAgICAgICByZXR1cm4gcC5yZWY8VmFsdWVUeXBlPigpOworICAgIH0pOworICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgICAgIDogX21UeXBlKHZhbHVlcy50eXBlKSwKKyAgICAgICAgICBfbVJhbmdlKHZhbHVlcyksCisgICAgICAgICAgX21WYWx1ZXModmFsdWVzKSwKKyAgICAgICAgICBfbUZsYWdzKHZhbHVlcykgeyB9CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21GbGFnczsKKworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6IHJldHVybiBfbVJhbmdlLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6IHJldHVybiBfbVZhbHVlcy5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6IHJldHVybiBfbUZsYWdzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbD4odmFsdWVzKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+Ojp+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnN1cHBvcnRzKHZhbHVlKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKQorICAgICAgICA6IF9tUGFyYW1GaWVsZChmaWVsZCksCisgICAgICAgICAgX21UeXBlKHR5cGVfdDo6UkFOR0UpLAorICAgICAgICAgIF9tRGVmaW5lZChmYWxzZSksCisgICAgICAgICAgX21SYW5nZShDMlN1cHBvcnRlZFJhbmdlPFQ+OjpBbnkoKSksCisgICAgICAgICAgX21WYWx1ZXMoQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Tm9uZSgpKSwKKyAgICAgICAgICBfbUZsYWdzKEMyU3VwcG9ydGVkRmxhZ3M8VD46Ok5vbmUoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21WYWx1ZXMpOworICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21SYW5nZSk7CisgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbUZsYWdzKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRSRVNQQVNTCisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4gKi8KKyAgICB2b2lkIGFueSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4gKi8KKyAgICB2b2lkIG5vbmUoKSB7CisgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6VkFMVUVTOworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLiAqLworICAgIHZvaWQgZXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih7dmFsdWV9KSk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbVJhbmdlKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdC5saW1pdGVkVG8oX21GbGFncyk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgZmxhZ3MKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSBmbGFnIHNldC4gKi8KKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbUZsYWdzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tRmxhZ3MpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21GbGFncyA9IF9tRmxhZ3MubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgcmFuZ2VzIHRvIGZsYWdzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21SYW5nZSA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgZmxhZ3MgdG8gcmFuZ2VzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tUmFuZ2UgPSBfbVJhbmdlLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgQzJfRENIRUNLKF9tVmFsdWVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgbm9uLWNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdm9pZCBpbnN0YW50aWF0ZSgpIGNvbnN0IF9fdW51c2VkIHsKKyAgICAgICAgKHZvaWQpX21WYWx1ZXMudmFsdWVzKCk7IC8vIGluc3RhbnRpYXRlIGNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdHlwZWRlZiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgdHlwZV90OworCisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworICAgIGJvb2wgX21EZWZpbmVkOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gX21GbGFnczsKKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEMyUGFyYW1GaWVsZFZhbHVlcykoKl9tSW1wbC5nZXQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPihmaWVsZCkpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6YW55KCkgeworICAgIF9tSW1wbC0+YW55KCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bm9uZSgpIHsKKyAgICBfbUltcGwtPm5vbmUoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjplcXVhbFRvKFQgdmFsdWUpIHsKKyAgICBfbUltcGwtPmVxdWFsVG8odmFsdWUpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm90aGVyKSB7CisgICAgX21JbXBsID0gc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojp+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCkgOiBfbUNvbmZsaWN0cygpIHsgfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjp3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpyZXRyaWV2ZUNvbmZsaWN0cygpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKF9tQ29uZmxpY3RzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlNldHRpbmdSZXN1bHQvc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6UmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSkgeworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeyBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgeyBwYXJhbSB9LCB7IH0gfTsKK30KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8pIHsKKyAgICByZXR1cm4geyBpc0luZm8gPyBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFIDogQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsCisgICAgICAgICAgICAgeyBwYXJhbUZpZWxkIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6Q29uZmxpY3QoCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywgYm9vbCBpc0luZm8pIHsKKyAgICBDMl9DSEVDSyghY29uZmxpY3RzLmVtcHR5KCkpOworICAgIGlmIChpc0luZm8pIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULAorICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtRmllbGRWYWx1ZXMpLCBjb25mbGljdHMucmV0cmlldmVDb25mbGljdHMoKQorICAgICAgICB9OworICAgIH0KK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCkKKyAgICAgICAgOiBfbVN0YXR1cyhDMl9CQURfVkFMVUUpIHsKKyAgICBfbVJlc3VsdHMuZW1wbGFjZV9iYWNrKG5ldyBDMlNldHRpbmdSZXN1bHQoc3RkOjptb3ZlKHJlc3VsdCkpKTsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IHJlc3VsdHMuX21SZXN1bHRzKSB7CisgICAgICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgcmVzdWx0cy5fbVJlc3VsdHMuY2xlYXIoKTsKKyAgICAvLyBUT0RPOiBtU3RhdHVzCisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqdGhpcyk7Cit9CisKK2MyX3N0YXR1c190IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpyZXRyaWV2ZUZhaWx1cmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IF9tUmVzdWx0cykgeworICAgICAgICBmYWlsdXJlcy0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyKSk7CisgICAgfQorICAgIF9tUmVzdWx0cy5jbGVhcigpOworICAgIHJldHVybiBfbVN0YXR1czsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cykgOiBfbVN0YXR1cyhzdGF0dXMpIHsKKyAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VUIG9yIENPUlJVUFRFRAorICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6X0luc3BlY3RvciB7CisgICAgLy8vIHJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IEdldEltcGwoY29uc3QgSW5mbyAmaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5fbUltcGw7CisgICAgfQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OkluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgeworICAgIEMyRmllbGREZXNjcmlwdG9yIGZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnQ7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgdWludDMyX3QgZGVwdGg7CisgICAgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0OworICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0OworICAgIHVpbnQzMl90IHVzZWRFeHRlbnQ7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QgaW5jbHVkaW5nIGNvcGllcyBvZiBpdHMgcGFyZW50IGNoYWluCisgICAgSW1wbCBjbG9uZSgpIGNvbnN0OworCisgICAgLy8vIGNyZWF0ZXMgYSBjb3B5IG9mIGEgc2hhcmVkIHBvaW50ZXIgdG8gYW4gb2JqZWN0CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJik7CisKKyAgICBJbXBsKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZF8sIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnRfLAorICAgICAgICAgICAgdWludDMyX3QgaW5kZXhfLCB1aW50MzJfdCBkZXB0aF8sIHVpbnQzMl90IGJhc2VGaWVsZE9mZnNldF8sCisgICAgICAgICAgICB1aW50MzJfdCBhcnJheU9mZnNldF8sIHVpbnQzMl90IHVzZWRFeHRlbnRfKQorICAgICAgICA6IGZpZWxkKGZpZWxkXyksIHBhcmVudChwYXJlbnRfKSwgaW5kZXgoaW5kZXhfKSwgZGVwdGgoZGVwdGhfKSwKKyAgICAgICAgICBiYXNlRmllbGRPZmZzZXQoYmFzZUZpZWxkT2Zmc2V0XyksIGFycmF5T2Zmc2V0KGFycmF5T2Zmc2V0XyksIHVzZWRFeHRlbnQodXNlZEV4dGVudF8pIHsgfQorfTsKKworc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJmluZm8pIHsKKyAgICBpZiAoaW5mbykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihpbmZvLT5jbG9uZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW1wbCBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OmNsb25lKCkgY29uc3QgeworICAgIEltcGwgcmVzID0gSW1wbCgqdGhpcyk7CisgICAgcmVzLnBhcmVudCA9IENsb25lKHJlcy5wYXJlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IF9tSW1wbChpbXBsKSB7IH0KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+YXJyYXlPZmZzZXQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmFycmF5U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXh0ZW50KCkgKiBzaXplKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmJhc2VGaWVsZE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5iYXNlRmllbGRPZmZzZXQ7Cit9OworCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpkZXB0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5kZXB0aDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6ZXh0ZW50KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnVzZWRFeHRlbnQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmluZGV4OworfQorCitib29sIEMyRmllbGRVdGlsczo6SW5mbzo6aXNBcml0aG1ldGljKCkgY29uc3QgeworICAgIHN3aXRjaCAoX21JbXBsLT5maWVsZC50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0ZsZXhpYmxlKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLmV4dGVudCgpID09IDA7Cit9CisKK0MyU3RyaW5nIEMyRmllbGRVdGlsczo6SW5mbzo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5uYW1lKCk7Cit9CisKK2NvbnN0IEMyRmllbGRVdGlsczo6SW5mbzo6TmFtZWRWYWx1ZXNUeXBlICZDMkZpZWxkVXRpbHM6OkluZm86Om5hbWVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWVkVmFsdWVzKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86Om9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChfbUltcGwtPmZpZWxkKTsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvIEMyRmllbGRVdGlsczo6SW5mbzo6cGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBJbmZvKF9tSW1wbC0+cGFyZW50KTsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OnR5cGVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQudHlwZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIDogcHVibGljIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBpbXBsZW1lbnRzIG9iamVjdCBlcXVhbGl0eQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJiBtSGVhZCA9PSBvdGhlci0+bUhlYWQ7CisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIHBvaW50ZWQgdG8gYnkgdGhpcyBpdGVyYXRvcgorICAgIHZpcnR1YWwgdmFsdWVfdHlwZSBnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJbmZvKG1IZWFkKTsKKyAgICB9CisKKyAgICAvLy8gaW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgLy8gbm90ZTogdGhpcyBjYW5ub3QgYmUgYWJzdHJhY3QgYXMgd2UgaW5zdGFudGlhdGUgdGhpcyBmb3IgTGlzdDo6ZW5kKCkuIGluY3JlbWVudCB0byBlbmQoKQorICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEltcGwoc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCkKKyAgICAgICAgOiBtSGVhZChoZWFkKSB7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbmZvOjpJbXBsPiBtSGVhZDsgLy8vPCBjdXJyZW50IGZpZWxkCit9OworCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjp2YWx1ZV90eXBlIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldCgpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yJiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgIG1JbXBsLT5pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVxdWFscyhvdGhlci5tSW1wbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpMaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SXRlcmF0b3I6OkltcGw+IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SXRlcmF0b3I6OkltcGw+KCk7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKK307CisKK0MyRmllbGRVdGlsczo6TGlzdDo6TGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6YmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmJlZ2luKCkpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6ZW5kKCkgY29uc3QgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yKG1JbXBsLT5lbmQoKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGJhc2UgY2xhc3MgaGVscGVyIHRoYXQgYWxsb3dzIGRlc2NlbmRpbmcgaW50byB0aGUgZmllbGQgaGllcmFyY2h5LgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCB7CisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYmFzZS1maWVsZCdzIG9mZnNldCBvZiB0aGUgcGFyZW50IGZpZWxkIChvciB0aGUgcGFyYW0gb2Zmc2V0IGlmIG5vIHBhcmVudCkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBwYXJlbnQtPmJhc2VGaWVsZE9mZnNldDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudE9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxscHRyID8gc2l6ZW9mKEMyUGFyYW0pIDogR2V0T2Zmc2V0KHBhcmVudC0+ZmllbGQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvciwKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IGhlYWQgPSBudWxscHRyKQorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoaGVhZCksCisgICAgICAgICAgbVBhcmFtU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIG1SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIC8vLyByZXR1cm5zIGEgbGVhZiBpbmZvIG9iamVjdCBhdCBhIHNwZWNpZmljIGluZGV4IGZvciBhIGNoaWxkIGZpZWxkCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbWFrZUxlYWYoCisgICAgICAgICAgICBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQsIHVpbnQzMl90IGluZGV4KSB7CisgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0ID0gcGFyZW50T2Zmc2V0ICsgR2V0T2Zmc2V0KGZpZWxkKTsKKyAgICAgICAgdWludDMyX3QgdXNlZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChhcnJheU9mZnNldCwgbVBhcmFtU2l6ZSkgLSBhcnJheU9mZnNldCkgLyBHZXRTaXplKGZpZWxkKTsKKworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+KAorICAgICAgICAgICAgICAgIE9mZnNldEZpZWxkRGVzY3JpcHRvcihmaWVsZCwgcGFyZW50T2Zmc2V0ICsgaW5kZXggKiBHZXRTaXplKGZpZWxkKSksCisgICAgICAgICAgICAgICAgbUhlYWQgLyogcGFyZW50ICovLCBpbmRleCwgbUhlYWQgPT0gbnVsbHB0ciA/IDAgOiBtSGVhZC0+ZGVwdGggKyAxLAorICAgICAgICAgICAgICAgIEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZCkgKyBHZXRPZmZzZXQoZmllbGQpLAorICAgICAgICAgICAgICAgIGFycmF5T2Zmc2V0LCB1c2VkRXh0ZW50KTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgc3RydWN0IGluZGV4IGhhdmUgYmVlbiB0cmF2ZXJzZWQgdG8gZ2V0IHRvIHRoaXMgZmllbGQKKyAgICBib29sIHZpc2l0ZWQoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gJnNkIDogbUhpc3RvcnkpIHsKKyAgICAgICAgICAgIGlmIChzZC0+Y29yZUluZGV4KCkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPj4gbUhpc3Rvcnk7IC8vIHN0cnVjdHVyZSB0eXBlcyB2aXNpdGVkCit9OworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKSB0aGF0IHZpc2l0cyBlYWNoIGJhc2UgZmllbGQuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciB7CisgICAgLy8vIGVudW1lcmF0ZSBiYXNlIGZpZWxkcyBvZiBhIHBhcmFtZXRlcgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW0uc2l6ZSgpKSB7CisgICAgICAgIGRlc2NlbmRJbnRvKHBhcmFtLmNvcmVJbmRleCgpKTsKKyAgICB9CisKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgZmllbGQKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+IGltcGwpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoaW1wbC0+bVJlZmxlY3RvciwgaW1wbC0+bVBhcmFtU2l6ZSwgaW1wbC0+bUhlYWQpIHsKKyAgICAgICAgbUhpc3RvcnkgPSBpbXBsLT5tSGlzdG9yeTsKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgaWYgKCF2aXNpdGVkKGluZGV4KSkgeworICAgICAgICAgICAgICAgIGRlc2NlbmRJbnRvKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGJhc2UgZmllbGQuCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gZG9uJ3QgZ28gcGFzdCBlbmQKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGxwdHIgfHwgX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIHN0cnVjdHVyZXMKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgLy8gZG8gbm90IHJlY3Vyc2UgaW50byB0aGUgc2FtZSBzdHJ1Y3RzCisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpICYmIGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzY2VuZCBhZnRlciB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgd2hpbGUgKCFtSGlzdG9yeS5lbXB0eSgpICYmIF9tRmllbGRzLmJhY2soKSA9PSBtSGlzdG9yeS5iYWNrKCktPmVuZCgpKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1IZWFkLT5wYXJlbnQ7CisgICAgICAgICAgICBtSGlzdG9yeS5wb3BfYmFjaygpOworICAgICAgICAgICAgX21GaWVsZHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbmUgaWYgaGlzdG9yeSBpcyBub3cgZW1wdHkKKyAgICAgICAgaWYgKF9tRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIGJlIHRyYXZlcnNpbmcgYSBzdWItdHJlZSBzbyBjbGVhciBoZWFkCisgICAgICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBuZXh0ID0gX21GaWVsZHMuYmFjaygpOworICAgICAgICBtSGVhZC0+ZmllbGQgPSBPZmZzZXRGaWVsZERlc2NyaXB0b3IoKm5leHQsIEdldFBhcmVudE9mZnNldChtSGVhZC0+cGFyZW50KSk7CisgICAgICAgIG1IZWFkLT5pbmRleCA9IDA7IC8vIHJlc2V0IGluZGV4IGp1c3QgaW4gY2FzZSBmb3IgY29ycmVjdG5lc3MKKyAgICAgICAgbUhlYWQtPmJhc2VGaWVsZE9mZnNldCA9IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZC0+cGFyZW50KSArIEdldE9mZnNldCgqbmV4dCk7CisgICAgICAgIG1IZWFkLT5hcnJheU9mZnNldCA9IEdldE9mZnNldChtSGVhZC0+ZmllbGQpOworICAgICAgICBtSGVhZC0+dXNlZEV4dGVudCA9IG1IZWFkLT5maWVsZC5leHRlbnQoKSA/IDoKKyAgICAgICAgICAgICAgICAoc3RkOjptYXgobUhlYWQtPmFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIG1IZWFkLT5hcnJheU9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gR2V0U2l6ZShtSGVhZC0+ZmllbGQpOworICAgICAgICArK19tRmllbGRzLmJhY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEga25vd24sIHZhbGlkICh1bnRyYXZlcnNlZCkgc3RydWN0dXJlLCBpdCBtb2RpZmllcyB0aGlzIGl0ZXJhdG9yCisgICAgLy8vIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgZG9lcyBub3QKKyAgICAvLy8gbW9kaWZ5IHRoaXMgaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBmaXJzdCA9IGRlc2MtPmJlZ2luKCk7CisgICAgICAgICAgICBtSGVhZCA9IG1ha2VMZWFmKCpmaXJzdCwgMCAvKiBpbmRleCAqLyk7CisgICAgICAgICAgICBfbUZpZWxkcy5lbXBsYWNlX2JhY2soKytmaXJzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIG5leHQgZmllbGQgcG9pbnRlcnMgZm9yIGVhY2ggZGVwdGguCisgICAgLy8vIG5vdGU6IF9tRmllbGRzIG1heSBiZSBzaG9ydGVkIHRoYW4gbUhpc3RvcnksIGlmIGl0ZXJhdGluZyBhdCBhIGRlcHRoCisgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yPigqX21QYXJhbSwgX21SZWZsZWN0b3IpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tUGFyYW0oJnBhcmFtKSwgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtICpfbVBhcmFtOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpMaXN0KHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZT4ocGFyYW0sIHJlZmxlY3RvcikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlIHNpYmxpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gJmluZm8sIHNpemVfdCBsZXZlbCkKKyAgICAgICAgICAvLyBjbG9uZSBpbmZvIGNoYWluIGFzIHRoaXMgaXRlcmF0b3Igd2lsbCBjaGFuZ2UgaXQKKyAgICAgICAgOiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsKEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Q2xvbmUoaW5mbykpIHsKKyAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0b3JlIHBhcmVudCBjaGFpbiAodXAgdG8gbGV2ZWwpIGZvciBxdWljayBhY2Nlc3MKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbm9kZSA9IG1IZWFkOworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKDsgaXggPCBsZXZlbCAmJiBub2RlOyArK2l4KSB7CisgICAgICAgICAgICBub2RlLT5pbmRleCA9IDA7CisgICAgICAgICAgICBfbVBhdGguZW1wbGFjZV9iYWNrKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFBhdGgoaXgpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyBJbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IgYnkgdmlzaXRpbmcgZWFjaCBpbmRleC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICB3aGlsZSAoaXggPCBfbVBhdGguc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoKytfbVBhdGhbaXhdLT5pbmRleCA8IF9tUGF0aFtpeF0tPnVzZWRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFBhdGgoaXggKyAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhdGhbaXgrK10tPmluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gYWRqdXN0cyBmaWVsZCBvZmZzZXRzIGFsb25nIHRoZSBwYXRoIHVwIHRvIHRoZSBzcGVjaWZpYyBsZXZlbCAtIDEuCisgICAgLy8vIFRoaXMgaW4tZmFjdCBoYXMgdG8gYmUgZG9uZSBkb3duIHRoZSBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIGFzIGNoaWxkIGZpZWxkcyBtdXN0CisgICAgLy8vIGZhbGwgd2l0aGluIHBhcmVudCBmaWVsZHMuCisgICAgdm9pZCBzZXR1cFBhdGgoc2l6ZV90IGxldmVsKSB7CisgICAgICAgIEMyX0NIRUNLX0xFKGxldmVsLCBfbVBhdGguc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3Qgb2xkQXJyYXlPZmZzZXQgPSBsZXZlbCA/IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA6IDAgLyogdW51c2VkICovOworICAgICAgICB3aGlsZSAobGV2ZWwpIHsKKyAgICAgICAgICAgIC0tbGV2ZWw7CisgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgJnBhdGggPSAqX21QYXRoW2xldmVsXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBHZXRTaXplKHBhdGguZmllbGQpOworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gcGF0aC5hcnJheU9mZnNldCArIHNpemUgKiBwYXRoLmluZGV4OworICAgICAgICAgICAgU2V0T2Zmc2V0KHBhdGguZmllbGQsIG9mZnNldCk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBjaGlsZCdzIGFycmF5IG9mZnNldCB0byBmYWxsIHdpdGhpbiBjdXJyZW50IGluZGV4LCBidXQgaG9sZCBvbnRvIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBhcnJheU9mZnNldCBzbyB0aGF0IHdlIGNhbiBhZGp1c3Qgc3Vic2VxdWVudCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vZHVsbyBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkQXJyYXlPZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyAoX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IC0gb2xkQXJyYXlPZmZzZXQpICUgc2l6ZTsKKyAgICAgICAgICAgICAgICBvbGRBcnJheU9mZnNldCA9IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldDsKKyAgICAgICAgICAgICAgICBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgPSBjaGlsZEFycmF5T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4+IF9tUGF0aDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3I+KF9tSGVhZCwgX21MZXZlbCk7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZShjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkKKyAgICAgICAgOiBfbUhlYWQoQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yOjpHZXRJbXBsKGZpZWxkKSksIF9tTGV2ZWwobGV2ZWwpIHsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tSGVhZDsKKyAgICBzaXplX3QgX21MZXZlbDsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlQ291c2lucyhjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGU+KGZpZWxkLCBsZXZlbCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBsb2NhdGVGaWVsZCgpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLCB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW1TaXplKSwKKyAgICAgICAgICBfbUZpZWxkKGZpZWxkKSB7CisgICAgICAgIHdoaWxlIChkZXNjZW5kSW50byhpbmRleCkpIHsKKyAgICAgICAgICAgIGlmICgobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgobUhlYWQtPmZpZWxkLnR5cGUoKSAmfiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoKSB7CisgICAgICAgIG1IZWFkID0gX21UYWlsOworICAgICAgICBfbVRhaWwgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBnaXZlbiBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zCisgICAgLy8vIHRydWUuIE90aGVyd2lzZSwgaW5jbHVkaW5nIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzIGluIHRoZSBzdHJ1Y3R1cmUsIGl0IGRvZXMgbm90IG1vZGlmeSB0aGlzCisgICAgLy8vIGl0ZXJhdG9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZGVzY2VuZEludG8oQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZpZWxkIHRvIGJlIGxvY2F0ZWQgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQKKyAgICAgICAgLy8gZmllbGQKKyAgICAgICAgaWYgKG1IZWFkICE9IF9tVGFpbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworCisgICAgICAgICAgICB1aW50MzJfdCBwYXJlbnRPZmZzZXQgPSBHZXRQYXJlbnRPZmZzZXQobUhlYWQpOworCisgICAgICAgICAgICAvLyBsb2NhdGUgZmllbGQgdXNpbmcgYSBkdW1teSBmaWVsZCBkZXNjcmlwdG9yCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciBkdW1teSA9IHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQiwgMSAvKiBleHRlbnQgKi8sICJuYW1lIiwKKyAgICAgICAgICAgICAgICBHZXRPZmZzZXQoX21GaWVsZCkgLSBwYXJlbnRPZmZzZXQsIEdldFNpemUoX21GaWVsZCkKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaXJzdCBmaWVsZCB3aGVyZSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGR1bW15IG9mZnNldCAod2hpY2ggaXMgb25lIHBhc3QpCisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjp1cHBlcl9ib3VuZCgKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2JlZ2luKCksIGRlc2MtPmNlbmQoKSwgZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYSkgPCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gZGVzYy0+YmVnaW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIHByaW9yIHRvIGZpcnN0IGZpZWxkCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCA9ICppdDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBkdW1teSBlbmQtb2Zmc2V0IGlzIHdpdGhpbiB0aGlzIGZpZWxkCisgICAgICAgICAgICB1aW50MzJfdCBzdHJ1Y3RTaXplID0gc3RkOjptYXgobVBhcmFtU2l6ZSwgcGFyZW50T2Zmc2V0KSAtIHBhcmVudE9mZnNldDsKKyAgICAgICAgICAgIGlmIChHZXRFbmRPZmZzZXQoZHVtbXkpID4gR2V0RW5kT2Zmc2V0KGZpZWxkLCBzdHJ1Y3RTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCA9IChHZXRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZEluZGV4ID0KKyAgICAgICAgICAgICAgICAoR2V0RW5kT2Zmc2V0KGR1bW15KSAtIEdldE9mZnNldChmaWVsZCkgKyBHZXRTaXplKGZpZWxkKSAtIDEpIC8gR2V0U2l6ZShmaWVsZCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPiBzdGFydEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gRmllbGQgc2l6ZSBjb3VsZCBiZSB6ZXJvLCBpbiB3aGljaCBjYXNlIGVuZCBpbmRleCBpcyBzdGlsbCBvbiBzdGFydCBpbmRleC4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBmb3IgYWxsIG90aGVyIGNhc2VzLCBlbmRJbmRleCB3YXMgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbmRleCwgc28KKyAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgaXQuCisgICAgICAgICAgICAgICAgLS1lbmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHN0YXJ0TGVhZiA9CisgICAgICAgICAgICAgICAgbWFrZUxlYWYoZmllbGQsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBfbVRhaWwgPSBzdGFydExlYWY7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IG1ha2VMZWFmKGZpZWxkLCBlbmRJbmRleCk7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgX0MyRmllbGRJZCBfbUZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tVGFpbDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3I+KAorICAgICAgICAgICAgICAgIF9tSW5kZXgsIF9tRmllbGQsIF9tUGFyYW1TaXplLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgoQzJQYXJhbTo6Q29yZUluZGV4KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChwZikpKSwKKyAgICAgICAgICBfbUZpZWxkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZikpLAorICAgICAgICAgIF9tUGFyYW1TaXplKDApLAorICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0uY29yZUluZGV4KCkpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpLAorICAgICAgICAgIF9tUGFyYW1TaXplKHBhcmFtLnNpemUoKSksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBDMlBhcmFtOjpDb3JlSW5kZXggX21JbmRleDsKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgdWludDMyX3QgX21QYXJhbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geyBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBmLCByZWZsZWN0b3IpIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8QzJGaWVsZFV0aWxzOjpJbmZvPiBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBhcmFtLCBmaWVsZCwgcmVmbGVjdG9yKQorICAgIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTczZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAvLyB0byBiZSBhYmxlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBkZWZpbmVkCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNpemVfdCBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhDMlN0cmluZ0xpdGVyYWwgYSkgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYVtpXSA9PSAnXycpIHsKKyAgICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdCBjb3VudE1hdGNoaW5nKEMyU3RyaW5nTGl0ZXJhbCBhLCBjb25zdCBDMlN0cmluZyAmYikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYi5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFbaV0gfHwgYVtpXSAhPSBiW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYi5zaXplKCk7Cit9CisKKy8vIEFCQ0RlZiA9PiBhYmMtZGVmCisvLyBBQkNEMmVmID0+IGFiY2QyLWVmIC8vIDAKKy8vIEFCQ0QyRWYgPT4gYW5jZDItZWYgLy8gLTEKKy8vIEFiY0RlZiA9PiBhYmMtZGVmIC8vIC0xCisvLyBBYmMyRGVmID0+IGFiYy0yZGVmCisvLyBBYmMyZGVmID0+IGFiYy0yLWRlZgorLy8gX1lvID0+IF95bworLy8gX3lvID0+IF95bworLy8gQzJfeW8gPT4gYzIteW8KKy8vIEMyX195byA9PiBjMi15bworCisvL3N0YXRpYworQzJTdHJpbmcgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKSB7CisgICAgZW51bSB7CisgICAgICAgIGtOb25lID0gJy4nLAorICAgICAgICBrTG93ZXIgPSAnYScsCisgICAgICAgIGtVcHBlciA9ICdBJywKKyAgICAgICAga0RpZ2l0ID0gJzEnLAorICAgICAgICBrRGFzaCA9ICctJywKKyAgICAgICAga1VuZGVyc2NvcmUgPSAnXycsCisgICAgfSB0eXBlID0ga05vbmU7CisgICAgc2l6ZV90IHdvcmRfc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBuYW1lLnNpemUoKTsgKytpeCkgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgbmFtZS5zdWJzdHIoMCwgd29yZF9zdGFydCkgPDwgInwiCisgICAgICAgICAgICAgICAgPDwgbmFtZS5zdWJzdHIod29yZF9zdGFydCwgaXggLSB3b3JkX3N0YXJ0KSA8PCAiWyIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cihpeCwgMSkgPDwgIl0iIDw8IG5hbWUuc3Vic3RyKGl4ICsgMSkKKyAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChjaGFyKXR5cGU7CisgICAgICAgIGlmIChpc3VwcGVyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lW2l4XSA9IHRvbG93ZXIobmFtZVtpeF0pOworICAgICAgICAgICAgdHlwZSA9IGtVcHBlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2xvd2VyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0RpZ2l0ICYmIGl4ID4gMCkgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtVcHBlciAmJiBpeCA+IHdvcmRfc3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKyAtIDEsIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBrTG93ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtEaWdpdDsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lW2l4XSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtEYXNoKSB7CisgICAgICAgICAgICAgICAgbmFtZS5lcmFzZShpeC0tLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBrTm9uZSAmJiB0eXBlICE9IGtVbmRlcnNjb3JlKSB7CisgICAgICAgICAgICAgICAgbmFtZVtpeF0gPSAnLSc7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtEYXNoOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGUgPSBrVW5kZXJzY29yZTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZS5yZXNpemUoaXgpOworICAgICAgICB9CisgICAgfQorICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiPT4gIiA8PCBuYW1lOworICAgIHJldHVybiBuYW1lOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXgpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXM7CisgICAgQzJTdHJpbmcgcHJlZml4OworICAgIHNpemVfdCBleHRyYVVuZGVyc2NvcmVzID0gMDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoX3ByZWZpeCkgeworICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMoX3ByZWZpeCk7CisgICAgICAgIHByZWZpeCA9IF9wcmVmaXggKyBleHRyYVVuZGVyc2NvcmVzOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHByZWZpeCBhbmQgbWluaW11bSBsZWFkaW5nIHVuZGVyc2NvcmVzCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gdW5kZXJzY29yZXM7CisgICAgICAgICAgICBwcmVmaXggPSBzICsgdW5kZXJzY29yZXM7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG1hdGNoaW5nID0gY291bnRNYXRjaGluZygKKyAgICAgICAgICAgICAgICBzICsgdW5kZXJzY29yZXMsCisgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICAgICAgICAgIHByZWZpeC5yZXNpemUobWF0Y2hpbmcpOworICAgICAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IHN0ZDo6bWluKHVuZGVyc2NvcmVzLCBleHRyYVVuZGVyc2NvcmVzKTsKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpID09IDAgJiYgZXh0cmFVbmRlcnNjb3JlcyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIHN3YWxsb3cgdGhlIGZpcnN0IHVuZGVyc2NvcmUgYWZ0ZXIgdXBwZXIgY2FzZSBwcmVmaXhlcworICAgIGJvb2wgdXBwZXJDYXNlUHJlZml4ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZWZpeC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXNsb3dlcihwcmVmaXhbaV0pKSB7CisgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBDMlN0cmluZyBzYW5pdGl6ZWQgPSBDMlN0cmluZyhzLCB1bmRlcnNjb3JlcyAtIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICBzYW5pdGl6ZWQuYXBwZW5kKHMgKyBwcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXMgKworICAgICAgICAgICAgICAgICAgICAodXBwZXJDYXNlUHJlZml4ICYmIHNbcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzXSA9PSAnXycpKTsKKyAgICAgICAgc2FuaXRpemVkTmFtZXMucHVzaF9iYWNrKGNhbWVsQ2FzZVRvRGFzaGVkKHNhbml0aXplZCkpOworICAgIH0KKworICAgIGZvciAoQzJTdHJpbmcgcyA6IHNhbml0aXplZE5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgIH0KKworICAgIHJldHVybiBzYW5pdGl6ZWROYW1lczsKK30KKworLy9zdGF0aWMKK3N0ZDo6dmVjdG9yPEMyU3RyaW5nPiBfQzJFbnVtVXRpbHM6OnBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGZvdW5kTmFtZXM7CisgICAgc2l6ZV90IHBvcyA9IDAsIGxlbiA9IHN0cmxlbih2YWx1ZSk7CisgICAgZG8geworICAgICAgICBzaXplX3QgZW5kUG9zID0gc3RyY3Nwbih2YWx1ZSArIHBvcywgIiAsPSIpICsgcG9zOworICAgICAgICBpZiAoZW5kUG9zID4gcG9zKSB7CisgICAgICAgICAgICBmb3VuZE5hbWVzLmVtcGxhY2VfYmFjayh2YWx1ZSArIHBvcywgZW5kUG9zIC0gcG9zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVbZW5kUG9zXSAmJiB2YWx1ZVtlbmRQb3NdICE9ICcsJykgeworICAgICAgICAgICAgZW5kUG9zICs9IHN0cmNzcG4odmFsdWUgKyBlbmRQb3MsICIsIik7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gc3Ryc3BuKHZhbHVlICsgZW5kUG9zLCAiICwiKSArIGVuZFBvczsKKyAgICB9IHdoaWxlIChwb3MgPCBsZW4pOworICAgIHJldHVybiBmb3VuZE5hbWVzOworfQorCisvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKy8vc3RhdGljCitDMlBhcmFtICpDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICBpZiAoc2l6ZSA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYmxvYjsKKyAgICBpZiAocGFyYW0tPnNpemUoKSA+IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwYXJhbTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggOWZjNWE3Ni4uOWQxODNkNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCkBAIC0xOSw0OCArMTksNDUgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHB1YmxpYzoKICAgICBBQUNTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ2NF90PiAmb2Zmc2V0X3ZlY3RvciwKICAgICAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDU291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOwogICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOwogICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKQEAgLTkyLDcgKzg5LDcgQEAKIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgQUFDIGZyYW1lIHNpemUgd2l0aCB0aGUgQURUUyBoZWFkZXIgbGVuZ3RoIChyZWdhcmRsZXNzIG9mCiAvLyAgICAgdGhlIHByZXNlbmNlIG9mIHRoZSBDUkMpLgogLy8gSWYgaGVhZGVyU2l6ZSBpcyBub24tTlVMTCwgaXQgd2lsbCBiZSB1c2VkIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIG9mIHRoaXMgQURUUyBmcmFtZS4KLXN0YXRpYyBzaXplX3QgZ2V0QWR0c0ZyYW1lTGVuZ3RoKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QqIGhlYWRlclNpemUpIHsKK3N0YXRpYyBzaXplX3QgZ2V0QWR0c0ZyYW1lTGVuZ3RoKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgewogCiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoTm9DcmMgPSA3OwogICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aFdpdGhDcmMgPSA5OwpAQCAtMTMzLDcgKzEzMCw3IEBACiB9CiAKIEFBQ0V4dHJhY3Rvcjo6QUFDRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUZyYW1lRHVyYXRpb25VcygwKSB7CkBAIC0xNTEsNyArMTQ4LDkgQEAKICAgICB9CiAgICAgY2hhbm5lbCA9IChoZWFkZXJbMF0gJiAweDEpIDw8IDIgfCAoaGVhZGVyWzFdID4+IDYpOwogCisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKG1NZXRhLCBwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCBwcm9maWxlICsgMSk7CiAKICAgICBvZmY2NF90IHN0cmVhbVNpemUsIG51bUZyYW1lcyA9IDA7CiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CkBAIC0xNzQsMjkgKzE3MywzMCBAQAogICAgICAgICAvLyBSb3VuZCB1cCBhbmQgZ2V0IHRoZSBkdXJhdGlvbgogICAgICAgICBtRnJhbWVEdXJhdGlvblVzID0gKDEwMjQgKiAxMDAwMDAwbGwgKyAoc3IgLSAxKSkgLyBzcjsKICAgICAgICAgZHVyYXRpb24gPSBudW1GcmFtZXMgKiBtRnJhbWVEdXJhdGlvblVzOwotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbik7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwogfQogCiBBQUNFeHRyYWN0b3I6On5BQUNFeHRyYWN0b3IoKSB7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgQUFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqQUFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIwNCwxMyArMjA0LDEyIEBACiAgICAgcmV0dXJuIG5ldyBBQUNTb3VyY2UobURhdGFTb3VyY2UsIG1NZXRhLCBtT2Zmc2V0VmVjdG9yLCBtRnJhbWVEdXJhdGlvblVzKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworbWVkaWFfc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yMTksOCArMjE4LDggQEAKIGNvbnN0IHNpemVfdCBBQUNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSA4MTkyOwogCiBBQUNTb3VyY2U6OkFBQ1NvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ2NF90PiAmb2Zmc2V0X3ZlY3RvciwKICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cykKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCkBAIC0yMjgsNyArMjI3LDYgQEAKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1PZmZzZXRWZWN0b3Iob2Zmc2V0X3ZlY3RvciksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKGZyYW1lX2R1cmF0aW9uX3VzKSB7CiB9CkBAIC0yMzksNyArMjM3LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KCkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBpZiAobU9mZnNldFZlY3Rvci5lbXB0eSgpKSB7CkBAIC0yNDksMzAgKzI0NywyNSBAQAogICAgIH0KIAogICAgIG1DdXJyZW50VGltZVVzID0gMDsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpzdG9wKCkgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yODIsNyArMjc1LDcgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIG1GcmFtZUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAoc2Vla0ZyYW1lIDwgMCB8fCBzZWVrRnJhbWUgPj0gKGludDY0X3QpbU9mZnNldFZlY3Rvci5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwMjM5NTA3Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogbUZyYW1lRHVyYXRpb25VczsKIApAQCAtMjkyLDEzICsyODUsMTMgQEAKIAogICAgIHNpemVfdCBmcmFtZVNpemUsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIsIGhlYWRlclNpemU7CiAgICAgaWYgKChmcmFtZVNpemUgPSBnZXRBZHRzRnJhbWVMZW5ndGgobURhdGFTb3VyY2UsIG1PZmZzZXQsICZoZWFkZXJTaXplKSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIgPSBmcmFtZVNpemUgLSBoZWFkZXJTaXplOwpAQCAtMzA3LDM3ICszMDAsMzkgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKICAgICBtQ3VycmVudFRpbWVVcyArPSBtRnJhbWVEdXJhdGlvblVzOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKm1ldGEpIHsKICAgICBvZmY2NF90IG9mZnNldCA9ICpzdGF0aWNfY2FzdDxvZmY2NF90Kj4obWV0YSk7Ci0gICAgcmV0dXJuIG5ldyBBQUNFeHRyYWN0b3Ioc291cmNlLCBvZmZzZXQpOworICAgIHJldHVybiB3cmFwKG5ldyBBQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgb2Zmc2V0KSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CiAgICAgb2ZmNjRfdCBwb3MgPSAwOwogCisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHVpbnQ4X3QgaWQzaGVhZGVyWzEwXTsKLSAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKKyAgICAgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQogICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGlkM2hlYWRlcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0zNjQsNyArMzU5LDcgQEAKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzJdOwogCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgJmhlYWRlciwgMikgIT0gMikgeworICAgIGlmIChoZWxwZXIucmVhZEF0KHBvcywgJmhlYWRlciwgMikgIT0gMikgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTM4MywxNyArMzc4LDIxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImFhYyIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiNGZkODBlYWUtMDNkMi00ZDcyLTllYjktNDhmYTZiYjU0NjEzIiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIkFBQyBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCmluZGV4IDlkYWRiZWQuLjY0M2QzZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCkBAIC0xOCw4ICsxOCw5IEBACiAKICNkZWZpbmUgQUFDX0VYVFJBQ1RPUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCkBAIC0yOCwyMyArMjksMjMgQEAKIHN0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIFN0cmluZzg7CiAKLWNsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIEFBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CisgICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFBQ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFBQ0V4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOwpAQCAtNTUsNyArNTYsNyBAQAogfTsKIAogYm9vbCBTbmlmZkFBQygKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgb2ZmNjRfdCAqb2Zmc2V0KTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKaW5kZXggN2M1NmM5Ny4uYTU4MTY3YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAppbmRleCBiZWE2ZjFkLi5mZmVmZjQyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIkFNUkV4dHJhY3Rvci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zMSwyOSArMjksMjkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgQU1SU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIGJvb2wgaXNXaWRlLAogICAgICAgICAgICAgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgYm9vbCBtSXNXaWRlOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwpAQCAtOTgsMjcgKzk2LDI3IEBACiAgICAgcmV0dXJuIGZyYW1lU2l6ZTsKIH0KIAotc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1dpZGUsIHNpemVfdCAqZnJhbWVTaXplKSB7CiAgICAgdWludDhfdCBoZWFkZXI7CiAgICAgc3NpemVfdCBjb3VudCA9IHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgMSk7CiAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKIAogICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CiAgICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXRpYyBib29sIFNuaWZmQU1SKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCAqaXNXaWRlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGNoYXIgaGVhZGVyWzldOwogCiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7CkBAIC0xNDQsNyArMTQyLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUFNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitBTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCgwKSB7CkBAIC0xNTMsMTIgKzE1MSwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbU1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDEpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKIAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OwogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZTsKQEAgLTE2NiwxMSArMTY0LDExIEBACiAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CiAKICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnN0cmVhbVNpemUpID09IE9LKSB7Ci0gICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgewotICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KHNvdXJjZSwgb2Zmc2V0LCBtSXNXaWRlLCAmZnJhbWVTaXplKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KHNvdXJjZSwgb2Zmc2V0LCBtSXNXaWRlLCAmZnJhbWVTaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTE4NSwzMCArMTgzLDMzIEBACiAgICAgICAgICAgICBudW1GcmFtZXMgKys7CiAgICAgICAgIH0KIAotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbik7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwogfQogCiBBTVJFeHRyYWN0b3I6On5BTVJFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogfQogCi1zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/ICJhdWRpby9hbXItd2IiIDogImF1ZGlvL2FtciIpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCIDogImF1ZGlvL2FtciIpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqQU1SRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxNywxOSArMjE4LDE4IEBACiAgICAgICAgICAgICBtT2Zmc2V0VGFibGUsIG1PZmZzZXRUYWJsZUxlbmd0aCk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBBTVJTb3VyY2U6OkFNUlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc1dpZGUsIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCkBAIC0yNTAsMzUgKzI1MCwzMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSgxMjgpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoMTI4KTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yOTYsNyArMjkxLDcgQEAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzA5LDcgKzMwNCw3IEBACiAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKIAogICAgIGlmIChuIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGlmIChoZWFkZXIgJiAweDgzKSB7CkBAIC0zMTcsMjAgKzMxMiwyMCBAQAogCiAgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKIAotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCBGVCk7CiAgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBmcmFtZVNpemUpOwpAQCAtMzQwLDUwICszMzUsNjMgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBvbmx5IHBhcnRpYWwgZnJhbWUgaXMgYXZhaWxhYmxlLCB0cmVhdCBpdCBhcyBFT1MuCiAgICAgICAgICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZSk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImFtciIsCisgICAgImF3YiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYzg2NjM5YzktMmYzMS00MGFjLWE3MTUtZmEwMWI0NDkzYWFmIiksCiAgICAgICAgIDEsCiAgICAgICAgICJBTVIgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZkFNUihzb3VyY2UsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBTVJFeHRyYWN0b3Ioc291cmNlKTt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkFNUigmaGVscGVyLCBudWxscHRyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEFNUkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICB9LAorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKaW5kZXggYzkwYjMyNS4uYjc2ZWU5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKQEAgLTE5LDggKzE5LDkgQEAKICNkZWZpbmUgQU1SX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCwyMyArMjksMjMgQEAKIGNsYXNzIFN0cmluZzg7CiAjZGVmaW5lIE9GRlNFVF9UQUJMRV9MRU4gICAgMzAwCiAKLWNsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IEFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBTVJFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1Jc1dpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IGIyZmI4ODAuLjRiZDkzM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA0MjQyZDc2Li4zYTNkMDUxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtOCwxMyArOCwxNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJGTEFDIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAppbmRleCBjY2Y4MGQwLi44ODU0NjMxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCkBAIC0yNCw0MSArMjQsNTYgQEAKIC8vIGxpYkZMQUMgcGFyc2VyCiAjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZGVjb2Rlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4gLy8gZm9yIEFJQmluZGVyX2dldENhbGxpbmdVaWQKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4gLy8gZm9yIEFJRF9NRURJQQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE1lZGlhU2VydmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgZmxvYXQgZXh0cmFjdG9yIG91dHB1dCwgYnV0IGdlbmVyYWwgcHJvY2Vzc2VzCisvLyBtYXkgbm90IGJlIGFibGUgdG8gZG8gc28uCisvLyBUT0RPOiBJbXByb3ZlIEFQSSB0byBzZXQgZXh0cmFjdG9yIGZsb2F0IG91dHB1dC4KKy8vIChOb3RlOiBkdXBsaWNhdGVkIHdpdGggV0FWRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGNsYXNzIEZMQUNQYXJzZXI7CiAKLWNsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogCiBwdWJsaWM6CiAgICAgRkxBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GTEFDU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OwogICAgIEZMQUNQYXJzZXIgKm1QYXJzZXI7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CkBAIC03NSwxNCArOTAsMTUgQEAKIAogcHVibGljOgogICAgIGVudW0gewotICAgICAgICBrTWF4Q2hhbm5lbHMgPSA4LAorICAgICAgICBrTWF4Q2hhbm5lbHMgPSBGQ0NfOCwKICAgICB9OwogCiAgICAgZXhwbGljaXQgRkxBQ1BhcnNlcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgIC8vIElmIG1ldGFkYXRhIHBvaW50ZXJzIGFyZW4ndCBwcm92aWRlZCwgd2UgZG9uJ3QgZmlsbCB0aGVtCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhID0gMCwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhID0gMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhID0gMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhID0gMCk7CiAKICAgICB2aXJ0dWFsIH5GTEFDUGFyc2VyKCk7CiAKQEAgLTEwOCwyNCArMTI0LDI1IEBACiAgICAgfQogCiAgICAgLy8gbWVkaWEgYnVmZmVycwotICAgIHZvaWQgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApOwogICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcnMoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoKSB7CiAgICAgICAgIHJldHVybiByZWFkQnVmZmVyKGZhbHNlLCAwTEwpOwogICAgIH0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgeworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIodHJ1ZSwgc2FtcGxlKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSAqbUZpbGVNZXRhZGF0YTsKLSAgICBNZXRhRGF0YUJhc2UgKm1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKIAogICAgIC8vIG1lZGlhIGJ1ZmZlcnMKICAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1Hcm91cDsKICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwogCiAgICAgLy8gaGFuZGxlIHRvIHVuZGVybHlpbmcgbGliRkxBQyBwYXJzZXIKQEAgLTE0OSw3ICsxNjYsNyBAQAogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSk7CiAKICAgICAvLyBubyBjb3B5IGNvbnN0cnVjdG9yIG9yIGFzc2lnbm1lbnQKICAgICBGTEFDUGFyc2VyKGNvbnN0IEZMQUNQYXJzZXIgJik7CkBAIC0xNjksNiArMTg2LDcgQEAKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSk7CiAgICAgdm9pZCBtZXRhZGF0YUNhbGxiYWNrKGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSk7CiAgICAgdm9pZCBlcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpOworICAgIHNpemVfdCBnZXRPdXRwdXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbU91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsgfQogCiAgICAgLy8gRkxBQyBwYXJzZXIgY2FsbGJhY2tzIGFzIEMtY2FsbGFibGUgZnVuY3Rpb25zCiAgICAgc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRfY2FsbGJhY2soCkBAIC0zNjQsOSArMzgyLDggQEAKICAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKICAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewogICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCi0gICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICAgICAgICBwLT5kYXRhLCBwLT5kYXRhX2xlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTM4MSwxMjIgKzM5OCw2MSBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4KIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IDg7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IGludCBsZWZ0U2hpZnQgPSAxNiAtIChpbnQpYml0c1BlclNhbXBsZTsgLy8gY2FzdCB0byBpbnQgdG8gcHJldmVudCB1bnNpZ25lZCBvdmVyZmxvdy4KKyAgICBpZiAobGVmdFNoaWZ0ID49IDApIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgcmlnaHRTaGlmdCA9IC1sZWZ0U2hpZnQ7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gcmlnaHRTaGlmdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU1vbm8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgdW5zaWduZWQgbGVmdFNoaWZ0ID0gMzIgLSBiaXRzUGVyU2FtcGxlOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldOworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLS8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMjQoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCi0gICAgICAgIGludDE2X3QgKiAvKiBkc3QgKi8sCi0gICAgICAgIGNvbnN0IGludCAqW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10gLyogc3JjICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgVFJFU1BBU1MoKTsKLX0KLQogLy8gRkxBQ1BhcnNlcgogCiBGTEFDUGFyc2VyOjpGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCiAgICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCiAgICAgICBtRGVjb2RlcihOVUxMKSwKICAgICAgIG1DdXJyZW50UG9zKDBMTCksCiAgICAgICBtRU9GKGZhbHNlKSwKQEAgLTU2Nyw4ICs1MjMsMTAgQEAKICAgICAgICAgY2FzZSA4OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDMyOiAvLyBnZW5lcmFsbHkgbm90IGV4cGVjdGVkIGZvciBGTEFDCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE5vdGU6IGludGVybmFsbHkgdGhlIEZMQUMgZXh0cmFjdG9yIHN1cHBvcnRzIDItMzIgYml0cy4KICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBiaXRzIHBlciBzYW1wbGUgJXUiLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTU4NSw3MSArNTQzLDUzIEBACiAgICAgICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIGNhc2UgODgyMDA6CiAgICAgICAgIGNhc2UgOTYwMDA6CisgICAgICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm90ZTogaW50ZXJuYWxseSB3ZSBzdXBwb3J0IGFyYml0cmFyeSBzYW1wbGUgcmF0ZXMgZnJvbSA4a0h6IHRvIDE5MmtIei4KICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAldSIsIGdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQotICAgICAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0gICAgICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgICAgIHsgMSwgIDgsIGNvcHlNb25vOCAgICB9LAotICAgICAgICAgICAgeyAyLCAgOCwgY29weVN0ZXJlbzggIH0sCi0gICAgICAgICAgICB7IDgsICA4LCBjb3B5TXVsdGlDaDggIH0sCi0gICAgICAgICAgICB7IDEsIDE2LCBjb3B5TW9ubzE2ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMTYsIGNvcHlTdGVyZW8xNiB9LAotICAgICAgICAgICAgeyA4LCAxNiwgY29weU11bHRpQ2gxNiB9LAotICAgICAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgIH0sCi0gICAgICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgfSwKLSAgICAgICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICAgICAgfTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZih0YWJsZSkvc2l6ZW9mKHRhYmxlWzBdKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAodGFibGVbaV0ubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgdGFibGVbaV0ubUJpdHNQZXJTYW1wbGUgPT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvcHkgPSB0YWJsZVtpXS5tQ29weTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICAvLyBwb3B1bGF0ZSB0cmFjayBtZXRhZGF0YQogICAgICAgICBpZiAobVRyYWNrTWV0YWRhdGEgIT0gMCkgewotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGdldENoYW5uZWxzKCkpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBnZXRTYW1wbGVSYXRlKCkpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwogICAgICAgICAgICAgLy8gc2FtcGxlIHJhdGUgaXMgbm9uLXplcm8sIHNvIGRpdmlzaW9uIGJ5IHplcm8gbm90IHBvc3NpYmxlCi0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKGdldFRvdGFsU2FtcGxlcygpICogMTAwMDAwMExMKSAvIGdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgibWlzc2luZyBTVFJFQU1JTkZPIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFkYXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBGTEFDUGFyc2VyOjphbGxvY2F0ZUJ1ZmZlcnMoKQordm9pZCBGTEFDUGFyc2VyOjphbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApCiB7CiAgICAgQ0hFQ0sobUdyb3VwID09IE5VTEwpOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1NYXhCdWZmZXJTaXplID0gZ2V0TWF4QmxvY2tTaXplKCkgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShtTWF4QnVmZmVyU2l6ZSkpOworICAgIG1Hcm91cCA9IGdyb3VwOworICAgIG1NYXhCdWZmZXJTaXplID0gZ2V0TWF4QmxvY2tTaXplKCkgKiBnZXRDaGFubmVscygpICogZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbU1heEJ1ZmZlclNpemUpOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtTWF4QnVmZmVyU2l6ZSk7CiB9CiAKIHZvaWQgRkxBQ1BhcnNlcjo6cmVsZWFzZUJ1ZmZlcnMoKQogewotICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKK01lZGlhQnVmZmVySGVscGVyICpGTEFDUGFyc2VyOjpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKQogewogICAgIG1Xcml0ZVJlcXVlc3RlZCA9IHRydWU7CiAgICAgbVdyaXRlQ29tcGxldGVkID0gZmFsc2U7CkBAIC02ODYsNDEgKzYyNiw1MyBAQAogICAgIH0KICAgICAvLyBhY3F1aXJlIGEgbWVkaWEgYnVmZmVyCiAgICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpOwogICAgIENIRUNLKGJ1ZmZlclNpemUgPD0gbU1heEJ1ZmZlclNpemUpOwotICAgIGludDE2X3QgKmRhdGEgPSAoaW50MTZfdCAqKSBidWZmZXItPmRhdGEoKTsKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBidWZmZXJTaXplKTsKICAgICAvLyBjb3B5IFBDTSBmcm9tIEZMQUMgd3JpdGUgYnVmZmVyIHRvIG91ciBtZWRpYSBidWZmZXIsIHdpdGggaW50ZXJsZWF2aW5nCi0gICAgKCptQ29weSkoZGF0YSwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworICAgIGNvbnN0IHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPSBnZXRCaXRzUGVyU2FtcGxlKCk7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICBjb3B5VG9GbG9hdChyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0KICAgICAvLyBmaWxsIGluIGJ1ZmZlciBtZXRhZGF0YQogICAgIENIRUNLKG1Xcml0ZUhlYWRlci5udW1iZXJfdHlwZSA9PSBGTEFDX19GUkFNRV9OVU1CRVJfVFlQRV9TQU1QTEVfTlVNQkVSKTsKICAgICBGTEFDX191aW50NjQgc2FtcGxlTnVtYmVyID0gbVdyaXRlSGVhZGVyLm51bWJlci5zYW1wbGVfbnVtYmVyOwogICAgIGludDY0X3QgdGltZVVzID0gKDEwMDAwMDBMTCAqIHNhbXBsZU51bWJlcikgLyBnZXRTYW1wbGVSYXRlKCk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgIHJldHVybiBidWZmZXI7CiB9CiAKIC8vIEZMQUNzb3VyY2UKIAogRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhLAorICAgICAgICBib29sIG91dHB1dEZsb2F0KQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKLSAgICAgIG1QYXJzZXIoMCksCi0gICAgICBtSW5pdENoZWNrKGZhbHNlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCisgICAgICBtUGFyc2VyKG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBvdXRwdXRGbG9hdCwgMCwgbVRyYWNrTWV0YWRhdGEpKSwKKyAgICAgIG1Jbml0Q2hlY2sobVBhcnNlci0+aW5pdENoZWNrKCkpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OkZMQUNTb3VyY2UiKTsKLSAgICAvLyByZS11c2UgdGhlIHNhbWUgdHJhY2sgbWV0YWRhdGEgcGFzc2VkIGludG8gY29uc3RydWN0b3IgZnJvbSBGTEFDRXh0cmFjdG9yCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlKTsKLSAgICBtSW5pdENoZWNrICA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCiBGTEFDU291cmNlOjp+RkxBQ1NvdXJjZSgpCkBAIC03MzIsMTggKzY4NCwxOCBAQAogICAgIGRlbGV0ZSBtUGFyc2VyOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOworICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0b3AoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdG9wIik7CiAKQEAgLTc1MSwxOSArNzAzLDIzIEBACiAgICAgbVBhcnNlci0+cmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtNzg0LDIwICs3NDAsMjIgQEAKICAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcigpOwogICAgIH0KICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIC8vIEZMQUNFeHRyYWN0b3IKIAogRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1QYXJzZXIobnVsbHB0ciksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgLy8gRkxBQ1BhcnNlciB3aWxsIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB1cwotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIGZhbHNlIC8qIG91dHB1dEZsb2F0ICovLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCkBAIC04MDUsNiArNzYzLDkgQEAKIHsKICAgICBBTE9HVigifkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICBkZWxldGUgbVBhcnNlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKIH0KIAogc2l6ZV90IEZMQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTgxMiw0MiArNzczLDc2IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQorTWVkaWFUcmFja0hlbHBlciAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQogewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSk7CisKKyAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UoCisgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEsIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkpOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKIHsKLSAgICAvLyBmaXJzdCA0IGlzIHRoZSBzaWduYXR1cmUgd29yZAotICAgIC8vIHNlY29uZCA0IGlzIHRoZSBzaXplb2YgU1RSRUFNSU5GTwotICAgIC8vIDA0MiBpcyB0aGUgbWFuZGF0b3J5IFNUUkVBTUlORk8KLSAgICAvLyBubyBuZWVkIHRvIHJlYWQgcmVzdCBvZiB0aGUgaGVhZGVyLCBhcyBhIHByZW1hdHVyZSBFT0Ygd2lsbCBiZSBjYXVnaHQgbGF0ZXIKLSAgICB1aW50OF90IGhlYWRlcls0KzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKQotICAgICAgICAgICAgfHwgbWVtY21wKCJmTGFDXDBcMFwwXDA0MiIsIGhlYWRlciwgNCs0KSkKLSAgICB7CisgICAgLy8gU2tpcCBJRDMgdGFncworICAgIG9mZjY0X3QgcG9zID0gMDsKKyAgICB1aW50OF90IGhlYWRlclsxMF07CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBtb3JlIGZpbGUgdG8gcmVhZC4KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBJRDMgdGFnCisgICAgICAgIGlmIChtZW1jbXAoIklEMyIsIGhlYWRlciwgMykgIT0gMCkgeworICAgICAgICAgICAgYnJlYWs7IC8vIG5vdCBhbiBJRDMgdGFnLgorICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCB0aGUgSUQzdjIgZGF0YSBhbmQgY2hlY2sgYWdhaW4KKyAgICAgICAgY29uc3QgdW5zaWduZWQgaWQzTGVuID0gMTAgKworICAgICAgICAgICAgICAgICgoKGhlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgICAgICB8ICgoaGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICAgICAgIHwgKChoZWFkZXJbOF0gJiAweDdmKSA8PCA3KQorICAgICAgICAgICAgICAgICB8IChoZWFkZXJbOV0gJiAweDdmKSk7CisgICAgICAgIHBvcyArPSBpZDNMZW47CisKKyAgICAgICAgQUxPR1YoInNraXBwZWQgSUQzIHRhZyBvZiBsZW4gJXUgbmV3IHN0YXJ0aW5nIG9mZnNldCBpcyAlIzAxNmxseCIsCisgICAgICAgICAgICAgICAgaWQzTGVuLCAobG9uZyBsb25nKXBvcyk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgRkxBQyBoZWFkZXIuCisgICAgLy8gaHR0cHM6Ly94aXBoLm9yZy9mbGFjL2Zvcm1hdC5odG1sI3N0cmVhbQorICAgIC8vCisgICAgLy8gTm90ZTogY29udGVudCBzdG9yZWQgYmlnIGVuZGlhbi4KKyAgICAvLyBieXRlIG9mZnNldCAgYml0IHNpemUgIGNvbnRlbnQKKyAgICAvLyAwICAgICAgICAgICAgMzIgICAgICAgIGZMYUMKKyAgICAvLyA0ICAgICAgICAgICAgOCAgICAgICAgIG1ldGFkYXRhIHR5cGUgU1RSRUFNSU5GTyAoMCkgKG5vdGU6IE9SIHdpdGggMHg4MCBpZiBsYXN0IG1ldGFkYXRhKQorICAgIC8vIDUgICAgICAgICAgICAyNCAgICAgICAgc2l6ZSBvZiBtZXRhZGF0YSwgZm9yIFNUUkVBTUlORk8gKDB4MjIpLgorCisgICAgaWYgKG1lbWNtcCgiZkxhQ1x4MDBceDAwXHgwMFx4MjIiLCBoZWFkZXIsIDgpICE9IDAgJiYKKyAgICAgICAgbWVtY21wKCJmTGFDXHg4MFx4MDBceDAwXHgyMiIsIGhlYWRlciwgOCkgIT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC04NTYsMjkgKzg1MSw0MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJmbGFjIiwKKyAgICAiZmwiLAorICAgIE5VTEwKK307CiAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICAgICAgVVVJRCgiMTM2NGIwNDgtY2M0NS00ZmRhLTk5MzQtMzI3ZDBlYmY5ODI5IiksCiAgICAgICAgICAgICAxLAogICAgICAgICAgICAgIkZMQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgICAgIFtdKAotICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZMQUNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBGTEFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB9LAogICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAppbmRleCA3ZmI2ZWM2Li41YTczZDIwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKQEAgLTE4LDQ1ICsxOCw0NCBAQAogI2RlZmluZSBGTEFDX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiRkxBQ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBGTEFDRXh0cmFjdG9yKGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAgICAgRkxBQ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAKIH07CiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBGTEFDX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCA2ZTk4MTE0Li43ZDQyZTcwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCmluZGV4IGEzMGI2ZjguLjlmNGY5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTI0LDM1ICsyNCwzNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXJCYXNlCisvLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlcgogc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKIAotY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBNaWRpU291cmNlKAogICAgICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaVNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE1pZGlFbmdpbmUgJm1FbmdpbmU7Ci0gICAgTWV0YURhdGFCYXNlICZtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC02OSw3ICs2OCw3IEBACiAKIE1pZGlTb3VyY2U6Ok1pZGlTb3VyY2UoCiAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRW5naW5lKGVuZ2luZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLApAQCAtODcsMTcgKzg2LDE3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycygpOwotICAgIHJldHVybiBPSzsKKyAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0b3AiKTsKIApAQCAtMTA1LDIwICsxMDQsMTkgQEAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1FbmdpbmUucmVsZWFzZUJ1ZmZlcnMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtMTMxLDcgKzEyOSw3IEBACiAgICAgYnVmZmVyID0gbUVuZ2luZS5yZWFkQnVmZmVyKCk7CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCAlcCBkb25lIiwgdGhpcyk7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogc3RhdHVzX3QgTWlkaVNvdXJjZTo6aW5pdCgpCkBAIC0xNDIsMTAgKzE0MCw5IEBACiAKIC8vIE1pZGlFbmdpbmUKIAotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkgOgotICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAorTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkgOgogICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCiAgICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLAogICAgICAgICAgICAgbUVhc0NvbmZpZyhOVUxMKSwKQEAgLTE3MCwxNiArMTY3LDIwIEBACiAgICAgfQogCiAgICAgaWYgKGZpbGVNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKICAgICB9CiAKICAgICBpZiAodHJhY2tNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCiAgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKICAgICB9CiAgICAgbUlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogfQpAQCAtMTkxLDcgKzE5Miw2IEBACiAgICAgaWYgKG1FYXNEYXRhKSB7CiAgICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgfQotICAgIGRlbGV0ZSBtR3JvdXA7CiAgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CiB9CiAKQEAgLTE5OSwyMiArMTk5LDIwIEBACiAgICAgcmV0dXJuIG1Jc0luaXRpYWxpemVkID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKICAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOwogICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKIAotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwogICAgIGludCBidWZzaXplID0gc2l6ZW9mKEVBU19QQ00pCiAgICAgICAgICAgICAqIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9DT01CSU5FX0JVRkZFUlM7CiAgICAgQUxPR1YoInVzaW5nICVkIGJ5dGUgYnVmZmVyIiwgYnVmc2l6ZSk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGJ1ZnNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoYnVmc2l6ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNaWRpRW5naW5lOjpyZWxlYXNlQnVmZmVycygpIHsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjQsMTMgKzIyMiwxMyBAQAogICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKK01lZGlhQnVmZmVySGVscGVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgewogICAgIEVBU19TVEFURSBzdGF0ZTsKICAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7CiAgICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKQEAgLTIzOSw3ICsyMzcsOSBAQAogICAgIEVBU19JMzIgdGltZU1zOwogICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKICAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOwpAQCAtMjYzLDE4ICsyNjMsMjMgQEAKIC8vIE1pZGlFeHRyYWN0b3IKIAogTWlkaUV4dHJhY3Rvcjo6TWlkaUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIENEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKLSAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwogfQogCiBNaWRpRXh0cmFjdG9yOjp+TWlkaUV4dHJhY3RvcigpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgZHRvciIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CisgICAgZGVsZXRlIG1FbmdpbmU7CiB9CiAKIHNpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC0yODIsNyArMjg3LDcgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjkwLDI3ICsyOTUsMjUgQEAKICAgICByZXR1cm4gbmV3IE1pZGlTb3VyY2UoKm1FbmdpbmUsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEiKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewogICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOwogICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CkBAIC0zMjMsMjggKzMyNiw0NiBAQAogCiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImlteSIsCisgICAgIm1pZCIsCisgICAgIm1pZGkiLAorICAgICJteG1mIiwKKyAgICAib3RhIiwKKyAgICAicnR0dGwiLAorICAgICJydHgiLAorICAgICJzbWYiLAorICAgICJ4bWYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoImVmNmNjYTBhLWY4YTItNDNlNi1iYTVmLWRmY2Q3YzlhN2VmMiIpLAogICAgICAgICAxLAogICAgICAgICAiTUlESSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKaW5kZXggMjQ0ZGQwZi4uMmU3ODA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCkBAIC0xOCwxMSArMTgsMTIgQEAKICNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgogCkBAIC0zMCw0OCArMzEsNDggQEAKIAogY2xhc3MgTWlkaUVuZ2luZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKTsKKyAgICBleHBsaWNpdCBNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpOwogICAgIH5NaWRpRW5naW5lKCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycygpOworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UqIHJlYWRCdWZmZXIoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogcmVhZEJ1ZmZlcigpOwogcHJpdmF0ZToKICAgICBNaWRpSW9XcmFwcGVyICptSW9XcmFwcGVyOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptR3JvdXA7CiAgICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOwogICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKICAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOwogICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7CiB9OwogCi1jbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIENEYXRhU291cmNlICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBNaWRpRW5naW5lICptRW5naW5lOwogCkBAIC04OCw3ICs4OSw3IEBACiAKIH07CiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggZjdlZDBjOC4uMTc0NGQzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0xMSw3ICsxMSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCBkNjU3NTgyLi40MjAwYTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0yMywxNyArMjMsMTQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0cmFjdG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKQEAgLTQ0LDcgKzQxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyIDogcHVibGljIG1rdnBhcnNlcjo6SU1rdlJlYWRlciB7Ci0gICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBEYXRhU291cmNlQmFzZVJlYWRlcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogbVNvdXJjZShzb3VyY2UpIHsKICAgICB9CiAKQEAgLTY4LDggKzY1LDEyIEBACiAgICAgdmlydHVhbCBpbnQgTGVuZ3RoKGxvbmcgbG9uZyogdG90YWwsIGxvbmcgbG9uZyogYXZhaWxhYmxlKSB7CiAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAqdG90YWwgPSAtMTsKLSAgICAgICAgICAgICphdmFpbGFibGUgPSAobG9uZyBsb25nKSgoMXVsbCA8PCA2MykgLSAxKTsKKyAgICAgICAgICAgIGlmICh0b3RhbCkgeworICAgICAgICAgICAgICAgICp0b3RhbCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgICphdmFpbGFibGUgPSAobG9uZyBsb25nKSgoMXVsbCA8PCA2MykgLSAxKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTg2LDcgKzg3LDcgQEAKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKIAogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyKGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CkBAIC0xMjQsMTYgKzEyNSwxNiBAQAogICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogfTsKIAotc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1hdHJvc2thU291cmNlKCk7CkBAIC0xNTMsMTIgKzE1NCwxMiBAQAogICAgIEJsb2NrSXRlcmF0b3IgbUJsb2NrSXRlcjsKICAgICBzc2l6ZV90IG1OQUxTaXplTGVuOyAgLy8gZm9yIHR5cGUgQVZDIG9yIEhFVkMKIAotICAgIExpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1QZW5kaW5nRnJhbWVzOworICAgIExpc3Q8TWVkaWFCdWZmZXJIZWxwZXIgKj4gbVBlbmRpbmdGcmFtZXM7CiAKICAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7Ci0gICAgc3RhdHVzX3QgcmVhZEJsb2NrKCk7CisgICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1Zik7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZEJsb2NrKCk7CiAgICAgdm9pZCBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAogICAgIE1hdHJvc2thU291cmNlKGNvbnN0IE1hdHJvc2thU291cmNlICYpOwpAQCAtMjIyLDQzICsyMjMsMzEgQEAKICAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKICAgICAgICAgICAgICAgICAgaW5kZXgpLAogICAgICAgbU5BTFNpemVMZW4oLTEpIHsKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhOworICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8gJnRyYWNrSW5mbyA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gdHJhY2tJbmZvLm1NZXRhOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KTsKIAogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIG1UeXBlID0gQVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICphdmNjOwotICAgICAgICBzaXplX3QgYXZjY1NpemU7Ci0gICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IDA7Ci0gICAgICAgIGlmIChtZXRhLmZpbmRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgJm5hbFNpemVMZW4pKSB7Ci0gICAgICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgewotICAgICAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZhdmNjLCAmYXZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgYXZjY1NpemUgPj0gNXUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlemQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEFWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewogICAgICAgICBtVHlwZSA9IEhFVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmh2Y2M7Ci0gICAgICAgIHNpemVfdCBodmNjU2l6ZTsKLSAgICAgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmh2Y2MsICZodmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBodmNjU2l6ZSA+PSAyMnUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChodmNjWzE0KzddICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlenUiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEhFVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBtVHlwZSA9IEFBQzsKQEAgLTI2OSwyNSArMjU4LDI2IEBACiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVR5cGUgPT0gQVZDICYmIG1OQUxTaXplTGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKKyAgICAvLyBhbGxvY2F0ZSBvbmUgc21hbGwgaW5pdGlhbCBidWZmZXIsIGJ1dCBsZWF2ZSBwbGVudHkgb2Ygcm9vbSB0byBncm93CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgKi8sIDEwMjQgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIGdyb3d0aCBsaW1pdCAqLyk7CiAgICAgbUJsb2NrSXRlci5yZXNldCgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01NzksNyArNTY5LDcgQEAKIAogdm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgewogICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwpAQCAtNTg3LDcgKzU3Nyw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKSB7CiAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMSB8fCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEgPiBJTlQzMl9NQVgpIHsKICAgICAgICAgLy8gMS1ieXRlIHNpZ25hbAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjAxLDE3ICs1OTEsMTcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKICAgICBpZiAoZW5jcnlwdGVkKSB7CiAgICAgICAgIHVpbnQ4X3QgY3RyQ291bnRlclsxNl0gPSB7IDAgfTsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5SWQ7CiAgICAgICAgIHNpemVfdCBrZXlJZFNpemU7Ci0gICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgICAgICBDSEVDSyh0cmFja01ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsIChjb25zdCB2b2lkICoqKSZrZXlJZCwgJmtleUlkU2l6ZSkpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAorICAgICAgICAgICAgICAgICh2b2lkKiopJmtleUlkLCAma2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGtleUlkLCBrZXlJZFNpemUpOwogICAgICAgICBtZW1jcHkoY3RyQ291bnRlciwgZGF0YSArIDEsIDgpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBjdHJDb3VudGVyLCAxNik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGN0ckNvdW50ZXIsIDE2KTsKICAgICAgICAgaWYgKHBhcnRpdGlvbmVkKSB7CiAgICAgICAgICAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQpAQCAtNjY0LDggKzY1NCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mUGxhaW5TaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBwbGFpblNpemVzLnNpemUoKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZkVuY3J5cHRlZFNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIGVuY3J5cHRlZFNpemVzLnNpemUoKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcy5kYXRhKCksIHNpemVvZlBsYWluU2l6ZXMpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoZnJhbWVPZmZzZXQsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gZnJhbWVPZmZzZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKQEAgLTY4NSw4ICs2NzcsMTAgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoOSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC03MDMsMTkgKzY5NywyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDEsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKICAgICBDSEVDSyhtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKTsKIAogICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CkBAIC03MjcsMTggKzcyMywyMSBAQAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoaSk7CiAgICAgICAgIHNpemVfdCBsZW4gPSBmcmFtZS5sZW47CiAgICAgICAgIGlmIChTSVpFX01BWCAtIGxlbiA8IHRyYWNrSW5mby0+bUhlYWRlckxlbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1idWY7CisgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1idWYsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBsZW4gLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMCwgbGVuKTsKICAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKICAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgewogICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGJsb2NrLT5Jc0tleSgpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICBpZiAoZXJyID09IE9LCkBAIC03NTIsNyArNzUxLDcgQEAKIAogICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwpAQCAtNzYwLDExICs3NTksMTEgQEAKIAogICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xbGw7CkBAIC03NzMsNyArNzcyLDcgQEAKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUV4dHJhY3Rvci0+aXNMaXZlU3RyZWFtaW5nKCkpIHsKQEAgLTc5MSw3ICs3OTAsNyBAQAogICAgIH0KIAogICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKQEAgLTgwMCwxOCArNzk5LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKICAgICBpZiAoKG1UeXBlICE9IEFWQyAmJiBtVHlwZSAhPSBIRVZDKSB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7CiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgICpvdXQgPSBmcmFtZTsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogCiAgICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50CkBAIC04MjksNyArODI4LDcgQEAKICAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIHNpemVfdCBkc3RTaXplID0gMDsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgdWludDhfdCAqZHN0UHRyID0gTlVMTDsKIAogICAgIGZvciAoaW50MzJfdCBwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgewpAQCAtODUwLDcgKzg0OSw3IEBACiAgICAgICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPiBzcmNTaXplKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NzgsNyArODc3LDcgQEAKICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwYXNzID09IDApIHsKQEAgLTg4OSwxNiArODg4LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gZWFjaCA0LWJ5dGUgbmFsIHNpemUgd2l0aCBhIDQtYnl0ZSBzdGFydCBjb2RlCiAgICAgICAgICAgICAgICAgYnVmZmVyID0gZnJhbWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGRzdFNpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgZHN0U2l6ZSAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0U2l6ZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqZnJhbWVNZXRhID0gZnJhbWUtPm1ldGFfZGF0YSgpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZnJhbWVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lVXMpKTsKICAgICAgICAgICAgIGludDMyX3QgaXNTeW5jOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgJmlzU3luYykpOwogCi0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zk1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGlzU3luYyk7CiAKICAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIH0KQEAgLTkxMCwxOCArOTEzLDE4IEBACiAgICAgfQogCiAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1ZmZlci0+bWV0YV9kYXRhKCksCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICB9CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlQmFzZVJlYWRlcihtRGF0YVNvdXJjZSkpLAogICAgICAgbVNlZ21lbnQoTlVMTCksCkBAIC05OTQsMTMgKzk5NywxNSBAQAogCiAgICAgZGVsZXRlIG1SZWFkZXI7CiAgICAgbVJlYWRlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwMDgsMTEgKzEwMTMsMTEgQEAKICAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzCkBAIC0xMDIxLDggKzEwMjYsNyBAQAogICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YSk7CiB9CiAKIGJvb2wgTWF0cm9za2FFeHRyYWN0b3I6OmlzTGl2ZVN0cmVhbWluZygpIGNvbnN0IHsKQEAgLTEwNTcsNyArMTA2MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKIAogICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOwpAQCAtMTA4NSwxNCArMTA4OSwxNCBAQAogICAgIHN0b3JlU2l6ZShlc2RzLCBpZHgsIHByaXZTaXplKTsKICAgICBtZW1jcHkoZXNkcyArIGlkeCwgcHJpdiwgcHJpdlNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLCBlc2RzU2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBwcml2LCBwcml2U2l6ZSk7CiAKICAgICBkZWxldGVbXSBlc2RzOwogICAgIGVzZHMgPSBOVUxMOwogfQogCiBzdGF0dXNfdCBhZGRWb3JiaXNDb2RlY0luZm8oCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgewogICAgIC8vIGhleGR1bXAoX2NvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKQEAgLTExNTAsNyArMTE1NCw4IEBACiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbWV0YS5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOwogCiAgICAgb2Zmc2V0ICs9IGxlbjE7CiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDMpIHsKQEAgLTExNjIsMTkgKzExNjcsMjAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwKKyAgICAgICAgICAgICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBhZGRGbGFjTWV0YWRhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpjb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlGbGFjTWV0YWRhdGEsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgLy8gZm9ybWVybHkga0tleUZsYWNNZXRhZGF0YQorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplID0gNjQgPDwgMTA7CiAgICAgRkxBQ0RlY29kZXIgKmZsYWNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOwpAQCAtMTE5Niw3ICsxMjAyLDcgQEAKICAgICAgICAgICAgICAgICAqIHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIHN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhJbnB1dFNpemUpOwogCiAgICAgZGVsZXRlIGZsYWNEZWNvZGVyOwogICAgIHJldHVybiBPSzsKQEAgLTEyMjUsNyArMTIzMSw3IEBACiAgICAgfQogCiAgICAgLy8gT3ZlcnJpZGUgdGhlIHN5bnRoZXNpemVkIG5hbCBsZW5ndGggc2l6ZSwgd2hpY2ggaXMgYXJiaXRyYXJ5Ci0gICAgdHJhY2tJbmZvLT5tTWV0YS5zZXRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgMCk7CisgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IDA7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMjQ3LDcgKzEyNTMsNyBAQAogfQogCiB2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpnZXRDb2xvckluZm9ybWF0aW9uKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbG91ciAqY29sb3IgPSB2dHJhY2stPkdldENvbG91cigpOwogICAgIGlmIChjb2xvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTEyNTYsNyArMTI2Miw3IEBACiAgICAgLy8gQ29sb3IgQXNwZWN0cwogICAgIHsKICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBpbnQzMl90IGlzb3RyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCiAgICAgICAgIGludDMyX3QgY29lZmZzID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCiAgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7IC8vIGRlZmF1bHQKICAgICAgICAgYm9vbCByYW5nZVNwZWNpZmllZCA9IGZhbHNlOwpAQCAtMTI2NSw3ICsxMjcxLDcgQEAKICAgICAgICAgICAgIHByaW1hcmllcyA9IGNvbG9yLT5wcmltYXJpZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpKSB7Ci0gICAgICAgICAgICB0cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICBpc290cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzKSkgewogICAgICAgICAgICAgY29lZmZzID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7CkBAIC0xMjc4LDE0ICsxMjg0LDIxIEBACiAgICAgICAgICAgICByYW5nZVNwZWNpZmllZCA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAga0tleUNvbG9yUmFuZ2UsIHJhbmdlU3BlY2lmaWVkID8gYXNwZWN0cy5tUmFuZ2UgOiBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQpOworICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZCA9IDA7CisgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAwOworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgcHJpbWFyaWVzLCBpc290cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsCisgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFuZGFyZCAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc2ZlciAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gSERSIFN0YXRpYyBJbmZvCkBAIC0xMzI5LDI2ICsxMzQyLDI4IEBACiAgICAgICAgIC8vIE9ubHkgYWR2ZXJ0aXNlIHN0YXRpYyBpbmZvIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ3JvdXBzIGhhdmUgYmVlbiBzcGVjaWZpZWQuCiAgICAgICAgIGlmIChtZW1jbXAoJmluZm8sICZudWxsSW5mbywgc2l6ZW9mKGluZm8pKSAhPSAwKSB7CiAgICAgICAgICAgICBpbmZvLm1JRCA9IEhEUlN0YXRpY0luZm86OmtUeXBlMTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5SGRyU3RhdGljSW5mbywgJ2hkclMnLCAmaW5mbywgc2l6ZW9mKGluZm8pKTsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KGluZm8sIG1ldGEpOwogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6aW5pdFRyYWNrSW5mbygKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKICAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKICAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKICAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOwogICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IGZhbHNlOwogICAgIHRyYWNrSW5mby0+bUhlYWRlciA9IE5VTEw7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyTGVuID0gMDsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gLTE7CiAKICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0NvdW50KCk7IGkrKykgewogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZyAqZW5jb2RpbmcgPSB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQnlJbmRleChpKTsKICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKTsgaisrKSB7CiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZzo6Q29udGVudEVuY3J5cHRpb24gKmVuY3J5cHRpb247CiAgICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KGopOwotICAgICAgICAgICAgdHJhY2tJbmZvLT5tTWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGVuY3J5cHRpb24tPmtleV9pZCwgZW5jcnlwdGlvbi0+a2V5X2lkX2xlbik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrSW5mby0+bU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKICAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM5Nyw5ICsxNDEyLDEwIEBACiAKICAgICAgICAgZW51bSB7IFZJREVPX1RSQUNLID0gMSwgQVVESU9fVFJBQ0sgPSAyIH07CiAKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplID0gLTE7CiAKICAgICAgICAgc3dpdGNoICh0cmFjay0+R2V0VHlwZSgpKSB7CiAgICAgICAgICAgICBjYXNlIFZJREVPX1RSQUNLOgpAQCAtMTQwOCwyMCArMTQyNCwyOCBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbNF0gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHSC9JU08vSEVWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMTQgKyA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IDEgKyAoY29kZWNQcml2YXRlWzE0ICsgN10gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJIRVZDIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDMwLDE2ICsxNDU0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDgiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA5IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgIC8vICdjc2QtMCcgZm9yIFZQOSBpcyB0aGUgQmxvYiBvZiBDb2RlYyBQcml2YXRlIGRhdGEgYXMKICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNvZGVjUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9BVjEiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNDU1LDggKzE0ODAsOCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgKGludDMyX3QpaGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CkBAIC0xNDY2LDggKzE0OTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPiAwICYmIGRpc3BsYXlIZWlnaHQgPD0gSU5UMzJfTUFYKSB7CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlzcGxheVVuaXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBwaXhlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCkBAIC0xNDgxLDggKzE1MDgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZEhlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGhlaWdodCwgd2lkdGggKiBkaXNwbGF5SGVpZ2h0IC8gZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFdpZHRoIDw9IElOVDMyX01BWCAmJiBjb21wdXRlZEhlaWdodCA8PSBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWNvbXB1dGVkV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdCljb21wdXRlZEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTUwMiwzNCArMTUzMSwzOSBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIkFfQUFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CiAKICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNEZWxheSA9IHRyYWNrLT5HZXRDb2RlY0RlbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZtU2Vla1ByZVJvbGxOcywgc2l6ZW9mKG1TZWVrUHJlUm9sbE5zKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9GTEFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkRmxhY01ldGFkYXRhKG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU0Miw3ICsxNTc2LDcgQEAKICAgICAgICAgICAgY2hhciBsYW5nWzRdOwogICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKICAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7Ci0gICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNTUxLDEyICsxNTg1LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBsb25nIGxvbmcgZHVyYXRpb25OcyA9IG1TZWdtZW50LT5HZXREdXJhdGlvbigpOwotICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKIAogICAgICAgICBtVHJhY2tzLnB1c2goKTsKICAgICAgICAgc2l6ZV90IG4gPSBtVHJhY2tzLnNpemUoKSAtIDE7CiAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChuKTsKICAgICAgICAgaW5pdFRyYWNrSW5mbyh0cmFjaywgbWV0YSwgdHJhY2tJbmZvKTsKKyAgICAgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IG5hbFNpemU7CiAKICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgewogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gQVZDIHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCkBAIC0xNTczLDcgKzE2MDgsNyBAQAogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGluZm8tPm1NZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhpbmZvLT5tTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTU5OSwxNiArMTYzNCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEuc2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChpbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCB0aHVtYm5haWxUaW1lVXMpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1Jc1dlYm0gPyAidmlkZW8vd2VibSIgOiBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMTYyMSw3ICsxNjU2LDcgQEAKIH0KIAogYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CiAgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CiAgICAgbG9uZyBsb25nIHBvczsKQEAgLTE2MzQsMjggKzE2NjksNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibWthIiwKKyAgICAibWt2IiwKKyAgICAid2VibSIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYSgmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLjM4NzFiZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKIAotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKQEAgLTU3LDkgKzU4LDE3IEBACiAgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIFRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIG1NZXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB+VHJhY2tJbmZvKCkgeworICAgICAgICAgICAgaWYgKG1NZXRhKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOwogCkBAIC02OCw2ICs3Nyw3IEBACiAgICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KICAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKICAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47CisgICAgICAgIGludDMyX3QgbU5hbExlbmd0aFNpemU7CiAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKQEAgLTc2LDcgKzg2LDcgQEAKICAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKQEAgLTg3LDEzICs5NywxMyBAQAogICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKICAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CiAKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDQ5NGNlYWMuLjRlMmYyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTIsMTMgKzEyLDEzIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLmE4MzhhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKIAotICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIpOwogCiAgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICBtZXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIGtNYXBbaV0ua2V5LCBzLnN0cmluZygpKTsKICAgICB9CiAKICAgICBzaXplX3QgZGF0YVNpemU7CkBAIC02NjIsMjggKzY2MiwyOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICBpZiAoZGF0YSkgewotICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworICAgIHJldHVybiB3cmFwKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIHVpbnQ4X3QgbXBlZ19oZWFkZXJbNV07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgQUxPR1YoIk1QRUcxUFMgY29udGFpbmVyIGlzIG5vdCBzdXBwb3J0ZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgaWYgKCFSZXN5bmMoJmhlbHBlciwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDcsMTYgKzcwNywyNSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm1wMiIsCisgICAgIm1wMyIsCisgICAgIm1wZWciLAorICAgICJtcGciLAorICAgICJtcGdhIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4xZTM4YWI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CiAgICAgfk1QM0V4dHJhY3RvcigpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAppbmRleCBjZDE3OTY1Li5jYTUxYjg4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsNyArMzksNyBAQAogCiAvLyBzdGF0aWMKIFZCUklTZWVrZXIgKlZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKICAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCmluZGV4IDkyMTNmNmUuLjUwNzg5OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTI0LDExICsyNCwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKaW5kZXggMDFlMDZjYS4uOWYxZmQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTIxLDcgKzIxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc5LDcgKzgxLDcgQEAKIAogLy8gc3RhdGljCiBYSU5HU2Vla2VyICpYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CiAKICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCmluZGV4IDU4NjdlYWUuLjlhY2VlMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKQEAgLTIyLDExICsyMiwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTJlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQzRQYXJzZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkFDNFBhcnNlci5oIgorCisjZGVmaW5lIEJPT0xTVFIoYSkgICgoYSk/InRydWUiOiJmYWxzZSIpCisjZGVmaW5lIEJZVEVfQUxJR04gbUJpdFJlYWRlci5za2lwQml0cyhtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4KQorI2RlZmluZSBDSEVDS19CSVRTX0xFRlQobikgaWYgKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSA8IG4pIHtyZXR1cm4gZmFsc2U7fQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FDNFBhcnNlcjo6QUM0UGFyc2VyKCkgeworfQorCitBQzREU0lQYXJzZXI6OkFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicikKKyAgICA6IG1CaXRSZWFkZXIoYnIpeworCisgICAgbURTSVNpemUgPSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCk7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorc3RhdGljIGNvbnN0IGNoYXIgKkNoYW5uZWxNb2Rlc1tdID0geworICAgICJtb25vIiwKKyAgICAic3RlcmVvIiwKKyAgICAiMy4wIiwKKyAgICAiNS4wIiwKKyAgICAiNS4xIiwKKyAgICAiNy4wICgzLzQvMCkiLAorICAgICI3LjEgKDMvNC8wLjEpIiwKKyAgICAiNy4wICg1LzIvMCkiLAorICAgICI3LjEgKDUvMi8wLjEpIiwKKyAgICAiNy4wICgzLzIvMikiLAorICAgICI3LjEgKDMvMi8yLjEpIiwKKyAgICAiNy4wLjQiLAorICAgICI3LjEuNCIsCisgICAgIjkuMC40IiwKKyAgICAiOS4xLjQiLAorICAgICIyMi4yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIENvbnRlbnRDbGFzc2lmaWVyW10gPSB7CisgICAgIkNvbXBsZXRlIE1haW4iLAorICAgICJNdXNpYyBhbmQgRWZmZWN0cyIsCisgICAgIlZpc3VhbGx5IEltcGFpcmVkIiwKKyAgICAiSGVhcmluZyBJbXBhaXJlZCIsCisgICAgIkRpYWxvZyIsCisgICAgIkNvbW1lbnRhcnkiLAorICAgICJFbWVyZ2VuY3kiLAorICAgICJWb2ljZSBPdmVyIgorfTsKKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgdWludDMyX3Qgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgaWYgKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzIDwgMiB8fCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA+PSA0MikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVChuX2xhbmd1YWdlX3RhZ19ieXRlcyAqIDgpOworICAgIGNoYXIgbGFuZ3VhZ2VfdGFnX2J5dGVzWzQyXTsgLy8gVFMgMTAzIDE5MCBwYXJ0IDEgNC4zLjMuOC43CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzOyBpKyspIHsKKyAgICAgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW2ldID0gKGNoYXIpbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIH0KKyAgICBsYW5ndWFnZV90YWdfYnl0ZXNbbl9sYW5ndWFnZV90YWdfYnl0ZXNdID0gMDsKKyAgICBBTE9HVigiJXUuJXU6IGxhbmd1YWdlX3RhZyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGxhbmd1YWdlX3RhZ19ieXRlcyk7CisKKyAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZShsYW5ndWFnZV90YWdfYnl0ZXMsIG5fbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKyAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUxhbmd1YWdlID0gbGFuZ3VhZ2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSBFLjUgYW5kIFRTIDEwMyAxOTAtMiB2MS4xLjEgRS45Citib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgdWludDMyX3QgY2hhbm5lbF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBjaGFubmVsX21vZGUgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGNoYW5uZWxfbW9kZSwKKyAgICBjaGFubmVsX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8gQ2hhbm5lbE1vZGVzW2NoYW5uZWxfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKyAgICBBTE9HVigiJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgZHNpX3NmX211bHRpcGxpZXIpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgfQorICAgIGlmIChjaGFubmVsX21vZGUgPj0gNyAmJiBjaGFubmVsX21vZGUgPD0gMTApIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICB1aW50MzJfdCBhZGRfY2hfYmFzZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBhZGRfY2hfYmFzZSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGFkZF9jaF9iYXNlKTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIGNvbnRlbnRfY2xhc3NpZmllciwgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSk7CisKKyAgICAgICAgLy8gRm9yIHN0cmVhbXMgYmFzZWQgb24gVFMgMTAzIDE5MCBwYXJ0IDEgdGhlIHByZXNlbnRhdGlvbiBsZXZlbCBjaGFubmVsX21vZGUgZG9lc24ndAorICAgICAgICAvLyBleGlzdCBhbmQgc28gd2UgdXNlIHRoZSBjaGFubmVsX21vZGUgZnJvbSBlaXRoZXIgdGhlIENNIG9yIE0mRSBzdWJzdHJlYW0KKyAgICAgICAgLy8gKHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPT0gLTEgJiYKKyAgICAgICAgICAgIChjb250ZW50X2NsYXNzaWZpZXIgPT0gMCB8fCBjb250ZW50X2NsYXNzaWZpZXIgPT0gMSkpIHsKKyAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGU7CisgICAgICAgIH0KKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgdjEuMS4xIHNlY3Rpb24gRS4xMQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpCit7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoOCk7CisgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1zX3ByZXNlbnQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NoYW5uZWxfY29kZWQpKTsKKyAgICBBTE9HVigiJXUuJXU6IG5fc3Vic3RyZWFtcyA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgbl9zdWJzdHJlYW1zKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3N1YnN0cmVhbXM7IGkrKykgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChiX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWpvYyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfYWpvYyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgQk9PTFNUUihiX2Fqb2MpKTsKKyAgICAgICAgICAgIGlmIChiX2Fqb2MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3N0YXRpY19kbXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdGF0aWNfZG14ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfc3RhdGljX2RteCkpOworICAgICAgICAgICAgICAgIGlmICghYl9zdGF0aWNfZG14KSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9kbXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl9kbXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2RteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3VteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fdW14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBuX3VteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBvYmplY3RzX2Fzc2lnbm1lbnRfbWFzaworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXMgKCV1KVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdLCBjb250ZW50X2NsYXNzaWZpZXIpOworCisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlQml0cmF0ZURzaSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMiArIDMyICsgMzIpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGJpdF9yYXRlX21vZGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGVfcHJlY2lzaW9uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHNlY3Rpb24gRS40IChhYzRfZHNpKSBhbmQgVFMgMTAzIDE5MC0yIHNlY3Rpb24gRS42IChhYzRfZHNpX3YxKQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICB1aW50MzJfdCBhYzRfZHNpX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBkc2k6IG9ubHkgdmVyc2lvbnMgMCBhbmQgMSBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoNyArIDEgKyA0ICsgOSk7CisgICAgdWludDMyX3QgYml0c3RyZWFtX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygxKTsgLy8gZnNfaW5kZXgKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBmcmFtZV9yYXRlX2luZGV4CisgICAgdWludDMyX3Qgbl9wcmVzZW50YXRpb25zID0gbUJpdFJlYWRlci5nZXRCaXRzKDkpOworCisgICAgaW50MzJfdCBzaG9ydF9wcm9ncmFtX2lkID0gLTE7CisgICAgaWYgKGJpdHN0cmVhbV92ZXJzaW9uID4gMSkgeworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApeworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgYWM0IGRzaSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX3Byb2dyYW1faWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBpZiAoYl9wcm9ncmFtX2lkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYgKyAxKTsKKyAgICAgICAgICAgIHNob3J0X3Byb2dyYW1faWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgYm9vbCBiX3V1aWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgaWYgKGJfdXVpZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGtBQzRVVUlEU2l6ZUluQnl0ZXMgPSAxNjsKKyAgICAgICAgICAgICAgICBjaGFyIHByb2dyYW1fdXVpZFtrQUM0VVVJRFNpemVJbkJ5dGVzXTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoa0FDNFVVSURTaXplSW5CeXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrQUM0VVVJRFNpemVJbkJ5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV91dWlkW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJVVUlEID0gJXMiLCBwcm9ncmFtX3V1aWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCWVRFX0FMSUdOOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgcHJlc2VudGF0aW9uID0gMDsgcHJlc2VudGF0aW9uIDwgbl9wcmVzZW50YXRpb25zOyBwcmVzZW50YXRpb24rKykgeworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Qcm9ncmFtSUQgPSBzaG9ydF9wcm9ncmFtX2lkOworICAgICAgICAvLyBrbm93biBhcyBiX3NpbmdsZV9zdWJzdHJlYW0gaW4gYWM0X2RzaV92ZXJzaW9uIDAKKyAgICAgICAgYm9vbCBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2NvbmZpZyA9IDAsIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gMDsKKyAgICAgICAgdWludDMyX3QgcHJlc19ieXRlcyA9IDA7CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDUgKyA1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg4ICsgOCk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHByZXNfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBpZiAocHJlc19ieXRlcyA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICBwcmVzX2J5dGVzICs9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYnl0ZXMgPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzX2J5dGVzKTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKSwgYWM0X3ByZXNlbnRhdGlvbl92MV9kc2koKSBhbmQgYWM0X3ByZXNlbnRhdGlvbl92Ml9kc2koKQorICAgICAgICAgICAgLy8gYWxsIHN0YXJ0IHdpdGggYSBwcmVzZW50YXRpb25fY29uZmlnIG9mIDUgYml0cworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChwcmVzZW50YXRpb25fY29uZmlnID09IDB4MWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKlByZXNlbnRhdGlvbkNvbmZpZ1tdID0geworICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2ciLAorICAgICAgICAgICAgIk1haW4gKyBERSIsCisgICAgICAgICAgICAiTWFpbiArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTWFpbiArIERFICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJBcmJpdHJhcnkgc3Vic3RyZWFtIGdyb3VwcyIsCisgICAgICAgICAgICAiRU1ERiBvbmx5IgorICAgICAgICB9OworICAgICAgICBBTE9HVigiJXU6IGJfc2luZ2xlX3N1YnN0cmVhbS9ncm91cCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICBCT09MU1RSKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkpOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl92ZXJzaW9uID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX3ZlcnNpb24pOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jb25maWcgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9jb25maWcsCisgICAgICAgICAgICAocHJlc2VudGF0aW9uX2NvbmZpZyA+PSBORUxFTShQcmVzZW50YXRpb25Db25maWcpID8KKyAgICAgICAgICAgICJyZXNlcnZlZCIgOiBQcmVzZW50YXRpb25Db25maWdbcHJlc2VudGF0aW9uX2NvbmZpZ10pKTsKKworICAgICAgICAvKiByZWNvcmQgYSBtYXJrZXIsIGxlc3MgdGhlIHNpemUgb2YgdGhlIHByZXNlbnRhdGlvbl9jb25maWcgKi8KKyAgICAgICAgdWludDY0X3Qgc3RhcnQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKworICAgICAgICBib29sIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IGZhbHNlOworICAgICAgICBpZiAoIWJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCAmJiBwcmVzZW50YXRpb25fY29uZmlnID09IDYpIHsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyArIDEpOworICAgICAgICAgICAgdWludDMyX3QgbWRjb21wYXQgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICBBTE9HVigiJXU6IG1kY29tcGF0ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgbWRjb21wYXQpOworCisgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4ID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvKTsKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSAmJiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2tleV9pZCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9rZXlfaWQpOworCisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gJWQgKCVzKVxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTW9kZXNbZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlXSA6ICJyZXNlcnZlZCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID49IDExICYmIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc190b3BfY2hhbm5lbF9wYWlycyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNfdG9wX2NoYW5uZWxfcGFpcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2sgaW4gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBkc2lfcHJlc2VudGF0aW9uX2NoYW5uZWxfbW9kZV9jb3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZmlsdGVyID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9maWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJfZW5hYmxlX3ByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9lbmFibGVfcHJlc2VudGF0aW9uID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfZW5hYmxlX3ByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9maWx0ZXJfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9maWx0ZXJfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2ZpbHRlcl9ieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gZmlsdGVyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogYWM0X2RzaV92ZXJzaW9uID09IDEgKi8KKworICAgICAgICAgICAgaWYgKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX211bHRpX3BpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9tdWx0aV9waWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfbXVsdGlfcGlkKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb25fY29uZmlnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNnID0gMDsgc2cgPCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyICsgMjsgc2crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9za2lwX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9za2lwX2J5dGVzICogOCkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fc2tpcF9ieXRlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZV92aXJ0dWFsaXplZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJlVmlydHVhbGl6ZWQgPSBiX3ByZV92aXJ0dWFsaXplZDsKKyAgICAgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVfdmlydHVhbGl6ZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfcHJlX3ZpcnR1YWxpemVkKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiX2FkZF9lbWRmX3N1YnN0cmVhbXMpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5fYWRkX2VtZGZfc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX2FkZF9lbWRmX3N1YnN0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBlbWRmX3N1YnN0cmVhbVslZF06IHZlcnNpb249JWQsIGtleV9pZD0lZFxuIiwgcHJlc2VudGF0aW9uLCBqLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uLCBzdWJzdHJlYW1fa2V5X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gZmFsc2U7CisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gJXNcbiIsIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSk7CisgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWx0ZXJuYXRpdmUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoImJfYWx0ZXJuYXRpdmUgPSAlc1xuIiwgQk9PTFNUUihiX2FsdGVybmF0aXZlKSk7CisgICAgICAgICAgICBpZiAoYl9hbHRlcm5hdGl2ZSkgeworICAgICAgICAgICAgICAgIEJZVEVfQUxJR047CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lX2xlbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5hbWVfbGVuICogOCk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJnByZXNlbnRhdGlvbl9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5yZXNpemUobmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3RhcmdldHMgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fdGFyZ2V0cyAqICgzICsgOCkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3RhcmdldHM7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMyk7IC8vIHRhcmdldF9tZF9jb21wYXQKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gdGFyZ2V0X2RldmljZV9jYXRlZ29yeQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJZVEVfQUxJR047CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICB1aW50NjRfdCBlbmQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKyAgICAgICAgICAgIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbmQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uX2J5dGVzID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICB1aW50NjRfdCBza2lwX2J5dGVzID0gcHJlc19ieXRlcyAtIHByZXNlbnRhdGlvbl9ieXRlczsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyA9ICUiIFBSSXU2NCAiIGJ5dGVzIiwgc2tpcF9ieXRlcyk7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhza2lwX2J5dGVzICogOCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQga25vdyB0aGlzIG9yIHNvbWV0aGluZyBpcyBwcm9iYWJseSB3cm9uZworICAgICAgICAvLyB3aXRoIHRoZSBiaXRzdHJlYW0gKG9yIHdlIGRvbid0IHN1cHBvcnQgaXQpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9PSAtMSl7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGRldGVybWluZyBjaGFubmVsIG1vZGUgb2YgcHJlc2VudGF0aW9uICVkIiwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLyogZWFjaCBwcmVzZW50YXRpb24gKi8KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I2ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFDNF9QQVJTRVJfSF8KKyNkZWZpbmUgQUM0X1BBUlNFUl9IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBBQzRQYXJzZXIoKTsKKyAgICB2aXJ0dWFsIH5BQzRQYXJzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZSgpID0gMDsKKworICAgIHN0cnVjdCBBQzRQcmVzZW50YXRpb24geworICAgICAgICBpbnQzMl90IG1DaGFubmVsTW9kZSA9IC0xOworICAgICAgICBpbnQzMl90IG1Qcm9ncmFtSUQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtR3JvdXBJbmRleCA9IC0xOworCisgICAgICAgIC8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgNC4zLjMuOC4xCisgICAgICAgIGVudW0gQ29udGVudENsYXNzaWZpZXJzIHsKKyAgICAgICAgICAgIGtDb21wbGV0ZU1haW4sCisgICAgICAgICAgICBrTXVzaWNBbmRFZmZlY3RzLAorICAgICAgICAgICAga1Zpc3VhbGx5SW1wYWlyZWQsCisgICAgICAgICAgICBrSGVhcmluZ0ltcGFpcmVkLAorICAgICAgICAgICAga0RpYWxvZywKKyAgICAgICAgICAgIGtDb21tZW50YXJ5LAorICAgICAgICAgICAga0VtZXJnZW5jeSwKKyAgICAgICAgICAgIGtWb2ljZU92ZXIKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ29udGVudENsYXNzaWZpZXIgPSBrQ29tcGxldGVNYWluOworCisgICAgICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorICAgICAgICBlbnVtIElucHV0Q2hhbm5lbE1vZGUgeworICAgICAgICAgICAga0NoYW5uZWxNb2RlX01vbm8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfU3RlcmVvLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzNfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8xLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfMjJfMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9SZXNlcnZlZCwKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1IYXNEaWFsb2dFbmhhbmNlbWVudHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtUHJlVmlydHVhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtRW5hYmxlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgICAgICBzdGQ6OnN0cmluZyBtRGVzY3JpcHRpb247CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCBBQzRQcmVzZW50YXRpb24+IEFDNFByZXNlbnRhdGlvbnM7CisKKyAgICBjb25zdCBBQzRQcmVzZW50YXRpb25zJiBnZXRQcmVzZW50YXRpb25zKCkgY29uc3QgeyByZXR1cm4gbVByZXNlbnRhdGlvbnM7IH0KKworcHJvdGVjdGVkOgorICAgIEFDNFByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCitjbGFzcyBBQzREU0lQYXJzZXI6IHB1YmxpYyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicik7CisgICAgdmlydHVhbCB+QUM0RFNJUGFyc2VyKCkgeyB9CisKKyAgICBib29sIHBhcnNlKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCk7CisgICAgYm9vbCBwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZUJpdHJhdGVEc2koKTsKKworICAgIHVpbnQ2NF90IG1EU0lTaXplOworICAgIEFCaXRSZWFkZXImIG1CaXRSZWFkZXI7Cit9OworCit9OworCisjZW5kaWYgIC8vIEFDNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGYzMTZkZjYuLjFiMzA4YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFDNFBhcnNlci5jcHAiLAogICAgICAgICAiSXRlbVRhYmxlLmNwcCIsCiAgICAgICAgICJNUEVHNEV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiU2FtcGxlSXRlcmF0b3IuY3BwIiwKQEAgLTE0LDcgKzE1LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCBhNDYyZGU5Li5hNzJlNTg5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxJdGVtVGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC05Miw3ICs5NSw3IEBACiAKIHN0cnVjdCBCb3ggewogcHJvdGVjdGVkOgotICAgIEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQogCiAgICAgdmlydHVhbCB+Qm94KCkge30KQEAgLTEwNCwxNCArMTA3LDE0IEBACiAKICAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICBpbmxpbmUgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisgICAgaW5saW5lIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICB1aW50MzJfdCBtVHlwZTsKIH07CiAKQEAgLTE4Niw3ICsxODksNyBAQAogCiBzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewogcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CiAKICAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KQEAgLTIyMSw3ICsyMjQsNyBAQAogLy8KIAogc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgUGl0bUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygicGl0bSIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7CkBAIC0zMDEsNyArMzA0LDcgQEAKIH07CiAKIHN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgorICAgIElsb2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlsb2MiKSksCiAgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQogCkBAIC00NzEsNyArNDc0LDcgQEAKIC8vCiAKIHN0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgewotICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjI2LDcgKzYyOSw3IEBACiB9CiAKIHN0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElyZWZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CisgICAgSXJlZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpcmVmIikpLCBtUmVmSWRTaXplKDApLCBtSXRlbVJlZnMoaXRlbVJlZnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjg4LDcgKzY5MSw3IEBACiB9OwogCiBzdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJc3BlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpc3BlIikpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03MjQsNyArNzI3LDcgQEAKIH0KIAogc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBIdmNjQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImh2Y0MiKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03NTcsNyArNzYwLDcgQEAKIH0KIAogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlyb3QiKSksIG1BbmdsZSgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc4Niw3ICs3ODksNyBAQAogfQogCiBzdHJ1Y3QgQ29sckJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIENvbHJCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIENvbHJCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiY29sciIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTgzNCw3ICs4MzcsNyBAQAogfQogCiBzdHJ1Y3QgSXBtYUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcG1hQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgSXBtYUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlwbWEiKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTkwOCw3ICs5MTEsNyBAQAogfQogCiBzdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgorICAgIElwY29Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBjbyIpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTY1LDcgKzk2OCw3IEBACiB9CiAKIHN0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgIElwcnBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKICAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBycCIpKSwKQEAgLTEwMjIsNyArMTAyNSw3IEBACiB9OwogCiBzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJbmZlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpbmZlIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7CkBAIC0xMTI3LDIwICsxMTMwLDE5IEBACiB9CiAKIHN0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElpbmZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlpbmYiKSksCi0gICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQorICAgIElpbmZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWluZiIpKSwgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgYm9vbCBoYXNHcmlkcygpIHsgcmV0dXJuIG1IYXNHcmlkczsgfQorICAgIGJvb2wgaGFzRm91ckNDKHVpbnQzMl90IHR5cGUpIHsgcmV0dXJuIG1Gb3VyQ0NTZWVuLmNvdW50KHR5cGUpID4gMDsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBWZWN0b3I8SXRlbUluZm8+ICptSXRlbUluZm9zOwotICAgIGJvb2wgbUhhc0dyaWRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gbUZvdXJDQ1NlZW47CiB9OwogCiBzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTExODcsNyArMTE4OSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOwotICAgICAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygiZ3JpZCIpKTsKKyAgICAgICAgbUZvdXJDQ1NlZW4uaW5zZXJ0KGl0ZW1JbmZvLml0ZW1UeXBlKTsKICAgICB9CiAgICAgLy8gSW5mZUJveCBwYXJzZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSBib3ggaWYgYW4gdW5zdXBwb3J0ZWQKICAgICAvLyB2ZXJzaW9uLiBJZ25vcmUgdGhpcyBlcnJvciBhcyBpdCdzIG5vdCBmYXRhbC4KQEAgLTExOTYsNyArMTE5OCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1JdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QcmltYXJ5SXRlbUlkKDApLAogICAgICAgbUlkYXRPZmZzZXQoMCksCkBAIC0xMjc2LDcgKzEyNzgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChpaW5mQm94Lmhhc0dyaWRzKCkpIHsKKyAgICBpZiAoaWluZkJveC5oYXNGb3VyQ0MoRk9VUkNDKCJncmlkIikpIHx8IGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiRXhpZiIpKSkgewogICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKICAgICB9CiAKQEAgLTE0NzYsNyArMTQ3OCw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMyw3OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogCiAgICAgaWYgKGltYWdlLT5pdGVtSWQgPT0gbVByaW1hcnlJdGVtSWQpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwgMSk7CiAgICAgfQogCiAgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKICAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQogICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCiAgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMzYwIC0gaW1hZ2UtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpbWFnZVsldV06IHRodW1ibmFpbDogc2l6ZSAlZHglZCwgaXRlbSBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdGh1bWJuYWlsIGRhdGEgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywgaW1hZ2UtPnJvd3MpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCiAgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1ldGE7CiB9CkBAIC0xNjcxLDggKzE2ODgsMzEgQEAKICAgICB9CiAKICAgICAvLyBza2lwIHRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIG9mZnNldCB0byBUSUZGIGhlYWRlcgotICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgNDsKLSAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gNDsKKyAgICB1aW50MzJfdCB0aWZmT2Zmc2V0OworICAgIGlmICghbURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgIG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQsICZ0aWZmT2Zmc2V0LCA0KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgLy8gV2UgbmVlZCAnRXhpZlwwXDAnIGJlZm9yZSB0aGUgdGlmZiBoZWFkZXIKKyAgICB0aWZmT2Zmc2V0ID0gbnRvaGwodGlmZk9mZnNldCk7CisgICAgaWYgKHRpZmZPZmZzZXQgPCA2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIFRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIGl0ZW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgdGlmZiBoZWFkZXIgd2l0aGluIHRoZQorICAgIC8vIGV4aWYgZGF0YS4gVGhlIHNpemUgb2YgdGhlIGl0ZW0gc2hvdWxkIGJlID4gNCBmb3IgYSBub24tZW1wdHkgZXhpZiAodGhpcworICAgIC8vIHdhcyBhbHJlYWR5IGNoZWNrZWQgd2hlbiB0aGUgaXRlbSB3YXMgYWRkZWQpLiBBbHNvIGNoZWNrIHRoYXQgdGhlIHRpZmYKKyAgICAvLyBoZWFkZXIgb2Zmc2V0IGlzIHZhbGlkLgorICAgIGlmIChtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSA8PSA0IHx8CisgICAgICAgICAgICB0aWZmT2Zmc2V0ID4gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gT2Zmc2V0IG9mICdFeGlmXDBcMCcgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiAnRXhpZicgaXRlbQorICAgIC8vIChmaXJzdCA0LWJ5dGUgaXMgdGhlIHRpZmYgaGVhZGVyIG9mZnNldCkKKyAgICB1aW50MzJfdCBleGlmT2Zmc2V0ID0gNCArIHRpZmZPZmZzZXQgLSA2OworICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgZXhpZk9mZnNldDsKKyAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gZXhpZk9mZnNldDsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKaW5kZXggNTM2ZGNiMC4uYmU4MWI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKQEAgLTE5LDEzICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8c2V0PgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogY2xhc3MgTWV0YURhdGE7CiAKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTQ1LDEzICs0NywxMyBAQAogCiBjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgaXNWYWxpZCgpIHsgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQ7IH0KICAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OwotICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZEltYWdlSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCkBAIC02Miw3ICs2NCw3IEBACiAgICAgfkl0ZW1UYWJsZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7CiAgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZWVjYTYyOS4uNGI0ZDc2NwotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNiwyNiArMjYsMjcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CkBAIC02OCwzNyArNjksMzggQEAKICAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAogfTsKIAorY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgIE1QRUc0U291cmNlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlLAorICAgICAgICAgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgfk1QRUc0U291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1Gb3JtYXQ7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBpbnQzMl90IG1UaW1lc2NhbGU7CiAgICAgc3A8U2FtcGxlVGFibGU+IG1TYW1wbGVUYWJsZTsKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtMTA4LDcgKzExMCw3IEBACiAgICAgb2ZmNjRfdCBtRmlyc3RNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbU5leHRNb29mT2Zmc2V0OwotICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7IC8vIGluIG1lZGlhIHRpbWVzY2FsZSB0aWNrcwogICAgIGludDMyX3QgbUxhc3RQYXJzZWRUcmFja0lkOwogICAgIGludDMyX3QgbVRyYWNrSWQ7CiAKQEAgLTEyOSwyMiArMTMxLDIzIEBACiAKICAgICBib29sIG1Jc0FWQzsKICAgICBib29sIG1Jc0hFVkM7CisgICAgYm9vbCBtSXNBQzQ7CiAgICAgYm9vbCBtSXNQY207CiAgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwogCiAgICAgYm9vbCBtU3RhcnRlZDsKIAotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLQotICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZmZlcjsKLQotICAgIGJvb2wgbVdhbnRzTkFMRnJhZ21lbnRzOworICAgIE1lZGlhQnVmZmVySGVscGVyICptQnVmZmVyOwogCiAgICAgdWludDhfdCAqbVNyY0J1ZmZlcjsKIAogICAgIGJvb2wgbUlzSGVpZjsKICAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CiAKKyAgICAvLyBTdGFydCBvZmZzZXQgZnJvbSBjb21wb3NpdGlvbiB0aW1lIHRvIHByZXNlbnRhdGlvbiB0aW1lLgorICAgIC8vIFN1cHBvcnQgc2hpZnQgb25seSBmb3IgdmlkZW8gdHJhY2tzIHRocm91Z2ggbUVsc3RTaGlmdFN0YXJ0VGlja3MgZm9yIG5vdy4KKyAgICBpbnQzMl90IG1FbHN0U2hpZnRTdGFydFRpY2tzOworCiAgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwpAQCAtMTUzLDYgKzE1Niw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpOwogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlRW5jcnlwdGlvbihvZmY2NF90IG9mZnNldCk7CisgICAgLy8gcmV0dXJucyAtMSBmb3IgaW52YWxpZCBsYXllciBJRAorICAgIGludDMyX3QgcGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTE5OCwxNCArMjAzLDE0IEBACiAvLyBwb3NzaWJseSB3cmFwcGluZyBtdWx0aXBsZSB0aW1lcyB0byBjb3ZlciBhbGwgdHJhY2tzLCBpLmUuCiAvLyBFYWNoIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgY2FjaGVzIHRoZSBzYW1wbGV0YWJsZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgdHJhY2suCiAKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKLSAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworY2xhc3MgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAgICAgdmlydHVhbCB+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZmxhZ3MoKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBhc3N1bWVTb3VyY2VPd25lcnNoaXBPblN1Y2Nlc3MpOwogCkBAIC0yMTMsNyArMjE4LDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIGJvb2wgbU93bnNEYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CkBAIC0yMjUsOCArMjMwLDkgQEAKICAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmKTsKIH07CiAKLUNhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKK0NhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQorICAgIDogRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU93bnNEYXRhU291cmNlKGZhbHNlKSwKICAgICAgIG1DYWNoZWRPZmZzZXQoMCksCiAgICAgICBtQ2FjaGVkU2l6ZSgwKSwKQEAgLTIzNiw3ICsyNDIsNyBAQAogQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CiAgICAgY2xlYXJDYWNoZSgpOwogICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKLSAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgICAgICBkZWxldGUgbVNvdXJjZTsKICAgICB9CiB9CiAKQEAgLTI1MCwxMCArMjU2LDYgQEAKICAgICBtQ2FjaGVkU2l6ZSA9IDA7CiB9CiAKLXN0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Ci19Ci0KIHNzaXplX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMxNSw2ICszMTcsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygic2F3YiIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKIAorICAgICAgICBjYXNlIEZPVVJDQygiZWMtMyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CisKICAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIApAQCAtMzI5LDYgKzMzNCw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJodmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJoZXYxIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKQEAgLTMzNiw2ICszNDMsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOworICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgorICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIlVua25vd24gZm91cmNjOiAlYyVjJWMlYyIsCiAgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiAyNCkgJiAweGZmLApAQCAtMzYyLDEyICszNzQsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQorTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAogICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCiAgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkU291cmNlKE5VTEwpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCkBAIC0zNzcsNiArMzg4LDcgQEAKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworICAgIG1GaWxlTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0zODQsNiArMzk2LDcgQEAKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKIAorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrLT5tZXRhKTsKICAgICAgICAgZGVsZXRlIHRyYWNrOwogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQpAQCAtMzk0LDcgKzQwNyw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNDAzLDEzICs0MTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDMwLDE4ICs0NDQsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00NDksMTcgKzQ2MywxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCi0gICAgICAgICAgICAvLyBlbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgICAgICAgICAgLy8gRWxzdCBoYXMgdG8gYmUgcHJvY2Vzc2VkIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPiBJTlQ2NF9NQVgpIHsKQEAgLTQ3NSw3NyArNDkwLDc2IEBACiAgICAgICAgICAgICAgICAgICBoYWxmc2NhbGUsIG1IZWFkZXJUaW1lc2NhbGUsIHRyYWNrLT50aW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KXNhbXBsZXJhdGUgIT0gdHJhY2stPnRpbWVzY2FsZSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGU6JSIgUFJJZDMyICIsIHRyYWNrLT50aW1lc2NhbGUgYW5kIHNhbXBsZXJhdGUgYXJlIGRpZmZlcmVudCEiLCBzYW1wbGVyYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5OwotICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY2FsY3VsYXRlZCBkZWxheSBzaG91bGQgYmUgc21hbGwsIGJ1dCBzb21lIGFwcHMKLSAgICAgICAgICAgICAgICAgICAgICogYXBwZWFyIHRvIHdyaXRlIGEgYm9ndXMgZWRpdCBsaXN0IHRoYXQgY2F1c2VzIGEgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhcmdlIGRlbGF5LCByZXN1bHRpbmcgaW4gcGxheWJhY2sgcHJvYmxlbXMuCi0gICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBzdWNoIGVkaXQgbGlzdHMuCi0gICAgICAgICAgICAgICAgICAgICAqICg0MDk2IGlzIGVub3VnaCB0byBkcm9wIDQgZnVsbCBzYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCBib2d1cyB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLQotICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247Ci0gICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uX2U2OwotICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7Ci0gICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCkgKwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZVNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQotICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQotICAgICAgICAgICAgLy8gbWVkaWFfdGltZSBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgdHJhY2sgaGVhZGVyL21lZGlhIHRpbWVzY2FsZQotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lX3NjYWxlZCwgMTAwMDAwMCwgJm1lZGlhX3RpbWVfc2NhbGVkX2U2KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lZGlhX3RpbWVfc2NhbGVkX2U2IC89IHRyYWNrLT50aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZihfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OwotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXNjYWxlX2U2OwotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOwotICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAvLyBCb3RoIGRlbGF5IGFuZCBwYWRkaW5nc2FtcGxlcyBoYXZlIHRvIGJlIHNldCBpbm9yZGVyIGZvciBlaXRoZXIgdG8gYmUKKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZSBpbiB0aGUgbG93ZXIgbGF5ZXJzLgorICAgICAgICAgICAgaW50NjRfdCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobWVkaWFfdGltZSA+IDApIHsgLy8gR2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSB0cmFjay0+dGltZXNjYWxlLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisKKyAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOworICAgICAgICAgICAgaWYgKHNlZ21lbnRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgLy8gc2NhbGVkX2R1cmF0aW9uID0gZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOworICAgICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZzsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb25fZTY7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkOworICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgPSBzY2FsZWRfZHVyYXRpb24gLSAoKHNlZ21lbnRfZHVyYXRpb24gKiAxMDAwMDAwKSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQorICAgICAgICAgICAgICAgIC8vIHNlZ21lbnRfZHVyYXRpb24gaXMgYmFzZWQgb24gdGltZXNjYWxlIGluIG1vdmllIGhlYWRlciBib3gobWRoZCkKKyAgICAgICAgICAgICAgICAvLyBtZWRpYV90aW1lIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSB0cmFjayBoZWFkZXIvbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgbUhlYWRlclRpbWVzY2FsZSwgJm1lZGlhX3RpbWVfc2NhbGVkKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWVfc2NhbGVkLCAxMDAwMDAwLCAmbWVkaWFfdGltZV9zY2FsZWRfZTYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVkaWFfdGltZV9zY2FsZWRfZTYgLz0gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uX2U2LCBtZWRpYV90aW1lX3NjYWxlZF9lNiwgJnNlZ21lbnRfZW5kKQorICAgICAgICAgICAgICAgICAgICB8fCBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBpcykKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBpZiAocGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfbWh0ID0gbUhlYWRlclRpbWVzY2FsZSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZ3NhbXBsZXMgPSAoKHBhZGRpbmcgKiBzYW1wbGVyYXRlKSArIChoYWxmc2NhbGVfbWh0ICogMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8gKG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlX21odCwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJwYWRkaW5nc2FtcGxlcyA9ICUiIFBSSWQ2NCwgcGFkZGluZ3NhbXBsZXMpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9KCk7CiAKQEAgLTU1NCw3ICs1NjgsNyBAQAogICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewpAQCAtNTY3LDM2ICs1ODEsMzggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiwgaGVhZGVyLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwgZHVyYXRpb24gLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIGR1cmF0aW9uIC8gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgIT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZVRhYmxlLT5maW5kVGh1bWJuYWlsU2FtcGxlKCZzYW1wbGVJbmRleCkgPT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwgLyogb2Zmc2V0ICovLCBOVUxMIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIG1ldGEgPSB0cmFjay0+bWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgdHJhY2stPm1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7CkBAIC02MzEsMTIgKzY0NywxNCBAQAogICAgICAgICBvZmY2NF90IGV4aWZPZmZzZXQ7CiAgICAgICAgIHNpemVfdCBleGlmU2l6ZTsKICAgICAgICAgaWYgKG1JdGVtVGFibGUtPmdldEV4aWZPZmZzZXRBbmRTaXplKCZleGlmT2Zmc2V0LCAmZXhpZlNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmT2Zmc2V0LCAoaW50NjRfdClleGlmT2Zmc2V0KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUV4aWZTaXplLCAoaW50NjRfdClleGlmU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCwgKGludDY0X3QpZXhpZk9mZnNldCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUsIChpbnQ2NF90KWV4aWZTaXplKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKHVpbnQzMl90IGltYWdlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPCBtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpOyBpbWFnZUluZGV4KyspIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOwogICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJoZWlmIGltYWdlICV1IGhhcyBubyBtZXRhISIsIGltYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjYxLDI2ICs2NzksMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOworICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTcwNSw3ICs3MjYsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtOTIxLDggKzk0Miw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NTYsMTQgKzk3NywzMyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBwYXNzIHVkYXRhIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIGlmIChtSXNRVCAmJiBzdG9wX29mZnNldCAtICpvZmZzZXQgPT0gNCAmJiBjaHVua190eXBlID09IEZPVVJDQygidWR0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHVkdGEgdGVybWluYXRlcyB3aXRoIHRlcm1pbmF0ZSBjb2RlIHgwMDAwMDAwMAorICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgMCB0ZXJtaW5hdG9yIGlzIG9wdGlvbmFsIGFuZCB3ZSBqdXN0IGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlcm1pbmF0ZV9jb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmdGVybWluYXRlX2NvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB0ZXJtaW5hdGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlRlcm1pbmFsIGNvZGUgZm9yIHVkdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgdWR0YSBUZXJtaW5hbCBjb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CkBAIC05ODAsOCArMTAyMCwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwNTcsNyArMTA5OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDg0LDYgKzExMjYsNyBAQAogCiAgICAgICAgICAgICBpZiAoZW50cnlfY291bnQgIT0gMSkgewogICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBlbnRyeSBhdCB0aGUgbW9tZW50LCBmb3IgZ2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIG9yIHN0YXJ0IG9mZnNldAogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCAlZCBlbnRyaWVzIiwgZW50cnlfY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CkBAIC0xMTMzLDEyICsxMTc2LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwogICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgdHlwZSBpcyAnYWxhYycsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHBhcmFtZXRlcnMKQEAgLTExNjcsMTEgKzEyMTMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKIAogICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgc2l6ZSBvZiBBTEFDIFNwZWNpZmljIEluZm8gKDM2IGJ5dGVzKSBhbmQgdGVybWluYXRvcgogICAgICAgICAgICAgICAgIC8vIGF0b20gKDggYnl0ZXMpLgpAQCAtMTI3MiwxNiArMTMyMSwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHRtcEFsZ29yaXRobUlkOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnRtcEFsZ29yaXRobUlkKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmdG1wQWxnb3JpdGhtSWQpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIGRlZmF1bHRJVlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQzMCw4ICsxNDg2LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OCw4ICsxNTE0LDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTMsNyArMTU0OCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUzMyw5ICsxNTg4LDQwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUHJpb3IgdG8gQVBJIDI5LCB0aGUgbWV0YWRhdGEgdHJhY2sgd2FzIG5vdCBjb21wbGlhbnQgd2l0aCBJU08vSUVDCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMi0yMDE1LiBUaGlzIGxlZCB0byBzb21lIElTTy1jb21wbGlhbnQgcGFyc2VycyBmYWlsaW5nIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAvLyBtZXRhdHJhY2suIEFzIG9mIEFQSSAyOSBhbmQgb253YXJkcywgYSBjaGFuZ2Ugd2FzIG1hZGUgdG8gbWV0YWRhdGEgdHJhY2sgdG8KKyAgICAgICAgICAgIC8vIG1ha2UgaXQgY29tcGxpYW50IHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBpbnQgbnVsbF9wb3MgPSAwOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgd2hpbGUgKG51bGxfcG9zIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgIGlmICgqKHN0ciArIG51bGxfcG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytudWxsX3BvczsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG51bGxfcG9zID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRFbmNvZGluZygoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4KSk7CisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4ICsgY29udGVudEVuY29kaW5nLnNpemUoKSArIDEpLAorICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplIC0gOCAtIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NDYsMTAgKzE2MzIsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygibXA0YSIpCi0gICAgICAgICAgICAgICAgICAgICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBtcDRhIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgYXRvbXMgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCiAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTU3OCw3ICsxNjY1LDcgQEAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwogCi0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1wNGEiKSkgeworICAgICAgICAgICAgaWYgKG1Jc1FUKSB7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIDE2KSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xNjEzLDIwICsxNzAwLDIzIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jYSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIHNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ0d29zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJhbGFjIikpIHsKIApAQCAtMTY1MiwxMSArMTc0MiwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNvb2tpZVs5XSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgVTMyX0FUKCZjb29raWVbMjBdKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoY29va2llKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOwpAQCAtMTY4Myw2ICsxNzc2LDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImh2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImhldjEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKICAgICAgICAgewogICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNzE0LDEwICsxODA4LDExIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTgwNSwxMiArMTkwMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgibWF4IHNhbXBsZSBzaXplIHRvbyBiaWc6ICV6dSIsIG1heF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSArIDEwICogMik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSArIDEwICogMik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIHNpemUgd2FzIHNwZWNpZmllZC4gUGljayBhIGNvbnNlcnZhdGl2ZWx5IGxhcmdlIHNpemUuCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlXaWR0aCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlIZWlnaHQsKGludDMyX3QqKSAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsKGludDMyX3QqKSAmaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gd2lkdGggb3IgaGVpZ2h0LCBhc3N1bWluZyB3b3JzdCBjYXNlIDEwODBwIik7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTA4MDsKQEAgLTE4MjUsNyArMTkyMyw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhdWRpbywgdXNlIDEyOEtCCiAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gMTAyNCAqIDEyODsKQEAgLTE4NDIsMjYgKzE5NDAsMjggQEAKICAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgogICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKICAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBmcmFtZSByYXRlLgogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgblNhbXBsZXMgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Y291bnRTYW1wbGVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5TYW1wbGVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgLyB0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg2OSwxNSArMTk2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAoblNhbXBsZXMgKiAxMDAwMDAwTEwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvblVzID4+IDEpKSAvIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIGZyYW1lIGNvdW50ICV6dSIsIG5TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVDb3VudCwgblNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCBuU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xODkxLDYgKzE5OTQsMTMgQEAKIAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCisgICAgICAgICAgICBpZiAoZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdICE9IEZPVVJDQygic3RibCIpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaHVua1s1XTsKKyAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoW2RlcHRoIC0gMV0sIGNodW5rKTsKKyAgICAgICAgICAgICAgICBBTE9HVygic3R0cydzIHBhcmVudCBib3ggKCVzKSBpcyBub3Qgc3RibCwgc2tpcCBpdC4iLCBjaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFRpbWVUb1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTk4NSw3ICsyMDk1LDcgQEAKICAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiwgJmJ1ZmZlclswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTk3LDkgKzIxMDcsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA+IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IHRtcC5nZXQoKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTIwMTUsOCArMjEyNiw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKICAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCJtcDRhIikpIHsKQEAgLTIwNDAsNyArMjE1MSw4IEBACiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDY3LDEwICsyMTc5LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbNF0pOwogICAgICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjA5NCw4ICsyMjA4LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxMTYsMTMgKzIyMzAsMzUgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZDI2MyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0yMTUyLDcgKzIyODgsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyODAsMTUgKzI0MTcsMTUgQEAKICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJiBkdXJhdGlvbiA8IFVJTlQ2NF9NQVggLyAxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggczsKICAgICAgICAgICAgIGlmIChjb252ZXJ0VGltZVRvRGF0ZShjcmVhdGlvblRpbWUsICZzKSkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUsIHMuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIzMzAsNyArMjQ2Nyw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjQsNyArMjUwMiw4IEBACiAgICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCiAgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoInRleHQiKSB8fCB0eXBlID09IEZPVVJDQygic2J0bCIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjQwOCwxMSArMjU0NywxMCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjQzOSw4ICsyNTc3LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKIAogICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogCkBAIC0yNDcyLDggKzI2MTAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ3LDcgKzI2ODUsNDAgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVjLTMiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGVjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlRUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgZWMtMyIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBhYy00IGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUFDNFNwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgYWMtNCIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCJmdHlwIik6CkBAIC0yNjIxLDM2ICsyNzkyLDMyOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpIHsKICAgICAvLyBza2lwIDE2IGJ5dGVzOgogICAgIC8vICArIDYtYnl0ZSByZXNlcnZlZCwKICAgICAvLyAgKyAyLWJ5dGUgZGF0YSByZWZlcmVuY2UgaW5kZXgsCiAgICAgLy8gICsgOC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDE2OwotICAgIHVpbnQxNl90IGNoYW5uZWxDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmY2hhbm5lbENvdW50KSkgeworICAgICpvZmZzZXQgKz0gMTY7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIGNoYW5uZWwgY291bnQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCA4IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAogICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICpvZmZzZXQgKz0gODsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotCiAgICAgLy8gc2tpcCA0IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBzYW1wbGVSYXRlLAogICAgIC8vICArIDItYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA0OwotICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KG9mZnNldCwgc2FtcGxlUmF0ZSk7CisgICAgKm9mZnNldCArPSA0OworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVsQ291bnQsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0TWluaW11bUJveFNpemUgPSA0ICsgNCArIDM7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUM0TWluaW11bUJveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkYWM0IikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSA9IDExNzY7CisgICAgdWludDhfdCBjaHVua1trQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZV07CisgICAgc3NpemVfdCBkc2lTaXplID0gc2l6ZSAtIDg7IC8vIHNpemUgb2YgYm94IC0gc2l6ZSBhbmQgdHlwZSBmaWVsZHMKKyAgICBpZiAoZHNpU2l6ZSA+PSAoc3NpemVfdClrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSB8fAorICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIGRzaVNpemUpICE9IGRzaVNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gKyBzaXplLWJ5dGUgcGF5bG9hZAorICAgIG9mZnNldCArPSBkc2lTaXplOworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIGRzaVNpemUpOworICAgIEFDNERTSVBhcnNlciBwYXJzZXIoYnIpOworICAgIGlmICghcGFyc2VyLnBhcnNlKCkpeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBzcGVjaWZpYyBibG9jayIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIHByZXNlbnRhdGlvbnM7CisgICAgLy8gdHJhbnNsYXRlIHRoZSBBQzQgcHJlc2VudGF0aW9uIGluZm9ybWF0aW9uIHRvIGF1ZGlvIHByZXNlbnRhdGlvbnMgZm9yIHRoaXMgdHJhY2sKKyAgICBBQzREU0lQYXJzZXI6OkFDNFByZXNlbnRhdGlvbnMgYWM0UHJlc2VudGF0aW9ucyA9IHBhcnNlci5nZXRQcmVzZW50YXRpb25zKCk7CisgICAgaWYgKCFhYzRQcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhYzRQcmVzZW50YXRpb24gOiBhYzRQcmVzZW50YXRpb25zKSB7CisgICAgICAgICAgICBhdXRvJiBwcmVzZW50YXRpb24gPSBhYzRQcmVzZW50YXRpb24uc2Vjb25kOworICAgICAgICAgICAgaWYgKCFwcmVzZW50YXRpb24ubUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb24ubUdyb3VwSW5kZXg7CisgICAgICAgICAgICBhcC5tUHJvZ3JhbUlkID0gcHJlc2VudGF0aW9uLm1Qcm9ncmFtSUQ7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBwcmVzZW50YXRpb24ubUxhbmd1YWdlOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbi5tUHJlVmlydHVhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uLm1DaGFubmVsTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfTW9ubzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX1N0ZXJlbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NURVJFTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfM18wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8xOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzUyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzUyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1VSUk9VTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8yMl8yOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbW9kZSBpbiBBQzQgcHJlc2VudGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1Zpc3VhbGx5SW1wYWlyZWQpOworICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVm9pY2VPdmVyKTsKKyAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gcHJlc2VudGF0aW9uLm1IYXNEaWFsb2dFbmhhbmNlbWVudHM7CisgICAgICAgICAgICBpZiAoIWFwLm1MYW5ndWFnZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKGFwLm1MYW5ndWFnZSwgcHJlc2VudGF0aW9uLm1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gQ2xlYXIgYXVkaW8gcHJlc2VudGF0aW9uIGluZm8gaW4gbWV0YWRhdGEuCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgbnVsbHB0ciwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICAgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSA9IDExOworICAgIC8vIDEzICsgMyArICg4ICogKDIgKyA1ICsgNSArIDMgKyAxICsgMyArIDQgKyAoMTQgKiA5ICsgMSkpKSBiaXRzID09IDE1MiBieXRlcyB0aGVvcmV0aWNhbCBtYXgKKyAgICAvLyBjYWxjdWxhdGVkIGZyb20gdGhlIHJlcXVpcmVkIGJpdHMgcmVhZCBiZWxvdyBhcyB3ZWxsIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRlcGVuZGVudAorICAgIC8vIGFuZCBkZXBlbmRhbnQgc3ViIHN0cmVhbXMgeW91IGNhbiBoYXZlCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1heFNpemUgPSAxNTI7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8CisgICAgICAgIHNpemUgPCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSB8fAorICAgICAgICBzaXplID4ga0VBQzNTcGVjaWZpY0JveE1heFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkZWMzIikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRlYzMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50OF90KiBjaHVuayA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemVdOworICAgIGlmIChjaHVuayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZSk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdW5zaWduZWQgZGF0YV9yYXRlID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQUxPR1YoIkVBQzMgZGF0YSByYXRlID0gJWQiLCBkYXRhX3JhdGUpOworCisgICAgdW5zaWduZWQgbnVtX2luZF9zdWIgPSBici5nZXRCaXRzKDMpICsgMTsKKyAgICBBTE9HVigiRUFDMyBpbmRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1faW5kX3N1Yik7CisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAobnVtX2luZF9zdWIgKiAyMykpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2luZF9zdWI7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IGZzY29kICgzKSBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGJveFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlVGFibGVbZnNjb2RdOworICAgICAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICBib3hTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOworICAgICAgICBpZiAoYnNpZCA8IDgpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBFQUMzIGhlYWRlci4gUG9zc2libHkgQUMtMz8iKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAKKyAgICAgICAgYnIuc2tpcEJpdHMoMik7CisgICAgICAgIHVuc2lnbmVkIGJzbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgYWNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247CisgICAgICAgIEFMT0dWKCJic21vZCA9ICVkLCBhY21vZCA9ICVkLCBsZmVvbiA9ICVkIiwgYnNtb2QsIGFjbW9kLCBsZmVvbik7CisKKyAgICAgICAgYnIuc2tpcEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIG51bV9kZXBfc3ViID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgQUxPR1YoIkVBQzMgZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9kZXBfc3ViKTsKKyAgICAgICAgaWYgKG51bV9kZXBfc3ViICE9IDApIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY2hhbl9sb2NfdGJsW10gPSB7ICJMYy9SYyIsIkxycy9ScnMiLCJDcyIsIlRzIiwiTHNkL1JzZCIsCisgICAgICAgICAgICAgICAgIkx3L1J3IiwiTHZoL1J2aCIsIkN2aCIsIkxmZTIiIH07CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFuX2xvYyA9IGJyLmdldEJpdHMoOSk7CisgICAgICAgICAgICB1bnNpZ25lZCBtYXNrID0gMTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCA5OyBqKyssIG1hc2sgPDw9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5fbG9jICYgbWFzaykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgMiBjaGFubmVscyBpbiB0aGUgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCB8fCBqID09IDEgfHwgaiA9PSA0IHx8IGogPT0gNSB8fCBqID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICVzIiwgY2hhbl9sb2NfdGJsW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgIT0gMCkgeworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBtYXNrID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgaWYgKCgoMHgxIDw8IGkpICYmIG1hc2spID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29tcGxleGl0eSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCBhIEpPQyBzdHJlYW0gd2l0aCBjb21wbGV4aXR5ID0gJWQiLCBjb21wbGV4aXR5KTsKKyAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg4KTsKKyAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgZGVsZXRlW10gY2h1bms7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsczsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxzLCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHVpbnQzMl90IHNpemU7CiAgICAgLy8gKyA0LWJ5dGUgc2l6ZQogICAgIC8vICsgNC1ieXRlIHR5cGUKQEAgLTI3MDUsMTIgKzMxNjgsOSBAQAogICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKIAotICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yODMwLDggKzMyOTAsOSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgaW50NjRfdCBtZXRhRHVyYXRpb247Ci0gICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpZHhEdXJhdGlvbik7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTI5MjksNyArMzM5MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIikpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICooZmxvYXQgKikmdmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSwgKihmbG9hdCAqKSZ2YWwpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSA2NyAmJiBkYXRhU2l6ZSA+PSA0KSB7CiAgICAgICAgIC8vIEJFIHNpZ25lZCBpbnQzMgpAQCAtMjkzOCw3ICszMzk5LDggQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQudmlkZW8udGVtcG9yYWxfbGF5ZXJzX2NvdW50IikpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5ULCB2YWwpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gYWRkIG1vcmUga2V5cyBpZiBuZWVkZWQKQEAgLTI5OTIsNyArMzQ1NCw3IEBACiAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgaWQpOwogCiAgICAgc2l6ZV90IG1hdHJpeE9mZnNldCA9IGR5blNpemUgKyAxNjsKICAgICBpbnQzMl90IGEwMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldF0pOwpAQCAtMzAyOCwxNSArMzQ5MCwxNSBAQAogICAgIH0KIAogICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgIT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sIHJvdGF0aW9uRGVncmVlcyk7CiAgICAgfQogCiAgICAgLy8gSGFuZGxlIHByZXNlbnRhdGlvbiBkaXNwbGF5IHNpemUsIHdoaWNoIGNvdWxkIGJlIGRpZmZlcmVudAotICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IGtLZXlXaWR0aCBhbmQga0tleUhlaWdodC4KKyAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIGFuZCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVC4KICAgICB1aW50MzJfdCB3aWR0aCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Ml0pOwogICAgIHVpbnQzMl90IGhlaWdodCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Nl0pOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgd2lkdGggPj4gMTYpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGhlaWdodCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgd2lkdGggPj4gMTYpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCBoZWlnaHQgPj4gMTYpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzA2NCw1MCArMzUyNiw1MCBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSBVMzJfQVQoYnVmZmVyKTsKIAotICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBjb25zdCBjaGFyICptZXRhZGF0YUtleSA9IG51bGxwdHI7CiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7CiAgICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgc3dpdGNoICgoaW50MzJfdCltUGF0aFs0XSkgewogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWFsYiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiYUFSVCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxZGF5Iik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVllYXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ5ZWFyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxbmFtIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF3cnQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJjb3ZyIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFnZW4iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiY3BpbCIpOgpAQCAtMzExNyw3ICszNTc5LDcgQEAKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNvbXBpbGF0aW9uLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTI5LDcgKzM1OTEsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxUcmFja3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcFRyYWNrKSwgbnRvaHMoKnBUb3RhbFRyYWNrcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxNDEsNyArMzYwMyw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbERpc2NzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBEaXNjKSwgbnRvaHMoKnBUb3RhbERpc2NzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURpc2NOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE4NSw4ICszNjQ3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMjAxLDEyICszNjY1LDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgIHZvaWQgKnRtcERhdGE7CisgICAgc2l6ZV90IHRtcERhdGFTaXplOworICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYKKyAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgeworICAgICAgICBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImFsYnVtYXJ0IikpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIDgsIHNpemUgLSA4KTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5R2VucmUpIHsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiZ2VucmUiKSkgewogICAgICAgICAgICAgaWYgKGZsYWdzID09IDApIHsKICAgICAgICAgICAgICAgICAvLyB1aW50OF90IGdlbnJlIGNvZGUsIGlUdW5lcyBnZW5yZSBjb2RlcyBhcmUKICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbmRhcmQgaWQzIGNvZGVzLCBleGNlcHQgdGhleSBzdGFydApAQCAtMzIyMCwxOCArMzY4NiwxOCBAQAogICAgICAgICAgICAgICAgIGNoYXIgZ2VucmVbMTBdOwogICAgICAgICAgICAgICAgIHNwcmludGYoZ2VucmUsICIlZCIsIGdlbnJlY29kZSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIGdlbnJlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCBnZW5yZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IDEpIHsKICAgICAgICAgICAgICAgICAvLyBjdXN0b20gZ2VucmUgc3RyaW5nCiAgICAgICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgfQogICAgIH0KQEAgLTMyNjEsMjEgKzM3MjcsMzEgQEAKICAgICBpbnQzMl90IHR5cGUgPSBVMzJfQVQoJmJ1ZmZlclswXSk7CiAgICAgaWYgKCh0eXBlID09IEZPVVJDQygibmNseCIpICYmIHNpemUgPj0gMTEpCiAgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoIm5jbGMiKSAmJiBzaXplID49IDEwKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKLSAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCJuY2x4IikpICYmIChidWZmZXJbMTBdICYgMTI4KTsKLQotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLQogICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIGludDMyX3QgZXhpc3RpbmdDb2xvcjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCAmZXhpc3RpbmdDb2xvcikpIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOworCisgICAgICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzAyLDI2ICszNzc4LDI2IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJ0aXRsIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdXRoIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhbGJtIik6CkBAIC0zMzMwLDEwICszODA2LDEwIEBACiAgICAgICAgICAgICAgIGNoYXIgdG1wWzRdOwogICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygieXJyYyIpOgpAQCAtMzM1MSw3ICszODI3LDcgQEAKICAgICAgICAgICAgIGlmICh5ZWFyIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgeWVhcik7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleVllYXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzM2MCw3ICszODM2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtZXRhZGF0YUtleSA+IDApIHsKKyAgICBpZiAobWV0YWRhdGFLZXkpIHsKICAgICAgICAgYm9vbCBpc1VURjggPSB0cnVlOyAvLyBDb21tb24gY2FzZQogICAgICAgICBjaGFyMTZfdCAqZnJhbWVkYXRhID0gTlVMTDsKICAgICAgICAgaW50IGxlbjE2ID0gMDsgLy8gTnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzCkBAIC0zMzk2LDExICszODcyLDExIEBACiAKICAgICAgICAgaWYgKGlzVVRGOCkgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gMDsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDb252ZXJ0IGZyb20gVVRGLTE2IHN0cmluZyB0byBVVEYtOCBzdHJpbmcuCiAgICAgICAgICAgICBTdHJpbmc4IHRtcFVURjhzdHIoZnJhbWVkYXRhLCBsZW4xNik7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0MTUsMjcgKzM4OTEsMjkgQEAKIAogICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7CiAgICAgICAgIHN0cnVjdCBNYXAgewotICAgICAgICAgICAgaW50IGtleTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKLSAgICAgICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKLSAgICAgICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKLSAgICAgICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCwgIlRQRTIiLCAiVFAyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9USVRMRSwgIlRJVDIiLCAiVFQyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCAiVFJLIiwgIlRSQ0siIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgICAgIH07CiAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICAgICAgdm9pZCAqdG1wRGF0YTsKKyAgICAgICAgc2l6ZV90IHRtcERhdGFTaXplOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghbUZpbGVNZXRhRGF0YS5oYXNEYXRhKGtNYXBbaV0ua2V5KSkgeworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTM0NTEsNyArMzkyOSw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDYwLDEzICszOTM4LDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ4OSw3ICszOTY2LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzUwNSwxNiArMzk4MiwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzUyNSwxMCArNDAwMSw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1NDAsMTEgKzQwMTUsMjkgQEAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgYW5kICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgYW5kIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUgPiAwKSB7CisgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzIDolIiBQUklkNjQsIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUpOwogICAgIH0KIAogICAgIE1QRUc0U291cmNlICpzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKAogICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCi0gICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUpOworICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgaXRlbVRhYmxlLAorICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MpOwogICAgIGlmIChzb3VyY2UtPmluaXQoKSAhPSBPSykgewogICAgICAgICBkZWxldGUgc291cmNlOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM1NTUsMjYgKzQwNDgsMjYgQEAKIC8vIHN0YXRpYwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnZlcmlmeVRyYWNrKFRyYWNrICp0cmFjaykgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUFWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVIVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNjU5LDE2ICs0MTUyLDE0IEBACiAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiAgPT0gMHg2YikgewotICAgICAgICAvLyBUaGUgbWVkaWEgc3VidHlwZSBpcyBNUDMgYXVkaW8KLSAgICAgICAgLy8gT3VyIHNvZnR3YXJlIE1QMyBhdWRpbyBkZWNvZGVyIG1heSBub3QgYmUgYWJsZSB0byBoYW5kbGUKLSAgICAgICAgLy8gcGFja2V0aXplZCBNUDMgYXVkaW87IGZvciBub3csIGxldHMganVzdCByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQKLSAgICAgICAgQUxPR0UoIk1QMyB0cmFjayBpbiBNUDQvM0dQUCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweDZCIHx8IG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NjkpIHsKKyAgICAgICAgLy8gbXAzIGF1ZGlvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSxBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewpAQCAtMzY3NiwxMCArNDE2NywxMiBAQAogICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gMDsKICAgICAgICAgZXNkcy5nZXRCaXRSYXRlKCZtYXhCaXRyYXRlLCAmYXZnQml0cmF0ZSk7CiAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzIzLDcgKzQyMTYsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgLy9rZWVwIEFPVCB0eXBlCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5QUFDQU9ULCBvYmplY3RUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgb2JqZWN0VHlwZSk7CiAKICAgICB1aW50MzJfdCBmcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogCkBAIC0zNzQ0LDcgKzQyMzcsNyBAQAogICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGJsIDEuMTMKICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CkBAIC0zNzYxLDcgKzQyNTQsNyBAQAogICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKICAgICAgICAgfQogICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgotICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOworICAgICAgICAvLyAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgc3dpdGNoIChudW1DaGFubmVscykgewpAQCAtMzkxNCwyNCArNDQwNywyNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnByZXZTYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZwcmV2U2FtcGxlUmF0ZSkpOwogCiAgICAgaWYgKHByZXZTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIHNhbXBsZSByYXRlIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CiAKICAgICBpbnQzMl90IHByZXZDaGFubmVsQ291bnQ7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJnByZXZDaGFubmVsQ291bnQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJnByZXZDaGFubmVsQ291bnQpKTsKIAogICAgIGlmIChwcmV2Q2hhbm5lbENvdW50ICE9IG51bUNoYW5uZWxzKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsIGNvdW50IGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1DaGFubmVscyk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zOTM5LDE0ICs0NDMzLDE1IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNUEVHNFNvdXJjZTo6TVBFRzRTb3VyY2UoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKKyAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlLAorICAgICAgICBpbnQzMl90IGVsc3RTaGlmdFN0YXJ0VGlja3MpCiAgICAgOiBtRm9ybWF0KGZvcm1hdCksCiAgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UaW1lc2NhbGUodGltZVNjYWxlKSwKQEAgLTM5NjcsNDYgKzQ0NjIsNTAgQEAKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCiAgICAgICBtSXNBVkMoZmFsc2UpLAogICAgICAgbUlzSEVWQyhmYWxzZSksCisgICAgICBtSXNBQzQoZmFsc2UpLAogICAgICAgbUlzUGNtKGZhbHNlKSwKICAgICAgIG1OQUxMZW5ndGhTaXplKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbUJ1ZmZlcihOVUxMKSwKLSAgICAgIG1XYW50c05BTEZyYWdtZW50cyhmYWxzZSksCiAgICAgICBtU3JjQnVmZmVyKE5VTEwpLAogICAgICAgbUlzSGVpZihpdGVtVGFibGUgIT0gTlVMTCksCi0gICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSkgeworICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpLAorICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MoZWxzdFNoaWZ0U3RhcnRUaWNrcykgewogCiAgICAgbWVtc2V0KCZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8sIDAsIHNpemVvZihtVHJhY2tGcmFnbWVudEhlYWRlckluZm8pKTsKIAotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbUNyeXB0b01vZGUpOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgJm1DcnlwdG9Nb2RlKTsKICAgICBtRGVmYXVsdElWU2l6ZSA9IDA7Ci0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7Ci0gICAgdWludDMyX3Qga2V5dHlwZTsKLSAgICBjb25zdCB2b2lkICprZXk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZtRGVmYXVsdElWU2l6ZSk7CisgICAgdm9pZCAqa2V5OwogICAgIHNpemVfdCBrZXlzaXplOwotICAgIGlmIChtRm9ybWF0LmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZrZXl0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCAma2V5LCAma2V5c2l6ZSkpIHsKICAgICAgICAgQ0hFQ0soa2V5c2l6ZSA8PSAxNik7CiAgICAgICAgIG1lbXNldChtQ3J5cHRvS2V5LCAwLCAxNik7CiAgICAgICAgIG1lbWNweShtQ3J5cHRvS2V5LCBrZXksIGtleXNpemUpOwogICAgIH0KIAotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssICZtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVNraXBCeXRlQmxvY2ssICZtRGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssICZtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssICZtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBib29sIHN1Y2Nlc3MgPSBtRm9ybWF0LmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIGJvb2wgc3VjY2VzcyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKICAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB8fAogICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIG1Jc0FDNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CiAKICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBDSEVDSyhmb3JtYXQuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSk7CiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCkBAIC00MDE2LDEwICs0NTE1LDkgQEAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCiAgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSk7CiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCkBAIC00MDM0LDMyICs0NTMyLDU0IEBACiAgICAgaWYgKG1Jc1BjbSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlID0gMDsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSk7Ci0gICAgICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRzUGVyU2FtcGxlKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZudW1DaGFubmVscykpOwogCiAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlID4+IDM7CiAgICAgICAgIGludDMyX3QgcGNtU2FtcGxlU2l6ZSA9IGJ5dGVzUGVyU2FtcGxlICogbnVtQ2hhbm5lbHM7CiAKICAgICAgICAgc2l6ZV90IG1heFNhbXBsZVNpemU7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4U2FtcGxlU2l6ZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0sgfHwgbWF4U2FtcGxlU2l6ZSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBjbVNhbXBsZVNpemUpIHx8IGJpdHNQZXJTYW1wbGUgIT0gMTYpIHsKKyAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkKKyAgICAgICAgICAgICAgIHx8IGJpdHNQZXJTYW1wbGUgIT0gMTYpIHsKICAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgIG1Jc1BjbSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZvcm1hdC5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgcGNtU2FtcGxlU2l6ZSAqIGtNYXhQY21GcmFtZVNpemUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQ0hFQ0soZm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJm1UcmFja0lkKSk7CiAKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCAhPSAwKSB7CiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKLSAgICAgICAgcmV0dXJuIHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGlmKGVyciA9PSBPSyAmJiAhc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpCisgICAgICAgICAgICAmJiAhbUN1cnJlbnRTYW1wbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gU3RhcnQgb2Zmc2V0IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2YgZmlyc3Qgc2FtcGxlLgorICAgICAgICAgICAgLy8gSVNPIDogc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0LCB2ZXJzaW9uIDAgKHVuc2lnbmVkKSBmb3IgbWFqb3IgYnJhbmRzLgorICAgICAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MgPSBzdGQ6Om1pbihtRWxzdFNoaWZ0U3RhcnRUaWNrcywKKyAgICAgICAgICAgICAgICAoKm1DdXJyZW50U2FtcGxlcy5iZWdpbigpKS5jb21wb3NpdGlvbk9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgdWludDY0X3QgZmlyc3RTYW1wbGVDVFMgPSAwOworICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKDAsIE5VTEwsIE5VTEwsICZmaXJzdFNhbXBsZUNUUyk7CisgICAgICAgIC8vIFN0YXJ0IG9mZnNldCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB0byBjb21wb3NpdGlvbiB0aW1lIG9mIGZpcnN0IHNhbXBsZS4KKyAgICAgICAgLy8gQ29tcG9zaXRpb24gdGltZSBzdGFtcCBvZiBmaXJzdCBzYW1wbGUgY2Fubm90IGJlIG5lZ2F0aXZlLgorICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLCAoaW50MzJfdClmaXJzdFNhbXBsZUNUUyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogTVBFRzRTb3VyY2U6On5NUEVHNFNvdXJjZSgpIHsKQEAgLTQwNzAsMjEgKzQ1OTAsMTMgQEAKICAgICBmcmVlKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMpOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdGFydCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQotICAgICAgICAmJiB2YWwgIT0gMCkgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOwotICAgIH0KLQogICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZ0bXApKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJnRtcCkpOwogICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKIAogICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcwpAQCAtNDA5MiwzMiArNDYwNCwzMCBAQAogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgaWYgKG1heF9zaXplID09IDApIHsKICAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgLy8gQWxsb3cgdXAgdG8ga01heEJ1ZmZlcnMsIGJ1dCBub3QgaWYgdGhlIHRvdGFsIGV4Y2VlZHMga01heEJ1ZmZlclNpemUuCiAgICAgY29uc3Qgc2l6ZV90IGtJbml0aWFsQnVmZmVycyA9IDI7CiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJzID0gODsKICAgICBjb25zdCBzaXplX3QgcmVhbE1heEJ1ZmZlcnMgPSBtaW4oa01heEJ1ZmZlclNpemUgLyBtYXhfc2l6ZSwga01heEJ1ZmZlcnMpOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOwogICAgIG1TcmNCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFttYXhfc2l6ZV07CiAgICAgaWYgKG1TcmNCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBmaWxlIHByb2JhYmx5IHNwZWNpZmllZCBhIGJhZCBtYXggc2l6ZQotICAgICAgICBkZWxldGUgbUdyb3VwOwotICAgICAgICBtR3JvdXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwpAQCAtNDEzMCwxMyArNDY0MCwxMCBAQAogICAgIGRlbGV0ZVtdIG1TcmNCdWZmZXI7CiAgICAgbVNyY0J1ZmZlciA9IE5VTEw7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgewpAQCAtNDI1NCw3ICs0NzYxLDggQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygic2FpbyIpOiB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkKKyAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtNDM4NSw3ICs0ODkzLDggQEAKICAgICBpZiAoZW50cnljb3VudCA+IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUpIHsKICAgICAgICAgdWludDY0X3QgKm5ld1B0ciA9ICh1aW50NjRfdCAqKXJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cywgZW50cnljb3VudCAqIDgpOwogICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9IG5ld1B0cjsKQEAgLTQ0MjQsMTAgKzQ5MzMsMTMgQEAKICAgICByZXR1cm4gcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKGRybW9mZnNldCwgZmFsc2UsIDApOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKIAotICAgIGludCBpdmxlbmd0aDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJml2bGVuZ3RoKSk7CisgICAgaW50MzJfdCBpdmxlbmd0aDsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZpdmxlbmd0aCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCiAgICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgewpAQCAtNDYxMCw3ICs1MTIyLDcgQEAKIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOworICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6cGFyc2VUcmFja0ZyYWdtZW50UnVuIik7CiAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTQ3MTcsNyArNTIyOSw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCAob2ZmNjRfdCkoc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkpIHsKKyAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC00NzUyLDEwICs1MjY0LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgotICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAorICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCBjdHNPZmZzZXQgJSIgUFJJdTMyLCBpICsgMSwKICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7CisgICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzLCBzYW1wbGVDdHNPZmZzZXQpOwogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKQEAgLTQ3NzEsMTAgKzUyODMsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbWV0YSA9IG1Gb3JtYXQ7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBNUEVHNFNvdXJjZTo6cGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0IHsKQEAgLTQ3OTYsMTUgKzUzMDgsNDQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK2ludDMyX3QgTVBFRzRTb3VyY2U6OnBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDSyhkYXRhICE9IG51bGxwdHIgJiYgc2l6ZSA+PSAobU5BTExlbmd0aFNpemUgKyAyKSk7CisKKyAgICAvLyBIRVZDIE5BTC1oZWFkZXIgKDE2LWJpdCkKKyAgICAvLyAgMSAgIDYgICAgICA2ICAgICAzCisgICAgLy8gfC18dXV1dXV1fC0tLS0tLXxpaWl8CisgICAgLy8gICAgICBeICAgICAgICAgICAgXgorICAgIC8vICBOQUxfdHlwZSAgICAgICAgbGF5ZXJfaWQgKyAxCisgICAgLy8KKyAgICAvLyBMYXllci1pZCBpcyBub24temVybyBvbmx5IGZvciBUZW1wb3JhbCBTdWItbGF5ZXIgQWNjZXNzIHBpY3R1cmVzIChUU0EpCisgICAgZW51bSB7CisgICAgICAgIFRTQV9OID0gMiwKKyAgICAgICAgVFNBX1IgPSAzLAorICAgICAgICBTVFNBX04gPSA0LAorICAgICAgICBTVFNBX1IgPSA1LAorICAgIH07CisKKyAgICBkYXRhICs9IG1OQUxMZW5ndGhTaXplOworICAgIHVpbnQxNl90IG5hbEhlYWRlciA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisKKyAgICB1aW50MTZfdCBuYWxUeXBlID0gKG5hbEhlYWRlciA+PiA5KSAmIDB4M0Z1OworICAgIGlmIChuYWxUeXBlID09IFRTQV9OIHx8IG5hbFR5cGUgPT0gVFNBX1IgfHwgbmFsVHlwZSA9PSBTVFNBX04gfHwgbmFsVHlwZSA9PSBTVFNBX1IpIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkUGx1c09uZSA9IG5hbEhlYWRlciAmIDB4N3U7CisgICAgICAgIEFMT0dEX0lGKGxheWVySWRQbHVzT25lID09IDAsICJnb3QgbGF5ZXJJZCAwIGZvciBUU0EgcGljdHVyZSIpOworICAgICAgICByZXR1cm4gbGF5ZXJJZFBsdXNPbmUgLSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CiAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CkBAIC00ODE4LDEyICs1MzU5LDEzIEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKICAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7CiAgICAgICAgICAgICBpbnQzMl90IGltYWdlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmaW1hZ2VJbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJmltYWdlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKQEAgLTQ4MzMsNyArNTM3NSw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKQEAgLTQ4NTUsNiArNTM5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtb2RlICE9IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyArPSAoKGludDY0X3QpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKApAQCAtNDg3NSw3ICs1NDIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlVGltZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKQEAgLTQ4ODgsMTQgKzU0MzMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJlbmQgb2Ygc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOwogICAgICAgICAgICAgfQogCkBAIC00OTI0LDcgKzU0NzAsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMsIHN0dHM7CisgICAgdWludDY0X3QgY3RzLCBzdHRzOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewpAQCAtNDkzNCw2ICs1NDgwLDEwIEBACiAgICAgICAgIGlmICghbUlzSGVpZikgewogICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKKyAgICAgICAgICAgIGlmKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGN0cyAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAogICAgICAgICAgICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpID8KQEAgLTQ5NDUsMjQgKzU0OTUsMjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsgLy8gRVJST1JfQlVGRkVSX1RPT19TTUFMTAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQyAmJiAhbUlzQUM0KSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmIChtSXNQY20pIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgdHdvcycgUENNIGJsb2NrIHJlYWRlciBhc3N1bWVzIHRoYXQgYWxsIHNhbXBsZXMgaGFzIHRoZSBzYW1lIHNpemUuCkBAIC00OTc3LDIyICs1NTMwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvUmVhZCwgc2l6ZSwgbUN1cnJlbnRTYW1wbGVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSk7CiAKLSAgICAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gc2FtcGxlc1RvUmVhZCAqIHNpemU7CisgICAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gc2FtcGxlc1RvUmVhZCAqIHNpemU7CiAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCB0b3RhbFNpemUpOwogICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAoc3NpemVfdCl0b3RhbFNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVPcmRlcjsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5UGNtQmlnRW5kaWFuLCAmYnl0ZU9yZGVyKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4sICZieXRlT3JkZXIpOwogCiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVPcmRlciA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEJpZy1lbmRpYW4gLT4gbGl0dGxlLWVuZGlhbgpAQCAtNTAxNCwxNjYgKzU1NzAsODEgQEAKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgICAgICB9Ci0KKyAKICAgICAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewotICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKIAotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQorICAgIH0gZWxzZSBpZiAobUlzQUM0KSB7CiAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKLSAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90KiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHN5bmMgaGVhZGVyIGFuZCB0aGUgcmF3IGZyYW1lCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8ICg3ICsgc2l6ZSkpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIC8vIEFkZCBBQy00IHN5bmMgaGVhZGVyIHRvIE1QRUc0IGVuY2Fwc3VsYXRlZCBBQy00IHJhdyBmcmFtZQorICAgICAgICAvLyBBQzQwIHN5bmMgd29yZCwgbWVhbmluZyBubyBDUkMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEFDOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4NDA7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEZGOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMCkgJiAweEZGKTsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZHN0RGF0YSArIGRzdE9mZnNldCwgc2l6ZSk7CisgICAgICAgIGlmIChudW1CeXRlc1JlYWQgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDg2MjEgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCArIHNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtNTE4MSwxMiArNTY1MiwxMDUgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CisgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworCisgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAvL2lmIG5hbGxlbmd0aCBhYm5vcm1hbCxpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgQUxPR1coImFibm9ybWFsIG5hbGxlbmd0aCwgaWdub3JlIHRoaXMgTkFMIik7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNBVkMpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOworICAgICAgICB9CisKKyAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OworCisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogCiAgICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOwogCkBAIC01MjAwLDYgKzU3NjQsMTAgQEAKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogCisgICAgICAgIHNlZWtUaW1lVXMgKz0gKChpbnQ2NF90KW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICBBTE9HVigic2hpZnRlZCBzZWVrVGltZVVzIDolIiBQUklkNjQgIiwgbUVsc3RTaGlmdFN0YXJ0VGlja3M6JSIgUFJJZDMyLCBzZWVrVGltZVVzLAorICAgICAgICAgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzKTsKKwogICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBtU2VnbWVudHMuc2l6ZSgpOwogICAgICAgICBpZiAobnVtU2lkeEVudHJpZXMgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwpAQCAtNTIyNyw3ICs1Nzk1LDcgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTUyMzksNyArNTgwNyw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CkBAIC01MjU3LDEzICs1ODI1LDE3IEBACiAgICAgdWludDMyX3QgY3RzID0gMDsKICAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CiAKKyAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OwogICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CkBAIC01MjcxLDEwICs1ODQzLDEwIEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTI4Miw1OSArNTg1NCw2MSBAQAogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIGN0cyAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOworICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwogICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVfYnVmZmVyIHJldHVybmVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07Ci0gICAgTWV0YURhdGFCYXNlICZidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgYnVmbWV0YS5jbGVhcigpOworICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihidWZtZXRhKTsKICAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCi0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKICAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBtRGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1DcnlwdG9Nb2RlKTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIG1DcnlwdG9Nb2RlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIG1DcnlwdG9LZXksIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCi0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgICAgICBjb25zdCB2b2lkICppdiA9IE5VTEw7CisgICAgICAgIHZvaWQgKml2ID0gTlVMTDsKICAgICAgICAgc2l6ZV90IGl2bGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2bGVuZ3RoKSkgewotICAgICAgICAgICAgaXYgPSBzbXBsLT5pdjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgImNyeXB0by1pdiIsICZpdiwgJml2bGVuZ3RoKSkgeworICAgICAgICAgICAgaXYgPSAodm9pZCAqKSBzbXBsLT5pdjsKICAgICAgICAgICAgIGl2bGVuZ3RoID0gMTY7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CiAgICAgICAgIH0KLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgaXYsIGl2bGVuZ3RoKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBpdiwgaXZsZW5ndGgpOwogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImZyYWdtZW50ZWRSZWFkIEVSUk9SX01BTEZPUk1FRCBzaXplICV6dSIsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQpAQCAtNTM0NSwxMDMgKzU5MTksNTcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigid2hvbGUgTkFMIik7CiAgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgogICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7CiAgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gZmFsc2U7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJm1heF9zaXplKQorICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgbWF4X3NpemU7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc01hbEZvcm1lZCB8fCBkYXRhID09IE5VTEwpIHsKQEAgLTU0NTAsNyArNTk3OCw3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwogCkBAIC01NDU5LDc1ICs1OTg3LDY5IEBACiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKLSAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01NTM1LDE1ICs2MDU3LDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTU1Miw3ICs2MDc2LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU1ODMsNiArNjEwNyw3IEBACiAgICAgICAgIEZPVVJDQygiYXZjMSIpLAogICAgICAgICBGT1VSQ0MoImh2YzEiKSwKICAgICAgICAgRk9VUkNDKCJoZXYxIiksCisgICAgICAgIEZPVVJDQygiYXYwMSIpLAogICAgICAgICBGT1VSQ0MoIjNncDQiKSwKICAgICAgICAgRk9VUkNDKCJtcDQxIiksCiAgICAgICAgIEZPVVJDQygibXA0MiIpLApAQCAtNTU5Miw2ICs2MTE3LDcgQEAKICAgICAgICAgLy8gSnVzdCBnaXZlIHRoZXNlIGZpbGUgdHlwZXMgYSBjaGFuY2UuCiAgICAgICAgIEZPVVJDQygicXQgICIpLCAgLy8gQXBwbGUncyBRdWlja1RpbWUKICAgICAgICAgRk9VUkNDKCJNU05WIiksICAvLyBTb255J3MgUFNQCisgICAgICAgIEZPVVJDQygid21mICIpLAogCiAgICAgICAgIEZPVVJDQygiM2cyYSIpLCAgLy8gM0dQUDIKICAgICAgICAgRk9VUkNDKCIzZzJiIiksCkBAIC01NjE3LDcgKzYxNDMsNyBAQAogLy8gQWxzbyB0cnkgdG8gaWRlbnRpZnkgd2hlcmUgdGhpcyBmaWxlJ3MgbWV0YWRhdGEgZW5kcwogLy8gKGVuZCBvZiB0aGUgJ21vb3YnIGF0b20pIGFuZCByZXBvcnQgaXQgdG8gdGhlIGNhbGxlciBhcyBwYXJ0IG9mCiAvLyB0aGUgbWV0YWRhdGEuCi1zdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CitzdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICAvLyBXZSBzY2FuIHVwIHRvIDEyOCBieXRlcyB0byBpZGVudGlmeSB0aGlzIGZpbGUgYXMgYW4gTVA0LgogICAgIHN0YXRpYyBjb25zdCBvZmY2NF90IGtNYXhTY2FuT2Zmc2V0ID0gMTI4bGw7CiAKQEAgLTU2NjMsNyArNjE4OSw4IEBACiAKICAgICAgICAgY2hhciBjaHVua3N0cmluZ1s1XTsKICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua1R5cGUsIGNodW5rc3RyaW5nKTsKLSAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsCisgICAgICAgICAgICAgICAgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgICAgIHsKQEAgLTU3MjQsMTggKzYyNTEsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKikgeworICAgIHJldHVybiB3cmFwKG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKLSAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CkBAIC01NzQzLDE2ICs2MjcxLDMxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIjNnMiIsCisgICAgIjNnYSIsCisgICAgIjNncCIsCisgICAgIjNncHAiLAorICAgICIzZ3BwMiIsCisgICAgIm00YSIsCisgICAgIm00ciIsCisgICAgIm00diIsCisgICAgIm1vdiIsCisgICAgIm1wNCIsCisgICAgInF0IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIyNzU3NWM2Ny00NDE3LTRjNTQtOGQzZC04ZTYyNjk4NWExNjQiKSwKLSAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAyLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDQgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKaW5kZXggM2VhMDk2My4uZmFkZmI1MCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCkBAIC0yMCw5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KQEAgLTMxLDggKzMxLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1zdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CiBuYW1lc3BhY2UgaGVpZiB7CkBAIC01MywxNSArNTMsMTUgQEAKICAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKIH07CiAKLWNsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQogCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgfTsKICAgICBzdHJ1Y3QgVHJhY2sgewogICAgICAgICBUcmFjayAqbmV4dDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YTsKICAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOwogICAgICAgICBzcDxTYW1wbGVUYWJsZT4gc2FtcGxlVGFibGU7CiAgICAgICAgIGJvb2wgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwpAQCAtODUsNiArODUsNyBAQAogICAgICAgICBib29sIGhhc19lbHN0OwogICAgICAgICBpbnQ2NF90IGVsc3RfbWVkaWFfdGltZTsKICAgICAgICAgdWludDY0X3QgZWxzdF9zZWdtZW50X2R1cmF0aW9uOworICAgICAgICBpbnQzMl90IGVsc3RTaGlmdFN0YXJ0VGlja3M7CiAgICAgICAgIGJvb2wgc3Vic2FtcGxlX2VuY3J5cHRpb247CiAgICAgfTsKIApAQCAtOTcsOCArOTgsNyBAQAogCiAgICAgVmVjdG9yPFRyZXg+IG1UcmV4OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKm1DYWNoZWRTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICB1aW50MzJfdCBtSGVhZGVyVGltZXNjYWxlOwogICAgIGJvb2wgbUlzUVQ7CkBAIC0xMDgsNyArMTA4LDcgQEAKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YURhdGE7CiAKICAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOwogICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKQEAgLTEzOSwxNyArMTM5LDE2IEBACiAKICAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOwogCi0gICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiAgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHNCgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTVBFRzRfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggOTNlZTdjNi4uMjg5MGIyNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTExLDggKzExMSwxNSBAQAogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRTYW1wbGVTaXplRGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtTYW1wbGVJbmRleCArIGksICZzYW1wbGVTaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZURpcmVjdCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIC8vIHN0c2Mgc2FtcGxlIGNvdW50IGlzIG5vdCBzeW5jIHdpdGggc3RzeiBzYW1wbGUgY291bnQKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RzYyBzYW1wbGVzKCVkKSBub3Qgc3luYyB3aXRoIHN0c3ogc2FtcGxlcyglZCkiLCBtU2FtcGxlc1BlckNodW5rLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJDaHVuayA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMucHVzaChzYW1wbGVTaXplKTsKQEAgLTMwMSw3ICszMDgsNyBAQAogfQogCiBzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQ2NF90ICp0aW1lLCB1aW50NjRfdCAqZHVyYXRpb24pIHsKICAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zMTQsOCArMzIxLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVGltZVRvU2FtcGxlSW5kZXggPT0gbVRhYmxlLT5tVGltZVRvU2FtcGxlQ291bnQgfHwKLSAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UMzJfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAotICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKKyAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UNjRfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAorICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KIApAQCAtMzI4LDE5ICszMzUsMjcgQEAKICAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7CiAgICAgfQogCi0gICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgLy8gYmVsb3cgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAvLyAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaWYgKF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2FtcGxlSW5kZXgsIG1UVFNTYW1wbGVJbmRleCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobVRUU0R1cmF0aW9uLCB0bXAsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KG1UVFNTYW1wbGVUaW1lLCB0bXAsICZ0bXApKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgICp0aW1lID0gdG1wOwogCiAgICAgaW50MzJfdCBvZmZzZXQgPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7CiAgICAgaWYgKChvZmZzZXQgPCAwICYmICp0aW1lIDwgKG9mZnNldCA9PSBJTlQzMl9NSU4gPwotICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLW9mZnNldCkpKSB8fAotICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UMzJfTUFYIC0gb2Zmc2V0KSkgewotICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdyIsICp0aW1lLCBvZmZzZXQpOworICAgICAgICAgICAgSU5UNjRfTUFYIDogdWludDY0X3QoLW9mZnNldCkpKSB8fAorICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UNjRfTUFYIC0gb2Zmc2V0KSkgeworICAgICAgICBBTE9HRSgiJWxsdSArICVkIHdvdWxkIG92ZXJmbG93IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnRpbWUsIG9mZnNldCk7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIGlmIChvZmZzZXQgPiAwKSB7CiAgICAgICAgICp0aW1lICs9IG9mZnNldDsKICAgICB9IGVsc2UgewotICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDMyX01JTiA/IElOVDMyX01BWCA6ICgtb2Zmc2V0KSk7CisgICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UNjRfTUlOID8gSU5UNjRfTUFYIDogKC1vZmZzZXQpKTsKICAgICB9CiAKICAgICAqZHVyYXRpb24gPSBtVFRTRHVyYXRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaAppbmRleCA2ZTRmNjBlLi41YTBlYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKQEAgLTMzLDggKzMzLDggQEAKICAgICB1aW50MzJfdCBnZXREZXNjSW5kZXgoKSBjb25zdCB7IHJldHVybiBtQ2h1bmtEZXNjOyB9CiAgICAgb2ZmNjRfdCBnZXRTYW1wbGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZU9mZnNldDsgfQogICAgIHNpemVfdCBnZXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVTaXplOyB9Ci0gICAgdWludDMyX3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQotICAgIHVpbnQzMl90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQorICAgIHVpbnQ2NF90IGdldFNhbXBsZVRpbWUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVRpbWU7IH0KKyAgICB1aW50NjRfdCBnZXRTYW1wbGVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlRHVyYXRpb247IH0KIAogICAgIHVpbnQzMl90IGdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ3VycmVudFNhbXBsZUluZGV4ICsgbVNhbXBsZXNQZXJDaHVuayAtCkBAIC02MywyMCArNjMsMjAgQEAKIAogICAgIHVpbnQzMl90IG1UaW1lVG9TYW1wbGVJbmRleDsKICAgICB1aW50MzJfdCBtVFRTU2FtcGxlSW5kZXg7Ci0gICAgdWludDMyX3QgbVRUU1NhbXBsZVRpbWU7CisgICAgdWludDY0X3QgbVRUU1NhbXBsZVRpbWU7CiAgICAgdWludDMyX3QgbVRUU0NvdW50OwotICAgIHVpbnQzMl90IG1UVFNEdXJhdGlvbjsKKyAgICB1aW50NjRfdCBtVFRTRHVyYXRpb247CiAKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwogICAgIG9mZjY0X3QgbUN1cnJlbnRTYW1wbGVPZmZzZXQ7CiAgICAgc2l6ZV90IG1DdXJyZW50U2FtcGxlU2l6ZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZVRpbWU7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsKKyAgICB1aW50NjRfdCBtQ3VycmVudFNhbXBsZVRpbWU7CisgICAgdWludDY0X3QgbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsKIAogICAgIHZvaWQgcmVzZXQoKTsKICAgICBzdGF0dXNfdCBmaW5kQ2h1bmtSYW5nZSh1aW50MzJfdCBzYW1wbGVJbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0Q2h1bmtPZmZzZXQodWludDMyX3QgY2h1bmssIG9mZjY0X3QgKm9mZnNldCk7Ci0gICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbik7CisgICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDY0X3QgKnRpbWUsIHVpbnQ2NF90ICpkdXJhdGlvbik7CiAKICAgICBTYW1wbGVJdGVyYXRvcihjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKICAgICBTYW1wbGVJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDI1ZjhlMmEuLmJmMjliZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KIApAQCAtMTE0LDcgKzExNCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVNhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtQ2h1bmtPZmZzZXRPZmZzZXQoLTEpLAogICAgICAgbUNodW5rT2Zmc2V0VHlwZSgwKSwKQEAgLTYxNCw3ICs2MTQsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdWludDMyX3QgYWJzX2RpZmZlcmVuY2UodWludDMyX3QgdGltZTEsIHVpbnQzMl90IHRpbWUyKSB7Cit1aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50NjRfdCB0aW1lMSwgdWludDY0X3QgdGltZTIpIHsKICAgICByZXR1cm4gdGltZTEgPiB0aW1lMiA/IHRpbWUxIC0gdGltZTIgOiB0aW1lMiAtIHRpbWUxOwogfQogCkBAIC02NjIsNyArNjYyLDcgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCA9IDA7Ci0gICAgdWludDMyX3Qgc2FtcGxlVGltZSA9IDA7CisgICAgdWludDY0X3Qgc2FtcGxlVGltZSA9IDA7CiAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50OyArK2kpIHsKICAgICAgICAgdWludDMyX3QgbiA9IG1UaW1lVG9TYW1wbGVbMiAqIGldOwpAQCAtNjg0LDEzICs2ODQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wVGltZURlbHRhID09IElOVDMyX01JTiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyX01BWCA6IHVpbnQzMl90KC1jb21wVGltZURlbHRhKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY29tcFRpbWVEZWx0YSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBjb21wVGltZURlbHRhKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGNvbXBUaW1lRGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlbGx1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBUaW1lRGVsdGEgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQ2NF9NQVg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29tcFRpbWVEZWx0YSA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzAxLDEwICs3MDEsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKytzYW1wbGVJbmRleDsKLSAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJWxsdSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhbXBsZVRpbWUsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDY0X01BWDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSArPSBkZWx0YTsKICAgICAgICAgICAgIH0KQEAgLTg3MCwxOSArODcwLDE5IEBACiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CiAgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KQEAgLTk1NSw5ICs5NTUsOSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ2NF90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAppbmRleCBkZDY4ODYwLi41N2Y2ZTYyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCiBjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAKQEAgLTY1LDkgKzY2LDkgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CisgICAgICAgICAgICB1aW50NjRfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKIAogICAgIC8vIGNhbGwgb25seSBhZnRlciBnZXRNZXRhRGF0YUZvclNhbXBsZSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgogICAgIHVpbnQzMl90IGdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKTsKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBNdXRleCBtTG9jazsKIAogICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OwpAQCAtMTIzLDcgKzEyNCw3IEBACiAKICAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKICAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OwotICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOworICAgICAgICB1aW50NjRfdCBtQ29tcG9zaXRpb25UaW1lOwogICAgIH07CiAgICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCAzOGM4NmViLi4wZjBjNzJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xNSwyMyArMTUsMjYgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCmluZGV4IDhhMGZhMDMuLjk0NmEyYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKQEAgLTE4LDM5ICsxOCw1NCBAQAogI2RlZmluZSBMT0dfVEFHICJNUEVHMkV4dHJhY3RvckJ1bmRsZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICJtMnAiLAorICAgInRzIiwKKyAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjNkMWRjZmViLWU0MGEtNDM2ZC1hNTc0LWMyNDM4YTU1NWU1ZiIpLAogICAgICAgICAxLAogICAgICAgICAiTVBFRzItUFMvVFMgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IDY5ODBiODIuLjczMTU4NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgIm1wZWcydHMvRVNRdWV1ZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDIyICszMywyMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2ssIHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5UcmFjaygpOwpAQCAtNzIsMjkgKzcyLDI5IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwogfTsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKLSAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CisgICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldyYXBwZWRUcmFjaygpOwogCiBwcml2YXRlOgogICAgIE1QRUcyUFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgc3A8TVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s+IG1UcmFjazsKKyAgICBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayAqbVRyYWNrOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLApAQCAtMTA4LDI1ICsxMDgsMjcgQEAKICAgICB9CiAKICAgICAvLyBSZW1vdmUgYWxsIHRyYWNrcyB0aGF0IHdlcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGVpciBmb3JtYXQuCi0gICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7CiAgICAgICAgIGktLTsKLSAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IE9LKSB7CisgICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgfQogICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOwogCiAgICAgbVNjYW5uaW5nID0gZmFsc2U7CiB9CiAKIE1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTM0LDIwICsxMzYsMjAgQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1UcmFja3MudmFsdWVBdChpbmRleCktPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNUEVHMlBTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTYzNSw0MiArNjM3LDU1IEBACiAgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAobVNvdXJjZS0+c3RhcnQoTlVMTCkgPT0gT0spIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZS0+c3RvcCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpOworCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gc291cmNlTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqc291cmNlTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICB3aGlsZSAoIW1Tb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOwpAQCAtNjgwLDcgKzY5NSw1MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbVNvdXJjZS0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpidWZmZXIgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCkBAIC03MjYsNyArNzg0LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6V3JhcHBlZFRyYWNrKAotICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spCisgICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrKHRyYWNrKSB7CiB9CkBAIC03MzQsMjcgKzc5MiwyOCBAQAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjp+V3JhcHBlZFRyYWNrKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQocGFyYW1zKTsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoKSB7CisgICAgbVRyYWNrLT5tQnVmZmVyR3JvdXAgPSBtQnVmZmVyR3JvdXA7CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgewogICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICByZXR1cm4gbVRyYWNrLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbNV07CiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCA4YjlkYWQ5Li5lNWQ1OTFmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMTksNyArMTksOCBAQAogI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTMxLDE0ICszMiwxNCBAQAogc3RydWN0IFRyYWNrOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyUFNFeHRyYWN0b3IiOyB9CkBAIC01MSwxMiArNTIsMTIgQEAKICAgICBzdHJ1Y3QgV3JhcHBlZFRyYWNrOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFRyYWNrPiA+IG1UcmFja3M7CisgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIFRyYWNrKiA+IG1UcmFja3M7CiAgICAgYm9vbCBtU2Nhbm5pbmc7CiAKICAgICBib29sIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQ7CkBAIC03Miw3ICs3Myw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMjYwYzg4ZS4uNDlkZDBiNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKQEAgLTUxLDE5ICs1MSwxOSBAQAogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOwogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CiAKLXN0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTVBFRzJUU1NvdXJjZSgKICAgICAgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAogICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CiAgICAgdmlydHVhbCB+TVBFRzJUU1NvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcml2YXRlOgogICAgIE1QRUcyVFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CkBAIC04OCw0NCArODgsMTUyIEBACiBNUEVHMlRTU291cmNlOjp+TVBFRzJUU1NvdXJjZSgpIHsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKLSAgICByZXR1cm4gbUltcGwtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoKSB7CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAoIW1JbXBsLT5zdGFydChOVUxMKSkgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdG9wKCk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgeworICAgIGlmICghbUltcGwtPnN0b3AoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IG1zZy0+Y291bnRFbnRyaWVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1zZy0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaWQgPSBtc2ctPmdldEVudHJ5QXQoaSk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbDMyKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBuYW1lLCB2YWwzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWw2NCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZvcm1hdCwgbmFtZSwgdmFsNjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsZmxvYXQ7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGZsb2F0KSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZm9ybWF0LCBuYW1lLCB2YWxmbG9hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbGRvdWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsZG91YmxlKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKGZvcm1hdCwgbmFtZSwgdmFsZG91YmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgICAgICBpZiAoQVN0cmluZyBzOyBpZC5maW5kKCZzKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgbmFtZSwgcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsIG5hbWUsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgdW5zdXBwb3J0ZWQgdHlwZSAlZCAnJXMnIiwgdHlwZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBtSW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwogICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKICAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgKFJlYWRPcHRpb25zOjpTZWVrTW9kZSlzZWVrTW9kZSk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1FeHRyYWN0b3ItPmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShtSW1wbCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbUltcGwtPnJlYWQoJm1idWYsIChNZWRpYVRyYWNrOjpSZWFkT3B0aW9ucyopIG9wdGlvbnMpOworICAgIHNpemVfdCBsZW5ndGggPSBtYnVmLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqb3V0YnVmOworICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dGJ1ZiwgZmFsc2UsIGxlbmd0aCk7CisgICAgbWVtY3B5KG91dGJ1Zi0+ZGF0YSgpLCBtYnVmLT5kYXRhKCksIGxlbmd0aCk7CisgICAgb3V0YnVmLT5zZXRfcmFuZ2UoMCwgbGVuZ3RoKTsKKyAgICAqb3V0ID0gb3V0YnVmOworICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0ICpvdXRNZXRhID0gb3V0YnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIob3V0TWV0YSk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitNUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUGFyc2VyKG5ldyBBVFNQYXJzZXIpLAogICAgICAgbUxhc3RTeW5jRXZlbnQoMCksCkBAIC0xMzMsMTEgKzI0MSwxNSBAQAogICAgIGluaXQoKTsKIH0KIAorTVBFRzJUU0V4dHJhY3Rvcjo6fk1QRUcyVFNFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworfQorCiBzaXplX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2VJbXBscy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1Tb3VyY2VJbXBscy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTQ4LDIyICsyNjAsMjMgQEAKICAgICAgICAgICAgIChtU2Vla1N5bmNQb2ludHMgPT0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQogICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOwogICAgIGlmIChpbXBsTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKLQotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy9zdGF0aWMKQEAgLTE3NCw3ICsyODcsNyBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKICAgICBIYWxUb2tlbiBoYWxUb2tlbjsKICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbiwgc2l6ZSk7CiAgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKQEAgLTE4NCwyMCArMjk3LDI2IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKICAgICAgICAgaW5pdCgpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmluZEluZGV4T2ZTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsIHNpemVfdCAqaW5kZXgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKKyAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCiB2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgIT0gT0spIHsKICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKICAgICB9CiB9CiAKQEAgLTIwNSw2ICszMjQsNyBAQAogICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgc2l6ZV90IGluZGV4OwogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICgoZXJyID0gZmVlZE1vcmUodHJ1ZSAvKiBpc0luaXQgKi8pKSA9PSBPSwpAQCAtMjIzLDggKzM0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzgsMTAgKzM1OSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSAmJiAhaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQ5MSw3ICs2MTEsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CiAgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CiAgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KQEAgLTUxMiwxOCArNjMyLDE4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChzZWVrTW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CiAgICAgICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgogICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCiAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKQEAgLTY2Niw3ICs3ODYsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyOwogICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggY2JkZDNjYi4uMjUzN2QzYiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIwLDggKzIwLDggQEAKICNkZWZpbmUgTVBFRzJfVFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzQsMzAgKzM0LDMzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBVFNQYXJzZXI7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIHN0cnVjdCBNUEVHMlRTU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KIAorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUcyVFNFeHRyYWN0b3IoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOwogCkBAIC04MSwxNyArODQsMTggQEAKICAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgogICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KICAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgotICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlQmFzZSB0bworICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlSGVscGVyIHRvCiAgICAgLy8gcGFyc2VyIGFuZCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLiBPdGhlcndpc2UsIHZhcmlvdXMgZXJyb3IgY29kZXMgY291bGQgYmUKLSAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlQmFzZSwgb3IKKyAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlSGVscGVyLCBvcgogICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KICAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOwogICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpOworICAgIHN0YXR1c190IGZpbmRJbmRleE9mU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLCBzaXplX3QgKmluZGV4KTsKIAogICAgIC8vIEFkZCBhIFN5blBvaW50IGRlcml2ZWQgZnJvbSB8ZXZlbnR8LgogICAgIHZvaWQgYWRkU3luY1BvaW50X2woY29uc3QgQVRTUGFyc2VyOjpTeW5jRXZlbnQgJmV2ZW50KTsKQEAgLTEwMSw3ICsxMDUsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IGYzZDI3OTQuLjYwNGVjNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtNywxMyArNywxOCBAQAogICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBiMmZlNjljLi5kOTk0OTNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKQEAgLTIxLDE5ICsyMSwxNyBAQAogI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBleHRlcm4gIkMiIHsKQEAgLTQ3LDE2ICs0NSwxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk9nZ1NvdXJjZSgpOwpAQCAtNzEsMjggKzY5LDMwIEBACiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvciB7CiAgICAgTXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7CiAgICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKIAotICAgIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKSBjb25zdDsKIAogICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAotICAgIHN0YXR1c190IGdldEZpbGVNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICAgICAgbWV0YSA9IG1GaWxlTWV0YTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIG1lZGlhX3N0YXR1c190IGdldEZpbGVNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YSk7CiAgICAgfQogCisgICAgdm9pZCBzZXRCdWZmZXJHcm91cChNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgeworICAgICAgICBtQnVmZmVyR3JvdXAgPSBncm91cDsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IFBhZ2UgewogICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTEwLDcgKzExMCw4IEBACiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKICAgICB9OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwogICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CkBAIC0xMjksMTEgKzEzMCwxMyBAQAogICAgIHZvcmJpc19pbmZvIG1WaTsKICAgICB2b3JiaXNfY29tbWVudCBtVmM7CiAKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhOwogCiAgICAgVmVjdG9yPFRPQ0VudHJ5PiBtVGFibGVPZkNvbnRlbnRzOwogCisgICAgaW50MzJfdCBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7CiAgICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwogCkBAIC0xNDYsNyArMTQ5LDcgQEAKICAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgogICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgogICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKIAogICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CiAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCkBAIC0xNTQsOSArMTU3LDkgQEAKICAgICAvLwogICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKICAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CiAKLSAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTE2NCwxMiArMTY3LDE0IEBACiAKICAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAKKyAgICB2b2lkIHNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpOworCiAgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiAgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKIH07CiAKIHN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCkBAIC0xNzgsNyArMTgzLDcgQEAKIAogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpIHsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CiAgICAgfQogCkBAIC0xOTAsMTQgKzE5NSwxNCBAQAogICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiB9OwogCiBzdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKIAotICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAogICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCiAgICAgICAgICAgbUNvZGVjRGVsYXkoMCksCkBAIC0yMDgsMTYgKzIxMywxNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdDsKIAogICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKICAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKQEAgLTIzNywyOCArMjQyLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQorICAgIC8vIGluaXRpYWxpemUgYnVmZmVyIGdyb3VwIHdpdGggYSBzaW5nbGUgc21hbGwgYnVmZmVyLCBidXQgYSBnZW5lcm91cyB1cHBlciBsaW1pdAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMjggLyogc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKyAgICBtRXh0cmFjdG9yLT5tSW1wbC0+c2V0QnVmZmVyR3JvdXAobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjY2LDQxICsyNzMsNDMgQEAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAotICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHBhY2tldC0+bWV0YV9kYXRhKCk7CiAjaWYgMAogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2ZpbmRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKSkgewogICAgICAgICBBTE9HSSgiZm91bmQgdGltZSA9ICVsbGQgdXMiLCB0aW1lVXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dJKCJOTyB0aW1lIik7CiAgICAgfQogI2VuZGlmCiAKLSAgICBwYWNrZXQtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICAqb3V0ID0gcGFja2V0OwotCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dWKCJyZXR1cm5pbmcgYnVmZmVyICVwIiwgcGFja2V0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgOiBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLApAQCAtMzExLDIxICszMjAsMjUgQEAKICAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCiAgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKICAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAotICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgeworICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSksCisgICAgICBtSGFwdGljQ2hhbm5lbENvdW50KDApIHsKICAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKIAogICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRmlsZU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE15T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgY29uc3QgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgY29uc3QgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCkBAIC0zNTEsNyArMzY0LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICArKypwYWdlT2Zmc2V0OworICAgICAgICAvLyBzZWUgaG93IGZhciBhaGVhZCB0byBza2lwOyBhdm9pZCBzb21lIGZydWl0bGVzcyBjb21wYXJpc29ucworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmVbaV0gPT0gJ08nKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICpwYWdlT2Zmc2V0ICs9IGk7CiAgICAgfQogfQogCkBAIC01MDIsMzAgKzUyMSwzMCBAQAogICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKIAotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChuID09IDAgfHwgbiA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKICAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KIAotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOwogCiAgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CiAgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CkBAIC01NDIsNyArNTYxLDcgQEAKICAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQogICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKQEAgLTU2NSwyMiArNTg0LDIyIEBACiAgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCkgewogICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgewogICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCiAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCiAgICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucwogICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZjsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWY7CiAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOwogICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LICYmIGVyciAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwpAQCAtNjAxLDMyICs2MjAsMzMgQEAKICAgICAgICAgc2Vla1RvT2Zmc2V0KDApOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOwogICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gKCpvdXQpLT5tZXRhX2RhdGEoKTsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKICAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKICAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgIH0KICAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOwotICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKIAogICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotdWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKK3VpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0IHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjcyLDEwICs2OTIsNjYgQEAKICAgICByZXR1cm4gbnVtU2FtcGxlczsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworLyoKKyAqIGJhc2ljIG1lZGlhYnVmZmVyIGltcGxlbWVudGF0aW9uIHVzZWQgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBvZiB0aGUKKyAqIGhlYWRlciBwYWNrZXRzLCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBoYXZlIGEgYnVmZmVyIGdyb3VwCisgKi8KK2NsYXNzIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckhlbHBlciB7Citwcml2YXRlOgorICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbU9mZnNldDsKKyAgICBzaXplX3QgbUxlbmd0aDsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CitwdWJsaWM6CisgICAgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKHNpemVfdCBzaXplKSA6IE1lZGlhQnVmZmVySGVscGVyKE5VTEwpIHsKKyAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICBtRGF0YSA9IG1hbGxvYyhtU2l6ZSk7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtTGVuZ3RoID0gbVNpemU7CisgICAgICAgIG1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIH5TdGFuZEFsb25lTWVkaWFCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBBTE9HVigiZGVsZXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KKworICAgIHZvaWQqIGRhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9vZmZzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtT2Zmc2V0OworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9sZW5ndGgoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0KKworICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgIH0KK307CisKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIGludDY0X3QgdGltZVVzID0gLTE7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MDksMTYgKzc4NSwyMyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXAgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShmdWxsU2l6ZSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqdG1wOworICAgICAgICAgICAgaWYgKG1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCwgZmFsc2UsIGZ1bGxTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZWQgYnVmZmVyICVwIGZyb20gZ3JvdXAiLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKHRtcC0+bWV0YV9kYXRhKCkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC03MzcsNyArODIwLDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIChsb25nIGxvbmcpZGF0YU9mZnNldCwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZ1bGxTaXplKTsKQEAgLTc0OCw4ICs4MzEsOSBAQAogICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KIAogICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzcwLDExICs4NTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCwgdGhlIGJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCkBAIC03OTMsNyArODc4LDcgQEAKIAogICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCi0gICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKG1lZGlhX3N0YXR1c190KSBuOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMApAQCAtODE2LDM2ICs5MDEsMzggQEAKICAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlLgogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1NaW1lVHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtTWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVycjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUhlYWRlcnM7ICsraSkgewogICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gT0spIHsKKyAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOwogICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICAgICAgcGFja2V0ID0gTlVMTDsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KQEAgLTg2NSwxMiArOTUyLDEyIEBACiAKICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOwogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6YnVpbGRUYWJsZU9mQ29udGVudHMoKSB7CkBAIC05MDIsNyArOTg5LDcgQEAKICAgICAgICAgc2l6ZV90IGRlbm9tID0gbnVtZXJhdG9yIC0ga01heE51bVRPQ0VudHJpZXM7CiAKICAgICAgICAgc2l6ZV90IGFjY3VtID0gMDsKLSAgICAgICAgZm9yIChzc2l6ZV90IGkgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKICAgICAgICAgICAgIGFjY3VtICs9IGRlbm9tOwogICAgICAgICAgICAgaWYgKGFjY3VtID49IG51bWVyYXRvcikgewogICAgICAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMucmVtb3ZlQXQoaSk7CkBAIC05MTIsNyArOTk5LDcgQEAKICAgICB9CiB9CiAKLWludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTk1Miw3ICsxMDM5LDcgQEAKICAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgogICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgpAQCAtOTYxLDExICsxMDQ4LDExIEBACiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzQ29tbWVudHMoYnVmZmVyKTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OwogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTk3NSwyOSArMTA2MiwzMSBAQAogICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCiAgICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKICAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CiAgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOwogCi0gICAgbU1ldGEuc2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtPcHVzU2FtcGxlUmF0ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCAvKiBucyAqLywga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi8pOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSAvKiBucyAqLywKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlKTsKKyAgICAvLyBrS2V5T3B1c0hlYWRlciBpcyBjc2QtMAorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUNoYW5uZWxDb3VudCk7CisgICAgaW50NjRfdCBjb2RlY2RlbGF5ID0gbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNvZGVjZGVsYXksIHNpemVvZihjb2RlY2RlbGF5KSk7CisgICAgaW50NjRfdCBwcmVyb2xsID0ga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi87CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJnByZXJvbGwsIHNpemVvZihwcmVyb2xsKSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICAvLyBhZGQgYXJ0aWZpY2lhbCBmcmFtaW5nIGJpdCBzbyB3ZSBjYW4gcmV1c2UgX3ZvcmJpc191bnBhY2tfY29tbWVudAogICAgIGludDMyX3QgY29tbWVudFNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMTsKICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY29tbWVudFNpemUpOwogICAgIHVpbnQ4X3QgKmNvbW1lbnREYXRhID0gdG1wLmdldCgpOwogICAgIGlmIChjb21tZW50RGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1lbWNweShjb21tZW50RGF0YSwKQEAgLTEwMjYsMTQgKzExMTUsMTQgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CiAgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKICAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCB2ZW5kb3JMZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKHZlbmRvckxlbiA8IDAgfHwgdmVuZG9yTGVuID4gY29tbWVudFNpemUgLSA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKQEAgLTEwNDQsMTMgKzExMzMsMTMgQEAKICAgICBpbnQzMl90IG4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKG4gPCAwIHx8IG4gPiAoKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpID4+IDIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSBsZW47CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyArK2opIHsKQEAgLTEwNTgsNyArMTE0Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGZyYW1pbmdCaXRPZmZzZXQgPCAwIHx8IGZyYW1pbmdCaXRPZmZzZXQgPj0gY29tbWVudFNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKIApAQCAtMTA3NSwyMiArMTE2NCwyMyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogICAgIGludCBlcnIgPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKTsKICAgICBpZiAoMCAhPSBlcnIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKLSAgICByZXR1cm4gT0s7CisgICAgc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxDb3VudCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworbWVkaWFfc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBvZ2dfYnVmZmVyIGJ1ZjsKQEAgLTExMDksNyArMTE5OSw3IEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAKICAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwpAQCAtMTExOSwxMyArMTIwOSwxMyBAQAogICAgICAgICBjYXNlIDE6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtVmkucmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOwogICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CkBAIC0xMTQwLDcgKzEyMzAsNyBAQAogICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChicHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE0OSwyNSArMTIzOSwyNiBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICAgICAgICAgIHNldENoYW5uZWxNYXNrKG1WaS5jaGFubmVscyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgNToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKQEAgLTExODAsMjAgKzEyNzEsNDMgQEAKIAogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKLSAgICBtRmlsZU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgewogICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CiAgICAgICAgIHNpemVfdCBjb21tZW50TGVuZ3RoID0gbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXTsKLSAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KCZtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKICAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOwogICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRmlsZU1ldGEsICJoYXB0aWMiLCAmbUhhcHRpY0NoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OnNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpIHsKKyAgICAvLyBTZXQgY2hhbm5lbCBtYXNrIGFjY29yZGluZyB0byBjaGFubmVsIGNvdW50LiBXaGVuIGhhcHRpYyBjaGFubmVsIGNvdW50IGlzIGZvdW5kIGluCisgICAgLy8gZmlsZSBtZXRhLCBzZXQgaGFwdGljIGNoYW5uZWwgbWFzayB0byB0cnkgaGFwdGljIHBsYXliYWNrLgorICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgaGFwdGljX2NoYW5uZWxfbWFza19mcm9tX2NvdW50KG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICBjb25zdCBpbnQzMl90IGF1ZGlvQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50IC0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgaWYgKGhhcHRpY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRAorICAgICAgICAgICAgICAgIHx8IGF1ZGlvQ2hhbm5lbENvdW50IDw9IDAgfHwgYXVkaW9DaGFubmVsQ291bnQgPiBGQ0NfOCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaGFwdGljIGNoYW5uZWwgY291bnQgZm91bmQgaW4gbWV0YWRhdGE6ICVkIiwgbUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVsQ291bnQpIHwgaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLCBjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpKTsKKyAgICB9CiB9CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK09nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUltcGwoTlVMTCkgewpAQCAtMTIyMCwxMyArMTMzNCwxNCBAQAogT2dnRXh0cmFjdG9yOjp+T2dnRXh0cmFjdG9yKCkgewogICAgIGRlbGV0ZSBtSW1wbDsKICAgICBtSW1wbCA9IE5VTEw7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgT2dnRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOwogfQogCi1NZWRpYVRyYWNrICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMjM0LDMzICsxMzQ5LDM0IEBACiAgICAgcmV0dXJuIG5ldyBPZ2dTb3VyY2UodGhpcyk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUltcGwtPmdldEZpbGVNZXRhRGF0YShtZXRhKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgT2dnRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgcmV0dXJuIHdyYXAobmV3IE9nZ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGNoYXIgdG1wWzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNjksMTYgKzEzODUsMjMgQEAKICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJvZ2EiLAorICAgICJvZ2ciLAorICAgICJvcHVzIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4Y2M1Y2QwNi1mNzcyLTQ5NWUtOGE2Mi1jYmE5NjQ5Mzc0ZTkiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiT2dnIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKaW5kZXggOWZlMjk0NC4uYzc1ZGZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKQEAgLTE5LDI1ICsxOSwyNiBAQAogI2RlZmluZSBPR0dfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE15T2dnRXh0cmFjdG9yOwogc3RydWN0IE9nZ1NvdXJjZTsKIAotc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiT2dnRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CkBAIC00Niw3ICs0Nyw3IEBACiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgT2dnU291cmNlOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCBkZDA0NWI5Li43ZTg5MjcxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTcsMTEgKzcsMTMgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggZmU1MDliZi4uZTU4YmQxZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIwICs2NiwyMCBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KIApAQCAtNzgsNjQgKzg5LDcyIEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKIAogICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSksIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja01ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFdBVkV4dHJhY3Rvcjo6aW5pdCgpIHsKQEAgLTE4NSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVwogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwpAQCAtMTk4LDEzICsyMTcsMTMgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKIAotICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICglZCkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gRkNDXzIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1vcmUgdGhhbiAyIGNoYW5uZWxzICglZCkgaW4gbm9uLVdBVkVfRVhULCB1bmtub3duIGNoYW5uZWwgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjQsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmFsaWRCaXRzKCVkKSAhPSBiaXRzUGVyU2FtcGxlKCVkKSBhcmUgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgpAQCAtMjg0LDM1ICszMDMsMzMgQEAKICAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1UcmFja01ldGEpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIG1CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwpAQCAtMzIyLDE4ICszMzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzUGVyU2FtcGxlIHx8ICFtTnVtQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQpAQCAtMzQ4LDI1ICszNjUsMjEgQEAKIGNvbnN0IHNpemVfdCBXQVZTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAzMjc2ODsKIAogV0FWU291cmNlOjpXQVZTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLAogICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKICAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpIHsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbU51bUNoYW5uZWxzKSk7Ci0KLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZtQml0c1BlclNhbXBsZSkpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNzUsNTIgKzM4OCw1MSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICAvLyBzb21lIFdBViBmaWxlcyBtYXkgaGF2ZSBsYXJnZSBhdWRpbyBidWZmZXJzIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgdHJhbnNmZXIuCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKTsKLQotICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgOC0+MTYgYml0IGNvbnZlcnNpb24uCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgaWYgKCFtQnVmZmVyR3JvdXAtPmluaXQoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdG9wIik7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6Z2V0Rm9ybWF0Iik7CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNDQyLDE4ICs0NTQsMjIgQEAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBtYXhCeXRlc1RvUmVhZCBpcyBtdWx0aXBsZSBvZiAzLCBpbiAyNC1iaXQgY2FzZQotICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9Ci0gICAgICAgIG1CaXRzUGVyU2FtcGxlID09IDggPyBrTWF4RnJhbWVTaXplIC8gMiA6IAotICAgICAgICAobUJpdHNQZXJTYW1wbGUgPT0gMjQgPyAzKihrTWF4RnJhbWVTaXplLzMpOiBrTWF4RnJhbWVTaXplKTsKKyAgICAvLyBtYXhCeXRlc1RvUmVhZCBtYXkgYmUgcmVkdWNlZCBzbyB0aGF0IGluLXBsYWNlIGRhdGEgY29udmVyc2lvbiB3aWxsIGZpdCBpbiBidWZmZXIgc2l6ZS4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZDsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7IC8vIGRlc3RpbmF0aW9uIGlzIGZsb2F0IGF0IDQgYnl0ZXMgcGVyIHNhbXBsZSwgc291cmNlIG1heSBiZSBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtQml0c1BlclNhbXBsZSAvIDgpICogKGJ1ZmZlclNpemUgLyA0KTsKKyAgICB9IGVsc2UgeyAvLyBkZXN0aW5hdGlvbiBpcyBpbnQxNl90IGF0IDIgYnl0ZXMgcGVyIHNhbXBsZSwgb25seSBzb3VyY2Ugb2YgOCBiaXRzIGlzIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGJ1ZmZlclNpemUgLyAyIDogYnVmZmVyU2l6ZTsKKyAgICB9CiAKLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQorICAgIGNvbnN0IHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CiAgICAgICAgIChtQ3VycmVudFBvcyAtIG1PZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpCiAgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOwogCkBAIC00ODIsNDUgKzQ5OCw2NCBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgLy8gVE9ETzogYWRkIGNhcGFiaWxpdHkgdG8gcmV0dXJuIGRhdGEgYXMgZmxvYXQgUENNIGluc3RlYWQgb2YgMTYgYml0IFBDTS4KICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDgtYml0IHVuc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZC4KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCAyIGJ5dGUgd2lkZSBzYW1wbGVzCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OCgoaW50MTZfdCAqKXRtcC0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gdG1wOwotICAgICAgICB9IGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDI0KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwotICAgICAgICB9ICBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMigoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICAgICAgZmxvYXQgKmZkZXN0ID0gKGZsb2F0ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbik7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fdTgoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAyOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmRlc3QsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gYnVmZmVyIHJhbmdlIGlzIGNvcnJlY3QKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kzMihmZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBicmVhazsgLy8gbm8gdHJhbnNsYXRpb24gbmVlZGVkCisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoaWRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IGZsb2F0IHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICBpZiAoIW1PdXRwdXRGbG9hdCkgeyAvLyBtQml0c1BlclNhbXBsZSA9PSAzMgorICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChpZGVzdCwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6IGlmIG91dHB1dCBlbmNvZGluZyBpcyBmbG9hdCwgbm8gbmVlZCB0byBjb252ZXJ0IGlmIHNvdXJjZSBpcyBmbG9hdC4KICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKQEAgLTUzMywzOSArNTY4LDQzIEBACiAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogICAgIG1DdXJyZW50UG9zICs9IG47CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqaGVscGVyID0gbmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKTsKICAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICBpZiAoaGVscGVyLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIlJJRkYiLCA0KSB8fCBtZW1jbXAoJmhlYWRlcls4XSwgIldBVkUiLCA0KSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIFdBVkV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3RvcihoZWxwZXIpOyAvLyBleHRyYWN0b3Igb3ducyB0aGUgaGVscGVyCiAgICAgaW50IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBkZWxldGUgZXh0cmFjdG9yOwogICAgIGlmIChudW1UcmFja3MgPT0gMCkgewpAQCAtNTc3LDE2ICs2MTYsMjEgQEAKICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJ3YXYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAppbmRleCA0NjdkMGI3Li5iNTE0MTk2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMTksMzAgKzE5LDMxIEBACiAjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQogCiAgICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CkBAIC01Miw3ICs1Myw3IEBACiAgICAgdWludDE2X3QgbUJpdHNQZXJTYW1wbGU7CiAgICAgb2ZmNjRfdCBtRGF0YU9mZnNldDsKICAgICBzaXplX3QgbURhdGFTaXplOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YTsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAppbmRleCBkZThmMTIwLi44ODE5Zjg3IDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICAgICAgQ0ZBX1JHR0IsCiAgICAgICAgICAgICBDRkFfQkdHUiwKICAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX05PTkUsCiAgICAgICAgIH07CiAKICAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKQEAgLTg5LDcgKzkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQogICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCkBAIC0xOTcsNiArMTk3LDMzIEBACiAKICAgICAgICAgc3RhdHVzX3QgYWRkT3Bjb2RlUHJlYW1ibGUodWludDMyX3Qgb3Bjb2RlSWQpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIH07CiAKIH0gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKaW5kZXggOWFjN2UyYS4uOTMwNGY1MyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTYwLDM0ICs2MCwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKLSAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7Ci0gICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CiAKLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OwotCi0gICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cwotICAgIHNpemVfdCBqID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7Ci0gICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOwotICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07Ci0gICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOwotICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgc3dpdGNoIChjZmEpIHsKKyAgICAgICAgY2FzZSBDRkFfUkdHQjoKKyAgICAgICAgY2FzZSBDRkFfR1JCRzoKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgY2FzZSBDRkFfQkdHUjoKKyAgICAgICAgICAgIGVyciA9IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGNmYSwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX05PTkU6CisgICAgICAgICAgICBlcnIgPSBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIENGQSBsYXlvdXQgJWQiLCBfX0ZVTkNUSU9OX18sIGNmYSk7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisgICAgcmV0dXJuIGVycjsKK30KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CiAgICAgdWludDMyX3QgcmVkVG9wID0gMDsKICAgICB1aW50MzJfdCByZWRMZWZ0ID0gMDsKICAgICB1aW50MzJfdCBncmVlbkV2ZW5Ub3AgPSAwOwpAQCAtMTQzLDYgKzE0NSwzMiBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOworICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07CisgICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOworICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLApAQCAtMjE2LDYgKzI0NCw0NiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqbWFwID0gbWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIG1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2ldOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9tYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOTgxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcl9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQ3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRPRE8gcmVtb3ZlIHRoZW4gd2hlbiB3ZSBzdXBwb3J0IG90aGVyIGFyY2hpdGVjdHVyZXMKLUFQUF9BQkkgOj0gYXJtNjQtdjhhCi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlODc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvbG9vcGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzbmRmaWxlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJhdWRpb3V0aWxzCi1MT0NBTF9NT0RVTEUgOj0gYWF1ZGlvX2xvb3BiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAppbmRleCA5NzExYjg2Li44ZWI3MGIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaApAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgfQogCiAgICAgLy8gV3JpdGUgU0hPUlQgZGF0YSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsLgotICAgIGludCB3cml0ZShpbnQxNl90ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgd3JpdGUoaW50MTZfdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKICAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgfQogCiAgICAgLy8gV3JpdGUgRkxPQVQgZGF0YSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsLgotICAgIGludCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHdyaXRlKGZsb2F0ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgogICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewogICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7CkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKICAgICB9CiAKLSAgICBpbnQgc2l6ZSgpIHsKKyAgICBpbnQzMl90IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudGVyOwogICAgIH0KIApAQCAtNDQzLDkgKzQ0MywxNCBAQAogICAgIHZpcnR1YWwgfkxvb3BiYWNrUHJvY2Vzc29yKCkgPSBkZWZhdWx0OwogCiAKKyAgICBlbnVtIHByb2Nlc3NfcmVzdWx0IHsKKyAgICAgICAgUFJPQ0VTU19SRVNVTFRfT0ssCisgICAgICAgIFBST0NFU1NfUkVTVUxUX0dMSVRDSAorICAgIH07CisKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHZpcnR1YWwgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSA9IDA7CiAKQEAgLTYzOSw3ICs2NDQsNyBAQAogICAgICAgICByZXR1cm4gZ2V0U2FtcGxlUmF0ZSgpIC8gODsKICAgICB9CiAKLSAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewogICAgICAgICBpbnQgY2hhbm5lbHNWYWxpZCA9IHN0ZDo6bWluKGlucHV0Q2hhbm5lbENvdW50LCBvdXRwdXRDaGFubmVsQ291bnQpOwpAQCAtNzUwLDYgKzc1NSw3IEBACiAKICAgICAgICAgbVN0YXRlID0gbmV4dFN0YXRlOwogICAgICAgICBtTG9vcENvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIFBST0NFU1NfUkVTVUxUX09LOwogICAgIH0KIAogICAgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBvdmVycmlkZSB7CkBAIC04OTYsOSArOTAyLDEwIEBACiAgICAgICogQHBhcmFtIGlucHV0RGF0YSBjb250YWlucyBtaWNyb3Bob25lIGRhdGEgd2l0aCBzaW5lIHNpZ25hbCBmZWVkYmFjawogICAgICAqIEBwYXJhbSBvdXRwdXREYXRhIGNvbnRhaW5zIHRoZSByZWZlcmVuY2Ugc2luZSB3YXZlCiAgICAgICovCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcHJvY2Vzc19yZXN1bHQgcmVzdWx0ID0gUFJPQ0VTU19SRVNVTFRfT0s7CiAgICAgICAgIG1Qcm9jZXNzQ291bnQrKzsKIAogICAgICAgICBmbG9hdCBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKQEAgLTk3OCw2ICs5ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSBzdGQ6Om1heChtTWF4R2xpdGNoRGVsdGEsIGFic0RpZmYpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYWJzRGlmZiA+IG1Ub2xlcmFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1HbGl0Y2hDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUFJPQ0VTU19SRVNVTFRfR0xJVENIOwogICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogR290IGEgZ2xpdGNoICMgJWQsIHByZWRpY3RlZCA9ICVmLCBhY3R1YWwgPSAlZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hDb3VudCwgcHJlZGljdGVkLCBzYW1wbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOwpAQCAtMTAxOCw2ICsxMDI2LDcgQEAKIAogICAgICAgICAgICAgbUZyYW1lQ291bnRlcisrOwogICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgdm9pZCByZXNldEFjY3VtdWxhdG9yKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCAyYTAyYjIwLi42NTc4MTU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtMzQsOSArMzQsMTMgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVSZWNvcmRlci5oIgogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkxvb3BiYWNrQW5hbHl6ZXIuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKIAotLy8gVjAuNC4wMCA9IHJlY3RpZnkgYW5kIGxvdy1wYXNzIGZpbHRlciB0aGUgZWNob3MsIHVzZSBhdXRvLWNvcnJlbGF0aW9uIG9uIGVudGlyZSBlY2hvCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjQuMDAiCisvLyBWMC40LjAwID0gcmVjdGlmeSBhbmQgbG93LXBhc3MgZmlsdGVyIHRoZSBlY2hvcywgYXV0by1jb3JyZWxhdGUgZW50aXJlIGVjaG8KKy8vIFYwLjQuMDEgPSBhZGQgLWggaGFuZyBvcHRpb24KKy8vICAgICAgICAgICBmaXggLW4gb3B0aW9uIHRvIHNldCBvdXRwdXQgYnVmZmVyIGZvciAtdG0KKy8vICAgICAgICAgICBwbG90IGZpcnN0IGdsaXRjaAorI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAxIgogCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIFJFU1VMVF9UQUcgICAgICAgICAgICAgICJSRVNVTFQ6ICIKQEAgLTQ3LDEwICs1MSwxNCBAQAogY29uc3RleHByIGludCBrTG9nUGVyaW9kTWlsbGlzICAgICAgID0gMTAwMDsKIGNvbnN0ZXhwciBpbnQga051bUlucHV0Q2hhbm5lbHMgICAgICA9IDE7CiBjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0RyYWluICAgPSAyMDsKK2NvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvTm90UmVhZCA9IDA7IC8vIGxldCBpbnB1dCBmaWxsIGJhY2sgdXAKIGNvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRGlzY2FyZCA9IDIwOworY29uc3RleHByIGludCBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzID0gNTA7Citjb25zdGV4cHIgaW50IGtNYXhHbGl0Y2hFdmVudHNUb1NhdmUgPSAzMjsKIAogc3RydWN0IExvb3BiYWNrRGF0YSB7CiAgICAgQUF1ZGlvU3RyZWFtICAgICAgKmlucHV0U3RyZWFtID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAqb3V0cHV0U3RyZWFtID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICAgICAgICAgICAgaW5wdXRGcmFtZXNNYXhpbXVtID0gMDsKICAgICBpbnQxNl90ICAgICAgICAgICAqaW5wdXRTaG9ydERhdGEgPSBudWxscHRyOwogICAgIGZsb2F0ICAgICAgICAgICAgICppbnB1dEZsb2F0RGF0YSA9IG51bGxwdHI7CkBAIC01OCw2ICs2Niw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbElucHV0Q2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EcmFpbiA9IGtOdW1DYWxsYmFja3NUb0RyYWluOworICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb05vdFJlYWQgPSBrTnVtQ2FsbGJhY2tzVG9Ob3RSZWFkOwogICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb0Rpc2NhcmQgPSBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkOwogICAgIGludDMyX3QgICAgICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG1heE51bUZyYW1lcyA9IDA7CkBAIC02NSw2ICs3NCw5IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgIGluc3VmZmljaWVudFJlYWRGcmFtZXMgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNSZWFkVG90YWwgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNXcml0dGVuVG90YWwgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nUGVyaW9kTWlsbGlzID0gNSAqIDEwMDA7IC8vIHRpbWUgYmV0d2VlbiBoYW5ncworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzID0gNSAqIDQ4MDAwOyAvLyBmcmFtZXMgdGlsIG5leHQgaGFuZworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IDA7IC8vIDAgZm9yIG5vIGhhbmcKICAgICBib29sICAgICAgICAgICAgICAgaXNEb25lID0gZmFsc2U7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgaW5wdXRFcnJvciA9IEFBVURJT19PSzsKQEAgLTc0LDYgKzg2LDI5IEBACiAgICAgRWNob0FuYWx5emVyICAgICAgIGVjaG9BbmFseXplcjsKICAgICBBdWRpb1JlY29yZGluZyAgICAgYXVkaW9SZWNvcmRpbmc7CiAgICAgTG9vcGJhY2tQcm9jZXNzb3IgKmxvb3BiYWNrUHJvY2Vzc29yOworCisgICAgaW50MzJfdCAgICAgICAgICAgIGdsaXRjaEZyYW1lc1trTWF4R2xpdGNoRXZlbnRzVG9TYXZlXTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtR2xpdGNoRXZlbnRzID0gMDsKKworICAgIHZvaWQgaGFuZ0lmUmVxdWVzdGVkKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIGlmIChoYW5nVGltZU1pbGxpcyA+IDApIHsKKyAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgaWYgKGhhbmdDb3VudGRvd25GcmFtZXMgPD0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnROYW5vcyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgdXNsZWVwKGhhbmdUaW1lTWlsbGlzICogMTAwMCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBlbmROYW5vcyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbGFwc2VkTWljcm9zID0gKGludDMyX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAoKGVuZE5hbm9zIC0gc3RhcnROYW5vcykgLyAxMDAwKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImNhbGxiYWNrIGhhbmdpbmcgZm9yICVkIG1pbGxpcywgYWN0dWFsID0gJWQgbWljcm9zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcywgZWxhcHNlZE1pY3Jvcyk7CisgICAgICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyA9IChpbnQ2NF90KSBoYW5nUGVyaW9kTWlsbGlzCisgICAgICAgICAgICAgICAgICAgICAgICAqIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKG91dHB1dFN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gMTAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CiB9OwogCiBzdGF0aWMgdm9pZCBjb252ZXJ0UGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKQEAgLTEwNSw5ICsxNDAsMTQgQEAKICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICB9CiAgICAgaWYgKGZyYW1lc1JlYWQgPCAwKSB7Ci0gICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IGZyYW1lc1JlYWQ7Ci0gICAgICAgIHByaW50ZigiRVJST1IgaW4gcmVhZCA9ICVkID0gJXNcbiIsIGZyYW1lc1JlYWQsCi0gICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChmcmFtZXNSZWFkKSk7CisgICAgICAgIC8vIEV4cGVjdCBJTlZBTElEX1NUQVRFIGlmIFNUQVRFX1NUQVJUSU5HCisgICAgICAgIGlmIChteURhdGEtPmZyYW1lc1JlYWRUb3RhbCA+IDApIHsKKyAgICAgICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGZyYW1lc1JlYWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lc1JlYWQgPSAwOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXlEYXRhLT5mcmFtZXNSZWFkVG90YWwgKz0gZnJhbWVzUmVhZDsKICAgICB9CkBAIC0xNDksOCArMTg5LDEwIEBACiAgICAgICAgIGludDMyX3QgdG90YWxGcmFtZXNSZWFkID0gMDsKICAgICAgICAgZG8gewogICAgICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkKSB7CisgICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA+IDApIHsKICAgICAgICAgICAgICAgICB0b3RhbEZyYW1lc1JlYWQgKz0gYWN0dWFsRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGJlY2F1c2UgaW5wdXQgc3RyZWFtIG1heSBub3QgYmUgc3RhcnRlZCB5ZXQuCiAgICAgICAgIH0gd2hpbGUgKGFjdHVhbEZyYW1lc1JlYWQgPiAwKTsKQEAgLTE1OSw2ICsyMDEsOSBAQAogICAgICAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0RyYWluLS07CiAgICAgICAgIH0KIAorICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb05vdFJlYWQgPiAwKSB7CisgICAgICAgIC8vIExldCB0aGUgaW5wdXQgZmlsbCB1cCBhIGJpdCBzbyB3ZSBhcmUgbm90IHNvIGNsb3NlIHRvIHRoZSB3cml0ZSBwb2ludGVyLgorICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvTm90UmVhZC0tOwogICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQgPiAwKSB7CiAgICAgICAgIC8vIElnbm9yZS4gQWxsb3cgdGhlIGlucHV0IHRvIGZpbGwgYmFjayB1cCB0byBlcXVpbGlicml1bSB3aXRoIHRoZSBvdXRwdXQuCiAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7CkBAIC0xNjgsNiArMjEzLDcgQEAKICAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQtLTsKIAogICAgIH0gZWxzZSB7CisgICAgICAgIG15RGF0YS0+aGFuZ0lmUmVxdWVzdGVkKG51bUZyYW1lcyk7CiAKICAgICAgICAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gbnVtRnJhbWVzICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgIG1lbXNldChteURhdGEtPmlucHV0RmxvYXREYXRhLCAwIC8qIHZhbHVlICovLCBudW1JbnB1dEJ5dGVzKTsKQEAgLTE4NCw3ICsyMzAsNyBAQAogCiAgICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IG51bUZyYW1lcykgewogICAgICAgICAgICAgICAgIGlmKGFjdHVhbEZyYW1lc1JlYWQgPCAoaW50MzJfdCkgZnJhbWVzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGJ1dCBudW1GcmFtZXMgPSAlZCIKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgZm9yIG5vIHJlYXNvbiwgbnVtRnJhbWVzID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFjdHVhbEZyYW1lc1JlYWQgPSAlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaW5wdXRGcmFtZXNXcml0dGVuID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzUmVhZCA9ICVkIgpAQCAtMjA1LDE2ICsyNTEsMjUgQEAKICAgICAgICAgICAgIGlmIChteURhdGEtPmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewogICAgICAgICAgICAgICAgIGNvbnZlcnRQY20xNlRvRmxvYXQobXlEYXRhLT5pbnB1dFNob3J0RGF0YSwgbXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlci4KLSAgICAgICAgICAgIG15RGF0YS0+YXVkaW9SZWNvcmRpbmcud3JpdGUobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKwogICAgICAgICAgICAgLy8gQW5hbHl6ZSB0aGUgZGF0YS4KLSAgICAgICAgICAgIG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpwcm9jZXNzX3Jlc3VsdCBwcm9jUmVzdWx0ID0gbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+cHJvY2VzcyhteURhdGEtPmlucHV0RmxvYXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKworICAgICAgICAgICAgaWYgKHByb2NSZXN1bHQgPT0gTG9vcGJhY2tQcm9jZXNzb3I6OlBST0NFU1NfUkVTVUxUX0dMSVRDSCkgeworICAgICAgICAgICAgICAgIGlmIChteURhdGEtPm51bUdsaXRjaEV2ZW50cyA8IGtNYXhHbGl0Y2hFdmVudHNUb1NhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5nbGl0Y2hGcmFtZXNbbXlEYXRhLT5udW1HbGl0Y2hFdmVudHMrK10gPSBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgorICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkKTsKKwogICAgICAgICAgICAgbXlEYXRhLT5pc0RvbmUgPSBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5pc0RvbmUoKTsKICAgICAgICAgICAgIGlmIChteURhdGEtPmlzRG9uZSkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKQEAgLTI0Miw2ICsyOTcsNyBAQAogICAgIHByaW50ZigiICAgICAgLUN7Y2hhbm5lbHN9ICAgICAgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1GezAsMSwyfSAgICAgICAgIGlucHV0IGZvcm1hdCwgMT1JMTYsIDI9RkxPQVRcbiIpOwogICAgIHByaW50ZigiICAgICAgLWd7Z2Fpbn0gICAgICAgICAgcmVjaXJjdWxhdGluZyBsb29wYmFjayBnYWluXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe2hhbmdNaWxsaXN9ICAgIG9jY2FzaW9uYWxseSBoYW5nIGluIHRoZSBjYWxsYmFja1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtUHtpblBlcmZ9ICAgICAgICBzZXQgaW5wdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CiAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMzAwLDkgKzM1Niw3IEBACiAgICAgcmV0dXJuIHRlc3RNb2RlOwogfQogCi12b2lkIHByaW50QXVkaW9HcmFwaChBdWRpb1JlY29yZGluZyAmcmVjb3JkaW5nLCBpbnQgbnVtU2FtcGxlcykgewotICAgIGludDMyX3Qgc3RhcnQgPSByZWNvcmRpbmcuc2l6ZSgpIC8gMjsKLSAgICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbnVtU2FtcGxlczsKK3ZvaWQgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKSB7CiAgICAgaWYgKGVuZCA+PSByZWNvcmRpbmcuc2l6ZSgpKSB7CiAgICAgICAgIGVuZCA9IHJlY29yZGluZy5zaXplKCkgLSAxOwogICAgIH0KQEAgLTM0NSw3ICszOTksNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENhcGFjaXR5ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGlucHV0UGVyZm9ybWFuY2VMZXZlbCAgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICBvdXRwdXRGcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIG91dHB1dEZyYW1lc1BlckJ1cnN0ICAgICAgID0gMDsKIAogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgICAgICAgICA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSAgICAgICAgICAgPSAwOwpAQCAtMzUzLDYgKzQwNyw3IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgdGVzdE1vZGUgICAgICAgICAgICAgICAgICAgPSBURVNUX0VDSE9fTEFURU5DWTsKICAgICBkb3VibGUgICAgICAgICAgICAgICAgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgPSAxLjA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzICAgICAgICAgICAgID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgpAQCAtMzgyLDYgKzQzNywxNSBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW4gPSBhdG9mKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FzIHRoZXJlIGEgbnVtYmVyIGFmdGVyIHRoZSAiLWgiPworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1syXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gbnVtYmVyIHRoZW4gdXNlIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzID0ga0RlZmF1bHRIYW5nVGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGVyZm9ybWFuY2VMZXZlbCA9IHBhcnNlUGVyZm9ybWFuY2VNb2RlKGFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQxNSw2ICs0NzksOCBAQAogICAgIGludDMyX3QgdGltZU1pbGxpcyA9IDA7CiAgICAgaW50MzJfdCByZWNvcmRpbmdEdXJhdGlvbiA9IHN0ZDo6bWluKDYwICogNSwgcmVxdWVzdGVkRHVyYXRpb24pOwogCisgICAgaW50MzJfdCByZXF1ZXN0ZWRPdXRwdXRCdXJzdHMgPSBhcmdQYXJzZXIuZ2V0TnVtYmVyT2ZCdXJzdHMoKTsKKwogICAgIHN3aXRjaCh0ZXN0TW9kZSkgewogICAgICAgICBjYXNlIFRFU1RfU0lORV9NQUdOSVRVREU6CiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3IgPSAmbG9vcGJhY2tEYXRhLnNpbmVBbmFseXplcjsKQEAgLTQ0Niw3ICs1MTIsNyBAQAogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQotICAgIG91dHB1dFN0cmVhbSA9IHBsYXllci5nZXRTdHJlYW0oKTsKKyAgICBvdXRwdXRTdHJlYW0gPSBsb29wYmFja0RhdGEub3V0cHV0U3RyZWFtID0gcGxheWVyLmdldFN0cmVhbSgpOwogCiAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChvdXRwdXRTdHJlYW0pOwogICAgIGlmIChhY3R1YWxPdXRwdXRGb3JtYXQgIT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKQEAgLTQ4MiwyNCArNTQ4LDI5IEBACiAKICAgICB7CiAgICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7Ci0gICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoaW5wdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICAgIH0gZWxzZSB7fQotICAgIH0KKyAgICAgICAgKHZvaWQpIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoaW5wdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKIAotICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7CisgICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFCisgICAgICAgICAgICAgICAgJiYgcmVxdWVzdGVkT3V0cHV0QnVyc3RzID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhvdXRwdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG91dHB1dCkgcmV0dXJuZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk91dHB1dCBidWZmZXIgc2l6ZSBzZXQgdG8gbWF0Y2ggaW5wdXQgY2FwYWNpdHkgPSAlZCBmcmFtZXMhXG4iLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIHRvbyBzbWFsbCB0aGVuIHdlIGNhbm5vdCBzYXRpc2Z5IHRoZSBvdXRwdXQgY2FsbGJhY2suCi0gICAgewotICAgICAgICBpbnQzMl90IGFjdHVhbENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOworICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIHRvbyBzbWFsbCB0aGVuIHdlIGNhbm5vdCBzYXRpc2Z5IHRoZSBvdXRwdXQgY2FsbGJhY2suCiAgICAgICAgIGlmIChhY3R1YWxDYXBhY2l0eSA8IDIgKiBvdXRwdXRGcmFtZXNQZXJCdXJzdCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIGlucHV0IGNhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0XG4iKTsKICAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgICAgICB9CiAgICAgfQogCisgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKwogICAgIC8vIC0tLS0tLS0gU2V0dXAgbG9vcGJhY2tEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Rm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChpbnB1dFN0cmVhbSk7CiAKQEAgLTUxOCw2ICs1ODksOCBAQAogCiAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXNldCgpOwogCisgICAgbG9vcGJhY2tEYXRhLmhhbmdUaW1lTWlsbGlzID0gaGFuZ1RpbWVNaWxsaXM7CisKICAgICAvLyBTdGFydCBPVVRQVVQgZmlyc3Qgc28gSU5QVVQgZG9lcyBub3Qgb3ZlcmZsb3cuCiAgICAgcmVzdWx0ID0gcGxheWVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTYwNCw3ICs2NzcsMTcgQEAKIAogICAgIGlmIChsb29wYmFja0RhdGEuaW5wdXRFcnJvciA9PSBBQVVESU9fT0spIHsKICAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUpIHsKLSAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaChsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIDIwMCk7CisgICAgICAgICAgICBpZiAobG9vcGJhY2tEYXRhLm51bUdsaXRjaEV2ZW50cyA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBHcmFwaCBhcm91bmQgdGhlIGZpcnN0IGdsaXRjaCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5nbGl0Y2hGcmFtZXNbMF0gLSA4OworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyBvdXRwdXRGcmFtZXNQZXJCdXJzdCArIDggKyA4OworICAgICAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaFJlZ2lvbihsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPciBncmFwaCB0aGUgbWlkZGxlIG9mIHRoZSBzaWduYWwuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZy5zaXplKCkgLyAyOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyAyMDA7CisgICAgICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwpAQCAtNjU0LDYgKzczNywxMSBAQAogICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dFNob3J0RGF0YTsKIAogcmVwb3J0X3Jlc3VsdDoKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGJhY2tEYXRhLm51bUdsaXRjaEV2ZW50czsgaSsrKSB7CisgICAgICAgIHByaW50ZigiICBnbGl0Y2ggYXQgZnJhbWUgJWRcbiIsIGxvb3BiYWNrRGF0YS5nbGl0Y2hGcmFtZXNbaV0pOworICAgIH0KKwogICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnNhdmUoRklMRU5BTUVfUFJPQ0VTU0VEKTsKICAgICBpZiAod3JpdHRlbiA+IDApIHsKICAgICAgICAgcHJpbnRmKCJtYWluKCkgd3JvdGUgJThkIHByb2Nlc3NlZCBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IGEyYjkxNzcuLmY1ZWQ3YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMTMwLDEyICsxMzAsMTAgQEAKICAgICB9CiAKICAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3QgewotICAgICAgICBwcmludGYoIiVzKCkgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIG1CdWZmZXJDYXBhY2l0eSk7CiAgICAgICAgIHJldHVybiBtQnVmZmVyQ2FwYWNpdHk7CiAgICAgfQogCiAgICAgdm9pZCBzZXRCdWZmZXJDYXBhY2l0eShpbnQzMl90IGZyYW1lcykgewotICAgICAgICBwcmludGYoIiVzKCVkKVxuIiwgX19mdW5jX18sIGZyYW1lcyk7CiAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGZyYW1lczsKICAgICB9CiAKQEAgLTI4Myw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGFyZykgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGludmFsaWQgTU1BUCBwb2xpY3kgbW9kZSAlaVxuIiwgcG9saWN5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggMTY0NTk4Ni4uNDM3M2ZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtMzIsOCArMzIsNiBAQAogCiAvLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcwogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICAoMiAqIDQ4MDAwKQotLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgotI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCiAjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgICAgICAgICAgICAgICAgIDE2CiAKQEAgLTI3NSw3ICsyNzMsNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgIHNjaGVkdWxlciA9IDA7CiAgICAgYm9vbCAgICAgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIEFBdWRpb1NpbXBsZVBsYXllciBzaW1wbGVQbGF5ZXI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGNhbGxiYWNrQ291bnQgPSAwOwpAQCAtMzI3LDEwICszMjUsMTIgQEAKICAgICAgICAgc2luZURhdGEtPnNldHVwU2luZVN3ZWVwcygpOwogICAgIH0KIAotICAgIGlmIChzaW5lRGF0YS0+Zm9yY2VVbmRlcnJ1bnMpIHsKKyAgICBpZiAoc2luZURhdGEtPmhhbmdUaW1lTVNlYyA+IDApIHsKICAgICAgICAgaWYgKHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+IHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgewotICAgICAgICAgICAgdXNsZWVwKEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MpOwotICAgICAgICAgICAgcHJpbnRmKCJTaW11bGF0ZSBnbGl0Y2ggYXQgJWxsZFxuIiwgKGxvbmcgbG9uZykgc2luZURhdGEtPmZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIHVzbGVlcChzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjICogMTAwMCk7CisgICAgICAgICAgICBwcmludGYoIkhhbmcgY2FsbGJhY2sgYXQgJWxsZCBmcmFtZXMgZm9yICVkIG1zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICBzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjKTsKICAgICAgICAgICAgIHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCArPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWJkNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKaW5kZXggN2E0ODE1My4uMmIwNWYxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcApAQCAtMjYsMTEgKzI2LDE0IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKwogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAotI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS41IgorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS42IgorCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEhhbmdUaW1lTVNlYyA9IDEwOwogCiAvKioKICAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgpAQCAtNDEsNyArNDQsNyBAQAogc3RhdGljIGFhdWRpb19yZXN1bHRfdCB0ZXN0T3BlblBsYXlDbG9zZShBQXVkaW9BcmdzUGFyc2VyICZhcmdQYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZpeFRvbmVNc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlVW5kZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhhbmdUaW1lTVNlYykKIHsKICAgICBTaW5lVGhyZWFkZWREYXRhX3QgbXlEYXRhOwogICAgIEFBdWRpb1NpbXBsZVBsYXllciAmcGxheWVyID0gbXlEYXRhLnNpbXBsZVBsYXllcjsKQEAgLTUzLDEwICs1NiwxMiBAQAogICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcnVuIGNvbXBsZXRlIHRlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgIG15RGF0YS5zY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgbXlEYXRhLmNhbGxiYWNrQ291bnQgPSAwOwotICAgIG15RGF0YS5mb3JjZVVuZGVycnVucyA9IGZvcmNlVW5kZXJydW5zOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQorICAgIG15RGF0YS5oYW5nVGltZU1TZWMgPSBoYW5nVGltZU1TZWM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCiAKICAgICByZXN1bHQgPSBwbGF5ZXIub3BlbihhcmdQYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm15RGF0YSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVzXG4iLAogICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwpAQCAtMTE1LDEyICsxMjAsMTcgQEAKICAgICAgICAgICAgIGludDY0X3QgbWlsbGlzID0KICAgICAgICAgICAgICAgICAgICAgKGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQykgLSBzdGFydGVkQXROYW5vcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB4cnVucyA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKTsKICAgICAgICAgICAgIHByaW50ZigiIHdha2VyIHJlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXNXcml0dGVuID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgKGludCkgbWlsbGlzLAogICAgICAgICAgICAgICAgICAgIHNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIHhydW5zKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICBiYWlsT3V0ID0gdHJ1ZTsKQEAgLTIxMCw3ICsyMjAsOSBAQAogICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CiAgICAgcHJpbnRmKCIgICAgICAtbHtjb3VudH0gbG9vcENvdW50IHN0YXJ0L3N0b3AsIGV2ZXJ5IG90aGVyIG9uZSBpcyBzaWxlbnRcbiIpOwogICAgIHByaW50ZigiICAgICAgLXR7bXNlY30gIHBsYXkgYSBoaWdoIHBpdGNoZWQgdG9uZSBhdCB0aGUgYmVnaW5uaW5nXG4iKTsKLSAgICBwcmludGYoIiAgICAgIC16ICAgICAgICBmb3JjZSBwZXJpb2RpYyB1bmRlcnJ1bnMgYnkgc2xlZXBpbmcgaW4gY2FsbGJhY2tcbiIpOworICAgIHByaW50ZigiICAgICAgLWh7bXNlY30gIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBoYW5naW5nIGluIGNhbGxiYWNrXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBzcGVjaWZpZWQgdGhlbiAlZCB1c2VkLlxuIiwKKyAgICAgICAgICAgIGtEZWZhdWx0SGFuZ1RpbWVNU2VjKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQpAQCAtMjE5LDEzICsyMzEsMTQgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgcmVzdWx0OwogICAgIGludDMyX3QgICAgICAgICAgICBsb29wQ291bnQgPSAxOwogICAgIGludDMyX3QgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IDA7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgViVzXG4iLCBhcmd2WzBdLCBBUFBfVkVSU0lPTik7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWJXNcbiIsCisgICAgICAgIGFyZ3ZbMF0sIEFQUF9WRVJTSU9OKTsKIAogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CkBAIC0yNDAsOCArMjUzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSB0cnVlOyAgLy8gWnp6enp6egorICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IChhcmdbMl0pIC8vIHZhbHVlIHNwZWNpZmllZD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdG9pKCZhcmdbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0RlZmF1bHRIYW5nVGltZU1TZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CkBAIC0yNTcsNyArMjcyLDggQEAKICAgICB9CiAKICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KLSAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsIHByZWZpeFRvbmVNc2VjLCBmb3JjZVVuZGVycnVucykpCisgICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlciwgbG9vcENvdW50LAorICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMsIGhhbmdUaW1lTVNlYykpCiAgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCAxNDkzYjI2Li44ZTM2Yzc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0zNzMsNiArMzczLDEzIEBACiAgICAgICogc28gdGhlIHJlY29yZGVkIHZvbHVtZSBtYXkgYmUgdmVyeSBsb3cuCiAgICAgICovCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9IDksCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgZm9yIGNhcHR1cmluZyBhdWRpbyBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gcmVhbCB0aW1lCisgICAgICogYW5kIHBsYXllZCBiYWNrIGZvciBsaXZlIHBlcmZvcm1hbmNlIChlLmcga2FyYW9rZSkuCisgICAgICogVGhlIGNhcHR1cmUgcGF0aCB3aWxsIG1pbmltaXplIGxhdGVuY3kgYW5kIGNvdXBsaW5nIHdpdGggcGxheWJhY2sgcGF0aC4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19pbnB1dF9wcmVzZXRfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCmluZGV4IGI5ZTI4YTAuLjQwOTAyODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKQEAgLTYsNiArNiw3IEBACiAgICAgICAgICJjbGllbnQiLAogICAgICAgICAiY29yZSIsCiAgICAgICAgICJmaWZvIiwKKyAgICAgICAgImZsb3dncmFwaCIsCiAgICAgICAgICJsZWdhY3kiLAogICAgICAgICAidXRpbGl0eSIsCiAgICAgXSwKQEAgLTI1LDkgKzI2LDkgQEAKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0xpbmVhclJhbXAuY3BwIiwKICAgICAgICAgImZpZm8vRmlmb0J1ZmZlci5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIiwKKyAgICAgICAgImNsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCIsCkBAIC00Miw2ICs0MywxNiBAQAogICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTI0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggOTU5ZGI2MS4uM2QxYmM5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KQEAgLTM2LDYgKzQwLDcgQEAKIAogc3RhdHVzX3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogICAgIHN0YXR1c190IHN0YXR1czsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXREZXZpY2VJZCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVSYXRlKCkpOwpAQCAtNDYsNiArNTEsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwpAQCAtNjAsNyArNjYsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbCgpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODAsNyArODYsOCBAQAogICAgIHNldFNoYXJpbmdNb2RlKChhYXVkaW9fc2hhcmluZ19tb2RlX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Rm9ybWF0KChhYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKyAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKQEAgLTk5LDggKzEwNiw5IEBACiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogcmVhZCBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA2MjBlZGM3Li45YjMyNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKQEAgLTcyLDcgKzcyLDYgQEAKICAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChPUEVOX1NUUkVBTSkgcmVhZEludCAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgT1BFTl9TVFJFQU0gcGFzc2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICAgICB9CiAgICAgICAgIGVyciA9IGNvbmZpZ3VyYXRpb25PdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCAwYjBjZjc3Li42Nzk1NWU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC00Myw3ICs0Myw3IEBACiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6c2V0dXAoY29uc3QgdW5pcXVlX2ZkJiBmZCwgaW50MzJfdCBzaXplSW5CeXRlcykgewogICAgIG1GZC5yZXNldChkdXAoZmQuZ2V0KCkpKTsgLy8gc3RvcmUgYSBkdXBsaWNhdGUgZmQKLSAgICBBTE9HVigic2V0dXAoJWQgLT4gJWQsICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKKyAgICBBTE9HVigic2V0dXAoZmQgPSAlZCAtPiAlZCwgc2l6ZSA9ICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKICAgICBtU2l6ZUluQnl0ZXMgPSBzaXplSW5CeXRlczsKIH0KIApAQCAtMTA0LDcgKzEwNCw4IEBACiAgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAoMCwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewotICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgZXJybm8gPSAlcyIsIGZkLmdldCgpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgbkJ5dGVzID0gJWQsIGVycm5vID0gJXMiLAorICAgICAgICAgICAgICBmZC5nZXQoKSwgbVNpemVJbkJ5dGVzLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggODJjMjI0MC4uNGVjMzhjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC03MCw4ICs3MCw4IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmVTaGFyZWRNZW1vcnkoY29uc3QgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiBmZCk7CiAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICBtRmQ7Ci0gICAgaW50MzJfdCAgICAgbVNpemVJbkJ5dGVzID0gMDsKLSAgICB1aW50OF90ICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNpemVJbkJ5dGVzID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CiAKIHByaXZhdGU6CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDNjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9GbG93R3JhcGgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBQXVkaW9GbG93R3JhcGguaCIKKworI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMjQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvRmxvd0dyYXBoOjpjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKmxhc3RPdXRwdXQgPSBudWxscHRyOworCisgICAgQUxPR0QoIiVzKCkgc291cmNlIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCwgc2luayBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICBzd2l0Y2ggKHNvdXJjZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VGbG9hdD4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTE2Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTI0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc291cmNlIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNvdXJjZUZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQgPSAmbVNvdXJjZS0+b3V0cHV0OworCisgICAgLy8gQXBwbHkgdm9sdW1lIGFzIGEgcmFtcCB0byBhdm9pZCBwb3BzLgorICAgIG1Wb2x1bWVSYW1wID0gc3RkOjptYWtlX3VuaXF1ZTxSYW1wTGluZWFyPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Wb2x1bWVSYW1wLT5pbnB1dCk7CisgICAgbGFzdE91dHB1dCA9ICZtVm9sdW1lUmFtcC0+b3V0cHV0OworCisgICAgLy8gRm9yIGEgcHVyZSBmbG9hdCBncmFwaCwgdGhlcmUgaXMgY2hhbmNlIHRoYXQgdGhlIGRhdGEgcmFuZ2UgbWF5IGJlIHZlcnkgbGFyZ2UuCisgICAgLy8gU28gd2Ugc2hvdWxkIGNsaXAgdG8gYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgYWxsb3dzIGEgbGl0dGxlIGhlYWRyb29tLgorICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCAmJiBzaW5rRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgbUNsaXBwZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaXBUb1JhbmdlPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2xpcHBlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DbGlwcGVyLT5vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRXhwYW5kIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaWYgcmVxdWlyZWQuCisgICAgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCA9PSAxICYmIHNpbmtDaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgIG1DaGFubmVsQ29udmVydGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb25vVG9NdWx0aUNvbnZlcnRlcj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DaGFubmVsQ29udmVydGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNoYW5uZWxDb252ZXJ0ZXItPm91dHB1dDsKKyAgICB9IGVsc2UgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCAhPSBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgICAgIEFMT0dFKCIlcygpIENoYW5uZWwgcmVkdWN0aW9uIG5vdCBzdXBwb3J0ZWQuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgc3dpdGNoIChzaW5rRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rRmxvYXQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kxNj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kyND4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzaW5rIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNpbmtGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtU2luay0+aW5wdXQpOworCisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtU291cmNlLT5zZXREYXRhKHNvdXJjZSwgbnVtRnJhbWVzKTsKKyAgICBtU2luay0+cmVhZChkZXN0aW5hdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLyoqCisgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAqLwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0VGFyZ2V0KHZvbHVtZSk7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorI2RlZmluZSBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorCitjbGFzcyBBQXVkaW9GbG93R3JhcGggeworcHVibGljOgorICAgIC8qKiBDb25uZWN0IHNldmVyYWwgbW9kdWxlcyB0b2dldGhlciB0byBjb252ZXJ0IGZyb20gc291cmNlIHRvIHNpbmsuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGb3JtYXQKKyAgICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbENvdW50CisgICAgICogQHBhcmFtIHNpbmtGb3JtYXQKKyAgICAgKiBAcGFyYW0gc2lua0NoYW5uZWxDb3VudAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIHZvaWQgc2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1NvdXJjZT4gICAgICAgICAgbVNvdXJjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpSYW1wTGluZWFyPiAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6Q2xpcFRvUmFuZ2U+ICAgICAgICAgIG1DbGlwcGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6Ok1vbm9Ub011bHRpQ29udmVydGVyPiBtQ2hhbm5lbENvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1Npbms+ICAgICAgICAgICAgbVNpbms7Cit9OworCisKKyNlbmRpZiAvL0FORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCBmOGUzNGQxLi4yMTRmODg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMTk2LDcgKzE5Niw3IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikKQEAgLTIwNiwxNSArMjA2LDE1IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlV3JpdGVJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVJlYWRJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OnNldERhdGFSZWFkQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA5MjA0ODI0Li5lYzI3MGYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUludGVybmFsLmgiCiAKQEAgLTYzLDcgKzYyLDcgQEAKICAgICAgICAgLCBtU2VydmljZVN0cmVhbUhhbmRsZShBQVVESU9fSEFORExFX0lOVkFMSUQpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAoKQogICAgICAgICAsIG1XYWtldXBEZWxheU5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICAsIG1NaW5pbXVtU2xlZXBOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgIHsKQEAgLTkyLDExICs5MSwxMSBAQAogICAgIH0KIAogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCi0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KICAgICAvLyBSZXF1ZXN0IEZMT0FUIGZvciB0aGUgc2hhcmVkIG1peGVyLgotICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgIHJlcXVlc3Quc2V0VXNlcklkKGdldHVpZCgpKTsKQEAgLTEyNiwxMyArMTI1LDEyIEBACiAgICAgICAgIC8vIGlmIHRoYXQgZmFpbGVkIHRoZW4gdHJ5IHN3aXRjaGluZyBmcm9tIG1vbm8gdG8gc3RlcmVvIGlmIE9VVFBVVC4KICAgICAgICAgLy8gT25seSBkbyB0aGlzIGluIHRoZSBjbGllbnQuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBhIG1vbm8gbWl4ZXIgaW4gdGhlIHNlcnZpY2UKICAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCi0gICAgICAgIEFMT0dEKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKKyAgICAgICAgQUxPR0QoIiVzKCkgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZSgyKTsgLy8gc3RlcmVvCiAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewotICAgICAgICBBTE9HRSgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CiAgICAgfQogCkBAIC0yMTIsOSArMjEwLDcgQEAKICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBieXRlc1BlckZyYW1lOworICAgICAgICBjb25zdCBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbmV3IHVpbnQ4X3RbY2FsbGJhY2tCdWZmZXJTaXplXTsKICAgICB9CiAKQEAgLTM1Myw4ICszNDksNyBAQAogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkKLXsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM2OCw3ICszNjMsNyBAQAogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CkBAIC00MTcsOCArNDEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICAvLyBHZW5lcmF0ZWQgaW4gc2VydmVyIGFuZCBwYXNzZWQgdG8gY2xpZW50LiBSZXR1cm4gbGF0ZXN0LgotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgIGludDY0X3QgcG9zaXRpb24gPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKICAgICAgICAgaWYgKHBvc2l0aW9uID49IDApIHsKICAgICAgICAgICAgICpmcmFtZVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC00NjUsNyArNDYwLDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKG1lc3NhZ2UtPnRpbWVzdGFtcC5wb3NpdGlvbiwgbWVzc2FnZS0+dGltZXN0YW1wLnRpbWVzdGFtcCk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTY5Niw3ICs2OTEsNiBAQAogICAgIH0KIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQXVkaW9FbmRwb2ludC5zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWRqdXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOwotICAgIEFMT0dEKCJzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewpAQCAtNzE5LDMgKzcxMyw3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwogfQorCitib29sIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBY3RpdmUoKSAmJiBtQXVkaW9FbmRwb2ludC5pc0ZyZWVSdW5uaW5nKCkgJiYgbUNsb2NrTW9kZWwuaXNSdW5uaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMDQyNWNkNS4uODZjNDY5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb0VuZHBvaW50LmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwpAQCAtMTQ1LDYgKzE0NCwxNCBAQAogICAgICAqLwogICAgIGJvb2wgaXNJblNlcnZpY2UoKSBjb25zdCB7IHJldHVybiBtSW5TZXJ2aWNlOyB9CiAKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc2VydmljZSBGSUZPIHBvc2l0aW9uIGN1cnJlbnRseSBjb250cm9sbGVkIGJ5IHRoZSBBQXVkaW8gc2VydmljZSBvciBIQUwsCisgICAgICogb3Igc2V0IGJhc2VkIG9uIHRoZSBDbG9jayBNb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQ2xvY2tNb2RlbCBpcyBjdXJyZW50bHkgZGV0ZXJtaW5pbmcgdGhlIEZJRk8gcG9zaXRpb24KKyAgICAgKi8KKyAgICBib29sIGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0OworCiAgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsICAgIG1DbG9ja01vZGVsOyAgICAgIC8vIHRpbWluZyBtb2RlbCBmb3IgY2hhc2luZyB0aGUgSEFMCiAKICAgICBBdWRpb0VuZHBvaW50ICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQ7ICAgLy8gc291cmNlIGZvciByZWFkcyBvciBzaW5rIGZvciB3cml0ZXMKQEAgLTE2NCw3ICsxNzEsNyBAQAogCiAgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJm1TZXJ2aWNlSW50ZXJmYWNlOyAgIC8vIGFic3RyYWN0IGludGVyZmFjZSB0byB0aGUgc2VydmljZQogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcDsKIAogICAgIEF0b21pY1JlcXVlc3RvciAgICAgICAgICBtTmVlZENhdGNoVXA7ICAgLy8gQXNrIHJlYWQoKSBvciB3cml0ZSgpIHRvIHN5bmMgb24gZmlyc3QgdGltZXN0YW1wLgogCkBAIC0xOTMsNiArMjAwLDggQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CiAKKyAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQgZnJvbSB0aGUgYXBwLgorICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbURldmljZUNoYW5uZWxDb3VudCA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggMDcxOWZlMS4uYTZjYzQ1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKQEAgLTE2NSwzNSArMTY2LDM2IEBACiAgICAgLy8gUmVhZCBkYXRhIGluIG9uZSBvciB0d28gcGFydHMuCiAgICAgZm9yIChpbnQgcGFydEluZGV4ID0gMDsgZnJhbWVzTGVmdCA+IDAgJiYgcGFydEluZGV4IDwgV3JhcHBpbmdCdWZmZXI6OlNJWkU7IHBhcnRJbmRleCsrKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzTGVmdDsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKICAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA8PSAwKSBicmVhazsKIAogICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gZnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNBdmFpbGFibGU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOwotICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGRlc3RpbmF0aW9uRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CiAgICAgICAgIC8vIFRPRE8gZmFjdG9yIHRoaXMgb3V0IGludG8gYSB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBnZXRGb3JtYXQoKSkgeworICAgICAgICBpZiAoc291cmNlRm9ybWF0ID09IGRlc3RpbmF0aW9uRm9ybWF0KSB7CiAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgbnVtQnl0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIEZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIGF1ZGlvX2Zvcm1hdF90IHNvdXJjZSA9ICV1LCBkZXN0ID0gJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIGRlc3RpbmF0aW9uRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIH0KICAgICAgICAgZGVzdGluYXRpb24gKz0gbnVtQnl0ZXM7CkBAIC0yMDgsMTcgKzIxMCwxMiBAQAogfQogCiBpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpnZXRGcmFtZXNXcml0dGVuKCkgewotICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbkhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7Ci0gICAgfQotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpOworICAgIC8vIEFkZCBzZXJ2aWNlIG9mZnNldCBhbmQgcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBzdGQ6Om1heChtTGFzdEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKLSAgICAvL0FMT0dEKCJnZXRGcmFtZXNXcml0dGVuKCkgcmV0dXJucyAlbGxkIiwKLSAgICAvLyAgICAgIChsb25nIGxvbmcpbUxhc3RGcmFtZXNXcml0dGVuKTsKICAgICByZXR1cm4gbUxhc3RGcmFtZXNXcml0dGVuOwogfQogCkBAIC0yNTYsNyArMjUzLDggQEAKICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXN1bHQgPSBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCA3OTViYTJjLi5lMTQ0M2Q5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC00Myw5ICs0MywxNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGJ1aWxkZXIpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHJlc3VsdCA9IG1GbG93R3JhcGguY29uZmlndXJlKGdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgICAvLyBTYW1wbGUgcmF0ZSBpcyBjb25zdHJhaW5lZCB0byBjb21tb24gdmFsdWVzIGJ5IG5vdyBhbmQgc2hvdWxkIG5vdCBvdmVyZmxvdy4KICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBrUmFtcE1TZWMgKiBnZXRTYW1wbGVSYXRlKCkgLyBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQ7Ci0gICAgICAgIG1Wb2x1bWVSYW1wLnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgICAgIG1GbG93R3JhcGguc2V0UmFtcExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC02Myw3ICs3MSw3IEBACiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5jbGVhcigpOwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTIxNiwyMiArMjI0LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1dyaXRlOwotICAgICAgICAgICAgLy8gRGF0YSBjb252ZXJzaW9uLgotICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tOwotICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbzsKLSAgICAgICAgICAgIG1Wb2x1bWVSYW1wLm5leHRTZWdtZW50KGZyYW1lc1RvV3JpdGUsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKIAotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopYnl0ZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgZGVzdGluYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKLQotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydChzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sIGxldmVsVG8pOworICAgICAgICAgICAgbUZsb3dHcmFwaC5wcm9jZXNzKCh2b2lkICopYnl0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9Xcml0ZSk7CiAKICAgICAgICAgICAgIGJ5dGVCdWZmZXIgKz0gbnVtQnl0ZXM7CiAgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvV3JpdGU7CkBAIC0yNDYsMjcgKzI0MiwxNyBAQAogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNSZWFkKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1JlYWRIYXJkd2FyZTsKLSAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWVzUmVhZEhhcmR3YXJlID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7Ci0gICAgfQotICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IGZyYW1lc1JlYWRIYXJkd2FyZSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvLyBQcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgotICAgIGlmIChmcmFtZXNSZWFkIDwgbUxhc3RGcmFtZXNSZWFkKSB7Ci0gICAgICAgIGZyYW1lc1JlYWQgPSBtTGFzdEZyYW1lc1JlYWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gZnJhbWVzUmVhZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7CitpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNSZWFkKCkgeworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlID0gaXNDbG9ja01vZGVsSW5Db250cm9sKCkKKyAgICAgICAgICAgID8gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpCisgICAgICAgICAgICA6IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpOworICAgIC8vIEFkZCBzZXJ2aWNlIG9mZnNldCBhbmQgcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBtTGFzdEZyYW1lc1JlYWQgPSBzdGQ6Om1heChtTGFzdEZyYW1lc1JlYWQsIGZyYW1lc1JlYWRIYXJkd2FyZSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7CisgICAgcmV0dXJuIG1MYXN0RnJhbWVzUmVhZDsKIH0KIAotaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzV3JpdHRlbigpCi17Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCitpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkgeworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQpAQCAtMjk3LDcgKzI4Myw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMzEzLDYgKzMwMCw2IEBACiAgICAgZmxvYXQgY29tYmluZWRWb2x1bWUgPSBtU3RyZWFtVm9sdW1lICogZ2V0RHVja0FuZE11dGVWb2x1bWUoKTsKICAgICBBTE9HRCgiJXMoKSBtU3RyZWFtVm9sdW1lICogZHVja0FuZE11dGVWb2x1bWUgPSAlZiAqICVmID0gJWYiLAogICAgICAgICAgIF9fZnVuY19fLCBtU3RyZWFtVm9sdW1lLCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpLCBjb21iaW5lZFZvbHVtZSk7Ci0gICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KGNvbWJpbmVkVm9sdW1lKTsKKyAgICBtRmxvd0dyYXBoLnNldFRhcmdldFZvbHVtZShjb21iaW5lZFZvbHVtZSk7CiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKaW5kZXggOTc3YTkwOS4uY2FiMjk0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwpAQCAtOTMsNyArOTQsNyBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVzUmVhZCA9IDA7IC8vIHVzZWQgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbgogCi0gICAgTGluZWFyUmFtcCAgICAgICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIEFBdWRpb0Zsb3dHcmFwaCAgICAgICAgICBtRmxvd0dyYXBoOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCA5NWI1MmJlLi43NDdkMGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTYwLDEwICs2MCwxNCBAQAogICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiB9CiAKLWJvb2wgSXNvY2hyb25vdXNDbG9ja01vZGVsOjppc1N0YXJ0aW5nKCkgeworYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzUnVubmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkc7Cit9CisKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpwcm9jZXNzVGltZXN0YW1wKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50NjRfdCBuYW5vVGltZSkgewogLy8gICAgQUxPR0QoInByb2Nlc3NUaW1lc3RhbXAoKSAtIGZyYW1lUG9zaXRpb24gPSAlbGxkIGF0IG5hbm9UaW1lICVsbHUiLAogLy8gICAgICAgICAobG9uZyBsb25nKWZyYW1lUG9zaXRpb24sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCmluZGV4IDcxODIzNzYuLjQ2Y2E0OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCkBAIC0zNiw3ICszNiwxNSBAQAogICAgIHZvaWQgc3RhcnQoaW50NjRfdCBuYW5vVGltZSk7CiAgICAgdm9pZCBzdG9wKGludDY0X3QgbmFub1RpbWUpOwogCi0gICAgYm9vbCBpc1N0YXJ0aW5nKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBzdGFydGluZyB1cAorICAgICAqLworICAgIGJvb2wgaXNTdGFydGluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBydW5uaW5nIGFuZCBwcm9kdWNpbmcgdmFsaWQgcmVzdWx0cworICAgICAqLworICAgIGJvb2wgaXNSdW5uaW5nKCkgY29uc3Q7CiAKICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggZGYwZGI3OS4uMGQ3MWVmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNDYsMTQgKzE0NiwxNCBAQAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCiB7Ci0gICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCiB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0xNjcsNyArMTY3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGV2ZXJ5d2hlcmUgaW50ZXJuYWxseS4KKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChmb3JtYXQpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0yMzksNyArMjQxLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIC8vIFBsZWFzZSBsZWF2ZSB0aGVzZSBsb2dzIGJlY2F1c2UgdGhleSBhcmUgdmVyeSBoZWxwZnVsIHdoZW4gZGVidWdnaW5nLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIEFMT0dEKCIlcygpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18pOwogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IENPTU1PTl9HRVRfRlJPTV9CVUlMREVSX09SX1JFVFVSTihzdHJlYW1QdHIpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdHJlYW1CdWlsZGVyLT5idWlsZCgmYXVkaW9TdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCkBAIC0yNjcsNyArMjY5LDcgQEAKIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZUNsb3NlKCk7CiAgICAgICAgIC8vIENsb3NlIHdpbGwgb25seSBmYWlsIGlmIGNhbGxlZCBpbGxlZ2FsbHksIGZvciBleGFtcGxlLCBmcm9tIGEgY2FsbGJhY2suCkBAIC0yODIsNyArMjg0LDcgQEAKICAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBmcmVlaW5nIGBzdHJlYW1gIGFib3ZlLCBzbyBpdHMgdXNlIGhlcmUgbWFrZXMgc29tZQogICAgIC8vIHN0YXRpYyBhbmFseXNpcyB0b29scyB1bmhhcHB5LiBDYXN0aW5nIHRvIHVpbnRwdHJfdCBoZWxwcyBhc3N1cmUKICAgICAvLyBzYWlkIHRvb2xzIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIGJhZCBoZXJlLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwKKyAgICBBTE9HRCgiJXMoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwgX19mdW5jX18sCiAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0cmVhbSksIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI5MCwzMSArMjkyLDMxIEBACiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdGFydCgpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBzdHJlYW0sIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtUGF1c2UoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zYWZlRmx1c2goKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoJXApIiwgc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVN0b3AoKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTQwOCw3ICs0MTAsOSBAQAogQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGludGVybmFsbHkuCisgICAgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggZDU2NzAxYi4uODhkYTUzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtNDgsNiArNDgsMjAgQEAKICAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OwogfQogCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGlzRm9ybWF0VmFsaWQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkLCBhdWRpb19mb3JtYXRfdCA9IDB4JTA4eCIsIGZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc5LDE2ICs5Myw4IEBACiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1BdWRpb0Zvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkID0gJWQiLCBtQXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgICAgIC8vIGJyZWFrOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gaXNGb3JtYXRWYWxpZCAobUF1ZGlvRm9ybWF0KTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgcmV0dXJuIHJlc3VsdDsKIAogICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVSYXRlIDwgU0FNUExFX1JBVEVfSFpfTUlOIHx8IG1TYW1wbGVSYXRlID4gU0FNUExFX1JBVEVfSFpfTUFYKSkgewpAQCAtMTUyLDYgKzE1OCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OOgogICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgcHJlc2V0IG5vdCB2YWxpZCA9ICVkIiwgbUlucHV0UHJlc2V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCmluZGV4IGNlNWRhY2QuLjZiZWI0YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaApAQCAtNTYsMTEgKzU2LDExIEBACiAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQXVkaW9Gb3JtYXQ7CiAgICAgfQogCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CisgICAgdm9pZCBzZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKICAgICAgICAgbUF1ZGlvRm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAgICAgfQogCkBAIC0xMjAsOCArMTIwLDExIEBACiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiBieXRlcyBwZXIgZnJhbWUgb2YgZ2V0Rm9ybWF0KCkKKyAgICAgKi8KICAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0Rm9ybWF0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM5LDcgKzE0Miw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgIG1TaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgbURpcmVjdGlvbiAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDM1ODAyMWIuLmUzOWEwNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMzcsNyArMzcsNiBAQAogfQogCiBBdWRpb1N0cmVhbTo6fkF1ZGlvU3RyZWFtKCkgewotICAgIEFMT0dEKCJkZXN0cm95aW5nICVwLCBzdGF0ZSA9ICVzIiwgdGhpcywgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTEyMCwyMSArMTE5LDI5IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RhcnQoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0YXJ0KCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgcmV0dXJuIHJlcXVlc3RTdGFydCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RTdGFydCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0YXJ0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVBhdXNlKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1QYXVzZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisKICAgICBpZiAoIWlzUGF1c2VTdXBwb3J0ZWQoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CiAgICAgfQogCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTE3MCw3ICsxNzcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVxdWVzdFBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RQYXVzZSgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnBhdXNlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUZsdXNoKCkgewpAQCAtMTkzLDEyICsyMDUsMzEgQEAKICAgICByZXR1cm4gcmVxdWVzdEZsdXNoKCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUFwcCgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKLSAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgc3RvcHBlZCBmcm9tIGEgY2FsbGJhY2shIik7CisgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkgewogCiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBzdG9wcGluZy4KQEAgLTIyNSw3ICsyNTYsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORzoKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRDoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJyZXF1ZXN0U3RvcCgpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiJXMoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KQEAgLTM1MCwyMSArMzgxLDMzIEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMgX191bnVzZWQpCiB7CiAgICAgaWYgKCFtSGFzVGhyZWFkKSB7CiAgICAgICAgIEFMT0dFKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgLy8gSWYgdGhlIGNhbGxiYWNrIGlzIHN0b3BwaW5nIHRoZSBzdHJlYW0gYmVjYXVzZSB0aGUgYXBwIHBhc3NlZCBiYWNrIFNUT1AKKyAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gam9pbigpLiBUaGUgdGhyZWFkIGlzIGFscmVhZHkgYWJvdXQgdG8gZXhpdC4KKyAgICBpZiAocHRocmVhZF9zZWxmKCkgIT0gbVRocmVhZCkgeworICAgICAgICAvLyBDYWxsZWQgZnJvbSBhbiBhcHAgdGhyZWFkLiBOb3QgdGhlIGNhbGxiYWNrLgogI2lmIDAKLSAgICAvLyBUT0RPIGltcGxlbWVudCBlcXVpdmFsZW50IG9mIHB0aHJlYWRfdGltZWRqb2luX25wKCkKLSAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLSAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7CisgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKKyAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOwogI2Vsc2UKLSAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgcmV0dXJuQXJnKTsKICNlbmRpZgorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBwdGhyZWFkX2pvaW4oKSByZXR1cm5zIGVyciA9ICVkIiwgX19mdW5jX18sIGVycik7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIG11c3QgYmUgc2V0IGZhbHNlIHNvIHRoYXQgdGhlIGNhbGxiYWNrIHRocmVhZCBjYW4gYmUgY3JlYXRlZAorICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCiAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHJldHVybiBlcnIgPyBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJybm8pIDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKKyAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gcmVzdWx0IDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKIH0KIAogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQXVkaW9TdHJlYW06Om1heWJlQ2FsbERhdGFDYWxsYmFjayh2b2lkICphdWRpb0RhdGEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDMxYjg5NWMuLjQ2OTUxZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC01MSwyMSArNTEsNiBAQAogCiAgICAgdmlydHVhbCB+QXVkaW9TdHJlYW0oKTsKIAotICAgIC8qKgotICAgICAqIExvY2sgYSBtdXRleCBhbmQgbWFrZSBzdXJlIHdlIGFyZSBub3QgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgcmVxdWVzdFN0YXJ0KCk7Ci0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdGFydCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVQYXVzZSgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVGbHVzaCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7Ci0KLSAgICAvLyA9PT09PT09PT09PSBCZWdpbiBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQogcHJvdGVjdGVkOgogCiAgICAgLyogQXN5bmNocm9ub3VzIHJlcXVlc3RzLgpAQCAtNzQsNyArNTksNyBAQAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydCgpID0gMDsKIAogICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaWYgY3VycmVudGx5IGxlZ2FsLgorICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaXMgY3VycmVudGx5IGxlZ2FsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBwb2ludGVyIHRvIHJldHVybiBjb2RlCiAgICAgICogQHJldHVybiB0cnVlIGlmIE9LIHRvIGNvbnRpbnVlLCBpZiBmYWxzZSB0aGVuIHJldHVybiByZXN1bHQKQEAgLTE5Miw3ICsxNzcsNyBAQAogICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgfQogCkBAIC0yNDksMjEgKzIzNCwxNCBAQAogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhtRm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXREZXZpY2VGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXREZXZpY2VGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0RGV2aWNlRm9ybWF0KCkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgPSAwOwpAQCAtMzYzLDMzICszNDEsMjggQEAKICAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CiAgICAgfQogCi0gICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKLSAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCi0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdGFydCgpOwogCi0gICAgLy8gUGFzcyBwYXVzZSByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCk7CiAKLSAgICAvLyBQYXNzIHN0b3AgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgotICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RvcCgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGFwcCBjYWxscyBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKTsKKyAgICAgKiBJdCBwcmV2ZW50cyBjYWxscyBmcm9tIGEgY2FsbGJhY2suCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQXBwKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gYW4gYXBwIGNhbGxiYWNrIHJldHVybnMgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7CiAKIHByb3RlY3RlZDoKIAotICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgotICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KLSAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KLSAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbSB2b2x1bWUuCiAgICAgY2xhc3MgTXlQbGF5ZXJCYXNlIDogcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgTXlQbGF5ZXJCYXNlKEF1ZGlvU3RyZWFtICpwYXJlbnQpOwpAQCAtNDEzLDIwICszODYsMTkgQEAKIAogICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdGFydCBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvLyBtUGFyZW50IHNob3VsZCBOT1QgYmUgbnVsbC4gU28gZ28gYWhlYWQgYW5kIGNyYXNoIGlmIGl0IGlzLgotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHBhdXNlIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlUGF1c2UoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdG9wIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdG9wKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdG9wKCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTZXRWb2x1bWUoKSBvdmVycmlkZSB7CkBAIC00NzgsMTggKzQ1MCwxOCBAQAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldERldmljZUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlRm9ybWF0OwogICAgIH0KIApAQCAtNTU1LDYgKzUyNyw4IEBACiAKIHByaXZhdGU6CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKKwogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOwogCiAgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOwpAQCAtNTY1LDcgKzUzOSw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKQEAgLTU3Nyw3ICs1NTEsNyBAQAogCiAgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgYXBwLgogICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAogICAgIC8vIGNhbGxiYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IGIwOTI1OGUuLmY1MTEzZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIzLDMwICsyMywyNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIgogI2luY2x1ZGUgIkZpZm9CdWZmZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7IC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdDsKIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCi0gICAgICAgICwgbVN0b3JhZ2UobnVsbHB0cikKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCiB7Ci0gICAgLy8gVE9ETyBIYW5kbGUgcG9zc2libGUgZmFpbHVyZXMgdG8gYWxsb2NhdGUuIE1vdmUgb3V0IG9mIGNvbnN0cnVjdG9yPwotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVyKGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOworICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlcj4oY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwogICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwogICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOwotICAgIEFMT0dWKCJjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCi0gICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgQUxPR1YoIiVzKCkgY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKIH0KIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlciggaW50MzJfdCAgIGJ5dGVzUGVyRnJhbWUsCkBAIC01NSwxNCArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICogIHdyaXRlSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICBkYXRhU3RvcmFnZUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKICAgICAgICAgLCBtU3RvcmFnZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KGRhdGFTdG9yYWdlQWRkcmVzcykpCi0gICAgICAgICwgbUZyYW1lc1JlYWRDb3VudCgwKQotICAgICAgICAsIG1GcmFtZXNVbmRlcnJ1bkNvdW50KDApCi0gICAgICAgICwgbVVuZGVycnVuQ291bnQoMCkKIHsKLSAgICBtRmlmbyA9IG5ldyBGaWZvQ29udHJvbGxlckluZGlyZWN0KGNhcGFjaXR5SW5GcmFtZXMsCisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVySW5kaXJlY3Q+KGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXhBZGRyZXNzKTsKQEAgLTczLDEwICs2NSw4IEBACiAgICAgaWYgKG1TdG9yYWdlT3duZWQpIHsKICAgICAgICAgZGVsZXRlW10gbVN0b3JhZ2U7CiAgICAgfQotICAgIGRlbGV0ZSBtRmlmbzsKIH0KIAotCiBpbnQzMl90IEZpZm9CdWZmZXI6OmNvbnZlcnRGcmFtZXNUb0J5dGVzKGZpZm9fZnJhbWVzX3QgZnJhbWVzKSB7CiAgICAgcmV0dXJuIGZyYW1lcyAqIG1CeXRlc1BlckZyYW1lOwogfQpAQCAtODcsMTEgKzc3LDEyIEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KLSAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CisgICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBjYXBhY2l0eSkgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7Ci0gICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IGNhcGFjaXR5IC0gc3RhcnRJbmRleDsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmaXJzdEZyYW1lczsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gJm1TdG9yYWdlWzBdOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IGZyYW1lc0F2YWlsYWJsZSAtIGZpcnN0RnJhbWVzOwpAQCAtMTA3LDcgKzk4LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRGdWxsRGF0YUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWZvLT5nZXRDYXBhY2l0eSgpKTsKICAgICBmaWZvX2ZyYW1lc190IHN0YXJ0SW5kZXggPSBtRmlmby0+Z2V0UmVhZEluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMTUsNyArMTA3LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7CiAgICAgLy8gVGhlIEZJRk8gbWlnaHQgaGF2ZSB1bmRlcnJ1biBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksIG1GcmFtZUNhcGFjaXR5KTsKKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xODMsMjMgKzE3Niw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6cmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7Ci0gICAgbUxhc3RSZWFkU2l6ZSA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNSZWFkID0gcmVhZChidWZmZXIsIG51bUZyYW1lcyk7Ci0gICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNSZWFkQ291bnQgKz0gZnJhbWVzUmVhZDsKLSAgICBtRnJhbWVzVW5kZXJydW5Db3VudCArPSBmcmFtZXNMZWZ0OwotICAgIC8vIFplcm8gb3V0IGFueSBzYW1wbGVzIHdlIGNvdWxkIG5vdCBzZXQuCi0gICAgaWYgKGZyYW1lc0xlZnQgPiAwKSB7Ci0gICAgICAgIG1VbmRlcnJ1bkNvdW50Kys7Ci0gICAgICAgIGludDMyX3QgYnl0ZXNUb1plcm8gPSBjb252ZXJ0RnJhbWVzVG9CeXRlcyhmcmFtZXNMZWZ0KTsKLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNUb1plcm8pOwotICAgIH0KLQotICAgIHJldHVybiBmcmFtZXNSZWFkOwotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldFRocmVzaG9sZCgpIHsKICAgICByZXR1cm4gbUZpZm8tPmdldFRocmVzaG9sZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKaW5kZXggZjVhOWUyNy4uMGQxODhjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEZJRk9fRklGT19CVUZGRVJfSAogI2RlZmluZSBGSUZPX0ZJRk9fQlVGRkVSX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgpAQCAtNzcsMjQgKzc4LDEyIEBACiAgICAgICovCiAgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKTsKIAotICAgIC8qKgotICAgICAqIENvcHkgZGF0YSBmcm9tIHRoZSBGSUZPIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogQHBhcmFtIG51bUZyYW1lcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBmaWZvX2ZyYW1lc190IHJlYWROb3codm9pZCAqYnVmZmVyLCBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7Ci0KLSAgICBpbnQ2NF90IGdldE5leHRSZWFkVGltZShpbnQzMl90IGZyYW1lUmF0ZSk7Ci0KLSAgICBpbnQzMl90IGdldFVuZGVycnVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtVW5kZXJydW5Db3VudDsgfQotCi0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICpnZXRGaWZvQ29udHJvbGxlckJhc2UoKSB7IHJldHVybiBtRmlmbzsgfQotCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgewogICAgICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiAgICAgfQogCisgICAgLy8gUHJveHkgbWV0aG9kcyBmb3IgdGhlIGludGVybmFsIEZpZm9Db250cm9sbGVyCisKICAgICBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIHsKICAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRSZWFkQ291bnRlcigpOwogICAgIH0KQEAgLTExMSw2ICsxMDAsMjIgQEAKICAgICAgICAgbUZpZm8tPnNldFdyaXRlQ291bnRlcihuKTsKICAgICB9CiAKKyAgICB2b2lkIGFkdmFuY2VSZWFkSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VSZWFkSW5kZXgobnVtRnJhbWVzKTsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZUluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1GaWZvLT5hZHZhbmNlV3JpdGVJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICBmaWZvX2ZyYW1lc190IGdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKwogICAgIC8qCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KICAgICAgKi8KQEAgLTEyMSwxNSArMTI2LDEyIEBACiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlLCBpbnQzMl90IHN0YXJ0SW5kZXgpOwogCi0gICAgY29uc3QgZmlmb19mcmFtZXNfdCBtRnJhbWVDYXBhY2l0eTsKLSAgICBjb25zdCBpbnQzMl90IG1CeXRlc1BlckZyYW1lOwotICAgIHVpbnQ4X3QgKm1TdG9yYWdlOwotICAgIGJvb2wgbVN0b3JhZ2VPd25lZDsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPwotICAgIEZpZm9Db250cm9sbGVyQmFzZSAqbUZpZm87Ci0gICAgZmlmb19jb3VudGVyX3QgbUZyYW1lc1JlYWRDb3VudDsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzVW5kZXJydW5Db3VudDsKLSAgICBpbnQzMl90IG1VbmRlcnJ1bkNvdW50OyAvLyBuZWVkPyBqdXN0IHVzZSBmcmFtZXMKLSAgICBpbnQzMl90IG1MYXN0UmVhZFNpemU7CisgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZTsKKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgc3RkOjp1bmlxdWVfcHRyIGZvciBtU3RvcmFnZSBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgcG9pbnRlciB0bworICAgIC8vIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIGNhbm5vdCBiZSBkZWxldGVkIHRyaXZpYWxseS4KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgKm1TdG9yYWdlID0gbnVsbHB0cjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWZvQ29udHJvbGxlckJhc2U+IG1GaWZve307CiB9OwogCiB9ICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCmluZGV4IDc5ZDk4YTEuLjA1N2E5NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCkBAIC0zMCw3ICszMCw3IEBACiBjbGFzcyBGaWZvQ29udHJvbGxlciA6IHB1YmxpYyBGaWZvQ29udHJvbGxlckJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWZvQ29udHJvbGxlcihmaWZvX2NvdW50ZXJfdCBidWZmZXJTaXplLCBmaWZvX2NvdW50ZXJfdCB0aHJlc2hvbGQpCisgICAgRmlmb0NvbnRyb2xsZXIoZmlmb19mcmFtZXNfdCBidWZmZXJTaXplLCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkKICAgICA6IEZpZm9Db250cm9sbGVyQmFzZShidWZmZXJTaXplLCB0aHJlc2hvbGQpCiAgICAgLCBtUmVhZENvdW50ZXIoMCkKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggNTFhOGUzNC4uNjZlMjQ3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTU5LDUgKzU5LDEwIEBACiB9CiAKIHZvaWQgRmlmb0NvbnRyb2xsZXJCYXNlOjpzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpIHsKKyAgICBpZiAodGhyZXNob2xkID4gbUNhcGFjaXR5KSB7CisgICAgICAgIHRocmVzaG9sZCA9IG1DYXBhY2l0eTsKKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDApIHsKKyAgICAgICAgdGhyZXNob2xkID0gMDsKKyAgICB9CiAgICAgbVRocmVzaG9sZCA9IHRocmVzaG9sZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAppbmRleCA2NGFmNzc3Li4xZWRiOGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCkBAIC0xMDIsNiArMTAyLDkgQEAKICAgICAvKioKICAgICAgKiBZb3UgY2FuIHJlcXVlc3QgdGhhdCB0aGUgYnVmZmVyIG5vdCBiZSBmaWxsZWQgYWJvdmUgYSBtYXhpbXVtCiAgICAgICogbnVtYmVyIG9mIGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoZSB0aHJlc2hvbGQgd2lsbCBiZSBjbGlwcGVkIGJldHdlZW4gemVybyBhbmQgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgogICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgICAqLwogICAgIHZvaWQgc2V0VGhyZXNob2xkKGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjdmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvUHJvY2Vzc29yQmFzZTo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGlmIChmcmFtZVBvc2l0aW9uID4gbUxhc3RGcmFtZVBvc2l0aW9uKSB7CisgICAgICAgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CisgICAgICAgIG1GcmFtZXNWYWxpZCA9IG9uUHJvY2VzcyhmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gbUZyYW1lc1ZhbGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQXVkaW9GbG9hdEJsb2NrUG9ydDo6QXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrKQorICAgICAgICA6IEF1ZGlvUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgLCBtRnJhbWVzUGVyQmxvY2soZnJhbWVzUGVyQmxvY2spCisgICAgICAgICwgbVNhbXBsZUJsb2NrKE5VTEwpIHsKKyAgICBpbnQzMl90IG51bUZsb2F0cyA9IGZyYW1lc1BlckJsb2NrICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgbVNhbXBsZUJsb2NrID0gbmV3IGZsb2F0W251bUZsb2F0c117MC4wZn07Cit9CisKK0F1ZGlvRmxvYXRCbG9ja1BvcnQ6On5BdWRpb0Zsb2F0QmxvY2tQb3J0KCkgeworICAgIGRlbGV0ZVtdIG1TYW1wbGVCbG9jazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBudW1GcmFtZXMgPSBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpOworICAgIHJldHVybiBtUGFyZW50LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8vIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIC5jcHAgZmlsZSBiZWNhdXNlIG9mIGZvcndhcmQgY3Jvc3MgcmVmZXJlbmNlcy4KK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmNvbm5lY3QodGhpcyk7Cit9CisKK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvRmxvYXRJbnB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gTlVMTCkKKyAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKQorICAgICAgICAgICAgOiBtQ29ubmVjdGVkLT5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworfQorCitmbG9hdCAqQXVkaW9GbG9hdElucHV0UG9ydDo6Z2V0QmxvY2soKSB7CisgICAgaWYgKG1Db25uZWN0ZWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2soKTsgLy8gbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUNvbm5lY3RlZC0+Z2V0QmxvY2soKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvU2luazo6cHVsbChpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgYWN0dWFsRnJhbWVzID0gaW5wdXQucHVsbERhdGEobUZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgbUZyYW1lUG9zaXRpb24gKz0gYWN0dWFsRnJhbWVzOworICAgIHJldHVybiBhY3R1YWxGcmFtZXM7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE0NmFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBBdWRpb1Byb2Nlc3NvckJhc2UuaAorICoKKyAqIEF1ZGlvIHByb2Nlc3Npbmcgbm9kZSBhbmQgcG9ydHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbXBsZSBkYXRhIGZsb3cgZ3JhcGguCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIFRPRE8gY29uc2lkZXIgcHVibGlzaGluZyBhbGwgaGVhZGVyIGZpbGVzIHVuZGVyICJpbmNsdWRlL2xpYmFhdWRpby9GbG93R3JhcGguaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEF1ZGlvRmxvYXRCbG9ja1BvcnQgaXMgY3JlYXRlZC4KKy8vIElmIGl0IGlzIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgaGF2ZSB0b28gbXVjaCBvdmVyaGVhZCBmcm9tIHN3aXRjaGluZyBiZXR3ZWVuIG5vZGVzLgorLy8gSWYgaXQgaXMgdG9vIGhpZ2ggdGhlbiB3ZSB3aWxsIHRocmFzaCB0aGUgY2FjaGVzLgorY29uc3RleHByIGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQorCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1Byb2Nlc3NvckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGN1c3RvbSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBmcmFtZVBvc2l0aW9uIGlzIGF0IG9yIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHBvc2l0aW9uIHRoZW4gY2FsbCBvblByb2Nlc3MoKS4KKyAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCisgICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGludDY0X3QgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IC0xOyAvLyBTdGFydCBhdCAtMSBzbyB0aGF0IHRoZSBmaXJzdCBwdWxsIHdvcmtzLgorCitwcml2YXRlOgorICAgIGludDMyX3QgIG1GcmFtZXNWYWxpZCA9IDA7IC8vIG51bSB2YWxpZCBmcmFtZXMgaW4gdGhlIGJsb2NrCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgorICAqLworY2xhc3MgQXVkaW9Qb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkKKyAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgorICAgIEF1ZGlvUG9ydChjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKyAgICBBdWRpb1BvcnQmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKworICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQ7CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtU2FtcGxlc1BlckZyYW1lID0gMTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFRoaXMgcG9ydCBjb250YWlucyBhIGZsb2F0IHR5cGUgYnVmZmVyLgorICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQmxvY2sgKiBzYW1wbGVzUGVyRnJhbWUpLgorICovCitjbGFzcyBBdWRpb0Zsb2F0QmxvY2tQb3J0ICA6IHB1YmxpYyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50LAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2sgPSBrRGVmYXVsdEJsb2NrU2l6ZQorICAgICAgICAgICAgICAgICk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0QmxvY2tQb3J0KCk7CisKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJsb2NrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJsb2NrOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCAqZ2V0QmxvY2soKSB7CisgICAgICAgIHJldHVybiBtU2FtcGxlQmxvY2s7CisgICAgfQorCisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQmxvY2sgPSAxOworICAgIGZsb2F0ICAgICAgICAgICAqbVNhbXBsZUJsb2NrID0gbnVsbHB0cjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhlIHJlc3VsdHMgb2YgYSBtb2R1bGUgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG9mIHRoZSBvdXRwdXQgcG9ydHMuCisgICovCitjbGFzcyBBdWRpb0Zsb2F0T3V0cHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0T3V0cHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIHVzaW5nIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrOworCisgICAgLyoqCisgICAgICogQ2FsbCB0aGUgcGFyZW50IG1vZHVsZSdzIG9uUHJvY2VzcygpIG1ldGhvZC4KKyAgICAgKiBUaGF0IG1heSBwdWxsIGRhdGEgZnJvbSBpdHMgaW5wdXRzIGFuZCByZWN1cnNpdmVseQorICAgICAqIHByb2Nlc3MgdGhlIGVudGlyZSBncmFwaC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHVsbGVkCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBJZiB5b3UgY29ubmVjdCBhIHNlY29uZCBvdXRwdXQgcG9ydCB0byBhbiBpbnB1dCBwb3J0CisgICAgICogdGhlbiBpdCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuIERvIG5vdCBtb2RpZnkgdGhlIGdyYXBoIHRvcG9sb2d5IGZvcm0gYW5vdGhlciB0aHJlYWQgd2hpbGUgcnVubmluZy4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdElucHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KKyAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgorICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCisgICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgorICAgICAqLworICAgIGZsb2F0ICpnZXRCbG9jaygpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUHVsbCBkYXRhIGZyb20gYW55IG91dHB1dCBwb3J0IHRoYXQgaXMgY29ubmVjdGVkLgorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgorICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAorICAgICAqIHRvIHRoaXMgcG9ydC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJsb2NrU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QmxvY2soKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbG9hdHM7IGkrKykgeworICAgICAgICAgICAgKmJ1ZmZlcisrID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7CisgICAgICAgICh2b2lkKSBwb3J0OworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbUNvbm5lY3RlZCA9IG51bGxwdHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7CisgICAgICAgIG1GcmFtZUluZGV4ID0gMDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKKyAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9TaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9TaW5rKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKworICAgIC8qKgorICAgICAqIER1bW15IHByb2Nlc3Nvci4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCkgZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIHZpcnR1YWwgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQzMl90IHB1bGwoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIGludDY0X3QgbUZyYW1lUG9zaXRpb24gPSAwOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvKiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJDbGlwVG9SYW5nZS5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitDbGlwVG9SYW5nZTo6Q2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IENsaXBUb1JhbmdlOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc3RkOjptaW4obU1heGltdW0sIHN0ZDo6bWF4KG1NaW5pbXVtLCAqaW5wdXRCdWZmZXIrKykpOworICAgIH0KKworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCisvLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgorLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCitjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhIZWFkcm9vbSA9IDEuNDEyNTM3NTRmOworY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWluSGVhZHJvb20gPSAta0RlZmF1bHRNYXhIZWFkcm9vbTsKKworY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5DbGlwVG9SYW5nZSgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNaW5pbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWluaW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNaW5pbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1pbmltdW07CisgICAgfQorCisgICAgdm9pZCBzZXRNYXhpbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWF4aW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNYXhpbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1heGltdW07CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisgICAgZmxvYXQgbU1pbmltdW0gPSBrRGVmYXVsdE1pbkhlYWRyb29tOworICAgIGZsb2F0IG1NYXhpbXVtID0ga0RlZmF1bHRNYXhIZWFkcm9vbTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJNb25vVG9NdWx0aUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6TW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIDEpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKK30KKworTW9ub1RvTXVsdGlDb252ZXJ0ZXI6On5Nb25vVG9NdWx0aUNvbnZlcnRlcigpIHsgfQorCitpbnQzMl90IE1vbm9Ub011bHRpQ29udmVydGVyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIC8vIFRPRE8gbWF5YmUgbW92ZSB0byBhdWRpb191dGlsIGFzIGF1ZGlvX21vbm9fdG9fbXVsdGkoKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyBpKyspIHsKKyAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIG1hbnkKKyAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbENvdW50OyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHNhbXBsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ1M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBNb25vVG9NdWx0aUNvbnZlcnRlciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfk1vbm9Ub011bHRpQ29udmVydGVyKCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJhbXBMaW5lYXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiUmFtcExpbmVhci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitSYW1wTGluZWFyOjpSYW1wTGluZWFyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7CisgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Cit9CisKK2Zsb2F0IFJhbXBMaW5lYXI6OmludGVycG9sYXRlQ3VycmVudCgpIHsKKyAgICByZXR1cm4gbUxldmVsVG8gLSAobVJlbWFpbmluZyAqIG1TY2FsZXIpOworfQorCitpbnQzMl90IFJhbXBMaW5lYXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgZmxvYXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgeworICAgICAgICAvLyBTdGFydCBuZXcgcmFtcC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KKyAgICAgICAgbUxldmVsRnJvbSA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKKyAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKKyAgICAgICAgQUxPR1YoIiVzKCkgbUxldmVsRnJvbSA9ICVmLCBtTGV2ZWxUbyA9ICVmLCBtUmVtYWluaW5nID0gJWQsIG1TY2FsZXIgPSAlZiIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtTGV2ZWxGcm9tLCBtTGV2ZWxUbywgbVJlbWFpbmluZywgbVNjYWxlcik7CisgICAgICAgIG1TY2FsZXIgPSAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1MZW5ndGhJbkZyYW1lczsgLy8gZm9yIGludGVycG9sYXRpb24KKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAgICBpZiAobVJlbWFpbmluZyA+IDApIHsgLy8gUmFtcGluZz8gVGhpcyBkb2Vzbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLgorICAgICAgICBpbnQzMl90IGZyYW1lc1RvUmFtcCA9IHN0ZDo6bWluKGZyYW1lc0xlZnQsIG1SZW1haW5pbmcpOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvUmFtcDsKKyAgICAgICAgd2hpbGUgKGZyYW1lc1RvUmFtcCA+IDApIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRMZXZlbCA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogY3VycmVudExldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbWFpbmluZy0tOworICAgICAgICAgICAgZnJhbWVzVG9SYW1wLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGFueSBmcmFtZXMgYWZ0ZXIgdGhlIHJhbXAuCisgICAgaW50MzJfdCBzYW1wbGVzTGVmdCA9IGZyYW1lc0xlZnQgKiBjaGFubmVsQ291bnQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVzTGVmdDsgaSsrKSB7CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogbUxldmVsVG87CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM4ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgUmFtcExpbmVhciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+UmFtcExpbmVhcigpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgbmV4dCByYW1wLgorICAgICAqIENhbGxpbmcgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYSByYW1wIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICovCisgICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcyk7CisKKyAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWF5IGJlIHNhZmVseSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCk7CisKKyAgICBmbG9hdCBnZXRUYXJnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgorICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgorICAgICAqCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICovCisgICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKKyAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOworICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOworICAgIH0KKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCitwcml2YXRlOgorCisgICAgZmxvYXQgaW50ZXJwb2xhdGVDdXJyZW50KCk7CisKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gIG1UYXJnZXQ7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMC4wZiAvIDEwMC4wZiA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHo7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtUmVtYWluaW5nICAgICAgID0gMDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1TY2FsZXIgICAgICAgICAgPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfUkFNUF9MSU5FQVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZGNiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0Zsb2F0OjpTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNpbmtGbG9hdDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSAoZmxvYXQgKikgZGF0YTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1lbWNweShmbG9hdERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NWMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19GTE9BVF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rRmxvYXQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlYzhmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0kxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rSTE2OjpTaW5rSTE2KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kxNjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDE2X3QgKnNob3J0RGF0YSA9IChpbnQxNl90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzaG9ydERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyk7CisgICAgICAgIHNob3J0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpzaWduYWwrKyAqIDMyNzY4LjBmKTsKKyAgICAgICAgICAgICpzaG9ydERhdGErKyA9IHN0ZDo6bWluKElOVDE2X01BWCwgc3RkOjptYXgoSU5UMTZfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NjI2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kxNiA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkyODI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKworU2lua0kyNDo6U2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMjQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICB1aW50OF90ICpieXRlRGF0YSA9ICh1aW50OF90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19wMjRfZnJvbV9mbG9hdChieXRlRGF0YSwgZmxvYXREYXRhLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworICAgICAgICBieXRlRGF0YSArPSBudW1TYW1wbGVzICoga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1heCA9IDB4MDA3RkZGRkY7CisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1pbiA9IDB4RkY4MDAwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpmbG9hdERhdGErKyAqIDB4MDA4MDAwMDApOworICAgICAgICAgICAgbiA9IHN0ZDo6bWluKGtJMjRQYWNrZWRNYXgsIHN0ZDo6bWF4KGtJMjRQYWNrZWRNaW4sIG4pKTsgLy8gY2xpcAorICAgICAgICAgICAgLy8gV3JpdGUgYXMgYSBwYWNrZWQgMjQtYml0IGludGVnZXIgaW4gTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSBuOworICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgKG4gPj4gOCk7CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiAxNik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWI1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMjRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMjQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTI0X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI2NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlRmxvYXQ6OlNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUZsb2F0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworCisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBmbG9hdCAqZmxvYXRCYXNlID0gKGZsb2F0ICopIG1EYXRhOworICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSAmZmxvYXRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKyAgICBtZW1jcHkob3V0cHV0QnVmZmVyLCBmbG9hdERhdGEsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMTYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlSTE2OjpTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTE2OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgaW50MTZfdCAqc2hvcnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtRGF0YSk7CisgICAgY29uc3QgaW50MTZfdCAqc2hvcnREYXRhID0gJnNob3J0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdERhdGEsIHNob3J0RGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpmbG9hdERhdGErKyA9ICpzaG9ydERhdGErKyAqICgxLjBmIC8gMzI3NjgpOworICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExNmNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMTYgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE5ODgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1NvdXJjZUkyNDo6U291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUkyNDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVCYXNlID0gKHVpbnQ4X3QgKikgbURhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZURhdGEgPSAmYnl0ZUJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnQgKiBrQnl0ZXNQZXJJMjRQYWNrZWRdOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmxvYXREYXRhLCBieXRlRGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEuIC8gKGZsb2F0KSgxVUwgPDwgMzEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIC8vIEFzc2VtYmxlIHRoZSBkYXRhIGFzc3VtaW5nIExpdHRsZSBFbmRpYW4gZm9ybWF0LgorICAgICAgICBpbnQzMl90IHBhZCA9IGJ5dGVEYXRhWzJdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVsxXTsKKyAgICAgICAgcGFkIDw8PSA4OworICAgICAgICBwYWQgfD0gYnl0ZURhdGFbMF07CisgICAgICAgIHBhZCA8PD0gODsgLy8gU2hpZnQgdG8gMzIgYml0IGRhdGEgc28gdGhlIHNpZ24gaXMgY29ycmVjdC4KKyAgICAgICAgYnl0ZURhdGEgKz0ga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICAqZmxvYXREYXRhKysgPSBwYWQgKiBzY2FsZTsgLy8gc2NhbGUgdG8gcmFuZ2UgLTEuMCB0byAxLjAKKyAgICB9CisjZW5kaWYKKworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmMTRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTI0IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCmluZGV4IGE2YjlmNWQuLjJlZGFiNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKQEAgLTc4LDggKzc4LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKLSAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvRmxpbmdlciB0byBzdG9wIGNhbGxpbmcgdXMuCi0gICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgQXVkaW9GbGluZ2VyIGtpbGxpbmcgdGhlIHN0cmVhbS4KKyAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvUmVjb3JkIG9yIEF1ZGlvVHJhY2sgdG8gc3RvcCBjYWxsaW5nIHVzLgorICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZW0ga2lsbGluZyB0aGUgc3RyZWFtIHdoZW4gdGhleSBzZWUgYSBzaXplIG91dCBvZiByYW5nZS4KKyAgICAvLyBUaGF0IGlzIGFuIHVuZG9jdW1lbnRlZCBiZWhhdmlvci4KICAgICAvLyBUT0RPIGFkZCB0byBBUEkgaW4gQXVkaW9SZWNvcmQgYW5kIEF1ZGlvVHJhY2sKICAgICBjb25zdCBzaXplX3QgU0laRV9TVE9QX0NBTExCQUNLUyA9IFNJWkVfTUFYOwogCkBAIC05NSw3ICs5Niw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdG9wcGluZyBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKQEAgLTExNSwxMCArMTE2LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gU1RPUCBvciBpbnZhbGlkIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXF1ZXN0ZWQgc3RvcCwgZmFrZSBhbiBlcnJvciIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwotICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgQXVkaW9GbGluZ2VyIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIHRoZSBzeXN0ZW0ga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggNDk0ZWRiYy4uOGU3ODU1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC03Nyw3ICs3Nyw2IEBACiAKICAgICB2aXJ0dWFsIGludDY0X3QgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGludDMyX3QgZnJhbWVzKSAgPSAwOwogCi0KICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVzV3JpdHRlbigpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIG1GcmFtZXNXcml0dGVuLmdldCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAppbmRleCA1MDVmMmVlLi40YTY1ZmM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCkBAIC01Nyw2ICs1Nyw5IEBACiAKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvUmVjb3JkCiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUT0RPIFN1cHBvcnQgVU5TUEVDSUZJRUQgaW4gQXVkaW9SZWNvcmQuIEZvciBub3csIHVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CkBAIC02NiwyMyArNjksMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAKLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaCAocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIE5vIGZsYWdzLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBQcmVzZXJ2ZSBiZWhhdmlvciBvZiBBUEkgMjYKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogCiAgICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgpAQCAtOTksMTIgKzEwNiwxMiBAQAogICAgIC8vIFdlIGp1c3QgbWF5IG5vdCBnZXQgYSBGQVNUIHRyYWNrLgogICAgIC8vIEJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGFueXdheSB3aXRob3V0IHRoaXMgaGFjay4KICAgICBjb25zdGV4cHIgaW50MzJfdCBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0ID0gNDgwMDA7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKICAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCiAgICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCiAgICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKICAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKICAgICB9IGVsc2UgewogICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogICAgIH0KQEAgLTE0MSwxNCArMTQ4LDEwIEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0KLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOwogCiAgICAgICAgIG1BdWRpb1JlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKQEAgLTIxNCw4ICsyMTcsOCBAQAogICAgIH0KIAogICAgIC8vIEFsbG9jYXRlIGZvcm1hdCBjb252ZXJzaW9uIGJ1ZmZlciBpZiBuZWVkZWQuCi0gICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CiAKICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWxsYmFjayB0aGVuIHdlIG5lZWQgdG8gY29udmVydCB0aGUgZGF0YSBpbnRvIGFuIGludGVybmFsIGZsb2F0CkBAIC0zMjMsMTYgKzMyNiwxMyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcmVjb3JkaW5nLgotICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5TdGFydGluZyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICB9CiAKLSAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvUmVjb3JkIHRvIGF2b2lkIHNodXR0aW5nCiAgICAgLy8gZG93biBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CisgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHplcm8KICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0zNDYsMTIgKzM0NiwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CisgICAgbUZyYW1lc1dyaXR0ZW4uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCi0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICAvLyBQYXNzIGZhbHNlIHRvIHByZXZlbnQgZXJyb3JDYWxsYmFjayBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBkaXNjb25uZWN0CiAgICAgLy8gd2hlbiBhcHAgaGFzIGFscmVhZHkgcmVxdWVzdGVkIGEgc3RvcCgpLgogICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKQEAgLTM2NSwxMCArMzYzLDEyIEBACiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgLy8gVE9ETyBhZGQgYmV0dGVyIHN0YXRlIHZpc2liaWxpdHkgdG8gQXVkaW9SZWNvcmQKICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIC8vIFdoZW4gc3RhcnRpbmcsIHRoZSBwb3NpdGlvbiB3aWxsIGJlZ2luIGF0IHplcm8gYW5kIHRoZW4gZ28gcG9zaXRpdmUuCisgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBjYW4gd3JhcCBidXQgYnkgdGhhdCB0aW1lIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBTVEFSVElORy4KICAgICAgICAgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICE9IG1Qb3NpdGlvbldoZW5TdGFydGluZykgeworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgewogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ4Myw2ICs0ODMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldFRpbWVzdGFtcCgmZXh0ZW5kZWRUaW1lc3RhbXApOwogICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtNDk4LDEyICs1MDEsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewogICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKHBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDUwNWNkNzcuLmZmOTVhZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC01OSwxOCArNTksMjUgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvVHJhY2sKICAgICAvLyBVc2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgogICAgICAgICAgICAgLy8gQnlwYXNzIHRoZSBub3JtYWwgbWl4ZXIgYW5kIGdvIHN0cmFpZ2h0IHRvIHRoZSBGQVNUIG1peGVyLgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19PVVRQVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKQEAgLTgxLDYgKzg4LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gTm8gZmxhZ3MuIFVzZSBhIG5vcm1hbCBtaXhlciBpbiBmcm9udCBvZiB0aGUgRkFTVCBtaXhlci4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtODgsOSArOTYsOSBAQAogCiAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKQogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICA6IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXRGb3JtYXQoKSk7CisgICAgICAgICAgICA6IGdldEZvcm1hdCgpOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KICAgICBBdWRpb1RyYWNrOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKQEAgLTEzNSwxMSArMTQzLDYgQEAKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwogCi0gICAgc3RhdGljX2Fzc2VydChBQVVESU9fVU5TUEVDSUZJRUQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwgIlNlc3Npb24gSURzIHNob3VsZCBtYXRjaCIpOwotCi0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwotCiAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwogICAgIG1BdWRpb1RyYWNrLT5zZXQoCiAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgIC8vIGlnbm9yZWQgYmVjYXVzZSB3ZSBwYXNzIGF0dHJpYnV0ZXMgYmVsb3cKQEAgLTE3OCwxMCArMTgxLDggQEAKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1RyYWNrLgogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkpOwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7Ci0gICAgc2V0Rm9ybWF0KGFhdWRpb0Zvcm1hdCk7Ci0gICAgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgc2V0Rm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CisgICAgc2V0RGV2aWNlRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgIEFMT0dXX0lGKGFjdHVhbFNhbXBsZVJhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpLApAQCAtMjg3LDcgKzI4OCw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0UGF1c2UoKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RQYXVzZSgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMzAzLDcgKzMwNCw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RGbHVzaCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMzE3LDEzICszMTgsMTMgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RvcCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1JlYWQoZ2V0RnJhbWVzV3JpdHRlbigpIC0gZ2V0RnJhbWVzUmVhZCgpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1dyaXR0ZW4oKSk7CisgICAgbUZyYW1lc1JlYWQuY2F0Y2hVcFRvKGdldEZyYW1lc1dyaXR0ZW4oKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNXcml0dGVuKCkpOwogICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsgLy8gc2VydmljZSByZWFkcyBmcmFtZXMsIHNlcnZpY2UgcG9zaXRpb24gcmVzZXQgb24gc3RvcAogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggNDBlYmI3Ni4uNzIzY2JmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTMzLDM5NSArMzMsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KLS8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgotI2RlZmluZSBNQVhfSEVBRFJPT00gKDEuNDEyNTM3NTRmKQotI2RlZmluZSBNSU5fSEVBRFJPT00gKDAgLSBNQVhfSEVBRFJPT00pCi0KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICBpbnQzMl90IHNpemUgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7Ci0gICAgcmV0dXJuIChpbnQxNl90KSByb3VuZGYoZm1heGYoZm1pbmYoZiAqIHNjYWxlLCBzY2FsZSAtIDEuZiksIC1zY2FsZSkpOwotfQotCi0vLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLS8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgotc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7Ci0gICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKLX0KLQotc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewotICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAvLyBTY2FsZSBhbmQgY29udmVydCB0byBhIHNob3J0LgotICAgIGZsb2F0IGZ2YWwgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChmdmFsKTsKLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0jZGVmaW5lIFNIT1JUX1NDQUxFICAzMjc2OAotCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotCi0gICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgICAgLy8gbXVzdCBtYXRjaC4KLSAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKLSAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0gICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC01MTMsNiArMTI0LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgeworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBicmVhazsKQEAgLTUyMCwxNiArMTM0LDE5IEBACiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFhdWRpb0Zvcm1hdCk7CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhYXVkaW9Gb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFuZHJvaWRGb3JtYXQ7CiB9CiAKIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdCkgewotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdDsKICAgICBzd2l0Y2ggKGFuZHJvaWRGb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM4LDcgKzE1NSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYW5kcm9pZEZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYW5kcm9pZEZvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwpAQCAtNTkzLDYgKzIxMCw3IEBACiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9PSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpOwogICAgIGlmIChwcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHByZXNldCA9IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLmRjMmIxOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM0LDEyICs4NCw2IEBACiAgKi8KIGF1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOwogCi0vKioKLSAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAotICovCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQotCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKICNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1kgICAgICAgICAgICJhYXVkaW8ubW1hcF9wb2xpY3kiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTRiYmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxpbmVhclJhbXAuaCIKLQotYm9vbCBMaW5lYXJSYW1wOjppc1JhbXBpbmcoKSB7Ci0gICAgZmxvYXQgdGFyZ2V0ID0gbVRhcmdldC5sb2FkKCk7Ci0gICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgewotICAgICAgICAvLyBVcGRhdGUgdGFyZ2V0LiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgotICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKLSAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1SZW1haW5pbmcgPiAwOwotICAgIH0KLX0KLQotYm9vbCBMaW5lYXJSYW1wOjpuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pIHsKLSAgICBib29sIHJhbXBpbmcgPSBpc1JhbXBpbmcoKTsKLSAgICAqbGV2ZWxGcm9tID0gbUxldmVsRnJvbTsKLSAgICBpZiAocmFtcGluZykgewotICAgICAgICBmbG9hdCBsZXZlbDsKLSAgICAgICAgaWYgKGZyYW1lcyA+PSBtUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbFRvOwotICAgICAgICAgICAgbVJlbWFpbmluZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSB0byBhIHBvaW50IGFsb25nIHRoZSBmdWxsIHJhbXAuCi0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbEZyb20gKyAoZnJhbWVzICogKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtUmVtYWluaW5nKTsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgLT0gZnJhbWVzOwotICAgICAgICB9Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsgLy8gZm9yIG5leHQgcmFtcAotICAgICAgICAqbGV2ZWxUbyA9IGxldmVsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpsZXZlbFRvID0gbUxldmVsVG87Ci0gICAgfQotICAgIHJldHVybiByYW1waW5nOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiOGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBVURJT19MSU5FQVJfUkFNUF9ICi0jZGVmaW5lIEFBVURJT19MSU5FQVJfUkFNUF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qKgotICogR2VuZXJhdGUgc2VnbWVudHMgYWxvbmcgYSBsaW5lYXIgcmFtcC4KLSAqIFRoZSByYW1wIHRhcmdldCBjYW4gYmUgdXBkYXRlZCBmcm9tIGFub3RoZXIgdGhyZWFkLgotICogV2hlbiB0aGUgdGFyZ2V0IGlzIHVwZGF0ZWQsIGEgbmV3IHJhbXAgaXMgc3RhcnRlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICoKLSAqIFRoZSBmaXJzdCByYW1wIHN0YXJ0cyBhdCAwLjAuCi0gKgotICovCi1jbGFzcyBMaW5lYXJSYW1wIHsKLXB1YmxpYzoKLSAgICBMaW5lYXJSYW1wKCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKLSAgICAgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKi8KLSAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOwotICAgIH0KLQotICAgIGZsb2F0IGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCi0gICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgewotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7Ci0gICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7IC8vIGZvcmNlcyBhIHJhbXAgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0Q3VycmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1MZXZlbEZyb207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGxldmVscyBmb3IgbmV4dCByYW1wIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWxGcm9tIHBvaW50ZXIgdG8gc3RhcnRpbmcgYW1wbGl0dWRlCi0gICAgICogQHBhcmFtIGxldmVsVG8gcG9pbnRlciB0byBlbmRpbmcgYW1wbGl0dWRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJhbXAgaXMgc3RpbGwgbW92aW5nIHRvd2FyZHMgdGhlIHRhcmdldAotICAgICAqLwotICAgIGJvb2wgbmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKTsKLQotcHJpdmF0ZToKLQotICAgIGJvb2wgaXNSYW1waW5nKCk7Ci0KLSAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICBtVGFyZ2V0OwotCi0gICAgaW50MzJfdCBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAgLyAxMDA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHoKLSAgICBpbnQzMl90IG1SZW1haW5pbmcgICAgICAgPSAwOwotICAgIGZsb2F0ICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7Ci0gICAgZmxvYXQgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKLX07Ci0KLQotI2VuZGlmIC8vQUFVRElPX0xJTkVBUl9SQU1QX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCmluZGV4IDU4MzNlYWIuLjYzYWRkNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaApAQCAtNDEsMTAgKzQxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyCisgICAgICogYWR2YW5jZSB0aGUgY3VycmVudCB2YWx1ZSB0byBtYXRjaCB0aGUgY291bnRlcgogICAgICAqLwotICAgIHZvaWQgc2V0KGludDY0X3QgY291bnRlcikgewotICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICB2b2lkIGNhdGNoVXBUbyhpbnQ2NF90IGNvdW50ZXIpIHsKKyAgICAgICAgaWYgKChjb3VudGVyIC0gbUNvdW50ZXI2NCkgPiAwKSB7CisgICAgICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2ODE5NGRiLi5jYjI0M2EwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtMTksNiArMTksMTggQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfY2xvY2tfbW9kZWwiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9jbG9ja19tb2RlbC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9ibG9ja19hZGFwdGVyIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYmxvY2tfYWRhcHRlci5jcHAiXSwKQEAgLTM0LDEzICs0Niw2IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJ0ZXN0X2xpbmVhcl9yYW1wIiwKLSAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfbGluZWFyX3JhbXAuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCi19Ci0KLWNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X29wZW5fcGFyYW1zIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfb3Blbl9wYXJhbXMuY3BwIl0sCkBAIC0xNjcsMyArMTcyLDI3IEBACiAgICAgc3JjczogWyJ0ZXN0X2F0b21pY19maWZvLmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9mbG93Z3JhcGgiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9mbG93Z3JhcGguY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9yZXR1cm5fc3RvcCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3JldHVybl9zdG9wLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAppbmRleCAwZWRmZWJlLi4xMzBlZjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPwogICAgICAgICAvLyBGb3IgRW1wdHlSb29tCiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRFbXB0eVJvb21BdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CiAgICAgICAgIC8vIEZvciBGdWxsRGF0YQogICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCiAgICAgdm9pZCB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1dyaXRlID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgewogICAgICAgICAgICAgbURhdGFbaV0gPSBtTmV4dFdyaXRlSW5kZXgrKzsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIC8vIFJlYWQgd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIERvIG5vdCB1bmRlcmZsb3cuCiAgICAgdm9pZCB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOwogICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9SZWFkLCBhY3R1YWwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgLy8gUmVhZCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcwogICAgIHZvaWQgdmVyaWZ5UmVxdWVzdGVkRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIEFTU0VSVF9MRShudW1GcmFtZXMsIGZyYW1lc0F2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CkBAIC0yODIsMTIgKzI4MiwxMiBAQAogICAgIHZvaWQgY2hlY2tSYW5kb21Xcml0ZVJlYWQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNFbXB0eSA9Ci0gICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRW1wdHkpOwogICAgICAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwogICAgICAgICAgICAgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKaW5kZXggYjAxYWYyNS4uZGJmODcxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKQEAgLTEzMCw2ICsxMzAsNyBAQAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OLAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSwKIH07CiAKIHN0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc1VzYWdlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdhYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCB0ZXN0cyBmb3IgSXNvY2hyb25vdXMgQ2xvY2sgTW9kZWwKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8Y2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKKy8vIFdlIGNhbiB1c2UgYXJiaXRyYXJ5IHZhbHVlcyBoZXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCBvcGVuaW5nIGEgcmVhbCBhdWRpbyBzdHJlYW0uCisjZGVmaW5lIFNBTVBMRV9SQVRFICAgICAgICAgICAgIDQ4MDAwCisjZGVmaW5lIEhXX0ZSQU1FU19QRVJfQlVSU1QgICAgIDQ4CisjZGVmaW5lIE5BTk9TX1BFUl9CVVJTVCAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogSFdfRlJBTUVTX1BFUl9CVVJTVCAvIFNBTVBMRV9SQVRFKQorCitjbGFzcyBDbG9ja01vZGVsVGVzdEZpeHR1cmU6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIENsb2NrTW9kZWxUZXN0Rml4dHVyZSgpIHsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgeworICAgICAgICBtb2RlbC5zZXRTYW1wbGVSYXRlKFNBTVBMRV9SQVRFKTsKKyAgICAgICAgbW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QoSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIHsKKyAgICB9CisKKyAgICB+Q2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgIHsKKyAgICAgICAgLy8gY2xlYW51cCBhbnkgcGVuZGluZyBzdHVmZiwgYnV0IG5vIGV4Y2VwdGlvbnMgYWxsb3dlZAorICAgIH0KKworICAgIC8vIFRlc3QgcHJvY2Vzc2luZyBvZiB0aW1lc3RhbXBzIHdoZW4gdGhlIGhhcmR3YXJlIG1heSBiZSBzbGlnaHRseSBvZmYgZnJvbQorICAgIC8vIHRoZSBleHBlY3RlZCBzYW1wbGUgcmF0ZS4KKyAgICB2b2lkIGNoZWNrRHJpZnRpbmdDbG9jayhkb3VibGUgaGFyZHdhcmVGcmFtZXNQZXJTZWNvbmQsIGludCBudW1Mb29wcykgeworICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZU5hbm9zID0gNTAwMDAwMDAwOyAvLyBhcmJpdHJhcnkKKyAgICAgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lTmFub3MpOworCisgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnRQb3NpdGlvbkZyYW1lcyA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgICAgIC8vIGFyYml0cmFyeSB0aW1lIGZvciBmaXJzdCBidXJzdAorICAgICAgICBjb25zdCBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWVOYW5vcyArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORAorICAgICAgICAgICAgICAgICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAgICAgLy8gU2hvdWxkIHNldCBpbml0aWFsIG1hcmtlci4KKyAgICAgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChzdGFydFBvc2l0aW9uRnJhbWVzLCBtYXJrZXJUaW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXJ0UG9zaXRpb25GcmFtZXMsIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAgICAgZG91YmxlIGVsYXBzZWRUaW1lU2Vjb25kcyA9IHN0YXJ0VGltZU5hbm9zIC8gKGRvdWJsZSkgTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmFuZG9tIGRlbGF5IG92ZXIgc2V2ZXJhbCBidXJzdHMuCisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZURlbGF5U2Vjb25kcyA9IDEwLjAgKiBkcmFuZDQ4KCkgKiBOQU5PU19QRVJfQlVSU1QgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICAgICAgZWxhcHNlZFRpbWVTZWNvbmRzICs9IHRpbWVEZWxheVNlY29uZHM7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVsYXBzZWRUaW1lTmFub3MgPSAoaW50NjRfdCkoZWxhcHNlZFRpbWVTZWNvbmRzICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBzdGFydFRpbWVOYW5vcyArIGVsYXBzZWRUaW1lTmFub3M7CisgICAgICAgICAgICAvLyBTaW11bGF0ZSBEU1AgcnVubmluZyBhdCB0aGUgc3BlY2lmaWVkIHJhdGUuCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lRnJhbWVzID0gc3RhcnRQb3NpdGlvbkZyYW1lcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKGhhcmR3YXJlRnJhbWVzUGVyU2Vjb25kICogZWxhcHNlZFRpbWVTZWNvbmRzKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbnVtQnVyc3RzID0gY3VycmVudFRpbWVGcmFtZXMgLyBIV19GUkFNRVNfUEVSX0JVUlNUOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhbGlnbmVkUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uRnJhbWVzICsgKG51bUJ1cnN0cyAqIEhXX0ZSQU1FU19QRVJfQlVSU1QpOworCisgICAgICAgICAgICAvLyBBcHBseSBkcmlmdGluZyB0aW1lc3RhbXAuCisgICAgICAgICAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKGFsaWduZWRQb3NpdGlvbiwgY3VycmVudFRpbWVOYW5vcyk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhbGlnbmVkUG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihjdXJyZW50VGltZU5hbm9zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgbW9kZWw7Cit9OworCisvLyBDaGVjayBkZWZhdWx0IHNldHVwLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2V0dXApIHsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIG1vZGVsLmdldFNhbXBsZVJhdGUoKSk7CisgICAgQVNTRVJUX0VRKEhXX0ZSQU1FU19QRVJfQlVSU1QsIG1vZGVsLmdldEZyYW1lc1BlckJ1cnN0KCkpOworfQorCisvLyBUZXN0IGRlbHRhIGNhbGN1bGF0aW9ucy4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX2RlbHRhcykgeworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIHBvc2l0aW9uKTsKKworICAgIC8vIERlbHRhcyBhcmUgbm90IHF1YW50aXplZC4KKyAgICAvLyBDb21wYXJlIHRpbWUgdG8gdGhlIGVxdWl2YWxlbnQgcG9zaXRpb24gaW4gZnJhbWVzLgorICAgIGNvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlckJ1cnN0ID0gSFdfRlJBTUVTX1BFUl9CVVJTVCAqIE5BTk9TX1BFUl9TRUNPTkQgLyBTQU1QTEVfUkFURTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05ELCB0aW1lKTsKKworICAgIC8vIENvbXBhcmUgcG9zaXRpb24gaW4gZnJhbWVzIHRvIHRoZSBlcXVpdmFsZW50IHRpbWUuCisgICAgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSwgdGltZSk7Cit9CisKKy8vIHN0YXJ0KCkgc2hvdWxkIGZvcmNlIHRoZSBpbnRlcm5hbCBtYXJrZXJzCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zdGFydCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHN0YXJ0VGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbik7CisgICAgRVhQRUNUX0VRKHN0YXJ0VGltZSwgdGltZSk7CisKKyAgICB0aW1lID0gc3RhcnRUaW1lICsgKDUwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24odGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKK30KKworLy8gdGltZXN0YW1wcyBtb3ZlcyB0aGUgd2luZG93IGlmIG91dHNpZGUgdGhlIGJvdW5kcworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfdGltZXN0YW1wKSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBIV19GUkFNRVNfUEVSX0JVUlNUOyAvLyBoYXJkd2FyZQorICAgIGludDY0X3QgbWFya2VyVGltZSA9IHN0YXJ0VGltZSArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCArICgyMDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworCisgICAgLy8gU2hvdWxkIHNldCBtYXJrZXIuCisgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChwb3NpdGlvbiwgbWFya2VyVGltZSk7CisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSkpOworCisgICAgLy8gY29udmVydFRpbWVUb1Bvc2l0aW9uIHJvdW5kcyBkb3duCisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSArICg3MyAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCkpKTsKKworICAgIC8vIGNvbnZlcnRQb3NpdGlvblRvVGltZSByb3VuZHMgdXAKKyAgICBFWFBFQ1RfRVEobWFya2VyVGltZSArIE5BTk9TX1BFUl9CVVJTVCwgbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uICsgMTcpKTsKK30KKworI2RlZmluZSBOVU1fTE9PUFNfRFJJRlQgICAxMDAwMAorCisvLyB0ZXN0IG51ZGdpbmcgdGhlIHdpbmRvdyBieSB1c2luZyBhIGRyaWZ0aW5nIEhXIGNsb2NrCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19ub19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jayhTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KKworLy8gVGhlc2Ugc2xvdyBkcmlmdCByYXRlcyBjYXVzZWQgZXJyb3JzIHdoZW4gSSBkaXNhYmxlZCB0aGUgY29kZSB0aGF0IGhhbmRsZXMKKy8vIGRyaWZ0aW5nIGluIHRoZSBjbG9jayBtb2RlbC4gU28gSSB0aGluayB0aGUgdGVzdCBpcyB2YWxpZC4KKy8vIEl0IGlzIHVubGlrZWx5IHRoYXQgcmVhbCBoYXJkd2FyZSB3b3VsZCBiZSBvZmYgYnkgbW9yZSB0aGFuIHRoaXMgYW1vdW50LgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2xvd19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jaygwLjk5OCAqIFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQorCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19mYXN0X2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKDEuMDAyICogU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IEZsb3dHcmFwaAorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OworICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKKyAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kxNiBzaW5rSTE2ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fdG9fc3RlcmVvKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMi4wZiwgMy4wZn07CisgICAgZmxvYXQgb3V0cHV0WzEwMF0gPSB7fTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBNb25vVG9NdWx0aUNvbnZlcnRlciBtb25vVG9TdGVyZW97Mn07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsyfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIDMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9Ub1N0ZXJlby5pbnB1dCk7CisgICAgbW9ub1RvU3RlcmVvLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCA4KTsKKyAgICBBU1NFUlRfRVEoMywgbnVtUmVhZCk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMF0pOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzFdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFsyXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbM10pOworfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKKyAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKKyAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOworICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOworICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7CisKKyAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKKy8vIEl0IGlzIGVhc2llc3QgdG8gcmVwcmVzZW50IHBhY2tlZCAyNC1iaXQgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuCisvLyBUaGlzIHRlc3Qgd2lsbCByZWFkIGZyb20gaW5wdXQsIGNvbnZlcnQgdG8gZmxvYXQsIHRoZW4gd3JpdGUKKy8vIGJhY2sgdG8gb3V0cHV0IGFzIGJ5dGVzLgorVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3BhY2tlZF8yNCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlucHV0W10gPSB7MHgwMSwgMHgyMywgMHg0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsIDB4ODksIDB4QUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENELCAweEVGLCAweDVBfTsKKyAgICB1aW50OF90IG91dHB1dFs5OV0gPSB7fTsKKyAgICBTb3VyY2VJMjQgc291cmNlSTI0ezF9OworICAgIFNpbmtJMjQgc2lua0kyNHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgc291cmNlSTI0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VJMjQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMjQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kyNC5yZWFkKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoaW5wdXQpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX2NsaXBfdG9fcmFuZ2UpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNaW4gPSAtMi4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNYXggPSAxLjVmOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTkuNywgMC41ZiwgLTAuMjUsIDEuMGYsIDEyLjN9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0ge215TWluLCAwLjVmLCAtMC4yNSwgMS4wZiwgbXlNYXh9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIENsaXBUb1JhbmdlIGNsaXBwZXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKworICAgIGNsaXBwZXIuc2V0TWluaW11bShteU1pbik7CisgICAgY2xpcHBlci5zZXRNYXhpbXVtKG15TWF4KTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZjbGlwcGVyLmlucHV0KTsKKyAgICBjbGlwcGVyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKG91dHB1dFswXSk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjUyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBSZXR1cm4gc3RvcCBmcm9tIHRoZSBjYWxsYmFjay4KKyAqIEV4cGVjdCB0aGUgY2FsbGJhY2sgdG8gY2Vhc2UuCisgKiBDaGVjayB0aGUgbG9nY2F0IGZvciBiYWQgYmVoYXZpb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisjZGVmaW5lIFNUT1BfQVRfTVNFQyAgICAgICAgICAxMDAwCisjZGVmaW5lIExPT1BfRFVSQVRJT05fTVNFQyAgICA0MDAwCisjZGVmaW5lIFNMRUVQX0RVUkFUSU9OX01TRUMgICAgMjAwCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgICAgICAgICAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBzdG9wQXRGcmFtZSA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIC8vIFRoZXNlIGNvdW50ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBjYWxsYmFjayBhbmQgdGhlIG1haW4gdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBzdGFydGluZ0ZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBmcmFtZXNDYWxsZWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50e307CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gY2FsbGJhY2tDb3VudEFmdGVyU3RvcHt9OworCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZnJhbWVzUmVhZC5zdG9yZSgwKTsKKyAgICAgICAgc3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBmcmFtZXNDYWxsZWQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnRBZnRlclN0b3Auc3RvcmUoMCk7CisgICAgICAgIHN0b3BwZWQgPSBmYWxzZTsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKHN0cnVjdCBBdWRpb0VuZ2luZSAqKXVzZXJEYXRhOworICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudCsrOworICAgIGlmIChlbmdpbmUtPnN0b3BwZWQpIHsKKyAgICAgICAgZW5naW5lLT5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wKys7CisgICAgfQorCisgICAgZW5naW5lLT5mcmFtZXNSZWFkID0gKGludDMyX3QpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICBpZiAoZW5naW5lLT5zdGFydGluZ0ZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICBlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZC5zdG9yZShlbmdpbmUtPmZyYW1lc1JlYWQubG9hZCgpKTsKKyAgICB9CisgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQgKz0gbnVtRnJhbWVzOworICAgIGlmIChlbmdpbmUtPmZyYW1lc0NhbGxlZCA+PSBlbmdpbmUtPnN0b3BBdEZyYW1lKSB7CisgICAgICAgIGVuZ2luZS0+c3RvcHBlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CisgICAgfQorfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmZW5naW5lLT5idWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoZW5naW5lLT5idWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLT5idWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihlbmdpbmUtPmJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RGF0YUNhbGxiYWNrUHJvYywgZW5naW5lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShlbmdpbmUtPmJ1aWxkZXIsICZlbmdpbmUtPnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX0Nsb3NlQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChlbmdpbmUtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShlbmdpbmUtPnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbmdpbmUtPnN0cmVhbSA9IG51bGxwdHI7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGVuZ2luZS0+YnVpbGRlcik7CisgICAgZW5naW5lLT5idWlsZGVyID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgcHJpbnRmKCIlcygpIC0gZXJyb3IgPSAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQgc191c2FnZSgpIHsKKyAgICBwcmludGYoInRlc3RfcmV0dXJuX3N0b3AgWy1pXSBbLXhdIFstbl0gWy1jXVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7CisgICAgcHJpbnRmKCIgICAgIC14IHNoYXJpbmcgbW9kZSBFWENMVVNJVkUsIG90aGVyd2lzZSBTSEFSRURcbiIpOworICAgIHByaW50ZigiICAgICAtbiBwZXJmb3JtYW5jZSBtb2RlIE5PTkUsIG90aGVyd2lzZSBMT1dfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGFsd2F5cyByZXR1cm4gQ09OVElOVUUgZnJvbSBjYWxsYmFjaywgbm90IFNUT1BcbiIpOworfQorCisvKioKKyAqIEByZXR1cm4gMCBpcyBPSywgLTEgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc19jaGVja0VuZ2luZVBvc2l0aW9ucyhBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS0+c3RyZWFtKTsKKyAgICBjb25zdCBpbnQzMl90IGRlbHRhID0gKGludDMyX3QpKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKTsKKyAgICBwcmludGYoInBsYXlpbmcgZnJhbWVzUmVhZCA9ICU3ZCwgZnJhbWVzV3JpdHRlbiA9ICU3ZCIKKyAgICAgICAgICAgIiwgZGVsdGEgPSAlNGQsIGZyYW1lc0NhbGxlZCA9ICU2ZCwgY2FsbGJhY2tDb3VudCA9ICU0ZFxuIiwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1JlYWQsCisgICAgICAgICAgIChpbnQzMl90KSBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICBkZWx0YSwKKyAgICAgICAgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQubG9hZCgpLAorICAgICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnQubG9hZCgpCisgICAgKTsKKyAgICBpZiAoZGVsdGEgPiBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhlbmdpbmUtPnN0cmVhbSkpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGRlbHRhID4gY2FwYWNpdHlcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKyAgICBzdHJ1Y3QgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sIGFsd2F5c0NvbnRpbnVlID0gZmFsc2U7CisgICAgaW50IGVycm9yQ291bnQgPSAwOworICAgIGludCBjYWxsYmFja1Jlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IFJldHVybiBTdG9wIFYxLjBcbiIpOworICAgIHByaW50ZigiV2FpdCBmb3IgYSBmZXcgc2Vjb25kcy5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgY2FsbGJhY2tDb3VudCBhbmQgZnJhbWVzUmVhZCBzdG9wIGFkdmFuY2luZ1xuIik7CisgICAgcHJpbnRmKCJ3aGVuIGNhbGxiYWNrQ291bnQgcmVhY2hlcyAlZCBtc2VjXG4iLCBTVE9QX0FUX01TRUMpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGFsd2F5c0NvbnRpbnVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IHNfT3BlbkF1ZGlvU3RyZWFtKCZlbmdpbmUsIGRpcmVjdGlvbiwgc2hhcmluZ01vZGUsIHBlcmZNb2RlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoInNfT3BlbkF1ZGlvU3RyZWFtIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGVuZ2luZS5zdHJlYW0pOworICAgIC8vIFVzZSBkb3VibGUgYnVmZmVyZWQgc3RyZWFtLgorICAgIGNvbnN0IGludDMyX3QgYnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoZW5naW5lLnN0cmVhbSwgMiAqIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYnVmZmVyU2l6ZSkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBmcmFtZXNQZXJCdXJzdCA9ICUzZCwgcGVyZk1vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgZGV2aWNlSWQsIGZyYW1lc1BlckJ1cnN0LCBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgY2FsbGJhY2tzIG5lZWRlZC4KKyAgICBpZiAoYWx3YXlzQ29udGludWUpIHsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBTVE9QX0FUX01TRUMgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBsb29wcyA9IDA7IGxvb3BzIDwgMiAmJiByZXN1bHQgPT0gQUFVRElPX09LOyBsb29wcysrKSB7CisgICAgICAgIGVuZ2luZS5yZXNldCgpOworCisgICAgICAgIC8vIFN0YXJ0IHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gTE9PUF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB3YXRjaExvb3BzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RvcEF0RnJhbWUgIT0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IChlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcCA9PSAwKSA/IEVYSVRfU1VDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQ2FsbGJhY2sgY291bnQgYWZ0ZXIgU1RPUCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5sb2FkKCkpOworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RhcnRpbmdGcmFtZXNSZWFkLmxvYWQoKSA9PSBlbmdpbmUuZnJhbWVzUmVhZC5sb2FkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBmcmFtZXNSZWFkIGRpZCBub3QgYWR2YW5jZSBhY3Jvc3MgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCA8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgfQorCisgICAgc19DbG9zZUF1ZGlvU3RyZWFtKCZlbmdpbmUpOworCisgICAgcHJpbnRmKCJhYXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICBwcmludGYoInRlc3QgJXNcbiIsIGVycm9yQ291bnQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworICAgIHJldHVybiBlcnJvckNvdW50ID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdGltZXN0YW1wcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAppbmRleCBkZmE3ODE1Li43YjFkZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcApAQCAtMzUsNiArMzUsNyBAQAogCiAjZGVmaW5lIE5VTV9TRUNPTkRTICAgICAgICAgICAgIDEKICNkZWZpbmUgTlVNX0xPT1BTICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfVEVTVFMgICAgICAgICAgICAgICAyMAogCiB0eXBlZGVmIHN0cnVjdCBUaW1lc3RhbXBJbmZvIHsKICAgICBpbnQ2NF90ICAgICAgICAgZnJhbWVzVG90YWw7CkBAIC01Myw2ICs1NCw0OSBAQAogICAgIGJvb2wgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CiB9IFRpbWVzdGFtcENhbGxiYWNrRGF0YV90OwogCitzdHJ1Y3QgVGltZVN0YW1wVGVzdExvZyB7CisgICAgYWF1ZGlvX3BvbGljeV90ICAgICAgICAgICBpc01tYXA7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICBzaGFyaW5nTW9kZTsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZvcm1hbmNlTW9kZTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgIGRpcmVjdGlvbjsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgIHJlc3VsdDsKK307CisKK3N0YXRpYyBpbnQgc19udW1UZXN0cyA9IDA7CisvLyBVc2UgYSBwbGFpbiBvbGQgYXJyYXkgYmVjYXVzZSB3ZSByZWZlcmVuY2UgdGhpcyBmcm9tIHRoZSBjYWxsYmFjayBhbmQgZG8gbm90IHdhbnQgYW55CisvLyBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCitzdGF0aWMgVGltZVN0YW1wVGVzdExvZyBzX3Rlc3RMb2dzW01BWF9URVNUU117fTsKKworc3RhdGljIHZvaWQgbG9nVGVzdFJlc3VsdChib29sIGlzTW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZvcm1hbmNlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCkgeworICAgIGlmKHNfbnVtVGVzdHMgPj0gTUFYX1RFU1RTKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBNQVhfVEVTVFMgdG9vIHNtYWxsID0gJWRcbiIsIE1BWF9URVNUUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5pc01tYXAgPSBpc01tYXA7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5zaGFyaW5nTW9kZSA9IHNoYXJpbmdNb2RlOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10ucGVyZm9ybWFuY2VNb2RlID0gcGVyZm9ybWFuY2VNb2RlOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10uZGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10ucmVzdWx0ID0gcmVzdWx0OworICAgIHNfbnVtVGVzdHMrKzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRUZXN0UmVzdWx0cygpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNfbnVtVGVzdHM7IGkrKykgeworICAgICAgICBUaW1lU3RhbXBUZXN0TG9nICpsb2cgPSAmc190ZXN0TG9nc1tpXTsKKyAgICAgICAgcHJpbnRmKCIlMmQ6IG1tYXAgPSAlM3MsIHNoYXJpbmcgPSAlOXMsIHBlcmYgPSAlMTFzLCBkaXIgPSAlNnMgLS0tLSAlNHNcbiIsCisgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgbG9nLT5pc01tYXAgPyAieWVzIiA6ICJubyIsCisgICAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQobG9nLT5zaGFyaW5nTW9kZSksCisgICAgICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KGxvZy0+cGVyZm9ybWFuY2VNb2RlKSwKKyAgICAgICAgICAgICAgIGdldERpcmVjdGlvblRleHQobG9nLT5kaXJlY3Rpb24pLAorICAgICAgICAgICAgICAgbG9nLT5yZXN1bHQgPyAiRkFJTCIgOiAicGFzcyIpOworICAgIH0KK30KKwogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHRpbWVzdGFtcERhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLApAQCAtMTE1LDYgKzE1OSw3IEBACiAgICAgaW50MzJfdCBvcmlnaW5hbEJ1ZmZlclNpemUgPSAwOwogICAgIGludDMyX3QgcmVxdWVzdGVkQnVmZmVyU2l6ZSA9IDA7CiAgICAgaW50MzJfdCBmaW5hbEJ1ZmZlclNpemUgPSAwOworICAgIGJvb2wgICAgaXNNbWFwID0gZmFsc2U7CiAgICAgYWF1ZGlvX2Zvcm1hdF90IGFjdHVhbERhdGFGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKQEAgLTEyNCw3ICsxNjksOCBAQAogCiAgICAgbWVtc2V0KCZzVGltZXN0YW1wRGF0YSwgMCwgc2l6ZW9mKHNUaW1lc3RhbXBEYXRhKSk7CiAKLSAgICBwcmludGYoIi0tLS0tLS0tLS0tLSB0ZXN0VGltZVN0YW1wcyhwb2xpY3kgPSAlZCwgc2hhcmluZyA9ICVzLCBwZXJmID0gJXMsIGRpciA9ICVzKSAtLS0tLS0tLS0tLVxuIiwKKyAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIi0tLS0tLS0tLSB0ZXN0VGltZVN0YW1wcyhwb2xpY3kgPSAlZCwgc2hhcmluZyA9ICVzLCBwZXJmID0gJXMsIGRpciA9ICVzKSAtLS0tLS0tLVxuIiwKICAgICAgICAgICAgbW1hcFBvbGljeSwKICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KHNoYXJpbmdNb2RlKSwKICAgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChwZXJmb3JtYW5jZU1vZGUpLApAQCAtMTc3LDggKzIyMyw4IEBACiAKICAgICBwcmludGYoIiAgICBjaGFucyA9ICUzZCwgcmF0ZSA9ICU2ZCBmb3JtYXQgPSAlZFxuIiwKICAgICAgICAgICAgYWN0dWFsQ2hhbm5lbENvdW50LCBhY3R1YWxTYW1wbGVSYXRlLCBhY3R1YWxEYXRhRm9ybWF0KTsKLSAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChhYXVkaW9TdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpOworICAgIGlzTW1hcCA9IEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSk7CisgICAgcHJpbnRmKCIgICAgSXMgTU1BUCB1c2VkPyAlc1xuIiwgaXNNbWFwID8gInllcyIgOiAibm8iKTsKIAogICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgcmVhZCBpbiBvbmUgY2h1bmsgYnkgYSBETUEgY29udHJvbGxlcgogICAgIC8vIG9yIGEgRFNQIG9yIGEgbWl4ZXIuCkBAIC0yMTgsNyArMjY0LDcgQEAKIAogICAgICAgICBmb3IgKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCBOVU1fU0VDT05EUzsgc2Vjb25kKyspIHsKICAgICAgICAgICAgIC8vIEdpdmUgQUF1ZGlvIGNhbGxiYWNrIHRpbWUgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICB1c2xlZXAoMjAwICogMTAwMCk7CiAKICAgICAgICAgICAgIC8vIFBlcmlvZGljYWxseSBwcmludCB0aGUgcHJvZ3Jlc3Mgc28gd2Uga25vdyBpdCBoYXNuJ3QgZGllZC4KICAgICAgICAgICAgIHByaW50ZigiZnJhbWVzV3JpdHRlbiA9ICVkLCBYUnVucyA9ICVkXG4iLApAQCAtMjM0LDE4ICsyODAsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaW50ZigidGltZXN0YW1wQ291bnQgPSAlZFxuIiwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQpOwotICAgICAgICBpbnQgcHJpbnRlZCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgeworICAgICAgICBpbnQgcHJpbnRlZEdvb2QgPSAwOworICAgICAgICBpbnQgcHJpbnRlZEJhZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgewogICAgICAgICAgICAgVGltZXN0YW1wSW5mbyAqdGltZXN0YW1wID0gJnNUaW1lc3RhbXBEYXRhLnRpbWVzdGFtcHNbaV07Ci0gICAgICAgICAgICBib29sIHBvc0NoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcyAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKLSAgICAgICAgICAgIGlmICgocHJpbnRlZCA8IDIwKSAmJiAoKGkgPCAxMCkgfHwgcG9zQ2hhbmdlZCB8fCB0aW1lQ2hhbmdlZCkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsIGksCi0gICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHJlc3VsdCA9ICVzXG4iLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dCh0aW1lc3RhbXAtPnJlc3VsdCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wLT5yZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKHByaW50ZWRCYWQgPCA1KSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkLCByZXN1bHQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZWRCYWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdGltZUNoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcworICAgICAgICAgICAgICAgICAgICAgICAgIT0gKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBOYW5vcyk7CisgICAgICAgICAgICAgICAgaWYgKChwcmludGVkR29vZCA8IDIwKSAmJiAocG9zQ2hhbmdlZCB8fCB0aW1lQ2hhbmdlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPCAwOwogICAgICAgICAgICAgICAgICAgICBib29sIHJldHJvID0gKGkgPiAwICYmICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbikpOwpAQCAtMjUzLDE3ICszMDYsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHJldHJvID8gIiAgPD0gUkVUUk9HUkFERSEiIDogIiIpOwogCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5ID0gY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcE5hbm9zZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgU1RBTVA6IHBvcyA9ICU4bGxkLCBuYW5vcyA9ICU4bGxkLCBsYXQgPSAlNy4xZiBtc2VjICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZWRHb29kKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaW50ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmludGVkR29vZCA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcCgpIG5ldmVyIGdhdmUgdXMgYSB2YWxpZCB0aW1lc3RhbXBcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvIG5vdCBnZXQgdGltZXN0YW1wcyB3aGVuIHN0b3BwZWQuCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgICAgICAgICAgaW50NjRfdCB0aW1lOworICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHRlbXBSZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uLCAmdGltZSk7CisgICAgICAgICAgICBpZiAodGVtcFJlc3VsdCAhPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgc2hvdWxkIHJldHVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBJTlZBTElEX1NUQVRFIHdoZW4gc3RvcHBlZCEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRlbXBSZXN1bHQpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjczLDEyICszNDgsMTQgQEAKICAgICB9CiAKIGZpbmlzaDoKKworICAgIGxvZ1Rlc3RSZXN1bHQoaXNNbWFwLCBzaGFyaW5nTW9kZSwgcGVyZm9ybWFuY2VNb2RlLCBkaXJlY3Rpb24sIHJlc3VsdCk7CisKICAgICBpZiAoYWF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKICAgICAgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSk7CiAgICAgfQogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOwogICAgIHByaW50ZigicmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI5Miw3ICszNjksNyBAQAogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIlRlc3QgVGltZXN0YW1wcyBWMC4xLjNcbiIpOworICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuNFxuIik7CiAKICAgICAvLyBMZWdhY3kKICAgICBhYXVkaW9fcG9saWN5X3QgcG9saWN5ID0gQUFVRElPX1BPTElDWV9ORVZFUjsKQEAgLTMzMiw1ICs0MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKTsKIAorICAgIHByaW50VGVzdFJlc3VsdHMoKTsKKwogICAgIHJldHVybiAocmVzdWx0ID09IEFBVURJT19PSykgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAppbmRleCAwMTE5NzllLi5iMTExYjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTUsNiArNSwyOCBAQAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb0F0dHJpYnV0ZXMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCisgICAgICAgICJBdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50IiwKIAogICAgIGFpZGw6IHsKQEAgLTIzLDcgKzQ1LDYgQEAKICAgICAgICAgIjpsaWJhdWRpb2NsaWVudF9haWRsIiwKIAogICAgICAgICAiQXVkaW9FZmZlY3QuY3BwIiwKLSAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCiAgICAgICAgICJBdWRpb1JlY29yZC5jcHAiLAogICAgICAgICAiQXVkaW9TeXN0ZW0uY3BwIiwKICAgICAgICAgIkF1ZGlvVHJhY2suY3BwIiwKQEAgLTQwLDE2ICs2MSwyMCBAQAogICAgICAgICAiVHJhY2tQbGF5ZXJCYXNlLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAogICAgICAgICAibGliYXVkaW9tYW5hZ2VyIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidmlicmF0b3IiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzMjdjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9BdHRyaWJ1dGVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19jb250ZW50X3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy5zb3VyY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC0+cmVhZEludDMyKCkgPT0gMSk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzOworICAgICAgICByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZ0YWdzKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cm5jcHkobUF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJjcHkobUF0dHJpYnV0ZXMudGFncywgIiIpOworICAgIH0KKyAgICBtU3RyZWFtVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1Hcm91cElkID0gcGFyY2VsLT5yZWFkVWludDMyKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy51c2FnZSkpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5zb3VyY2UpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuZmxhZ3MpKTsKKyAgICBpZiAoc3RybGVuKG1BdHRyaWJ1dGVzLnRhZ3MpID09IDApIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN0cmVhbVR5cGUpKTsKKyAgICBwYXJjZWwtPndyaXRlVWludDMyKG1Hcm91cElkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiNDBmMGRiLi5jZjExOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC00MzIsMTQgKzQzMiwxNSBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgZGVzY3JpcHRvcik7CisgICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIHR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCBkZXNjcmlwdG9yKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCkBAIC00NDgsNiArNDQ5LDk1IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAqaWQgPSBhZi0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IGQxZjc1MjUuLjNhYjM4Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKQEAgLTIyLDYgKzIyLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vCisvLyAgQXVkaW9EZXZpY2VUeXBlQWRkciBpbXBsZW1lbnRhdGlvbgorLy8KK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIG1BZGRyZXNzID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVR5cGUpOworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1BZGRyZXNzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLy8KIC8vICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGltcGxlbWVudGF0aW9uCiAvLwogQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbihhdWRpb191c2FnZV90IHVzYWdlLApAQCAtNDAsMTEgKzU2LDIyIEBACiBzdGF0dXNfdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtUnVsZSA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgaWYgKG1SdWxlID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIHx8Ci0gICAgICAgICAgICBtUnVsZSA9PSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFKSB7Ci0gICAgICAgIG1WYWx1ZS5tVXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WYWx1ZS5tU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgc3dpdGNoIChtUnVsZSkgeworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgIG1WYWx1ZS5tVWlkID0gKHVpZF90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGJ1aWxkIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gZnJvbSB1bmtub3duIHJ1bGUgJWQiLCBtUnVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTExNiw0ICsxNDMsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXg6OnNldEV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX0VYQ0xVREVfVUlEOworICAgIGNyaXQubVZhbHVlLm1VaWQgPSB1aWQ7CisgICAgbUNyaXRlcmlhLmFkZChjcml0KTsKK30KKwordm9pZCBBdWRpb01peDo6c2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX01BVENIX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGExMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgcmV0ID0gYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUlkKSk7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUobUF1ZGlvQXR0cmlidXRlc1tpXSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKQoreworICAgIGlmIChyZWZBdHRyaWJ1dGVzID09IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIpIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpcyB0aGUgc3RyYXRlZ3kgdGhhdCBob2xkcyBkZWZhdWx0IGF0dHJpYnV0ZXMgYnkgY29udmVudGlvbi4KKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMgdGhhdCBmYWlsIHRvIG1hdGNoIHdpbGwgZm9sbG93IHRoZSBkZWZhdWx0IHN0cmF0ZWd5IGZvciByb3V0aW5nLgorICAgICAgICAvLyBDaG9vc2luZyB0aGUgZGVmYXVsdCBtdXN0IGJlIGRvbmUgYXMgYSBmYWxsYmFjaywgdGhlIGF0dHJpYnV0ZXMgbWF0Y2ggc2hhbGwgbm90CisgICAgICAgIC8vIHNlbGVjdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChyZWZBdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04pIHx8CisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy51c2FnZSA9PSByZWZBdHRyaWJ1dGVzLnVzYWdlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuY29udGVudF90eXBlID09IHJlZkF0dHJpYnV0ZXMuY29udGVudF90eXBlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5mbGFncyA9PSBBVURJT19GTEFHX05PTkUpIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuZmxhZ3MgIT0gQVVESU9fRkxBR19OT05FICYmCisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5mbGFncyAmIHJlZkF0dHJpYnV0ZXMuZmxhZ3MpID09IGNsaWVudEF0dHJpdHViZXMuZmxhZ3MpKSAmJgorICAgICAgICAgICAgKChzdHJsZW4ocmVmQXR0cmlidXRlcy50YWdzKSA9PSAwKSB8fAorICAgICAgICAgICAgIChzdGQ6OnN0cmNtcChjbGllbnRBdHRyaXR1YmVzLnRhZ3MsIHJlZkF0dHJpYnV0ZXMudGFncykgPT0gMCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggOGUyZGE5ZS4uYmFhMTQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNTAsOCArNTAsOSBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIgorICAgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNTksOCArNjAsOCBAQAogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCiAgICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMjEwLDggKzIxMSw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvUmVjb3JkLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVNlc3Npb25JZCk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEgLypwaWQqLyk7CiAgICAgfQogfQpAQCAtMjM5LDkgKzI0MCwxMSBAQAogICAgIHBpZF90IGNhbGxpbmdQaWQ7CiAgICAgcGlkX3QgbXlQaWQ7CiAKLSAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKICAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwogCkBAIC0yNTcsNyArMjYwLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMjY2LDcgKzI2OSw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yNzQsNyArMjc3LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI4NSw4ICsyODgsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KIAogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTI5OSwxNCArMzAyLDE0IEBACiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMzI3LDcgKzMzMCw3IEBACiAgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAogICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbXlQaWQgPSBnZXRwaWQoKTsKQEAgLTM1Miw3ICszNTUsMTIgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewpAQCAtMzg5LDcgKzM5Nyw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7Ci0gICAgQUxPR1YoInN0YXJ0LCBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CisgICAgQUxPR1YoIiVzKCVkKTogc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUFjdGl2ZSkgewpAQCAtNDMwLDcgKzQzOCw3IEBACiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKQEAgLTQ1NCw2ICs0NjIsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IG1BY3RpdmU6JWRcbiIsIF9fZnVuY19fLCBtUG9ydElkLCBtQWN0aXZlKTsKICAgICBpZiAoIW1BY3RpdmUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYzMiw4ICs2NDEsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY3NSw3ICs2ODQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1czsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC03MDIsNyArNzExLDggQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDM6IG9idGFpbi9yZWxlYXNlIG1vZGUKICAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgaWYgKCF1c2VDYXNlQWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7CkBAIC03MzcsNyArNzQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CkBAIC03NDcsNyArNzU4LDggQEAKIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgIH0KQEAgLTc1NywxMyArNzY5LDEzIEBACiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzc4LDcgKzc5MCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNzkyLDE5ICs4MDQsMjIgQEAKICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBvdXRwdXQuY2JsazsKICAgICBtQnVmZmVyTWVtb3J5ID0gb3V0cHV0LmJ1ZmZlcnM7CisgICAgbVBvcnRJZCA9IG91dHB1dC5wb3J0SWQ7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCiAgICAgbUNibGsgPSBjYmxrOwogICAgIC8vIG5vdGUgdGhhdCBvdXRwdXQuZnJhbWVDb3VudCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIG1SZXFGcmFtZUNvdW50CiAgICAgaWYgKG91dHB1dC5mcmFtZUNvdW50IDwgbVJlcUZyYW1lQ291bnQgfHwgKG1SZXFGcmFtZUNvdW50ID09IDAgJiYgb3V0cHV0LmZyYW1lQ291bnQgPT0gMCkpIHsKLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4uCiAgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gc2VydmVyIHNpZGUuCiAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ICE9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpIHsKLSAgICAgICAgQUxPR1coIlNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC04NzIsNyArODg3LDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHdhaXRDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKQEAgLTk4MSw3ICs5OTYsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMDM4LDcgKzEwNTQsNyBAQAogICAgICAgICAgICAgcG9sbFVzIDw8PSAxOwogICAgICAgICB9IHdoaWxlICh0cnlDb3VudGVyLS0gPiAwKTsKICAgICAgICAgaWYgKHRyeUNvdW50ZXIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTExNjEsNyArMTE3Nyw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0xMTczLDE2ICsxMTkwLDE4IEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTIwNCw4ICsxMjIzLDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiAgRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTI2NSw3ICsxMjg0LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOworICAgIEFMT0dXKCIlcyglZCk6IGRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgX19mdW5jX18sIG1Qb3J0SWQsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CkBAIC0xMjg1LDEwICsxMzA0LDcgQEAKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRocmVhZCBvciBzeW5jIGV2ZW50IGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGZhaWxzIGlmIHdlIGhhdmUgYSBuZXcgQXVkaW9GbGluZ2VyIGluc3RhbmNlCkBAIC0xMjk5LDE1ICsxMzE1LDE3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVJlY29yZF9sKCkgZmFpbGVkIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gaWYgbm8gcmV0cmllcyBsZWZ0LCBzZXQgaW52YWxpZCBiaXQgdG8gZm9yY2UgcmVzdG9yaW5nIGF0IG5leHQgb2NjYXNpb24KKyAgICAgICAgLy8gYW5kIGF2b2lkIGluY29uc2lzdGVudCBhY3RpdmUgc3RhdGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKKyAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEzMTYsMTggKzEzMzQsMTggQEAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CkBAIC0xMzQwLDEyICsxMzU4LDEyIEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CkBAIC0xMzg0LDYgKzE0MDIsMTcgQEAKICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykudHJhbnNhY3Rpb25FcnJvcigpOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpAQCAtMTQ1MCw3ICsxNDc5LDcgQEAKICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoKSByZXR1cm5lZCAlbGxkIiwgX19mdW5jX18sIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGMwNzI5MDEuLjAxZDliM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNTIxLDEwICs1MjIsMTIgQEAKICAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotCisgICAgVmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBib29sIGRldmljZVZhbGlkT3JDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGJvb2wgc2VuZENhbGxiYWNrcyA9IGZhbHNlOworICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKQEAgLTU0MiwxMSArNTQ1LDE3IEBACiAgICAgICAgICAgICBpZiAoaW9EZXNjLT5nZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfUkVHSVNURVJFRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9SRUdJU1RFUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSAoaW9JbmRleCA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KS5ub3RpZmllZE9uY2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwKQEAgLTU2OCw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogCiAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CkBAIC01ODMsMTEgKzU5MiwxMCBAQAogICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOwogCiAgICAgICAgICAgICBpZiAoZGV2aWNlSWQgIT0gaW9EZXNjLT5nZXREZXZpY2VJZCgpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSBpb0luZGV4ID49IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLApAQCAtNTk4LDI0ICs2MDYsMzQgQEAKIAogICAgICAgICB9IGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotICAgIGJvb2wgY2FsbGJhY2tSZW1vdmVkID0gZmFsc2U7Ci0gICAgLy8gY2FsbGJhY2tzLnNpemUoKSAhPSAwID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyApIHsKLSAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBjYWxsYmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlZCA9IHRydWU7CisKKyAgICAgICAgLy8gc2VuZENhbGxiYWNrcyB0cnVlID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCisgICAgICAgIGlmIChzZW5kQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyAmY2FsbGJhY2tQcm94aWVzID0KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuZWRpdFZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7ICkgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tQcm94aWVzW2ldLT5jYWxsYmFjaygpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGRldmljZSBhY3R1YWxseSBjaGFuZ2VkLCB0aGUgaW5wdXQgb3Igb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBvcGVuZWQgb3IgY2xvc2VkIG9yIHRoZSBjbGllbnQgd2FzIG5ld2x5IHJlZ2lzdGVyZWQgYW5kIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAvLyB3YXMgbmV2ZXIgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGJhY2tQcm94aWVzW2ldLT5ub3RpZmllZE9uY2UoKSB8fCBkZXZpY2VWYWxpZE9yQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzVG9DYWxsLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXNbaV0tPnNldE5vdGlmaWVkT25jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbGJhY2tQcm94aWVzLnNldE5vdGlmaWVkT25jZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIGNsZWFuIHVwIGNhbGxiYWNrIGxpc3Qgd2hpbGUgd2UgYXJlIGhlcmUgaWYgc29tZSBjbGllbnRzIGhhdmUgZGlzYXBwZWFyZWQgd2l0aG91dAotICAgIC8vIHVucmVnaXN0ZXJpbmcgdGhlaXIgY2FsbGJhY2sKLSAgICBpZiAoY2FsbGJhY2tSZW1vdmVkKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGNhbGxiYWNrcyk7CisKKyAgICAvLyBDYWxsYmFja3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBtTG9jayBoZWxkLiBNYXkgbGVhZCB0byBkZWFkIGxvY2sgaWYgY2FsbGluZyBmb3IKKyAgICAvLyBleGFtcGxlIGdldFJvdXRlZERldmljZSB0aGF0IHVwZGF0ZXMgdGhlIGRldmljZSBhbmQgdHJpZXMgdG8gYWNxdWlyZSBtTG9jay4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrc1RvQ2FsbC5zaXplKCk7IGkrKykgeworICAgICAgICBjYWxsYmFja3NUb0NhbGxbaV0tPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CiB9CiAKQEAgLTY3MSwyMCArNjg5LDIxIEBACiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOworICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllczsKKyAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShhdWRpb0lvKTsKICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICBjYWxsYmFja1Byb3hpZXMgPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9Ci0gICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7Ci0KLSAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7CisgICAgY2FsbGJhY2tQcm94aWVzLmFkZChuZXcgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KGNhbGxiYWNrKSk7CisgICAgY2FsbGJhY2tQcm94aWVzLnJlc2V0Tm90aWZpZWRPbmNlKCk7CisgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja1Byb3hpZXMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjkyLDI2ICs3MTEsMjYgQEAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKLQorICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy52YWx1ZUF0KGlvSW5kZXgpOwogICAgIHNpemVfdCBjYkluZGV4OwotICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoY2JJbmRleCA9PSBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgaWYgKGNiSW5kZXggPT0gY2FsbGJhY2tQcm94aWVzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGNhbGxiYWNrcy5yZW1vdmVBdChjYkluZGV4KTsKLSAgICBpZiAoY2FsbGJhY2tzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tzKTsKKyAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoY2JJbmRleCk7CisgICAgaWYgKGNhbGxiYWNrUHJveGllcy5zaXplKCkgIT0gMCkgeworICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrUHJveGllcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlbW92ZUl0ZW0oYXVkaW9Jbyk7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03ODQsNyArODAzLDggQEAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9ICIiOwpAQCAtNzk4LDcgKzgxOCw3IEBACiAgICAgaWYgKGRldmljZV9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgbmFtZSA9IGRldmljZV9uYW1lOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgYWRkcmVzcywgbmFtZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtODEyLDcgKzgzMiw4IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiIjsKQEAgLTgyNiw3ICs4NDcsNyBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgYWRkcmVzcywgbmFtZSk7CisgICAgcmV0dXJuIGFwcy0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTg2OSw0MCArODkwLDM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwgc2Vjb25kYXJ5T3V0cHV0cyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQocG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChwb3J0SWQpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuOwotICAgIGFwcy0+cmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgYXBzLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtOTIzLDExICs5MzksMTEgQEAKICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQsIHNpbGVuY2VkKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC05NzQsNyArOTkwLDcgQEAKIHVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTEyNDIsMjAgKzEyNTgsMzMgQEAKICAgICByZXR1cm4gYXBzLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzLCByZWdpc3RyYXRpb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCkBAIC0xMjcyLDYgKzEzMDEsMjAgQEAKICAgICByZXR1cm4gYXBzLT5nZXRNYXN0ZXJNb25vKG1vbm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+Z2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKK30KKwogZmxvYXQgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZURCKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKQEAgLTEzMDQsNiArMTM0Nyw4OCBAQAogICAgIHJldHVybiBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+c2V0QXNzaXN0YW50VWlkKHVpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7Cit9CisKK2Jvb2wgQXVkaW9TeXN0ZW06OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSB7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+CisgICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoZm9ybWF0cyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CisgICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihhdHRyVmVjdCksIGVuZChhdHRyVmVjdCksIFsmc3RyZWFtXShjb25zdCBhdXRvICZhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0U3RyZWFtVHlwZSgpID09IHN0cmVhbTsgfSk7CisgICAgICAgIGlmIChpdGVyICE9IGVuZChhdHRyVmVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5SWQgPQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzKGF0dHIpKTsKKyAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciBzdHJhdGVnaWVzOworICAgIGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBzdHJhdGVnaWVzKSB7CisgICAgICAgIGlmIChzdHJhdGVneS5nZXRJZCgpID09IHN0cmF0ZWd5SWQpIHsKKyAgICAgICAgICAgIGF1dG8gYXR0clZlY3QgPSBzdHJhdGVneS5nZXRBdWRpb0F0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihhdHRyVmVjdCksIGVuZChhdHRyVmVjdCksIFsmYXR0cl0oY29uc3QgYXV0byAmcmVmQXR0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQXR0ci5nZXRBdHRyaWJ1dGVzKCksIGF0dHIpOyB9KTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZChhdHRyVmVjdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0U3RyZWFtVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCJpbnZhbGlkIGF0dHJpYnV0ZXMgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIHN0cmVhbSIsICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKKyAgICByZXR1cm4gYXBzLT5nZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTEzNjksOSArMTQ5NCwxNCBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMTM3OSw3ICsxNTA5LDggQEAKICAgICB9CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggYTM0MTNlMS4uNzg4MWJiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTMxLDkgKzMxLDEwIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKQEAgLTEyMSwyMiArMTIyLDIyIEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgZnJhbWUgY291bnQgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0xNDksMTUgKzE1MCwyNCBAQAogICAgIC8vIEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUlOIDw9IHNhbXBsZVJhdGUgPD0gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NQVguCiAgICAgLy8gUmV0dXJuIGVycm9yIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCi0gICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgQUxPR1YoIiVzKCk6IGdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLy8gc3RhdGljCitib29sIEF1ZGlvVHJhY2s6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX0ZVTkNUSU9OX18pOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlKSB7CkBAIC0yMDIsNyArMjEyLDcgQEAKICAgICAvLyBYWFg6IHNoYWxsIHdlIGdhdGhlciBhbHRlcm5hdGl2ZSBpbmZvIGlmIGZhaWxpbmc/CiAgICAgY29uc3Qgc3RhdHVzX3QgbHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKICAgICBpZiAobHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRCgibm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgKGludCkgbHN0YXR1cyk7CisgICAgICAgIEFMT0dEKCIlcygpOiBubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgKGludCkgbHN0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM1NCw3ICszNjQsOCBAQAogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCksIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KQEAgLTM4Nyw4ICszOTgsMTAgQEAKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAlZCwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIHVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCB1aWQsIHBpZCk7CiAKQEAgLTQwNyw4ICs0MjAsMTAgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlICVzIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQxNiwyMCArNDMxLDIxIEBACiAgICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQzNywxNCArNDUzLDE1IEBACiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogICAgIG1Eb05vdFJlY29ubmVjdCA9IGRvTm90UmVjb25uZWN0OwogCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQ1NSw3ICs0NzIsNyBAQAogICAgIH0KICAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgewogICAgICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIF9fZnVuY19fLCBzdHJlYW1UeXBlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDY0LDE5ICs0ODEsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IgorICAgICAgICAgICAgICAgICIgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayBkZWVwIGJ1ZmZlciBhZnRlciBmbGFncyBoYXZlIGJlZW4gbW9kaWZpZWQgYWJvdmUKLSAgICAgICAgaWYgKGZsYWdzID09IEFVRElPX09VVFBVVF9GTEFHX05PTkUgJiYgKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgfQorICAgICAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MobUF0dHJpYnV0ZXMuZmxhZ3MsICZmbGFncyk7CiAgICAgfQogCiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgpAQCAtNDg4LDE0ICs0OTgsMTQgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC01MDgsOCArNTE4LDkgQEAKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKICAgICAgICAgICAgIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1YoIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAgID8gIk9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICA6ICJOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICAgID8gIiVzKCk6IE9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgorICAgICAgICAgICAgICAgICAgICA6ICIlcygpOiBOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgY2FuJ3Qgd2UgYWxsb3cgZGlyZWN0IEFORCBmYXN0PwogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwpAQCAtNTY1LDE0ICs1NzYsMTQgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNTgyLDcgKzU5Myw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gbWluKG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCiAgICAgICAgICAgICAgICAgbWF4KCh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwogICAgICAgICBBTE9HV19JRihtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAhPSAodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICAiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwpAQCAtNjA5LDggKzYyMSwxMCBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKLSAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7Ci0KKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOworICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1RyYWNrLmgKQEAgLTY1OCw2ICs2NzIsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c3RhcnQoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOwogCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNjk3LDcgKzcxMiw4IEBACiAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2lkZSBoYXMgY29uc3VtZWQgc29tZXRoaW5nLCBidXQgaXMgaXQgZmluaXNoZWQgY29uc3VtaW5nPwogICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgc2luY2UgZmx1c2ggYW5kIHN0b3AgYXJlIGFzeW5jaHJvbm91cyB0aGF0IHRoZSBzZXJ2ZXIKICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHBvaW50LgotICAgICAgICAgICAgQUxPR1YoInN0YXJ0OiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSksCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1GbHVzaGVkLApAQCAtNzU4LDcgKzc3NCw3IEBACiAgICAgICAgIC8vIFN0YXJ0IG91ciBsb2NhbCBWb2x1bWVIYW5kbGVyIGZvciByZXN0b3JhdGlvbiBwdXJwb3Nlcy4KICAgICAgICAgbVZvbHVtZUhhbmRsZXItPnNldFN0YXJ0ZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgbVN0YXRlID0gcHJldmlvdXNTdGF0ZTsKICAgICAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTc3Niw2ICs3OTIsOCBAQAogdm9pZCBBdWRpb1RyYWNrOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc4NSw3ICs4MDMsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiAgICAgICAgIEFMT0dEX0lGKG1TaGFyZWRCdWZmZXIgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAic3RvcCgpIGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBtUmVsZWFzZWQudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtUmVsZWFzZWQudmFsdWUoKSk7CiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCkBAIC04MDYsNiArODI0LDEwIEBACiAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAvLyBFVkVOVF9TVFJFQU1fRU5EIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICB0LT53YWtlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIG1QcmV2aW91c1ByaW9yaXR5KTsKQEAgLTgyMSwxMCArODQzLDEyIEBACiAKIHZvaWQgQXVkaW9UcmFjazo6Zmx1c2goKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODUzLDYgKzg3Nyw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnBhdXNlKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORykgewpAQCAtODc4LDcgKzkwNCw4IEBACiAKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTMyLDEwICs5NTksMTMgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMgcmF0ZToldSIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSksIHJhdGUpOworCiAgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKQorICAgICAgICAgICAgfHwgKG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtOTk3LDggKzEwMjcsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSAoaW5wdXQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIC8vIHBpdGNoIGlzIGVtdWxhdGVkIGJ5IGFkanVzdGluZyBzcGVlZCBhbmQgc2FtcGxlUmF0ZQogICAgIGNvbnN0IHVpbnQzMl90IGVmZmVjdGl2ZVJhdGUgPSBhZGp1c3RTYW1wbGVSYXRlKG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVTcGVlZCA9IGFkanVzdFNwZWVkKHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwpAQCAtMTAwNywzMiArMTAzNywzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjMzLDcgKzEyNjMsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM2MCw3ICsxMzkxLDcgQEAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9UcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcyk7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBtU3RyZWFtVHlwZTsKIH0KQEAgLTEzNzksNyArMTQxMCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzk1LDYgKzE0MjYsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTE0MDcsNyArMTQzOSw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQyNiwxMSArMTQ1OSwxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDM4LDcgKzE0NzQsNyBAQAogCiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOworICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobVN0cmVhbVR5cGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKICAgICB9CkBAIC0xNDc5LDcgKzE1MTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE1MDAsNiArMTUzNyw3IEBACiAgICAgbUFmRnJhbWVDb3VudCA9IG91dHB1dC5hZkZyYW1lQ291bnQ7CiAgICAgbUFmU2FtcGxlUmF0ZSA9IG91dHB1dC5hZlNhbXBsZVJhdGU7CiAgICAgbUFmTGF0ZW5jeSA9IG91dHB1dC5hZkxhdGVuY3lNczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKIAogICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKIApAQCAtMTUwOSwxMyArMTU0NywxMyBAQAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTE1MzQsMTQgKzE1NzIsMTQgQEAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAotICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBtUmVxRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQogICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKQEAgLTE1NjksNyArMTYwNyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0xNjU4LDcgKzE2OTYsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc2OCw3ICsxODA2LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzc4LDcgKzE4MTcsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzk1LDcgKzE4MzQsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODI4LDcgKzE4NjgsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTg1Nyw3ICsxOTA3LDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDgxLDggKzIxMzIsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDk4LDcgKzIxNDksOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjExMCwxOCArMjE2MiwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjE0MSwxNyArMjE5NSwzMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyNDIsOCArMjMxMCw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI4NiwxMCArMjM1NCw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIzMDQsNyArMjM2OSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMzQsMTQgKzIzOTksMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNTksOCArMjQyOCw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM4MCw5ICsyNDQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjQwMCw3ICsyNDcwLDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MjcsNyArMjQ5OCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ2OCw3ICsyNTM5LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI1MTEsNyArMjU4Myw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1NDUsNyArMjYxOCw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTYwLDggKzI2MzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NjksNyArMjY0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgpAQCAtMjU5Myw3ICsyNjY4LDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyByaWdodCBhZnRlciBBdWRpb1RyYWNrIGlzIHN0YXJ0ZWQsIG9uZSBtYXkgbm90IGZpbmQgYSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICBBTE9HVigiZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTI2MDMsNyArMjY3OCw4IEBACiAgICAgICAgICAgICAvLyB0byBiZSB6ZXJvIHdlIGNvbnZlcnQgdGhpcyB0byBXT1VMRF9CTE9DSyAod2l0aCB0aGUgaW1wbGljaXQgbWVhbmluZyBvZgogICAgICAgICAgICAgLy8gInplcm8iIGZvciBOdVBsYXllcikuICBXZSBkb24ndCBjb252ZXJ0IGZvciB0cmFjayByZXN0b3JhdGlvbiBhcyBwb3NpdGlvbgogICAgICAgICAgICAgLy8gZG9lcyBub3QgcmVzZXQuCi0gICAgICAgICAgICBBTE9HVigidGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0LCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKTsKICAgICAgICAgICAgIGlmIChtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCAhPSBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IFdPVUxEX0JMT0NLOwpAQCAtMjYxMSw3ICsyNjg3LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICIlcyglZCk6IGdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CkBAIC0yNjUwLDggKzI3MjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBtYXkgaGF2ZSBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRighbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CkBAIC0yNzE5LDggKzI3OTYsOSBAQAogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKWxpbWl0TnMsIChsb25nIGxvbmcpbVN0YXJ0TnMpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXROcyk7CiAgICAgICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IGxpbWl0TnM7CkBAIC0yNzI4LDcgKzI4MDYsOCBAQAogCiAgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CiAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KQEAgLTI3NDEsNyArMjgyMCw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCiAgICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CkBAIC0yNzYxLDcgKzI4NDEsOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY29tcHV0ZWRTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTI4MDcsMTEgKzI4ODgsMTIgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKG1BdHRyaWJ1dGVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCk7CkBAIC0yODUwLDE4ICsyOTMyLDE4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CkBAIC0yODc0LDcgKzI5NTYsNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yOTg1LDcgKzMwNjcsNyBAQAogICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gd2UncmUgbm90IGFjdGl2ZQogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IEludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0zMDAxLDcgKzMwODMsOCBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgd2FpdCA9ICh0cy5tUG9zaXRpb24gPT0gMCB8fCB0cy5tUG9zaXRpb24gPT0gbVN0YXJ0VHMubVBvc2l0aW9uKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICB0cy5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUcy5tUG9zaXRpb24pOwpAQCAtMzAyMiw3ICszMTA1LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWV0cy5tUG9zaXRpb25bbG9jYXRpb25dLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pOwpAQCAtMzA5Nyw3ICszMTgxLDggQEAKICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoJWQpOiBwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY2VpdmVyLm1Qb3J0SWQsIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAwMWY0MDBkLi5jOTk3Y2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMjYsNiArMjYsMjQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUT0RPOiBjb25zaWRlciBwdWxsaW5nIHRoaXMgaW50byBhIHNoYXJlZCBoZWFkZXIuCisvLyBzYWZlX3N1Yl9vdmVyZmxvdyBpcyB1c2VkIGVuc3VyZSB0aGF0IHN1YnRyYWN0aW9uIG9jY3VycyBpbiB0aGUgc2FtZSBuYXRpdmUgdHlwZQorLy8gd2l0aCBwcm9wZXIgMidzIGNvbXBsZW1lbnQgb3ZlcmZsb3cuICBXaXRob3V0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaXQgaXMgcG9zc2libGUsCisvLyBmb3IgZXhhbXBsZSwgdGhhdCBvcHRpbWl6aW5nIGNvbXBpbGVycyBtYXkgZWxlY3QgdG8gdHJlYXQgMzIgYml0IHN1YnRyYWN0aW9uCisvLyBhcyA2NCBiaXQgc3VidHJhY3Rpb24gd2hlbiBzdG9yaW5nIGludG8gYSA2NCBiaXQgZGVzdGluYXRpb24gYXMgaW50ZWdlciBvdmVyZmxvdyBpcworLy8gdGVjaG5pY2FsbHkgdW5kZWZpbmVkLgordGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgIHR5cGVuYW1lIFUsCisgICAgICAgICB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHN0ZDo6ZGVjYXlfdDxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjYXlfdDxVPj57fT4+CisgICAgICAgICAvLyBlbnN1cmUgYXJndW1lbnRzIGFyZSBzYW1lIHR5cGUgKGlnbm9yaW5nIHZvbGF0aWxlLCB3aGljaCBpcyB1c2VkIGluIGNibGsgdmFyaWFibGVzKS4KK2F1dG8gc2FmZV9zdWJfb3ZlcmZsb3coY29uc3QgVCYgYSwgY29uc3QgVSYgYikgeworICAgIHN0ZDo6ZGVjYXlfdDxUPiByZXN1bHQ7CisgICAgKHZvaWQpX19idWlsdGluX3N1Yl9vdmVyZmxvdyhhLCBiLCAmcmVzdWx0KTsKKyAgICAvLyBub3RlIGlmIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cgcmV0dXJucyB0cnVlLCBhbiBvdmVyZmxvdyBvY2N1cnJlZC4KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvLyB1c2VkIHRvIGNsYW1wIGEgdmFsdWUgdG8gc2l6ZV90LiAgVE9ETzogbW92ZSB0byBhbm90aGVyIGZpbGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHNpemVfdCBjbGFtcFRvU2l6ZShUIHgpIHsKQEAgLTE4Niw3ICsyMDQsNyBAQAogICAgICAgICAgICAgZnJvbnQgPSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgICAgICB9CiAgICAgICAgIC8vIHdyaXRlIHRvIHJlYXIsIHJlYWQgZnJvbSBmcm9udAotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7CkBAIC02ODQsNyArNzAyLDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdGcm9udCA9IChmcm9udCAmIH5tYXNrKSB8IChmbHVzaCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBuZXdGcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBuZXdGcm9udCk7CiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCiAgICAgICAgICAgICAvLyBzbyByZWJhc2luZyBuZXdGcm9udCBvbiB0aGUgZnJvbnQgb2Zmc2V0IGlzIG9mZiBieSB0aGUgb3ZlcmZsb3cgYml0LgpAQCAtNzI2LDcgKzc0NCw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3UmVhciA9IChyZWFyICYgfm1hc2spIHwgKHN0b3AgJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBuZXdSZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cobmV3UmVhciwgZnJvbnQpOwogICAgICAgICAvLyBvdmVyZmxvd0JpdCBpcyB1bnNpZ25lZCwgc28gY2FzdCB0byBzaWduZWQgZm9yIGNvbXBhcmlzb24uCiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCkBAIC03NzgsNyArNzk2LDcgQEAKICAgICAgICAgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgICAgICByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOwogICAgIH0KLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkwNSw3ICs5MjMsNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MzEsNyArOTQ5LDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCiAgICAgfQpAQCAtMTIzMyw2ICsxMjUxLDIxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorc2l6ZV90IEF1ZGlvUmVjb3JkU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1NodXRkb3duKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtQ2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDlmM2I3NDIuLjgyNWNkNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yNCwxMCArMjQsOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODksNiArODcsOCBAQAogICAgIFNZU1RFTV9SRUFEWSwKICAgICBGUkFNRV9DT1VOVF9IQUwsCiAgICAgR0VUX01JQ1JPUEhPTkVTLAorICAgIFNFVF9NQVNURVJfQkFMQU5DRSwKKyAgICBHRVRfTUFTVEVSX0JBTEFOQ0UsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0yNDQsNiArMjQ0LDM0IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQoYmFsYW5jZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0JBTEFOQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqYmFsYW5jZSA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogICAgIHsKQEAgLTYwMCwxNCArNjI4LDE4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CiAgICAgewotICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlKHBUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHByZWZlcnJlZFR5cGVGbGFnKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTYzNiwxMCArNjY4LDEwIEBACiAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdDsKIAogICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05MTIsNyArOTQ0LDcgQEAKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgogICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTUxLDkgKzk4Myw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBjaGFyIHRpbWVDaGVja1N0cmluZ1s2NF07Ci0gICAgc25wcmludGYodGltZUNoZWNrU3RyaW5nLCBzaXplb2YodGltZUNoZWNrU3RyaW5nKSwgIklBdWRpb0ZsaW5nZXI6ICVkIiwgY29kZSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRpbWVDaGVja1N0cmluZyk7CisgICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9GbGluZ2VyIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKKyAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOwogCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOiB7CkBAIC0xMDQ5LDYgKzEwODAsMjEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBtYXN0ZXJNdXRlKCkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0JBTEFOQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0TWFzdGVyQmFsYW5jZShkYXRhLnJlYWRGbG9hdCgpKSApOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9NQVNURVJfQkFMQU5DRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGZsb2F0IGY7CisgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJCYWxhbmNlKCZmKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcmVwbHktPndyaXRlRmxvYXQoZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTEyODAsOCArMTMyNiwxMSBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKICAgICAgICAgICAgIGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnID0gZGF0YS5yZWFkVWludDMyKCk7CiAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZkZXNjKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZ0eXBlLCBwcmVmZXJyZWRUeXBlRmxhZywgJmRlc2MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDhjZDRhODUuLjFiY2UxNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNCwxMSArMjQsMTAgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYzLDYgKzYyLDcgQEAKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKICAgICBJU19PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRCwKICAgICBMSVNUX0FVRElPX1BPUlRTLAogICAgIEdFVF9BVURJT19QT1JULAogICAgIENSRUFURV9BVURJT19QQVRDSCwKQEAgLTgyLDcgKzgyLDE5IEBACiAgICAgR0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCLAogICAgIEdFVF9TVVJST1VORF9GT1JNQVRTLAotICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRAorICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRCwKKyAgICBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULAorICAgIFNFVF9BU1NJU1RBTlRfVUlELAorICAgIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsCisgICAgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwKKyAgICBTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsCisgICAgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsCisgICAgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLAogfTsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNApAQCAtOTksNyArMTExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNyw2ICsxMjAsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0ZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTEyNSwxMyArMTM5LDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfbmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGVuY29kZWRGb3JtYXQpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CkBAIC0xNzMsMTYgKzE4OSwxNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgb3ZlcnJpZGUKICAgICAgICAgewogICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMDgsNiArMjI1LDEwIEBACiAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIgTlVMTCBwb3J0SWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWNvbmRhcnlPdXRwdXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdHRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjQyLDQ0ICsyNjMsMzQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+cmVzaXplKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS5yZWFkKHNlY29uZGFyeU91dHB1dHMtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnNpemUoKSAqIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwogICAgICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMzM2LDE2ICszNDcsMTMgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAqc2lsZW5jZWQgPSByZXBseS5yZWFkSW50MzIoKSA9PSAxOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNDEzLDcgKzQyMSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkVWludDMyKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKQEAgLTUzMyw2ICs1NDEsMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNzUzLDExICs3NzEsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZShzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKQEAgLTc3MCwxNSArNzg4LDE1IEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfQVVESU9fU09VUkNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtODc5LDYgKzg5NywyMjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKKyAgICB7CisgICAgICAgIGlmIChmb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxPQURfRk9STUFUU19BMkRQLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxpc3Rfc2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Rfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3JtYXRzLT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHJlcGx5LnJlYWRJbnQzMigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2FnZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVNTSVNUQU5UX1VJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkcy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gdWlkIDogdWlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOworICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzaXplKTsKKyAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCkgcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG51bVN0cmF0ZWdpZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJhdGVnaWVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneSBzdHJhdGVneTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdHJhdGVneS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVhZCBzdHJhdGVnaWVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ2llcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayhzdHJhdGVneSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC04OTcsNyArMTEzMyw2IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6CiAgICAgICAgIGNhc2UgU1RPUF9JTlBVVDoKICAgICAgICAgY2FzZSBSRUxFQVNFX0lOUFVUOgotICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNOgogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0VGRkVDVDoKICAgICAgICAgY2FzZSBSRUdJU1RFUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgVU5SRUdJU1RFUl9FRkZFQ1Q6CkBAIC05MzIsMTEgKzExNjcsMTQgQEAKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKICAgICAgICAgY2FzZSBSRUdJU1RFUl9QT0xJQ1lfTUlYRVM6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NT05POgotICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKLSAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzoKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk0OCw5ICsxMTg2LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvUG9saWN5U2VydmljZTogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKQEAgLTk2MSw2ICsxMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUgZm9yIGRldmljZSAldSIsIGRldmljZSk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwpAQCAtOTY4LDcgKzEyMDYsOCBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTk5NCwxMyArMTIzMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTEwNjMsNDggKzEzMDUsMzkgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRyKGhhc0F0dHJpYnV0ZXMgPyAmYXR0ciA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsIHNlc3Npb24sICZzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS0+d3JpdGUoc2Vjb25kYXJ5T3V0cHV0cy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExMzksMTAgKzEzNzIsOCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExOTgsNyArMTQyOSw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTMxMyw2ICsxNTQ0LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgPSAoYXVkaW9fcG9ydF9yb2xlX3QpZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0OTgsMTcgKzE3NDEsMTcgQEAKICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKCZhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJmhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmcG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMTU4Nyw2ICsxODMwLDIwMiBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZW5jb2RpbmdGb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgmZW5jb2RpbmdGb3JtYXRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGluZ0Zvcm1hdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuY29kaW5nRm9ybWF0cy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihlbmNvZGluZ0Zvcm1hdHNbaV0pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisKKyAgICAgICAgY2FzZSBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSA9IChhdWRpb191c2FnZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfQVNTSVNUQU5UX1VJRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludDMyX3QgdWlkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnVpZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEFzc2lzdGFudFVpZCh1aWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfQTExWV9TRVJWSUNFU19VSURTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IHVpZHM7CisgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGludDMyX3QgdWlkOworICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpZHMucHVzaF9iYWNrKHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUJvb2woaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOyAgICAKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciBzdHJhdGVnaWVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmF0ZWdpZXMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ2llc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKaW5kZXggYWQ3ZjFkZS4uMWY5ZWFiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTUyLDEyICs1MiwzNyBAQAogICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGRhdGEucmVhZCgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBjbGllbnRJbmZvLT5zaWxlbmNlZCA9IGRhdGEucmVhZEJvb2woKTsKIH0KIAotaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CiAgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7CisgICAgZGF0YS53cml0ZSgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBkYXRhLndyaXRlQm9vbChjbGllbnRJbmZvLT5zaWxlbmNlZCk7Cit9CisKK2lubGluZSB2b2lkIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+ICplZmZlY3RzKSB7CisgICAgaW50MzJfdCBudW1FZmZlY3RzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBlZmZlY3Q7CisgICAgICAgIGlmIChkYXRhLnJlYWQoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKCplZmZlY3RzKS5wdXNoX2JhY2soZWZmZWN0KTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGVmZmVjdHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKyAgICAgICAgaWYgKGRhdGEud3JpdGUoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTkyLDE2ICsxMTcsMjQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1JWF9TVEFURV9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOworICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBjbGllbnRDb25maWcpOworICAgICAgICB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKGRhdGEsIGNsaWVudEVmZmVjdHMpOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGRldmljZUNvbmZpZyk7CisgICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgZWZmZWN0cyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwYXRjaEhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc291cmNlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogfTsKQEAgLTEzOSwxMCArMTcyLDE1IEBACiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKICAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50RWZmZWN0cyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmZWZmZWN0cyk7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAppbmRleCBhZGZmMDU3Li44M2E1NjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCkBAIC0zOSw2ICszOSw3IEBACiAgICAgUEFVU0UsCiAgICAgQVRUQUNIX0FVWF9FRkZFQ1QsCiAgICAgU0VUX1BBUkFNRVRFUlMsCisgICAgU0VMRUNUX1BSRVNFTlRBVElPTiwKICAgICBHRVRfVElNRVNUQU1QLAogICAgIFNJR05BTCwKICAgICBBUFBMWV9WT0xVTUVfU0hBUEVSLApAQCAtMTI3LDYgKzEyOCwxOSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByZXNlbnRhdGlvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByb2dyYW1JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRUxFQ1RfUFJFU0VOVEFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMzksNiArMjUzLDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRUxFQ1RfUFJFU0VOVEFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdFByZXNlbnRhdGlvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX1RJTUVTVEFNUDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDVjNWRiZDYuLjUzNmIwMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlICJtZWRpYS9Ub25lR2VuZXJhdG9yLmgiCiAKIApAQCAtMTI0Miw3ICsxMjQxLDcgQEAKICAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKICAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOwogICAgIH0KLSAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKHN0cmVhbVR5cGUsICZhdHRyKTsKKyAgICBhdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoc3RyZWFtVHlwZSk7CiAKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IG1Qcm9jZXNzU2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcEF1ZGlvVHJhY2stPnNldCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAppbmRleCAwMWUwYTcxLi5jZjljN2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0zNiw0ICszNiwxMiBAQAogICAvKiBHZXQgYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIG1pY3JvcGhvbmVzLgogICAgKi8KICAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9bXSBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgLyogU2V0IHRoZSBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpLgorICAgKi8KKyAgdm9pZCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworCisgIC8qIFNldCB0aGUgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykuCisgICAqLworICB2b2lkIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjI2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9BdHRyaWJ1dGVzIDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb0F0dHJpYnV0ZXMoKSA9IGRlZmF1bHQ7CisgICAgQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgOiBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7fQorICAgIEF1ZGlvQXR0cmlidXRlcyh1aW50MzJfdCBncm91cElkLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSA6CisgICAgICAgICBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbVN0cmVhbVR5cGUoc3RyZWFtKSwgbUdyb3VwSWQoZ3JvdXBJZCkge30KKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF0dHJpYnV0ZXM7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CisgICAgdWludDMyX3QgZ2V0R3JvdXBJZCgpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cElkOyB9CisKK3ByaXZhdGU6CisgICAgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbVN0cmVhbVR5cGU6IGZvciBsZWdhY3kgdm9sdW1lIG1hbmFnZW1lbnQsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjb252ZXJ0IGFuIGF0dHJpYnV0ZQorICAgICAqIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1Hcm91cElkOiBmb3IgZnV0dXJlIHZvbHVtZSBtYW5hZ2VtZW50LCBkZWZpbmUgZ3JvdXBzIHdpdGhpbiBhIHN0cmF0ZWd5IHRoYXQgZm9sbG93cworICAgICAqIHRoZSBzYW1lIGN1cnZlcyBvZiB2b2x1bWUgKGV4dGVuc2lvbiBvZiBzdHJlYW0gdHlwZXMgdG8gbWFuYWdlIHZvbHVtZSkKKyAgICAgKi8KKyAgICB1aW50MzJfdCBtR3JvdXBJZCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODhkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gcHJvZHVjdF9zdHJhdGVneV90IDogdWludDMyX3Q7Citjb25zdCBwcm9kdWN0X3N0cmF0ZWd5X3QgUFJPRFVDVF9TVFJBVEVHWV9OT05FID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PigtMSk7CisKK3VzaW5nIEF0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19hdHRyaWJ1dGVzX3Q+OwordXNpbmcgU3RyZWFtVHlwZXMgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxocywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy51c2FnZSA9PSByaHMudXNhZ2UgJiYgbGhzLmNvbnRlbnRfdHlwZSA9PSByaHMuY29udGVudF90eXBlICYmCisgICAgICAgICAgICBsaHMuZmxhZ3MgPT0gcmhzLmZsYWdzICYmIChzdGQ6OnN0cmNtcChsaHMudGFncywgcmhzLnRhZ3MpID09IDApOworfQorY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxocywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyaHMpCit7CisgICAgcmV0dXJuICEobGhzPT1yaHMpOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggMzI0YmNiOS4uNmJkNDEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtOTAsMjcgKzkwLDM0IEBACiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAotCiAgICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkIG9yIHR5cGUuCisgICAgICoKKyAgICAgKiBMb29rdXAgYW4gZWZmZWN0IGJ5IHV1aWQsIG9yIGlmIHRoYXQncyB1bnNwZWNpZmllZCAoRUZGRUNUX1VVSURfTlVMTCksCisgICAgICogZG8gc28gYnkgdHlwZSBhbmQgcHJlZmVycmVkIGZsYWdzIGluc3RlYWQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgdXVpZDogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdXVpZC4KKyAgICAgKiAgICAgIHR5cGU6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHR5cGUgdXVpZC4KKyAgICAgKiAgICAgIHByZWZlcnJlZFR5cGVGbGFnczogaWYgbXVsdGlwbGUgZWZmZWN0cyBvZiB0aGUgZ2l2ZW4gdHlwZSBleGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdHlwZSBmbGFnIHdpbGwgYmUgY2hvc2VuIG92ZXIgb25lIHdpdGhvdXQuCisgICAgICogICAgICAgICAgICAgICAgICBVc2UgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHRvIGluZGljYXRlIG5vIHByZWZlcmVuY2UuCiAgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KICAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQogICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0gICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgb3IgZGVzY3JpcHRvciBwb2ludGVycwogICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWUKICAgICAgKiAgICpkZXNjcmlwdG9yIHVwZGF0ZWQgd2l0aCBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGVzY3JpcHRvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlIHByb2Nlc3NpbmdzIGVuYWJsZWQgYnkgZGVmYXVsdApAQCAtMTQ0LDYgKzE1MSwxMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwogCiAgICAgLyoKKyAgICAgKiBHZXRzIGEgbmV3IHN5c3RlbS13aWRlIHVuaXF1ZSBlZmZlY3QgaWQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBhZGRyZXNzIHRvIHJldHVybiB0aGUgZ2VuZXJhdGVkIGlkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIG5ldyB1bmlxdWUgc3lzdGVtLXdpZGUgZWZmZWN0IGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBTdGF0aWMgbWV0aG9kcyBmb3IgYWRkaW5nL3JlbW92aW5nIHN5c3RlbS13aWRlIGVmZmVjdHMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICBzb3VyY2U6ICAgVGhlIHNvdXJjZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBzb3VyY2UsIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzdHJlYW0gb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgdXNhZ2U6ICAgIFRoZSB1c2FnZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4gVW5yZWNvZ25pemVkIHZhbHVlcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgdHJlYXRlZCBhcyBBVURJT19VU0FHRV9VTktOT1dOLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKICAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCmluZGV4IGNmN2Q5MGYuLjQxYjQyNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCkBAIC0xOCwxNyArMTgsMTkgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTUlYRVJfSAogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDEsNiArNDMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgTkJMb2cgeworY2xhc3MgV3JpdGVyOworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvTWl4ZXIKQEAgLTczLDYgKzc5LDkgQEAKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAogICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAorICAgICAgICAvLyBmb3IgaGFwdGljCisgICAgICAgIEhBUFRJQ19FTkFCTEVEICA9IDB4NDAwNywgLy8gU2V0IGhhcHRpYyBkYXRhIGZyb20gdGhpcyB0cmFjayBzaG91bGQgYmUgcGxheWVkIG9yIG5vdC4KKyAgICAgICAgSEFQVElDX0lOVEVOU0lUWSA9IDB4NDAwOCwgLy8gU2V0IHRoZSBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtOTUsNiArMTA0LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCisgICAgdHlwZWRlZiBlbnVtIHsgLy8gSGFwdGljIGludGVuc2l0eSwgc2hvdWxkIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdG9yU2VydmljZQorICAgICAgICBIQVBUSUNfU0NBTEVfTVVURSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX01VVEUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTk9ORSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX05PTkUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfSElHSCwKKyAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfSElHSCwKKyAgICB9IGhhcHRpY19pbnRlbnNpdHlfdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTyA9IDIuMGYgLyAzLjBmOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX0xPV19SQVRJTyA9IDMuMGYgLyA0LjBmOworICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgZmxvYXQgSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgPSAxLjBmOworCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBzd2l0Y2ggKGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9NVVRFOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKICAgICAgICAgLCBtRnJhbWVDb3VudChmcmFtZUNvdW50KSB7CkBAIC0xMzIsNyArMTY3LDE1IEBACiAgICAgdm9pZCAgICAgICAgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKIAogICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNvbnRyYWN0ZWQgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIGlmIGNvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIHNhdmVkCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBpZiAodC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICB0LT5jbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAodGhpcy0+Km1Ib29rKSgpOworICAgICAgICBwcm9jZXNzSGFwdGljRGF0YSgpOwogICAgIH0KIAogICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0OwpAQCAtMjMwLDYgKzI3Myw4IEBACiAgICAgICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIH0KIAogICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CkBAIC0yNDQsNiArMjg5LDExIEBACiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgICAgICB2b2lkICAgICAgICBjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKICAgICAgICAgYm9vbCAgICAgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogICAgICAgICB2b2lkICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogCkBAIC0yOTcsMTcgKzM0NywyMiBAQAogICAgICAgICAgKiBhbGwgcHJlLW1peGVyIHRyYWNrIGJ1ZmZlciBjb252ZXJzaW9ucyBvdXRzaWRlIHRoZSBBdWRpb01peGVyIGNsYXNzLgogICAgICAgICAgKgogICAgICAgICAgKiAxKSBtSW5wdXRCdWZmZXJQcm92aWRlcjogVGhlIEF1ZGlvVHJhY2sgYnVmZmVyIHByb3ZpZGVyLgotICAgICAgICAgKiAyKSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bworICAgICAgICAgKiAyKSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjogRXhwZW5kIG9yIGNvbnRyYWN0cyBkYXRhCisgICAgICAgICAqIDMpIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6IE5vbi1kZXN0cnVjdGl2ZWx5IGFkanVzdCBzYW1wbGUgZGF0YQorICAgICAgICAgKiA0KSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bwogICAgICAgICAgKiAgICBtYXRjaCBlaXRoZXIgbU1peGVySW5Gb3JtYXQgb3IgbURvd25taXhSZXF1aXJlc0Zvcm1hdCwgaWYgdGhlIGRvd25taXhlcgogICAgICAgICAgKiAgICByZXF1aXJlcyByZWZvcm1hdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IGlucHV0IHRvCiAgICAgICAgICAqICAgIFBDTV8xNl9iaXQgaWYgdGhhdCdzIHJlcXVpcmVkIGJ5IHRoZSBkb3dubWl4ZXIuCi0gICAgICAgICAqIDMpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCisgICAgICAgICAqIDUpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCiAgICAgICAgICAqICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWlyZWQgYnkgdGhlIG1peGVyIHNpbmsuCi0gICAgICAgICAqIDQpIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyByZWZvcm1hdHRpbmcgZnJvbQorICAgICAgICAgKiA2KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KICAgICAgICAgICogICAgdGhlIGRvd25taXhlciByZXF1aXJlbWVudHMgdG8gdGhlIG1peGVyIGVuZ2luZSBpbnB1dCByZXF1aXJlbWVudHMuCi0gICAgICAgICAqIDUpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCisgICAgICAgICAqIDcpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCiAgICAgICAgICAqLwogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAvLyBUT0RPOiBjb21iaW5lIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgYW5kIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwpAQCAtMzM2LDYgKzM5MSw1MSBAQAogCiAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CiAKKyAgICAgICAgLy8gSGFwdGljCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgIGhhcHRpY19pbnRlbnNpdHlfdCAgIG1IYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdEluQ2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50OworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVsczsKKworICAgICAgICBmbG9hdCBnZXRIYXB0aWNTY2FsZUdhbW1hKCkgY29uc3QgeworICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCisgICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiAyLjBmOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMS41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfSElHSDoKKyAgICAgICAgICAgIHJldHVybiAwLjVmOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC4yNWY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMS4wZjsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljTWF4QW1wbGl0dWRlUmF0aW8oKSBjb25zdCB7CisgICAgICAgIC8vIE5lZWQgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlIGluIFZpYnJhdG9yU2VydmljZS4KKyAgICAgICAgc3dpdGNoIChtSGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgorICAgICAgICAgICAgcmV0dXJuIEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTzsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIEhBUFRJQ19TQ0FMRV9MT1dfUkFUSU87CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX05PTkU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKKyAgICAgICAgICAgIHJldHVybiAxLjBmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgLy8gaG9va3MKICAgICAgICAgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKQEAgLTM3Miw2ICs0NzIsOCBAQAogICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KICAgICB2b2lkIHByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjaygpOwogCisgICAgdm9pZCBwcm9jZXNzSGFwdGljRGF0YSgpOworCiAgICAgc3RhdGljIHByb2Nlc3NfaG9va190IGdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKaW5kZXggOTY3ZDg5NS4uMjQ4MzdlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApAQCAtNjQsNiArNjQsOSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJlc2VudGF0aW9uSWQ7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlQcm9ncmFtSWQ7CiAKKyAgICAvLyAga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDogUHJlZmVycmVkIGF1ZGlvIGxhbmd1YWdlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkOworCiAgICAgLy8gIGtleVN0cmVhbUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Db25uZWN0OwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaAppbmRleCA4ZGEwMDY5Li5iZjhkNjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCkBAIC00OSwxMyArNDksMzAgQEAKICNkZWZpbmUgTUlYX1NUQVRFX0lETEUgMAogI2RlZmluZSBNSVhfU1RBVEVfTUlYSU5HIDEKIAorLyoqIENvbnRyb2wgdG8gd2hpY2ggZGV2aWNlIHNvbWUgYXVkaW8gaXMgcmVuZGVyZWQgKi8KICNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfUkVOREVSIDB4MQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIGluc3RlYWQgb2YgcmVuZGVyaW5nIGl0ICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyAoMHgxIDw8IDEpCisvKiogTG9vcCBiYWNrIHNvbWUgYXVkaW8gd2hpbGUgaXQgaXMgcmVuZGVyZWQgKi8KKyNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVIgKE1JWF9ST1VURV9GTEFHX1JFTkRFUiB8IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykKICNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfQUxMIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAKICNkZWZpbmUgTUFYX01JWEVTX1BFUl9QT0xJQ1kgMTAKICNkZWZpbmUgTUFYX0NSSVRFUklBX1BFUl9NSVggMjAKIAorY2xhc3MgQXVkaW9EZXZpY2VUeXBlQWRkciB7CitwdWJsaWM6CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpIHt9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSA6CisgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSB7fQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IG1UeXBlOworICAgIFN0cmluZzggbUFkZHJlc3M7Cit9OworCiBjbGFzcyBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIHsKIHB1YmxpYzoKICAgICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uKCkge30KQEAgLTg3LDcgKzEwNCwxMCBAQAogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKTsKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKIAotICAgIFZlY3RvcjxBdWRpb01peE1hdGNoQ3JpdGVyaW9uPiBtQ3JpdGVyaWE7CisgICAgdm9pZCBzZXRFeGNsdWRlVWlkKHVpZF90IHVpZCkgY29uc3Q7CisgICAgdm9pZCBzZXRNYXRjaFVpZCh1aWRfdCB1aWQpIGNvbnN0OworCisgICAgbXV0YWJsZSBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOwogICAgIHVpbnQzMl90ICAgICAgICBtTWl4VHlwZTsKICAgICBhdWRpb19jb25maWdfdCAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgbVJvdXRlRmxhZ3M7CkBAIC0xMDMsNiArMTIzLDExIEBACiAjZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgMQogI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1AgIDAKIAorc3RhdGljIGlubGluZSBib29sIGlzX21peF9sb29wYmFja19yZW5kZXIodWludDMyX3Qgcm91dGVGbGFncykgeworICAgIHJldHVybiAocm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSKQorICAgICAgICAgICA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX1BPTElDWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTk1NDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCi0jZGVmaW5lIEFVRElPX1BPTElDWV9IRUxQRVJfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotc3RhdGljIGlubGluZQotYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKLXsKLSAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgbWVtc2V0KGF0dHIsIDAsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RFRkFVTFQ6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICBhdHRyLT5mbGFncyAgfD0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEOwotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLy8gYXR0cmlidXRlcyBpbiBjb21tb24gd2l0aCBTVFJFQU1fU1lTVEVNCi0gICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FMQVJNOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047Ci0gICAgICAgIGF0dHItPmZsYWdzIHw9IEFVRElPX0ZMQUdfU0NPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJWQgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCBzdHJlYW1UeXBlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQxMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneSgpIHt9CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGlkKSA6CisgICAgICAgIG1OYW1lKG5hbWUpLCBtQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtSWQoaWQpIHt9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPiBnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzOyB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgYXR0cmlidXRlc01hdGNoZXM6IGNoZWNrcyBpZiBjbGllbnQgYXR0cmlidXRlcyBtYXRjaGVzIHdpdGggYSByZWZlcmVuY2UgYXR0cmlidXRlcworICAgICAqICJtYXRjaGluZyIgbWVhbnMgdGhlIHVzYWdlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgdXNhZ2UsIEFORAorICAgICAqIGNvbnRlbnQgdHlwZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIGNvbnRlbnQgdHlwZSBBTkQKKyAgICAgKiBmbGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCBmbGFncyBBTkQKKyAgICAgKiB0YWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIHRhZ3MuCisgICAgICogUmVmZXJlbmNlIGF0dHJpYnV0ZXMgImRlZmF1bHQiIHNoYWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgInRydWUiIGNhc2UuIFRoaXMgY29udmVudGlvbgorICAgICAqIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgc3RyYXRlZ3kuCisgICAgICogQHBhcmFtIHJlZkF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBjbGllbnRBdHRyaXR1YmVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hpbmcsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHN0YXRpYyBib29sIGF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKTsKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPiBtQXVkaW9BdHRyaWJ1dGVzOworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7Cit9OworCit1c2luZyBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvUHJvZHVjdFN0cmF0ZWd5PjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggODA2MjgwYS4uNDcwN2M0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtNTM0LDkgKzUzNCwyMyBAQAogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCi0gICAgLyoKLSAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgorICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nIHB1cnBvc2VzKS4KICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCisgICAgLyogU2V0IHRoZSBNaWNyb3Bob25lIHpvb20gZmFjdG9yIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgICogb2YgYSBnaXZlbiBBdWRpb1JlY29yZCBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyAgICAgLyoKKyAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC02NTQsNiArNjY4LDcgQEAKICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICBtT3JpZ0ZsYWdzOyAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIGNvbnN0CiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCkBAIC02NjIsNyArNjc3LDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OwotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRmb3JBdHRyKCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CkBAIC03MDQsNyArNzE5LDcgQEAKIHByaXZhdGU6CiAgICAgY2xhc3MgTWVkaWFNZXRyaWNzIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJhdWRpb3JlY29yZCIpKSwKKyAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW9yZWNvcmQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZWROcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ZWROcygwKSwgbUR1cmF0aW9uTnMoMCksIG1Db3VudCgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVycm9yKE5PX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggNGMwZjc5Ni4uYjllZTI0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KQEAgLTM1LDkgKzM2LDE0IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7CiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtMjA0LDEyICsyMTAsMTQgQEAKICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCiAgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgc3RhdGljIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CkBAIC0yMjMsMTYgKzIzMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlUmVjb3JkKCksCiAgICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VJbnB1dCgpLgpAQCAtMjQ3LDggKzI1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTMyNywxOSArMzI5LDI5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSk7CisKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCkBAIC0zNDksNiArMzYxLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICBzdGF0aWMgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSk7CisKKyAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKQEAgLTM3OCw2ICs0MDEsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOwogICAgIH07CiAKKyAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrUHJveHkgOiBwdWJsaWMgUmVmQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveHkod3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2spCisgICAgICAgICAgICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSB7fQorICAgICAgICAgIH5BdWRpb0RldmljZUNhbGxiYWNrUHJveHkoKSBvdmVycmlkZSB7fQorCisgICAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2sucHJvbW90ZSgpOyB9OworCisgICAgICAgICAgYm9vbCBub3RpZmllZE9uY2UoKSBjb25zdCB7IHJldHVybiBtTm90aWZpZWRPbmNlOyB9CisgICAgICAgICAgdm9pZCBzZXROb3RpZmllZE9uY2UoKSB7IG1Ob3RpZmllZE9uY2UgPSB0cnVlOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBtTm90aWZpZWRPbmNlIGl0IGZvcmNlcyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2Ugd2hlbgorICAgICAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBWQUxJRCBBdWRpb0RldmljZSwgYW5kIGFsbG93cyBub3QgdG8gZmxvb2Qgb3RoZXIgbGlzdGVuZXJzCisgICAgICAgICAqIG9uIHRoaXMgaW9oYW5kbGUgdGhhdCBhbHJlYWR5IGtub3cgdGhlIHZhbGlkIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgICBib29sIG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsKKyAgICAgICAgIHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICB9OworCiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKQEAgLTQyMSw4ICs0NjYsMjcgQEAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gPiAgIG1Jb0Rlc2NyaXB0b3JzOwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzOworCisgICAgICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb0RldmljZUNhbGxiYWNrUHJveHk+PgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQGJyaWVmIG5vdGlmaWVkT25jZSBlbnN1cmVzIHRoYXQgaWYgYSBjbGllbnQgYWRkcyBhIGNhbGxiYWNrLCBpdCBtdXN0IGF0IGxlYXN0IGJlCisgICAgICAgICAgICAgKiBjYWxsZWQgb25jZSB3aXRoIHRoZSBkZXZpY2Ugb24gd2hpY2ggaXQgd2lsbCBiZSByb3V0ZWQgdG8uCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxyZWFkeSBub3RpZmllZCBvciBub2JvZHkgd2FpdHMgZm9yIGEgY2FsbGJhY2ssIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9vbCBub3RpZmllZE9uY2UoKSBjb25zdCB7IHJldHVybiAoc2l6ZSgpID09IDApIHx8IG1Ob3RpZmllZE9uY2U7IH0KKyAgICAgICAgICAgIHZvaWQgc2V0Tm90aWZpZWRPbmNlKCkgeyBtTm90aWZpZWRPbmNlID0gdHJ1ZTsgfQorICAgICAgICAgICAgdm9pZCByZXNldE5vdGlmaWVkT25jZSgpIHsgbU5vdGlmaWVkT25jZSA9IGZhbHNlOyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBicmllZiBtTm90aWZpZWRPbmNlIGl0IGZvcmNlcyBlYWNoIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHdoZW4KKyAgICAgICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCBhIFZBTElEIEF1ZGlvRGV2aWNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvb2wgbU5vdGlmaWVkT25jZSA9IGZhbHNlOworICAgICAgICB9OworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzPgorICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllczsKICAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIGdldElucHV0QnVmZmVyU2l6ZSgpIHF1ZXJpZXMKICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZlNpemU7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluU2FtcGxpbmdSYXRlOwpAQCAtNDUwLDkgKzUxNCwxMyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggNDk4ZGU4ZS4uZTU5MjVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTM1LDggKzEzNSwyMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgZG91YmxlIGdldE91dHB1dFNlcnZlckxhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRMYXRlbmN5TXMoc2FtcGxlUmF0ZSwgTE9DQVRJT05fU0VSVkVSLCBMT0NBVElPTl9LRVJORUwpOworICAgIH0KKworICAgIGRvdWJsZSBnZXRMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSwgTG9jYXRpb24gbG9jYXRpb24xLCBMb2NhdGlvbiBsb2NhdGlvbjIpIGNvbnN0IHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiAwICYmIG1UaW1lTnNbbG9jYXRpb24xXSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjJdID4gMCkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25bbG9jYXRpb24xXSAtIG1Qb3NpdGlvbltsb2NhdGlvbjJdOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZmVyZW5jZU5zID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVOc1tsb2NhdGlvbjFdIC0gbVRpbWVOc1tsb2NhdGlvbjJdOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lRGlmZmVyZW5jZSAqIDFlOSAvIHNhbXBsZVJhdGUgLSB0aW1lRGlmZmVyZW5jZU5zKSAqIDFlLTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOworICAgIH0KKwogICAgIC8vIGNvbnZlcnQgZmllbGRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewogICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIAogICAgICAgICBzcyA8PCAiQk9PVFRJTUUgb2Zmc2V0ICIgPDwgbVRpbWViYXNlT2Zmc2V0W1RJTUVCQVNFX0JPT1RUSU1FXSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA1OWM2ZjRjLi4xMmY1ZDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNzQsNiArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCiAjZW5kaWYKKyAgICAgICAgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSA9IDksLy8gTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgogICAgIH07CiAKICAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKQEAgLTE0NSw2ICsxNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICAvKiBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBhdWRpbyBjb25maWd1cmF0aW9uIGFuZCBhdHRyaWJ1dGVzLgorICAgICAqIFJldHVybiB0cnVlIGlmIG91dHB1dCBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgLyogSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gQXVkaW9UcmFjawogICAgICAqLwogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7CkBAIC0xNTMsNiArMTYxLDcgQEAKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyB3cml0ZSgpCiAgICAgICAgIFRSQU5TRkVSX1NIQVJFRCwgICAgLy8gc2hhcmVkIG1lbW9yeQorICAgICAgICBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLCAvLyBzeW5jaHJvbm91cyB3cml0ZSgpLCBub3RpZiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBCiAgICAgfTsKIAogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKQEAgLTI5NSw2ICszMDQsOCBAQAogICAgICAqIFBhcmFtZXRlcnMgbm90IGxpc3RlZCBpbiB0aGUgQXVkaW9UcmFjayBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KKyAgICAgKiAgICAgIE9ubHkgc2V0IHRvIHRydWUgd2hlbiBBdWRpb1RyYWNrIG9iamVjdCBpcyB1c2VkIGZvciBhIGphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrCisgICAgICogICAgICBpbiBpdHMgSk5JIGNvZGUuCiAgICAgICoKICAgICAgKiBJbnRlcm5hbCBzdGF0ZSBwb3N0IGNvbmRpdGlvbjoKICAgICAgKiAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgaW1wbGllcyB0aGlzIEF1ZGlvVHJhY2sgaGFzIHZhbGlkIGF0dHJpYnV0ZXMKQEAgLTkwNyw3ICs5MTgsMTQgQEAKICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgfQotcHJvdGVjdGVkOgorCisgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvVHJhY2sgaW5zdGFuY2UgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICogb2YgYSBnaXZlbiBBdWRpb1RyYWNrIGluc3RhbmNlIGlmIHRoZSBjb25uZWN0aW9uIHRvIGF1ZGlvc2VydmVyIGlzIHJlc3RvcmVkLgorICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgcHJvdGVjdGVkOgogICAgIC8qIGNvcHlpbmcgYXVkaW8gdHJhY2tzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKICAgICAgICAgICAgIEF1ZGlvVHJhY2smIG9wZXJhdG9yID0gKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKQEAgLTEwMDMsNyArMTAyMSw3IEBACiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGZyb20gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhOwpAQCAtMTA1OCw2ICsxMDc2LDE5IEBACiAgICAgICAgIFNUQVRFX1NUT1BQSU5HLAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKIAorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RhdGVUb1N0cmluZyhTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9BQ1RJVkU6ICAgICAgICAgIHJldHVybiAiU1RBVEVfQUNUSVZFIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiAgICAgICAgICByZXR1cm4gIlNUQVRFX1BBVVNFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOiByZXR1cm4gIlNUQVRFX1BBVVNFRF9TVE9QUElORyI7CisgICAgICAgIGNhc2UgU1RBVEVfRkxVU0hFRDogICAgICAgICByZXR1cm4gIlNUQVRFX0ZMVVNIRUQiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOiAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUElORyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCiAgICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwpAQCAtMTE0OCw2ICsxMTc5LDcgQEAKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKIApAQCAtMTE5NSw3ICsxMjI3LDcgQEAKIHByaXZhdGU6CiAgICAgY2xhc3MgTWVkaWFNZXRyaWNzIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJhdWRpb3RyYWNrIikpIHsKKyAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW90cmFjayIpKSB7CiAgICAgICAgIH0KICAgICAgICAgfk1lZGlhTWV0cmljcygpIHsKICAgICAgICAgICAgIC8vIG1BbmFseXRpY3NJdGVtIGFsbG9jIGZhaWx1cmUgd2lsbCBiZSBmbGFnZ2VkIGluIHRoZSBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBlNmJmNzJmLi5lZjBlZDBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMTQ2LDYgKzE0Niw3IEBACiAgICAgICAgICAgICBhZlNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgYWZMYXRlbmN5TXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNjMsNiArMTY0LDcgQEAKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKGFmTGF0ZW5jeU1zKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNzksNiArMTgxLDcgQEAKICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNczsKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0SWQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVSZWNvcmRJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCkBAIC0yNzEsNiArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0yOTcsNiArMzAxLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTMxMyw2ICszMTgsNyBAQAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dElkOwogICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwogICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKICAgICB9OwogCiAgICAgLy8gaW52YXJpYW50IG9uIGV4aXQgZm9yIGFsbCBBUElzIHRoYXQgcmV0dXJuIGFuIHNwPD46CkBAIC0zNTMsNiArMzU5LDkgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgbWFzdGVyTXV0ZSgpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0ID0gMDsKKwogICAgIC8qIHNldC9nZXQgc3RyZWFtIHR5cGUgc3RhdGUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB1c2VkIGJ5CiAgICAgICogdGhlIHByZWZlcmVuY2UgcGFuZWwsIG1vc3RseS4KICAgICAgKi8KQEAgLTQyOCw3ICs0MzcsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFVVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGMzODc2YWYuLmU4OWE1NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMCwxNSArMjAsMTQgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLQogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ1LDEyICs0NCwxNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CkBAIC02NSwxNiArNjYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTg1LDggKzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTExNSwxMCArMTEwLDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CiAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykgPSAwOwogCisgICAgLy8gQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHNhbXBsZSByYXRlLCBjaGFubmVsIG1hc2sgYW5kIGZsYWdzLgorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOworCiAgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMTU3LDEwICsxNzAsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICAgICAgICAgID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTE3MSw3ICsxODksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgPSAwOworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGUwZDI0OTUuLmIzYzAzODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0xNywxMCArMTcsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCw2ICszMiw4IEBACiAgICAgdWlkX3QgdWlkOwogICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOwogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRfaWQ7CisgICAgYm9vbCBzaWxlbmNlZDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyByZWNvcmRfY2xpZW50X2luZm9fdDsKQEAgLTUxLDggKzU1LDExIEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCiAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCA5NGFmZTNjLi4wNmU3ODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC03MCw2ICs3MCw5IEBACiAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuICB0aW1lc3RhbXAgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4gKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGI0MzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMC11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKLSAgICBdLAotCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAibGliZm1xIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGJmOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkhhbEhpZGwiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU2ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKLSAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgotICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0PiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0IHJldHZhbCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0JiByZXN1bHQpOwotCi0gICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjk5ZDcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgewotCi1zdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgewotICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7Ci0KLSAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOwotICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLURldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewotfQotCi1EZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKLSAgICBpZiAobURldmljZSAhPSAwKSB7Ci0gICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7Ci0gICAgLy8gT2Jzb2xldGUuCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1EZXZpY2UtPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBBdWRpb0lucHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBBdWRpb1NvdXJjZShzb3VyY2UpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8gX191bnVzZWQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxY2I1OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7Ci0gICAgc3A8SURldmljZT4gbURldmljZTsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCi0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2JmNzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWMyMDFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKLSAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMzNTkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAotICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7Ci0gICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCi19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpIHsKLSAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG5hbWVGcm9tSGFsKG5hbWUsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZXNGYWN0b3J5LT5vcGVuRGV2aWNlKAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ4ODQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGJlNzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNTdkNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlhY2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7Ci0gICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYyA9IEJBRF9WQUxVRTsKLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotCi1vdXQ6Ci0gICAgKmRldiA9IE5VTEw7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7Ci0gICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQxOGFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2YTUwMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXVpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKLSAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07Ci0gICAgcmV0dXJuIGNvdW50ZXIrKzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKLSAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7Ci0gICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQotICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKLSAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOwotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKLSAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICBpZiAoYXNobWVtID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgIG1CdWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgewotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgewotICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgewotICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOwotICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgewotICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOwotfQotCi12b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgewotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKLSAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgewotICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7Ci0gICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7Ci0gICAgY29tbWl0KG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKLSAgICBtTWVtb3J5LT5jb21taXQoKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTAwODcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiMDMyYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKLSAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1FZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKLSAgICBpZiAobUVmZmVjdCAhPSAwKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7Ci0gICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7Ci0gICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKLSAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKLSAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Ci19Ci0KLS8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCi0vLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgewotICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBBdWRpb0NoYW5uZWxNYXNrKGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IEVmZmVjdENvbmZpZ1BhcmFtZXRlcnMoaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgotICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOwotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgewotICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMuCi0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbW9uIGNhc2UuCi0gICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7Ci0gICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKLSAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCi0gICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgUmV0dXJuPHZvaWQ+IHJldDsKLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOwotICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOwotICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmZGFmMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0QnVmZmVyQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7Ci0KLSAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcwotICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7Ci0KLSAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwotCi0gICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCi0gICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KLQotICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTwKLSAgICAgICAgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKLSAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOwotICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0JiByZXN1bHQpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7Ci0gICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKLSAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOwotICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCi0gICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQwZTZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwotfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNTQ4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNiZDQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VGhyZWFkSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpBdWRpb0RyYWluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwQnVmZmVySW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwUG9zaXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlRpbWVTcGVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCi0gICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7Ci0KLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCi0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7Ci0gICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbVN0cmVhbS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0gICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7Ci0gICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKLSAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKLSAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7Ci0gICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KLSAgICByZXR1cm4gZXJyID09IDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KLQotVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotaXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgotV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KLQotVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCi10aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCi1JU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCi1mcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCi0KLVRoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAotYnkgQXVkaW9GbGluZ2VyLgotCi0qLwotCi1zdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKLSAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQotCi0gICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgfQotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgotICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKLSAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQotICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KLSAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7Ci0gICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7Ci0gICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKLSAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7Ci0gICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOwotICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKLSAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgewotICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKLSAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWQ4YWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEwN2U1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgewotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOwotICAgIH0KLX0KLQotU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKLSAgICBtU3RyZWFtID0gMDsKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOGQwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YjFhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2RlZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNzUwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwotICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwotICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQotICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKLSAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCi0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAotICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgewotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07Ci0gICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOwotICAgIH0KLSAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKLX0KLQotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi0vLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgotc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgotICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKLSAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAotICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYWxBZGRyZXNzOwotfQotCi0vL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycwotCi1hdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKLSAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7Ci0gICAgfQotfQotCi1hdWRpb19taWNyb3Bob25lX2xvY2F0aW9uX3QgbG9jYXRpb25Ub0hhbChBdWRpb01pY3JvcGhvbmVMb2NhdGlvbiBsb2NhdGlvbikgewotICAgIHN3aXRjaCAobG9jYXRpb24pIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFk7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZX01PVkFCTEU6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWV9NT1ZBQkxFOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpQRVJJUEhFUkFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fUEVSSVBIRVJBTDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gbG9jYXRpb25Ub0hhbCBjb252ZXJzaW9uICVkIiwgbG9jYXRpb24pOwotICAgIH0KLX0KLWF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgewotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6bWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpIHsKLSAgICBpZiAocERzdCAhPSBOVUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmRldmljZV9pZCwgc2l6ZW9mKHBEc3QtPmRldmljZV9pZCksCi0gICAgICAgICAgICAgICAgICIlcyIsIHNyYy5kZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgcERzdC0+ZGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzcmMuZGV2aWNlQWRkcmVzcy5kZXZpY2UpOwotICAgICAgICBzbnByaW50ZihwRHN0LT5hZGRyZXNzLCBzaXplb2YocERzdC0+YWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICIlcyIsIGRldmljZUFkZHJlc3NUb0hhbChzcmMuZGV2aWNlQWRkcmVzcykuY19zdHIoKSk7Ci0gICAgICAgIGlmIChzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICV6dSBjaGFubmVsTWFwcGluZyBlbGVtZW50cy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgIHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCksIEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY2g7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgJiYgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IGNoYW5uZWxNYXBwaW5nVG9IYWwoc3JjLmNoYW5uZWxNYXBwaW5nW2NoXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKLSAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+bG9jYXRpb24gPSBsb2NhdGlvblRvSGFsKHNyYy5sb2NhdGlvbik7Ci0gICAgICAgIHBEc3QtPmdyb3VwID0gKGF1ZGlvX21pY3JvcGhvbmVfZ3JvdXBfdClzcmMuZ3JvdXA7Ci0gICAgICAgIHBEc3QtPmluZGV4X2luX3RoZV9ncm91cCA9ICh1bnNpZ25lZCBpbnQpc3JjLmluZGV4SW5UaGVHcm91cDsKLSAgICAgICAgcERzdC0+c2Vuc2l0aXZpdHkgPSBzcmMuc2Vuc2l0aXZpdHk7Ci0gICAgICAgIHBEc3QtPm1heF9zcGwgPSBzcmMubWF4U3BsOwotICAgICAgICBwRHN0LT5taW5fc3BsID0gc3JjLm1pblNwbDsKLSAgICAgICAgcERzdC0+ZGlyZWN0aW9uYWxpdHkgPSBkaXJlY3Rpb25hbGl0eVRvSGFsKHNyYy5kaXJlY3Rpb25hbGl0eSk7Ci0gICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gKHVuc2lnbmVkIGludClzcmMuZnJlcXVlbmN5UmVzcG9uc2Uuc2l6ZSgpOwotICAgICAgICBpZiAocERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPiBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKSB7Ci0gICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlZCBmcmVxdWVuY3kgcmVzcG9uc2VzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMsIEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpOwotICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGsrKykgewotICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5mcmVxdWVuY3k7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmxldmVsOwotICAgICAgICB9Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi54ID0gc3JjLnBvc2l0aW9uLng7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi55ID0gc3JjLnBvc2l0aW9uLnk7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi56ID0gc3JjLnBvc2l0aW9uLno7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnggPSBzcmMub3JpZW50YXRpb24ueDsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueSA9IHNyYy5vcmllbnRhdGlvbi55OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi56ID0gc3JjLm9yaWVudGF0aW9uLno7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgVjRfMAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjNhOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0gICAgc3RhdGljIHZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKLQotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKLSAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgotICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0PiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0IHJldHZhbCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0JiByZXN1bHQpOwotCi0gICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNjYTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCi0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAotICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCi0gICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcwotICAgIFNpbmtNZXRhZGF0YSBtZXRhZGF0YSA9IHt7e0F1ZGlvU291cmNlKHNvdXJjZSksIDF9fX07Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCi0gICAgICAgICAgICBoaWRsUG9ydCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvL2NvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMjE3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDVkZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM0MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMxOTRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAotICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7Ci0gICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCi19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDg4OWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMWVjN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZWRkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWM1MjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdjODlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1NzhjNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotCi0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTljNGM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IG1rRW51bUNvbnZlcnRlcjxBdWRpb0NoYW5uZWxNYXNrPihoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBta0VudW1Db252ZXJ0ZXI8RWZmZWN0Q29uZmlnUGFyYW1ldGVycz4oaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgotICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOwotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgewotICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMuCi0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbW9uIGNhc2UuCi0gICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7Ci0gICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKLSAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCi0gICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgUmV0dXJuPHZvaWQ+IHJldDsKLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOwotICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOwotICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZGFiMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVkNzg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7Ci0gICAgfQotICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwotfQotCi0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZjVmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbnRlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvVXNhZ2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQbGF5YmFja1RyYWNrTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVjb3JkVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0oYXV0byBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIGF1dG8gbSwgYXV0byBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1TdHJlYW0sIGhpZGxQYXJhbXMsIHt9IC8qIG9wdGlvbnMgKi8pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgbVN0cmVhbSwKLSAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCi0gICAgICAgICAgICBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoaGlkbEluZm8uZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLS8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwotdGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KLXN0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKLSAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvLyBjb252ZXJ0Ci0gICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKLSAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7Ci0gICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkYTBmOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbUluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dC5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1JbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwotdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKLXVzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGw7Ci0KLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKLSAgICBJU3RyZWFtICptU3RyZWFtOwotICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7Ci0gICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KLSAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOwotICAgIHZvaWQgb25EcmFpblJlYWR5KCk7Ci0gICAgdm9pZCBvbkVycm9yKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDk2YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzc1MDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjcyMDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDZjMmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci1uYW1lc3BhY2UgdXRpbHMgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+Ci1SZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgewotICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWxzCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjZkZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBiN2ExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwotICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAppbmRleCAzYTVkZjI3Li41ODRjMmMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKQEAgLTgsMTYgKzgsMjAgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDIuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAorICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggNGM4ZWFmNi4uZjg2MDA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTYsMTkgKzE2LDIyIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzUuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KIAotI2luY2x1ZGUgPERldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY1XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFY1XzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworICAgICAgICByZXR1cm4gVjRfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWMl8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCBlYWQxZmEyLi5iZDNlZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwyMCArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNS4wL0lFZmZlY3RzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjVfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNV8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjRfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlYyXzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDIgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCisKKyAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLAorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTQiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDUuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTUiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhhNTIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CisgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CisgICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCisgICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcworICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKKyAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7CisgICAgfQorICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOworfQorCitDb252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQorICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCitzdGF0aWMgc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKKyAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgorICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKKyAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAorICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBoYWxBZGRyZXNzOworfQorCisvL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycworCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7CisgICAgc3dpdGNoIChtYXBwaW5nKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOworICAgIH0KK30KKworc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7CisgICAgfQorfQorc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgeworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKKyAgICB9Cit9CisKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgeworICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKKyAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOworICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKKyAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKKyAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKKyAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7CisgICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOworICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKKyAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7CisgICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7CisgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKKyAgICB9Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2JiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyBDb3JlUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgICAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCisgICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Q29yZVJlc3VsdD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBDb3JlUmVzdWx0IHJldHZhbCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7CisKKyAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworfTsKKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpNaWNyb3Bob25lSW5mbzsKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCk7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWY4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCituYW1lc3BhY2UgeworCitzdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgeworICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7CisKKyAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOworICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworfQorCitEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKKyAgICBpZiAobURldmljZSAhPSAwKSB7CisgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7CisgICAgLy8gT2Jzb2xldGUuCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIEFQSSBzbyB0aGF0IGNvbnRleHQgYW5kIGt2UGFpcnMgYXJlIHNlcGFyYXRlZAorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtRGV2aWNlLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMobURldmljZSwKKyAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIEVudW1CaXRmaWVsZDxBdWRpb091dHB1dEZsYWc+KGZsYWdzKSwKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAorI2VuZGlmCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKKyAgICBhdXRvIHNpbmtNZXRhZGF0YSA9IEF1ZGlvU291cmNlKHNvdXJjZSk7CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCisgICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcworICAgIFNpbmtNZXRhZGF0YSBzaW5rTWV0YWRhdGEgPSB7e3sgLnNvdXJjZSA9IEF1ZGlvU291cmNlKHNvdXJjZSksIC5nYWluID0gMSB9fX07CisjZW5kaWYKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorICAgICh2b2lkKW91dHB1dERldmljZTsKKyAgICAodm9pZClvdXRwdXREZXZpY2VBZGRyZXNzOworI2Vsc2UKKyAgICBpZiAob3V0cHV0RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIERldmljZUFkZHJlc3MgaGlkbE91dHB1dERldmljZTsKKyAgICAgICAgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwob3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaGlkbE91dHB1dERldmljZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIHNpbmtNZXRhZGF0YS50cmFja3NbMF0uZGVzdGluYXRpb24uZGV2aWNlKHN0ZDo6bW92ZShoaWRsT3V0cHV0RGV2aWNlKSk7CisgICAgfQorI2VuZGlmCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvSW5wdXRGbGFnPihmbGFncyksCisgICAgICAgICAgICBzaW5rTWV0YWRhdGEsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAorICAgICAgICAgICAgaGlkbFBvcnQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy9jb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q0NjVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOworICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qb3V0cHV0RGV2aWNlKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKi8qb3V0cHV0RGV2aWNlQWRkcmVzcyovLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKKyAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgeworICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGI3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDFlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgc3A8SURldmljZXNGYWN0b3J5PiBkZWZhdWx0RmFjdG9yeXtJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKX07CisgICAgaWYgKCFkZWZhdWx0RmFjdG9yeSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3RvcnkvZGVmYXVsdCBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhkZWZhdWx0RmFjdG9yeSk7CisgICAgaWYgKE1BSk9SX1ZFUlNJT04gPj0gNCkgeworICAgICAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwgYW5kIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIGF0IEhBTCA0LjAKKyAgICAgICAgc3A8SURldmljZXNGYWN0b3J5PiBtc2RGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCl9OworICAgICAgICBpZiAobXNkRmFjdG9yeSkgeworICAgICAgICAgICAgbURldmljZUZhY3Rvcmllcy5wdXNoX2JhY2sobXNkRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogbURldmljZUZhY3RvcmllcykgeworICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCisgICAgICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBmYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfQorfQorCisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXRpYyBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOworICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgcmV0dXJuIHt9OworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0aWMgY29uc3QgY2hhciogaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtRGV2aWNlRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdXRvIGhpZGxJZCA9IGlkRnJvbUhhbChuYW1lLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAorICAgICAgICAgICAgICAgIGhpZGxJZCwKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIHN3aXRjaCAocmV0dmFsKSB7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGFuZCB3YXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGJ1dCBmYWlsZWQgdG8gaW5pdGFsaXplLgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29udGludWUgaXRlcmF0aW5nLgorICAgICAgICAgICAgZGVmYXVsdDogOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCJUaGUgc3BlY2lmaWVkIGRldmljZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkOiBcIiVzXCIiLCBuYW1lKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDY0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZXNGYWN0b3J5LmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIHN0ZDo6dmVjdG9yPHNwPElEZXZpY2VzRmFjdG9yeT4+IG1EZXZpY2VGYWN0b3JpZXM7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM3YThiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKKyAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAorICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgorICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMwZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKworICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OworICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Cit9OworCitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3N0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7CisgICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworCitvdXQ6CisgICAgKmRldiA9IE5VTEw7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7CisgICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKKyAgICBpZiAocmMgPT0gT0spIHsKKyAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTA4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2Nzk3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXRvbWljPgorCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OworICAgIHJldHVybiBjb3VudGVyKys7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCisgICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOworICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7CisgICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7CisgICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgaWYgKGFzaG1lbSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKKyAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7CisgICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK2F1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKKyAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKK30KKwordm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKK30KKworYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7CisgICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKKyAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgeworICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgeworICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7CisgICAgbU1lbW9yeS0+Y29tbWl0KCk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNjgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTk3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitFZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQorICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK0VmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgeworICAgIGlmIChtRWZmZWN0ICE9IDApIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgbUVmZmVjdC5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOworICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAorICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKK30KKworLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKKy8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7CisgICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLT5jaGFubmVscyA9IEVudW1CaXRmaWVsZDxBdWRpb0NoYW5uZWxNYXNrPihoYWxDb25maWcuY2hhbm5lbHMpOworICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7CisgICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKKyAgICBjb25maWctPm1hc2sgPSBFbnVtQml0ZmllbGQ8RWZmZWN0Q29uZmlnUGFyYW1ldGVycz4oaGFsQ29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7CisgICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOworICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKKyAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5CdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0QnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKKyAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgorICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOworICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgeworICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKKyAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7CisgICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKworICAgIC8vIFNwZWNpYWwgY2FzZXMuCisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfQorCisgICAgLy8gQ29tbW9uIGNhc2UuCisgICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7CisgICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKKyAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCisgICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAorICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOworICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKKyAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgorICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOworICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOWY3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3QuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7CisKKyAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcworICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7CisKKyAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKworICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KKworICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7CisgICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKKyAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7CisgICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOworICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCisgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkNmJkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgorI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgeworICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOworICAgIH0KKyAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgeworICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgeworICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKKyAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgeworICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7CisgICAgfQorICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAorICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCisgICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjphbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6bWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExNzhmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3RzRmFjdG9yeS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6Q1BQX1ZFUlNJT046OkNvbnZlcnNpb25IZWxwZXJIaWRsOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCisgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKKworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKKyAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOworCisgICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOworfTsKKworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCkgeworICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTZjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXRDYWxsYmFjay5oKQorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7Cit1c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKKworU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKKyAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKKyAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKKworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBbJl0oYXV0byBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgeworICAgIG1TdHJlYW0gPSBudWxscHRyOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKKyAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKKyAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1TdHJlYW0sIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgbVN0cmVhbSwKKyAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCisgICAgICAgICAgICBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07CisjaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoaGlkbEluZm8uZmxhZ3MpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgeworICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgeworICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOworfQorCitib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7CisgICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCisgICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAorICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7CisgICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAorICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOworICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCisgICAgcmV0dXJuIGVyciA9PSAwOworfQorCituYW1lc3BhY2UgeworCisvKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCisKK1RoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KK2lzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KK1doZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCisKK1RodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwordGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bworSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJworZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgorCitUaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKK2J5IEF1ZGlvRmxpbmdlci4KKworKi8KKworc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7CisgICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KKworICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgeworICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKKyAgICAgICAgbVN0cmVhbS5jbGVhcigpOworICAgIH0KKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0ZDo6dmVjdG9yPFBhcmFtZXRlclZhbHVlPiBwYXJhbWV0ZXJzOworICAgIFN0cmluZzggaGFsUGFyYW1ldGVyczsKKyAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayh7QXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkLCBzdGQ6OnRvX3N0cmluZyhwcmVzZW50YXRpb25JZCl9KTsKKyAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayh7QXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCwgc3RkOjp0b19zdHJpbmcocHJvZ3JhbUlkKX0pOworICAgIHBhcmFtZXRlcnNUb0hhbChoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ocGFyYW1ldGVycyksICZoYWxQYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhoYWxQYXJhbWV0ZXJzKTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZWxlY3RQcmVzZW50YXRpb24iLAorICAgICAgICAgICAgbVN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpKTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKndyaXR0ZW4gPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgorICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCisgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKKyAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KKyAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKKyAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgeworICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7CisgICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOworICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKKyAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgeworICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgorc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgeworICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIENQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzb3VyY2VNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHBsYXliYWNrX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUGxheWJhY2tUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC51c2FnZT1zdGF0aWNfY2FzdDxBdWRpb1VzYWdlPihtZXRhZGF0YS51c2FnZSksCisgICAgICAgICAgICAgICAgICAgIC5jb250ZW50VHlwZT1zdGF0aWNfY2FzdDxBdWRpb0NvbnRlbnRUeXBlPihtZXRhZGF0YS5jb250ZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfSl9OworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTb3VyY2VNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOworICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKK30KKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOworICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKK30KKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7CisgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKK30KKworCitTdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKKyAgICAgICAgbVN0cmVhbS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqcmVhZCA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CisgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKKyAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKKyAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAorICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKKyAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAorICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgeworICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7CisgICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKKyAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CisgICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy8gY29udmVydAorICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CisgICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOworICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QWN0aXZlTWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0CisgICAgICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworICAgIENQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc2lua01ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcmVjb3JkX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUmVjb3JkVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAuc291cmNlPXN0YXRpY19jYXN0PEF1ZGlvU291cmNlPihtZXRhZGF0YS5zb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfSl9OworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTaW5rTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTaW5rTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCisjaWYgTUFKT1JfVkVSU0lPTiA8IDUKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbHNlCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNyb3Bob25lRGlyZWN0aW9uIiwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKHN0YXRpY19jYXN0PE1pY3JvcGhvbmVEaXJlY3Rpb24+KGRpcmVjdGlvbikpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiIsCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWMxMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW0uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbUluLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1PdXQuaCkKKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW07Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1JbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwordXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Cit1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGw7CisKK2NsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKKyAgICBJU3RyZWFtICptU3RyZWFtOworICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7CisgICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKworICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCisgICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKKworICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKKworICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgorICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7CisgICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKKyAgICB2b2lkIG9uRXJyb3IoKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOworICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKKworICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OworICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOworfTsKKworY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBTZXQgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgb3ZlcnJpZGU7CisKKyAgICAvLyBTZXQgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSBvdmVycmlkZTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOworCisgICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OworICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiODA5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQorfQorCitTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgeworICAgIG1TdHJlYW0gPSAwOworICAgIG1EZXZpY2UuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKKyAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKKyAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgcmV0dXJuIE9LOworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgeworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7CisgICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqd3JpdHRlbiA9IDA7CisgICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7CisgICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCisgICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCisgICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKKyAgICAvLyBkZWNyZW1lbnRlZC4KKyAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKKyAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKKyAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6CisgICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOworICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgeworICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKKyAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgeworICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnJlYWQgPSAwOworICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7CisgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworI2lmIE1BSk9SX1ZFUlNJT04gPCA1CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbHNlCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbihtU3RyZWFtLCBkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24obVN0cmVhbSwgem9vbSk7CisKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmM1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOworCisgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKKyAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7CisKKyAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOworfTsKKworY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBTZXRzIG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCisgICAgLy8gU2V0cyBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQzOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwYTQyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhrZXlzLCBjYWxsYmFjayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGtleXMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMxOWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKKworLyoqIEBmaWxlIExpYnJhcnkgZW50cnkgcG9pbnRzIHRvIGNyZWF0ZSB0aGUgSEFMIGZhY3Rvcmllcy4gKi8KKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgVjJfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFYyXzAKKworbmFtZXNwYWNlIFY0XzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK25hbWVzcGFjZSBWNV8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjVfMAorfSAvLyBuYW1lc3BhY2UgZWZmZWN0CisKK25hbWVzcGFjZSBWMl8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjJfMAorCituYW1lc3BhY2UgVjRfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY0XzAKKworbmFtZXNwYWNlIFY1XzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNV8wCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAppbmRleCA3ZGU4ZWIzLi5lNTY1MjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKQEAgLTg0LDYgKzg0LDggQEAKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAogICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCiAgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSA9IDA7CiAKICAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggYzk2OWUyOC4uZWQ4MjgyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpID0gMDsKIAorICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSA9IDA7CiAKQEAgLTE3Niw2ICsxNzksMTIgQEAKICAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCisgICAgLy8gU2V0IGRpcmVjdGlvbiBmb3IgY2FwdHVyZSBwcm9jZXNzaW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QpID0gMDsKKworICAgIC8vIFNldCB6b29tIGZhY3RvciBmb3IgY2FwdHVyZSBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCA4MTdmYjBiLi5jYjc4MDYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTEgQEAKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnNvbmljIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGYzZWE4MjYuLjJjNTdkYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTExMywxMCArMTEzLDEwIEBACiAgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgogICAgICAgICAvLyBDdXJyZW50bHkgaW50ZWdlciB2b2x1bWUgaXMga2VwdCBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgogICAgICAgICAvLyBXaWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyIHBhdGggaXMgcmVtb3ZlZC4KLSAgICAgICAgdC0+dm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQ7Ci0gICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7Ci0gICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKKyAgICAgICAgdC0+dm9sdW1lWzBdID0gMDsKKyAgICAgICAgdC0+dm9sdW1lWzFdID0gMDsKKyAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IDAgPDwgMTY7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSAwIDw8IDE2OwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOwogICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSAwOwogCiAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IHZvbHVtZS4KLSAgICAgICAgdC0+bVZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1Wb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZVswXSA9IDAuZjsKKyAgICAgICAgdC0+bVZvbHVtZVsxXSA9IDAuZjsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gMC5mOwogICAgICAgICB0LT5tVm9sdW1lSW5jWzBdID0gMC47CiAgICAgICAgIHQtPm1Wb2x1bWVJbmNbMV0gPSAwLjsKICAgICAgICAgdC0+bUF1eExldmVsID0gMC47CkBAIC0xMzYsNiArMTM2LDkgQEAKIAogICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKICAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAorICAgICAgICB0LT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tSGFwdGljQ2hhbm5lbE1hc2spOworICAgICAgICBjaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLApAQCAtMTYyLDYgKzE2NSwxNiBAQAogICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CiAgICAgICAgIHQtPm1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgIC8vIGhhcHRpYworICAgICAgICB0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7CisgICAgICAgIHQtPm1IYXB0aWNJbnRlbnNpdHkgPSBIQVBUSUNfU0NBTEVfTk9ORTsKKyAgICAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50OworICAgICAgICB0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTcxLDYgKzE4NCw4IEBACiAgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CiAKICAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTE4NSwxMyArMjAwLDIwIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzawotICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSAodHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaykKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHRyYWNrQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtaXhlckNoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CiAgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCiAgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CiAgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJIYXB0aWNDaGFubmVsTWFzayk7CiAKICAgICBBTE9HX0FTU0VSVCgodHJhY2tDaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKQogICAgICAgICAgICAgJiYgdHJhY2tDaGFubmVsQ291bnQKQEAgLTIwMCw2ICsyMjIsMjQgQEAKICAgICB0cmFjay0+Y2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayA9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID0gaGFwdGljQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IG1peGVySGFwdGljQ2hhbm5lbENvdW50OworCisgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICB9CiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQpAQCAtMjEyLDYgKzI1Miw5IEBACiAgICAgLy8gZG8gaXQgYWZ0ZXIgZG93bm1peCBzaW5jZSB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB0cmFjay0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKwogICAgIGlmICh0cmFjay0+bVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLT5zYW1wbGVSYXRlOwpAQCAtMjYwLDE0ICszMDMsMTkgQEAKICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OCiAgICAgICAgICAgICAmJiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKLSAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgbU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKLSAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGZsb2F0IG9yIGludDE2IGRvd25taXhlciwgaW4gdGhhdCBvcmRlci4KKyAgICAgICAgZm9yIChjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgOiB7IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH0pIHsKKyAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBtTWl4ZXJDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciByZXNldCBiZWxvdy4KICAgICB9CkBAIC0zMzUsOSArMzgzLDgyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzIik7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgb3V0Q2hhbm5lbENvdW50OiAldSIsCisgICAgICAgICAgICB0aGlzLCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQpOworICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgaWYgKG1BZGp1c3RJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUiKTsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcykKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoJXApIHdpdGggaW5DaGFubmVsQ291bnQ6ICV1LCAiCisgICAgICAgICAgIm91dENoYW5uZWxDb3VudDogJXUsIGtlZXBDb250cmFjdGVkQ2hhbm5lbHM6ICVkIiwKKyAgICAgICAgICAgIHRoaXMsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyk7CisgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgIGlmIChtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgdWludDhfdCogYnVmZmVyID0gbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICA/ICh1aW50OF90KiltYWluQnVmZmVyICsgZnJhbWVzICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50LCBtTWl4ZXJGb3JtYXQpCisgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KAorICAgICAgICAgICAgICAgIG5ldyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyA/IG1NaXhlckZvcm1hdCA6IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6Y2xlYXJDb250cmFjdGVkQnVmZmVyKCkKK3sKKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXRpY19jYXN0PEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcio+KAorICAgICAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5jbGVhckNvbnRyYWN0ZWRGcmFtZXMoKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKKyAgICAvLyBjb25maWd1cmUgZnJvbSB1cHN0cmVhbSB0byBkb3duc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCiAgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KKyAgICBpZiAobUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KICAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpOwpAQCAtNTMyLDcgKzY1Myw4IEBACiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNTQxLDYgKzY2Myw5IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIgIT0gdmFsdWVCdWYpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlciA9IHZhbHVlQnVmOwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTU3MCwxNiArNjk1LDM1IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBtaXhlckNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogeworICAgICAgICAgICAgY29uc3QgaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PGhhcHRpY19pbnRlbnNpdHlfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ICE9IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0cmFjazogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CkBAIC04MTMsMTQgKzk1NywxOSBAQAogICAgIGlmICh0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQotICAgIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAvLyByZXNldCBvcmRlciBmcm9tIGRvd25zdHJlYW0gdG8gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KKyAgICBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAodHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKQEAgLTEyNjQsOCArMTQxMyw4IEBACiAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbZ3JvdXBbMF1dOwogICAgICAgICBtZW1zZXQodC0+bWFpbkJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCArIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KSk7CiAKICAgICAgICAgLy8gbm93IGNvbnN1bWUgZGF0YQogICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKQEAgLTE3MDQsNiArMTg1Myw0MCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzSGFwdGljRGF0YSgpCit7CisgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCBWaWJyYXRpb25FZmZlY3Quc2NhbGUoaW50LCBmbG9hdCwgaW50KQorICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Hcm91cHMpIHsKKyAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBtYWluIGJ1ZmZlci4KKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIGlmICh0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNhbXBsZUNvdW50ID0gbUZyYW1lQ291bnQgKiB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgZ2FtbWEgPSB0LT5nZXRIYXB0aWNTY2FsZUdhbW1hKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgbWF4QW1wbGl0dWRlUmF0aW8gPSB0LT5nZXRIYXB0aWNNYXhBbXBsaXR1ZGVSYXRpbygpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9ICh1aW50OF90KilwYWlyLmZpcnN0ICsgbUZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQsIHQtPm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0LT5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBNaXhlciBmb3JtYXQgc2hvdWxkIGJlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmb3V0ID0gKGZsb2F0KikgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG11bCA9IGZvdXRbaV0gPj0gMCA/IDEuMCA6IC0xLjA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3V0W2ldID0gcG93ZihmYWJzZihmb3V0W2ldIC8gSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQpLCBnYW1tYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXhBbXBsaXR1ZGVSYXRpbyAqIEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUICogbXVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbU1peGVyRm9ybWF0OiAlI3giLCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gZG8gcmVzYW1wbGluZyB0aGVuIG1peGluZywKICAqIHB1bGxpbmcgZnJvbSB0aGUgdHJhY2sncyB1cHN0cmVhbSBBdWRpb0J1ZmZlclByb3ZpZGVyLgogICoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggOTIxNDRkMC4uNDc5MTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAorICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpyZXNldCgpOworICAgICAgICBtSW5CdWZmZXIucmVzZXQoKTsKKyAgICB9CisKICAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCiAgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKaW5kZXggYTc0MTY3Ny4uOWI3MGExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmFjYyhjb2VmLCBkYXRhKTsKICAgICB9CiAgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0LCBUTyBnYWluKSB7Ci0gICAgICAgICpvdXQrKyA9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CisgICAgICAgICpvdXQrKyArPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOwogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OnZvbHVtZShvdXQsIGdhaW4pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCAzMjBiOGNmLi41YTAzYTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKaW5kZXggZDYwNTYwYi4uYjc2NGNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclByb3ZpZGVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8c29uaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KQEAgLTM1LDEzICszOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KIENvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKICAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKICAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKQEAgLTYzLDcgKzU5LDggQEAKIAogQ29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKIHsKLSAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigiJXMoJXApICV6dSAlcCAlcCIsCisgICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBtQnVmZmVyLmZyYW1lQ291bnQsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtTG9jYWxCdWZmZXJEYXRhKTsKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgIH0KQEAgLTk4LDggKzk1LDggQEAKICAgICAgICAgbUNvbnN1bWVkID0gMDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKLSAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKLSAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IHN0ZDo6bWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOwogICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLApAQCAtMTMzLDYgKzEzMCwxNiBAQAogICAgIG1Db25zdW1lZCA9IDA7CiB9CiAKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgQUxPR1YoIiVzKCVwKTogbVRyYWNrQnVmZmVyUHJvdmlkZXI6JXAgIG1CdWZmZXIuZnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHAsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciA9PSBwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihwKTsKK30KKwogRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNDc5LDcgKzQ4Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aW1lLXN0cmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgZHN0QXZhaWxhYmxlID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKKyAgICAgICAgZHN0QXZhaWxhYmxlID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOwogICAgICAgICBzaXplX3Qgc3JjQXZhaWxhYmxlID0gbUJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICBwcm9jZXNzRnJhbWVzKCh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUsICZkc3RBdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5yYXcsICZzcmNBdmFpbGFibGUpOwpAQCAtNTI4LDYgKzUzNSwxNiBAQAogICAgIG1SZW1haW5pbmcgPSAwOwogfQogCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtNTY3LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xpY2FsbHkgcmVwZWF0IHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSAwOyBjb3VudCA8ICpkc3RGcmFtZXM7IGNvdW50ICs9ICpzcmNGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IG1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc3RkOjptaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90Kilkc3RCdWZmZXIgKyBtRnJhbWVTaXplICogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLCBtRnJhbWVTaXplICogcmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02MDksNSArNjI2LDgzIEBACiAgICAgICAgIH0KICAgICB9CiB9CisKK0FkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG91dENoYW5uZWxDb3VudCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtSW5DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAorICAgICAgICBtT3V0Q2hhbm5lbENvdW50KG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcyhhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpCit7CisgICAgQUxPR1YoIkFkanVzdEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlenUpIiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwgbVNhbXBsZVNpemVJbkJ5dGVzLAorICAgICAgICAgICAgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKK30KKworQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LCBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoc3RkOjptYXgoaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCksIGZvcm1hdCksCisgICAgICAgICAgICAgICAgY29udHJhY3RlZEZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50IC0gb3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQoY29udHJhY3RlZEZvcm1hdCksCisgICAgICAgIG1Db250cmFjdGVkRnJhbWVDb3VudChjb250cmFjdGVkRnJhbWVDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkQnVmZmVyKGNvbnRyYWN0ZWRCdWZmZXIpLAorICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMoMCkKK3sKKyAgICBBTE9HVigiQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlI3gsICVwKSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsIGNvbnRyYWN0ZWRGb3JtYXQsIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1Db250cmFjdGVkQ2hhbm5lbENvdW50LCBtQ29udHJhY3RlZEZvcm1hdCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogcEJ1ZmZlcikKK3sKKyAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1Db250cmFjdGVkRnJhbWVDb3VudCAtIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGZyYW1lIGNvdW50IHNvIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG91dEZyYW1lc0xlZnQ7CisgICAgfQorICAgIHJldHVybiBDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIocEJ1ZmZlcik7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKAorICAgICAgICB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsIG1TYW1wbGVTaXplSW5CeXRlcywKKyAgICAgICAgICAgIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1Db250cmFjdGVkQnVmZmVyICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICh1aW50OF90KiltQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1Db250cmFjdGVkRm9ybWF0LCAodWludDhfdCopZHN0ICsgY29udHJhY3RlZElkeCwgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7CisgICAgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpOworfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMDU1ZjcyNC4uNTBjYTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnByMikgewogICAgIHJldHVybiBmYWJzKHByMS5tU3BlZWQgLSBwcjIubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICBmYWJzKHByMS5tUGl0Y2ggLSBwcjIubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAmJgotICAgICAgICAgICBwcjIubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKLSAgICAgICAgICAgcHIyLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CisgICAgICAgICAgIHByMS5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjEubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDgxMWMxNmIuLjBjOGU1YmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggNzZiNGFkYy4uZjM5ZWIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCiAgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFLCAidm9pY2VfcGVyZm9ybWFuY2UifSwKIH07CiAKIC8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IDIyN2YyYTEuLjljODJiMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8iLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlN2RiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIEJ1aWxkIHRlc3RiZW5jaCBmb3IgZG93bm1peCBtb2R1bGUuCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4dGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRvd25taXh0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLXYiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZhZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL2Jhc2gKKyMKKyNSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorI2Vuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2Rvd25taXh0ZXN0IgorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBEb3dubWl4IgorYWRiIHNoZWxsIG1rZGlyICR0ZXN0ZGlyCisKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IFwKKyR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgorCisjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCitmb3IgZnMgaW4gJHtmc19hcnJbKl19CitkbworICAgIGZvciBmX2NoIGluIHsxLi44fQorICAgIGRvCisgICAgICAgIGZvciBjaF9mbXQgaW4gezAuLjR9CisgICAgICAgIGRvCisgICAgICAgICAgICBhZGIgc2hlbGwgIExEX0xJQlJBUllfUEFUSD0vdmVuZG9yL2xpYjY0L3NvdW5kZnggXAorICAgICAgICAgICAgJHRlc3RkaXIvZG93bm1peHRlc3QgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgLWNoX2ZtdDokY2hfZm10IC1mY2g6JGZfY2ggLWZzOiRmcworCisgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCB0ZXN0OgorICAgICAgICAgICAgIyBjaGVjayB0aGF0IGhpZ2hlciBmcmVxdWVuY2llcyBtYXRjaCA4IGtIeiByZXN1bHQuCisgICAgICAgICAgICBpZiBbICRmcyAhPSA4MDAwIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wIFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfODAwMC5yYXcgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmODNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKKyNkZWZpbmUgRlJBTUVfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDgKKworc3RydWN0IGRvd25taXhfY250eHRfcyB7CisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKKyAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKworICBpbnQgbnVtRmlsZUNoYW5uZWxzOworICBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzOworfTsKKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiIpOworICBwcmludGYoIlxuICAgICBkb3dubWl4dGVzdCA8aW5wdXRfZmlsZT4gPG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIik7CisgIHByaW50ZigiXG4gICAgIDxpbnB1dF9maWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dF9maWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgICAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaF9mbXQ6PGZvcm1hdF9vZl9pbnB1dF9hdWRpbz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDA6QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMShkZWZhdWx0KSIpOworICBwcmludGYoIlxuICAgICAgICAgMTpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDI6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgIHByaW50ZigiXG4gICAgICAgICAzOkFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgNDpBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpIik7CisgIHByaW50ZigiXG4iKTsKK30KKworaW50MzJfdCBEb3dubWl4RGVmYXVsdENvbmZpZyhlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpIHsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKworICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgIHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgaW50MzJfdCBlcnIgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CisKKyAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gY29uZmlndXJlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gZW5hYmxlIGVmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4RXhlY3V0ZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKworICBjb25zdCBpbnQgbnVtRmlsZUNoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bUZpbGVDaGFubmVsczsKKyAgY29uc3QgaW50IG51bVByb2Nlc3NDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1Qcm9jZXNzQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmaWxlRnJhbWVTaXplID0gbnVtRmlsZUNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG91dHB1dENoYW5uZWxzID0KKyAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRGbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGluRmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXIsIG91dGJ1ZmZlcjsKKyAgaW5idWZmZXIuZjMyID0gaW5GbG9hdC5kYXRhKCk7CisgIG91dGJ1ZmZlci5mMzIgPSBvdXRGbG9hdC5kYXRhKCk7CisgIGluYnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisgIG91dGJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworCisgIGF1ZGlvX2J1ZmZlcl90ICpwaW5idWYsICpwb3V0YnVmOworICBwaW5idWYgPSAmaW5idWZmZXI7CisgIHBvdXRidWYgPSAmb3V0YnVmZmVyOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW5TMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXRTMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgd2hpbGUgKGZyZWFkKGluUzE2LmRhdGEoKSwgZmlsZUZyYW1lU2l6ZSwgRlJBTUVfTEVOR1RILCBmaW5wKSA9PQorICAgICAgICAgRlJBTUVfTEVOR1RIKSB7CisgICAgaWYgKG51bUZpbGVDaGFubmVscyAhPSBudW1Qcm9jZXNzQ2hhbm5lbHMpIHsKKyAgICAgIGFkanVzdF9jaGFubmVscyhpblMxNi5kYXRhKCksIG51bUZpbGVDaGFubmVscywgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG51bVByb2Nlc3NDaGFubmVscywgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBmaWxlRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoaW5GbG9hdC5kYXRhKCksIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogbnVtUHJvY2Vzc0NoYW5uZWxzKTsKKworICAgIGNvbnN0IGludDMyX3QgZXJyID0gKERvd25taXhfYXBpLT5wcm9jZXNzKSgqZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0UzE2LmRhdGEoKSwgb3V0RmxvYXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyk7CisgICAgZndyaXRlKG91dFMxNi5kYXRhKCksIHNpemVvZihzaG9ydCksIChGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyksCisgICAgICAgICAgIGZvdXQpOworICAgIGZyYW1lQ291bnRlcisrOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dtaXhNYWluUHJvY2Vzcyhkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGludDMyX3Qgc2Vzc2lvbklkID0gMCwgaW9JZCA9IDA7CisgIGNvbnN0IGVmZmVjdF91dWlkX3QgZG93bm1peF91dWlkID0geworICAgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAmZG93bm1peF91dWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICBlZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peExpYl9DcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFBhc3NpbmcgdGhlIGluaXQgY29uZmlnIGZvciB0aW1lIGJlaW5nLgorICBlcnIgPSBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUocERlc2NyaXB0b3IpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peENvbmZpZ3VyZUFuZEVuYWJsZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIGV4ZWN1dGUgY2FsbCBmb3IgZG93bm1peC4KKyAgZXJyID0gRG93bm1peEV4ZWN1dGUocERlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peEV4ZWN1dGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWxlYXNlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdCgqZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhSZWxlYXNlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG51bUZpbGVDaGFubmVscyA9IDEsIG51bVByb2Nlc3NDaGFubmVscyA9IDg7CisgIGRvd25taXhfY250eHRfcyBkZXNjcmlwdG9yID0ge307CisgIERvd25taXhEZWZhdWx0Q29uZmlnKCYoZGVzY3JpcHRvci5jb25maWcpKTsKKworICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgeworICAgICAgaWYgKGluZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgaWYgKG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRmaWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgLy8gQWRkIGEgY2hlY2sgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbXMuCisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoX2ZtdDoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGZvcm1hdCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgdWludDMyX3QgKmF1ZGlvVHlwZSA9ICZkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bVByb2Nlc3NDaGFubmVscyA9CisgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKCphdWRpb1R5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bUZpbGVDaGFubmVscyA9IGZDaGFubmVsczsKKworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1oIiwgMikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICgvKmluZmlsZSA9PSBudWxscHRyIHx8ICovIG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY29uc3QgaW50IGVyciA9IERvd21peE1haW5Qcm9jZXNzKCZkZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgLy8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIHByaW50ZigiRXJyb3I6ICVkXG4iLCBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAppbmRleCA5ZDI5Y2YxLi5kNjFlZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKQEAgLTMwLDYgKzMwLDI2IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbG91ZG5lc3NlbmhhbmNlci5oPgogI2luY2x1ZGUgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uaCIKIAorLy8gQlVJTERfRkxPQVQgdGFyZ2V0cyBidWlsZGluZyBhIGZsb2F0IGVmZmVjdCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgaW50MTZfdCBlZmZlY3QuCisjZGVmaW5lIEJVSUxEX0ZMT0FUCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIGV4dGVybiAiQyIgewogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBMRSBlZmZlY3QKQEAgLTgwLDEzICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTEVfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE1OSw3ICsxNzIsNyBAQAogCiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTE2Nyw3ICsxODAsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTI4NCwxOCArMjk3LDQxIEBACiAKICAgICAvL0FMT0dWKCJMRSBhYm91dCB0byBwcm9jZXNzICVkIHNhbXBsZXMiLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgdWludDE2X3QgaW5JZHg7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OyAvLyBwb3dlciBvZiAyIGlzIGxvc3NsZXNzIGNvbnZlcnNpb24gdG8gaW50MTZfdCByYW5nZQorICAgIGNvbnN0ZXhwciBmbG9hdCBpbnZlcnNlU2NhbGUgPSAxLmYgLyBzY2FsZTsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZikgKiBzY2FsZTsKKyNlbHNlCiAgICAgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpOworI2VuZGlmCiAgICAgZmxvYXQgbGVmdFNhbXBsZSwgcmlnaHRTYW1wbGU7CiAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50IDsgaW5JZHgrKykgewogICAgICAgICAvLyBtYWtldXAgZ2FpbiBpcyBhcHBsaWVkIG9uIHRoZSBpbnB1dCBvZiB0aGUgY29tcHJlc3NvcgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdOworICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXTsKKyAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4XSAgICA9IGxlZnRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeCArMV0gPSByaWdodFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyNlbHNlCiAgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4XTsKICAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdOwogICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHhdICAgID0gKGludDE2X3QpIGxlZnRTYW1wbGU7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeCArMV0gPSAoaW50MTZfdCkgcmlnaHRTYW1wbGU7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTMwMyw2ICszMzksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IExPVURORVNTX0VOSEFOQ0VSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCmluZGV4IDVjNTdjNDMuLjdhMzJkM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCkBAIC0xMjksMTEgKzEyOSwxNCBAQAogICAgICAgICAiQ29tbW9uL2xpYiIsCiAgICAgICAgICJCdW5kbGUvbGliIiwKICAgICBdLAotCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKaW5kZXggNGMyYjk1NC4uY2MwNjZiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTE5OSw4ICsxOTksMTAgQEAKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWREJFX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNSw4ICsyMTcsMTAgQEAKICAgICBMVkRCRV9GU180NDEwMCA9IDcsCiAgICAgTFZEQkVfRlNfNDgwMDAgPSA4LAogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgIExWREJFX0ZTXzk2MDAwID0gOSwKLSAgICBMVkRCRV9GU18xOTIwMDAgPSAxMCwKKyAgICBMVkRCRV9GU184ODIwMCA9IDksCisgICAgTFZEQkVfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkRCRV9GU18xNzY0MDAgPSAxMSwKKyAgICBMVkRCRV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWREJFX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKQEAgLTI1Niw2ICsyNjAsOSBAQAogICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogCiB9IExWREJFX1BhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggNGVjYWYxNC4uOGYwNThlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtNTgwLDEyICs1ODAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE2MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDQ2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NDgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyMDgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ5MTVmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDM2NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3MjMzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTcyMzdmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKQEAgLTY0MiwxMiArNjU0LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzM4MWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTA3N2YpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzODk4ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM4MjBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjY3OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2Njg1ZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MDg2ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCkBAIC03MDMsMTIgKzcyNywyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTM1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyMTUxZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxODJmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk5ODRmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjc4OWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczMjI0ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTYwNzZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjA4M2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgpAQCAtNzY0LDEyICs4MDAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODE2OGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwOTQ0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTA5ODVmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg4OTJmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTY4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTQ4MmYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgpAQCAtODMxLDEyICs4NzksMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwODMxZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4MzFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTgzMjFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MzM4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDQxNmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNDE2ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk5MTY0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTE2OWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAzODFmKQpAQCAtODkyLDEyICs5NTIsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1NjkwZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTE0NmYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTE0NmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3Njg0ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3NzA4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3ODY4ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDU3M2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDU3M2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4ODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4ODUzZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDUyOGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTI4ZikKQEAgLTk1MywxMiArMTAyNSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDE2OTNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjkzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjU4MmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk2NjE1ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTU1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY4NjBmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwODQ3ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgyOThmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTgzMDZmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQpAQCAtMTAxNCwxMiArMTA5OCwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwODNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjA4M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTc5MWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4MzVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA0MmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDQyZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3OTA0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzkxNWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDk1OGYpCkBAIC0xMDQ1LDcgKzExNDEsOSBAQAogI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ1OGYKICNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE5OWYKICNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKICNlbmRpZgogCkBAIC0xMDYyLDcgKzExNjAsOSBAQAogI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM4ZgogI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE4OGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTc1ZgogI2VuZGlmCiAKQEAgLTExMjUsNyArMTIyNSw5IEBACiAjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgogI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIyNjNmCiAjZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTEzMWYKICNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCiAjZW5kaWYKICNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLwpAQCAtMTEzOCw5ICsxMjQwLDEzIEBACiAjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KICNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogI2lmZGVmIEhJR0hFUl9GUworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk3MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0MzAKICNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQ4MzggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI1OTgKICNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLwogI2VuZGlmCiAKICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKaW5kZXggZmQ0MDE2Yi4uMGJhMmM4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKICAgICAgKi8KICAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKICNlbmRpZgogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDNmZmYyYTIuLjI5NDY3MzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtOTUsNyArOTUsNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOwogI2Vsc2UKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOwogI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggNGU1MjA3Zi4uNDIyNWEzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC02NCw3ICs2NCwxMiBAQAogI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGNvZWYgKi8KICNkZWZpbmUgTFZEQkVfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAzKQorI2Vsc2UKICNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKIAogI2RlZmluZSBMVkRCRV9NSVhFUl9UQyAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8qIE1peGVyIHRpbWUgICovCiAjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCmluZGV4IDEwZWE3MDAuLmM0ZDM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwpAQCAtMjEsMTEgKzIxLDEzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODcsNDIgKzE4OSw0OSBAQAogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAogICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKICAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAotICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKKyAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCiB7Ci0KICAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaF9pbiA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbgotICBbTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaCA9IHBTY3JhdGNoX2luICsgMiAqIE51bVNhbXBsZXM7Ci0gIExWTV9GTE9BVCAqcE1vbm87Ci0gIExWTV9JTlQzMiBpaSA9IDA7CiAKLSAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiA0Kk51bVNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0ZMT0FUICopKCZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc10pOwotLy8gIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2xfaW50ID0gKExWTV9JTlQxNiAqKShwU2NyYXRjaFZvbCk7CisgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisjaWZkZWYgU1VQUE9SVF9NQworICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KKyAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKKyAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCisjZW5kaWYKKyAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAotICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKKyAgLyogU3BhY2UgdG8gc3RvcmUgREJFIHBhdGggY29tcHV0YXRpb24gKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPQorICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwogCiAgIC8qCi0gICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mCisgICAqIE5yU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaC4KICAgICovCi0gIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOworCisgIC8qCisgICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KKyAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCisgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgKgorICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgorICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQogICB7Ci0gICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICByZXR1cm4gTFZEQkVfVE9PTUFOWVNBTVBMRVM7CiAgIH0KIAogICAvKgotICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0Ci0gICAqLwotICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLwotICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0KLSAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKLSAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07Ci0gIH0KLSAgLyoKICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCiAgICAqLwogICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjMwLDUwICsyMzksODEgQEAKICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCiAgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQogICB7CisgICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKKyAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCiAgICAgICovCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCiAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEZyb21NY1RvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU291cmNlICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIEZyb20yaVRvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCiAgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCiAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CiAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KKyNlbHNlCiAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwogICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgTnJGcmFtZXMpOworI2VuZGlmCiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKICAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCi0gICAgICBpZihwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CisgICAgICBpZiAocFNjcmF0Y2hbaWldIDwgLTEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKICAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOwogICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2gsIDAsIHNpemVvZigqcFNjcmF0Y2gpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KQEAgLTI4NiwyMSArMzI2LDQwIEBACiAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQogICAgICAqLwotICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgIHBTY3JhdGNoX2luLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCiAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBMZWZ0IGFuZCByaWdodCwgcmVhbGx5ICMgc2FtcGxlcyAqLworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLy8gY2xlYXIgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CiAgIH0KIAogICAvKgogICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKICAgICAgIHBTY3JhdGNoLAogICAgICAgcFNjcmF0Y2hWb2wsCiAgICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0KLSAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgIHJldHVybiBMVkRCRV9TVUNDRVNTOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggYzRhOWIxNC4uYTJjZTQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtODgsMTEgKzg4LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzU1X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsCkBAIC0xNDcsMTEgKzE1NywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzY2X0EwLApAQCAtMjA3LDExICsyMjcsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMCwKQEAgLTI2OSwxMSArMjk5LDIxIEBACiAKICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCkBAIC0zMjAsOSArMzYwLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCkBAIC0zNTcsOSArNDAzLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LApAQCAtMzk0LDkgKzQ0NiwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKQEAgLTQzMiw5ICs0OTAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtCUEZfRnM4ODIwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQpAQCAtNDY2LDcgKzUzMCw5IEBACiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAogICAgIEFHQ19BVFRBQ0tfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfQVRUQUNLX0ZzODgyMDAKICAgICAsQUdDX0FUVEFDS19Gczk2MDAwCisgICAgLEFHQ19BVFRBQ0tfRnMxNzY0MDAKICAgICAsQUdDX0FUVEFDS19GczE5MjAwMAogI2VuZGlmCiAKQEAgLTQ4OCw3ICs1NTQsOSBAQAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAogICAgIEFHQ19ERUNBWV9GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19ERUNBWV9Gczg4MjAwCiAgICAgLEFHQ19ERUNBWV9GUzk2MDAwCisgICAgLEFHQ19ERUNBWV9GczE3NjQwMAogICAgICxBR0NfREVDQVlfRlMxOTIwMDAKICNlbmRpZgogCkBAIC01ODMsNyArNjUxLDkgQEAKICAgICBWT0xfVENfRnM0NDEwMCwKICAgICBWT0xfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxWT0xfVENfRnM4ODIwMAogICAgICxWT0xfVENfRnM5NjAwMAorICAgICxWT0xfVENfRnMxNzY0MDAKICAgICAsVk9MX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIH07CkBAIC02MDIsNyArNjcyLDkgQEAKICAgICBNSVhfVENfRnM0NDEwMCwKICAgICBNSVhfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM4ODIwMAogICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxNzY0MDAKICAgICAsTUlYX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAppbmRleCA5YjZkYTMxLi44M2VjYWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApAQCAtMjk2LDYgKzI5Niw5IEBACiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCiAgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7CiAgICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZNX0NvbnRyb2xQYXJhbXNfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKaW5kZXggMGEzYzMwZS4uMzcyNzJlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDggKzY0LDExIEBACiAgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwogICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC0yMDcsOCArMjEyLDcgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAqcERlc3Q7Ci0gICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9MjsKLQorICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwpAQCAtNDk5LDcgKzUwMyw3IEBACiAgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLwpAQCAtNzUwLDcgKzc1NCwxMSBAQAogICAgIExWTV9JTlQxNiAgICAgICBOdW1TYW1wbGVzOwogICAgIExWTV9GTE9BVCAgICAgICAqcFN0YXJ0OwogICAgIExWTV9GTE9BVCAgICAgICAqcERlc3Q7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIE51bVNhbXBsZXMgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZGVmaW5lIEZyYW1lQ291bnQgU2FtcGxlQ291bnQKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCkBAIC03NTgsNyArNzY2LDYgQEAKICAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwogICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKIAotCiAgICAgLyoKICAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICAqLwpAQCAtNzg2LDE0ICs3OTMsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwpAQCAtODAzLDIzICs4MjEsNDAgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICB9CiAgICAgfQpAQCAtODM2LDEzICs4NzEsMjMgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgIH0KQEAgLTg1MSwxNCArODk2LDI1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBTdGFydCAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KICAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCiAgICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCiAgICAgICAgIH0KQEAgLTg3MCw5ICs5MjYsMTYgQEAKICAgICAgKi8KICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTEwNjMsMTQgKzExMjYsMjQgQEAKIHsKIAogICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjdW5kZWYgTnJGcmFtZXMKKyNkZWZpbmUgTnJGcmFtZXMgKCpwTnVtU2FtcGxlcykgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbHNlCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IDI7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDhjMDQ4NDcuLmJhYjQwNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTQ4Nyw2ICs0ODcsOTcgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KKy8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDAyNjRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ3MTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTkwNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDE5NTNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQ4ODM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Njk3NzdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjkzNTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzE2MjM4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MDY0MTJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNTE3NzE0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMwNTY4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNjQ5ODMwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU3NTkzOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KQEAgLTU4MCw2ICs2NzEsOTggQEAKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTc1NTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzYwNzg0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI5NzM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODcwNDA1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDcxMzEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTkwMjYzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKQEAgLTEyMTYsNCArMTM5OSw0IEBACiAKIAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCmluZGV4IGNmZTUzYjguLjYyYjRjNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSwxOCArNzEsMjkgQEAKICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKICNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8CiAjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKKyNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CisjZW5kaWYKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPSBwUGFyYW1zLT5OckNoYW5uZWxzOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBDaW5lbWEgU291bmQgcGFyYW1ldGVycwogICAgICAqLwpAQCAtNTY5LDYgKzU4MiwxMCBAQAogICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYKICAgICAgICAgICAgICAoQ291bnQgPiAwKSk7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgLyogQ2xlYXIgYWxsIGludGVybmFsIGRhdGEgaWYgZm9ybWF0IGNoYW5nZSovCiAgICAgaWYoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkKICAgICB7CkBAIC03MTksNiArNzM2LDkgQEAKICAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIERCRV9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKQEAgLTc3NSw3ICs3OTUsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpAQCAtODQ5LDcgKzg3MSw5IEBACiAgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CiAgICAgICAgIENTX1BhcmFtcy5SZXZlcmJMZXZlbCA9IExvY2FsUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7CiAgICAgICAgIENTX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkNTX0VmZmVjdExldmVsOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDU19QYXJhbXMuTnJDaGFubmVscyAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmluZGV4IDI2YzFjNGYuLmM1NzQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtNjEsNiArNjEsNzIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiA0IFR5cGVzIG9mIE1lbW9yeSBSZWdpb25zIG9mIExWTQorICogVE9ETzogQWxsb2NhdGUgb24gdGhlIGZseS4KKyAqIGkpICAgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAtIEZvciBJbnN0YW5jZSBIYW5kbGVzCisgKiBpaSkgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgLSBQZXJzaXN0ZW50IEJ1ZmZlcnMKKyAqIGlpaSkgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqIGl2KSAgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpICsgXAorICogICAgIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpIC0gbmVlZGVkIGlmIGJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUgorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEE6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSArIFwKKyAqICAgICAyICogcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19EYXRhX3QpICsgXAorICogICAgIHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSArIFwKKyAqICAgICBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pICsgXAorICogICAgIDIgKiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRjoKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19Db2VmZmljaWVudF90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KQorICoKKyAqIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgKFNjcmF0Y2gpOgorICogICBUb3RhbCBNZW1vcnkgU2l6ZToKKyAqICAgICBCdW5kbGVTY3JhdGNoU2l6ZSArIFwKKyAqICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkgKyBcCisgKiAgICAgTWF4U2NyYXRjaE9mIChDUywgRVFOQiwgREJFLCBQU0EpCisgKgorICogICAgIGEpQnVuZGxlU2NyYXRjaFNpemU6CisgKiAgICAgICAgIDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAqICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBhbGxvY2F0ZWQgb25seSB3aGVuIEJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUi4KKyAqICAgICBiKU1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBzY3JhdGNoIHVzYWdlIGZvciBDUywgRVFOQiwgREJFLCBQU0EuCisgKiAgICAgICBDUyAgID0gKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgICAgICAgICAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSkKKyAqICAgICAgIEVRTkIgPSAoTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBEQkUgID0gKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBQU0EgID0gKDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSkKKyAqICAgICAgICAgICAgICBvbmUgTWF4SW5wdXRCbG9ja1NpemUgZm9yIGlucHV0IGFuZCBhbm90aGVyIGZvciBmaWx0ZXIgb3V0cHV0CisgKiAgICAgYylNQVhfSU5URVJOQUxfQkxPQ0tTSVpFCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBuZWVkZWQgZm9yIFBTQUlucHV0IC0gVGVtcCBtZW1vcnkgdG8gc3RvcmUgb3V0cHV0CisgKiAgICAgICBmcm9tIE1jVG9Nb25vIGJsb2NrIGFuZCBnaXZlbiBhcyBpbnB1dCB0byBQU0EgYmxvY2sKKyAqLworCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQpAQCAtMTY4LDcgKzIzNCwxMyBAQAogICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKTsKKyNlbHNlCiAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisjZW5kaWYKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgICAgICAvKiBTY3JhdGNoIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCkBAIC0yMzMsNyArMzA1LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzM0OCwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTM1Nyw4ICs0NDEsMTMgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKIAogICAgICAgICAgICAgaWYgKFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKQogICAgICAgICAgICAgewpAQCAtNTQ3LDEzICs2MzYsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwogI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCkBAIC01ODQsOCArNjgwLDExIEBACiAgICAgLyoKICAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudApAQCAtNzQ0LDcgKzg0MywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTgwMiw3ICs5MDcsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0xMDM5LDcgKzExNTAsMTEgQEAKICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGI0NTMyMjIuLjE5ZDE1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTQ0LDEyICsxNDQsMTkgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KQEAgLTI4Miw2ICsyODksMTAgQEAKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKKwogfSBMVk1fSW5zdGFuY2VfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCA0YTE5YTEzLi45NGJhMjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTY1LDYgKzY1LDEwIEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgTnJDaGFubmVscyAgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCkBAIC0xMTIsNiArMTE2LDEwIEBACiAgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCiAgICAgewogICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgLyogVXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBOckNoYW5uZWxzIGZyb20gcEluc3RhbmNlLT5OckNoYW5uZWxzIHZhbHVlICovCisgICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCiAgICAgICAgIHsKQEAgLTEzMCw2ICsxMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOwogICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBOckNoYW5uZWxzID0gMjsKKyNlbmRpZgogICAgIH0KIAogCkBAIC0xNTMsNyArMTY0LDYgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgICAgICB7Ci0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwpAQCAtMTcxLDEwICsxODEsMTggQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQogICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIApAQCAtMjIxLDIwICsyMzksMzMgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisjZW5kaWYKIAogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIC8qIFRPRE8gLSBNdWx0aWNoYW5uZWwgc3VwcG9ydCB0byBiZSBhZGRlZCAqLworICAgICAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gMikKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcwpAQCAtMjQyLDI4ICsyNzMsMzkgQEAKICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIEZyb21NY1RvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworI2VuZGlmCiAKLSAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIERDIHJlbW92YWwKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIH0KLQogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKICAgICAgICAgICovCkBAIC00OTcsNCArNTM5LDQgQEAKIAogICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCAxOTlkZGRlLi5hNTM1NmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yNjksNiArMjY5LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCkBAIC0zMTYsNiArMzYzLDUzIEBACiAgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKICAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCiAKKyAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IDlhM2QzNWQuLjA2ZTc0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC03OCw2ICs3OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCAzZWU3ZjYzLi4wMTUzOWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMzAsOCArMzAsMTcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogVGhlIG1lbW9yeSByZWdpb24gY3JlYXRlZCBieSB0aGlzIHN0cnVjdHVyZSBpbnN0YW5jZSBpcyB0eXBlY2FzdAorICAgICAqIGludG8gYW5vdGhlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHBvaW50ZXIgYW5kIGFuIGFycmF5IG9mIGZpbHRlcgorICAgICAqIGNvZWZmaWNpZW50cy4gSW4gb25lIGNhc2UgdGhpcyBtZW1vcnkgcmVnaW9uIGlzIHVzZWQgZm9yIHN0b3JpbmcKKyAgICAgKiBEQyBjb21wb25lbnQgb2YgY2hhbm5lbHMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgKnBTdG9yYWdlOworICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLQorI2VuZGlmCiB9IEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xNzksNyArMTg4LDEyIEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUyBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKSBdOworI2Vsc2UKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xOTcsMTIgKzIxMSwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KIH0gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0zNjYsNiArMzg1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCkBAIC00MzQsNiArNDYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKQEAgLTUyNyw2ICs1NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKQEAgLTU0MCwxMiArNTgwLDIyIEBACiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKKwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAppbmRleCA4MWUyODhjLi5hNzYzNTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaApAQCAtNDQsNyArNDQsMTUgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKyAgICAvKgorICAgICAqIFRoZSBtZW1vcnkgYXJlYSBjcmVhdGVkIHVzaW5nIHRoaXMgc3RydWN0dXJlIGlzIGludGVybmFsbHkKKyAgICAgKiB0eXBlY2FzdCB0byBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IGFuZCB1c2VkLgorICAgICAqIFRoZSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IHN0cnVjdHVyZSBoYXMgMyBwb2ludGVyIHR5cGUgZWxlbWVudHMKKyAgICAgKiAyIGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyIGFuZCBvbmUgZWxlbWVudCBvZiB0eXBlIExWTV9JTlQxNi4KKyAgICAgKiBJbm9yZGVyIHRvIGNhdGVyIGJvdGggMzIgYW5kIDY0IGJpdCBidWlsZHMsIFN0b3JhZ2UgYXJyYXkgc2hvdWxkCisgICAgICogaGF2ZSBhIG1pbmltdW0gb2YgOSBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMi4KKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs5XTsKIAogfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCBlYTE2MDcyLi41OTU4NmUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMTIyLDYgKzEyMiwxMiBAQAogCiAjZW5kaWYgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgogCisjaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDggLy8gRkNDXzgKKyNlbHNlCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgMiAvLyBGQ0NfMgorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0Myw2ICsxNDksOSBAQAogICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAogICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAogICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fTVVMVElDSEFOTkVMICAgID0gMywKKyNlbmRpZgogICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCkBAIC0xNjAsOCArMTY5LDEwIEBACiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GU185NjAwMCA9IDksCi0gICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWTV9GU184ODIwMCA9IDksCisgICAgTFZNX0ZTXzk2MDAwID0gMTAsCisgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAorICAgIExWTV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDBiYTIwYTMuLjc0NjhhOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTQ3LDYgKzQ3LDE2IEBACiB2b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xODEsNiArMTkxLDEyIEBACiB2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggZmE5ZjAxZi4uNWM4NjU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMwNSw0ICszMDUsMTUwIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNY1NyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNY1NyYyAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9TcmMgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRHN0ICAgICAgICAgICAgICAgICAgICBNdWx0aWNoYW5uZWwgZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5yRnJhbWVzICAgICAgICAgICAgICAgIE51bWJlciBvZiBmcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJDaGFubmVscyAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1jU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisKKyAgICAvKgorICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgIGksIGpqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgIFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHZhbHVlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworCisgICAgICAgIEFic1BlYWsgPSAwLjBmOworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KKyAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBpbnB1dCBzaWduYWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgID0gU2FtcGxlVmFsICAqIFZvbF9NdWx0OworCisgICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgPiBBYnNQZWFrID8gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgOiBBYnNQZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBNb25vU3JjKys7CisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qU1VQUE9SVF9NQyovCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCA5NjBkZTc5Li5kNjMzNjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTEyMyw2ICsxMjMsODcgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKKworCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogeW49IChBMiAgKiB4KG4tMikpICovCisgICAgICAgICAgICAgICAgeW4gPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMSAgKiB4KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMCAgKiB4KG4pKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMiAgKiB5KG4tMikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjEgICogeShuLTEpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSAoTFZNX0ZMT0FUKXluOyAvKiBVcGRhdGUgeShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bjsgLyogV3JpdGUgamogQ2hhbm5lbCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KKwogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwppbmRleCBlNDg5MDMxLi4zODU4NDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCkBAIC04NCw1ICs4NCw2NSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8vIEV4dHJhY3Qgb3V0IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyIGZyb20gbXVsdGljaGFubmVsIHNvdXJjZS4KK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICAgICAgZHN0ICs9IDI7CisgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCisgICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOworICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdCAtPSAyOworICAgICAgICAgICAgc3JjIC0tOworICAgICAgICB9CisgICAgfQorfQorCisvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIGRzdCwgdG8gZHN0Lgordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUICpzcmNfc3QgPSBkc3QgKyAyICogKE5yRnJhbWVzIC0gMSk7CisKKyAgICAvLyByZXBhY2sgZHN0IHdoaWNoIGNhcnJpZXMgc3RlcmVvIGluZm9ybWF0aW9uCisgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgorICAgIGRzdCArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBkc3RbMV0gPSBzcmNfc3RbMV07CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsgLy8gY29weSAxIGJlZm9yZSAwIGlzIHJlcXVpcmVkIGZvciBOckNoYW5uZWxzID09IDMuCisgICAgICAgIGZvciAoamogPSAyOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtqal0gPSBzcmNbampdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjX3N0IC09IDI7CisgICAgfQorfQorI2VuZGlmCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggZDI2MWM5ZS4uMTNmYWM1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CiAgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCiAgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CiAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQpAQCAtNjQsNiArNjQsNTggQEAKIAogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBEQyByZW1vdmFsIGZyb20gYWxsIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwSW5zdGFuY2UgICAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgcERhdGFJbiAgICAgICAgSW5wdXQvU291cmNlCisgKiAgcERhdGFPdXQgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBMVk1fSU5UMzIgaTsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworCisgICAgICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgICAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gKihwRGF0YUluKyspIC0gKENoRENbaV0pOworICAgICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSArPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDRmNGZjZDguLjBmOTQxYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTI0LDYgKzI0LDE3IEBACiAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfQ0hBTk5FTFM7IGkrKykKKyAgICB7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+Q2hEQ1tpXSA9IDAuMGY7CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZmE2YjcyOS4uZGIzYTZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMzQsNiArMzQsMTMgQEAKICAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCiB9RmlsdGVyX0ZMT0FUX1N0YXRlOwogdHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKKyNpZmRlZiBTVVBQT1JUX01DCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlX01jXworeworICAgIExWTV9GTE9BVCAgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgICAgIC8qIENoYW5uZWxEQyAgKi8KK30gRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwordHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIDsKKyNlbmRpZgogI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKaW5kZXggMTkyOTI3Yy4uMmE1MGYxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpAQCAtMTE3LDYgKzExNyw5MyBAQAogICAgICAgICB9CiAKICAgICB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBU1NVTVBUSU9OUzoKK0NPRUZTLQorcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTAsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMF0gaXMgeChuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqY2ggKyAxXSBpcyB5KG4tMSkgb2YgdGhlICdjaCcgLSBjaGFubmVsCitUaGUgaW5kZXggJ2NoJyBydW5zIGZyb20gMCB0byAoTnJDaGFubmVscyAtIDEpCisKK1BBUkFNRVRFUlM6CisgcEluc3RhbmNlICAgICAgICBQb2ludGVyIEluc3RhbmNlCisgcERhdGFJbiAgICAgICAgICBJbnB1dC9Tb3VyY2UKKyBwRGF0YU91dCAgICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorIE5yRnJhbWVzICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcworIE5yQ2hhbm5lbHMgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisKK1JFVFVSTlM6Cisgdm9pZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICB5bjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDE2ICAgaWk7CisgICAgICAgIExWTV9JTlQxNiAgIGNoOworICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTFZNX0ZMT0FUICAgKnBEZWxheXMgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXM7CisgICAgICAgIExWTV9GTE9BVCAgICpwQ29lZnMgID0gJnBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEEwID0gcENvZWZzWzFdOworICAgICAgICBMVk1fRkxPQVQgICBBMSA9IHBDb2Vmc1swXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQjEgPSBwQ29lZnNbMl07CisKKworCisKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIENIQU5ORUxTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHluID1BMSAgKiB4KG4tMSkKKyAgICAgICAgICAgICAgICB5biA9IChMVk1fRkxPQVQpQTEgKiBwRGVsYXlzWzBdOworCisgICAgICAgICAgICAgICAgLy8geW4rPUEwICAqIHgobikKKyAgICAgICAgICAgICAgICB5biArPSAoTFZNX0ZMT0FUKUEwICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8vIHluICs9ICAoLUIxICAqIHkobi0xKSkKKyAgICAgICAgICAgICAgICBUZW1wID0gQjEgKiBwRGVsYXlzWzFdOworICAgICAgICAgICAgICAgIHluICs9IFRlbXA7CisKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBEZWxheXNbMV0gPSB5bjsgLy8gVXBkYXRlIHkobi0xKQorICAgICAgICAgICAgICAgIHBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSkKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgICAgIGlmICh5biA+IDEuMGYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5biA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5biA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHluID0gLTEuMGY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluOworICAgICAgICAgICAgICAgIHBEZWxheXMgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEZWxheXMgLT0gTnJDaGFubmVscyAqIDI7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKaW5kZXggYWMxZWVhOC4uZDAyYWY4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKQEAgLTY4LDUgKzY4LDQ3IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBDcmVhdGVzIGEgbW9ubyBzdHJlYW0gZnJvbSBhIG11bHRpY2hhbm5lbCBpbnB1dCB0YWtpbmcgdGhlIGF2ZXJnYWUgb2YKKyAqICBzYW1wbGUgdmFsdWVzIG9mIGFsbCBjaGFubmVscworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgVGVtcDsKKworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAwLjBmOworICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgICAgICpkc3QgPSBUZW1wIC8gTnJDaGFubmVsczsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKICNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCBkMjY5NGNjLi40MTljN2M1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKIAogICAgIExWTV9JTlQxNiAgIE91dExvb3A7CkBAIC0xMTQsNiArMTE0LDEzOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorCisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKaW5kZXggYjVlN2Y1Yy4uNWJmZGFkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMjcsMTAgKzI3LDEwIEBACiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwogICAgIExWTV9JTlQxNiAgIEluTG9vcDsKQEAgLTEwNSw2ICsxMDUsMTE5IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQorCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQQorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQ8VGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAxOTJmMTI2Li42NTk1NmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzQsMTAgKzM0LDEwIEBACiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKIHsKICAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKICAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwpAQCAtMTA2LDYgKzEwNiwxMTAgQEAKICAgICB9CiAKIH0KKworCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+VGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCAxMDE3ZGUzLi4wNjc4YWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTEwMyw2ICsxMDMsMTAxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIEZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCisgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCAzYzkwMDcxLi44YTg5ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI2LDExICsyNiwxMSBAQAogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwpAQCAtNjcsNiArNjcsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgMiBzdHJlYW0gTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYzEgICAgICAgICAgIEZpcnN0IG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBzcmMyICAgICAgICAgICBTZWNvbmQgbXVsdGljaGFubmVsIHNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgIH0KK30KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCBmOTA0OTE1Li43ZjE4NzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMTU3LDEwICsxNTcsMTggQEAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xNjksMTAgKzE3NywxOCBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xODEsMTEgKzE5NywxOSBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLApAQCAtMjAwLDEwICsyMjQsMTAgQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGM2NzQ1NWEuLjUwN2VlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKICAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgCisKICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCBkMGQwZTFmLi5mMTAwOTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTYyLDYgKzYyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApAQCAtNzMsNiArODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNDhmNWQ1NC4uOWQzZWU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCiB7CiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCkBAIC02MCw3ICs2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLC8qODgyMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwogI2Vsc2UKICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDlkYzdkMjEuLjBlMGFjZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKIHsKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwvKjgwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwpAQCAtNjEsNyArNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCiAjZWxzZQogICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IDc4NDZjYTAuLjYzMDdlNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC01Myw3ICs1Myw5IEBACiAjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKICNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKICNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKICNlbmRpZgogY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLApAQCAtNjYsNyArNjgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzg4MjAwX2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE3NjQwMF9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmluZGV4IDljMTdhMDUuLjZjOGIyZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwpAQCAtMTE5LDYgKzExOSw4MCBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLworICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLworICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IDhlMGI3MzguLjM4NWRiY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMjAxLDggKzIwMSwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNyw4ICsyMTksMTAgQEAKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKLSAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzg4MjAwID0gOSwKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CkBAIC0yNjcsNyArMjcxLDkgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA0MmVhNDZmLi43NTUxNDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMTA5LDcgKzEwOSw5IEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNzFmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDM2ZgogI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDU2YjAyZTAuLmE5Y2Q1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDEyIEBACiAjZGVmaW5lIExWRVFOQl9JTlNUQU5DRV9BTElHTiAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGluc3RhbmNlIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0RBVEFfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfQ09FRl9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICovCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKQorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCiAjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDYzMjgxODEuLmQxODhjMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSwxNCArNjIsMTggQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KICAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKICAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KICAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKQEAgLTgyLDE0ICs4NywxNCBAQAogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgICAgICByZXR1cm4gTFZFUU5CX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKQEAgLTk3LDE2ICsxMDIsMTYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgpAQCAtMTE2LDcgKzEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CiAKIAogICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTI2LDEwICsxMzEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgogICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDEsMTkgKzE1NCwyOSBAQAogCiAKICAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgICAgICBlbHNlewogICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNjMsMTIgKzE4NiwxMiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIExWRVFOQl9TVUNDRVNTOwogCiB9CiAjZWxzZQpAQCAtMzEyLDQgKzMzNSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCmluZGV4IDU2MzE4MWMuLjQ1M2M0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCkBAIC04Miw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTI0OSwzMCArMjUzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnRzICgxMDBtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczgwMDAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMjAwMCAgIDMyNjQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczE2MDAwICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyNDAwMCAgIDMyNzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczMyMDAwICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0ODAwMCAgIDMyNzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLQotCi1jb25zdCBMVk1fSU5UMTYgTFZFUU5CX01peGVyVENUYWJsZVtdID0gewotICAgIExWRVFOQl9NSVhfVENfRnM4MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxMTAyNSwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczE2MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMyMjA1MCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczMyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0NDEwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZmNzQ3NWUuLmM5MTVhYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTEyMyw3ICsxMjMsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbHNlCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZW5kaWYKIAogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNTY2ZDg0Zi4uMWQxMjgzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAKKwogICAgIC8qCiAgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCiAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwppbmRleCBhNzE5MDUzLi5kZmVkMjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTY0LDEyICs2NCwyMiBAQAogICAgICAgICAoCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKICNlbmRpZgogICAgICAgICApCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCisjZWxzZQogICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisjZW5kaWYKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCBiM2VkYzYwLi4xMDU4NzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtNTIsNyArNTIsOSBAQAogICAgIDMyMDAwLAogICAgIDQ0MTAwLAogICAgIDQ4MDAwLAorICAgIDg4MjAwLAogICAgIDk2MDAwLAorICAgIDE3NjQwMCwKICAgICAxOTIwMDAKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IGE3NTBiYjAuLmVlMDdlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLwogI2Vsc2UKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDEzICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLwogI2VuZGlmCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAxMjg3NTAzLi5mOGFmNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC01NCw3ICs1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAKQEAgLTc4LDcgKzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyNDM0OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjE3NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTA1LDcgKzEwOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEyOCw3ICsxMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNTMsNyArMTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE2OSw3ICsxNzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzUyLDcgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCkBAIC0zNjgsNyArMzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCkBAIC0zODMsNyArMzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggZTc1Njk1ZS4uZTUwN2E3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTIwNSw2ICsyMDUsOSBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsgICAgICAgICAgICAvKiBFZmZlY3QgbGV2ZWwgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWQ1NfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggMGMyZmU1My4uYmEwNTU3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0xNTIsNiArMTUyLDI0IEBACiAjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzg0NmYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjY1N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTkyNzQ3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMxNTQxZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg5NTg2ZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wNTgwNDVmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS43NjUzMDBmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc2OTgxNmYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKwogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KIC8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCkBAIC0xNjAsMTMgKzE3OCwzMyBAQAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNwotI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjcyNykKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjc5MzM3MikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMjQzMjZmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjk0OTM3ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDcwNjExZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjc5MjE2NmYpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NTgzMGYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzk3M2YKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzMzNzhmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MzY3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5ODM2ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMwNzU0NGYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjEwNzcwOGYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS44NzY1NzJmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC44Nzc3NzFmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQpAQCAtMTc1LDEzICsyMTMsMTUgQEAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwODk5MSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTI1MDkpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5OSw3ICsyMzksMTIgQEAKICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1NTcgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAgICAgICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haICAgICAgICAgICAgICAgICAgIDExMTUgICAgICAgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAgICAgICAgICAgICAgICAgIDIwNDggICAgICAgIC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAgICAgICAgICAgICAgICAgIDIyMjkgICAgICAgIC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMICAgICAgICAgICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjAsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzcsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwNywyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzNywyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCmluZGV4IDY5ODkyYjYuLmY5NGQ0ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAvKiBGaWx0ZXIgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CiAjZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMXTsKICAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CiAgICAgLyogRmlsdGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggZTE1NGUyOS4uYTFmYjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzQsMTAgKzc0LDE4IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84ODIwMF9BMSwKKyAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV85NjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNzY0MDBfQTEsCisgICAgIENTX01JRERMRV8xNzY0MDBfQjEsCisgICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKQEAgLTE0NCwxMiArMTUyLDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAsCisgICAge0NTX1NJREVfODgyMDBfQTAsICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84ODIwMF9BMSwKKyAgICAgQ1NfU0lERV84ODIwMF9BMiwKKyAgICAgQ1NfU0lERV84ODIwMF9CMSwKKyAgICAgQ1NfU0lERV84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX1NJREVfOTYwMDBfQTEsCiAgICAgIENTX1NJREVfOTYwMDBfQTIsCiAgICAgIENTX1NJREVfOTYwMDBfQjEsCiAgICAgIENTX1NJREVfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNzY0MDBfQTAsICAgICAgICAgIC8qMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xNzY0MDBfQTEsCisgICAgIENTX1NJREVfMTc2NDAwX0EyLAorICAgICBDU19TSURFXzE3NjQwMF9CMSwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzE5MjAwMF9BMSwKICAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCkBAIC0yMjMsMTIgKzI0MywyNCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsICAgICAvKiA4OGtTL3MgY29lZmZpZWllbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMjk0LDEyICszMjYsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfODgyMDBfQTAsICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEV9LAogICAgIHtDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCwgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwLCAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMzI2LDcgKzM3MCwxMiBAQAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFp9OworICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTIsMTIgKzQ0MSwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAorICAgICBDU19SRVZFUkJfODgyMDBfQTIsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAogICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCiAgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAogICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAogICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLApAQCAtNTA5LDIyICs1NzAsMjYgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCitjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzldID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKQEAgLTU0NSwxNyArNjEwLDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotCQkJCQkJCQkJCQkgIDEyMDAwLAotCQkJCQkJCQkJCQkgIDE2MDAwLAotCQkJCQkJCQkJCQkgIDIyMDUwLAotCQkJCQkJCQkJCQkgIDI0MDAwLAotCQkJCQkJCQkJCQkgIDMyMDAwLAotCQkJCQkJCQkJCQkgIDQ0MTAwLAotCQkJCQkJCQkJCQkgIDQ4MDAwLAotCQkJCQkJCQkJCQkgIDk2MDAwLAotCQkJCQkJCQkJCQkgIDE5MjAwMAorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTNdID0gezgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzY2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImx2bXRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsibHZtdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzbnIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKworICAgIHNyY3M6IFsic25yLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTg3NGEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9sdm1UZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBsdm0iCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybTY0L2x2bXRlc3QgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworZmxhZ3NfYXJyPSgKKyAgICAiLWNzRSIKKyAgICAiLWVxRSIKKyAgICAiLXRFIgorICAgICItY3NFIC10RSAtZXFFIgorICAgICItYkUgLU0iCisgICAgIi1jc0UgLXRFIgorICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKKyAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCispCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2ZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorZG8KKyAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgZG8KKyAgICAgICAgZm9yIGNoIGluIHsxLi44fQorICAgICAgICBkbworICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoKSlfJCgoZnMpKS5yYXcgLWNoOiRjaCAtZnM6JGZzICRmbGFncworCisgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtYkUgaXMgaW4gZmxhZ3MgKGR1ZSB0byBtb25vIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgaWYgW1sgJGZsYWdzICE9ICoiLWJFIiogXV0gJiYgWyAiJGNoIiAtZ3QgMiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMl8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaCkpXyQoKGZzKSkucmF3CisgICAgICAgICAgICBlbGlmIFtbICRmbGFncyA9PSAqIi1iRSIqIF1dICYmIFsgIiRjaCIgLWd0IDIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9zbnIgJHRlc3RkaXIvc2luZXN3ZWVwXzJfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2gpKV8kKChmcykpLnJhdyAtdGhyOjkwLjMwODk5OAorICAgICAgICAgICAgZmkKKworICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2YmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBcCisgIGRvIHsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgXAorfQorCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdHJ1Y3QgbHZtQ29uZmlnUGFyYW1zX3QgeworICBpbnQgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAgICA9IDQ0MTAwOworICBpbnQgICAgICAgICAgICAgIG5yQ2hhbm5lbHMgICAgICA9IDI7CisgIGludCAgICAgICAgICAgICAgZkNoYW5uZWxzICAgICAgID0gMjsKKyAgYm9vbCAgICAgICAgICAgICBtb25vTW9kZSAgICAgICAgPSBmYWxzZTsKKyAgaW50ICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICBpbnQgICAgICAgICAgICAgIGVxUHJlc2V0TGV2ZWwgICA9IDA7CisgIGludCAgICAgICAgICAgICAgZnJhbWVMZW5ndGggICAgID0gMjU2OworICBMVk1fQkVfTW9kZV9lbiAgIGJhc3NFbmFibGUgICAgICA9IExWTV9CRV9PRkY7CisgIExWTV9URV9Nb2RlX2VuICAgdHJlYmxlRW5hYmxlICAgID0gTFZNX1RFX09GRjsKKyAgTFZNX0VRTkJfTW9kZV9lbiBlcUVuYWJsZSAgICAgICAgPSBMVk1fRVFOQl9PRkY7CisgIExWTV9Nb2RlX2VuICAgICAgY3NFbmFibGUgICAgICAgID0gTFZNX01PREVfT0ZGOworfTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhjZXV0YWJsZT4gLWk6PGlucHV0X2ZpbGU+IC1vOjxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgIHByaW50ZigiXG4gICAgIDxvdXRwdXRmaWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1oZWxwIChvcikgLWgiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY2g6PHByb2Nlc3NfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1NIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIE1vbm8gbW9kZSAoZm9yY2UgYWxsIGlucHV0IGF1ZGlvIGNoYW5uZWxzIHRvIGJlIGlkZW50aWNhbCkiKTsKKyAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQSB2YWx1ZSB0aGF0IHJhbmdlcyBiZXR3ZWVuICVkIC0gJWQgZGVmYXVsdCAwIiwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCwKKyAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZXFQcmVzZXQ6PHByZXNldCBWYWx1ZT4iKTsKKyAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QcmVzZXRMdmxzOyArK2kpIHsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAlenUgLSAlcyIsIGksIGdFcXVhbGl6ZXJQcmVzZXRzW2ldLm5hbWUpOworICB9CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgIHByaW50ZigiXG4gICAgIC1iRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC10RSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIFRyZWJsZSBCb29zdCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jc0UgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBDb25jZXJ0IFN1cnJvdW5kIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVxdWFsaXplciIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICBMVk1fTWVtVGFiX3QgTWVtVGFiOworCisgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKKworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyCisgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICB9Cit9IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUJ1bmRsZV9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNyZWF0ZXMgaW5zdGFuY2UKKy8vIHdpdGggYWxsIGVmZmVjdHMgZGlzYWJsZWQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgeworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworCisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisKKyAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisKKyAgICBBTE9HVigKKyAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICB9CisKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworICBMVk1fTWVtVGFiX3QgTWVtVGFiOyAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICBib29sIGJNYWxsb2NGYWlsdXJlID0gTFZNX0ZBTFNFOworCisgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgPSBNQVhfTlVNX0JBTkRTOworICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9IExWTV9QU0FfT047CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOworCisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMKKyAgICogdGhhdCB3ZXJlCisgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKKyAgICovCisgIGlmIChiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKKyAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgLyogSW5pdGlhbGlzZSAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKworICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisKKyAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKKyAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgfQorCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOworICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICBwYXJhbXMtPkJFX0hQRiA9IExWTV9CRV9IUEZfT047CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOworCisgIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7CisgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07CisgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKKworICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKKyAgcmV0dXJuIDA7Cit9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLworCitpbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgaW50IHJldCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gKEJ1bmRsZWRFZmZlY3RDb250ZXh0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKKyAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgeworICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CisKKyAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCisgICAqIHNldCB0byB0aGUgZ2V0CisgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAorICAgKiBhdm9pZAorICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKKyAgICovCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPSBOVUxMOworI2VuZGlmCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgTHZtQnVuZGxlX2luaXQiKTsKKyAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgbHZtQ29udHJvbChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIGNvbnN0IGludCBuckNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgcGFyYW1zLT5OckNoYW5uZWxzID0gbnJDaGFubmVsczsKKyAgaWYgKG5yQ2hhbm5lbHMgPT0gMSkgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgIH0gZWxzZSBpZiAobnJDaGFubmVscyA9PSAyKSB7CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPiAyICYmIG5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAorICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7CisgIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODgyMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPQorICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKKyAgfQorICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOworIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09OOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5iYXNzRW5hYmxlOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgTHZtU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKKworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICByZXR1cm4gMDsKK30KKworaW50IGx2bUV4ZWN1dGUoZmxvYXQgKmZsb2F0SW4sIGZsb2F0ICpmbG9hdE91dCwgc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMpIHsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIHJldHVybgorICAgICAgTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgIGZsb2F0SW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICBmbG9hdE91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lTGVuZ3RoLCAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworfQorCitpbnQgbHZtTWFpblByb2Nlc3MoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgaW50IGVyckNvZGUgPSBsdm1Db250cm9sKHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCBwUGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICBlcnJDb2RlID0gbHZtRXhlY3V0ZShmbG9hdEluLmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcyk7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgIHByaW50ZigiXG5FcnJvcjogbHZtRXhlY3V0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgIHJldHVybiBlcnJDb2RlOworICAgIH0KKworICAgICh2b2lkKWZyYW1lU2l6ZTsgLy8gZWxpbWluYXRlIHdhcm5pbmcKKyNlbHNlCisgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpIGZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZvdXQpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsdm1Db25maWdQYXJhbXNfdCBsdm1Db25maWdQYXJhbXN7fTsgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgIGNvbnN0IGNoYXIgKmluZmlsZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBudWxscHRyOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICBpbmZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWRcbiIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoOiIsIDQpKSB7CisgICAgICBjb25zdCBpbnQgbnJDaGFubmVscyA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKG5yQ2hhbm5lbHMgPiA4IHx8IG5yQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6ICVkXG4iLCBuckNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBuckNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCItTSIpKSB7CisgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgfHwgYmFzc0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBCYXNzIEVmZmVjdCBMZXZlbCA6ICVkXG4iLAorICAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VmZmVjdExldmVsID0gYmFzc0VmZmVjdExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1lcVByZXNldDoiLCAxMCkpIHsKKyAgICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gYXRvaShhcmd2W2ldICsgMTApOworICAgICAgY29uc3QgaW50IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgICAgaWYgKGVxUHJlc2V0TGV2ZWwgPj0gbnVtUHJlc2V0THZscyB8fCBlcVByZXNldExldmVsIDwgMCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBFcXVhbGl6ZXIgUHJlc2V0IDogJWRcbiIsIGVxUHJlc2V0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcVByZXNldExldmVsID0gZXFQcmVzZXRMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VuYWJsZSA9IExWTV9CRV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1lcUUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxRW5hYmxlID0gTFZNX0VRTkJfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jc0UiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmNzRW5hYmxlID0gTFZNX01PREVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaCIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoaW5maWxlID09IG51bGxwdHIgfHwgb3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICBpZiAoZm91dCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIGZjbG9zZShmaW5wKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgIGlmIChlcnJDb2RlID09IDApIHsKKyAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgIGlmIChlcnJDb2RlICE9IDApIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGx2bU1haW5Qcm9jZXNzIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsZXJyQ29kZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmb3V0KTsKKyAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7CisgICAgfQorICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOworICB9CisKKyAgaWYgKGVyckNvZGUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODExMGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+CitzdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgeworICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKKyAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7CisgIEEgc2lnbmFse307CisgIEEgbm9pc2V7fTsKKworICBmb3IgKDs7KSB7CisgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOworICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgeworICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIH0KKyAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKKyAgICAgICAgcmV0dXJuIHsgc2lnbmFsLCBub2lzZSB9OworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRfc2FtcGxlc19pbjsgKytpKSB7CisgICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOworICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICB9CisgIH0KK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICBzbnIgPHJlZl9maWxlPiA8dGVzdF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICBwcmludGYoIlxuICAgICA8dGVzdF9maWxlPiBpcyB0ZXN0IGZpbGUgZm9yIHNuciBjYWxjdWxhdGlvbiIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLXBjbV9mb3JtYXQ6PHBjbSBmb3JtYXQgb2YgaW5wdXQgZmlsZXM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjIDwgMykgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IHBjbV9mb3JtYXQgPSAwOworICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7CisgICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKKyAgICB9CisgIH0KKyAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgYXV0byBzbiA9IHBjbV9mb3JtYXQgPT0gMAorICAgICAgPyBnZXRTaWduYWxOb2lzZTxzaG9ydD4oZmlucCwgZnJlZikKKyAgICAgIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOworICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7CisgICAgLy8gY29tcGFyZSB0aGUgbWVhc3VyZWQgc25yIHZhbHVlIHdpdGggdGhyZXNob2xkCisgICAgaWYgKHNuciA8IHRocikgeworICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgfQorICB9CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZyZWYpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IDEwZmQ5NzAuLjE2ZmExMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDcgQEAKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDUzZDI2NmEuLjBjNmY4ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQogICAgIHsKLSAgICAgICAgI2lmZGVmIExWTV9QQ00KKyNpZmRlZiBMVk1fUENNCiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCisjZW5kaWYKIAogCiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKQEAgLTc1MSwxOSArNzUxLDIxIEBACiAKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAqcE91dFRtcDsKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fApAQCAtNzg0LDcgKzc4Niw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03OTgsMTMgKzgwMCwxNSBAQAogCiAjaWZkZWYgTFZNX1BDTQogICAgIGZ3cml0ZShwSW4sCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAjZW5kaWYKIAogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBOckNoYW5uZWxzKTsKIAogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwpAQCAtODE0LDcgKzgxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKICAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICNlbHNlCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwpAQCAtODI5LDEyICs4MzMsMTQgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocE91dFRtcCwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogTnJDaGFubmVsczsgaSsrKSB7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CiAjZWxzZQpAQCAtMTIzMiw0NSArMTIzOCw1OCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQ0hFQ0tfQVJHKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisjZWxzZQogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworI2VuZGlmCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKKyAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjA1MDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgZGVmYXVsdDoKQEAgLTEyOTQsNiArMTMxMywxMCBAQAogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOworI2VuZGlmCisKICAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3Rfc2V0Q29uZmlnIikKQEAgLTE0OTgsNiArMTUyMSw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQgOgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjAsMTAgKzE1NDQsOSBAQAogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKChjaGFubmVsQ291bnQgPT0gMCkgfHwgKGNoYW5uZWxDb3VudCA+IDIpKSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQogICAgIHJldHVybiBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZVR5cGUpOwogfQogCkBAIC0zMjE2LDYgKzMyMzksNyBAQAogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CiAgICAgaW50ICAgIHN0YXR1cyA9IDA7CiAgICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCiAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKQEAgLTMyNDYsNyArMzI3MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KQEAgLTMyNjYsNyArMzI5MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KQEAgLTMyODAsNyArMzMwNCw4IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOy8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPQorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOwogICAgICAgICB9CkBAIC0zMzMxLDcgKzMzNTYsNyBAQAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyArK2kpIHsKICNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKICNlbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBkNTU4MTY5Li42MDJmNjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTY3NSw5ICs2NzUsMTUgQEAKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA3MDQwOWRlLi4zNWUyZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKIAogTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9GTE9BVCAtRFNVUFBPUlRfTUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTE5LDcgKzIwLDggQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggODA3ZjI0ZC4uMDBiYzM3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjQsMTEgKzI0LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBtYXgKICNpbmNsdWRlIDxuZXc+CiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIGV4dGVybiAiQyIgewogCkBAIC0xNDMsMTAgKzE1NSwxNSBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfOCkgcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorICAgIGlmIChjaGFubmVsQ291bnQgIT0gRkNDXzIpIHJldHVybiAtRUlOVkFMOworI2VuZGlmCiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE5Miw3ICsyMDksNyBAQAogewogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yMDAsNyArMjE3LDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0zMDEsMTUgKzMxOCw4IEBACiAvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vCiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKQEAgLTMyNCw3MSArMzM0LDExOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlTGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsKKwogICAgIC8vIHBlcmZvcm0gbWVhc3VyZW1lbnRzIGlmIG5lZWRlZAogICAgIGlmIChwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSAmIE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMpIHsKICAgICAgICAgLy8gZmluZCB0aGUgcGVhayBhbmQgUk1TIHNxdWFyZWQgZm9yIHRoZSBuZXcgYnVmZmVyCi0gICAgICAgIHVpbnQzMl90IGluSWR4OwotICAgICAgICBpbnQxNl90IG1heFNhbXBsZSA9IDA7CiAgICAgICAgIGZsb2F0IHJtc1NxQWNjID0gMDsKLSAgICAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQgOyBpbklkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSBpbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoLWluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gLWluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm1zU3FBY2MgKz0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF0pOworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhpbkJ1ZmZlci0+ZjMyW2luSWR4XSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPmYzMltpbklkeF0gKiBpbkJ1ZmZlci0+ZjMyW2luSWR4XTsKICAgICAgICAgfQorICAgICAgICBtYXhTYW1wbGUgKj0gMSA8PCAxNTsgLy8gc2NhbGUgdG8gaW50MTZfdCwgd2l0aCBleGFjdGx5IDEgPDwgMTUgcmVwcmVzZW50aW5nIHBvc2l0aXZlIG51bS4KKyAgICAgICAgcm1zU3FBY2MgKj0gMSA8PCAzMDsgLy8gc2NhbGUgdG8gaW50MTZfdCAqIDIKKyNlbHNlCisgICAgICAgIGludCBtYXhTYW1wbGUgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBzdGQ6Om1heChtYXhTYW1wbGUsIHN0ZDo6YWJzKGludDMyX3QoaW5CdWZmZXItPnMxNltpbklkeF0pKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gc3RvcmUgdGhlIG1lYXN1cmVtZW50CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUGVha1UxNiA9ICh1aW50MTZfdCltYXhTYW1wbGU7CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUm1zU3F1YXJlZCA9Ci0gICAgICAgICAgICAgICAgcm1zU3FBY2MgLyAoaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcm1zU3FBY2MgLyBzYW1wbGVMZW47CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tSXNWYWxpZCA9IHRydWU7CiAgICAgICAgIGlmICgrK3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPj0gcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gYWxsIGNvZGUgYmVsb3cgYXNzdW1lcyBzdGVyZW8gMTYgYml0IFBDTSBvdXRwdXQgYW5kIGlucHV0CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmbG9hdCBmc2NhbGU7IC8vIG11bHRpcGxpY2F0aXZlIHNjYWxlCisjZWxzZQogICAgIGludDMyX3Qgc2hpZnQ7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogICAgIGlmIChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQpIHsKICAgICAgICAgLy8gZGVyaXZlIGNhcHR1cmUgc2NhbGluZyBmYWN0b3IgZnJvbSBwZWFrIHZhbHVlIGluIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KLSAgICAgICAgc2hpZnQgPSAzMjsKLSAgICAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyApIHsKKyAgICAgICAgICAgIC8vIHdlIHJlY29uc3RydWN0IHRoZSBhY3R1YWwgc3VtbWVkIHZhbHVlIHRvIGVuc3VyZSBwcm9wZXIgbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgLy8gZm9yIG11bHRpY2hhbm5lbCBvdXRwdXRzIChjaGFubmVscyA+IDIgbWF5IG9mdGVuIGJlIDApLgorICAgICAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhzbXApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4U2FtcGxlID4gMC5mKSB7CisgICAgICAgICAgICBmc2NhbGUgPSAxMjcuZiAvIG1heFNhbXBsZTsKKyAgICAgICAgICAgIGludCBleHA7IC8vIHVudXNlZAorICAgICAgICAgICAgY29uc3QgZmxvYXQgc2lnbmlmaWNhbmQgPSBmcmV4cChmc2NhbGUsICZleHApOworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5kID09IDAuNWYpIHsKKyAgICAgICAgICAgICAgICBmc2NhbGUgKj0gMjU1LmYgLyAyNTYuZjsgLy8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzY2FsZSBkb2Vzbid0IG1hdHRlciwgdGhlIHZhbHVlcyBhcmUgYWxsIDAuCisgICAgICAgICAgICBmc2NhbGUgPSAxLmY7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGludDMyX3Qgb3JBY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKICAgICAgICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNltpXTsKICAgICAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQotICAgICAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7Ci0gICAgICAgICAgICBpZiAoc2hpZnQgPiBjbHopIHNoaWZ0ID0gY2x6OworICAgICAgICAgICAgb3JBY2N1bSB8PSBzbXA7CiAgICAgICAgIH0KKwogICAgICAgICAvLyBBIG1heGltdW0gYW1wbGl0dWRlIHNpZ25hbCB3aWxsIGhhdmUgMTcgbGVhZGluZyB6ZXJvcywgd2hpY2ggd2Ugd2FudCB0bwogICAgICAgICAvLyB0cmFuc2xhdGUgdG8gYSBzaGlmdCBvZiA4IChmb3IgY29udmVydGluZyAxNiBiaXQgdG8gOCBiaXQpCi0gICAgICAgIHNoaWZ0ID0gMjUgLSBzaGlmdDsKKyAgICAgICAgc2hpZnQgPSAyNSAtIF9fYnVpbHRpbl9jbHoob3JBY2N1bSk7CisKICAgICAgICAgLy8gTmV2ZXIgc2NhbGUgYnkgbGVzcyB0aGFuIDggdG8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsLgogICAgICAgICBpZiAoc2hpZnQgPCAzKSB7CiAgICAgICAgICAgICBzaGlmdCA9IDM7CiAgICAgICAgIH0KICAgICAgICAgLy8gYWRkIG9uZSB0byBjb21iaW5lIHRoZSBkaXZpc2lvbiBieSAyIG5lZWRlZCBhZnRlciBzdW1taW5nIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGJlbG93CiAgICAgICAgIHNoaWZ0Kys7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9IGVsc2UgewogICAgICAgICBhc3NlcnQocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9BU19QTEFZRUQpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8vIE5vdGU6IGlmIGNoYW5uZWxzIGFyZSB1bmNvcnJlbGF0ZWQsIDEvc3FydChOKSBjb3VsZCBiZSB1c2VkIGF0IHRoZSByaXNrIG9mIGNsaXBwaW5nLgorICAgICAgICBmc2NhbGUgPSAxLmYgLyBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgIC8vIGFjY291bnQgZm9yIHN1bW1pbmcgYWxsIHRoZSBjaGFubmVscyB0b2dldGhlci4KKyNlbHNlCiAgICAgICAgIHNoaWZ0ID0gOTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIHVpbnQzMl90IGNhcHRJZHg7CiAgICAgdWludDMyX3QgaW5JZHg7CiAgICAgdWludDhfdCAqYnVmID0gcENvbnRleHQtPm1DYXB0dXJlQnVmOwogICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwotICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgewotICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICAvLyB3cmFwIGFyb3VuZAotICAgICAgICAgICAgY2FwdElkeCA9IDA7CisgICAgICAgICBpbklkeCA8IHNhbXBsZUxlbjsKKyAgICAgICAgIGNhcHRJZHgrKykgeworICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSBjYXB0SWR4ID0gMDsgLy8gd3JhcAorCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeF0gKyBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeCArIDFdOwotICAgICAgICBzbXAgPSBzbXAgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZltjYXB0SWR4XSA9IGNsYW1wOF9mcm9tX2Zsb2F0KHNtcCAqIGZzY2FsZSk7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IHNtcCA9IChpbkJ1ZmZlci0+czE2W2luSWR4XSArIGluQnVmZmVyLT5zMTZbaW5JZHggKyAxXSkgPj4gc2hpZnQ7CisgICAgICAgIGluSWR4ICs9IEZDQ18yOyAgLy8gaW50ZWdlciBzdXBwb3J0cyBzdGVyZW8gb25seS4KICAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIC8vIFhYWCB0aGUgZm9sbG93aW5nIHR3byBzaG91bGQgcmVhbGx5IGJlIGF0b21pYywgdGhvdWdoIGl0IHByb2JhYmx5IGRvZXNuJ3QKQEAgLTQwMCw2ICs0NTcsMTUgQEAKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgc2FtcGxlTGVuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTQwNyw2ICs0NzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCAwMWYwMTRmLi5hOTc3MzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC04Niw3ICs4Niw3IEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVpZlN0cmVhbT4gbVN0cmVhbTsKICAgICBib29sIG1FT1M7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1DYWNoZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtQ2FjaGU7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKICAgICBzaXplX3QgbUNhY2hlQnVmZmVyU2l6ZTsKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAvLyBpdCdzIHJlYWNoaW5nIG1heCBjYWNoZSBidWZmZXIgc2l6ZSwgbmVlZCB0byByb2xsIHdpbmRvdywgYW5kIHBvc3NpYmx5CiAgICAgICAgIC8vIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgogICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG5ld0NhY2hlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdDYWNoZTsKICAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOwogICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggNTE4M2MzOS4uYWExMGYzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCA3ZGVhYjA1Li41ODUzZTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTIyLDcgKzIyLDcgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCIsICJUaW1lQ2hlY2suY3BwIl0sCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0zNCw2ICszNCw5IEBACiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKICAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCiAgICAgY2xhbmc6IHRydWUsCiB9CiAKQEAgLTEyMyw2ICsxMjYsMTAgQEAKICAgICAgICAgImxpYnNvbml2b3giLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xMzgsMTggKzE0NSwxMCBAQAogICAgIH0sCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKLSAgICBdLAotfQotCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWEiLAogCiAgICAgc3JjczogWwotICAgICAgICAiOm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIuY3BwIiwKQEAgLTE4NCw2ICsxODMsOCBAQAogICAgICAgICAiTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAiLAogICAgICAgICAiVmlzdWFsaXplci5jcHAiLAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKICAgICBdLAogCiAgICAgYWlkbDogewpAQCAtMTkzLDEwICsxOTQsMTIgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yMTEsNyArMjE0LDYgQEAKICAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0yNTMsMTggKzI1NSwxMyBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKICAgICAgICAgIkRhdGFTb3VyY2VEZXNjLmNwcCIsCi0gICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCIsCi0gICAgICAgICJJTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhVXRpbHMuY3BwIiwKICAgICAgICAgIk1ldGFkYXRhLmNwcCIsCiAgICAgICAgICJOZGtXcmFwcGVyLmNwcCIsCiAgICAgXSwKQEAgLTI3MywxMCArMjcwLDkgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTI5MSw2ICsyODcsMTAgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKaW5kZXggMDM0ZjdjMi4uMWM5NWUyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtMzYsNiArMzYsOCBAQAogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJFU0VOVEFUSU9OX0lEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BST0dSQU1fSUQ7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQgPQorICAgICAgICBBVURJT19QQVJBTUVURVJfS0VZX0FVRElPX0xBTkdVQUdFX1BSRUZFUlJFRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCA9IEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkM7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKaW5kZXggMjcxYTIzOC4uMWNjMzBjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcApAQCAtMjcsMjYgKzI3LDYgQEAKICAgICAgICAgOiBtSW5pdGlhbE1hcmtNcyhrTm9NYXJrKSwKICAgICAgICAgICBtUmVzdW1lUGxheWJhY2tNYXJrTXMoa05vTWFyaykgeyB9CiAKLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSW5pdGlhbE1hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgbVJlc3VtZVBsYXliYWNrTWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyaW5nU2V0dGluZ3M6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jbml0aWFsTWFya01zKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlc3VtZVBsYXliYWNrTWFya01zKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQogU3RyaW5nOCBCdWZmZXJpbmdTZXR0aW5nczo6dG9TdHJpbmcoKSBjb25zdCB7CiAgICAgU3RyaW5nOCBzOwogICAgIHMuYXBwZW5kRm9ybWF0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZTlhNjIzMC4uZmI2ZDNhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTIxOSwxMCArMjIwLDE2IEBACiAgICAgVmVjdG9yPHdwPElNZWRpYVNvdXJjZT4+IHRyYWNrczsKICAgICBWZWN0b3I8U3RyaW5nOD4gdHJhY2tEZXNjcmlwdGlvbnM7CiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworICAgIHRpbWVfdCB3aGVuOwogfSBFeHRyYWN0b3JJbnN0YW5jZTsKIAogU3RyaW5nOCBFeHRyYWN0b3JJbnN0YW5jZTo6dG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgU3RyaW5nOCBzdHIgPSBuYW1lOworICAgIFN0cmluZzggc3RyOworICAgIGNoYXIgdGltZVN0cmluZ1szMl07CisgICAgc3RyZnRpbWUodGltZVN0cmluZywgc2l6ZW9mKHRpbWVTdHJpbmcpLCAiJW0tJWQgJVQiLCBsb2NhbHRpbWUoJndoZW4pKTsKKyAgICBzdHIuYXBwZW5kKHRpbWVTdHJpbmcpOworICAgIHN0ci5hcHBlbmQoIjogIik7CisgICAgc3RyLmFwcGVuZChuYW1lKTsKICAgICBzdHIuYXBwZW5kKCIgZm9yIG1pbWUgIik7CiAgICAgc3RyLmFwcGVuZChtaW1lKTsKICAgICBzdHIuYXBwZW5kKCIsIHNvdXJjZSAiKTsKQEAgLTI4Nyw2ICsyOTQsNyBAQAogICAgIGV4LnNvdXJjZURlc2NyaXB0aW9uID0gc291cmNlLT50b1N0cmluZygpOwogICAgIGV4Lm93bmVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGV4LmV4dHJhY3RvciA9IGV4dHJhY3RvcjsKKyAgICBleC53aGVuID0gdGltZShOVUxMKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc0V4dHJhY3RvcnNMb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZDc1MzNjYS4uMjQzYjA5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIzLDEzICsyMywxMyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBNQUtFX0VYVFJBQ1RPUiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgTUFLRV9JREFUQV9TT1VSQ0VfRkQsCisgICAgR0VUX1NVUFBPUlRFRF9UWVBFUywKIH07CiAKIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+CkBAIC02OSw2ICs2OSwyNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBzdXBwb3J0ZWRUeXBlczsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVVBQT1JURURfVFlQRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgcmVwbHkKKyAgICAgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHQgPSByZXBseS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFR5cGVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUV4dHJhY3RvclNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUV4dHJhY3RvclNlcnZpY2UiKTsKQEAgLTExNCw2ICsxMzIsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX1NVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXMgPSBnZXRTdXBwb3J0ZWRUeXBlcygpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gc3VwcG9ydGVkVHlwZXMuYmVnaW4oKTsgaXQgIT0gc3VwcG9ydGVkVHlwZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVDU3RyaW5nKCgqaXQpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGUyZWNjZGQuLmVhMDY2NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMTc5LDcgKzE3OSw4IEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGJ1ZmZlcmluZy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlcmluZy5tSW5pdGlhbE1hcmtNcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9CVUZGRVJJTkdfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xOTQsNyArMTk1LDggQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9CVUZGRVJJTkdfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBidWZmZXJpbmctPnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgICAgICBidWZmZXJpbmctPm1Jbml0aWFsTWFya01zID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBidWZmZXJpbmctPm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNjk2LDcgKzY5OCw4IEBACiAgICAgICAgIGNhc2UgU0VUX0JVRkZFUklOR19TRVRUSU5HUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwotICAgICAgICAgICAgYnVmZmVyaW5nLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy5tSW5pdGlhbE1hcmtNcyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNzA2LDcgKzcwOSw4IEBACiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyaW5nLndyaXRlVG9QYXJjZWwocmVwbHkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlcmluZy5tSW5pdGlhbE1hcmtNcyk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGFjYTdhZDkuLmJkMThhNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCBiMmM5MWM0Li41NmVlMThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC02NSw3ICs2NSw3IEBACiAgICAgR0VUX1JPVVRFRF9ERVZJQ0VfSUQsCiAgICAgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywKICAgICBHRVRfQUNUSVZFX01JQ1JPUEhPTkVTLAotCisgICAgR0VUX1BPUlRfSUQsCiB9OwogCiBjbGFzcyBCcE1lZGlhUmVjb3JkZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFSZWNvcmRlcj4KQEAgLTQwNyw2ICs0MDcsMjMgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgICAgICBpZiAocG9ydElkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUE9SVF9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSworICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC02NjEsNiArNjc4LDE3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9QT1JUX0lEOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1BPUlRfSUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQb3J0SWQoJnBvcnRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKaW5kZXggZjE4NWZkNC4uNGRlY2U5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRGT1JNQVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAgICAgICAgICAgICBtTWV0YURhdGEgPSBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChyZXBseSk7CiAgICAgICAgICAgICByZXR1cm4gbU1ldGFEYXRhOwogICAgICAgICB9CkBAIC0xODYsNiArMTg3LDkgQEAKICAgICAgICAgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJyZWFkTXVsdGlwbGUgc3RhdHVzICVkLCBidWZmZXJDb3VudCAldSwgc2luY2VTdG9wICV1IiwKICAgICAgICAgICAgICAgICByZXQsIGJ1ZmZlckNvdW50LCBtQnVmZmVyc1NpbmNlU3RvcCk7CisgICAgICAgIGlmIChidWZmZXJDb3VudCAmJiByZXQgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC0yMTksNiArMjIzLDggQEAKICAgICAvLyBOdVBsYXllciBwYXNzZXMgcG9pbnRlcnMtdG8tbWV0YWRhdGEgYXJvdW5kLCBzbyB3ZSB1c2UgdGhpcyB0byBrZWVwIHRoZSBtZXRhZGF0YSBhbGl2ZQogICAgIC8vIFhYWDogY291bGQgd2UgdXNlIHRoaXMgZm9yIGNhY2hpbmcsIG9yIGRvZXMgbWV0YWRhdGEgY2hhbmdlIG9uIHRoZSBmbHk/CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhRGF0YTsKKyAgICAvLyBlbnN1cmUgc3luY2hyb25pemUgYWNjZXNzIHRvIG1NZXRhRGF0YQorICAgIE11dGV4IG1Mb2NrOwogCiAgICAgLy8gQ2FjaGUgYWxsIElNZW1vcnkgb2JqZWN0cyByZWNlaXZlZCBmcm9tIE1lZGlhRXh0cmFjdG9yLgogICAgIC8vIFdlIGdjIElNZW1vcnkgb2JqZWN0cyB0aGF0IGFyZSBubyBsb25nZXIgYWN0aXZlIChyZWZlcmVuY2VkIGJ5IGEgTWVkaWFCdWZmZXIpLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCBhMDczMDgxLi43NDdiODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtNTUyLDcgKzU1Miw3IEBACiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT01YLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YIik7Ci1JTVBMRU1FTlRfSFlCUklEX01FVEFfSU5URVJGQUNFKE9NWE5vZGUsIElPbXhOb2RlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YTm9kZSIpOworSU1QTEVNRU5UX0hZQlJJRF9NRVRBX0lOVEVSRkFDRShPTVhOb2RlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YTm9kZSIpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggNTMwOGUxYy4uODZhZDk5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMjgsNiArMjgsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvKiogVGhpcyByZWR1bmRhbnQgcmVkZWNsYXJhdGlvbiBpcyBuZWVkZWQgZm9yIEMrKyBwcmUgMTQgKi8KK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9JTlRSQV9SRUZSRVNIW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX01VTFRJUExFX0ZSQU1FU1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9TRUNVUkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXTsKKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAogICAgICAgICBWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3QgewogICAgIHByb2ZpbGVMZXZlbHMtPmNsZWFyKCk7CkBAIC00MCwxNiArNDksMTEgQEAKICAgICBjb2xvckZvcm1hdHMtPmFwcGVuZFZlY3RvcihtQ29sb3JGb3JtYXRzKTsKIH0KIAotdWludDMyX3QgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GbGFnczsKLX0KLQogY29uc3Qgc3A8QU1lc3NhZ2U+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldERldGFpbHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EZXRhaWxzOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKQotICA6IG1GbGFncygwKSB7CitNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKSB7CiAgICAgbURldGFpbHMgPSBuZXcgQU1lc3NhZ2U7CiB9CiAKQEAgLTczLDEyICs3NywxMCBAQAogICAgICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY29sb3IpOwogICAgICAgICB9CiAgICAgfQotICAgIHVpbnQzMl90IGZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBBTWVzc2FnZTo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGlmIChkZXRhaWxzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChjYXBzICE9IE5VTEwpIHsKLSAgICAgICAgY2Fwcy0+bUZsYWdzID0gZmxhZ3M7CiAgICAgICAgIGNhcHMtPm1EZXRhaWxzID0gZGV0YWlsczsKICAgICB9CiAgICAgcmV0dXJuIGNhcHM7CkBAIC05Niw3ICs5OCw2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CiAgICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOwogICAgIG1EZXRhaWxzLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTExLDYgKzExMiwxNCBAQAogICAgIG1DYXAtPm1EZXRhaWxzLT5zZXRJbnQzMihrZXksIHZhbHVlKTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpyZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KSB7CisgICAgaWYgKG1DYXAtPm1EZXRhaWxzLT5yZW1vdmVFbnRyeUF0KG1DYXAtPm1EZXRhaWxzLT5maW5kRW50cnlCeU5hbWUoa2V5KSkgPT0gT0spIHsKKyAgICAgICAgQUxPR0QoInN1Y2Nlc3NmdWxseSByZW1vdmVkIGRldGFpbCAlcyIsIGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImRldGFpbCAlcyB3YXNuJ3QgcHJlc2VudCB0byByZW1vdmUiLCBrZXkpOworICAgIH0KK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRQcm9maWxlTGV2ZWwoCiAgICAgICAgIHVpbnQzMl90IHByb2ZpbGUsIHVpbnQzMl90IGxldmVsKSB7CiAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKQEAgLTEyOSwzMiArMTM4LDMyIEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbUNhcC0+bUZsYWdzIHw9IGZsYWdzOwotfQotCiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMqIGNhcCkgOiBtQ2FwKGNhcCkgewogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0VuY29kZXI7CitNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcyBNZWRpYUNvZGVjSW5mbzo6Z2V0QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUF0dHJpYnV0ZXM7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpyYW5rKCkgY29uc3QgewordWludDMyX3QgTWVkaWFDb2RlY0luZm86OmdldFJhbmsoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1SYW5rOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7Ci0gICAgbWltZXMtPmNsZWFyKCk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRBbGlhc2VzKFZlY3RvcjxBU3RyaW5nPiAqYWxpYXNlcykgY29uc3QgeworICAgICphbGlhc2VzID0gbUFsaWFzZXM7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdCB7CisgICAgbWVkaWFUeXBlcy0+Y2xlYXIoKTsKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgIG1pbWVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKKyAgICAgICAgbWVkaWFUeXBlcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CiAgICAgfQogfQogCiBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPgotTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdCB7CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBtQ2Fwcy52YWx1ZUF0KGl4KTsKICAgICB9CkBAIC0xNzMsMjEgKzE4MiwyNiBAQAogc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIEFTdHJpbmcgb3duZXIgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZXM+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgdWludDMyX3QgcmFuayA9IHBhcmNlbC5yZWFkVWludDMyKCk7CiAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CiAgICAgaW5mby0+bU5hbWUgPSBuYW1lOwogICAgIGluZm8tPm1Pd25lciA9IG93bmVyOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgaW5mby0+bUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwogICAgIGluZm8tPm1SYW5rID0gcmFuazsKKyAgICBzaXplX3QgbnVtQWxpYXNlcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUFsaWFzZXM7IGkrKykgeworICAgICAgICBBU3RyaW5nIGFsaWFzID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpbmZvLT5tQWxpYXNlcy5hZGQoYWxpYXMpOworICAgIH0KICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBBU3RyaW5nIG1pbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWltZSwgY2Fwcyk7CisgICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWVkaWFUeXBlLCBjYXBzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gaW5mbzsKQEAgLTE5Niw4ICsyMTAsMTIgQEAKIHN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CiAgICAgbU5hbWUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIG1Pd25lci53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQXR0cmlidXRlcyk7CiAgICAgcGFyY2VsLT53cml0ZVVpbnQzMihtUmFuayk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1BbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IG1BbGlhc2VzKSB7CisgICAgICAgIGFsaWFzLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgewogICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CkBAIC0yMDYsMTAgKzIyNCwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBpZiAobWltZSkgeworc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIGlmIChtZWRpYVR5cGUpIHsKICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWVkaWFUeXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBpeDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE3LDE5ICsyMzUsMjYgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLU1lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpIDogbVJhbmsoMHgxMDApIHsKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpCisgICAgOiBtQXR0cmlidXRlcygoTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMpMCksCisgICAgICBtUmFuaygweDEwMCkgewogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICBtSW5mby0+bU5hbWUgPSBuYW1lOwogfQogCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgbUluZm8tPm1BbGlhc2VzLmFkZChuYW1lKTsKK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpIHsKICAgICBtSW5mby0+bU93bmVyID0gb3duZXI7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIpIHsKLSAgICBtSW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKK3ZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEF0dHJpYnV0ZXMoCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRyaWJ1dGVzKSB7CisgICAgbUluZm8tPm1BdHRyaWJ1dGVzID0gKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKWF0dHJpYnV0ZXM7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldFJhbmsodWludDMyX3QgcmFuaykgewpAQCAtMjM3LDIxICsyNjIsMjEgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+Ci0gICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgICAgICAgICAgbUluZm8tPm1DYXBzLnZhbHVlQXQoaXgpLmdldCgpKSk7CiAgICAgfQogICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcygpOwotICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtaW1lKSwgY2Fwcyk7CisgICAgbUluZm8tPm1DYXBzLmFkZChBU3RyaW5nKG1lZGlhVHlwZSksIGNhcHMpOwogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcihjYXBzLmdldCgpKSk7CiB9CiAKLWJvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgewotICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1lZGlhVHlwZSk7CiAgICAgaWYgKGl4ID49IDApIHsKICAgICAgICAgbUluZm8tPm1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggZTBmNWE0MC4uOThjNTQ5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTQ4LDcgKzQ4LDggQEAKICAgICB7ImFtcndiIiwgIEFVRElPX0VOQ09ERVJfQU1SX1dCfSwKICAgICB7ImFhYyIsICAgIEFVRElPX0VOQ09ERVJfQUFDfSwKICAgICB7ImhlYWFjIiwgIEFVRElPX0VOQ09ERVJfSEVfQUFDfSwKLSAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0KKyAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0sIAorICAgIHsib3B1cyIsICAgQVVESU9fRU5DT0RFUl9PUFVTfQogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNGaWxlRm9ybWF0TWFwW10gPSB7CkBAIC05MSw2ICs5MiwxOSBAQAogICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCiAgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAogICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKKworICAgIC8vIFZlbmRvci1zcGVjaWZpYyBwcm9maWxlcworICAgIHsidmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVkdBfSwKKyAgICB7IjRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0l9LAorICAgIHsidGltZWxhcHNldmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0F9LAorICAgIHsidGltZWxhcHNlNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJfSwKKyAgICB7ImhpZ2hzcGVlZGNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfQ0lGfSwKKyAgICB7ImhpZ2hzcGVlZHZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfVkdBfSwKKyAgICB7ImhpZ2hzcGVlZDRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80S0RDSX0sCisgICAgeyJxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9RSER9LAorICAgIHsiMmsiLCBDQU1DT1JERVJfUVVBTElUWV8ya30sCisgICAgeyJ0aW1lbGFwc2VxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FIRH0sCisgICAgeyJ0aW1lbGFwc2UyayIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMmt9LAogfTsKIAogI2lmIExPR19OREVCVUcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNWNhM2I0OC4uZDhlZjljZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CkBAIC00OSwxMCArNTAsNDcgQEAKICAgICBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CiB9CiAKLU1pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewotICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZVVud3JhcHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSkiKTsKICAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtQmFzZSA9IDA7CisgICAgbURhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZVVud3JhcHBlcihjc291cmNlKTsKICAgICBvZmY2NF90IGw7CiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZsKSA9PSBPSykgewogICAgICAgICBtTGVuZ3RoID0gbDsKQEAgLTY2LDYgKzEwNCw3IEBACiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgfQorICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogaW50IE1pZGlJb1dyYXBwZXI6OnJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWZiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQorQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKmRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICpkYXRhOworICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKKyAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgfQorICAgIHJldHVybiBtRGF0YTsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCkgeworICAgICpkZXN0ID0gbURhdGEtPm1Gb3JtYXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCmluZGV4IDExODQwN2UuLmNiZDY0YmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCkBAIC0yNywyMyArMjcsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotLy8gVGVtcG9yYXJpbHkga2VlcGluZyBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCgpIHdoZXJlIGl0IGlzIHVzZWQuCi0vLyBXaWxsIGJlIHJlbW92ZWQgc29vbiBpbiBmYXZvciBvZiBvZmZpY2lhbCBwdWJsaWMgQVBJcy4KLXN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+IG1Qc3NoQnVmOwotfTsKLQotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICogZXgpIHsKLSAgICBleC0+bUltcGwtPmRpc2Nvbm5lY3QoKTsKLSAgICByZXR1cm4gQU1FRElBX09LOwotfQorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02OSw2ICs1NywxMSBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFksCisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLAogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywKQEAgLTExNCw2ICsxMDcsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwQnVmZmVyW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAogICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPLAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJLAogICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsCkBAIC0xMDgyLDE0ICsxMDc3LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChtQU1lZGlhRXh0cmFjdG9yKTsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOwotICAgIH0KLSAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci19Ci0KIEFNZWRpYUV4dHJhY3RvciAqQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0QU1lZGlhRXh0cmFjdG9yKCkgY29uc3QgewogICAgIHJldHVybiBtQU1lZGlhRXh0cmFjdG9yOwogfQpAQCAtMTI2Myw0MCArMTI1MCwyOCBAQAogICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKSk7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBvZmY2NF90IHNpemUgPSAtMTsKLSAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHJldHVybiBzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSk7Ci19Ci0KLXZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgc291cmNlLT5jbG9zZSgpOworICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqY3J5cHRvSW5mbyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpOworICAgIGlmIChjcnlwdG9JbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihjcnlwdG9JbmZvKTsKIH0KIAogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCi0gICAgICBtQU1lZGlhRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgZGF0YVNvdXJjZS5nZXQoKSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtQU1lZGlhRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS5nZXQoKSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSk7CisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShkYXRhU291cmNlKSkgeworfQorCitBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSAqYURhdGFTb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShOVUxMKSwKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKGFEYXRhU291cmNlKSB7CiB9CiAKIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjp+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKSB7CiAgICAgaWYgKG1BTWVkaWFEYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKICAgICBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgbUFNZWRpYURhdGFTb3VyY2UgPSBOVUxMOwogfQpAQCAtMTMwNSw0ICsxMjgwLDggQEAKICAgICByZXR1cm4gbUFNZWRpYURhdGFTb3VyY2U7CiB9CiAKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OmNsb3NlKCkgeworICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UobUFNZWRpYURhdGFTb3VyY2UpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7Ci0gICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQotICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKLXsKLX0KLQotVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgewotICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1uc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOwotICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOwotICAgIG1Db25kLnNpZ25hbCgpOwotICAgIHJldHVybiBlbmRUaW1lTnM7Ci19Ci0KLXZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWJvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKLSAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLQotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDg2ZGVmMDIuLjhkYWM5MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC03NCw2ICs3NCw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLApAQCAtOTMsNiArOTQsOCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVTKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1BST1hZKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCkBAIC0xMzIsNiArMTM1LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIwNSw2ICsyMDksMTQgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0xDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0NFTFQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9BREFQVElWRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIRENfTEwpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIzNSw2ICsyNDcsMTIgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0FCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0FCKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yODEsNiArMjk5LDcgQEAKIAogdGVtcGxhdGUgPD4KIGNvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fREVGQVVMVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1NZU1RFTSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SSU5HKSwKQEAgLTM1MiwxMSArMzcxLDMwIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRk1fVFVORVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfSE9UV09SRCksCiAgICAgVEVSTUlOQVRPUgogfTsKIAordGVtcGxhdGUgPD4KK2NvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TRUNVUkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX1NDTyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQkVBQ09OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19IT1RXT1JEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX01VVEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0xPV19MQVRFTkNZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19ERUVQX0JVRkZFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fQ0FQVFVSRSksCisgICAgVEVSTUlOQVRPUgorfTsKKwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+OwpAQCAtMzcwLDYgKzQwOCw3IEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAogYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewogICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWJjOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIFNlcnZpY2UgdG8gcmVsb2FkIGV4dHJhY3RvciBwbHVnaW5zIHdoZW4gdXBkYXRlIHBhY2thZ2UgaXMgaW5zdGFsbGVkL3VuaW5zdGFsbGVkLgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UgewotICAgIHZvaWQgbG9hZFBsdWdpbnMoQHV0ZjhJbkNwcCBTdHJpbmcgYXBrUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCBkNmE5Y2ZiLi5lYTQxNTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCkBAIC0xODYsNiArMTg3LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogCkBAIC0yMTYsNiArMjE4LDUzIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQ7IC8vIGZsYWcgZm9yIGN1cnJlbnQgcGFyYW1ldGVycyB2YWxpZGl0eQogfTsKIAorLy8gQWRqdXN0QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgb21pdHRlZCBmcm9tIHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KK2NsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpOworICAgIC8vT3ZlcnJpZGVzCisgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworfTsKKworLy8gQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gYWRqdXN0IHNhbXBsZSBkYXRhLgorLy8gRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4KKy8vIEV4dHJhIGV4cGFuZGVkIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCBpbiBmcm9tIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIuCitjbGFzcyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyKTsKKyAgICAvL092ZXJyaWRlcworICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBwQnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY2xlYXJDb250cmFjdGVkRnJhbWVzKCkgeyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtQ29udHJhY3RlZEZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZEZyYW1lQ291bnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUNvbnRyYWN0ZWRCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplOworfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCmluZGV4IGQyYTNlNDAuLmQ5N2NjMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKQEAgLTE3LDExICsxNywxMSBAQAogI2lmbmRlZiBBTkRST0lEX0JVRkZFUklOR19TRVRUSU5HU19ICiAjZGVmaW5lIEFORFJPSURfQlVGRkVSSU5HX1NFVFRJTkdTX0gKIAotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3N0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyB7CiAgICAgc3RhdGljIGNvbnN0IGludCBrTm9NYXJrID0gLTE7CiAKICAgICBpbnQgbUluaXRpYWxNYXJrTXM7CkBAIC0zMiw5ICszMiw2IEBACiAKICAgICBCdWZmZXJpbmdTZXR0aW5ncygpOwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKaW5kZXggZmY4Nzg5ZC4uNzNjMDI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC03Miw2ICs3Myw3IEBACiAKICAgICBjb25zdCBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElDcnlwdG9QbHVnaW4+IG1QbHVnaW47CisgICAgc3A8ZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luVjFfMjsKIAogICAgIC8qKgogICAgICAqIG1Jbml0Q2hlY2sgaXM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKaW5kZXggYzE5MDI2MS4uNDMzNjc2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaApAQCAtMzAsNiArMzAsMTEgQEAKIC8vIEEgYmluZGVyIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIGEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSByZW1vdGVseS4KIHN0cnVjdCBEYXRhU291cmNlRGVzYyA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKKyAgICAvLyBpbnRlbnRpb25hbGx5IGxlc3MgdGhhbiBJTlQ2NF9NQVgKKyAgICAvLyBrZWVwIGNvbnNpc3RlbnQgd2l0aCBKQVZBIGNvZGUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4VGltZU1zID0gMHg3ZmZmZmZmZmZmZmZmZmZsbCAvIDEwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVVcyA9IGtNYXhUaW1lTXMgKiAxMDAwOworCiAgICAgZW51bSB7CiAgICAgICAgIC8qIE5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB5ZXQgKi8KICAgICAgICAgVFlQRV9OT05FICAgICA9IDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBmMjY3Zjc2Li5hNjMwYmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTIwLDkgKzIwLDExIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgpAQCAtMzYsMTAgKzM4LDE0IEBACiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW47CiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKIHVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCit0eXBlZGVmIGRybTo6VjFfMjo6SURybVBsdWdpbkxpc3RlbmVyIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwpAQCAtNTEsMTMgKzU3LDE2IEBACiAKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMiB7CiAgICAgRHJtSGFsKCk7CiAgICAgdmlydHVhbCB+RHJtSGFsKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwpAQCAtMTEzLDYgKzEyMiwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CkBAIC0xNjgsNiArMTgyLDggQEAKICAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKIAorICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwogCiBwcml2YXRlOgpAQCAtMTgyLDYgKzE5OCw3IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7CisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKICAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKIAogICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KQEAgLTIxMCw2ICsyMjcsMTEgQEAKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDhlOWViM2EuLmZiZTgwYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC0zNCw3ICszNCwxMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVzdWx0KSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmFwcFBhY2thZ2VOYW1lKSA9IDA7CkBAIC03NSw4ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcElkcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CkBAIC05MSw2ICs5NCwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA0NWU5NjIwLi41Y2UyY2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC0zMyw2ICszNSw4IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFFeHRyYWN0b3I+IG1ha2VFeHRyYWN0b3IoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IG1ha2VJRGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUV4dHJhY3RvclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyMTdkZTE0Li5mMmUyMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMjYsMTEgKzI2LDExIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElNZWRpYVBsYXllcjsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDM3OTAwMGUuLmU3YzQ2NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTczLDcgKzczLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBiMzc3N2QzLi41NGY1NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTEsMjEgKzUzLDQ3IEBACiAKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOwogCisgICAgZW51bSBBdHRyaWJ1dGVzIDogaW50MzJfdCB7CisgICAgICAgIC8vIGF0dHJpYnV0ZSBmbGFncworICAgICAgICBrRmxhZ0lzRW5jb2RlciA9IDEgPDwgMCwKKyAgICAgICAga0ZsYWdJc1ZlbmRvciA9IDEgPDwgMSwKKyAgICAgICAga0ZsYWdJc1NvZnR3YXJlT25seSA9IDEgPDwgMiwKKyAgICAgICAga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQgPSAxIDw8IDMsCisgICAgfTsKKwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgLy8gZGVjb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sgPSAxIDw8IDAsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzU2VjdXJlUGxheWJhY2sgPSAxIDw8IDEsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayA9IDEgPDwgMiwKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLWFkYXB0aXZlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXSA9ICJmZWF0dXJlLWR5bmFtaWMtdGltZXN0YW1wIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0lOVFJBX1JFRlJFU0hbXSA9ICJmZWF0dXJlLWZyYW1lLXBhcnNpbmciOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXSA9ICJmZWF0dXJlLW11bHRpcGxlLWZyYW1lcyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX1NFQ1VSRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIjsKIAotICAgICAgICAgICAgLy8gZW5jb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCA9IDEgPDwgMCwKLQotICAgICAgICB9OwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbGV2ZWxzIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9maWxlIGluIGEgdGFyZ2V0IGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZUxldmVscyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBwcm9maWxlIGxldmVscy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscyhWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjb2xvciBmb3JtYXRzIGluIGEgdGFyZ2V0IGFycmF5LiBPbmx5IHVzZWQgZm9yIHZpZGVvL2ltYWdlCisgICAgICAgICAqIGNvbXBvbmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xvckZvcm1hdHMgdGFyZ2V0IGFycmF5IGZvciB0aGUgY29sb3IgZm9ybWF0cy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cykgY29uc3Q7Ci0gICAgICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZWMgY2FwYWJpbGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBjb250YWluczoKKyAgICAgICAgICogLSBmZWF0dXJlcywKKyAgICAgICAgICogLSBwZXJmb3JtYW5jZSBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBleHBvc2UgdGhpcyBhcyBzZXBhcmF0ZSBBUEktcyBhbmQgd3JhcCBoZXJlLgorICAgICAgICAgKi8KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKIAogICAgIHByb3RlY3RlZDoKQEAgLTczLDcgKzEwMSw2IEBACiAgICAgICAgIFNvcnRlZFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzU29ydGVkOwogICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CiAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0c1NvcnRlZDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwogICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CiAKICAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CkBAIC05Myw4ICsxMjAsNyBAQAogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGluZm9ybWF0aW9uIGluc2lkZSBhIGBDYXBhYmlsaXRpZXNgCiAgICAgICogb2JqZWN0LiBBbiBvYmplY3Qgb2YgdHlwZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZwotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZSgpYCBvcgotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6dXBkYXRlTWltZSgpYC4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZSgpYC4KICAgICAgKi8KICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyIHsKICAgICAgICAgLyoqCkBAIC0xMjIsNiArMTQ4LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZERldGFpbChjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpOwogICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBpcyBub3QKKyAgICAgICAgICogcHJlc2VudCwgdGhpcyBjYWxsIGRvZXMgbm90aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KTsKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHByb2ZpbGUtbGV2ZWwgcGFpci4gSWYgdGhpcyBwcm9maWxlLWxldmVsIHBhaXIgYWxyZWFkeSBleGlzdHMsCiAgICAgICAgICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICoKQEAgLTEzNiwxMyArMTY5LDcgQEAKICAgICAgICAgICogQHBhcmFtIGZvcm1hdCBUaGUgY29sb3IgZm9ybWF0LgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRDb2xvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGZsYWdzLiBUaGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgYml0d2lzZS1vci4gSW4gb3RoZXIgd29yZHMsCi0gICAgICAgICAqIGJpdHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGFkZGl0aW9uYWwgZmxhZ3MuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCkBAIC0xNTgsMTkgKzE4NSw0MiBAQAogICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAotICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKLSAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBpbmxpbmUgYm9vbCBpc0VuY29kZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkgJiBrRmxhZ0lzRW5jb2RlcjsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBjb250YWluaW5nIGFsdGVybmF0ZSBuYW1lcyBmb3IgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogXHBhcmFtIGFsaWFzZXMgdGhlIGRlc3RpbmF0aW9uIGFycmF5IGZvciB0aGUgYWxpYXNlcy4gVGhpcyBpcyBjbGVhcmVkLgorICAgICAqCisgICAgICogTXVsdGlwbGUgY29kZWNzIG1heSBzaGFyZSBhbHRlcm5hdGUgbmFtZXMgYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlCisgICAgICogZGlzdGluY3Q7IGhvd2V2ZXIsIHRoZXNlIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBhbGlhc2VzIGZvciB0aGUgTWVkaWFDb2RlYyB1c2VyIGFzCisgICAgICogdGhlIGNhbm9uaWNhbCBjb2RlYyBoYXMgdG8gYmUgcmVzb2x2ZWQgd2l0aG91dCBrbm93aW5nIHRoZSBtZWRpYSB0eXBlIGluCisgICAgICogTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lLgorICAgICAqLworICAgIHZvaWQgZ2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAogICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCiAgICAgICoKICAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IHJhbmsoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhbmsgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRlY2huaWNhbGx5IHRoaXMgaXMgZGVmaW5lZCB0byBiZSBwZXIgbWVkaWEgdHlwZSwgYnV0IHRoYXQgbWFrZXMgb3JkZXJpbmcgdGhlIE1lZGlhQ29kZWNMaXN0CisgICAgICogaW1wb3NzaWJsZSBhcyBNZWRpYUNvZGVjTGlzdCBpcyBvcmRlcmVkIGJ5IGNvZGVjIG5hbWUuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgpAQCAtMTgxLDExICsyMzEsMTIgQEAKIHByaXZhdGU6CiAgICAgQVN0cmluZyBtTmFtZTsKICAgICBBU3RyaW5nIG1Pd25lcjsKLSAgICBib29sIG1Jc0VuY29kZXI7CisgICAgQXR0cmlidXRlcyBtQXR0cmlidXRlczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CisgICAgVmVjdG9yPEFTdHJpbmc+IG1BbGlhc2VzOwogICAgIHVpbnQzMl90IG1SYW5rOwogCi0gICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4gQWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiwgaXRzCkBAIC0yMTksNiArMjcwLDEzIEBACiAgICAgICovCiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwogICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWxpYXMgKGFsdGVybmF0ZSBuYW1lKSBmb3IgdGhlIGNvZGVjLiBNdWx0aXBsZSBjb2RlY3MgY2FuIHNoYXJlIGFuIGFsdGVybmF0ZSBuYW1lCisgICAgICogYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlIGRpc3RpbmN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYW4gYWx0ZXJuYXRlIG5hbWUuCisgICAgICovCisgICAgdm9pZCBhZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIG93bmVyIG5hbWUgb2YgdGhlIGNvZGVjLgogICAgICAqCiAgICAgICogVGhpcyAib3duZXIgbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGBJT214YCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoaXMKQEAgLTIyOCwzMiArMjg2LDMyIEBACiAgICAgICovCiAgICAgdm9pZCBzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcik7CiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBTZXRzIGNvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaXNFbmNvZGVyIFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBDb2RlYyBhdHRyaWJ1dGVzLgogICAgICAqLwotICAgIHZvaWQgc2V0RW5jb2Rlcihib29sIGlzRW5jb2RlciA9IHRydWUpOworICAgIHZvaWQgc2V0QXR0cmlidXRlcyh0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcyk7CiAgICAgLyoqCi0gICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIEFkZCBhIG1lZGlhIHR5cGUgdG8gYW4gaW5kZXhlZCBsaXN0IGFuZCByZXR1cm4gYSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QKICAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RpZnlpbmcgdGhlIGFzc29jaWF0ZWQgYENhcGFiaWxpdGllc2AuCiAgICAgICoKLSAgICAgKiBJZiB0aGUgbWltZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuCisgICAgICogSWYgdGhlIG1lZGlhIHR5cGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCisgICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtW2luXSBtaW1lIFRoZSBuYW1lIG9mIGEgbmV3IG1pbWUgdG8gYWRkLgorICAgICAqIEBwYXJhbVtpbl0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIGEgbmV3IG1lZGlhIHR5cGUgdG8gYWRkLgogICAgICAqIEByZXR1cm4gd3JpdGVyIFRoZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QgZm9yIG1vZGlmeWluZyB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1pbWVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KKyAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1lZGlhVHlwZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgogICAgICAqLwotICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBhZGRNaW1lKAotICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1lZGlhVHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGEgbWltZS4KKyAgICAgKiBSZW1vdmUgYSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgdHlwZSB0byByZW1vdmUuCisgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1lZGlhVHlwZWAgaXMgcmVtb3ZlZDsgYGZhbHNlYCBpZiBgbWVkaWFUeXBlYCBpcyBub3QgZm91bmQuCiAgICAgICovCi0gICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIGJvb2wgcmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCiAgICAgICogU2V0IHJhbmsgb2YgdGhlIGNvZGVjLiBNZWRpYUNvZGVjTGlzdCB3aWxsIHN0YWJsZS1zb3J0IHRoZSBsaXN0IGFjY29yZGluZwogICAgICAqIHRvIHJhbmsgaW4gbm9uLWRlc2NlbmRpbmcgb3JkZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDBmZWI0ZjMuLjNlOGU3YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0zNCw3ICszNCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZXzEwODBQID0gNiwKICAgICBDQU1DT1JERVJfUVVBTElUWV9RVkdBID0gNywKICAgICBDQU1DT1JERVJfUVVBTElUWV8yMTYwUCA9IDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1ZHQSA9IDksCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0kgPSAxMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9RSEQgPSAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8yayA9IDEyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gMTIsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00Niw3ICs1MCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQSA9IDEwMDcsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yMTYwUCA9IDEwMDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0EgPSAxMDA5LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0kgPSAxMDEwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEID0gMTAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrID0gMTAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAxMiwKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKQEAgLTU1LDcgKzYzLDEwIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRiA9IDIwMDYsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9WR0EgPSAyMDA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0kgPSAyMDA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA4LAogfTsKIAogZW51bSB2aWRlb19kZWNvZGVyIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1MzQwZGRlLi5lMWM1ZDQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC03Miw2ICs3Miw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgPSAwOwogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCBiNWU1NjVlLi5iMTlkNDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMjMsMTEgKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlcjsKKwogY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7Ci0gICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKTsKIAogICAgIH5NaWRpSW9XcmFwcGVyKCk7CiAKQEAgLTQwLDcgKzQzLDcgQEAKICAgICBpbnQgbUZkOwogICAgIG9mZjY0X3QgbUJhc2U7CiAgICAgaW50NjRfdCAgbUxlbmd0aDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciAqbURhdGFTb3VyY2U7CiAgICAgRUFTX0ZJTEUgbUVhc0ZpbGU7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCmluZGV4IGM5N2QxNzEuLjhhNDE3ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0yNzgsNiArMjc4LDI1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhQ29kZWNXcmFwcGVyKTsKIH07CiAKK3N0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+Jik7CisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSopOworCisgICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOworCisgICAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKK307CisKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewogCiAgICAgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3Rvcik7CkBAIC0yODcsOCArMzA2LDYgQEAKIAogICAgIHN0YXR1c190IHJlbGVhc2UoKTsKIAotICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKLQogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CkBAIC0zMzksMzEgKzM1Niw2IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7CiB9OwogCi1zdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycik7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXRpYyB2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKLX07Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTkRLX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorI2RlZmluZSBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisvLyBUaGlzIGlzIGEgaGVhZGVyLW9ubHkgdXRpbGl0eS4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXRjaEJ1aWxkZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgbWl4X3VzZWNhc2VfdCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOworCisgICAgUGF0Y2hCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gQWxsIGV4aXN0aW5nIG1ldGhvZHMgb3BlcmF0aW5nIG9uIGF1ZGlvIHBhdGNoZXMgdGFrZSBhIHBvaW50ZXIgdG8gY29uc3QuCisgICAgLy8gSXQncyBPSyB0byBjb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgUGF0Y2hCdWlsZGVyIHdoaWxlIHByZXBhcmluZyBhIHBhcmFtZXRlcgorICAgIC8vIHRvIHN1Y2ggYSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBCdWlsZGVyIHdpbGwgYmUga2VwdCBhbGl2ZSB1bnRpbCB0aGUgY29kZQorICAgIC8vIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudCBzZW1pY29sb24uCisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCgpIGNvbnN0IHsgcmV0dXJuICZtUGF0Y2g7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9ydENmZ3MgeworICAgICAgICBQb3J0Q2Zncyh1bnNpZ25lZCBpbnQgKmNvdW50UHRyLCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnBvcnRDZmdzKQorICAgICAgICAgICAgICAgIDogbUNvdW50UHRyKGNvdW50UHRyKSwgbVBvcnRDZmdzKHBvcnRDZmdzKSB7fQorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0Q2ZnKSB7CisgICAgICAgICAgICByZXR1cm4gKmFkdmFuY2UoKSA9IHBvcnRDZmc7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBzcDxUPiYgZW50aXR5KSB7CisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyogYWRkZWQgPSBhZHZhbmNlKCk7CisgICAgICAgICAgICBlbnRpdHktPnRvQXVkaW9Qb3J0Q29uZmlnKGFkZGVkKTsKKyAgICAgICAgICAgIHJldHVybiAqYWRkZWQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXNlY2FzZVVwZGF0ZSkgeworICAgICAgICAgICAgYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlID0gdXNlY2FzZVVwZGF0ZTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LAorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248bWl4X3VzZWNhc2VfdChjb25zdCBtaXhfdXNlY2FzZV90Jik+IHVzZWNhc2VVcGRhdGVyKSB7CisgICAgICAgICAgICBtaXhfdXNlY2FzZV90KiB1c2VjYXNlID0gJmFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZTsKKyAgICAgICAgICAgICp1c2VjYXNlID0gdXNlY2FzZVVwZGF0ZXIoKnVzZWNhc2UpOworICAgICAgICB9CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogYWR2YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAmbVBvcnRDZmdzWygqbUNvdW50UHRyKSsrXTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBpbnQgKm1Db3VudFB0cjsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICptUG9ydENmZ3M7CisgICAgfTsKKworICAgIFBvcnRDZmdzIHNpbmtzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7IH0KKyAgICBQb3J0Q2ZncyBzb3VyY2VzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc291cmNlcywgbVBhdGNoLnNvdXJjZXMpOyB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmluZGV4IGQ0MjM5NjIuLmMyNzYxY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC05OSw2ICs5OSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBzZXF1ZW5jZSA+PSAwOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIChvciB0aGUgY29udGVudHMgb2YgdGhlIHNoYXJlZCBidWZmZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy8gaWYgbm8gdmFsdWUgd2FzIHdyaXR0ZW4pLgorICAgICAgICBUIGxhc3QoKSBjb25zdAorICAgICAgICB7ICAgLy8gYXNzdW1lIG5vIHNlcXVlbmNlIGNoZWNrIHJlcXVpcmVkIC0gd2UgYXJlIHRoZSB3cml0ZXIuCisgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bVZhbHVlOworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICBpbnQzMl90ICAgICBtU2VxdWVuY2U7CiAgICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDg2ZjBkNGMuLjQxOGUwOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzAsNzcgKzMxLDU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFNhbXBsZVJhdGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRGV2aWNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19kZXZpY2VzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBPdXRwdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19vdXRwdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IElucHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9faW5wdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEZvcm1hdFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZm9ybWF0X3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBDaGFubmVsVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jaGFubmVsX21hc2tfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBHYWluTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZ2Fpbl9tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTdHJlYW1UcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3N0cmVhbV90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb01vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvQ29udGVudFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY29udGVudF90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBVc2FnZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fdXNhZ2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFNvdXJjZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc291cmNlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IERlZmF1bHRUcmFpdHMKIHsKICAgICB0eXBlZGVmIFQgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9CiB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OworCit1c2luZyBTYW1wbGVSYXRlVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPHVpbnQzMl90PjsKK3VzaW5nIERldmljZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZGV2aWNlc190PjsKK3N0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Oworc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3VzaW5nIENoYW5uZWxUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Oworc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3VzaW5nIElucHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9faW5wdXRfZmxhZ3NfdD47Cit1c2luZyBPdXRwdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19vdXRwdXRfZmxhZ3NfdD47Cit1c2luZyBGb3JtYXRUcmFpdHMgPSBWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+OwordXNpbmcgR2Fpbk1vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2dhaW5fbW9kZV90PjsKK3VzaW5nIFN0cmVhbVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBBdWRpb01vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX21vZGVfdD47Cit1c2luZyBBdWRpb0NvbnRlbnRUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2NvbnRlbnRfdHlwZV90PjsKK3VzaW5nIFVzYWdlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb191c2FnZV90PjsKK3VzaW5nIFNvdXJjZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc291cmNlX3Q+Oworc3RydWN0IEF1ZGlvRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGF1ZGlvX2ZsYWdzX21hc2tfdD4ge307CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CiBzdGF0aWMgdm9pZCBjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCkBAIC0xMTAsNyArODksNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgdHlwZW5hbWUgVHJhaXRzOjpUeXBlID4oY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTE4MSw3ICsxNjAsNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0yMzQsNiArMjEzLDcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPiBBdWRpb0ZsYWdDb252ZXJ0ZXI7CiAKIHRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwpAQCAtMjQ5LDYgKzIyOSw3IEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwogCkBAIC0yNzQsNiArMjU1LDY5IEBACiBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBzdGQ6OnN0cmluZyB1c2FnZUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCB1c2FnZTogJWQiLCB1c2FnZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fVVNBR0VfVU5LTk9XTiI7CisgICAgfQorICAgIHJldHVybiB1c2FnZUxpdGVyYWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudCkKK3sKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50TGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNvbnRlbnQsIGNvbnRlbnRMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgY29udGVudCB0eXBlOiAlZCIsIGNvbnRlbnQpOworICAgICAgICByZXR1cm4gIkFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOIjsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnRMaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhzdHJlYW0sIHN0cmVhbUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBzdHJlYW06ICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuICJBVURJT19TVFJFQU1fREVGQVVMVCI7CisgICAgfQorICAgIHJldHVybiBzdHJlYW1MaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOworICAgIGlmICghYW5kcm9pZDo6U291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoc291cmNlLCBzb3VyY2VMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlOiAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fU09VUkNFX0RFRkFVTFQiOworICAgIH0KKyAgICByZXR1cm4gc291cmNlTGl0ZXJhbDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgInsgQ29udGVudCB0eXBlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuY29udGVudF90eXBlKQorICAgICAgICAgICA8PCAiIFVzYWdlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMudXNhZ2UpCisgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICA8PCAiIEZsYWdzOiAiIDw8IGF0dHJpYnV0ZXMuZmxhZ3MKKyAgICAgICAgICAgPDwgIiBUYWdzOiAiIDw8IGF0dHJpYnV0ZXMudGFncworICAgICAgICAgICA8PCAiIH0iOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBtb2RlTGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobW9kZSwgbW9kZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICByZXR1cm4gIkFVRElPX01PREVfSU5WQUxJRCI7CisgICAgfQorICAgIHJldHVybiBtb2RlTGl0ZXJhbDsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li4zM2JlNTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpAQCAtMTExLDkgKzExNSw2IEBACiAgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKLSAgICAvLyBFcnJvciBzdGF0ZS4KLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCi0KICAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKIApAQCAtMTI4LDYgKzEyOSw5IEBACiAKICAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAorCisgICAgLy8gRXJyb3Igc3RhdGUuCisgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gMSA8PCA1LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCkBAIC0yNjAsNiArMjY0LDcgQEAKICAgICBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCk7CiAgICAgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBzdGF0dXNfdCAgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKaW5kZXggZWViYzhjNi4uMWRiNDI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKQEAgLTU5LDcgKzU5LDcgQEAKICAqIC0gVFcgPSBUcmVibGUgV3JhcHBlciAtLS0gSXQgd3JhcHMgYSBsZWdhY3kgb2JqZWN0IGluc2lkZSBhIFRyZWJsZSBvYmplY3QuCiAgKi8KIAotc3RydWN0IExXT214Tm9kZSA6IHB1YmxpYyBIMkJDb252ZXJ0ZXI8SU9teE5vZGUsIElPTVhOb2RlLCBCbk9NWE5vZGU+IHsKK3N0cnVjdCBMV09teE5vZGUgOiBwdWJsaWMgSDJCQ29udmVydGVyPElPbXhOb2RlLCBCbk9NWE5vZGU+IHsKICAgICBMV09teE5vZGUoc3A8SU9teE5vZGU+IGNvbnN0JiBiYXNlKSA6IENCYXNlKGJhc2UpIHt9CiAgICAgc3RhdHVzX3QgZnJlZU5vZGUoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggOTJjZmIxYy4uZDA3ZTcwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTg0Miw0ICs4NDIsMTUgQEAKICAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QKK3sKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggMzFkMWRmOS4uMWVkMWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKIAogQm5TdGF0dXMgTFdHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIHsKLSAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKKyAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CiAgICAgcmV0dXJuIHRvQmluZGVyU3RhdHVzKG1CYXNlLT5jb25maWd1cmUoCiAgICAgICAgICAgICBoT214Tm9kZSA9PSBudWxscHRyID8gbmV3IFRXT214Tm9kZShvbXhOb2RlKSA6IGhPbXhOb2RlLAogICAgICAgICAgICAgdG9IYXJkd2FyZURhdGFzcGFjZShkYXRhU3BhY2UpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzYjhmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYm1lZGlhZXh0cmFjdG9yIiwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAotICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YS5jcHAiLAotICAgICAgICAiTWV0YURhdGFCYXNlLmNwcCIsCi0gICAgICAgICJWb3JiaXNDb21tZW50LmNwcCIsCi0gICAgXSwKLQotICAgIGNsYW5nOiB0cnVlLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk3YjNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IE1lZGlhQnVmZmVyOjptVXNlU2hhcmVkTWVtb3J5KDApOwotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShkYXRhKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci19Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKE5VTEwpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCi0gICAgICBtT3duc0RhdGEodHJ1ZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAotICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgewotICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVtb3J5RGVhbGVyKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksICJNZWRpYUJ1ZmZlciIpOwotICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOwotICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOwotICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGJ1ZmZlci0+ZGF0YSgpKSwKLSAgICAgIG1TaXplKGJ1ZmZlci0+c2l6ZSgpKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCi0gICAgICBtQnVmZmVyKGJ1ZmZlciksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6cmVsZWFzZSgpIHsKLSAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgLy8gTGVnYWN5IGNvbnRyYWN0IGZvciBNZWRpYUJ1ZmZlciB3aXRob3V0IGEgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAgICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAwKTsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgcHJldkNvdW50ID0gbVJlZkNvdW50LmZldGNoX3N1YigxKTsKLSAgICBpZiAocHJldkNvdW50ID09IDEpIHsKLSAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1PYnNlcnZlci0+c2lnbmFsQnVmZmVyUmV0dXJuZWQodGhpcyk7Ci0gICAgfQotICAgIENIRUNLKHByZXZDb3VudCA+IDApOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpjbGFpbSgpIHsKLSAgICBDSEVDSyhtT2JzZXJ2ZXIgIT0gTlVMTCk7Ci0gICAgQ0hFQ0tfRVEobVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksIDEpOwotCi0gICAgbVJlZkNvdW50LnN0b3JlKDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgewotICAgICh2b2lkKSBtUmVmQ291bnQuZmV0Y2hfYWRkKDEpOwotfQotCi12b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGE7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2Vfb2Zmc2V0KCkgY29uc3QgewotICAgIHJldHVybiBtUmFuZ2VPZmZzZXQ7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2VfbGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBtUmFuZ2VMZW5ndGg7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7Ci0gICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOwotICAgIH0KLSAgICBDSEVDSyhvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpOwotCi0gICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1SYW5nZUxlbmd0aCA9IGxlbmd0aDsKLX0KLQotTWV0YURhdGFCYXNlJiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgewotICAgIHJldHVybiAqbU1ldGFEYXRhOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpyZXNldCgpIHsKLSAgICBtTWV0YURhdGEtPmNsZWFyKCk7Ci0gICAgc2V0X3JhbmdlKDAsIG1TaXplKTsKLX0KLQotTWVkaWFCdWZmZXI6On5NZWRpYUJ1ZmZlcigpIHsKLSAgICBDSEVDSyhtT2JzZXJ2ZXIgPT0gTlVMTCk7Ci0KLSAgICBpZiAobU93bnNEYXRhICYmIG1EYXRhICE9IE5VTEwgJiYgbU1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobURhdGEpOwotICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1PcmlnaW5hbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1PcmlnaW5hbC0+cmVsZWFzZSgpOwotICAgICAgICBtT3JpZ2luYWwgPSBOVUxMOwotICAgIH0KLQotICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOwotICAgfQotICAgZGVsZXRlIG1NZXRhRGF0YTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKLSAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotTWVkaWFCdWZmZXJCYXNlICpNZWRpYUJ1ZmZlcjo6Y2xvbmUoKSB7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtRGF0YSwgbVNpemUpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoKTsKLSAgICBidWZmZXItPm1NZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKm1NZXRhRGF0YSk7Ci0KLSAgICBhZGRfcmVmKCk7Ci0gICAgYnVmZmVyLT5tT3JpZ2luYWwgPSB0aGlzOwotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGRkNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJHcm91cCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RkOjptaW4gaXMgbm90IGNvbnN0ZXhwciBpbiBDKysxMQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBUIE1JTihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7IHJldHVybiBhIDw9IGIgPyBhIDogYjsgfQotCi0vLyBNZWRpYUJ1ZmZlckdyb3VwIG1heSBjcmVhdGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzIGF0IGEKLS8vIHNtYWxsZXIgdGhyZXNob2xkIHRoYW4gYW4gaXNvbGF0ZWQgbmV3IE1lZGlhQnVmZmVyLgotc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtb3J5VGhyZXNob2xkID0gTUlOKAotICAgICAgICAoc2l6ZV90KU1lZGlhQnVmZmVyOjprU2hhcmVkTWVtVGhyZXNob2xkLCAoc2l6ZV90KSg0ICogMTAyNCkpOwotCi1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDo6SW50ZXJuYWxEYXRhIHsKLSAgICBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLSAgICBzaXplX3QgbUdyb3d0aExpbWl0OyAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgZ3JvdyBncm91cCBsYXJnZXIgdGhhbiB0aGlzLgotICAgIHN0ZDo6bGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbUJ1ZmZlcnM7Ci19OwotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKLSAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OwotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKLSAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OwotCi0gICAgaWYgKG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMCAmJiBidWZmZXJzID4gbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKLSAgICAgICAgQUxPR1coIlByZWFsbG9jYXRlZCBidWZmZXJzICV6dSA+IGdyb3d0aExpbWl0ICV6dSwgaW5jcmVhc2luZyBncm93dGhMaW1pdCIsCi0gICAgICAgICAgICAgICAgYnVmZmVycywgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpOwotICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlcl9zaXplID49IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQpIHsKLSAgICAgICAgQUxPR0QoImNyZWF0aW5nIE1lbW9yeURlYWxlciIpOwotICAgICAgICAvLyBVc2luZyBhIHNpbmdsZSBNZW1vcnlEZWFsZXIgaXMgZWZmaWNpZW50IGZvciBhIGdyb3VwIG9mIHNoYXJlZCBtZW1vcnkgb2JqZWN0cy4KLSAgICAgICAgLy8gVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCB3ZSB1c2Ugc2hhcmVkIG1lbW9yeSAobm8gZmFsbGJhY2sgdG8gbWFsbG9jKS4KLQotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7Ci0gICAgICAgIHNpemVfdCBhdWdtZW50ZWRfc2l6ZSA9IGJ1ZmZlcl9zaXplICsgc2l6ZW9mKE1lZGlhQnVmZmVyOjpTaGFyZWRDb250cm9sKTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gKGF1Z21lbnRlZF9zaXplICsgYWxpZ25tZW50IC0gMSkgLyBhbGlnbm1lbnQgKiBhbGlnbm1lbnQgKiBidWZmZXJzOwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWwsICJNZWRpYUJ1ZmZlckdyb3VwIik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoYXVnbWVudGVkX3NpemUpOwotICAgICAgICAgICAgaWYgKG1lbS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IHNoYXJlZCBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtZW0pOwotICAgICAgICAgICAgYnVmZmVyLT5nZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vbi1zaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJfc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBkb24ndCBjYWxsIHJlbGVhc2UsIGl0J3Mgbm90IHByb3Blcmx5IGZvcm1lZAotICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBtYWxsb2MgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyR3JvdXA6On5NZWRpYUJ1ZmZlckdyb3VwKCkgewotICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgY29uc3QgaW50IGxvY2FsUmVmY291bnQgPSBidWZmZXItPmxvY2FsUmVmY291bnQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCByZW1vdGVSZWZjb3VudCA9IGJ1ZmZlci0+cmVtb3RlUmVmY291bnQoKTsKLQotICAgICAgICAgICAgLy8gRmF0YWwgaWYgd2UgaGF2ZSBhIGxvY2FsIHJlZmNvdW50LgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihsb2NhbFJlZmNvdW50ICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICJidWZmZXIoJXApIGxvY2FsUmVmY291bnQgJWQgIT0gMCwgcmVtb3RlUmVmY291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxvY2FsUmVmY291bnQsIHJlbW90ZVJlZmNvdW50KTsKLQotICAgICAgICAgICAgLy8gTG9nIGFuIGVycm9yIGlmIHdlIGhhdmUgYSByZW1haW5pbmcgcmVtb3RlIHJlZmNvdW50LAotICAgICAgICAgICAgLy8gYXMgdGhlIHJlbW90ZSBwcm9jZXNzIG1heSBoYXZlIGRpZWQgb3IgbWF5IGhhdmUgaW5hcHByb3ByaWF0ZSBiZWhhdmlvci4KLSAgICAgICAgICAgIC8vIFRoZSBzaGFyZWQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgTWVkaWFCdWZmZXIgd2lsbAotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBiZSByZWNsYWltZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGZkcwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LgotICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciglcCkgaGFzIHJlc2lkdWFsIHJlbW90ZVJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCByZW1vdGVSZWZjb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ3JhY2VmdWxseSBkZWxldGUuCi0gICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIH0KLSAgICBkZWxldGUgbUludGVybmFsOwotfQotCi12b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0KLSAgICAvLyBpZiB3ZSdyZSBhYm92ZSBvdXIgZ3Jvd3RoIGxpbWl0LCByZWxlYXNlIGJ1ZmZlcnMgaWYgd2UgY2FuCi0gICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOwotICAgICAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwCi0gICAgICAgICAgICAmJiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA+PSBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdAotICAgICAgICAgICAgJiYgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTspIHsKLSAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICgqaXQpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKLX0KLQotYm9vbCBNZWRpYUJ1ZmZlckdyb3VwOjpoYXNfYnVmZmVycygpIHsKLSAgICBpZiAobUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgY2FuIGFkZCBtb3JlIGJ1ZmZlcnMgaW50ZXJuYWxseS4KLSAgICB9Ci0gICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IHNtYWxsZXN0ID0gcmVxdWVzdGVkU2l6ZTsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOwotICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAoKml0KS0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplID49IHJlcXVlc3RlZFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gKml0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPCBzbWFsbGVzdCkgewotICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdCA9IHNpemU7IC8vIGFsd2F5cyBmcmVlIHRoZSBzbWFsbGVzdCBidWYKLSAgICAgICAgICAgICAgICAgICAgZnJlZSA9IGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICAmJiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpKSB7Ci0gICAgICAgICAgICAvLyBXZSBhbGxvYyBiZWZvcmUgd2UgZnJlZSBzbyBmYWlsdXJlIGxlYXZlcyBncm91cCB1bmNoYW5nZWQuCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA8IFNJWkVfTUFYIC8gMyAqIDIgLyogTkI6IG9yZGVyaW5nICovID8KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSAqIDMgLyAyIDogcmVxdWVzdGVkU2l6ZTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihhbGxvY2F0ZVNpemUpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBzaXplICV6dSIsIGFsbG9jYXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gSW52YWxpZCBhbGxvYywgcHJlZmVyIG5vdCB0byBjYWxsIHJlbGVhc2UuCi0gICAgICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IHZzIGF2YWlsYWJsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUsICgqZnJlZSktPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICpmcmVlID0gYnVmZmVyOyAvLyBpbi1wbGFjZSByZXBsYWNlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IiwgcmVxdWVzdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYnVmZmVyLT5hZGRfcmVmKCk7Ci0gICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7Ci0gICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub25CbG9ja2luZykgewotICAgICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZSwgYmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCi0gICAgICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi53YWl0KG1JbnRlcm5hbC0+bUxvY2spOwotICAgIH0KLSAgICAvLyBOZXZlciBnZXRzIGhlcmUuCi19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlckdyb3VwOjpidWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjNkYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7Ci0gICAgaWYgKCFMT0dfTkRFQlVHKSB7Ci0gICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOwotICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7Ci0gICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOwotICAgIH0KLX0KLQotTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9Ci0KLXVpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYzZjU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9Ci0KLU1lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlJlYWRPcHRpb25zKCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgewotICAgIG1PcHRpb25zID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgewotICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKLSAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0gICAgbVNlZWtNb2RlID0gbW9kZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7Ci0gICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAotICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgewotICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7Ci0gICAgKm1vZGUgPSBtU2Vla01vZGU7Ci0gICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYWY1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWb3JiaXNDb21tZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAibWVkaWEvVm9yYmlzQ29tbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBmbGFjQnVmZmVyID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKSk7Ci0gICAgaWYgKGZsYWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZmxhY1NpemUgPSBmbGFjQnVmZmVyLT5zaXplKCk7Ci0gICAgdWludDhfdCAqZmxhYyA9IGZsYWNCdWZmZXItPmRhdGEoKTsKLSAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7Ci0KLSAgICB1aW50MzJfdCBwaWNUeXBlOwotICAgIHVpbnQzMl90IHR5cGVMZW47Ci0gICAgdWludDMyX3QgZGVzY0xlbjsKLSAgICB1aW50MzJfdCBkYXRhTGVuOwotICAgIGNoYXIgdHlwZVsxMjhdOwotCi0gICAgaWYgKGZsYWNTaXplIDwgOCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKLQotICAgIGlmIChwaWNUeXBlICE9IDMpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOwotICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAotICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOwotICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOwotCi0gICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKLQotICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOwotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCi0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKLSAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICBrS2V5QWxidW1BcnQsIDAsICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7Ci19Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOwotICAgICAgICB1aW50MzJfdCBtS2V5OwotICAgIH0ga01hcFtdID0gewotICAgICAgICB7ICJUSVRMRSIsIGtLZXlUaXRsZSB9LAotICAgICAgICB7ICJBUlRJU1QiLCBrS2V5QXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJDT01QSUxBVElPTiIsIGtLZXlDb21waWxhdGlvbiB9LAotICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAotICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAotICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAotICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCi0gICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKLSAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCi0gICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAotICAgICAgICB7ICJZRUFSIiwga0tleVllYXIgfSwKLSAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCi0gICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKLSAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCi0gICAgfTsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7Ci0gICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQotICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU5ZjM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KLQotI2RlZmluZSBEQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSwgcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgRGF0YVNvdXJjZSgpIHt9Ci0KLSAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBJRGF0YVNvdXJjZSBpZiBpdCBpcyB3cmFwcGVkLgotICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCI8dW5zcGVjaWZpZWQ+Iik7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIGZvciBEUk0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKiAvKm1pbWUqLyA9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpIGZpbmFsIHsKLSAgICAgICAgaW50IHJldCA9IHNucHJpbnRmKHVyaVN0cmluZywgYnVmZmVyU2l6ZSwgIiVzIiwgZ2V0VXJpKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiByZXQgPj0gMCAmJiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBidWZmZXJTaXplOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQotCi1wcml2YXRlOgotICAgIERhdGFTb3VyY2UoY29uc3QgRGF0YVNvdXJjZSAmKTsKLSAgICBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5OTNkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1NPVVJDRV9CQVNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgRGF0YVNvdXJjZUJhc2UgewotcHVibGljOgotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKLSAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCi0gICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAotICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKLSAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAotICAgIH07Ci0KLSAgICBEYXRhU291cmNlQmFzZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgotICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCi0gICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6Ci0gICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KTsKLSAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOyAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKLSAgICBib29sIGdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOwotICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCk7Ci0KLSAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCi0gICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKLSAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTk4ZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci1zdHJ1Y3QgTWVkaWFUcmFjazsKLQotCi1jbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi0KLWNsYXNzIE1lZGlhRXh0cmFjdG9yCi0vLyA6IHB1YmxpYyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7Ci0KLSAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7Ci0gICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCi0gICAgfTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOwotCi0gICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpID0gMDsKLQotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCi0gICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCi0gICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgotICAgIH07Ci0KLSAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCi0gICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9Ci0KLSAgICB0eXBlZGVmIE1lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOwotICAgIHR5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7Ci0KLSAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcwotICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplIGl0cyBzdGF0ZSB3aXRob3V0IGR1cGxpY2F0aW5nCi0gICAgLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQotICAgIC8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCi0gICAgdHlwZWRlZiBDcmVhdG9yRnVuYyAoKlNuaWZmZXJGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjb25zdCB1aW50OF90IGJbMTZdOwotICAgIH0gdXVpZF90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICAvLyB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZQotICAgICAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKLQotICAgICAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KLSAgICAgICAgLy8gU2VlIGJlbG93IGZvciBhIGNvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSB0aGlzIGZyb20gYSBzdHJpbmcuCi0gICAgICAgIHV1aWRfdCBleHRyYWN0b3JfdXVpZDsKLQotICAgICAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIHV1aWQgYXJlIGVuY291bnRlcmVkLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgdmVyc2lvbiBudW1iZXIgd2lsbAotICAgICAgICAvLyBiZSB1c2VkLgotICAgICAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKLQotICAgICAgICAvLyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUKLSAgICAgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7Ci0KLSAgICAgICAgLy8gdGhlIHNuaWZmZXIgZnVuY3Rpb24KLSAgICAgICAgY29uc3QgU25pZmZlckZ1bmMgc25pZmY7Ci0gICAgfSBFeHRyYWN0b3JEZWY7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSAxOwotCi0gICAgdHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBNZWRpYUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIE1lZGlhRXh0cmFjdG9yKGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotICAgIE1lZGlhRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci19OwotCi0vLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCi0vLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKLWludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJwotICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAotICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Ci19Ci0KLWNvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgewotICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBOPgotY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKLSAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKLSAgICByZXR1cm4KLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAotICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB7ewotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCi0gICAgICAgICAgICB9fTsKLX0KLS8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIHV1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAotLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKLS8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KLS8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0vLwotLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5Ci0vLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcwotLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAotLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCi0KLSNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKLQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVhNjFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCi0KLSNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2U7Ci0KLWNsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotfTsKLQotc3RydWN0IE1lZGlhVHJhY2sKLS8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKLXsKLSAgICBNZWRpYVRyYWNrKCk7Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKLSAgICAvLyBnZXRGb3JtYXQoKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCkgPSAwOwotCi0gICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCi0gICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCi0gICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KLSAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOwotCi0gICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bwotICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlawotICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAotICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7Ci0gICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKLSAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKLSAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1QsCi0gICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAotICAgICAgICB9OwotCi0gICAgICAgIFJlYWRPcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwotICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKLQotICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7Ci0gICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOwotICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgotICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKLSAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gT3B0aW9ucyB7Ci0gICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKLSAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOwotICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKLSAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCi0KLSAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCi0gICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgLy8gaXMgcmVhY2hlZC4KLSAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgotICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCi0gICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZwotICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOwotICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMzI5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgVk9SQklTX0NPTU1FTlRfSF8KLSNkZWZpbmUgVk9SQklTX0NPTU1FTlRfSF8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBWT1JCSVNfQ09NTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI1OTY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLWNsYXNzIE1lZGlhQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKLXB1YmxpYzoKLSAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OwotCi0gICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQotICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotCi0gICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgotICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgewotICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQotICAgICAgICBtTWVtb3J5ID0gbWVtOwotICAgIH0KLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKTsKLQotICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCk7Ci0KLSAgICBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpOwotCi0gICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIHZpcnR1YWwgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSgpOwotCi0gICAgLy8gc3VtIG9mIGxvY2FsUmVmY291bnQoKSBhbmQgcmVtb3RlUmVmY291bnQoKQotICAgIC8vIFJlc3VsdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHByb3hpbWF0ZSB1bmxlc3MgdGhlIHJlc3VsdCBwcmVjbHVkZXMgY29uY3VycmVudCBhY2Nlc3Nlcy4KLSAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUmVmY291bnQoKSArIHJlbW90ZVJlZmNvdW50KCk7Ci0gICAgfQotCi0gICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgotICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVmQ291bnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5nZXRSZW1vdGVSZWZjb3VudCgpOwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgc28gdGhhdCByZW1vdGVSZWZDb3VudCgpIGlzIG5vbi1uZWdhdGl2ZS4KLSAgICAgICAgcmV0dXJuIHJlbW90ZVJlZmNvdW50ID49IDAgPyByZW1vdGVSZWZjb3VudCA6IDA7IC8vIGRvIG5vdCBhbGxvdyBjb3JydXB0ZWQgZGF0YS4KLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQotICAgIGludCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmFkZFJlbW90ZVJlZmNvdW50KHZhbHVlKTsKLSAgICB9Ci0KLSAgICBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGlzRGVhZE9iamVjdChtTWVtb3J5KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbCBpc0RlYWRPYmplY3QoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSkgewotICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLy8gU3RpY2t5IG9uIGVuYWJsaW5nIG9mIHNoYXJlZCBtZW1vcnkgTWVkaWFCdWZmZXJzLiBCeSBkZWZhdWx0IHdlIGRvbid0IHVzZQotICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIE1lZGlhQnVmZmVycywgYnV0IHdlIGVuYWJsZSB0aGlzIGZvciB0aG9zZSBwcm9jZXNzZXMKLSAgICAvLyB0aGF0IGV4cG9ydCBNZWRpYUJ1ZmZlcnMuCi0gICAgc3RhdGljIHZvaWQgdXNlU2hhcmVkTWVtb3J5KCkgewotICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAmbVVzZVNoYXJlZE1lbW9yeSwgKGludF9sZWFzdDMyX3QpMSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gdHJ1ZSBpZiBNZWRpYUJ1ZmZlciBpcyBvYnNlcnZlZCAocGFydCBvZiBhIE1lZGlhQnVmZmVyR3JvdXApLgotICAgIGlubGluZSBib29sIGlzT2JzZXJ2ZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtT2JzZXJ2ZXIgIT0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlcigpOwotCi0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBmcmllbmQgY2xhc3MgT01YRGVjb2RlcjsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKLQotICAgIC8vIEZvciB1c2UgYnkgT01YRGVjb2RlciwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgMSwgZHJvcCByZWZlcmVuY2UKLSAgICAvLyBjb3VudCB0byAwIHdpdGhvdXQgc2lnbmFsbGluZyB0aGUgb2JzZXJ2ZXIuCi0gICAgdm9pZCBjbGFpbSgpOwotCi0gICAgTWVkaWFCdWZmZXJPYnNlcnZlciAqbU9ic2VydmVyOwotICAgIHN0ZDo6YXRvbWljPGludD4gbVJlZkNvdW50OwotCi0gICAgdm9pZCAqbURhdGE7Ci0gICAgc2l6ZV90IG1TaXplLCBtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aDsKLSAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotCi0gICAgYm9vbCBtT3duc0RhdGE7Ci0KLSAgICBNZXRhRGF0YUJhc2UqIG1NZXRhRGF0YTsKLQotICAgIE1lZGlhQnVmZmVyICptT3JpZ2luYWw7Ci0KLSAgICBzdGF0aWMgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtVXNlU2hhcmVkTWVtb3J5OwotCi0gICAgTWVkaWFCdWZmZXIoY29uc3QgTWVkaWFCdWZmZXIgJik7Ci0gICAgTWVkaWFCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlciAmKTsKLQotICAgIC8vIFNoYXJlZENvbnRyb2wgYmxvY2sgYXQgdGhlIHN0YXJ0IG9mIElNZW1vcnkuCi0gICAgc3RydWN0IFNoYXJlZENvbnRyb2wgewotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIEZMQUdfREVBRF9PQkpFQ1QgPSAoMSA8PCAwKSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQotICAgICAgICBpbmxpbmUgaW50MzJfdCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgaW50MzJfdCBnZXRSZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtUmVtb3RlUmVmY291bnQsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAoc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgJiBGTEFHX0RFQURfT0JKRUNUKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0RGVhZE9iamVjdCgpIHsKLSAgICAgICAgICAgICh2b2lkKXN0ZDo6YXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdClGTEFHX0RFQURfT0JKRUNULCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBDYXV0aW9uOiBhdG9taWNfaW50X2Zhc3QzMl90IGlzIDY0IGJpdHMgb24gTFA2NC4KLSAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVJlbW90ZVJlZmNvdW50OwotICAgICAgICBpbnQzMl90IHVudXNlZFs2XSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IC8vIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlCi0gICAgfTsKLQotICAgIGlubGluZSBTaGFyZWRDb250cm9sICpnZXRTaGFyZWRDb250cm9sKCkgY29uc3QgewotICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOwotICAgICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGQ5NGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9CQVNFX0hfCi0KLSNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2U7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOwotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOwotfTsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOwotCi0gICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OwotICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCi0gICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgotICAgIC8vCi0gICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCi0gICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKLQotICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOwotCi0gICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlckJhc2UgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlCi0gICAgLy8gY291bnQuIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIHZpcnR1YWwgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSgpID0gMDsKLQotICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHt9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkNWRmNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9HUk9VUF9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9HUk9VUF9IXwotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2U7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyR3JvdXAgOiBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKLQotICAgIC8vIGNyZWF0ZSBhIG1lZGlhIGJ1ZmZlciBncm91cCB3aXRoIHByZWFsbG9jYXRlZCBidWZmZXJzCi0gICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKLQotICAgIH5NZWRpYUJ1ZmZlckdyb3VwKCk7Ci0KLSAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotCi0gICAgYm9vbCBoYXNfYnVmZmVycygpOwotCi0gICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCi0gICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgotICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCi0gICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKLSAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCi0gICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyAwLCBhbnkgZnJlZSBNZWRpYUJ1ZmZlciB3aWxsIGJlIHJldHVybmVkLgotICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgPiAwLCB0aGUgcmV0dXJuZWQgTWVkaWFCdWZmZXIgc2hvdWxkIGhhdmUgYnVmZmVyCi0gICAgLy8gc2l6ZSBvZiBhdCBsZWFzdCByZXF1c3RlZFNpemUuCi0gICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKTsKLQotICAgIHNpemVfdCBidWZmZXJzKCkgY29uc3Q7Ci0KLSAgICAvLyBJZiBidWZmZXIgaXMgbnVsbHB0ciwgaGF2ZSBhY3F1aXJlX2J1ZmZlcigpIGNoZWNrIGZvciByZW1vdGUgcmVsZWFzZS4KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBJbnRlcm5hbERhdGE7Ci0gICAgSW50ZXJuYWxEYXRhICptSW50ZXJuYWw7Ci0KLSAgICBNZWRpYUJ1ZmZlckdyb3VwKGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9HUk9VUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGU4NmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRVRBX0RBVEFfQkFTRV9IXwotCi0jZGVmaW5lIE1FVEFfREFUQV9CQVNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgZm9sbG93aW5nIGtleXMgbWFwIHRvIGludDMyX3QgZGF0YSB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLWVudW0gewotICAgIGtLZXlNSU1FVHlwZSAgICAgICAgICA9ICdtaW1lJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlIZWlnaHQgICAgICAgICAgICA9ICdoZWlnJywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCi0gICAga0tleURpc3BsYXlXaWR0aCAgICAgID0gJ2RXaWQnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgotICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCi0gICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0Ci0gICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCi0gICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAotCi0gICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCi0gICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLAotCi0gICAga0tleVJvdGF0aW9uICAgICAgICAgID0gJ3JvdEEnLCAgLy8gaW50MzJfdCAoYW5nbGUgaW4gZGVncmVlcykKLSAgICBrS2V5SUZyYW1lc0ludGVydmFsICAgPSAnaWZpdicsICAvLyBpbnQzMl90Ci0gICAga0tleVN0cmlkZSAgICAgICAgICAgID0gJ3N0cmQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTbGljZUhlaWdodCAgICAgICA9ICdzbGh0JywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2hhbm5lbENvdW50ICAgICAgPSAnI2NobicsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxNYXNrICAgICAgID0gJ2Nobm0nLCAgLy8gaW50MzJfdAotICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGF1ZGlvIHNhbXBsaW5nIHJhdGUgSHopCi0gICAga0tleVBjbUVuY29kaW5nICAgICAgID0gJ1BDTWUnLCAgLy8gaW50MzJfdCAoYXVkaW8gZW5jb2RpbmcgZW51bSkKLSAgICBrS2V5RnJhbWVSYXRlICAgICAgICAgPSAnZnJtUicsICAvLyBpbnQzMl90ICh2aWRlbyBmcmFtZSByYXRlIGZwcykKLSAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCi0gICAga0tleU1heEJpdFJhdGUgICAgICAgID0gJ214QnInLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlCaXRzUGVyU2FtcGxlICAgICA9ICdiaXRzJywgIC8vIGludDMyX3QgKGJpdHMgcGVyIHNhbXBsZSkKLSAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAotICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQotICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQotICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQotICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCi0gICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKLSAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCi0gICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlJc011eGVyRGF0YSAgICAgICA9ICdtdXhkJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleURlY29kaW5nVGltZSAgICAgID0gJ2RlY1QnLCAgLy8gaW50NjRfdCAoZGVjb2RpbmcgdGltZXN0YW1wIGluIHVzZWNzKQotICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQotICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAotICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKLSAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCi0gICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAotICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKLSAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCi0gICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAotICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKLSAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlFbmNvZGVyRGVsYXkgICAgICA9ICdlbmNkJywgIC8vIGludDMyX3QgKGZyYW1lcykKLSAgICBrS2V5RW5jb2RlclBhZGRpbmcgICAgPSAnZW5jcCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0KLSAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCi0gICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydGlzdCAgICAgICA9ICdhYXJ0JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q29tcG9zZXIgICAgICAgICAgPSAnY29tcCcsICAvLyBjc3RyaW5nCi0gICAga0tleUdlbnJlICAgICAgICAgICAgID0gJ2dlbnInLCAgLy8gY3N0cmluZwotICAgIGtLZXlUaXRsZSAgICAgICAgICAgICA9ICd0aXRsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5WWVhciAgICAgICAgICAgICAgPSAneWVhcicsICAvLyBjc3RyaW5nCi0gICAga0tleUFsYnVtQXJ0ICAgICAgICAgID0gJ2FsYkEnLCAgLy8gY29tcHJlc3NlZCBpbWFnZSBkYXRhCi0gICAga0tleUFsYnVtQXJ0TUlNRSAgICAgID0gJ2FsQU0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCi0gICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBpbGF0aW9uICAgICAgID0gJ2NwaWwnLCAgLy8gY3N0cmluZwotICAgIGtLZXlMb2NhdGlvbiAgICAgICAgICA9ICdsb2MgJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGltZVNjYWxlICAgICAgICAgPSAndG1zbCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNhcHR1cmVGcmFtZXJhdGUgID0gJ2NhcEYnLCAgLy8gZmxvYXQgKGNhcHR1cmUgZnBzKQotCi0gICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKLSAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90Ci0gICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAotICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKLQotICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZwotICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKLSAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgotICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKLQotICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKLSAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCi0gICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAotCi0gICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5TnVtQnVmZmVycyAgICAgICAgPSAnbmJiZicsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KLSAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAga0tleVZhbGlkU2FtcGxlcyAgICAgID0gJ3ZhbEQnLCAgLy8gaW50MzJfdAotCi0gICAga0tleUlzVW5yZWFkYWJsZSAgICAgID0gJ3VucmUnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KLSAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKLSAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCi0KLSAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQotICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCi0KLSAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKLSAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KLSAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKLSAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KLSAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQotICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCi0gICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgotICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKLSAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KLSAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCi0gICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAotICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KLSAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YUJhc2U6OnNldERhdGEgQVBJLCBpLmUuCi0gICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107Ci0gICAgLy8gbWV0YS0+c2V0RGF0YSgKLSAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKLSAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KLSAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQotICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCi0gICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KLSAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAotCi0gICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKLQotICAgIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgPSAnY2JsaycsICAvLyB1aW50OF90Ci0gICAga0tleVNraXBCeXRlQmxvY2sgICAgID0gJ3NibGsnLCAgLy8gdWludDhfdAotCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KLSAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KLSAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KLSAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBIMjY0IHN1cHBsZW1lbnRhbCBlbmhhbmNlbWVudCBpbmZvcm1hdGlvbiBvZmZzZXRzL3NpemVzCi0gICAga0tleVNFSSAgICAgICAgICAgICAgID0gJ3NlaSAnLCAvLyByYXcgZGF0YQotCi0gICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cwotICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KLQotICAgIC8vIFNpemUgb2YgTkFMVSBsZW5ndGggaW4gbWt2L21wNAotICAgIGtLZXlOYWxMZW5ndGhTaXplICAgICA9ICduYWxzJywgLy8gaW50MzJfdAotCi0gICAgLy8gSERSIHJlbGF0ZWQKLSAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbwotCi0gICAgLy8gY29sb3IgYXNwZWN0cwotICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKLSAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKLSAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgotICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KLSAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKLSAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKLQotICAgIGtLZXlUaWxlV2lkdGggICAgICAgID0gJ3RpbFcnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgd2lkdGgKLSAgICBrS2V5VGlsZUhlaWdodCAgICAgICA9ICd0aWxIJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIGhlaWdodAotICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cwotICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucwotICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByb2ZpbGUgZGF0YQotICAgIGtLZXlJc1ByaW1hcnlJbWFnZSAgID0gJ3ByaW0nLCAvLyBib29sIChpbnQzMl90KSwgaW1hZ2UgdHJhY2sgaXMgdGhlIHByaW1hcnkgaW1hZ2UKLSAgICBrS2V5RnJhbWVDb3VudCAgICAgICA9ICduZnJtJywgLy8gaW50MzJfdCwgdG90YWwgbnVtYmVyIG9mIGZyYW1lIGluIHZpZGVvIHRyYWNrCi0gICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKLSAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKLSAgICBrS2V5SXNFeGlmICAgICAgICAgICA9ICdleGlmJywgLy8gYm9vbCAoaW50MzJfdCkgYnVmZmVyIGNvbnRhaW5zIGV4aWYgZGF0YSBibG9jawotCi0gICAga0tleVBjbUJpZ0VuZGlhbiAgICAgPSAncGNtYicsIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBLZXkgZm9yIEFMQUMgTWFnaWMgQ29va2llCi0gICAga0tleUFsYWNNYWdpY0Nvb2tpZSAgPSAnYWxtYycsIC8vIHJhdyBkYXRhCi19OwotCi1lbnVtIHsKLSAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAotICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCi0gICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKLSAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAotfTsKLQotZW51bSB7Ci0gICAga0NyeXB0b01vZGVVbmVuY3J5cHRlZCA9IDAsCi0gICAga0NyeXB0b01vZGVBZXNDdHIgICAgICA9IDEsCi0gICAga0NyeXB0b01vZGVBZXNDYmMgICAgICA9IDIsCi19OwotCi1jbGFzcyBQYXJjZWw7Ci0KLWNsYXNzIE1ldGFEYXRhQmFzZSB7Ci1wdWJsaWM6Ci0gICAgTWV0YURhdGFCYXNlKCk7Ci0gICAgTWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSk7Ci0gICAgTWV0YURhdGFCYXNlJiBvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJik7Ci0KLSAgICB2aXJ0dWFsIH5NZXRhRGF0YUJhc2UoKTsKLQotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCi0gICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCi0gICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCi0gICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCi0gICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCi0gICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCi0gICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCi0gICAgfTsKLQotICAgIHZvaWQgY2xlYXIoKTsKLSAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOwotCi0gICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOwotICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKLSAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKLSAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7Ci0KLSAgICBib29sIHNldFJlY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAotICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwotCi0gICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0OwotCi0gICAgYm9vbCBmaW5kUmVjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKLSAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OwotCi0gICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7Ci0KLSAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKLQotICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKLSAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yOwotICAgIGZyaWVuZCBjbGFzcyBNZXRhRGF0YTsKLQotICAgIHN0cnVjdCB0eXBlZF9kYXRhOwotICAgIHN0cnVjdCBSZWN0OwotICAgIHN0cnVjdCBNZXRhRGF0YUludGVybmFsOwotICAgIE1ldGFEYXRhSW50ZXJuYWwgKm1JbnRlcm5hbERhdGE7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7Ci0gICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCAwYTM0MmI4Li4xNWVhNTc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtMSwyMCArMSwxNyBAQAotLy8gVE9ETzogY2hhbmdlIGl0IGJhY2sgdG8gY2NfbGlicmFyeV9zaGFyZWQgd2hlbiB0aGVyZSBpcyBhIHdheSB0bwotLy8gZXhwb3NlIG1lZGlhIG1ldHJpY3MgYXMgc3RhYmxlIEFQSS4KLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW1ldHJpY3MiLAogCiAgICAgc3JjczogWwogICAgICAgICAiSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAiLAogICAgICAgICAiTWVkaWFBbmFseXRpY3NJdGVtLmNwcCIsCisgICAgICAgICJNZWRpYU1ldHJpY3MuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCkBAIC0zMiw0ICsyOSwxNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIC8vIGVudW1lcmF0ZSBzdGFibGUgZW50cnkgcG9pbnRzLCBmb3IgYXBleCB1c2UKKyAgICBzdHViczogeworICAgICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbWV0cmljcy5tYXAudHh0IiwKKyAgICAgICAgdmVyc2lvbnM6IFsKKyAgICAgICAgICAgICIxIiAsCisgICAgICAgIF0KKyAgICB9LAogfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCAyOGE3NzQ2Li45MTE0OTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFBbmFseXRpY3NTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAKICAgICAgICAgICAgIGJvb2wgZm9yY2VuZXc7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtOworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoKTsKIAogICAgICAgICAgICAgZGF0YS5yZWFkQm9vbCgmZm9yY2VuZXcpOwogICAgICAgICAgICAgaXRlbS0+cmVhZEZyb21QYXJjZWwoZGF0YSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCmluZGV4IDEzNWM5YjYuLjAyYzIzYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCkBAIC01Miw2ICs1MiwxNyBAQAogY29uc3QgY2hhciAqIGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbTo6RW5hYmxlZFByb3BlcnR5UGVyc2lzdCAgPSAicGVyc2lzdC5tZWRpYS5tZXRyaWNzLmVuYWJsZWQiOwogY29uc3QgaW50IE1lZGlhQW5hbHl0aWNzSXRlbTo6RW5hYmxlZFByb3BlcnR5X2RlZmF1bHQgID0gMTsKIAorLy8gU28gY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBrbm93IHNpemUgb2YgYWxsb2NhdGVkIHNwYWNlCitNZWRpYUFuYWx5dGljc0l0ZW0gKk1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCkKK3sKKyAgICByZXR1cm4gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleU5vbmUpOworfQorCitNZWRpYUFuYWx5dGljc0l0ZW0gKk1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKE1lZGlhQW5hbHl0aWNzSXRlbTo6S2V5IGtleSkKK3sKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtleSk7CisgICAgcmV0dXJuIGl0ZW07Cit9CiAKIC8vIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcwogTWVkaWFBbmFseXRpY3NJdGVtOjpNZWRpYUFuYWx5dGljc0l0ZW0oKQpAQCAtNDc4LDcgKzQ4OSw3IEBACiAvLyBjYWxsZXIgcmVzcG9uc2libGUgZm9yIHRoZSByZXR1cm5lZCBzdHJpbmcKIGJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRDU3RyaW5nKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBjaGFyICoqdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gZmluZFByb3AobmFtZSk7Ci0gICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZURvdWJsZSkgeworICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVDU3RyaW5nKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKQEAgLTQ4Nyw2ICs0OTgsMTggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFN0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgc3RkOjpzdHJpbmcgKnZhbHVlKSB7CisgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOworICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVDU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gc3RkOjpzdHJpbmcgbWFrZXMgYSBjb3B5IGZvciB1cworICAgICAgICAqdmFsdWUgPSBwcm9wLT51LkNTdHJpbmdWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIC8vIHJlbW92ZSBpbmRpY2F0ZWQga2V5cyBhbmQgdGhlaXIgdmFsdWVzCiAvLyByZXR1cm4gdmFsdWUgaXMgIyBrZXlzIHJlbW92ZWQKIGludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpmaWx0ZXIoaW50IG4sIE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBhdHRyc1tdKSB7CkBAIC02MzAsNiArNjUzLDE5IEBACiAvLwogCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhKSB7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwwKGRhdGEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBNZWRpYUFuYWx5dGljc0l0ZW0gUGFyY2VsIHZlcnNpb246ICVkIiwgdmVyc2lvbik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OnJlYWRGcm9tUGFyY2VsMChjb25zdCBQYXJjZWwmIGRhdGEpIHsKICAgICAvLyBpbnRvICd0aGlzJyBvYmplY3QKICAgICAvLyAuLiB3ZSBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nIHRvIHB1dCBhd2F5LgogICAgIG1LZXkgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CkBAIC02NzksOCArNzE1LDIzIEBACiB9CiAKIGludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqZGF0YSkgeworCiAgICAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIC0xOwogCisgICAgaW50MzJfdCB2ZXJzaW9uID0gMDsKKyAgICBkYXRhLT53cml0ZUludDMyKHZlcnNpb24pOworCisgICAgc3dpdGNoKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHJldHVybiB3cml0ZVRvUGFyY2VsMChkYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgTWVkaWFBbmFseXRpY3NJdGVtIFBhcmNlbCB2ZXJzaW9uOiAlZCIsIHZlcnNpb24pOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjp3cml0ZVRvUGFyY2VsMChQYXJjZWwgKmRhdGEpIHsKIAogICAgIGRhdGEtPndyaXRlQ1N0cmluZyhtS2V5LmNfc3RyKCkpOwogICAgIGRhdGEtPndyaXRlSW50MzIobVBpZCk7CkBAIC03MjUsNiArNzc2LDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2NvbnN0IGNoYXIgKk1lZGlhQW5hbHl0aWNzSXRlbTo6dG9DU3RyaW5nKCkgeworICAgcmV0dXJuIHRvQ1N0cmluZyhQUk9UT19MQVNUKTsKK30KKworY29uc3QgY2hhciAqIE1lZGlhQW5hbHl0aWNzSXRlbTo6dG9DU3RyaW5nKGludCB2ZXJzaW9uKSB7CisgICAgc3RkOjpzdHJpbmcgdmFsID0gdG9TdHJpbmcodmVyc2lvbik7CisgICAgcmV0dXJuIHN0cmR1cCh2YWwuY19zdHIoKSk7Cit9CiAKIHN0ZDo6c3RyaW5nIE1lZGlhQW5hbHl0aWNzSXRlbTo6dG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdG9TdHJpbmcoUFJPVE9fTEFTVCk7CkBAIC04NTUsOCArOTE0LDYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBzdGQ6OnN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKLSAgICAgICAgQUxPR1coIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KQEAgLTEwMTQsNSArMTA3MSwxNzAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gYSBieXRlIGFycmF5OyBjb250ZW50cyBhcmUKKy8vIG92ZXJhbGwgbGVuZ3RoICh1aW50MzIpIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZgorLy8gZW5jb2RpbmcgdmVyc2lvbiAodWludDMyKQorLy8gY291bnQgb2YgcHJvcGVydGllcyAodWludDMyKQorLy8gTiBjb3BpZXMgb2Y6CisvLyAgICAgcHJvcGVydHkgbmFtZSBhcyBsZW5ndGgoaW50MTYpLCBieXRlcworLy8gICAgICAgICB0aGUgYnl0ZXMgV0lMTCBpbmNsdWRlIHRoZSBudWxsIHRlcm1pbmF0b3Igb2YgdGhlIG5hbWUKKy8vICAgICB0eXBlICh1aW50OCAtLSAxIGJ5dGUpCisvLyAgICAgc2l6ZSBvZiB2YWx1ZSBmaWVsZCAoaW50MTYgLS0gMiBieXRlcykKKy8vICAgICB2YWx1ZSAoc2l6ZSBiYXNlZCBvbiB0eXBlKQorLy8gICAgICAgaW50MzIsIGludDY0LCBkb3VibGUgLS0gbGl0dGxlIGVuZGlhbiA0LzgvOCBieXRlcyByZXNwZWN0aXZlbHkKKy8vICAgICAgIGNzdHJpbmcgLS0gTiBieXRlcyBvZiB2YWx1ZSBbV0lUSCB0ZXJtaW5hdG9yXQorCitlbnVtIHsga0ludDMyID0gMCwga0ludDY0LCBrRG91YmxlLCBrUmF0ZSwga0NTdHJpbmd9OworCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6ZHVtcEF0dHJpYnV0ZXMoY2hhciAqKnBidWZmZXIsIHNpemVfdCAqcGxlbmd0aCkgeworCisgICAgY2hhciAqYnVpbGQgPSBOVUxMOworCisgICAgaWYgKHBidWZmZXIgPT0gTlVMTCB8fCBwbGVuZ3RoID09IE5VTEwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIGNvbnNpc3RlbmN5IGZvciB0aGUgY2FsbGVyLCB3aG8gb3ducyB3aGF0ZXZlciBjb21lcyBiYWNrIGluIHRoaXMgcG9pbnRlci4KKyAgICAqcGJ1ZmZlciA9IE5VTEw7CisKKyAgICAvLyBmaXJzdCwgbGV0J3MgY2FsY3VsYXRlIHNpemVzCisgICAgaW50MzJfdCBnb2FsID0gMDsKKyAgICBpbnQzMl90IHZlcnNpb24gPSAwOworCisgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOyAgIC8vIG92ZXJhbGwgbGVuZ3RoLCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZAorICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyBlbmNvZGluZyB2ZXJzaW9uCisgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOyAgIC8vICMgcHJvcGVydGllcworCisgICAgaW50MzJfdCBjb3VudCA9IG1Qcm9wQ291bnQ7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQ7IGkrKyApIHsKKyAgICAgICAgUHJvcCAqcHJvcCA9ICZtUHJvcHNbaV07CisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQxNl90KTsgICAgICAgICAgIC8vIG5hbWUgbGVuZ3RoCisgICAgICAgIGdvYWwgKz0gc3RybGVuKHByb3AtPm1OYW1lKSArIDE7ICAgIC8vIHN0cmluZyArIG51bGwKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDhfdCk7ICAgICAgICAgICAgLy8gdHlwZQorICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgICAgICAvLyBzaXplIG9mIHZhbHVlCisgICAgICAgIHN3aXRjaCAocHJvcC0+bVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlUmF0ZToKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVDU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggKyBhY3R1YWwgc3RyaW5nICsgbnVsbAorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHN0cmxlbihwcm9wLT51LkNTdHJpbmdWYWx1ZSkgKyAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmb3VuZCBiYWQgUHJvcCB0eXBlOiAlZCwgaWR4ICVkLCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+bVR5cGUsIGksIHByb3AtPm1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBhIHNpemUuLi4gbGV0J3MgYWxsb2NhdGUgYW5kIGZpbGwKKyAgICBidWlsZCA9IChjaGFyICopbWFsbG9jKGdvYWwpOworICAgIGlmIChidWlsZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtZW1zZXQoYnVpbGQsIDAsIGdvYWwpOworCisgICAgY2hhciAqZmlsbGluZyA9IGJ1aWxkOworCisjZGVmaW5lIF9JTlNFUlQodmFsLCBzaXplKSBcCisgICAgeyBtZW1jcHkoZmlsbGluZywgJih2YWwpLCAoc2l6ZSkpOyBmaWxsaW5nICs9IChzaXplKTt9CisjZGVmaW5lIF9JTlNFUlRTVFJJTkcodmFsLCBzaXplKSBcCisgICAgeyBtZW1jcHkoZmlsbGluZywgKHZhbCksIChzaXplKSk7IGZpbGxpbmcgKz0gKHNpemUpO30KKworICAgIF9JTlNFUlQoZ29hbCwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICBfSU5TRVJUKHZlcnNpb24sIHNpemVvZihpbnQzMl90KSk7CisgICAgX0lOU0VSVChjb3VudCwgc2l6ZW9mKGludDMyX3QpKTsKKworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50OyBpKysgKSB7CisgICAgICAgIFByb3AgKnByb3AgPSAmbVByb3BzW2ldOworICAgICAgICBpbnQxNl90IGF0dHJOYW1lTGVuID0gc3RybGVuKHByb3AtPm1OYW1lKSArIDE7CisgICAgICAgIF9JTlNFUlQoYXR0ck5hbWVMZW4sIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIF9JTlNFUlRTVFJJTkcocHJvcC0+bU5hbWUsIGF0dHJOYW1lTGVuKTsgICAgLy8gdGVybWluYXRpb24gaW5jbHVkZWQKKyAgICAgICAgaW50OF90IGVsZW10eXBlOworICAgICAgICBpbnQxNl90IGVsZW1zaXplOworICAgICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVsZW10eXBlID0ga0ludDMyOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW1zaXplLCBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQocHJvcC0+dS5pbnQzMlZhbHVlLCBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVsZW10eXBlID0ga0ludDY0OworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW1zaXplLCBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQocHJvcC0+dS5pbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtEb3VibGU7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXR5cGUsIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXNpemUgPSBzaXplb2YoZG91YmxlKTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuZG91YmxlVmFsdWUsIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlUmF0ZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVsZW10eXBlID0ga1JhdGU7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXR5cGUsIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXNpemUgPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUucmF0ZS5jb3VudCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQocHJvcC0+dS5yYXRlLmR1cmF0aW9uLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVsZW10eXBlID0ga0NTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXR5cGUsIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXNpemUgPSBzdHJsZW4ocHJvcC0+dS5DU3RyaW5nVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUU1RSSU5HKHByb3AtPnUuQ1N0cmluZ1ZhbHVlLCBlbGVtc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGlmIGNhbid0IGVuY29kZTsgd2FybmluZyBpZiBjYW4ndCBkZWNvZGUKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZvdW5kIGJhZCBQcm9wIHR5cGU6ICVkLCBpZHggJWQsIG5hbWUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5tVHlwZSwgaSwgcHJvcC0+bU5hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZG5lc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnVpbGQgKyBnb2FsICE9IGZpbGxpbmcpIHsKKyAgICAgICAgQUxPR0UoInByb2JsZW1zIHBvcHVsYXRpbmc7IHdyb3RlPSVkIHBsYW5uZWQ9JWQiLAorICAgICAgICAgICAgICAoaW50KShmaWxsaW5nLWJ1aWxkKSwgZ29hbCk7CisgICAgICAgIGdvdG8gYmFkbmVzczsKKyAgICB9CisKKyAgICAqcGJ1ZmZlciA9IGJ1aWxkOworICAgICpwbGVuZ3RoID0gZ29hbDsKKworICAgIHJldHVybiB0cnVlOworCisgIGJhZG5lc3M6CisgICAgZnJlZShidWlsZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwOTE5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYU1ldHJpY3MiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisKKy8vCisvLyBwcm92aWRlIGEgQy1pc2ggaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWVyIHRvIHN0YWJpbGl6ZSB0aGFuIHRoZSBleGlzdGluZyBDKysKKy8vIGludGVyZmFjZQorLy8KKy8vIEFMTCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgY2hhciAqIGdpdmUgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCisvLyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNhbGwgZnJlZSgpIG9uIHRoYXQgcG9pbnRlci4KKy8vCisKKy8vIG1hbmFnZSB0aGUgb3ZlcmFsbCByZWNvcmQKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtleSk7CisgICAgcmV0dXJuIChtZWRpYW1ldHJpY3NfaGFuZGxlX3QpIGl0ZW07Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2RlbGV0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuOworICAgIGRlbGV0ZSBpdGVtOworfQorCittZWRpYW1ldHJpY3NrZXlfdCBtZWRpYW1ldHJpY3NfZ2V0S2V5KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gc3RyZHVwKGl0ZW0tPmdldEtleSgpLmNfc3RyKCkpOworfQorCisvLyBudXBsYXllciwgZXQgYWwgdXNlIGl0IHdoZW4gYWN0aW5nIGFzIHByb3hpZXMKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFVpZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCB1aWRfdCB1aWQpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRVaWQodWlkKTsKK30KKworLy8gc2V0IGF0dHJpYnV0ZXMKKy8vCisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDY0KGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0RG91YmxlKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24pOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRDU3RyaW5nKGF0dHIsIHZhbHVlKTsKK30KKworLy8gZnVzZWQgZ2V0L2FkZC9zZXQ7IGlmIGF0dHIgd2Fzbid0IHRoZXJlLCBpdCdzIGEgc2ltcGxlIHNldC4KKy8vCisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+YWRkSW50MzIoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDY0KGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkRG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+YWRkRG91YmxlKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkUmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+YWRkUmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24pOworfQorCisvLyBmaW5kICYgZXh0cmFjdCB2YWx1ZXMKKy8vIHJldHVybiBpbmRpY2F0ZXMgd2hldGhlciBhdHRyIGV4aXN0cyAoYW5kIHRodXMgd2hldGhlciB2YWx1ZSBmaWxsZWQgaW4pCisvLyBOVUxMIHBhcmFtZXRlciB2YWx1ZSBzdXBwcmVzc2VzIHN0b3JhZ2Ugb2YgdmFsdWUuCisvLworCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQzMihhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldEludDY0KGF0dHIsIHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0RG91YmxlKGF0dHIsIHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogY291bnQsIGludDY0X3QgKiBkdXJhdGlvbiwgZG91YmxlICpyYXRlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRSYXRlKGF0dHIsIGNvdW50LCBkdXJhdGlvbiwgcmF0ZSk7Cit9CisKKy8vIE5COiBjYWxsZXIgb3ducyB0aGUgc3RyaW5nIHRoYXQgY29tZXMgYmFjaywgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gaXRlbS0+Z2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIHRvIHJlbGVhc2Ugc3RyaW5ncyByZXR1cm5lZCB2aWEgZ2V0Q1N0cmluZygpCit2b2lkIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZyhjaGFyICp2YWx1ZSkgeworICAgIGZyZWUodmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPnNlbGZyZWNvcmQoKTsKK30KKworCitjb25zdCBjaGFyICptZWRpYW1ldHJpY3NfcmVhZGFibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiAiIjsKKyAgICByZXR1cm4gaXRlbS0+dG9DU3RyaW5nKCk7Cit9CisKK2ludDMyX3QgbWVkaWFtZXRyaWNzX2NvdW50KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICByZXR1cm4gaXRlbS0+Y291bnQoKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCkgeworICAgIC8vIHN0YXRpYywgc28gZG9lc24ndCBuZWVkIGFuIGluc3RhbmNlCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbTo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmR1bXBBdHRyaWJ1dGVzKGJ1ZmZlciwgbGVuZ3RoKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAppbmRleCAyNjNjZGU3Li40YTM2ZjZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaApAQCAtMTcsOSArMTcsMTAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogI2RlZmluZSBBTkRST0lEX01FRElBX01FRElBQU5BTFlUSUNTSVRFTV9ICiAKLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC04MSwxMiArODIsMTkgQEAKICAgICAgICAgICAgIFBST1RPX0xBU1QgPSBQUk9UT19WMSwKICAgICAgICAgfTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIHVzZSB0aGUgOjpjcmVhdGUoKSBtZXRob2QgaW5zdGVhZAorICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKEtleSk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW0mKTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZvcGVyYXRvcj0oY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtJik7CiAKICAgICBwdWJsaWM6CiAKKyAgICAgICAgc3RhdGljIE1lZGlhQW5hbHl0aWNzSXRlbSogY3JlYXRlKEtleSBrZXkpOworICAgICAgICBzdGF0aWMgTWVkaWFBbmFseXRpY3NJdGVtKiBjcmVhdGUoKTsKKwogICAgICAgICAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKCk7Ci0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOwogICAgICAgICB+TWVkaWFBbmFseXRpY3NJdGVtKCk7CiAKICAgICAgICAgLy8gU2Vzc2lvbklEIHRpZXMgbXVsdGlwbGUgc3VibWlzc2lvbnMgZm9yIHNhbWUga2V5IHRvZ2V0aGVyCkBAIC0xMzQsNiArMTQyLDcgQEAKICAgICAgICAgYm9vbCBnZXRSYXRlKEF0dHIsIGludDY0X3QgKmNvdW50LCBpbnQ2NF90ICpkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKICAgICAgICAgLy8gQ2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHN0cmluZwogICAgICAgICBib29sIGdldENTdHJpbmcoQXR0ciwgY2hhciAqKnZhbHVlKTsKKyAgICAgICAgYm9vbCBnZXRTdHJpbmcoQXR0ciwgc3RkOjpzdHJpbmcgKnZhbHVlKTsKIAogICAgICAgICAvLyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2xvc2UgYW55IGV4aXN0aW5nIG9wZW4KICAgICAgICAgLy8gcmVjb3JkIHdpdGggc2FtZSBrZXkgYmVmb3JlIGVzdGFibGlzaGluZyBhIG5ldyByZWNvcmQKQEAgLTE3NCwxMiArMTgzLDIyIEBACiAgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKik7CiAgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJik7CiAKKyAgICAgICAgLy8gc3VwcG9ydHMgdGhlIHN0YWJsZSBpbnRlcmZhY2UKKyAgICAgICAgYm9vbCBkdW1wQXR0cmlidXRlcyhjaGFyICoqcGJ1ZmZlciwgc2l6ZV90ICpwbGVuZ3RoKTsKKwogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CisgICAgICAgIGNvbnN0IGNoYXIgKnRvQ1N0cmluZygpOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoaW50IHZlcnNpb24pOwogCiAgICAgICAgIC8vIGFyZSB3ZSBjb2xsZWN0aW5nIGFuYWx5dGljcyBkYXRhCiAgICAgICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gaGFuZGxlIFBhcmNlbCB2ZXJzaW9uIDAKKyAgICAgICAgaW50MzJfdCB3cml0ZVRvUGFyY2VsMChQYXJjZWwgKik7CisgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwwKGNvbnN0IFBhcmNlbCYpOworCiAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIC8vIG1lcmdlIGZpZWxkcyBmcm9tIGFyZyBpbnRvIHRoaXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlMWVkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQU1FVFJJQ1NfSAorCisvLworLy8gZGVmaW5lIGEgQyBpbnRlcmZhY2UgdG8gdGhlIG1lZGlhIG1ldHJpY3MgZnVuY3Rpb25hbGl0eQorLy8KKy8vIEFsbCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSBjaGFyICogb3IgY29uc3QgY2hhciAqIGFsc28gZ2l2ZSByZXNwb25zaWJpbGl0eQorLy8gZm9yIHRoYXQgc3RyaW5nIHRvIHRoZSBjYWxsZXIuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZnJlZSgpCisvLyBvbiB0aGF0IHBvaW50ZXIgd2hlbiBkb25lIHVzaW5nIHRoZSB2YWx1ZS4KKworX19CRUdJTl9ERUNMUworCisvLyBpbnRlcm5hbGx5IHJlLWNhc3QgdG8gdGhlIGJlaGluZC10aGUtc2NlbmVzIEMrKyBjbGFzcyBpbnN0YW5jZQordHlwZWRlZiBpbnQ2NF90IG1lZGlhbWV0cmljc19oYW5kbGVfdDsKK3R5cGVkZWYgY29uc3QgY2hhciAqbWVkaWFtZXRyaWNza2V5X3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKmF0dHJfdDsKKworbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1lZGlhbWV0cmljc19jcmVhdGUobWVkaWFtZXRyaWNza2V5X3Qga2V5KTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2RlbGV0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworCisvLyBzZXQKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHZhbHVlKTsKKworLy8gZnVzZWQgZ2V0L2FkZC9zZXQ7IGlmIGF0dHIgd2Fzbid0IHRoZXJlLCBpdCdzIGEgc2ltcGxlIHNldC4KKy8vIHRoZXNlIGRvIG5vdCBwcm92aWRlIGF0b21pY2l0eSBvciBtdXR1YWwgZXhjbHVzaW9uLCBvbmx5IHNpbXBsZXIgY29kZSBzZXF1ZW5jZXMuCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkUmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7CisKKy8vIGZpbmQgJiBleHRyYWN0IHZhbHVlcworLy8gcmV0dXJuIGluZGljYXRlcyB3aGV0aGVyIGF0dHIgZXhpc3RzIChhbmQgdGh1cyB3aGV0aGVyIHZhbHVlIGZpbGxlZCBpbikKKy8vIE5VTEwgcGFyYW1ldGVyIHZhbHVlIHN1cHByZXNzZXMgc3RvcmFnZSBvZiB2YWx1ZS4KK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqIHZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiBjb3VudCwgaW50NjRfdCAqIGR1cmF0aW9uLCBkb3VibGUgKnJhdGUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpOworLy8gdG8gcmVsZWFzZSBzdHJpbmdzIHJldHVybmVkIHZpYSBnZXRDU3RyaW5nKCkKK3ZvaWQgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nKGNoYXIgKnZhbHVlKTsKKworLy8gIyBvZiBhdHRyaWJ1dGVzIHNldCB3aXRoaW4gdGhpcyByZWNvcmQuCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworY29uc3QgY2hhciAqbWVkaWFtZXRyaWNzX3JlYWRhYmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIHVpZF90IHVpZCk7Citib29sIG1lZGlhbWV0cmljc19pc0VuYWJsZWQoKTsKKworLy8gc2VyaWFsaXplZCBjb3B5IG9mIHRoZSBhdHRyaWJ1dGVzL3ZhbHVlcywgbW9zdGx5IGZvciB1cHN0cmVhbSBnZXRNZXRyaWNzKCkgY2FsbHMKKy8vIGNhbGxlciBvd25zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGFzIHBhcnQgb2YgdGhpcyBjYWxsLgorYm9vbCBtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2xpYm1lZGlhbWV0cmljcy5tYXAudHh0IGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2xpYm1lZGlhbWV0cmljcy5tYXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjI4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvbGlibWVkaWFtZXRyaWNzLm1hcC50eHQKQEAgLTAsMCArMSwyOSBAQAorTElCTUVESUFNRVRSSUNTXzEgeworICBnbG9iYWw6CisgICAgbWVkaWFtZXRyaWNzX2FkZERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkSW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfY291bnQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19jcmVhdGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19kZWxldGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXM7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0RG91YmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0SW50MzI7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRJbnQ2NDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEtleTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldFJhdGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19pc0VuYWJsZWQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19yZWFkYWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzI7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldFJhdGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRVaWQ7ICMgYXBleAorICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKaW5kZXggY2QyN2JkMS4uMDg1MTljZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTQsMTEgKzQsMTAgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIAotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJKQXVkaW9UcmFjay5jcHAiLAogICAgICAgICAiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwIiwKICAgICAgICAgIm1lZGlhcGxheWVyMi5jcHAiLAogICAgIF0sCkBAIC0xNywyNiArMTYsMjMgQEAKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtNDksMTEgKzQ1LDIxIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQyIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKQEAgLTc0LDMgKzgwLDQ5IEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWEyX2puaV9jb3JlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkphdmFWTUhlbHBlci5jcHAiLAorICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQU2VydmljZS5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfaGVhZGVycyIsCisgICAgICAgICJsaWJuYXRpdmVoZWxwZXJfaGVhZGVyX29ubHkiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcAppbmRleCBhYzBjYzU3Li5hMDFhZmEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKQEAgLTIxLDI3ICsyMSwyOCBAQAogI2luY2x1ZGUgIm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9BdWRpb0Vycm9ycy5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBUT0RPOiBTdG9yZSBKYXZhIGNsYXNzL21ldGhvZElEIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGluIHRoZSBjbGFzcy4KIC8vIFRPRE86IEFkZCBOVUxMICYmIEV4Y2VwdGlvbiBjaGVja3MgYWZ0ZXIgZXZlcnkgSk5JIGNhbGwuCiBKQXVkaW9UcmFjazo6SkF1ZGlvVHJhY2soICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8IFVzYWdlcyBvZiB0aGUgYXJndW1lbnRzIGFyZSBiZWxvdyA+Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgICAgICAgICAgICAgICAvLyBBdWRpb0F1ZGlvQXR0cmlidXRlcwogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBjYWxsYmFja190IGNiZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ZmbG9hZAogICAgICAgICB2b2lkKiB1c2VyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ZmbG9hZAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywgICAgICAgIC8vIEF1ZGlvQXR0cmlidXRlcworICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjaworICAgICAgICBjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMsICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9BdHRyaWJ1dGVzCiAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpIHsgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcwogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworCiAgICAgamNsYXNzIGpBdWRpb1RyYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayIpOwotICAgIG1BdWRpb1RyYWNrQ2xzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tDbHMpOworICAgIG1BdWRpb1RyYWNrQ2xzID0gcmVpbnRlcnByZXRfY2FzdDxqY2xhc3M+KGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrQ2xzKSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqQXVkaW9UcmFja0Nscyk7CiAKICAgICBtYXhSZXF1aXJlZFNwZWVkID0gc3RkOjptaW4oc3RkOjptYXgobWF4UmVxdWlyZWRTcGVlZCwgMS4wZiksIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCk7CiAKQEAgLTY0LDEwICs2NSwxOSBAQAogICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwogICAgIGpvYmplY3QgakJ1aWxkZXJPYmogPSBlbnYtPk5ld09iamVjdChqQnVpbGRlckNscywgakJ1aWxkZXJDdG9yKTsKIAotICAgIGptZXRob2RJRCBqU2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvQXR0cmlidXRlcyIsCi0gICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwotICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0QXVkaW9BdHRyaWJ1dGVzLAotICAgICAgICAgICAgSkF1ZGlvQXR0cmlidXRlczo6Y3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKGVudiwgcEF0dHJpYnV0ZXMsIHN0cmVhbVR5cGUpKTsKKyAgICB7CisgICAgICAgIHNwPEpPYmplY3RIb2xkZXI+IGF1ZGlvQXR0cmlidXRlc09iajsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgYXVkaW9BdHRyaWJ1dGVzT2JqID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpb0F0dHJpYnV0ZXNPYmogPSBuZXcgSk9iamVjdEhvbGRlcigKKyAgICAgICAgICAgICAgICAgICAgSkF1ZGlvQXR0cmlidXRlczo6Y3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKGVudiwgTlVMTCkpOworICAgICAgICB9CisgICAgICAgIGptZXRob2RJRCBqU2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvQXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosCisgICAgICAgICAgICAgICAgalNldEF1ZGlvQXR0cmlidXRlcywgYXVkaW9BdHRyaWJ1dGVzT2JqLT5nZXRKT2JqZWN0KCkpOworICAgIH0KIAogICAgIGptZXRob2RJRCBqU2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9Gb3JtYXQiLAogICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwpAQCAtOTIsNiArMTAyLDcgQEAKICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRTZXNzaW9uSWQsIHNlc3Npb25JZCk7CiAgICAgfQogCisgICAgbUZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKICAgICAgICAgam1ldGhvZElEIGpTZXRPZmZsb2FkZWRQbGF5YmFjayA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRPZmZsb2FkZWRQbGF5YmFjayIsCiAgICAgICAgICAgICAgICAgIihaKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKQEAgLTEwMCw3ICsxMTEsOSBAQAogICAgIH0KIAogICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrOyIpOwotICAgIG1BdWRpb1RyYWNrT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworICAgIGpvYmplY3QgakF1ZGlvVHJhY2tPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisgICAgbUF1ZGlvVHJhY2tPYmogPSByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrT2JqKSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqQnVpbGRlck9iaik7CiAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKICAgICAgICAgLy8gU2V0IG9mZmxvYWQgbW9kZSBjYWxsYmFjawpAQCAtMTE2LDE5ICsxMjksMjAgQEAKIH0KIAogSkF1ZGlvVHJhY2s6On5KQXVkaW9UcmFjaygpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUF1ZGlvVHJhY2tDbHMpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1BdWRpb1RyYWNrT2JqKTsKIH0KIAogc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZUNvdW50KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKICAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKIH0KIAogc2l6ZV90IEpBdWRpb1RyYWNrOjpjaGFubmVsQ291bnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0Q2hhbm5lbENvdW50ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldENoYW5uZWxDb3VudCIsICIoKUkiKTsKICAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Q2hhbm5lbENvdW50KTsKIH0KQEAgLTE0Myw3ICsxNTcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tIZWFkUG9zaXRpb24iLCAiKClJIik7CiAgICAgKnBvc2l0aW9uID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24pOwpAQCAtMTUxLDIxICsxNjUsMjEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWJvb2wgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CitzdGF0dXNfdCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgakF1ZGlvVGltZVN0YW1wQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXAiKTsKICAgICBqb2JqZWN0IGpBdWRpb1RpbWVTdGFtcE9iaiA9IGVudi0+QWxsb2NPYmplY3QoakF1ZGlvVGltZVN0YW1wQ2xzKTsKIAotICAgIGpmaWVsZElEIGpGcmFtZVBvc2l0aW9uID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgImZyYW1lUG9zaXRpb24iLCAiTCIpOwotICAgIGpmaWVsZElEIGpOYW5vVGltZSA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJuYW5vVGltZSIsICJMIik7CisgICAgamZpZWxkSUQgakZyYW1lUG9zaXRpb24gPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAiZnJhbWVQb3NpdGlvbiIsICJKIik7CisgICAgamZpZWxkSUQgak5hbm9UaW1lID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgIm5hbm9UaW1lIiwgIkoiKTsKIAogICAgIGptZXRob2RJRCBqR2V0VGltZXN0YW1wID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKLSAgICAgICAgICAgICJnZXRUaW1lc3RhbXAiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wKUIiKTsKKyAgICAgICAgICAgICJnZXRUaW1lc3RhbXAiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wOylaIik7CiAgICAgYm9vbCBzdWNjZXNzID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFRpbWVzdGFtcCwgakF1ZGlvVGltZVN0YW1wT2JqKTsKIAogICAgIGlmICghc3VjY2VzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIGxvbmcgbG9uZyBmcmFtZVBvc2l0aW9uID0gZW52LT5HZXRMb25nRmllbGQoakF1ZGlvVGltZVN0YW1wT2JqLCBqRnJhbWVQb3NpdGlvbik7CkBAIC0xNzgsNyArMTkyLDcgQEAKICAgICB0aW1lc3RhbXAubVRpbWUgPSB0czsKICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KSBmcmFtZVBvc2l0aW9uOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIHsKQEAgLTE4OSw3ICsyMDMsNyBAQAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CiAgICAgLy8gVE9ETzogZXhpc3RpbmcgbmF0aXZlIEF1ZGlvVHJhY2sgcmV0dXJucyBJTlZBTElEX09QRVJBVElPTiBvbiBvZmZsb2FkL2RpcmVjdC9mYXN0IHRyYWNrcy4KICAgICAvLyBTaG91bGQgd2UgZG8gdGhlIHNhbWUgdGhpbmc/Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgamNsYXNzIGpQbGF5YmFja1BhcmFtc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zIik7CiAgICAgam1ldGhvZElEIGpQbGF5YmFja1BhcmFtc0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpQbGF5YmFja1BhcmFtc0NscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTIyNCw3ICsyMzgsNyBAQAogfQogCiBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSBKQXVkaW9UcmFjazo6Z2V0UGxheWJhY2tSYXRlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tQYXJhbXMgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja1BhcmFtcyIsICIoKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOwpAQCAtMjY2LDcgKzI4MCw3IEBACiAgICAgICAgIHJldHVybiBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMoQkFEX1ZBTFVFKTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqbWV0aG9kSUQgakNyZWF0ZVZvbHVtZVNoYXBlciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJjcmVhdGVWb2x1bWVTaGFwZXIiLAogICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbjspTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyOyIpOwpAQCAtMjgyLDcgKzI5Niw3IEBACiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpTZXRBdXhFZmZlY3RTZW5kTGV2ZWwgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwiLCAiKEYpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRBdXhFZmZlY3RTZW5kTGV2ZWwsIGxldmVsKTsKQEAgLTI5MCwxNCArMzA0LDE0IEBACiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqQXR0YWNoQXV4RWZmZWN0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImF0dGFjaEF1eEVmZmVjdCIsICIoSSlJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakF0dGFjaEF1eEVmZmVjdCwgZWZmZWN0SWQpOwogICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICAvLyBUT0RPOiBKYXZhIHNldFN0ZXJlb1ZvbHVtZSBpcyBkZXByZWNhdGVkLiBEbyB3ZSByZWFsbHkgbmVlZCB0aGlzIG1ldGhvZD8KICAgICBqbWV0aG9kSUQgalNldFN0ZXJlb1ZvbHVtZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRTdGVyZW9Wb2x1bWUiLCAiKEZGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0U3RlcmVvVm9sdW1lLCBsZWZ0LCByaWdodCk7CkBAIC0zMDUsMTQgKzMxOSwxNCBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalNldFZvbHVtZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRWb2x1bWUiLCAiKEYpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRWb2x1bWUsIHZvbHVtZSk7CiAgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c3RhcnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqUGxheSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJwbGF5IiwgIigpViIpOwogICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCB0aGUgSmF2YSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZnJvbSBwbGF5KCk/CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBsYXkpOwpAQCAtMzI0LDcgKzMzOCw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGpieXRlQXJyYXkgakF1ZGlvRGF0YSA9IGVudi0+TmV3Qnl0ZUFycmF5KHNpemUpOwogICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGpBdWRpb0RhdGEsIDAsIHNpemUsIChqYnl0ZSAqKSBidWZmZXIpOwogCkBAIC0zNTMsNyArMzY3LDcgQEAKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6c3RvcCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpTdG9wID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInN0b3AiLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalN0b3ApOwogICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24/CkBAIC0zNjUsMjAgKzM3OSwyMCBAQAogfQogCiB2b2lkIEpBdWRpb1RyYWNrOjpmbHVzaCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpGbHVzaCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJmbHVzaCIsICIoKVYiKTsKICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqRmx1c2gpOwogfQogCiB2b2lkIEpBdWRpb1RyYWNrOjpwYXVzZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpQYXVzZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJwYXVzZSIsICIoKVYiKTsKICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGF1c2UpOwogICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24/CiB9CiAKIGJvb2wgSkF1ZGlvVHJhY2s6OmlzUGxheWluZygpIGNvbnN0IHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRQbGF5U3RhdGUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheVN0YXRlIiwgIigpSSIpOwogICAgIGludCBjdXJyZW50UGxheVN0YXRlID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0UGxheVN0YXRlKTsKIApAQCAtMzkzLDcgKzQwNyw3IEBACiB9CiAKIHVpbnQzMl90IEpBdWRpb1RyYWNrOjpnZXRTYW1wbGVSYXRlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFNhbXBsZVJhdGUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0U2FtcGxlUmF0ZSIsICIoKUkiKTsKICAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0U2FtcGxlUmF0ZSk7CiB9CkBAIC00MDMsNyArNDE3LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CiAgICAgaW50IGJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7CkBAIC00MTcsMTIgKzQzMSwyNiBAQAogfQogCiBhdWRpb19mb3JtYXRfdCBKQXVkaW9UcmFjazo6Zm9ybWF0KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvRm9ybWF0IiwgIigpSSIpOwogICAgIGludCBqYXZhRm9ybWF0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9Gb3JtYXQpOwogICAgIHJldHVybiBhdWRpb0Zvcm1hdFRvTmF0aXZlKGphdmFGb3JtYXQpOwogfQogCitzaXplX3QgSkF1ZGlvVHJhY2s6OmZyYW1lU2l6ZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRGb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgImdldEZvcm1hdCIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0OyIpOworICAgIGpvYmplY3QgakF1ZGlvRm9ybWF0T2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Rm9ybWF0KTsKKworICAgIGpjbGFzcyBqQXVkaW9Gb3JtYXRDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCIpOworICAgIGptZXRob2RJRCBqR2V0RnJhbWVTaXplSW5CeXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqQXVkaW9Gb3JtYXRDbHMsICJnZXRGcmFtZVNpemVJbkJ5dGVzIiwgIigpSSIpOworICAgIGppbnQgamF2YUZyYW1lU2l6ZUluQnl0ZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvRm9ybWF0T2JqLCBqR2V0RnJhbWVTaXplSW5CeXRlcyk7CisKKyAgICByZXR1cm4gKHNpemVfdClqYXZhRnJhbWVTaXplSW5CeXRlczsKK30KKwogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAogewogICAgIFN0cmluZzggcmVzdWx0OwpAQCAtNDMyLDEwICs0NjAsNiBAQAogICAgIC8vIFRPRE86IFJlbW92ZSBsb2dzIHRoYXQgaW5jbHVkZXMgdW5hdmFpbGFibGUgaW5mb3JtYXRpb24gZnJvbSBiZWxvdy4KIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKIC8vICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOwotLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSlcbiIsCiAvLyAgICAgICAgICAgICAgICAgIGZvcm1hdCgpLCBtQ2hhbm5lbE1hc2ssIGNoYW5uZWxDb3VudCgpKTsKIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc2FtcGxlIHJhdGUoJXUpLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgldSksIHNwZWVkKCVmKVxuIiwKQEAgLTQ1MywzOCArNDc3LDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRSb3V0ZWREZXZpY2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Um91dGVkRGV2aWNlIiwKICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzsiKTsKLSAgICBqb2JqZWN0IGpBdWRpb0RldmljZUluZm9PYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwotICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChqQXVkaW9EZXZpY2VJbmZvT2JqLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0KLSAgICBqY2xhc3MgakF1ZGlvRGV2aWNlSW5mb0NscyA9IGVudi0+RmluZENsYXNzKCJMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm8iKTsKLSAgICBqbWV0aG9kSUQgakdldElkID0gZW52LT5HZXRNZXRob2RJRChqQXVkaW9EZXZpY2VJbmZvQ2xzLCAiZ2V0SWQiLCAiKClJIik7Ci0gICAgamludCByb3V0ZWREZXZpY2VJZCA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9EZXZpY2VJbmZvT2JqLCBqR2V0SWQpOwotICAgIHJldHVybiByb3V0ZWREZXZpY2VJZDsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK2ludDMyX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEF1ZGlvU2Vzc2lvbklkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvU2Vzc2lvbklkIiwgIigpSSIpOwogICAgIGppbnQgc2Vzc2lvbklkID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9TZXNzaW9uSWQpOwotICAgIHJldHVybiAoYXVkaW9fc2Vzc2lvbl90KSBzZXNzaW9uSWQ7CisgICAgcmV0dXJuIHNlc3Npb25JZDsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGpNUDJJbXBsQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCIpOwotICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCAic2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrO0kpWiIpOwotICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCi0gICAgICAgICAgICBqTVAySW1wbENscywgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCwgbUF1ZGlvVHJhY2tPYmosIGRldmljZUlkKTsKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpTZXRQcmVmZXJyZWREZXZpY2VJZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRQcmVmZXJyZWREZXZpY2UiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87KVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0UHJlZmVycmVkRGV2aWNlSWQsIGRldmljZSk7CiAgICAgcmV0dXJuIHJlc3VsdCA9PSB0cnVlID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CiB9CiAKK2F1ZGlvX3N0cmVhbV90eXBlX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU3RyZWFtVHlwZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9BdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczsiKTsKKyAgICBqb2JqZWN0IGpBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0F0dHJpYnV0ZXMpOworICAgIGpjbGFzcyBqQXVkaW9BdHRyaWJ1dGVzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzIik7CisgICAgam1ldGhvZElEIGpHZXRWb2x1bWVDb250cm9sU3RyZWFtID0gZW52LT5HZXRNZXRob2RJRChqQXVkaW9BdHRyaWJ1dGVzQ2xzLAorICAgICAgICAgICAgImdldFZvbHVtZUNvbnRyb2xTdHJlYW0iLCAiKClJIik7CisgICAgaW50IGphdmFBdWRpb1N0cmVhbVR5cGUgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvQXR0cmlidXRlcywgakdldFZvbHVtZUNvbnRyb2xTdHJlYW0pOworICAgIHJldHVybiAoYXVkaW9fc3RyZWFtX3R5cGVfdClqYXZhQXVkaW9TdHJlYW1UeXBlOworfQorCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6cGVuZGluZ0R1cmF0aW9uKGludDMyX3QgKm1zZWMpIHsKICAgICBpZiAobXNlYyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC01MjYsMTggKzU1Miw4NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KK3N0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIsIGpvYmplY3QgaGFuZGxlcikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjtMYW5kcm9pZC9vcy9IYW5kbGVyOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciwgbGlzdGVuZXIsIGhhbmRsZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KK3N0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpSZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgInJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyLCBsaXN0ZW5lcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEpBdWRpb1RyYWNrOjpyZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj46Oml0ZXJhdG9yIGl0ID0gcm91dGluZ0RlbGVnYXRlcy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gcm91dGluZ0RlbGVnYXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGl0LT5zZWNvbmQsIGdldEhhbmRsZXIoaXQtPnNlY29uZCkpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vICAgICAgICAgICAgICAgIFN0YXRpYyBtZXRob2RzIGJlZ2luICAgICAgICAgICAgICAgICAgIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChqUm91dGluZ0RlbGVnYXRlQ2xzLAorICAgICAgICAgICAgImdldExpc3RlbmVyIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldExpc3RlbmVyKTsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgalJvdXRpbmdEZWxlZ2F0ZUNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1JvdXRpbmdEZWxlZ2F0ZSIpOworICAgIGptZXRob2RJRCBqR2V0SGFuZGxlciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgImdldEhhbmRsZXIiLCAiKClMYW5kcm9pZC9vcy9IYW5kbGVyOyIpOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2Qocm91dGluZ0RlbGVnYXRlT2JqLCBqR2V0SGFuZGxlcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmFkZEdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihvYmopKTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYob2JqKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QsIGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEpBdWRpb1RyYWNrOjplcmFzZUJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj46Oml0ZXJhdG9yIGl0ID0gbXAuYmVnaW4oKTsgaXQgIT0gbXAuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGl0LT5maXJzdCwga2V5KSkgeworICAgICAgICAgICAgbXAuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLy8gICAgICAgICAgICAgICAgUHJpdmF0ZSBtZXRob2QgYmVnaW5zICAgICAgICAgICAgICAgICAgLy8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01NTAsNyArNjQzLDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgLy8gUmVmZXJlbmNlZCAiYW5kcm9pZF9tZWRpYV9Wb2x1bWVTaGFwZXIuaCIuCiAgICAgamZsb2F0QXJyYXkgeGFycmF5ID0gbnVsbHB0cjsKQEAgLTU5NSw3ICs2ODgsNyBAQAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlVm9sdW1lU2hhcGVyT3BlcmF0aW9uT2JqKAogICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlciIpOwogICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNjQ3LDE1ICs3NDAsMTUgQEAKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYWxsYmFja190IGNiZiwgdm9pZCogdXNlcikgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsJFN0cmVhbUV2ZW50Q2FsbGJhY2siKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpDYWxsYmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMiRTdHJlYW1FdmVudENhbGxiYWNrIik7CiAgICAgam1ldGhvZElEIGpDYWxsYmFja0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpDYWxsYmFja0NscywgIjxpbml0PiIsICIoSkpKKVYiKTsKICAgICBqb2JqZWN0IGpDYWxsYmFja09iaiA9IGVudi0+TmV3T2JqZWN0KGpDYWxsYmFja0NscywgakNhbGxiYWNrQ3RvciwgdGhpcywgY2JmLCB1c2VyKTsKICAgICByZXR1cm4gakNhbGxiYWNrT2JqOwogfQogCiBqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqY2xhc3MgakV4ZWN1dG9yc0NscyA9IGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMiKTsKICAgICBqbWV0aG9kSUQgak5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRXhlY3V0b3JzQ2xzLAogICAgICAgICAgICAgIm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yIiwgIigpTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZTsiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiYWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvc2NvcGVkX2xvY2FsX3JlZi5oPgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0J1ZmZlclNpemUgPSAzMjc2ODsKKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcygKKyAgICAgICAgICAgIGVudiwgZW52LT5HZXRPYmplY3RDbGFzcyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopKTsKKyAgICBDSEVDSyhtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpICE9IE5VTEwpOworCisgICAgbUNvbm5lY3RNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJjb25uZWN0IiwKKyAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKKyAgICBDSEVDSyhtQ29ubmVjdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1EaXNjb25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZGlzY29ubmVjdCIsCisgICAgICAgICAgICAiKClWIik7CisgICAgQ0hFQ0sobURpc2Nvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtUmVhZEF0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAicmVhZEF0IiwKKyAgICAgICAgICAgICIoSltCSSlJIik7CisgICAgQ0hFQ0sobVJlYWRBdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1HZXRTaXplTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0U2l6ZSIsCisgICAgICAgICAgICAiKClKIik7CisgICAgQ0hFQ0sobUdldFNpemVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0TUlNRVR5cGVNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJnZXRNSU1FVHlwZSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0TUlNRVR5cGVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0VXJpTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0VXJpIiwKKyAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIENIRUNLKG1HZXRVcmlNZXRob2QgIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiB0bXAoCisgICAgICAgIGVudiwgZW52LT5OZXdCeXRlQXJyYXkoa0J1ZmZlclNpemUpKTsKKyAgICBtQnl0ZUFycmF5T2JqID0gKGpieXRlQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYodG1wLmdldCgpKTsKKyAgICBDSEVDSyhtQnl0ZUFycmF5T2JqICE9IE5VTEwpOworfQorCitKTWVkaWEySFRUUENvbm5lY3Rpb246On5KTWVkaWEySFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUJ5dGVBcnJheU9iaik7Cit9CisKK2Jvb2wgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgU3RyaW5nOCB0bXAoIiIpOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT5rZXlBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIjogIikpOworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nOCgiXHJcbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworICAgIGpzdHJpbmcgamhlYWRlcnMgPSBlbnYtPk5ld1N0cmluZ1VURih0bXAuc3RyaW5nKCkpOworCisgICAgamJvb2xlYW4gcmV0ID0KKyAgICAgICAgZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1Db25uZWN0TWV0aG9kLCBqdXJpLCBqaGVhZGVycyk7CisKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamhlYWRlcnMpOworCisgICAgcmV0dXJuIChib29sKXJldDsKK30KKwordm9pZCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtRGlzY29ubmVjdE1ldGhvZCk7Cit9CisKK3NzaXplX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworCisgICAgaWYgKHNpemUgPiBrQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplID0ga0J1ZmZlclNpemU7CisgICAgfQorCisgICAgamludCBuID0gZW52LT5DYWxsSW50TWV0aG9kKAorICAgICAgICAgICAgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtUmVhZEF0TWV0aG9kLCAoamxvbmcpb2Zmc2V0LCBtQnl0ZUFycmF5T2JqLCAoamludClzaXplKTsKKworICAgIGlmIChuID4gMCkgeworICAgICAgICBlbnYtPkdldEJ5dGVBcnJheVJlZ2lvbigKKyAgICAgICAgICAgICAgICBtQnl0ZUFycmF5T2JqLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAoamJ5dGUgKilkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworb2ZmNjRfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldFNpemUoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIHJldHVybiAob2ZmNjRfdCkoZW52LT5DYWxsTG9uZ01ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRTaXplTWV0aG9kKSk7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqbWltZSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRNSU1FVHlwZU1ldGhvZCk7CisgICAgamJvb2xlYW4gZmxhZyA9IGVudi0+RXhjZXB0aW9uQ2hlY2soKTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoam1pbWUsIDApOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KHN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgfQorICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGptaW1lLCBzdHIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRVcmkoU3RyaW5nOCAqdXJpKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcganVyaSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRVcmlNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGp1cmksIDApOworICAgICp1cmkgPSBTdHJpbmc4KHN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoanVyaSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTM1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9zY29wZWRfbG9jYWxfcmVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSk1lZGlhMkhUVFBTZXJ2aWNlOjpKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQU2VydmljZU9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQU2VydmljZU9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUFNlcnZpY2VDbGFzcyhlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJtYWtlSFRUUENvbm5lY3Rpb24iLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUENvbm5lY3Rpb247Iik7CisgICAgQ0hFQ0sobU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZCAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBTZXJ2aWNlOjp+Sk1lZGlhMkhUVFBTZXJ2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUFNlcnZpY2VPYmopOworfQorCitzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBKTWVkaWEySFRUUFNlcnZpY2U6Om1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9CisgICAgICAgIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUFNlcnZpY2VPYmosIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QpOworCisgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUENvbm5lY3Rpb24oZW52LCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDNlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJKYXZhVk1IZWxwZXIiCisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3RkOjphdG9taWM8SmF2YVZNICo+IEphdmFWTUhlbHBlcjo6c0phdmFWTShOVUxMKTsKKworLyoKKyAqIE1ha2VzIHRoZSBjdXJyZW50IHRocmVhZCB2aXNpYmxlIHRvIHRoZSBWTS4KKyAqCisgKiBUaGUgSk5JRW52IHBvaW50ZXIgcmV0dXJuZWQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQKKyAqIHRodXMgbXVzdCBiZSB0dWNrZWQgaW50byB0aHJlYWQtbG9jYWwgc3RvcmFnZS4KKyAqLworc3RhdGljIGludCBqYXZhQXR0YWNoVGhyZWFkKGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsIEpOSUVudioqIHBFbnYpIHsKKyAgICBKYXZhVk1BdHRhY2hBcmdzIGFyZ3M7CisgICAgSmF2YVZNKiB2bTsKKyAgICBqaW50IHJlc3VsdDsKKworICAgIHZtID0gSmF2YVZNSGVscGVyOjpnZXRKYXZhVk0oKTsKKyAgICBpZiAodm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICB9CisKKyAgICBhcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzQ7CisgICAgYXJncy5uYW1lID0gKGNoYXIqKSB0aHJlYWROYW1lOworICAgIGFyZ3MuZ3JvdXAgPSBOVUxMOworCisgICAgcmVzdWx0ID0gdm0tPkF0dGFjaEN1cnJlbnRUaHJlYWQocEVudiwgKHZvaWQqKSAmYXJncyk7CisgICAgaWYgKHJlc3VsdCAhPSBKTklfT0spIHsKKyAgICAgICAgQUxPR0koIk5PVEU6IGF0dGFjaCBvZiB0aHJlYWQgJyVzJyBmYWlsZWRcbiIsIHRocmVhZE5hbWUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBEZXRhY2ggdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHNldCB2aXNpYmxlIHRvIHRoZSBWTS4KKyAqLworc3RhdGljIGludCBqYXZhRGV0YWNoVGhyZWFkKHZvaWQpIHsKKyAgICBKYXZhVk0qIHZtOworICAgIGppbnQgcmVzdWx0OworCisgICAgdm0gPSBKYXZhVk1IZWxwZXI6OmdldEphdmFWTSgpOworICAgIGlmICh2bSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIH0KKworICAgIHJlc3VsdCA9IHZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCk7CisgICAgaWYgKHJlc3VsdCAhPSBKTklfT0spIHsKKyAgICAgICAgQUxPR0UoIkVSUk9SOiB0aHJlYWQgZGV0YWNoIGZhaWxlZFxuIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBXaGVuIHN0YXJ0aW5nIGEgbmF0aXZlIHRocmVhZCB0aGF0IHdpbGwgYmUgdmlzaWJsZSBmcm9tIHRoZSBWTSwgd2UKKyAqIGJvdW5jZSB0aHJvdWdoIHRoaXMgdG8gZ2V0IHRoZSByaWdodCBhdHRhY2gvZGV0YWNoIGFjdGlvbi4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbGxzIGZyZWUoYXJncykKKyAqLworc3RhdGljIGludCBqYXZhVGhyZWFkU2hlbGwodm9pZCogYXJncykgeworICAgIHZvaWQqIHN0YXJ0ID0gKCh2b2lkKiopYXJncylbMF07CisgICAgdm9pZCogdXNlckRhdGEgPSAoKHZvaWQgKiopYXJncylbMV07CisgICAgY2hhciogbmFtZSA9IChjaGFyKikgKCh2b2lkICoqKWFyZ3MpWzJdOyAgICAgICAgLy8gd2Ugb3duIHRoaXMgc3RvcmFnZQorICAgIGZyZWUoYXJncyk7CisgICAgSk5JRW52KiBlbnY7CisgICAgaW50IHJlc3VsdDsKKworICAgIC8qIGhvb2sgdXMgaW50byB0aGUgVk0gKi8KKyAgICBpZiAoamF2YUF0dGFjaFRocmVhZChuYW1lLCAmZW52KSAhPSBKTklfT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHN0YXJ0IHRoZSB0aHJlYWQgcnVubmluZyAqLworICAgIHJlc3VsdCA9ICgqKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdClzdGFydCkodXNlckRhdGEpOworCisgICAgLyogdW5ob29rIHVzICovCisgICAgamF2YURldGFjaFRocmVhZCgpOworICAgIGZyZWUobmFtZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVGhpcyBpcyBpbnZva2VkIGZyb20gYW5kcm9pZENyZWF0ZVRocmVhZEV0YygpIHZpYSB0aGUgY2FsbGJhY2sKKyAqIHNldCB3aXRoIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKCkuCisgKgorICogV2UgbmVlZCB0byBjcmVhdGUgdGhlIG5ldyB0aHJlYWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGdldHMgaG9va2VkCisgKiBpbnRvIHRoZSBWTSBiZWZvcmUgaXQgcmVhbGx5IHN0YXJ0cyBleGVjdXRpbmcuCisgKi8KK3N0YXRpYyBpbnQgamF2YUNyZWF0ZVRocmVhZEV0YygKKyAgICAgICAgYW5kcm9pZF90aHJlYWRfZnVuY190IGVudHJ5RnVuY3Rpb24sCisgICAgICAgIHZvaWQqIHVzZXJEYXRhLAorICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAorICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5LAorICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAorICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90KiB0aHJlYWRJZCkgeworICAgIHZvaWQqKiBhcmdzID0gKHZvaWQqKikgbWFsbG9jKDMgKiBzaXplb2Yodm9pZCopKTsgICAvLyBqYXZhVGhyZWFkU2hlbGwgbXVzdCBmcmVlCisgICAgaW50IHJlc3VsdDsKKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGhyZWFkTmFtZSA9PSBudWxscHRyLCAidGhyZWFkTmFtZSBub3QgcHJvdmlkZWQgdG8gamF2YUNyZWF0ZVRocmVhZEV0YyIpOworCisgICAgYXJnc1swXSA9ICh2b2lkKikgZW50cnlGdW5jdGlvbjsKKyAgICBhcmdzWzFdID0gdXNlckRhdGE7CisgICAgYXJnc1syXSA9ICh2b2lkKikgc3RyZHVwKHRocmVhZE5hbWUpOyAgIC8vIGphdmFUaHJlYWRTaGVsbCBtdXN0IGZyZWUKKworICAgIHJlc3VsdCA9IGFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGMoamF2YVRocmVhZFNoZWxsLCBhcmdzLAorICAgICAgICB0aHJlYWROYW1lLCB0aHJlYWRQcmlvcml0eSwgdGhyZWFkU3RhY2tTaXplLCB0aHJlYWRJZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitKTklFbnYgKkphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCkgeworICAgIEpOSUVudiAqZW52OworICAgIEphdmFWTSAqdm0gPSBzSmF2YVZNLmxvYWQoKTsKKyAgICBDSEVDSyh2bSAhPSBOVUxMKTsKKworICAgIGlmICh2bS0+R2V0RW52KCh2b2lkICoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlbnY7Cit9CisKKy8vc3RhdGljCitKYXZhVk0gKkphdmFWTUhlbHBlcjo6Z2V0SmF2YVZNKCkgeworICAgIHJldHVybiBzSmF2YVZNLmxvYWQoKTsKK30KKworLy8gc3RhdGljCit2b2lkIEphdmFWTUhlbHBlcjo6c2V0SmF2YVZNKEphdmFWTSAqdm0pIHsKKyAgICBzSmF2YVZNLnN0b3JlKHZtKTsKKworICAgIC8vIEVuc3VyZSB0aGF0IFRocmVhZCgvKmNhbkNhbGxKYXZhKi8gdHJ1ZSkgaW4gbGlidXRpbHMgaXMgYXR0YWNoZWQgdG8gdGhlIFZNLgorICAgIC8vIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgZG9uZSBieSBydW50aW1lLCBidXQgd2hlbiBsaWJ1dGlscyBpcyB1c2VkIHdpdGggbGlua2VyCisgICAgLy8gbmFtZXNwYWNlLCBDcmVhdGVUaHJlYWRGdW5jIHNob3VsZCBiZSBpbml0aWFsaXplZCBzZXBhcmF0ZWx5IHdpdGhpbiB0aGUgbmFtZXNwYWNlLgorICAgIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKChhbmRyb2lkX2NyZWF0ZV90aHJlYWRfZm4pIGphdmFDcmVhdGVUaHJlYWRFdGMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKaW5kZXggYThlMWQxZi4uNGRlOTJhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIHsKQEAgLTQ0LDMxICs0MiwyOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHZvbHVtZSglZilcbiIsIG1Wb2x1bWUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1UcmFjayAhPSAwKSA/IG1UcmFjay0+bGF0ZW5jeSgpIDogLTEpOworICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgPyBtSkF1ZGlvVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGF1eCBlZmZlY3QgaWQoJWQpLCBzZW5kIGxldmVsICglZilcbiIsCiAgICAgICAgICAgICBtQXV4RWZmZWN0SWQsIG1TZW5kTGV2ZWwpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLCBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAotICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKLSAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgICBtTGVmdFZvbHVtZSgxLjApLAotICAgICAgbVJpZ2h0Vm9sdW1lKDEuMCksCitNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKQorICAgIDogbUNhbGxiYWNrKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrQ29va2llKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrRGF0YShudWxscHRyKSwKKyAgICAgIG1Wb2x1bWUoMS4wKSwKICAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKICAgICAgIG1TYW1wbGVSYXRlSHooMCksCiAgICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKQEAgLTc4LDI4ICs3MywyMiBAQAogICAgICAgbVBpZChwaWQpLAogICAgICAgbVNlbmRMZXZlbCgwLjApLAogICAgICAgbUF1eEVmZmVjdElkKDApLAotICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAotICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKGZhbHNlKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFjayhkZXZpY2VDYWxsYmFjaykgeworICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBpZiAobUF0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisKKyAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxscHRyKSB7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBtUm91dGluZ0RlbGVnYXRlcy5jbGVhcigpOwogfQogCiBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6fk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCkgeworICAgIGZvciAoYXV0byByb3V0aW5nRGVsZWdhdGUgOiBtUm91dGluZ0RlbGVnYXRlcykgeworICAgICAgICBKQXVkaW9UcmFjazo6cmVtb3ZlR2xvYmFsUmVmKHJvdXRpbmdEZWxlZ2F0ZS5zZWNvbmQpOworICAgIH0KICAgICBjbG9zZSgpOwotICAgIGZyZWUobUF0dHJpYnV0ZXMpOwogICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCkBAIC0xMjYsMzEgKzExNSwzMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByZXR1cm4gbUZyYW1lU2l6ZTsKQEAgLTE1OCwxMCArMTQ3LDEwIEBACiAKIHVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+bGF0ZW5jeSgpOwogfQogCiBmbG9hdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0IHsKQEAgLTE3MSwxOCArMTYwLDE4IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKIH0KIAogLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQpAQCAtMTk1LDcgKzE4NCw3IEBACiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgogaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjAzLDIyICsxOTIsMTggQEAKICAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0VXM7CiAgICAgQXVkaW9UaW1lc3RhbXAgdHM7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworCiAgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKICAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgotICAgICAgICByZXMgPSBtVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOwotICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyArPSAxMDAwTEwgKiBtVHJhY2stPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLwotICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJXUgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKICAgICB9CiAKICAgICAvLyBDSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKQEAgLTI0NCwxMDggKzIyOSw1NSBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKICAgICBpZiAoc3RhdHVzID09IE9LIHx8IHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAqZnJhbWVzd3JpdHRlbiA9ICh1aW50MzJfdClldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICBtQXR0cmlidXRlcyA9IChhdHRyaWJ1dGVzID09IG51bGxwdHIpID8gbnVsbHB0ciA6IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogfQogCi1TdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7CithdWRpb19zdHJlYW1fdHlwZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgQUxPR1YoImdldEF1ZGlvU3RyZWFtVHlwZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKLSAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgewotICAgIG1UcmFjay5jbGVhcigpOworICAgIG1KQXVkaW9UcmFjay5jbGVhcigpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkgewotICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CisgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAKICAgICAvLyBvZmZsb2FkaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNhbGxiYWNrIG1vZGUgZm9yIG5vdy4KICAgICAvLyBvZmZsb2FkSW5mbyBtdXN0IGJlIHByZXNlbnQgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldAogICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgJiYKLSAgICAgICAgICAgICgoY2IgPT0gTlVMTCkgfHwgKG9mZmxvYWRJbmZvID09IE5VTEwpKSkgeworICAgICAgICAgICAgKChjYiA9PSBudWxscHRyKSB8fCAob2ZmbG9hZEluZm8gPT0gbnVsbHB0cikpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCi0gICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKLQotICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgotICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgfQorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApID8gMCA6IHN1Z2dlc3RlZEZyYW1lQ291bnQ7CiAKICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CkBAIC0zNTksMzIgKzI5MSwyMyBAQAogICAgIG1DYWxsYmFjayA9IGNiOwogICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIAotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworICAgIHNwPEpBdWRpb1RyYWNrPiBqVDsKKyAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEF1ZGlvVHJhY2siKTsKKyAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEpBdWRpb1RyYWNrIik7CiAKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIG5ld2NiZCwKLSAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgICAgICBuZXdjYmQsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgMS4wZik7ICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogRHVlIHRvIGJ1ZmZlciBtZW1vcnkgY29uY2VybnMsIHdlIHVzZSBhIG1heCB0YXJnZXQgcGxheWJhY2sgc3BlZWQKICAgICAgICAgLy8gYmFzZWQgb24gbVBsYXliYWNrUmF0ZSBhdCB0aGUgdGltZSBvZiBvcGVuIChpbnN0ZWFkIG9mIGtNYXhSZXF1aXJlZFNwZWVkKSwKQEAgLTM5NCw3MyArMzE3LDYyIEBACiAgICAgICAgIEFMT0dXX0lGKHRhcmdldFNwZWVkICE9IG1QbGF5YmFja1JhdGUubVNwZWVkLAogICAgICAgICAgICAgICAgICJ0cmFjayB0YXJnZXQgc3BlZWQ6JWYgY2xhbXBlZCBmcm9tIHBsYXliYWNrIHNwZWVkOiVmIiwKICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBjYWxsYmFjawotICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQotICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQpOwogICAgIH0KIAotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CisgICAgaWYgKGpUID09IDApIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgLy8gdCBnb2VzIG91dCBvZiBzY29wZSwgc28gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8KICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAotICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIG1TdHJlYW1UeXBlID0gdC0+c3RyZWFtVHlwZSgpOwogICAgIH0KIAotICAgIENIRUNLKCh0ICE9IE5VTEwpICYmICgobUNhbGxiYWNrID09IE5VTEwpIHx8IChuZXdjYmQgIT0gTlVMTCkpKTsKKyAgICBDSEVDSygoalQgIT0gbnVsbHB0cikgJiYgKChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgfHwgKG5ld2NiZCAhPSBudWxscHRyKSkpOwogCiAgICAgbUNhbGxiYWNrRGF0YSA9IG5ld2NiZDsKICAgICBBTE9HVigic2V0Vm9sdW1lIik7Ci0gICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIGpULT5zZXRWb2x1bWUobVZvbHVtZSk7CiAKICAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKLSAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7Ci0gICAgbVRyYWNrID0gdDsKKyAgICBtRnJhbWVTaXplID0galQtPmZyYW1lU2l6ZSgpOworICAgIG1KQXVkaW9UcmFjayA9IGpUOwogCiAgICAgcmV0dXJuIHVwZGF0ZVRyYWNrX2woKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnVwZGF0ZVRyYWNrX2woKSB7Ci0gICAgaWYgKG1UcmFjayA9PSBOVUxMKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKICAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KICAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCi0gICAgaWYgKChtVHJhY2stPmdldEZsYWdzKCkKKyAgICBpZiAoKG1KQXVkaW9UcmFjay0+Z2V0RmxhZ3MoKQogICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKLSAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgICAgIHJlcyA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UobVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgICAgIG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBpZiAobVByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKG1QcmVmZXJyZWREZXZpY2UtPmdldEpPYmplY3QoKSk7CiAgICAgfQorCisgICAgbUpBdWRpb1RyYWNrLT5yZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMobVJvdXRpbmdEZWxlZ2F0ZXMpOworCiAgICAgQUxPR1YoInVwZGF0ZVRyYWNrX2woKSBET05FIHN0YXR1cyAlZCIsIHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQ2OCwxMyArMzgwLDEzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RhcnQoKSB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CiAgICAgfQotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUobVZvbHVtZSk7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtNDgyLDExICszOTQsMTEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBudWxscHRyLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKIAogICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQpAQCAtNDk0LDQ1ICs0MDYsNDQgQEAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0b3AoKSB7CiAgICAgQUxPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c3RvcCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZsdXNoKCkgewogICAgIEFMT0dWKCJmbHVzaCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5mbHVzaCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5wYXVzZSgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7CiAgICAgQUxPR1YoImNsb3NlIik7Ci0gICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+IHRyYWNrOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICB0cmFjayA9IG1UcmFjazsKLSAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbVRyYWNrCisgICAgICAgIHRyYWNrID0gbUpBdWRpb1RyYWNrOworICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtSkF1ZGlvVHJhY2sKICAgICB9CiAgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgogfQogCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoInNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KIH0KIApAQCAtNTQwLDEyICs0NTEsMTIgQEAKICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCiAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAogICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNTU5LDEyICs0NzAsMTIgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUiKTsKKyAgICBBTE9HVigiZ2V0UGxheWJhY2tSYXRlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgICpyYXRlID0gbUpBdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTU3Miw4ICs0ODMsOCBAQAogICAgIEFMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtU2VuZExldmVsID0gbGV2ZWw7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTU4Miw0NCArNDkzLDU5IEBACiAgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBtUHJlZmVycmVkRGV2aWNlID0gbmV3IEpPYmplY3RIb2xkZXIoZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworam9iamVjdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBqUm91dGluZ0RlbGVnYXRlKSB7CisgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgam9iamVjdCBsaXN0ZW5lciA9IEpBdWRpb1RyYWNrOjpnZXRMaXN0ZW5lcihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIgJiYKKyAgICAgICAgSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpID09IG51bGxwdHIpIHsKKyAgICAgICAgam9iamVjdCBoYW5kbGVyID0gSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmFkZEdsb2JhbFJlZihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgbVJvdXRpbmdEZWxlZ2F0ZXMucHVzaF9iYWNrKHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0PihsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlKSk7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlLCBoYW5kbGVyKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpIHsKLSAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBBTE9HVigicmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgIH0KLSAgICAqZGV2aWNlSWQgPSBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKLSAgICBBTE9HVigiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjaywgJWQiLCBlbmFibGVkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSA9IG51bGxwdHI7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyICYmCisgICAgICAgIChyb3V0aW5nRGVsZWdhdGUgPSBKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIEpBdWRpb1RyYWNrOjplcmFzZUJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcik7CisgICAgICAgIGlmIChKQXVkaW9UcmFjazo6cmVtb3ZlR2xvYmFsUmVmKHJvdXRpbmdEZWxlZ2F0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjMyLDIxICs1NTgsMjEgQEAKICAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCiAgICAgZGF0YS0+bG9jaygpOwogICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICBKQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCiAgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KICAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPm1TaXplID0gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKICAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPm1EYXRhLCBidWZmZXItPm1TaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAogICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgpAQCAtNjU4LDI1ICs1ODQsMjUgQEAKICAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOwogICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgogCi0gICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+bVNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKIAotICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgICAgICBidWZmZXItPm1TaXplID0gYWN0dWFsU2l6ZTsKICAgICAgICAgfSBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgogICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CiAgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQogICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCiAgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCkBAIC02OTYsMjkgKzYyMiwzMSBAQAogICAgIGRhdGEtPnVubG9jaygpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17CitpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHJldHVybiBtU2Vzc2lvbklkOwogfQogCi11aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAotaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKLXsKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKK30KKworaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgaWYgKG1UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGR1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAppbmRleCAzMDE4MjViLi44N2RjODg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaApAQCAtMTcsMTkgKzE3LDIxIEBACiAjaWZuZGVmIEFORFJPSURfSkFVRElPVFJBQ0tfSAogI2RlZmluZSBBTkRST0lEX0pBVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9Wb2x1bWVTaGFwZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4gICAvLyBJdCBoYXMgZGVwZW5kZW5jeSBvbiBhdWRpby5oL0Vycm9ycy5oLCBidXQgZG9lc24ndAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGVtIGluIGl0LiBUaGVyZWZvcmUgaXQgaXMgaW5jbHVkZWQgaGVyZSBhdCBsYXN0LgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEpBdWRpb1RyYWNrIHsKK2NsYXNzIEpBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogCiAgICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9UcmFjayBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGJhY2tfdCkuCkBAIC0zNyw2ICszOSw4IEBACiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKICAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgRVZFTlRfVU5ERVJSVU4gPSAxLCAgICAgICAgIC8vIEJ1ZmZlciB1bmRlcnJ1biBvY2N1cnJlZC4gVGhpcyB3aWxsIG5vdCBvY2N1ciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRpYyB0cmFja3MuCiAgICAgICAgIEVWRU5UX05FV19JQVVESU9UUkFDSyA9IDYsICAvLyBJQXVkaW9UcmFjayB3YXMgcmUtY3JlYXRlZCwgZWl0aGVyIGR1ZSB0byByZS1yb3V0aW5nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sdW50YXJ5IGludmFsaWRhdGlvbiBieSBtZWRpYXNlcnZlciwgb3IgbWVkaWFzZXJ2ZXIgY3Jhc2guCiAgICAgICAgIEVWRU5UX1NUUkVBTV9FTkQgPSA3LCAgICAgICAvLyBTZW50IGFmdGVyIGFsbCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gQUYgYW5kIEhXIGFyZSBwbGF5ZWQKQEAgLTEwNCwxNSArMTA4LDE0IEBACiAgICAgICoKICAgICAgKiBUT0RPOiBSZXZpdmUgcmVtb3ZlZCBhcmd1bWVudHMgYWZ0ZXIgb2ZmbG9hZCBtb2RlIGlzIHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBKQXVkaW9UcmFjayhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICBKQXVkaW9UcmFjayh1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICBjb25zdCBqb2JqZWN0IHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CiAKICAgICAvKgpAQCAtMTU4LDEwICsxNjEsMTAgQEAKICAgICAgKiBDYXV0aW9uOiBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvbyBvZnRlbiBtYXkgYmUgaW5lZmZpY2llbnQ7CiAgICAgICogaWYgeW91IG5lZWQgYSBoaWdoIHJlc29sdXRpb24gbWFwcGluZyBiZXR3ZWVuIGZyYW1lIHBvc2l0aW9uIGFuZCBwcmVzZW50YXRpb24gdGltZSwKICAgICAgKiBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhhdCBhdCBhcHBsaWNhdGlvbiBsZXZlbCwgYmFzZWQgb24gdGhlIGxvdyByZXNvbHV0aW9uIHRpbWVzdGFtcHMuCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KLSAgICAgKiBUaGUgdGltZXN0YW1wIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb24gcmV0dXJuLCBpZiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIE5PX0lOSVQgaWYgZmluZHMgZXJyb3IsIGFuZCB0aW1lc3RhbXAgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkIG9uIHJldHVybi4KICAgICAgKi8KLSAgICBib29sIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAKICAgICAvLyBUT0RPOiBUaGlzIGRvYyBpcyBqdXN0IGNvcGllZCBmcm9tIEF1ZGlvVHJhY2suaC4gUmV2aXNlIGl0IGFmdGVyIGltcGxlbWVuYXRpb24uCiAgICAgLyogUmV0dXJuIHRoZSBleHRlbmRlZCB0aW1lc3RhbXAsIHdpdGggYWRkaXRpb25hbCB0aW1lYmFzZSBpbmZvIGFuZCBpbXByb3ZlZCBkcmFpbiBiZWhhdmlvci4KQEAgLTMyNCwzNyArMzI3LDQzIEBACiAKICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKTsKIAorICAgIHNpemVfdCBmcmFtZVNpemUoKTsKKwogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgogICAgICAqIE5vdCBhIGdlbmVyYWwtcHVycG9zZSBBUEk7IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSBtZWRpYSBwbGF5ZXIgc2VydmljZSB0byBkdW1wIGl0cyB0cmFja3MuCiAgICAgICovCiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCi0gICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCi0gICAgICogYXR0YWNoZWQuIFdoZW4gdGhlIEF1ZGlvVHJhY2sgaXMgaW5hY3RpdmUsIGl0IHdpbGwgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkUuCisgICAgLyogUmV0dXJucyB0aGUgQXVkaW9EZXZpY2VJbmZvIHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKKyAgICAgKiBhdHRhY2hlZC4KICAgICAgKi8KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisgICAgam9iamVjdCBnZXRSb3V0ZWREZXZpY2UoKTsKIAogICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBzZXNzaW9uIHRoaXMgQXVkaW9UcmFjayBiZWxvbmdzIHRvLiAqLwotICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgIGludDMyX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKIAotICAgIC8qIFNlbGVjdHMgdGhlIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suIEEgdmFsdWUgb2YKLSAgICAgKiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlcyBkZWZhdWx0IHJvdXRpbmcuCisgICAgLyogU2V0cyB0aGUgcHJlZmVycmVkIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICBUaGUgZGV2aWNlIElEIG9mIHRoZSBzZWxlY3RlZCBkZXZpY2UgKGFzIHJldHVybmVkIGJ5IHRoZSBBdWRpb0RldmljZXNNYW5hZ2VyIEFQSSkuCisgICAgICogRGV2aWNlOiBhbiBBdWRpb0RldmljZUluZm8gb2JqZWN0LgogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gZmluZCB0aGUgdmFsaWQgb3V0cHV0IGRldmljZSB3aXRoIGdpdmVuIGRldmljZSBJZC4KKyAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBzZXQgdGhlIGRldmljZQogICAgICAqLwotICAgIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOwogCiAgICAgLy8gVE9ETzogQWRkIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgogICAgIC8vIFRPRE86IEFkZCBBVURJT19GTEFHX0hXX0FWX1NZTkMgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KICAgICAvKiBSZXR1cm5zIHRoZSBmbGFncyAqLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKKyAgICAvKiBXZSBkb24ndCBrZWVwIHN0cmVhbSB0eXBlIGhlcmUsCisgICAgICogaW5zdGVhZCwgd2Uga2VlcCBhdHRyaWJ1dGVzIGFuZCBjYWxsIGdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKSB0byBnZXQgc3RyZWFtIHR5cGUKKyAgICAgKi8KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpOworCiAgICAgLyogT2J0YWluIHRoZSBwZW5kaW5nIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBmb3IgcGxheWJhY2sgb2YgcHVyZSBQQ00gZGF0YSByZW1haW5pbmcgaW4KICAgICAgKiBBdWRpb1RyYWNrLgogICAgICAqCkBAIC0zNjksMjcgKzM3OCw2OCBAQAogICAgICAqIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBjYWxsYmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIExpc3RlbmVyOiB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgcmVyb3V0aW5nIGV2ZW50cy4KKyAgICAgKiBIYW5kbGVyOiB0aGUgaGFuZGxlciB0byBoYW5kbGVyIHRoZSByZXJvdXRpbmcgZXZlbnRzLgogICAgICAqCiAgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCi0gICAgICogICAgICAgICBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqICAgICAgICAgKFRPRE8pIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICAgICAqICAgICAgICAgKFRPRE8pIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQorICAgICAqICAgICAgICAgKFRPRE8pIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAogICAgICAqLwotICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyLCBqb2JqZWN0IHJkKTsKIAogICAgIC8qIFJlbW92ZXMgYW4gQXVkaW9EZXZpY2VDYWxsYmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIExpc3RlbmVyOiB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgcmVyb3V0aW5nIGV2ZW50cy4KICAgICAgKgogICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKiAgICAgICAgIChUT0RPKSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZAorICAgICAqICAgICAgICAgKFRPRE8pIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAogICAgICAqLwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qIFJlZ2lzdGVyIGFsbCBiYWNrZWQtdXAgcm91dGluZyBkZWxlZ2F0ZXMuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIHJvdXRpbmdEZWxlZ2F0ZXM6IGJhY2tlZC11cCByb3V0aW5nIGRlbGVnYXRlcworICAgICAqCisgICAgICovCisgICAgdm9pZCByZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgcm91dGluZ0RlbGVnYXRlcyk7CisKKyAgICAvKiBnZXQgbGlzdGVuZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyogZ2V0IGhhbmRsZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaik7CisKKyAgICAvKiBjb252ZXJ0IGxvY2FsIHJlZmVyZW5jZSB0byBnbG9iYWwgcmVmZXJlbmNlLgorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGFkZEdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaik7CisKKyAgICAvKiBlcmFzZSBnbG9iYWwgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZWVkcworICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIG9iaiBpcyBOVUxMCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaik7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKgorICAgICAqIFJldHVybnMgdmFsdWUgaWYga2V5IGlzIGluIHRoZSBtYXAKKyAgICAgKiAgICAgICAgIG51bGxwdHIgaWYga2V5IGlzIG5vdCBpbiB0aGUgbWFwCisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZmluZEJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBlcmFzZUJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CiAKIHByaXZhdGU6CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjdmODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCisjZGVmaW5lIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uIDogcHVibGljIE1lZGlhSFRUUENvbm5lY3Rpb24geworICAgIEpNZWRpYTJIVFRQQ29ubmVjdGlvbihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KTsKKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5KTWVkaWEySFRUUENvbm5lY3Rpb24oKTsKKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iajsKKyAgICBqbWV0aG9kSUQgbUNvbm5lY3RNZXRob2Q7CisgICAgam1ldGhvZElEIG1EaXNjb25uZWN0TWV0aG9kOworICAgIGptZXRob2RJRCBtUmVhZEF0TWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0U2l6ZU1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldE1JTUVUeXBlTWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0VXJpTWV0aG9kOworCisgICAgamJ5dGVBcnJheSBtQnl0ZUFycmF5T2JqOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSk1lZGlhMkhUVFBDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCisjZGVmaW5lIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWEySFRUUFNlcnZpY2UgOiBwdWJsaWMgTWVkaWFIVFRQU2VydmljZSB7CisgICAgSk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopOworCisgICAgdmlydHVhbCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkpNZWRpYTJIVFRQU2VydmljZSgpOworCitwcml2YXRlOgorICAgIGpvYmplY3QgbU1lZGlhMkhUVFBTZXJ2aWNlT2JqOworCisgICAgam1ldGhvZElEIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKTWVkaWEySFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q4YjQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEpPQkpFQ1RfSE9MREVSX0hfCisKKyNkZWZpbmUgSk9CSkVDVF9IT0xERVJfSF8KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBnbG9iYWwgcmVmZXJlbmNlIG9mIGpvYmplY3QuCitzdHJ1Y3QgSk9iamVjdEhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBKT2JqZWN0SG9sZGVyKGpvYmplY3Qgb2JqKSB7CisgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgbUpPYmplY3QgPSByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KGVudi0+TmV3R2xvYmFsUmVmKG9iaikpOworICAgIH0KKworICAgIHZpcnR1YWwgfkpPYmplY3RIb2xkZXIoKSB7CisgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUpPYmplY3QpOworICAgIH0KKworICAgIGpvYmplY3QgZ2V0Sk9iamVjdCgpIHsgcmV0dXJuIG1KT2JqZWN0OyB9CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtSk9iamVjdDsKK307CisKK30gIC8vIiBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSk9CSkVDVF9IT0xERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjU2YWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSkFWQV9WTV9IRUxQRVJfSF8KKworI2RlZmluZSBKQVZBX1ZNX0hFTFBFUl9IXworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlIDxhdG9taWM+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEphdmFWTUhlbHBlciB7CisgICAgc3RhdGljIEpOSUVudiAqZ2V0Sk5JRW52KCk7CisgICAgc3RhdGljIEphdmFWTSAqZ2V0SmF2YVZNKCk7CisgICAgc3RhdGljIHZvaWQgc2V0SmF2YVZNKEphdmFWTSAqdm0pOworCitwcml2YXRlOgorICAgIC8vIE9uY2UgYSB2YWxpZCBKYXZhVk0gaGFzIGJlZW4gc2V0LCBpdCBzaG91bGQgbmV2ZXIgYmUgcmVzZXQgb3IgY2hhbmdlZC4KKyAgICAvLyBIb3dldmVyLCBhcyBpdCBtYXkgYmUgYWNjZXNzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLCBhY2Nlc3MgbmVlZHMgdG8gYmUKKyAgICAvLyBzeW5jaHJvbml6ZWQuCisgICAgc3RhdGljIHN0ZDo6YXRvbWljPEphdmFWTSAqPiBzSmF2YVZNOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBKQVZBX1ZNX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaAppbmRleCA1ZDViOGU0Li5iZGE0ZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaApAQCAtMTksMTAgKzE5LDE2IEBACiAjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyQVVESU9PVVRQVVRfSAogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSAiam5pLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9UcmFjazsKQEAgLTMyLDE1ICszOCwxNCBAQAogICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogcHVibGljOgotICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogICAgIHZpcnR1YWwgfk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVHJhY2sgIT0gMDsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjayAhPSBudWxscHRyOwogICAgIH0KICAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZUNvdW50KCkgY29uc3Q7CkBAIC01MiwxNyArNTcsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CkBAIC03MSwxMyArNzYsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKLSAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwotICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKLSAgICB9Ci0gICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CisgICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3Q7CiAKLSAgICB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAKQEAgLTkyLDEzICs5NCwxMSBAQAogICAgICAgICAvLyBUT0RPOiByZXR1cm4gY29ycmVjdCB2YWx1ZS4KICAgICAgICAgLy9yZXR1cm4gbU5leHRPdXRwdXQgPT0gTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotCiAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgIHZpcnR1YWwgam9iamVjdCBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgdm9pZCBzZXRNaW5CdWZmZXJDb3VudCgpOwpAQCAtMTA3LDI5ICsxMDcsMjUgQEAKICAgICB2b2lkIGNsb3NlX2woKTsKICAgICBzdGF0dXNfdCB1cGRhdGVUcmFja19sKCk7CiAKLSAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+ICAgICAgICAgbUpBdWRpb1RyYWNrOwogICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CiAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbUF0dHJpYnV0ZXM7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICBtUGxheWJhY2tSYXRlOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlSHo7IC8vIHNhbXBsZSByYXRlIG9mIHRoZSBjb250ZW50LCBhcyBzZXQgaW4gb3BlbigpCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtU2VsZWN0ZWREZXZpY2VJZDsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKLSAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtUHJlZmVycmVkRGV2aWNlOwogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4gbVJvdXRpbmdEZWxlZ2F0ZXM7IC8vIDxsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlPgogCiAgICAgLy8gc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBub3QgcHJvdGVjdGVkIGJ5IG11dGV4CiAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAppbmRleCAwMmJmODkxLi43ODA0YTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0yMywxNiArMjMsMjEgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGpuaS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgogCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKIC8vIGdsb2JhbCwgYW5kIG5vdCBpbiBhbmRyb2lkOjoKIHN0cnVjdCBzb2NrYWRkcl9pbjsKQEAgLTQzLDcgKzQ4LDYgQEAKIGNsYXNzIFBhcmNlbDsKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKIAotI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCA0CiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUlNJWkUgMTIwMAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19TQU1QTEVSQVRFIDQ0MTAwCiAKQEAgLTU2LDcgKzYwLDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7CkBAIC04OCw3ICs5Myw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0ID0gMDsKQEAgLTk4LDEyICsxMDMsMTAgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwpAQCAtMTM5LDkgKzE0MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBqb2JqZWN0ICAgICBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogICAgIH07CiAKICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KQEAgLTE3MSw3ICsxNzUsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgewpAQCAtMjExLDYgKzIxNCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSA9IDA7CisKICAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCiAgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KICAgICAvLwpAQCAtMjE4LDI2ICsyMjMsMTQgQEAKICAgICAvLyAgICAgICAgICAgICAgICBkYXRhIHNlbnQgYnkgdGhlIGphdmEgbGF5ZXIuCiAgICAgLy8gQHBhcmFtW291dF0gcmVwbHkgUGFyY2VsIHRvIGhvbGQgdGhlIHJlcGx5IGRhdGEuIENhbm5vdCBiZSBudWxsLgogICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSA9IDA7Ci0KLSAgICAvLyBUaGUgQ2xpZW50IGluIHRoZSBNZXRhZGF0YVBsYXllclNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2Qgb24KLSAgICAvLyB0aGUgbmF0aXZlIHBsYXllciB0byByZXRyaWV2ZSBhbGwgb3IgYSBzdWJzZXQgb2YgbWV0YWRhdGEuCi0gICAgLy8KLSAgICAvLyBAcGFyYW0gaWRzIFNvcnRlZExpc3Qgb2YgbWV0YWRhdGEgSUQgdG8gYmUgZmV0Y2guIElmIGVtcHR5LCBhbGwKLSAgICAvLyAgICAgICAgICAgIHRoZSBrbm93biBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgLy8gQHBhcmFtW2lub3V0XSByZWNvcmRzIFBhcmNlbCB3aGVyZSB0aGUgcGxheWVyIGFwcGVuZHMgaXRzIG1ldGFkYXRhLgotICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiAvKiByZWNvcmRzICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSA9IDA7CiAKICAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwogICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKLSAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqPU5VTEwpIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxpc3RlbmVyTG9jayk7CkBAIC0yNTYsMTEgKzI0OSwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCAvKnNyY0lkKi8sIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgLyogZHJtU2Vzc2lvbklkICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IC8qc3JjSWQqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCmluZGV4IDM5MDViNTUuLjI0MzAyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCkBAIC0zNCw4ICszNCw3IEBACiAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFICAgID0gNSwKICAgICBNRURJQTJfU1RBUlRFRCAgICAgICAgICAgPSA2LAogICAgIE1FRElBMl9QQVVTRUQgICAgICAgICAgICA9IDcsCi0gICAgTUVESUEyX1NUT1BQRUQgICAgICAgICAgID0gOCwKLSAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBMl9TS0lQUEVEICAgICAgICAgICA9IDgsCiAgICAgTUVESUEyX05PVElGWV9USU1FICAgICAgID0gOTgsCiAgICAgTUVESUEyX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUEyX0VSUk9SICAgICAgICAgICAgID0gMTAwLApAQCAtNDMsNyArNDIsNiBAQAogICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKICAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiAgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAotICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKIH07CiAKIC8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCkBAIC05NiwxNyArOTQsMjAgQEAKIGVudW0gbWVkaWEyX2luZm9fdHlwZSB7CiAgICAgLy8gMHh4CiAgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCi0gICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgotICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKLSAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBzdGFydGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJUID0gMiwKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IHZpZGVvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQgPSAzLAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgYXVkaW8gZnJhbWUgZm9yIHJlbmRlcmluZwogICAgIE1FRElBMl9JTkZPX0FVRElPX1JFTkRFUklOR19TVEFSVCA9IDQsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZQotICAgIE1FRElBMl9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFID0gNSwKLSAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGUgZnVsbCBwbGF5IGxpc3QKLSAgICBNRURJQTJfSU5GT19QTEFZTElTVF9FTkQgPSA2LAorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCA9IDUsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgYWxsIGRhdGEgc291cmNlcy4KKyAgICAvLyBCdXQgdGhpcyBpcyBub3QgdmlzaWJsZSBpbiBuYXRpdmUgY29kZS4gSnVzdCBrZWVwIHRoaXMgZW50cnkgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9MSVNUX0VORCA9IDYsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhbiBpdGVyYXRpb24gb2YgcGxheWJhY2sgbG9vcC4gVGhpcyBldmVudCBpcyBzZW50IG9ubHkgd2hlbgorICAgIC8vIGxvb3BpbmcgaXMgZW5hYmxlZC4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9SRVBFQVQgPSA3LAogCiAgICAgLy8xeHgKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHJlcGFyZWQgYSBkYXRhIHNvdXJjZS4KQEAgLTE1MCwxMSArMTUxLDExIEBACiAKIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnRzIGluIE1lZGlhUGxheWVyMi5qYXZhCiBlbnVtIG1lZGlhcGxheWVyMl9zdGF0ZXMgewotICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAyLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAzLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSA0LAotICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSA1LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxMDAxLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAxMDAyLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSAxMDAzLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAxMDA0LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSAxMDA1LAogfTsKIAogZW51bSBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyB7CkBAIC0xNjUsOCArMTY2LDcgQEAKICAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKICAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKLSAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKLSAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA2CiB9OwogCiAvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKaW5kZXggZDU4NjE5Mi4uMjk5M2FiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApAQCAtMjAsMTEgKzIwLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzIsNiArMzMsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CkBAIC00Miw3ICs0NSw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCkgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyCkBAIC01MCw3ICs1NCw3IEBACiBwdWJsaWM6CiAgICAgfk1lZGlhUGxheWVyMigpOwogCi0gICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKCk7CisgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC02NSwxMCArNjksOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldE1lZGlhUGxheWVyMlN0YXRlKCk7CisgICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldFN0YXRlKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CkBAIC04Miw2MCArODUsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmogPSBOVUxMKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICBnZXRBdWRpb1Nlc3Npb25JZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOwogCiAgICAgICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGludDY0X3Qgc3JjSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKLSAgICBNZWRpYVBsYXllcjIoKTsKKyAgICBNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCk7CiAgICAgYm9vbCBpbml0KCk7CiAKLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgdGVzdGVkLgotICAgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0YWRhdGEgc2hvdWxkIGJlIGRyb3BwZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gICAgICAgICAgICAgIHRoZSBmaWx0ZXJzLgotICAgIGJvb2wgc2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKSBjb25zdDsKLQotICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdXBkYXRlZC4gTm9vcCBpZgotICAgIC8vIHRoZSBlbGVtZW50IGV4aXN0cyBhbHJlYWR5LgotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSByZWNvcmRlZC4KLSAgICB2b2lkIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKTsKLQogICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBTmF0aXZlV2luZG93LgogICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CiAKICAgICB2b2lkIGNsZWFyX2woKTsKICAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7CiAgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb25fbChpbnQ2NF90ICptc2VjKTsKICAgICBzdGF0dXNfdCByZXNldF9sKCk7Ci0gICAgc3RhdHVzX3QgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOworICAgIHN0YXR1c190IGNoZWNrU3RhdGVfbCgpOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CkBAIC0xNTIsMjcgKzE0OCwxNSBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtU2Vla1Bvc2l0aW9uOwogICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtU2Vla01vZGU7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIFBhcmNlbCogICAgICAgICAgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1Db250ZXh0OwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwotCiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICAgIG1Db25uZWN0ZWRXaW5kb3c7Ci0KLSAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotCi0gICAgLy8gTWV0YWRhdGEgdXBkYXRlZC4gRm9yIGVhY2ggTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAvLyBub3RpZmljYXRpb24gd2UgdHJ5IHRvIHVwZGF0ZSBtTWV0YWRhdGFVcGRhdGVkIHdoaWNoIGlzIGEKLSAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KLSAgICAvLyBnZXRNZXRhZGF0YSBjbGVhcnMgdGhpcyBzZXQuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhVXBkYXRlZDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKaW5kZXggZTU1NjdkYy4uYWU3YWM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKQEAgLTE4LDE0ICsxOCwxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllcjJOYXRpdmUiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgpAQCAtNTMsMTY5ICs0OSw2IEBACiBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAotLy8gTWF4IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaWx0ZXIuCi1jb25zdCBpbnQga01heEZpbHRlclNpemUgPSA2NDsgIC8vIEkgcHVsbGVkIHRoYXQgb3V0IG9mIHRoaW4gYWlyLgotCi0vLyBGSVhNRTogTW92ZSBhbGwgdGhlIG1ldGFkYXRhIHJlbGF0ZWQgZnVuY3Rpb24gaW4gdGhlIE1ldGFkYXRhLmNwcAotCi0vLyBVbm1hcnNoYWxsIGEgZmlsdGVyIGZyb20gYSBQYXJjZWwuCi0vLyBGaWx0ZXIgZm9ybWF0IGluIGEgcGFyY2VsOgotLy8KLS8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyAobikgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMSAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAyICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyAgLi4uLgotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgbiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IHNob3VsZCBzdGFydCB3aXRoIGEgZmlsdGVyLgotLy8gQHBhcmFtW291dF0gZmlsdGVyIE9uIGV4aXQgY29udGFpbnMgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdHlwZSB0byBiZQotLy8gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLgotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotLy8gQHJldHVybiB0cnVlIGlmIHRoZSBwYXJjZWwgc3RhcnRzIHdpdGggYSB2YWxpZCBmaWx0ZXIuCi1ib29sIHVubWFyc2hhbGxGaWx0ZXIoY29uc3QgUGFyY2VsJiBwLAotICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgewotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwLnJlYWRJbnQzMigmdmFsKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZmlsdGVyJ3MgbGVuZ3RoIik7Ci0gICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodmFsID4ga01heEZpbHRlclNpemUgfHwgdmFsIDwgMCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmaWx0ZXIgbGVuICVkIiwgdmFsKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IHNpemVfdCBudW0gPSB2YWw7Ci0KLSAgICBmaWx0ZXItPmNsZWFyKCk7Ci0gICAgZmlsdGVyLT5zZXRDYXBhY2l0eShudW0pOwotCi0gICAgc2l6ZV90IHNpemUgPSBudW0gKiBzaXplb2YobWVkaWE6Ok1ldGFkYXRhOjpUeXBlKTsKLQotCi0gICAgaWYgKHAuZGF0YUF2YWlsKCkgPCBzaXplKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgdG9vIHNob3J0IGV4cGVjdGVkICV6dSBidXQgZ290ICV6dSIsIHNpemUsIHAuZGF0YUF2YWlsKCkpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlICpkYXRhID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlKj4ocC5yZWFkSW5wbGFjZShzaXplKSk7Ci0KLSAgICBpZiAoTlVMTCA9PSBkYXRhKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgaGFkIG5vIGRhdGEiKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRPRE86IFRoZSBzdGwgaW1wbCBvZiB2ZWN0b3Igd291bGQgYmUgbW9yZSBlZmZpY2llbnQgaGVyZQotICAgIC8vIGJlY2F1c2UgaXQgZGVnZW5lcmF0ZXMgaW50byBhIG1lbWNweSBvbiBwb2QgdHlwZXMuIFRyeSB0bwotICAgIC8vIHJlcGxhY2UgbGF0ZXIgb3IgdXNlIHN0bDo6c2V0LgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgZmlsdGVyLT5hZGQoKmRhdGEpOwotICAgICAgICArK2RhdGE7Ci0gICAgfQotICAgICpzdGF0dXMgPSBPSzsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQHBhcmFtIGZpbHRlciBPZiBtZXRhZGF0YSB0eXBlLgotLy8gQHBhcmFtIHZhbCBUbyBiZSBzZWFyY2hlZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZC4KLWJvb2wgZmluZE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBmaWx0ZXIsIGNvbnN0IGludDMyX3QgdmFsKSB7Ci0gICAgLy8gRGVhbCB3aXRoIGVtcHR5IGFuZCBBTlkgcmlnaHQgYXdheQotICAgIGlmIChmaWx0ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZpbHRlclswXSA9PSBtZWRpYTo6TWV0YWRhdGE6OmtBbnkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbHRlci5pbmRleE9mKHZhbCkgPj0gMDsKLX0KLQotLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKLS8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKLWNvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOwotCi0vLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLwotLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KLS8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotdm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpIHsKLSAgICBhdHRyaWJ1dGVzLT51c2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+Y29udGVudF90eXBlID0gKGF1ZGlvX2NvbnRlbnRfdHlwZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+ZmxhZ3MgPSAoYXVkaW9fZmxhZ3NfbWFza190KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLnJlYWRJbnQzMigpID09IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzKTsKLSAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7Ci0gICAgICAgIC8vIHRoZSB0YWdzIGFyZSBVVEYxNiwgY29udmVydCB0byBVVEY4Ci0gICAgICAgIFN0cmluZzE2IHRhZ3MgPSBwYXJjZWwucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgIHNzaXplX3QgcmVhbFRhZ1NpemUgPSB1dGYxNl90b191dGY4X2xlbmd0aCh0YWdzLnN0cmluZygpLCB0YWdzLnNpemUoKSk7Ci0gICAgICAgIGlmIChyZWFsVGFnU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY29weSB0aGUgZmxhdHRlbmVkIHN0cmluZyBpbnRvIHRoZSBhdHRyaWJ1dGVzIGFzIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbnZlcnNpb246Ci0gICAgICAgICAgICAvLyBjb3B5aW5nIGFycmF5IHNpemUgLTEsIGFycmF5IGZvciB0YWdzIHdhcyBjYWxsb2MnZCwgbm8gbmVlZCB0byBOVUxMLXRlcm1pbmF0ZSBpdAotICAgICAgICAgICAgc2l6ZV90IHRhZ1NpemUgPSByZWFsVGFnU2l6ZSA+IEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgPwotICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxIDogcmVhbFRhZ1NpemU7Ci0gICAgICAgICAgICB1dGYxNl90b191dGY4KHRhZ3Muc3RyaW5nKCksIHRhZ1NpemUsIGF0dHJpYnV0ZXMtPnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzKSAvIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzWzBdKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgidW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcygpIHJlY2VpdmVkIHVuZmxhdHRlbmVkIHRhZ3MsIGlnbm9yaW5nIHRhZyB2YWx1ZXMiKTsKLSAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICB9Ci19Ci0KLWNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgewotcHVibGljOgotICAgIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4mIGxpc3RlbmVyKQotICAgICAgICA6IG1MaXN0ZW5lcihsaXN0ZW5lcikgeyB9Ci0KLSAgICB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUgewotICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoMCwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCwgYXVkaW9JbywgZGV2aWNlSWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImxpc3RlbmVyIGZvciBwcm9jZXNzICVkIGRlYXRoIGlzIGdvbmUiLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICB3cDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG1MaXN0ZW5lcjsKLX07Ci0KIGNsYXNzIHByb3h5TGlzdGVuZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIgewogcHVibGljOgogICAgIHByb3h5TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiAmcGxheWVyKQpAQCAtMjIzLDcgKzU2LDggQEAKIAogICAgIH5wcm94eUxpc3RlbmVyKCkgeyB9OwogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopIG92ZXJyaWRlIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBtUGxheWVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBwbGF5ZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwpAQCAtMjY1LDExNCArOTksMTEwIEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgU29ydGVkVmVjdG9yPCBzcDxNZWRpYVBsYXllcjI+ID4gcGxheWVyczsgLy90byBzZXJpYWxpc2UgdGhlIG11dGV4IHVubG9jayAmIGNsaWVudCBkZXN0cnVjdGlvbi4KIAotICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBNZWRpYVBsYXllcjJcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7CisgICAgICAgIGVuc3VyZUluaXRfbCgpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKKyAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOworICAgIGlmIChmKSB7CisgICAgICAgIHdoaWxlICghZmVvZihmKSkgeworICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOwotICAgICAgICAgICAgZW5zdXJlSW5pdF9sKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHAgPSAoKnNQbGF5ZXJzKVtpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGxheWVycy5hZGQocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KIAotICAgICAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKLSAgICAgICAgRklMRSAqZiA9IGZvcGVuKGJ1ZmZlciwgInIiKTsKLSAgICAgICAgaWYgKGYpIHsKLSAgICAgICAgICAgIHdoaWxlICghZmVvZihmKSkgewotICAgICAgICAgICAgICAgIGZnZXRzKGJ1ZmZlciwgU0laRSwgZik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cnN0cihidWZmZXIsICIgL3N0b3JhZ2UvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9kYXRhLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9tZWRpYS8iKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKLSAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwotICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwotICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0cGlkKCksIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxzdGF0KGJ1ZmZlciwgJnMpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZGxpbmsoYnVmZmVyLCBsaW5rdG8sIHNpemVvZihsaW5rdG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1Ml0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9zb3VuZHMvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL2RhdGEvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmt0byk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7CisgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOworICAgIGlmIChkKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKKyAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIHVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2VkaXIoZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQogCi0gICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisgICAgZ0xvb3BlclJvc3Rlci5kdW1wKGZkLCBhcmdzKTsKIAotICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKLSAgICAgICAgYm9vbCB1bnJlYWNoYWJsZU1lbW9yeSA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItbSIpKSB7Ci0gICAgICAgICAgICAgICAgZHVtcE1lbSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgewotICAgICAgICAgICAgICAgIHVucmVhY2hhYmxlTWVtb3J5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZHVtcE1lbSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIG1lbW9yeTpcbiIpOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgdW5yZWFjaGFibGUgbWVtb3J5OlxuIik7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGxpbWl0IGJlIGFuIGFyZ3VtZW50IHBhcmFtZXRlcj8KLSAgICAgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQotICAgICAgICAgICAgLy9zdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwMDAgLyogbGltaXQgKi8pOwotICAgICAgICAgICAgLy9yZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOworICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKKyAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgeworICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKKyAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/CisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQorICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zODAsOCArMjEwLDggQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy9zdGF0aWMKLXNwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CitzcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpIHsKKyAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoc2Vzc2lvbklkLCBjb250ZXh0KTsKIAogICAgIGlmICghcGxheWVyLT5pbml0KCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zOTgsNDQgKzIyOCwzNCBAQAogICAgIHJldHVybiBkdW1wUGxheWVycyhmZCwgYXJncyk7CiB9CiAKLU1lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkgeworTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCkgewogICAgIEFMT0dWKCJjb25zdHJ1Y3RvciIpOwogICAgIG1TcmNJZCA9IDA7CiAgICAgbUxvY2tUaHJlYWRJZCA9IDA7CiAgICAgbUxpc3RlbmVyID0gTlVMTDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICBtQ29udGV4dCA9IG5ldyBKT2JqZWN0SG9sZGVyKGNvbnRleHQpOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOwogICAgIG1Mb29wID0gZmFsc2U7Ci0gICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CisgICAgbVZvbHVtZSA9IDEuMDsKICAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgbUF1ZGlvU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIG1TZW5kTGV2ZWwgPSAwOwogCi0gICAgLy8gVE9ETzogZ2V0IHBpZCBhbmQgdWlkIGZyb20gSkFWQQotICAgIG1QaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgbVVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBtUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CiAKLSAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoc2Vzc2lvbklkLCBtVWlkLCBtUGlkLCBOVUxMIC8qYXR0cmlidXRlcyovKTsKIH0KIAogTWVkaWFQbGF5ZXIyOjp+TWVkaWFQbGF5ZXIyKCkgewogICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7Ci0gICAgfQotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgZGlzY29ubmVjdCgpOwogICAgIHJlbW92ZVBsYXllcih0aGlzKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQogfQogCiBib29sIE1lZGlhUGxheWVyMjo6aW5pdCgpIHsKQEAgLTQ5MywxOSArMzEzLDI4IEBACiAgICAgaWYgKGRzZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIC8vIE1pY3Jvc2Vjb25kIGlzIHVzZWQgaW4gTnVQbGF5ZXIyLgorICAgIGlmIChkc2QtPm1TdGFydFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1TdGFydFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIHN0YXJ0IHBvaXN0aW9uIGNsYW1wZWQgdG8gJWxsZCBtcyIsIChsb25nIGxvbmcpZHNkLT5tU3RhcnRQb3NpdGlvbk1zKTsKKyAgICB9CisgICAgaWYgKGRzZC0+bUVuZFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1FbmRQb3NpdGlvbk1zID0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXM7CisgICAgICAgIEFMT0dXKCJzZXREYXRhU291cmNlLCBlbmQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSB0eXBlKCVkKSwgc3JjSWQoJWxsZCkiLCBkc2QtPm1UeXBlLCAobG9uZyBsb25nKWRzZC0+bUlkKTsKIAogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gb2xkUGxheWVyOwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGlmICghKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKQogICAgICAgICAgICAgICB8fCBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyID0gbmV3IE51UGxheWVyMkRyaXZlcihtUGlkLCBtVWlkKTsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQsIG1Db250ZXh0KTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGxheWVyLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCwgaW5pdENoZWNrIGZhaWxlZCglZCkiLCBlcnIpOwpAQCAtNTE1LDggKzM0NCw2IEBACiAgICAgICAgIGNsZWFyX2woKTsKIAogICAgICAgICBwbGF5ZXItPnNldExpc3RlbmVyKG5ldyBwcm94eUxpc3RlbmVyKHRoaXMpKTsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzLCBuZXcgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIocGxheWVyKSk7CiAgICAgICAgIHBsYXllci0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAKICAgICAgICAgZXJyID0gcGxheWVyLT5zZXREYXRhU291cmNlKGRzZCk7CkBAIC01NjUsNzkgKzM5MiwxOCBAQAogICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOwogICAgIGlmICgobVBsYXllciA9PSBOVUxMKSB8fCAhaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgQUxPR0UoImludm9rZSgpIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOwogICAgIHJldHVybiBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogfQogCi0vLyBUaGlzIGNhbGwgZG9lc24ndCBuZWVkIHRvIGFjY2VzcyB0aGUgbmF0aXZlIHBsYXllci4KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpIHsKLSAgICBBTE9HRCgic2V0TWV0YWRhdGFGaWx0ZXIiKTsKLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBhbGxvdywgZHJvcDsKLQotICAgIGlmICh1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmFsbG93LCAmc3RhdHVzKSAmJgotICAgICAgICB1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmRyb3AsICZzdGF0dXMpKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTWV0YWRhdGFBbGxvdyA9IGFsbG93OwotICAgICAgICBtTWV0YWRhdGFEcm9wID0gZHJvcDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIC8qIGFwcGx5X2ZpbHRlciAqLywgUGFyY2VsICpyZXBseSkgewotICAgIEFMT0dEKCJnZXRNZXRhZGF0YSIpOwotICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGlkczsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgewotICAgICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotCi0gICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciB0aGUgcmV0dXJuIGNvZGUsIHVwZGF0ZWQgYnkgdGhlIGNhbGxlci4KLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLTEpOwotCi0gICAgICAgIC8vIFdlIGRvbid0IGJsb2NrIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgZmV0Y2ggdGhlIGRhdGEuIFdlIGNsZWFyCi0gICAgICAgIC8vIG1NZXRhZGF0YVVwZGF0ZWQgZmlyc3Qgc28gd2UgZG9uJ3QgbG9zZSBub3RpZmljYXRpb25zIGhhcHBlbmluZwotICAgICAgICAvLyBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhpcyBjYWxsLgotICAgICAgICBpZiAodXBkYXRlX29ubHkpIHsKLSAgICAgICAgICAgIGlkcyA9IG1NZXRhZGF0YVVwZGF0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5jbGVhcigpOwotICAgIH0KLQotICAgIG1lZGlhOjpNZXRhZGF0YSBtZXRhZGF0YShyZXBseSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRIZWFkZXIoKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwbGF5ZXItPmdldE1ldGFkYXRhKGlkcywgcmVwbHkpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtZXRhZGF0YS5yZXNldFBhcmNlbCgpOwotICAgICAgICBBTE9HRSgiZ2V0TWV0YWRhdGEgZmFpbGVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogZW1lbnQgZmlsdGVyaW5nIG9uIHRoZSByZXN1bHQuIE5vdCBjcml0aWNhbCBzaW5jZQotICAgIC8vIGZpbHRlcmluZyB0YWtlcyBwbGFjZSBvbiB0aGUgdXBkYXRlIG5vdGlmaWNhdGlvbnMgYWxyZWFkeS4gVGhpcwotICAgIC8vIHdvdWxkIGJlIHdoZW4gYWxsIHRoZSBtZXRhZGF0YSBhcmUgZmV0Y2ggYW5kIGEgZmlsdGVyIGlzIHNldC4KLQotICAgIC8vIEV2ZXJ5dGhpbmcgaXMgZmluZSwgdXBkYXRlIHRoZSBtZXRhZGF0YSBsZW5ndGguCi0gICAgbWV0YWRhdGEudXBkYXRlTGVuZ3RoKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiB2b2lkIE1lZGlhUGxheWVyMjo6ZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCkgewogICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwgJiYgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKQEAgLTcyNywyMiArNDkzLDkgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9Ci0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKLQotICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnVzYWdlLCBtQXVkaW9BdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIG1BdWRpb0F0dHJpYnV0ZXMtPmZsYWdzLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dGFncyk7Ci0KLSAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzUwLDE0ICs1MDMsMTIgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgewogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQpKSB7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb1N0cmVhbVR5cGUobVN0cmVhbVR5cGUpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtNzgxLDcgKzUzMiw3IEBACiAgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOwogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtVm9sdW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewpAQCAtODA2LDMwICs1NTcsMTIgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAotICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgewotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKQEAgLTg2MCw3ICs1OTMsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldE1lZGlhUGxheWVyMlN0YXRlKCkgeworbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldFN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1I7CkBAIC04NzMsOCArNjA2LDcgQEAKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkc7CiAgICAgfQotICAgIGlmIChtQ3VycmVudFN0YXRlCi0gICAgICAgICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEOwogICAgIH0KICAgICAvLyBub3cgb25seSBtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9QUkVQQVJFRCBpcyB0cnVlCkBAIC04OTAsNyArNjIyLDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwIHx8IChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkgeworICAgIGlmIChtUGxheWVyID09IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtOTc4LDExICs3MTAsMTggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCAqbXNlYykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gVE9ETzogY2FjaGUgZHVyYXRpb24gZm9yIGN1cnJlbnRTcmNJZCBhbmQgbmV4dFNyY0lkLCBhbmQgcmV0dXJuIGNvcnJlY3QKKyAgICAvLyB2YWx1ZSBmb3IgbmV4dFNyY0lkLgorICAgIGlmIChzcmNJZCAhPSBtU3JjSWQpIHsKKyAgICAgICAgKm1zZWMgPSAtMTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIEFMT0dWKCJnZXREdXJhdGlvbl9sIik7CiAgICAgYm9vbCBpc1ZhbGlkU3RhdGUgPSAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOworICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAhaXNWYWxpZFN0YXRlKSB7CiAgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGNhbGwgZ2V0RHVyYXRpb24gaW4gd3Jvbmcgc3RhdGU6IG1QbGF5ZXI9JXAsIG1DdXJyZW50U3RhdGU9JXUiLAogICAgICAgICAgICAgICAgIG1QbGF5ZXIuZ2V0KCksIG1DdXJyZW50U3RhdGUpOwpAQCAtMTEzOCwxOCArODc3LDE3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZiwgJWYpIiwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKCVmKSIsIHZvbHVtZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnRWb2x1bWU7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7CisgICAgbVZvbHVtZSA9IHZvbHVtZTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKCVkKSIsIHNlc3Npb25JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSkgewpAQCAtMTE1OSwxNyArODk3LDE4IEBACiAgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKHNlc3Npb25JZCAhPSBtQXVkaW9TZXNzaW9uSWQpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCAmJiBzZXNzaW9uSWQgIT0gbUF1ZGlvT3V0cHV0LT5nZXRTZXNzaW9uSWQoKSkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFNlc3Npb25JZChzZXNzaW9uSWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworaW50MzJfdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgewpAQCAtMTE5Niw2NyArOTM1LDM3IEBACiB9CiAKIC8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KSB7Ci0gICAgc3dpdGNoKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQotICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjawotICAgICAgICBicmVhazsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Y2hlY2tTdGF0ZV9sKCkgeworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7CisgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCisgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyIpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGNoZWNrU3RhdGVGb3JLZXlTZXRfbChrZXkpICE9IE9LKSB7CisgICAgaWYgKGNoZWNrU3RhdGVfbCgpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgY2FzZSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgotICAgICAgICAvLyBzYXZlIHRoZSBtYXJzaGFsbGVkIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IG5ldyBQYXJjZWwoKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+YXBwZW5kRnJvbSgmcmVxdWVzdCwgMCwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKLSAgICAgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2wocmVxdWVzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1ZfSUYobVBsYXllciA9PSBOVUxMLCAic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7Ci0gICAgfQorICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKKyAgICBzdGF0dXMgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChhdHRyaWJ1dGVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitqb2JqZWN0IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKCkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcykiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwgPyBtQXVkaW9BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBOVUxMOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoa2V5ID09IE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMpIHsKLSAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVwbHktPmFwcGVuZEZyb20obUF1ZGlvQXR0cmlidXRlc1BhcmNlbCwgMCwgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+ZGF0YVNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQogICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjY5LDQ0ICs5NzgsMjYgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1ib29sIE1lZGlhUGxheWVyMjo6c2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBjb2RlKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgaWYgKGZpbmRNZXRhZGF0YShtTWV0YWRhdGFEcm9wLCBjb2RlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vIGZvciBtZWRpYW1ldHJpY3MKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIEFMT0dEKCJNZWRpYVBsYXllcjI6OmdldE1ldHJpY3MoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiZ2V0TWV0cmljczogbm8gYWN0aXZlIHBsYXllciIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKG1NZXRhZGF0YUFsbG93LmlzRW1wdHkoKSB8fCBmaW5kTWV0YWRhdGEobU1ldGFkYXRhQWxsb3csIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAgbVBsYXllci0+Z2V0TWV0cmljcyhidWZmZXIsIGxlbmd0aCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRCgiZ2V0TWV0cmljcyByZXR1cm5zICVkIiwgc3RhdHVzKTsKICAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotCi12b2lkIE1lZGlhUGxheWVyMjo6YWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1NZXRhZGF0YVVwZGF0ZWQuaW5kZXhPZihtZXRhZGF0YV90eXBlKSA8IDApIHsKLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5hZGQobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopIHsKICAgICBBTE9HVigibWVzc2FnZSByZWNlaXZlZCBzcmNJZD0lbGxkLCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLAogICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0Mik7CiAKLSAgICBpZiAoTUVESUEyX0lORk8gPT0gbXNnICYmIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSA9PSBleHQxKSB7Ci0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlID0gZXh0MjsKLQotICAgICAgICBpZihzaG91bGREcm9wTWV0YWRhdGEobWV0YWRhdGFfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0aGF0IGhhdmUgY2hhbmdlZC4gZ2V0TWV0YWRhdGEKLSAgICAgICAgLy8gYWxzbyBhY2Nlc3MgbU1ldGFkYXRhVXBkYXRlZCBhbmQgY2xlYXJzIGl0LgotICAgICAgICBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZXRhZGF0YV90eXBlKTsKLSAgICB9Ci0KICAgICBib29sIHNlbmQgPSB0cnVlOwogICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CiAKQEAgLTE0MTgsNyArMTEwOSw4IEBACiB9CiAKIC8vIE1vZHVsYXIgRFJNCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZURybSgKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpIHsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgogICAgIEFMT0dEKCJwcmVwYXJlRHJtOiB1dWlkOiAlcCAgZHJtU2Vzc2lvbklkOiAlcCglenUpIiwgdXVpZCwKICAgICAgICAgICAgIGRybVNlc3Npb25JZC5hcnJheSgpLCBkcm1TZXNzaW9uSWQuc2l6ZSgpKTsKQEAgLTE0MzIsOCArMTEyNCwxMCBAQAogICAgIC8vIGNvbXBsZXRlZCkgc28gdGhlIHN0YXRlIGNoYW5nZSB0byAicHJlcGFyZWQiIG1pZ2h0IG5vdCBoYXZlIGhhcHBlbmVkIHlldCAoZS5nLiwgYnVmZmVyaW5nKS4KICAgICAvLyBTdGlsbCwgd2UgY2FuIGFsbG93IHByZXBhcmVEcm0gZm9yIHRoZSB1c2UgY2FzZSBvZiBiZWluZyBjYWxsZWQgaW4gT25Ecm1JbmZvTGlzdGVuZXIuCiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUklORyB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybSBpcyBjYWxsZWQgaW4gdGhlIHdyb25nIHN0YXRlICglZCkuIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgQUxPR1coInByZXBhcmVEcm0oJWxsZCkgY2FsbGVkIGluIG5vbi1wcmVwYXJlIHN0YXRlKCVkKSIsIChsb25nIGxvbmcpc3JjSWQsIG1DdXJyZW50U3RhdGUpOworICAgICAgICBpZiAoc3JjSWQgPT0gbVNyY0lkKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZHJtU2Vzc2lvbklkLmlzRW1wdHkoKSkgewpAQCAtMTQ0Miw3ICsxMTM2LDcgQEAKICAgICB9CiAKICAgICAvLyBQYXNzaW5nIGRvd24gdG8gbWVkaWFzZXJ2ZXIgbWFpbmx5IGZvciBjcmVhdGluZyB0aGUgY3J5cHRvCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLCAicHJlcGFyZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7CiAKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgpAQCAtMTQ1MSw3ICsxMTQ1LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE0NjYsNyArMTE2MCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicmVsZWFzZURybTogbWVkaWFzZXJ2ZXI6OnJlbGVhc2VEcm0gcmV0OiAlZCIsIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTQ3OSwzNiArMTE3Myw0MCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Citqb2JqZWN0IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZDogYXVkaW8gc2luayBub3QgaW5pdCIpOwotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZUlkOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZSgpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGxpc3RlbmVyKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IDliM2FhZDIuLjBmNjliMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTEsNiArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAKICAgICBzcmNzOiBbCisgICAgICAgICJKTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIiwKICAgICAgICAgIkpXYWtlTG9jay5jcHAiLAogICAgICAgICAiR2VuZXJpY1NvdXJjZTIuY3BwIiwKICAgICAgICAgIkhUVFBMaXZlU291cmNlMi5jcHAiLApAQCAtMjgsNiArMjksOCBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTQ4LDEzICs1MSwxNiBAQAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCmluZGV4IDE5NmIxMDMuLjk1NTI1ODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCkBAIC0yMSwzMCArMjEsMTkgQEAKICNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg5LDggKzc4LDYgQEAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzZXREYXRhU291cmNlKCkgewogICAgIEFMT0dWKCJyZXNldERhdGFTb3VyY2UiKTsKIAotICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwotICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CiAgICAgbURpc2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgIG1VcmkuY2xlYXIoKTsKICAgICBtVXJpSGVhZGVycy5jbGVhcigpOwpAQCAtMTEwLDcgKzk3LDYgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTExOCw3ICsxMDQsNiBAQAogCiAgICAgcmVzZXREYXRhU291cmNlKCk7CiAKLSAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKICAgICBtVXJpID0gdXJsOwogCiAgICAgaWYgKGhlYWRlcnMpIHsKQEAgLTE1MSw3ICsxMzYsNyBAQAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIHNvdXJjZS5nZXQoKSk7CiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoc291cmNlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2MiwyNCArMTQ3LDIxIEBACiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKICAgICBtRXh0cmFjdG9yID0gbmV3IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX25ldygpKTsKLSAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMIHx8IG1GZCAhPSAtMSk7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgIENIRUNLKG1GZCA+PTAgfHwgbURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpOworICAgIHNwPEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyPiBhU291cmNlV3JhcHBlciA9IG1EYXRhU291cmNlV3JhcHBlcjsKICAgICBjb25zdCBpbnQgZmQgPSBtRmQ7Ci0gICAgY29uc3QgaW50NjRfdCBvZmZzZXQgPSBtT2Zmc2V0OwotICAgIGNvbnN0IGludDY0X3QgbGVuZ3RoID0gbUxlbmd0aDsKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgZGF0YSBzb3VyY2UgaXMgbm90IHJlbGlhYmxlLgogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoZGF0YVNvdXJjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1EYXRhU291cmNlV3JhcHBlciA9IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihkYXRhU291cmNlKTsKLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CisgICAgaWYgKGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG1PZmZzZXQsIG1MZW5ndGgpOwogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgZmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgZmFpbGVkIHRvIHNldCBleHRyYWN0b3IgZGF0YSBzb3VyY2UhIik7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTkxLDEwICsxNzMsOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwogICAgIG1GaWxlTWV0YSA9IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKG1FeHRyYWN0b3ItPmdldEZvcm1hdCgpKTsKKyAgICBtTG9jay5sb2NrKCk7CiAgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CiAgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKQEAgLTIxNSwxMCArMTk1LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiB0cmFja0V4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgICAgICBpZiAoYVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoYVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG1PZmZzZXQsIG1MZW5ndGgpOwogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKQEAgLTMzMCwxOSArMzEwLDE5IEBACiAgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwogICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CiAgICAgfQotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOworICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXItPmNsb3NlKCk7CiAgICAgfQogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmM6IChsb29wZXI6ICVkKSIsIChtTG9vcGVyICE9IE5VTEwpKTsKIAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoImdlbmVyaWMyIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCiAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOwpAQCAtMzUxLDU5ICszMzEsNDUgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIHN0YXJ0VGltZVVzKTsKKwogICAgIG1zZy0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogbURhdGFTb3VyY2U6ICVkIiwgKG1EYXRhU291cmNlICE9IE5VTEwpKTsKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25QcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcykgeworICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogbUZkICVkIG1VcmkgJXMgbURhdGFTb3VyY2VXcmFwcGVyOiAlcCIsCisgICAgICAgICAgICBtRmQsIG1VcmkuY19zdHIoKSwgbURhdGFTb3VyY2VXcmFwcGVyLmdldCgpKTsKIAotICAgIC8vIGRlbGF5ZWQgZGF0YSBzb3VyY2UgY3JlYXRpb24KLSAgICBpZiAobURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAvLyBzZXQgdG8gZmFsc2UgZmlyc3QsIGlmIHRoZSBleHRyYWN0b3IKLSAgICAgICAgLy8gY29tZXMgYmFjayBhcyBzZWN1cmUsIHNldCBpdCB0byB0cnVlIHRoZW4uCi0gICAgICAgIG1Jc1NlY3VyZSA9IGZhbHNlOwotCi0gICAgICAgIGlmICghbVVyaS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7Ci0gICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlOwotCi0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KSkgewotICAgICAgICAgICAgICAgIG1IdHRwU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChtSHR0cFNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHAgc291cmNlISIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBjb25uZWN0aW9uIGhhcyBzb21lIGlzc3VlLgotICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKAotICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOwotICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwotICAgICAgICAgICAgfQorICAgIGlmICghbVVyaS5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgc2l6ZV90IG51bWhlYWRlcnMgPSBtVXJpSGVhZGVycy5zaXplKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKiprZXlfdmFsdWVzID0gbnVtaGVhZGVycyA/IG5ldyBjb25zdCBjaGFyICpbbnVtaGVhZGVycyAqIDJdIDogTlVMTDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgICAgIGtleV92YWx1ZXNbaSAqIDJdID0gbVVyaUhlYWRlcnMua2V5QXQoaSkuY19zdHIoKTsKKyAgICAgICAgICAgIGtleV92YWx1ZXNbaSAqIDIgKyAxXSA9ICBtVXJpSGVhZGVycy52YWx1ZUF0KGkpLmNfc3RyKCk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobUZkID09IC0xICYmIG1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOwotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlICphU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkodXJpLCBudW1oZWFkZXJzLCBrZXlfdmFsdWVzKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBhU291cmNlID8gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGFTb3VyY2UpIDogTlVMTDsKKyAgICAgICAgZGVsZXRlW10ga2V5X3ZhbHVlczsKKyAgICAgICAgLy8gRm9yIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgZW5vdWdoCisgICAgICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgorICAgICAgICBtSXNTdHJlYW1pbmcgPSAhc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpOwogICAgIH0KIAotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBudWxscHRyICYmIG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7CisgICAgaWYgKG1EaXNjb25uZWN0ZWQgfHwgKG1GZCA8IDAgJiYgbURhdGFTb3VyY2VXcmFwcGVyID09IE5VTEwpKSB7CisgICAgICAgIEFMT0dFKCJtRGlzY29ubmVjdGVkKCVkKSBvciBGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIsIG1EaXNjb25uZWN0ZWQpOworICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKLSAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KLSAgICBtSXNTdHJlYW1pbmcgPSAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKLQogICAgIC8vIGluaXQgZXh0cmFjdG9yIGZyb20gZGF0YSBzb3VyY2UKICAgICBzdGF0dXNfdCBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKQEAgLTQzMCw2ICszOTYsNyBAQAogICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKICAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOwogCisgICAgZG9TZWVrKHN0YXJ0VGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUKTsKICAgICBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKIAogICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogRG9uZSIpOwpAQCAtNDM5LDggKzQwNiw4IEBACiAgICAgQUxPR1YoImZpbmlzaFByZXBhcmVBc3luYyIpOwogCiAgICAgaWYgKG1Jc1N0cmVhbWluZykgewotICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CiAgICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOworICAgICAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKQEAgLTQ1Nyw5ICs0MjQsNyBAQAogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLmNsZWFyKCk7CiAKICAgICAgICAgbUJpdHJhdGUgPSAtMTsKICAgICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7CkBAIC00OTksNTMgKzQ2NCwyNyBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKLSAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOwogICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKICAgICB9Ci0KLSAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXItPmNsb3NlKCk7CiAgICAgfQotCi0gICAgbURhdGFTb3VyY2VXcmFwcGVyID0gTlVMTDsKLQogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpmZWVkTW9yZVRTRGF0YSgpIHsKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2VuZENhY2hlU3RhdHMoKSB7Ci0gICAgaW50MzJfdCBrYnBzID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2FjaGVTdGF0cyk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJhbmR3aWR0aCIsIGticHMpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci19Ci0KIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgIGNhc2Uga1doYXRQcmVwYXJlQXN5bmM6CiAgICAgICB7Ci0gICAgICAgICAgb25QcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKHN0YXJ0VGltZVVzKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKQEAgLTgzNSw4ICs3NzQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKICAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKQEAgLTEzNDksNiArMTI4NiwxMSBAQAogICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gY3J5cHRJbmZvID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVDcnlwdG9JbmZvKCk7CisgICAgICAgIGlmIChjcnlwdEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgbWV0YS0+c2V0T2JqZWN0KCJjcnlwdEluZm8iLCBjcnlwdEluZm8pOworICAgICAgICB9CisKICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKIAogICAgICAgICBpZiAobnVtQnVmZmVycyA9PSAwICYmIGFjdHVhbFRpbWVVcyAhPSBudWxscHRyKSB7CkBAIC0xMzkyLDcgKzEzMzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKQEAgLTE0NDQsNDcgKzEzODUsMzEgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwotICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICAgICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCisgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwogICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7Ci0gICAgc3NpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CiAKLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gfGJpdHJhdGV8IHVzZXMgYml0cy9zZWNvbmQgdW5pdCwgd2hpbGUgc2l6ZSBpcyBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yOworICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZXh0cmFjdG9yID0gbVZpZGVvVHJhY2subUV4dHJhY3RvcjsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBleHRyYWN0b3IgPSBtQXVkaW9UcmFjay5tRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAoZXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2FjaGVkRHVyYXRpb24oKTsKICAgICB9CiAKICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwbGwpIHsKLSAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMGxsKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlU2l6ZSgpOworICAgICAgICBpZiAoc2FtcGxlU2l6ZSA+PSAwbGwpIHsKICAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOwogICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewpAQCAtMTQ5Miw5ICsxNDE3LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZER1cmF0aW9uVXMgJS4xZiBzZWMiLCBjYWNoZWREdXJhdGlvblVzIC8gMTAwMDAwMC4wZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyIpOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKICAgICB9CiAKICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKQEAgLTE1OTEsMTUgKzE1MTgsMjAgQEAKICAgICAgICAgcmV0dXJuIE9LOyAvLyBzb3VyY2Ugd2l0aG91dCBEUk0gaW5mbwogICAgIH0KIAotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbyk7Ci0gICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpZHJtSW5mb0J1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBzdGF0dXNfdCByZXQgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbywgJnBsYXllck1zZyk7CisgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgaWYgKGRybUluZm9CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IFVuZXhwZWN0ZWQgcGFyY2VsIHNpemU6IDAiKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IGZhaWxlZCB0byByZXRyaXZlIERybUluZm8gJWQiLCByZXQpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWZmZXIpOworICAgIGludCBzaXplID0gcGxheWVyTXNnLkJ5dGVTaXplKCk7CisgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHBsYXllck1zZy5TZXJpYWxpemVUb0FycmF5KGRybUluZm9CdWYtPmRhdGEoKSwgc2l6ZSk7CisgICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgbm90aWZ5RHJtSW5mbyhkcm1JbmZvQnVmKTsKIAogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAppbmRleCA5YmM1MTgyLi5hZGUxYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCkBAIC0zNywxMSArMzcsOSBAQAogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhU291cmNlOwotc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUNsb2NrOwotc3RydWN0IE51Q2FjaGVkU291cmNlMjsKIAogc3RydWN0IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTIgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIC8vIE1vZHVsYXIgRFJNCkBAIC01MCw3ICs0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNjIsNyArNTksNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwpAQCAtMTUxLDcgKzE0OCw2IEBACiAgICAgYm9vbCBtSXNTdHJlYW1pbmc7CiAgICAgdWlkX3QgbVVJRDsKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVXJpOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOwogICAgIGludCBtRmQ7CkBAIC0xNTksOSArMTU1LDYgQEAKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAKICAgICBib29sIG1EaXNjb25uZWN0ZWQ7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwotICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CiAgICAgc3A8QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI+IG1EYXRhU291cmNlV3JhcHBlcjsKICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBtRXh0cmFjdG9yOwpAQCAtMTk0LDcgKzE4Nyw3IEBACiAgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogCi0gICAgdm9pZCBvblByZXBhcmVBc3luYygpOworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2b2lkIGZldGNoVGV4dERhdGEoCiAgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCkBAIC0yMzIsOCArMjI1LDYgQEAKICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOwogICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CiAKLSAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7Ci0KICAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0X2woYm9vbCBhdWRpbyk7CiAgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKICAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKaW5kZXggOGVkYmNiZi4uZTUzOTAwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcApAQCAtOTksMTAgKzk5LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3QgLyogc3RhcnRUaW1lVXMgKi8pIHsKICAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUyIik7CiAgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKaW5kZXggOTdkMzY1My4uOGZjNzFlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzAzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWFQbGF5ZXIyVXRpbHMiCisKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkTWluRHVyYXRpb25TZWMgPSA2MDsKKworLy8gc3RhdGljCitib29sIEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBpZiAoaGFzVmlkZW8gfHwgc3RyZWFtVHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIGlmIChPSyAhPSBnZXRBdWRpb09mZmxvYWRJbmZvKG1ldGEsIGhhc1ZpZGVvLCBpc1N0cmVhbWluZywgc3RyZWFtVHlwZSwgJmluZm8pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaW5mby5kdXJhdGlvbl91cyA8IGtPZmZsb2FkTWluRHVyYXRpb25TZWMgKiAxMDAwMDAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGF1ZGlvRm9ybWF0ID0gYXVkaW9Gb3JtYXRGcm9tTmF0aXZlKGluZm8uZm9ybWF0KTsKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrID0gb3V0Q2hhbm5lbE1hc2tGcm9tTmF0aXZlKGluZm8uY2hhbm5lbF9tYXNrKTsKKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gRU5DT0RJTkdfSU5WQUxJRCB8fCBjaGFubmVsTWFzayA9PSBDSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3Mgak1QMlV0aWxzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyVXRpbHMiKTsKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoCisgICAgICAgICAgICBqTVAyVXRpbHNDbHMsICJpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQiLCAiKElJSSlaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCwgYXVkaW9Gb3JtYXQsIGluZm8uc2FtcGxlX3JhdGUsIGNoYW5uZWxNYXNrKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZDQzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCisjZGVmaW5lIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJhbmRyb2lkX21lZGlhX0F1ZGlvRm9ybWF0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYVBsYXllcjJVdGlscyB7CisgICAgc3RhdGljIGJvb2wgaXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLCBib29sIGlzU3RyZWFtaW5nLAorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCmluZGV4IGM5YTEwNzEuLjk4M2Q3N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKQEAgLTIwLDU1ICsyMCw1MCBAQAogCiAjaW5jbHVkZSAiSldha2VMb2NrLmgiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+Ci0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vL1RPRE86IHVzZSBKQVZBIFBvd2VyTWFuYWdlciwgaW5zdGVhZCBvZiBiaW5kZXIKLUpXYWtlTG9jazo6Sldha2VMb2NrKCkgOgotICAgIG1Qb3dlck1hbmFnZXIoTlVMTCksCi0gICAgbVdha2VMb2NrVG9rZW4oTlVMTCksCitKV2FrZUxvY2s6OkpXYWtlTG9jayhjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCkgOgogICAgIG1XYWtlTG9ja0NvdW50KDApLAotICAgIG1EZWF0aFJlY2lwaWVudChuZXcgUE1EZWF0aFJlY2lwaWVudCh0aGlzKSkge30KKyAgICBtV2FrZUxvY2soTlVMTCksCisgICAgbUNvbnRleHQoY29udGV4dCkge30KIAogSldha2VMb2NrOjp+Sldha2VMb2NrKCkgewotICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7Ci0gICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgIH0KLSAgICBjbGVhclBvd2VyTWFuYWdlcigpOworICAgIGNsZWFySmF2YVdha2VMb2NrKCk7CiB9CiAKIGJvb2wgSldha2VMb2NrOjphY3F1aXJlKCkgewogICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuID09IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoInBvd2VyIikpOwotICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgdGhlIHBvd2VyIG1hbmFnZXIgc2VydmljZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKLSAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtV2FrZUxvY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIGpDb250ZXh0Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvY29udGVudC9Db250ZXh0Iik7CisgICAgICAgICAgICBqY2xhc3MgalBvd2VyTWFuYWdlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciIpOworCisgICAgICAgICAgICBqbWV0aG9kSUQgakdldFN5c3RlbVNlcnZpY2UgPSBlbnYtPkdldE1ldGhvZElEKGpDb250ZXh0Q2xzLAorICAgICAgICAgICAgICAgICAgICAiZ2V0U3lzdGVtU2VydmljZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOworICAgICAgICAgICAgam9iamVjdCBqYXZhUG93ZXJNYW5hZ2VyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1Db250ZXh0LT5nZXRKT2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgIGpHZXRTeXN0ZW1TZXJ2aWNlLCBlbnYtPk5ld1N0cmluZ1VURigicG93ZXIiKSk7CisKKyAgICAgICAgICAgIGpmaWVsZElEIGpQQVJUSUFMX1dBS0VfTE9DSyA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqUG93ZXJNYW5hZ2VyQ2xzLAorICAgICAgICAgICAgICAgICAgICAiUEFSVElBTF9XQUtFX0xPQ0siLCAiSSIpOworICAgICAgICAgICAgamludCBQQVJUSUFMX1dBS0VfTE9DSyA9IGVudi0+R2V0U3RhdGljSW50RmllbGQoalBvd2VyTWFuYWdlckNscywgalBBUlRJQUxfV0FLRV9MT0NLKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpOZXdXYWtlTG9jayA9IGVudi0+R2V0TWV0aG9kSUQoalBvd2VyTWFuYWdlckNscywKKyAgICAgICAgICAgICAgICAgICAgIm5ld1dha2VMb2NrIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jazsiKTsKKyAgICAgICAgICAgIGpvYmplY3QgamF2YVdha2VMb2NrID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGphdmFQb3dlck1hbmFnZXJPYmosCisgICAgICAgICAgICAgICAgICAgIGpOZXdXYWtlTG9jaywgUEFSVElBTF9XQUtFX0xPQ0ssIGVudi0+TmV3U3RyaW5nVVRGKCJKV2FrZUxvY2siKSk7CisgICAgICAgICAgICBtV2FrZUxvY2sgPSBuZXcgSk9iamVjdEhvbGRlcihqYXZhV2FrZUxvY2spOworICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihqYXZhUG93ZXJNYW5hZ2VyT2JqKTsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamF2YVdha2VMb2NrKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiSldha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwotICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIHdha2VMb2NrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrIik7CisgICAgICAgICAgICBqbWV0aG9kSUQgakFjcXVpcmUgPSBlbnYtPkdldE1ldGhvZElEKHdha2VMb2NrQ2xzLCAiYWNxdWlyZSIsICIoKVYiKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobVdha2VMb2NrLT5nZXRKT2JqZWN0KCksIGpBY3F1aXJlKTsKKyAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CkBAIC04NiwyNSArODEsMTcgQEAKICAgICAgICAgbVdha2VMb2NrQ291bnQgPSAxOwogICAgIH0KICAgICBpZiAoLS1tV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCAvKiBmbGFncyAqLyk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3Mgd2FrZUxvY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2siKTsKKyAgICAgICAgICAgIGptZXRob2RJRCBqUmVsZWFzZSA9IGVudi0+R2V0TWV0aG9kSUQod2FrZUxvY2tDbHMsICJyZWxlYXNlIiwgIigpViIpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtV2FrZUxvY2stPmdldEpPYmplY3QoKSwgalJlbGVhc2UpOwogICAgICAgICB9Ci0gICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQogfQogCi12b2lkIEpXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7Cit2b2lkIEpXYWtlTG9jazo6Y2xlYXJKYXZhV2FrZUxvY2soKSB7CiAgICAgcmVsZWFzZSh0cnVlKTsKLSAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgSldha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKLSAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOwotICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCmluZGV4IGVhY2U4N2UuLjM2YzU0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBKX1dBS0VMT0NLX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjYsNyArMjYsNyBAQAogY2xhc3MgSldha2VMb2NrIDogcHVibGljIFJlZkJhc2UgewogCiBwdWJsaWM6Ci0gICAgSldha2VMb2NrKCk7CisgICAgSldha2VMb2NrKGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIC8vIE5PVEU6IGFjcXVpcmUgYW5kIHJlbGVhc2UgYXJlIG5vdCB0aHJlYWQgc2FmZQogCkBAIC0zNywyOCArMzcsMTEgQEAKICAgICB2aXJ0dWFsIH5KV2FrZUxvY2soKTsKIAogcHJpdmF0ZToKLSAgICBzcDxJUG93ZXJNYW5hZ2VyPiBtUG93ZXJNYW5hZ2VyOwotICAgIHNwPElCaW5kZXI+ICAgICAgIG1XYWtlTG9ja1Rva2VuOwotICAgIHVpbnQzMl90ICAgICAgICAgIG1XYWtlTG9ja0NvdW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50OworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1XYWtlTG9jazsKKyAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiBtQ29udGV4dDsKIAotICAgIGNsYXNzIFBNRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgUE1EZWF0aFJlY2lwaWVudChKV2FrZUxvY2sgKndha2VMb2NrKSA6IG1XYWtlTG9jayh3YWtlTG9jaykge30KLSAgICAgICAgdmlydHVhbCB+UE1EZWF0aFJlY2lwaWVudCgpIHt9Ci0KLSAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKLSAgICAgICAgUE1EZWF0aFJlY2lwaWVudCYgb3BlcmF0b3I9IChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7Ci0KLSAgICAgICAgSldha2VMb2NrICptV2FrZUxvY2s7Ci0gICAgfTsKLQotICAgIGNvbnN0IHNwPFBNRGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIHZvaWQgY2xlYXJQb3dlck1hbmFnZXIoKTsKKyAgICB2b2lkIGNsZWFySmF2YVdha2VMb2NrKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKV2FrZUxvY2spOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcAppbmRleCA4MzdiYmM4Li5kNjA4ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCiAKICNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZTIuaCIKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKICNpbmNsdWRlICJOdVBsYXllcjJDQ0RlY29kZXIuaCIKICNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKQEAgLTMzLDcgKzM0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKICNpbmNsdWRlICJSVFNQU291cmNlMi5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UyLmgiCi0jaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgorI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMyLmgiCiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIApAQCAtMjA4LDE1ICsyMDksMTYgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTnVQbGF5ZXIyOjpOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKQorTnVQbGF5ZXIyOjpOdVBsYXllcjIoCisgICAgICAgIHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpCiAgICAgOiBtUElEKHBpZCksCiAgICAgICBtVUlEKHVpZCksCiAgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKLSAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtRU9TTW9uaXRvckdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAogICAgICAgbVByZXZpb3VzU2Vla1RpbWVVcygwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCkBAIC0yNDAsOCArMjQyLDcgQEAKICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgbVBhdXNlZEJ5Q2xpZW50KHRydWUpLAogICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyhmYWxzZSksCi0gICAgICBtSXNEcm1Qcm90ZWN0ZWQoZmFsc2UpLAotICAgICAgbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSkgeworICAgICAgbUNvbnRleHQoY29udGV4dCkgewogICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7CiAgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CiB9CkBAIC0zMDksNyArMzEwLDcgQEAKICAgICAgICAgICAgICAgICBzcDxHZW5lcmljU291cmNlMj4gZ2VuZXJpY1NvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZTIobm90aWZ5LCBtVUlELCBtTWVkaWFDbG9jayk7CiAKLSAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOworICAgICAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CkBAIC0zOTMsMTEgKzM5NCwxMyBAQAogICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCiAgICAgKi8KIAotICAgIG1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworICAgIG1DdXJyZW50U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyAqIDEwMDApOworICAgIG1zZy0+c2V0SW50NjQoImVuZFRpbWVVcyIsIGRzZC0+bUVuZFBvc2l0aW9uTXMgKiAxMDAwKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDE1LDExICs0MTgsMTMgQEAKICAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgogICAgICovCiAKLSAgICBtTmV4dERhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisgICAgbU5leHRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVOZXh0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBkc2QtPm1TdGFydFBvc2l0aW9uTXMgKiAxMDAwKTsKKyAgICBtc2ctPnNldEludDY0KCJlbmRUaW1lVXMiLCBkc2QtPm1FbmRQb3NpdGlvbk1zICogMTAwMCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQ4Nyw3ICs0OTIsNyBAQAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CiAgICAgLy8gZG8gc29tZSBjdXJzb3J5IHZhbGlkYXRpb24gb2YgdGhlIHNldHRpbmdzIGhlcmUuIGF1ZGlvIG1vZGVzIGFyZQogICAgIC8vIG9ubHkgdmFsaWRhdGVkIHdoZW4gc2V0IG9uIHRoZSBhdWRpb3NpbmsuCi0gICAgIGlmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOKQorICAgICBpZiAocmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KICAgICAgICAgICAgIHx8IHJhdGUubVNwZWVkID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYCiAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTgogICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpIHsKQEAgLTU1NCw3ICs1NTksNyBAQAogICAgIHNwPFNvdXJjZT4gc291cmNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgc291cmNlID0gbVNvdXJjZTsKKyAgICAgICAgc291cmNlID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2U7CiAgICAgfQogCiAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CkBAIC01ODQsOSArNTg5LDEzIEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXIyOjpyZXdpbmQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJld2luZCwgdGhpcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CiAKIHZvaWQgTnVQbGF5ZXIyOjp3cml0ZVRyYWNrSW5mbygKLSAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKKyAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CiAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJOVUxMIGZvcm1hdCIpOwogICAgICAgICByZXR1cm47CkBAIC02MTksMTAgKzYyOCw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gd3JpdGUgc29tZXRoaW5nIG5vbi16ZXJvCi0gICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tUeXBlKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nLmNfc3RyKCkpKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tUeXBlKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfc3RyaW5nX3ZhbHVlKG1pbWUuY19zdHIoKSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZShsYW5nLmNfc3RyKCkpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOwpAQCAtNjMwLDI3ICs2MzgsMzAgQEAKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKIAotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0F1dG8pOwotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RlZmF1bHQpOwotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0ZvcmNlZCk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0F1dG8pOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNEZWZhdWx0KTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzRm9yY2VkKTsKICAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworCiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U2V0RGF0YVNvdXJjZToKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0RGF0YVNvdXJjZSIpOwogCi0gICAgICAgICAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtU3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcykpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJlbmRUaW1lVXMiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdFNldERhdGFTb3VyY2UsIHNvdXJjZSBzaG91bGQgbm90IGJlIE5VTEwiKTsKQEAgLTY1OSw3ICs2NzAsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobVNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBlcnIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY3Myw5ICs2ODQsMTEgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTcmNJZCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgbU5leHRTb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJm1OZXh0U291cmNlSW5mby5tU3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZW5kVGltZVVzIiwgJm1OZXh0U291cmNlSW5mby5tRW5kVGltZVVzKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZS0+cHJlcGFyZUFzeW5jKG1OZXh0U291cmNlSW5mby5tU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQpAQCAtNjg4LDcgKzcwMSw3IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKICAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKLSAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNyY0lkKSB7CisgICAgICAgICAgICBpZiAoc3JjSWQgIT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgewogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC03MDksNiArNzIyLDIyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRFT1NNb25pdG9yOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1FT1NNb25pdG9yR2VuZXJhdGlvbiB8fCByZWFzb24gIT0gTWVkaWFDbG9jazo6VElNRVJfUkVBU09OX1JFQUNIRUQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsgIC8vIHN0YWxlIG9yIHJlc2V0CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdEVPU01vbml0b3IiKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRHZXRCdWZmZXJpbmdTZXR0aW5nczoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CkBAIC03MTcsOCArNzQ2LDggQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzIik7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTc0MCw4ICs3NjksOCBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQpAQCAtNzU1LDcgKzc4NCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJvbk1lc3NhZ2VSZWNlaXZlZCBrV2hhdFByZXBhcmUiKTsKIAotICAgICAgICAgICAgbVNvdXJjZS0+cHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cHJlcGFyZUFzeW5jKG1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNzY0LDEyICs3OTMsMTYgQEAKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBQYXJjZWwqIHJlcGx5OworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKKworICAgICAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CiAKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOwpAQCAtNzc4LDExICs4MTEsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKyAgICAgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CiAKICAgICAgICAgICAgIC8vIHdyaXRlIGluYmFuZCB0cmFja3MKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5iYW5kVHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCkBAIC03OTcsMjAgKzgzMCwzNSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgKGludDY0X3QqKSZzcmNJZCkpOworCisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgLy8gVE9ETzogdXNlIGNvcnJlY3Qgc291cmNlIGluZm8gYmFzZWQgb24gc3JjSWQuCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gLTE7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrID09IC0xICYmIG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ0NEZWNvZGVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgKz0gaW5iYW5kVHJhY2tzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoc2VsZWN0ZWRUcmFjayk7CisKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIApAQCAtODI1LDE4ICs4NzMsMjEgQEAKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwogICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CiAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgKGludDY0X3QqKSZzcmNJZCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKICAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKQEAgLTg0NCwxMSArODk1LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdCAmJiBlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5mby0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewpAQCAtODgxLDEwICs5MzIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgewogICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTkwMSwxMyArOTUyLDE1IEBACiAKICAgICAgICAgICAgIEFMT0dEKCJvblNldFZpZGVvU3VyZmFjZSglcCwgJXMgdmlkZW8gZGVjb2RlcikiLAogICAgICAgICAgICAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpLAotICAgICAgICAgICAgICAgICAgICAobVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpID8gImhhdmUiIDogIm5vIik7CiAKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbVNvdXJjZS0+Z2V0Rm9ybWF0IGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0Ci0gICAgICAgICAgICAvLyBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgotICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0CisgICAgICAgICAgICAvLyBiZWNhdXNlIE51UGxheWVyMiBtaWdodCBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgorICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBtVmlkZW9EZWNvZGVyJ3MgbU5hdGl2ZVdpbmRvdyBpcyBhbHdheXMgbm9uLW51bGwKICAgICAgICAgICAgICAgICAgICAgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyLT5zZXRWaWRlb1N1cmZhY2Uobnd3KSA9PSBPSykpIHsKICAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShud3cpOwpAQCAtOTcxLDEwICsxMDI0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTk4OCw4ICsxMDQxLDcgQEAKICAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIC8vIEF1ZGlvU2luayBhbGxvd3Mgb25seSAxLmYgYW5kIDAuZiBmb3Igb2ZmbG9hZCBtb2RlLgogICAgICAgICAgICAgICAgIC8vIEZvciBvdGhlciBzcGVlZCwgc3dpdGNoIHRvIG5vbi1vZmZsb2FkIG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgIT0gMS5mKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggIT0gMS5mKSkgeworICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIChyYXRlLm1TcGVlZCAhPSAxLmYgfHwgcmF0ZS5tUGl0Y2ggIT0gMS5mKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwogICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvblVzID0gbVByZXZpb3VzU2Vla1RpbWVVczsKQEAgLTEwMTIsMzYgKzEwNjQsMTUgQEAKICAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgewotICAgICAgICAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYWxsIG90aGVyIHNldHRpbmdzICh1c2luZyBub24tcGF1c2VkIHNwZWVkKQotICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcmVzdG9yZSB0aGVtIG9uIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIHJhdGUubVNwZWVkICE9IDAuZiAqLwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3VtZSB5ZXQgaWYgdGhlIHNvdXJjZSBpcyBzdGlsbCBidWZmZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEZvckJ1ZmZlcmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXBhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwpAQCAtMTA2MSw5ICsxMDkyLDYgQEAKICAgICAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSByZW5kZXJlciwgYXMgaXQgbWF5IGJlCiAgICAgICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCA9IDAuZjsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC0xMTU3LDIxICsxMTg1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgZm91bmQgYW55dGhpbmcgcGxheWFibGUuCiAKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyID09IE5VTEwgJiYgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBjdXJyZW50bHkgZGVjb2RpbmcgYW55dGhpbmcgKG5vIGF1ZGlvIG9yCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvIHRyYWNrcyBmb3VuZCkgYW5kIHdlIGp1c3QgcmFuIG91dCBvZiBpbnB1dCBkYXRhLgogCiAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI1MywxMyArMTI4MiwxNCBAQAogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKIAogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAKICAgICAgICAgICAgICAgICBzZXRWaWRlb1NjYWxpbmdNb2RlKG1WaWRlb1NjYWxpbmdNb2RlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUobVNyY0lkLCBpbnB1dEZvcm1hdCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMgc2h1dGRvd24gY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwpAQCAtMTI2Nyw2ICsxMjk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdBdWRpbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTEzMjMsMjggKzEzNTQsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTCB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGF1ZGlvIHRyYWNrIGhhcyBlcnJvci4gVmlkZW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzOTQsMTIgKzE0MzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmaW5hbFJlc3VsdCk7CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKChtQXVkaW9FT1MgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1WaWRlb0VPUyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CkBAIC0xNDIwLDEwICsxNDYzLDExIEBACiAgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9UZWFyRG93bikgewogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CkBAIC0xNDc2LDcgKzE1MjAsNyBAQAogICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfTk9USUZZX1RJTUUsIHRpbWVyVXMsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ5NSwyMCArMTUzOSwyMCBAQAogICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHNlZWtUaW1lVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKQEAgLTE1MjcsMTAgKzE1NzEsNDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFJld2luZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0UmV3aW5kIik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUOworCisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAorICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfRkxVU0ggLyogdmlkZW8gKi8pKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKSk7CisKKyAgICAgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgICAgICAvLyBzdGFydCBwdWxsaW5nIHN0YWxlIGRhdGEgdG9vIHNvb24uCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG9uU3RhcnQoZmFsc2UgLyogcGxheSAqLyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1NjEsNyArMTY0NCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2VEcm06CiAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUmVsZWFzZURybSgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKG1zZyk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKQEAgLTE1ODMsOCArMTY2Niw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnJlc3VtZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE2MDIsMTIgKzE2ODUsMTIgQEAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KCkgewotICAgIEFMT0dWKCJvblN0YXJ0OiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwordm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoYm9vbCBwbGF5KSB7CisgICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUN1cnJlbnRTb3VyY2VJbmZvLm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgewogICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOwogICAgIH0KIAogICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTE2MTgsMjIgKzE3MDEsMjMgQEAKIAogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKIAotICAgIGlmIChtU291cmNlLT5pc1JlYWxUaW1lKCkpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgewogICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7CiAgICAgfQogCi0gICAgYm9vbCBoYXNBdWRpbyA9IChtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7Ci0gICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzQXVkaW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc1ZpZGVvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOwogICAgIGlmICghaGFzQXVkaW8gJiYgIWhhc1ZpZGVvKSB7CiAgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSIpOwotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdG9wKCk7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVl9JRighaGFzQXVkaW8sICJubyBtZXRhZGF0YSBmb3IgYXVkaW8gc291cmNlIik7ICAvLyB2aWRlbyBvbmx5IHN0cmVhbQogCi0gICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwogCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKQEAgLTE2NDEsMTEgKzE3MjUsMTIgQEAKICAgICB9CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0KLSAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgICAgICBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAotICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwogICAgICAgICBBTE9HVigib25TdGFydDogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gbm93IHRoYXQgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQuIik7CiAgICAgfQpAQCAtMTY1NywxNyArMTc0MiwxNyBAQAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKLSAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOworICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBtQ29udGV4dCwgZmxhZ3MpOwogICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOwotICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyMlJlbmRlcmVyIik7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgdHJ1ZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhtUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdG9wKCk7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTY3Niw2ICsxNzYxLDEyIEBACiAgICAgICAgIG1SZW5kZXJlci0+c2V0VmlkZW9GcmFtZVJhdGUocmF0ZSk7CiAgICAgfQogCisgICAgYWRkRW5kVGltZU1vbml0b3IoKTsKKyAgICAvLyBSZW5kZXJlciBpcyBjcmVhdGVkIGluIHBhdXNlZCBzdGF0ZS4KKyAgICBpZiAocGxheSkgeworICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgIH0KKwogICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKICAgICB9CkBAIC0xNjg0LDEwICsxNzc1LDIzIEBACiAgICAgfQogCiAgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnN0YXJ0Iik7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJULCAwKTsKIAogICAgIHBvc3RTY2FuU291cmNlcygpOwogfQogCit2b2lkIE51UGxheWVyMjo6YWRkRW5kVGltZU1vbml0b3IoKSB7CisgICAgKyttRU9TTW9uaXRvckdlbmVyYXRpb247CisKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMgPT0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lVXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1NNb25pdG9yLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUVPU01vbml0b3JHZW5lcmF0aW9uKTsKKyAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcyk7Cit9CisKIHZvaWQgTnVQbGF5ZXIyOjpzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CiAgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPT0gMCkgewpAQCAtMTcwOSw3ICsxODEzLDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wUGxheWJhY2tUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCBwbGF5ZWQpOwogCiAgICAgICAgICAgICBpZiAocGxheWVkID4gMCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMobVNyY0lkLCAocGxheWVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCAocGxheWVkKzUwMCkvMTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IDA7CkBAIC0xNzI3LDcgKzE4MzEsOCBAQAogdm9pZCBOdVBsYXllcjI6OnN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgZXhpdGluZ1BsYXliYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwogCi0gICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLCBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKKyAgICBBTE9HVigic3RvcFJlYnVmZmVyVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsCisgICAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CiAKICAgICBpZiAobUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgIT0gMCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwpAQCAtMTczNyw5ICsxODQyLDEwIEBACiAgICAgICAgICAgICBBTE9HVigic3RvcFJlYnVmZmVyaW5nVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcmVidWZmZXJlZCk7CiAKICAgICAgICAgICAgIGlmIChyZWJ1ZmZlcmVkID4gMCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKG1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CiAgICAgICAgICAgICAgICAgaWYgKGV4aXRpbmdQbGF5YmFjaykgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQobVNyY0lkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTc1NSw4ICsxODYxLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnBhdXNlKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKICAgICB9CkBAIC0xODQ2LDcgKzE5NTIsNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAogICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtT2ZmbG9hZEF1ZGlvLCBtU291cmNlLT5pc1N0cmVhbWluZygpKTsKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtT2ZmbG9hZEF1ZGlvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAvLyBBbnkgZmFpbHVyZSB3ZSB0dXJuIG9mZiBtT2ZmbG9hZEF1ZGlvLgogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CkBAIC0xODYzLDYgKzE5NjksNyBAQAogICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CiAgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9EZWNvZGVyLT5wYXVzZSgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTE5MDksNyArMjAxNiw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCkgewotICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE5MTksMTYgKzIwMjYsMTYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwotICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgYm9vbCBjYW5PZmZsb2FkID0gSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE5NTUsNyArMjA2Miw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CiAKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xOTc3LDExICsyMDg0LDExIEBACiAgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKICAgICAgICAgfQogCkBAIC0xOTkxLDYgKzIwOTgsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CisKICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCB0aGlzKTsKICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTIwMDAsMTYgKzIxMDksMTYgQEAKICAgICAgICAgICAgIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShmb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7Ci0gICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXJQYXNzVGhyb3VnaCAgaGFzVmlkZW86ICVkIiwgaGFzVmlkZW8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKGZhbHNlIC8qIG9mZmxvYWQgKi8pOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXIiKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKQEAgLTIwMTksNyArMjEyOCw4IEBACiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigKLSAgICAgICAgICAgICAgICBub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywgbUNDRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgbm90aWZ5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LAorICAgICAgICAgICAgICAgIG1DQ0RlY29kZXIpOwogICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKIAogICAgICAgICAvLyBlbmFibGUgRlJDIGlmIGhpZ2gtcXVhbGl0eSBBViBzeW5jIGlzIHJlcXVlc3RlZCwgZXZlbiBpZiBub3QKQEAgLTIwMzQsMTAgKzIxNDQsMTEgQEAKICAgICAoKmRlY29kZXIpLT5pbml0KCk7CiAKICAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DcnlwdG8pOwotICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyOiBtQ3J5cHRvOiAlcCBpc1NlY3VyZTogJWQiLCBtQ3J5cHRvLmdldCgpLAotICAgICAgICAgICAgICAgIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSAhPSAwKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgiY3J5cHRvIiwgbUN1cnJlbnRTb3VyY2VJbmZvLm1DcnlwdG8pOworICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyOiBtQ3J5cHRvOiAlcCBpc1NlY3VyZTogJWQiLAorICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvLmdldCgpLAorICAgICAgICAgICAgICAgIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CiAgICAgfQogCiAgICAgKCpkZWNvZGVyKS0+Y29uZmlndXJlKGZvcm1hdCk7CkBAIC0yMTU2LDcgKzIyNjcsOCBAQAogICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKK3ZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIGlmIChtRHJpdmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIyNDAsOCArMjM1Miw5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFRyYWNrSW5mbyhpbnQ2NF90IHNyY0lkLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjQ5LDkgKzIzNjIsMTAgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50NjRfdCBzcmNJZCwgaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTIyNjIsOCArMjM3Niw5IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CitzdGF0dXNfdCBOdVBsYXllcjI6OnNlbGVjdFRyYWNrKGludDY0X3Qgc3JjSWQsIHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInNlbGVjdCIsIHNlbGVjdCk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKQEAgLTIyOTUsNiArMjQxMCw4IEBACiAgICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7CiAKICAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtVmlkZW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKICAgICB9CkBAIC0yMzA0LDExICsyNDIxLDExIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworICAgIHJldHVybiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKIH0KIAogZmxvYXQgTnVQbGF5ZXIyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTIzNjYsMTYgKzI0ODMsMTYgQEAKICAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOwogCi0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQogICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAotICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgICJtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgLy8gZXZlcnl0aGluZydzIGZsdXNoZWQsIGNvbnRpbnVlIHBsYXliYWNrLgpAQCAtMjQyMiwxNyArMjUzOSwxMyBAQAogICAgIG1SZW5kZXJlci5jbGVhcigpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9CisgICAgcmVzZXRTb3VyY2VJbmZvKG1DdXJyZW50U291cmNlSW5mbyk7CisgICAgcmVzZXRTb3VyY2VJbmZvKG1OZXh0U291cmNlSW5mbyk7CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NDEsMTQgKzI1NTQsNiBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7CkBAIC0yNDY3LDI1ICsyNTcyLDMxIEBACiAKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgIH0KIAogICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKLSAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOwotICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOwotICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOwotICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgICAgIHByZXZpb3VzU3JjSWQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOworCisgICAgICAgIG1DdXJyZW50U291cmNlSW5mbyA9IG1OZXh0U291cmNlSW5mbzsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvID0gU291cmNlSW5mbygpOworICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNyY0lkID0gfm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDk0LDIyICsyNjA1LDE1IEBACiAgICAgbVJlc2V0dGluZyA9IGZhbHNlOwogICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfQotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBvblN0YXJ0KCk7CisgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKQEAgLTI1MzUsNyArMjYzOSw3IEBACiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1NjcsNyArMjY3MSw3IEBACiB2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgIH0KIH0KIApAQCAtMjU4OSwzNiArMjY5Myw1MCBAQAogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgotICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiVwLCBJZCglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS5nZXQoKSwgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0CisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI2MjcsMTUgKzI3NDUsMTUgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7Ci0gICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisgICAgICAgICAgICBwbGF5ZXJNc2cuUGFyc2VGcm9tQXJyYXkoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwogCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGxheWVyTXNnIHNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBsYXllck1zZyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjY0LDE5ICsyNzgyLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmICgobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGR1cmF0aW9uIHBvbGxpbmcgZm9yIG5leHQgc291cmNlLgorICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4MjcsOCArMjk1Miw4IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKQEAgLTI4MzcsNyArMjk2Miw3IEBACiAKICAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODU2LDM1ICsyOTgxLDMxIEBACiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKGR1cmF0aW9uVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnMyOjpJTl9CQU5EX1RFWFRfM0dQUDsKIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yODkzLDI4ICszMDE0LDI4IEBACiAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKIAotICAgIFBhcmNlbCBwYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpHTE9CQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpMT0NBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwbGF5ZXJNc2cpOwogICAgIH0KIAotICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICBpZiAocGxheWVyTXNnLnZhbHVlc19zaXplKCkgPiAwKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGxheWVyTXNnKTsKICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CiAgICAgfQogfQogCiBjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgewotICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgc3dpdGNoIChtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIApAQCAtMjkzNiw4ICszMDU3LDM0IEBACiAgICAgfQogIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvKiBOdVBsYXllcjI6OmdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQ2NF90IHNyY0lkOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkID09IHNyY0lkKSB7CisgICAgICAgIHJldHVybiAmbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIH0gZWxzZSBpZiAobU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1OZXh0U291cmNlSW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXNldFNvdXJjZUluZm8oTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICZzcmNJbmZvKSB7CisgICAgaWYgKHNyY0luZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICAvLyBNb2R1bGFyIERSTQorICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBzcmNJbmZvLm1DcnlwdG8uZ2V0KCkpOworICAgIHNyY0luZm8ubUNyeXB0by5jbGVhcigpOworICAgIHNyY0luZm8ubUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Cit9CisKIC8vIE1vZHVsYXIgRFJNIGJlZ2luCi1zdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtICIpOwogCkBAIC0yOTQ3LDYgKzMwOTQsNyBAQAogICAgIHVpbnQ4X3QgVVVJRFsxNl07CiAgICAgbWVtY3B5KFVVSUQsIHV1aWQsIHNpemVvZihVVUlEKSk7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IGRybVNlc3Npb25JZDsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInV1aWQiLCAodm9pZCopVVVJRCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCopJnNlc3Npb25JZCk7CiAKQEAgLTI5NjMsMTEgKzMxMTEsMTIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VEcm0gIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZURybSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMjk4OCw4ICszMTM3LDE1IEBACiAgICAgQUxPR0QoIm9uUHJlcGFyZURybSAiKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwgc3RhdHVzKTsKKyAgICBTb3VyY2VJbmZvICpzcmNJbmZvID0gZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhtc2cpOworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNyY0lkID0gc3JjSW5mby0+bVNyY0lkOworICAgIGlmIChzcmNJbmZvLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBObyBzb3VyY2UuIG9uUHJlcGFyZURybSBmYWlsZWQgd2l0aCAlZC4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0zMDAxLDQyICszMTU3LDUwIEBACiAgICAgc3RhdHVzID0gT0s7CiAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgc3RhdHVzID0gc3JjSW5mby0+bVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBBTE9HVigib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIpOworICAgIEFMT0dWKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkubVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiLCAobG9uZyBsb25nKXNyY0lkKTsKIAotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CisgICAgICAgIHNyY0luZm8tPm1DcnlwdG8uY2xlYXIoKTsKICAgICB9CiAKLSAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIG1Jc0RybVByb3RlY3RlZCA9IHRydWU7CisgICAgc3JjSW5mby0+bUNyeXB0byA9IGNyeXB0bzsKKyAgICBzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICBBTE9HRCgib25QcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCiB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOwotCi0gICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTs7CisgICAgaWYgKHNyY0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoIXNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBzcmNJbmZvKCVsbGQpIFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgfQorCisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBzb3VyY2UgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGNyeXB0byBmcm9tIGNvZGVjCi0gICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKKyAgICAgICAgaWYgKHNyY0luZm8tPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjSW5mby0+bVNvdXJjZS0+cmVsZWFzZURybSgpOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzPU9LOwpAQCAtMzA1Nyw5ICszMjIxLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJvblJlbGVhc2VEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9IGVsc2UgeyAgIC8vIG1DcnlwdG8gPT0gTlVMTAorICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CisgICAgfSBlbHNlIHsgICAvLyBzcmNJbmZvLT5tQ3J5cHRvID09IE5VTEwKICAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gVGhlcmUgaXMgbm8gY3J5cHRvLiIpOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMTIxLDQgKzMyODUsMjQgQEAKICAgICBUUkVTUEFTUygpOwogfQogCitOdVBsYXllcjI6OlNvdXJjZUluZm86OlNvdXJjZUluZm8oKQorICAgIDogbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSksCisgICAgICBtU3JjSWQoMCksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtU3RhcnRUaW1lVXMoMCksCisgICAgICBtRW5kVGltZVVzKERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7Cit9CisKK051UGxheWVyMjo6U291cmNlSW5mbyAmIE51UGxheWVyMjo6U291cmNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IE51UGxheWVyMjo6U291cmNlSW5mbyAmb3RoZXIpIHsKKyAgICBtU291cmNlID0gb3RoZXIubVNvdXJjZTsKKyAgICBtQ3J5cHRvID0gb3RoZXIubUNyeXB0bzsKKyAgICBtRGF0YVNvdXJjZVR5cGUgPSAoREFUQV9TT1VSQ0VfVFlQRSlvdGhlci5tRGF0YVNvdXJjZVR5cGU7CisgICAgbVNyY0lkID0gb3RoZXIubVNyY0lkOworICAgIG1Tb3VyY2VGbGFncyA9IG90aGVyLm1Tb3VyY2VGbGFnczsKKyAgICBtU3RhcnRUaW1lVXMgPSBvdGhlci5tU3RhcnRUaW1lVXM7CisgICAgbUVuZFRpbWVVcyA9IG90aGVyLm1FbmRUaW1lVXM7CisgICAgbUlzRHJtUHJvdGVjdGVkID0gb3RoZXIubUlzRHJtUHJvdGVjdGVkOworICAgIHJldHVybiAqdGhpczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCmluZGV4IDk2Zjg1ZjkuLmI4ZmI5ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMjIsNiArMjIsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsNyArNDMsOCBAQAogc3RydWN0IE51UGxheWVyMkRyaXZlcjsKIAogc3RydWN0IE51UGxheWVyMiA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIHZvaWQgc2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcik7CiAKQEAgLTc1LDExICs4MSwxMiBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAogICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCiAgICAgICAgICAgICBib29sIG5lZWROb3RpZnkgPSBmYWxzZSk7CisgICAgdm9pZCByZXdpbmQoKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhpbnQ2NF90IHNyY0lkLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQ2NF90IHNyY0lkLCBpbnQzMl90IHR5cGUsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CiAgICAgdm9pZCBnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKTsKIApAQCAtODcsOCArOTQsOCBAQAogICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IHNyY0lkKTsKIAogICAgIGNvbnN0IGNoYXIgKmdldERhdGFTb3VyY2VUeXBlKCk7CiAKQEAgLTE1MCw2ICsxNTcsMzIgQEAKICAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdzQnVTJywKICAgICAgICAga1doYXRQcmVwYXJlRHJtICAgICAgICAgICAgICAgICA9ICdwRHJtJywKICAgICAgICAga1doYXRSZWxlYXNlRHJtICAgICAgICAgICAgICAgICA9ICdyRHJtJywKKyAgICAgICAga1doYXRSZXdpbmQgICAgICAgICAgICAgICAgICAgICA9ICdyZVdkJywKKyAgICAgICAga1doYXRFT1NNb25pdG9yICAgICAgICAgICAgICAgICA9ICdlb3NNJywKKyAgICB9OworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCisgICAgfSBEQVRBX1NPVVJDRV9UWVBFOworCisgICAgc3RydWN0IFNvdXJjZUluZm8geworICAgICAgICBTb3VyY2VJbmZvKCk7CisgICAgICAgIFNvdXJjZUluZm8gJm9wZXJhdG9yPShjb25zdCBTb3VyY2VJbmZvICYpOworCisgICAgICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKKyAgICAgICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOworICAgICAgICBpbnQ2NF90IG1TcmNJZDsKKyAgICAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtRW5kVGltZVVzOworICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOworICAgICAgICBib29sIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIH07CiAKICAgICB3cDxOdVBsYXllcjJEcml2ZXI+IG1Ecml2ZXI7CkBAIC0xNTcsMjMgKzE5MCwyMSBAQAogICAgIHVpZF90IG1VSUQ7CiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgTXV0ZXggbVNvdXJjZUxvY2s7ICAvLyBndWFyZCB8bVNvdXJjZXwuCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIGludDY0X3QgbVNyY0lkOwotICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKLSAgICBzcDxTb3VyY2U+IG1OZXh0U291cmNlOwotICAgIGludDY0X3QgbU5leHRTcmNJZDsKLSAgICB1aW50MzJfdCBtTmV4dFNvdXJjZUZsYWdzOworICAgIFNvdXJjZUluZm8gbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIFNvdXJjZUluZm8gbU5leHRTb3VyY2VJbmZvOwogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOwogICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKICAgICBzcDxEZWNvZGVyQmFzZT4gbUF1ZGlvRGVjb2RlcjsKKyAgICBNdXRleCBtRGVjb2RlckxvY2s7ICAvLyBndWFyZCB8bUF1ZGlvRGVjb2RlcnwgYW5kIHxtVmlkZW9EZWNvZGVyfC4KICAgICBzcDxDQ0RlY29kZXI+IG1DQ0RlY29kZXI7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKICAgICBzcDxBTG9vcGVyPiBtUmVuZGVyZXJMb29wZXI7CiAgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1FT1NNb25pdG9yR2VuZXJhdGlvbjsKIAogICAgIE11dGV4IG1QbGF5aW5nVGltZUxvY2s7CiAgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwpAQCAtMjQ0LDIxICsyNzUsOCBAQAogICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBzb3VyY2UgKGludGVybmFsbHkpIGR1ZSB0byBidWZmZXJpbmcKICAgICBib29sIG1QYXVzZWRGb3JCdWZmZXJpbmc7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87Ci0gICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKLSAgICB9IERBVEFfU09VUkNFX1RZUEU7Ci0KLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7Ci0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbU5leHREYXRhU291cmNlVHlwZTsKKyAgICAvLyBQYXNzZWQgZnJvbSBKQVZBCisgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gbUNvbnRleHQ7CiAKICAgICBpbmxpbmUgY29uc3Qgc3A8RGVjb2RlckJhc2U+ICZnZXREZWNvZGVyKGJvb2wgYXVkaW8pIHsKICAgICAgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7CkBAIC0yOTIsMTIgKzMxMCwxNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CiAKLSAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOworCisgICAgdm9pZCBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblN0YXJ0KGJvb2wgcGxheSk7CiAgICAgdm9pZCBvblJlc3VtZSgpOwogICAgIHZvaWQgb25QYXVzZSgpOwogCkBAIC0zMzMsMTAgKzM1MywxMyBAQAogICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAotICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGxheWVyTWVzc2FnZSogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIFNvdXJjZUluZm8qIGdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgcmVzZXRTb3VyY2VJbmZvKFNvdXJjZUluZm8gJnNyY0luZm8pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKaW5kZXggYTIzNTQ2YS4uOThjMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgewogICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpZ2V0VHJhY2tDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKaW5kZXggNTdkNWVhMi4uOTc4MzRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAppbmRleCBmNTcxOGUxLi42NmJmYWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTEwNyw3ICsxMDcsMTIgQEAKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CkBAIC0xMDg4LDYgKzEwOTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKIApAQCAtMTEwMiw2ICsxMTEzLDExIEBACiAgICAgICAgICAgICB9IC8vIGJ1ZmZlci0+ZGF0YSgpCiAgICAgICAgIH0gLy8gbmVlZHNDb3B5CiAKKyAgICAgICAgc3A8UmVmQmFzZT4gY3J5cHRJbmZvT2JqOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImNyeXB0SW5mbyIsICZjcnlwdEluZm9PYmopKSB7CisgICAgICAgICAgICBjcnlwdEluZm8gPSBzdGF0aWNfY2FzdDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyICo+KGNyeXB0SW5mb09iai5nZXQoKSk7CisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGlmIChjcnlwdEluZm8gIT0gTlVMTCkgewogICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcAppbmRleCA4NzkzMGM3Li45MTRmMjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApAQCAtMzgsNyArMzgsNyBAQAogICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCiAgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgogICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUDJEZWNvZGVyIik7CiAgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCmluZGV4IDM5OGMyNDYuLjE4NzY0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKQEAgLTM3LDQ5ICszNyw1MSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpWYWx1ZTsKKwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgeworc3RydWN0IFBsYXllck1lc3NhZ2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gcHcgPSBuZXcgUGFyY2VsV3JhcHBlcigpOwotICAgICAgICAgICAgaWYgKHB3LT5hcHBlbmRGcm9tKHApID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHB3OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IHB3ID0gbmV3IFBsYXllck1lc3NhZ2VXcmFwcGVyKCk7CisgICAgICAgICAgICBwdy0+Y29weUZyb20ocCk7CisgICAgICAgICAgICByZXR1cm4gcHc7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyY2VsOworICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmdldFBsYXllck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyTWVzc2FnZTsKICAgICB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJjZWxXcmFwcGVyKCkgewotICAgICAgICBpZiAobVBhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbVBhcmNlbDsKKyAgICB2aXJ0dWFsIH5QbGF5ZXJNZXNzYWdlV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQogICAgIH0KIAogcHJpdmF0ZToKLSAgICBQYXJjZWxXcmFwcGVyKCkKLSAgICAgICAgOiBtUGFyY2VsKE5VTEwpIHsgfQorICAgIFBsYXllck1lc3NhZ2VXcmFwcGVyKCkKKyAgICAgICAgOiBtUGxheWVyTWVzc2FnZShOVUxMKSB7IH0KIAotICAgIHN0YXR1c190IGFwcGVuZEZyb20oY29uc3QgUGFyY2VsICpwKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1QYXJjZWwgPSBuZXcgUGFyY2VsOworICAgIHZvaWQgY29weUZyb20oY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllck1lc3NhZ2UgPSBuZXcgUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKKyAgICAgICAgbVBsYXllck1lc3NhZ2UtPkNvcHlGcm9tKCpwKTsKICAgICB9CiAKLSAgICBQYXJjZWwgKm1QYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSAqbVBsYXllck1lc3NhZ2U7CiB9OwogCiAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLXN0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyMiI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwogICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAogICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyLmphdmEKQEAgLTkwLDYgKzkyLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC0xMDUsOCArMTA4LDEwIEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQ291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyRXhpdCI7CiAKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVmVyc2lvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZlcnNpb24iOwogCi1OdVBsYXllcjJEcml2ZXI6Ok51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCkKKworTnVQbGF5ZXIyRHJpdmVyOjpOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAogICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAogICAgICAgbVNyY0lkKDApLApAQCAtMTIxLDkgKzEyNiwxMCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTnVQbGF5ZXIyTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1NZWRpYUNsb2NrKG5ldyBNZWRpYUNsb2NrKSwKLSAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2spKSwKKyAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2ssIGNvbnRleHQpKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKLSAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAorICAgICAgbU1ldHJpY3NIYW5kbGUoMCksCisgICAgICBtUGxheWVyVmVyc2lvbigwKSwKICAgICAgIG1DbGllbnRVaWQodWlkKSwKICAgICAgIG1BdEVPUyhmYWxzZSksCiAgICAgICBtTG9vcGluZyhmYWxzZSksCkBAIC0xMzQsOSArMTQwLDEzIEBACiAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCi0gICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKyAgICAvLyBYWFg6IHdoYXQgdmVyc2lvbiBhcmUgd2U/CisgICAgLy8gSWRlYWxseSwgdGhpcyB0aWNrcyB3aXRoIHRoZSBhcGsgdmVyc2lvbiBpbmZvIGZvciB0aGUgQVBFWCBwYWNrYWdpbmcKKworICAgIC8vIHNldCB1cCBtZWRpYSBtZXRyaWNzIHJlY29yZAorICAgIG1NZXRyaWNzSGFuZGxlID0gbWVkaWFtZXRyaWNzX2NyZWF0ZShrS2V5UGxheWVyKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWZXJzaW9uLCBtUGxheWVyVmVyc2lvbik7CiAKICAgICBtTnVQbGF5ZXIyTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTE1NywxMCArMTY3LDcgQEAKICAgICB1cGRhdGVNZXRyaWNzKCJkZXN0cnVjdG9yIik7CiAgICAgbG9nTWV0cmljcygiZGVzdHJ1Y3RvciIpOwogCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE5VTEw7Ci0gICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUobU1ldHJpY3NIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmluaXRDaGVjaygpIHsKQEAgLTI3MywxMyArMjgwLDYgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnRfbCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgewogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKQEAgLTMwNCw3ICszMDMsNyBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOwogICAgICAgICAgICAgfQpAQCAtMzIwLDM0ICszMTksNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdG9wKCkgewotICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgLy9ub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cGF1c2UoKSB7CiAgICAgQUxPR0QoInBhdXNlKCVwKSIsIHRoaXMpOwogICAgIC8vIFRoZSBOdVBsYXllclJlbmRlcmVyIG1heSBnZXQgZmx1c2hlZCBpZiBwYXVzZSBmb3IgbG9uZyBlbm91Z2gsIGUuZy4gdGhlIHBhdXNlIHRpbWVvdXQgdGVhcgpAQCAtMzYxLDkgKzMzMiw5IEBACiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgICAgIHJldHVybiBPSzsKIAorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwpAQCAtMzg2LDE1ICszNTcsNiBAQAogICAgICAgICAvLyB0cnkgdG8gdXBkYXRlIHBvc2l0aW9uCiAgICAgICAgIGludDY0X3QgdW51c2VkOwogICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJnVudXNlZCk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYgJiYgbVN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYKLSAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSkgewotICAgICAgICAgICAgZXJyID0gc3RhcnRfbCgpOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC00MTksNyArMzgxLDYgQEAKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKQEAgLTQ5NywxNSArNDU4LDE1IEBACiAKICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVkNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXRzLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyV2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllcldpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKQEAgLTUxMywxNCArNDc0LDE4IEBACiAgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgJm51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CiAKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CiAKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLW91dHB1dCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTMxLDE3ICs0OTYsMTcgQEAKICAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgogICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKICAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOwogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwogCiAgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOwogICAgIH0KIAotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CisgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CiB9CiAKIApAQCAtNTUxLDcgKzUxNiw3IEBACiAgICAgfQogICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CiAKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICBpZiAobU1ldHJpY3NIYW5kbGUgPT0gMCB8fCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTYwLDE2ICs1MjUsMTMgQEAKICAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCiAgICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgogICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgewotCi0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Ci0KKyAgICBpZiAobWVkaWFtZXRyaWNzX2NvdW50KG1NZXRyaWNzSGFuZGxlKSA+IDMpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobU1ldHJpY3NIYW5kbGUpOwogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKLSAgICAgICAgfQorICAgICAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKG1NZXRyaWNzSGFuZGxlKTsKKyAgICAgICAgbU1ldHJpY3NIYW5kbGUgPSBtZWRpYW1ldHJpY3NfY3JlYXRlKGtLZXlQbGF5ZXIpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVmVyc2lvbiwgbVBsYXllclZlcnNpb24pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJkaWQgbm90IGhhdmUgYW55dGhpbmcgdG8gcmVjb3JkIik7CiAgICAgfQpAQCAtNjAxLDEwICs1NjMsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtNjMzLDUwICs1OTEsNTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgeworICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZXBseSBpcyBhIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGludDMyX3QgbWV0aG9kSWQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcmVxdWVzdC5yZWFkSW50MzIoJm1ldGhvZElkKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBtZXRob2QgdG8gaW52b2tlLCBlcnIoJWQpIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxjb25zdCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVxdWVzdC52YWx1ZXMoKS5jYmVnaW4oKTsKKyAgICBpbnQzMl90IG1ldGhvZElkID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogCiAgICAgc3dpdGNoIChtZXRob2RJZCkgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBtb2RlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU2NhbGluZ01vZGUobW9kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHNyY0lkLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKICAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwogICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soc3JjSWQsIHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKAorICAgICAgICAgICAgICAgICAgICBzcmNJZCwgdHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHNyY0lkLCB0eXBlLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtNjk2LDQ0ICs2NTUsMTYgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKLQotICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKLSAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQotICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCi0gICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXkgX191bnVzZWQsIFBhcmNlbCAqcmVwbHkgX191bnVzZWQpIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICBNZXRhZGF0YSBtZXRhKHJlY29yZHMpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9QQVVTRSk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19GT1JXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOworICAgIGlmIChtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlcyhtTWV0cmljc0hhbmRsZSwgYnVmZmVyLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gT0s7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVzZXRDb21wbGV0ZShpbnQ2NF90IC8qIHNyY0lkICovKSB7CkBAIC03ODAsMjAgKzcxMSw3IEBACiAgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKHNyY0lkKTsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpIHsKLSAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOwotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7Ci0gICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIHdhc1NlZWtpbmcgPyBNRURJQTJfU0VFS19DT01QTEVURSA6IE1FRElBMl9QUkVQQVJFRCk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1NFRUtfQ09NUExFVEUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmR1bXAoCkBAIC04ODQsMTIgKzgwMiwxMiBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1lc3NhZ2VJZCIsICZtc2dJZCkpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDEiLCAmZXh0MSk7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MiIsICZleHQyKTsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IGluOworICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IGluOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgicGFyY2VsIiwgJm9iaikgJiYgb2JqICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IHN0YXRpY19jYXN0PFBhcmNlbFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm9iaiIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQbGF5ZXJNZXNzYWdlV3JhcHBlciAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7CisgICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGxheWVyTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpAQCAtODk4LDE2ICs4MTYsMTYgQEAKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVsbGQsICVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLAotICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5CeXRlU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgewogICAgICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CkBAIC05MjQsMTMgKzg0MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmRlcmVyIGhhcyBzdG9wcGVkIHRoZSBzaW5rIGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8gcGxheSBvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaXR0bGUgYml0IG9mIGF1ZGlvLiBJbiBsb29waW5nIG1vZGUsIHdlIG5lZWQgdG8gcmVzdGFydCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZworCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5TGlzdGVuZXIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBNRURJQTJfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewpAQCAtOTQ5LDExICs4NzIsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBleHQxIGlzIG91ciBwcmltYXJ5ICdlcnJvciB0eXBlJyB2YWx1ZS4gT25seSBhZGQgZXh0MiB3aGVuIG5vbi16ZXJvLgogICAgICAgICAgICAgICAgIC8vIFt0ZXN0IGFnYWluc3QgbXNnIGlzIGR1ZSB0byBmYWxsIHRocm91Z2ggZnJvbSBwcmV2aW91cyBzd2l0Y2ggdmFsdWVdCiAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQTJfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvciwgZXh0MSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckVycm9yLCBleHQxKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTY5LDcgKzg5Miw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwYXJjZWwiLCBQYXJjZWxXcmFwcGVyOjpDcmVhdGUoaW4pKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgib2JqIiwgUGxheWVyTWVzc2FnZVdyYXBwZXI6OkNyZWF0ZSgoUGxheWVyTWVzc2FnZSopaW4pKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTAzNiwyNCArOTU5LDI1IEBACiB9CiAKIC8vIE1vZHVsYXIgRFJNCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybShzcmNJZCwgdXVpZCwgZHJtU2Vzc2lvbklkKTsKIAogICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQiLCByZXQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKQogewogICAgIEFMT0dWKCJyZWxlYXNlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAKICAgICBBTE9HVigicmVsZWFzZURybSByZXQ6ICVkIiwgcmV0KTsKIApAQCAtMTA3Myw5ICs5OTcsNiBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKICAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCmluZGV4IDRkYTI1NjYuLmM5N2UyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApAQCAtMTYsOCArMTYsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjYsNyArMjcsNyBAQAogc3RydWN0IE51UGxheWVyMjsKIAogc3RydWN0IE51UGxheWVyMkRyaXZlciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgewotICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOwogCkBAIC00MCwzMSArNDEsMjkgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAotICAgICAgICAgICAgaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgICAgICAgICBpbnQ2NF90IG1zZWMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWYsIHNpemVfdCAqbGVuZ3RoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOwogCkBAIC03NywxNCArNzYsMTQgQEAKICAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGludDY0X3Qgc3JjSWQsIGJvb2wgc3RhdHVzKTsKICAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKLSAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3Qgc3JjSWQsIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIyRHJpdmVyKCk7CkBAIC05OSw5ICs5OCw2IEBACiAgICAgICAgIFNUQVRFX1JVTk5JTkcsCiAgICAgICAgIFNUQVRFX1BBVVNFRCwKICAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCi0gICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKICAgICB9OwogCiAgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwpAQCAtMTM3LDcgKzEzMyw4IEBACiAgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1NZXRyaWNzSGFuZGxlOworICAgIGludDY0X3QgbVBsYXllclZlcnNpb247CiAgICAgdWlkX3QgbUNsaWVudFVpZDsKIAogICAgIGJvb2wgbUF0RU9TOwpAQCAtMTQ5LDcgKzE0Niw3IEBACiAKICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjJEcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAppbmRleCAwZTA5NmIwLi5mNDFhNDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCkBAIC0xMzMsOSArMTMzLDggQEAKICAgICByZXR1cm4gZHJtSW5mb0J1ZmZlcjsKIH0KIAotc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpCiB7Ci0KICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcHNzaCwgZHJtSW5mbzsKIAogICAgIC8vIDApIEdlbmVyYXRlIFBTU0ggYnl0ZXMKQEAgLTE1NCwyMiArMTUzLDIwIEBACiAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KHBzc2hQdHIsIHBzc2hTaXplKS5zdHJpbmcoKSk7CiAKICAgICAvLyAxKSBXcml0ZSBQU1NIIGJ5dGVzCi0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJnBzc2hTaXplKSwgc2l6ZW9mKHBzc2hTaXplKSk7Ci0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4ocHNzaC5zdHIoKS5jX3N0cigpKSwgcHNzaFNpemUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4ocHNzaC5zdHIoKS5jX3N0cigpKSwgcHNzaFNpemUpOwogCiAgICAgLy8gMikgV3JpdGUgc3VwcG9ydGVkRFJNcwogICAgIHVpbnQzMl90IG51bWVudHJpZXMgPSBwc3NoSW5mby0+bnVtZW50cmllczsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmbnVtZW50cmllcyksIHNpemVvZihudW1lbnRyaWVzKSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShudW1lbnRyaWVzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgewogICAgICAgICBQc3NoRW50cnkgKmVudHJ5ID0gJnBzc2hJbmZvLT5lbnRyaWVzW2ldOwotICAgICAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKKyAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7CiAgICAgICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBzdXBwb3J0ZWRTY2hlbWVbJXp1XSAlcyIsIGksCiAgICAgICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleCgoY29uc3QgdWludDhfdCopJmVudHJ5LT51dWlkLCBzaXplb2YoQU1lZGlhVVVJRCkpLnN0cmluZygpKTsKICAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRybUluZm8uc3RyKCkuY19zdHIoKSwgZHJtSW5mby50ZWxscCgpKTsKLSAgICBkcm1JbmZvQnVmLT5zZXRSYW5nZSgwLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIHJldHVybiBkcm1JbmZvQnVmOworICAgIHJldHVybiBPSzsKIH0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaAppbmRleCA5OWQyNDE1Li45NjhkMWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAgICAgc3RydWN0IERybVVVSUQgewpAQCAtODAsNyArODQsNyBAQAogCiAgICAgcHVibGljOgogICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKGNvbnN0IHZvaWQgKnBzc2gsIHVpbnQzMl90IHBzc2hzaXplKTsKLSAgICAgICAgc3RhdGljIHNwPEFCdWZmZXI+IHJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqKTsKKyAgICAgICAgc3RhdGljIHN0YXR1c190IHJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqLCBQbGF5ZXJNZXNzYWdlICopOwogCiAgICAgfTsgIC8vIE51UGxheWVyMkRybQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCmluZGV4IDNkNjkxODguLmE4Yzk5MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0xMDYsNiArMTA2LDcgQEAKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCiAgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayhmYWxzZSksCkBAIC0xMzEsNyArMTMyLDcgQEAKICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCiAgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKQEAgLTE0NywxMCArMTQ4LDkgQEAKICAgICAgIG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQoMCksCiAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCgwKSwKICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrKGZhbHNlKSwKLSAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKCkpIHsKKyAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKGNvbnRleHQpKSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLSAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogfQogCiBOdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7CkBAIC0yMDYsMjYgKzIwNiwyMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgewotICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAotICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKLSAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCi0gICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICByZXR1cm4gT0s7CisgICAgaWYgKHJhdGUubVNwZWVkIDw9IDAuZikgeworICAgICAgICBBTE9HVygicGxheWJhY2sgcmF0ZSBjYW5ub3QgYmUgJWYiLCByYXRlLm1TcGVlZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgcGxheWJhY2sgcmF0ZSBmcm9tIGF1ZGlvIHNpbmssIGVyciglZCkiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjQ3LDE0ICsyNDEsMTIgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUsICVmIHZzICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNTc2LDggKzU2OCw4IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOwotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKQEAgLTE0NjYsNyArMTQ1OCw3IEBACiAKICAgICBpZiAobUhhc1ZpZGVvKSB7CiAgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOwogICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTk0LDYgKzE1ODYsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7CisgICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCkBAIC0xNzk0LDcgKzE3ODcsNyBAQAogICAgICAgICAgICAgbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAgfQogCi0gICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKIAogICAgICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwpAQCAtMTgwOCw3ICsxODAxLDcgQEAKIAogdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgewogICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKICAgICB9CiAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7CiB9CkBAIC0xODc4LDYgKzE4NzEsNyBAQAogICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7CiAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKICAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisKICAgICBib29sIGF1ZGlvU2lua0NoYW5nZWQgPSBmYWxzZTsKIAogICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC0xOTU0LDcgKzE5NDgsNiBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLApAQCAtMjAyNSwxMyArMjAxOCw2IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lQ291bnQgPQogICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIC8gMTAwMDsKIAotICAgICAgICAvLyBUaGUgZG9Ob3RSZWNvbm5lY3QgbWVhbnMgQXVkaW9TaW5rIHdpbGwgc2lnbmFsIGJhY2sgYW5kIGxldCBOdVBsYXllcjIgdG8gcmUtY29uc3RydWN0Ci0gICAgICAgIC8vIEF1ZGlvU2luay4gV2UgZG9uJ3Qgd2FudCB0aGlzIHdoZW4gdGhlcmUncyB2aWRlbyBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSB2aWRlbyBzZWVrIHRvCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBJIGZyYW1lLiBCdXQgd2UgZG8gd2FudCB0aGlzIHdoZW4gdGhlcmUncyBvbmx5IGF1ZGlvIGJlY2F1c2UgaXQgd2lsbCBnaXZlCi0gICAgICAgIC8vIE51UGxheWVyMiBhIGNoYW5jZSB0byBzd2l0Y2ggZnJvbSBub24tb2ZmbG9hZCBtb2RlIHRvIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgLy8gU28gd2Ugb25seSBzZXQgZG9Ob3RSZWNvbm5lY3Qgd2hlbiB0aGVyZSdzIG5vIHZpZGVvLgotICAgICAgICBjb25zdCBib29sIGRvTm90UmVjb25uZWN0ID0gIWhhc1ZpZGVvOwotCiAgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBzZXQgb3VyIHBsYXliYWNrIHNldHRpbmdzIGlmIHRoZSBzaW5rIGlzIGNsb3NlZC4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpICE9IE9LLAogICAgICAgICAgICAgICAgICJvbk9wZW5BdWRpb1Npbms6IGNhbid0IHNldCBwbGF5YmFjayByYXRlIG9uIGNsb3NlZCBzaW5rIik7CkBAIC0yMDQwLDEyICsyMDI2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygib3BlbkF1ZGlvU2luazogbm9uIG9mZmxvYWRlZCBvcGVuIGZhaWxlZCBzdGF0dXM6ICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAppbmRleCA2MmNmMGQ4Li5kMDY1ZGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCkBAIC0yOCw3ICsyOSw3IEBACiBjbGFzcyAgSldha2VMb2NrOwogc3RydWN0IE1lZGlhQ2xvY2s7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U7CiAKIHN0cnVjdCBOdVBsYXllcjI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM4LDYgKzM5LDcgQEAKICAgICBSZW5kZXJlcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCiAgICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQsCiAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKIAogICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCkBAIC0xNTYsNyArMTU4LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CkBAIC0xNjcsNyArMTY5LDYgQEAKICAgICBpbnQzMl90IG1BdWRpb0VPU0dlbmVyYXRpb247CiAKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCiAKICAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKICAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKaW5kZXggNjYyMjM1Zi4uOTI5OGE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAppbmRleCA3MGJjMGE5Li5hNzAyNjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcApAQCAtOTYsNyArOTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAppbmRleCA3MTJjM2U1Li5lNWYxNzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDc0MjM2Y2IuLjIyZmE0OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLApAQCAtMjQsMTEgKzI1LDExIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggOTZmNzllMC4uZGE5NTgxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC0xNjI3LDcgKzE2MjYsNyBAQAogICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CkBAIC0xODE2LDcgKzE4MTUsNyBAQAogICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cmlidXRlcyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggNDIwNjY0Ny4uM2ZhOGUzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNTM3LDQgKzUzNywxMyBAQAogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgeworICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCBkMmU2ODFmLi4zMDNjZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTEwOSw2ICsxMDksNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGUzYWUwMmUuLmQxMTEzMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgpAQCAtMjAxLDcgKzIwMyw3IEBACiAgICAgfQogICAgIG1BbmFseXRpY3NEaXJ0eSA9IGZhbHNlOwogICAgIGlmIChyZWluaXRpYWxpemUpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlSZWNvcmRlcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVJlY29yZGVyKTsKICAgICB9CiB9CiAKQEAgLTk0OCw2ICs5NTAsMTAgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwT2dnUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7CkBAIC0xMDEzLDYgKzEwMTksNyBAQAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKICAgICAgICAgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKQEAgLTExMTMsNiArMTEyMCw5IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwpAQCAtMTE2OSw2ICsxMTc5LDEzIEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBPZ2dSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9PR0cpOworCisgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIobU91dHB1dEZkKTsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CkBAIC0xNzQ1LDEzICsxNzYyLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBFbmFibGUgdGVtcG9yYWwgbGF5ZXJpbmcgaWYgdGhlIGV4cGVjdGVkIChtYXgpIHBsYXliYWNrIGZyYW1lIHJhdGUgaXMgZ3JlYXRlciB0aGFuIH4xMSUgb2YKKyAgICAvLyB0aGUgbWluaW11bSBkaXNwbGF5IHJlZnJlc2ggcmF0ZSBvbiBhIHR5cGljYWwgZGV2aWNlLiBBZGQgbGF5ZXJzIHVudGlsIHRoZSBiYXNlIGxheWVyIGZhbGxzCisgICAgLy8gdW5kZXIgdGhpcyBsaW1pdC4gQWxsb3cgZGV2aWNlIG1hbnVmYWN0dXJlcnMgdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdC4KKworICAgIC8vIFRPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGUgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgc3RkOjpzdHJpbmcgbWF4QmFzZUxheWVyRnBzUHJvcGVydHkgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5tZWRpYS5yZWNvcmRlci1tYXgtYmFzZS1sYXllci1mcHMiLCAiIik7CisgICAgZmxvYXQgbWF4QmFzZUxheWVyRnBzID0gKGZsb2F0KTo6YXRvZihtYXhCYXNlTGF5ZXJGcHNQcm9wZXJ0eS5jX3N0cigpKTsKKyAgICAvLyBUUklDS1k6IHVzZSAhPiB0byBmaXggdXAgYW55IE5hTiB2YWx1ZXMKKyAgICBpZiAoIShtYXhCYXNlTGF5ZXJGcHMgPj0ga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjkpKSB7CisgICAgICAgIG1heEJhc2VMYXllckZwcyA9IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45OworICAgIH0KKwogICAgIGZvciAodWludDMyX3QgdHJ5TGF5ZXJzID0gMTsgdHJ5TGF5ZXJzIDw9IGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzOyArK3RyeUxheWVycykgewogICAgICAgICBpZiAodHJ5TGF5ZXJzID4gdHNMYXllcnMpIHsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gdHJ5TGF5ZXJzOwogICAgICAgICB9CiAgICAgICAgIC8vIGtlZXAgZ29pbmcgdW50aWwgdGhlIGJhc2UgbGF5ZXIgZnBzIGZhbGxzIGJlbG93IHRoZSB0eXBpY2FsIGRpc3BsYXkgcmVmcmVzaCByYXRlCiAgICAgICAgIGZsb2F0IGJhc2VMYXllckZwcyA9IG1heFBsYXliYWNrRnBzIC8gKDEgPDwgKHRyeUxheWVycyAtIDEpKTsKLSAgICAgICAgaWYgKGJhc2VMYXllckZwcyA8IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45KSB7CisgICAgICAgIGlmIChiYXNlTGF5ZXJGcHMgPCBtYXhCYXNlTGF5ZXJGcHMpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgxMyw2ICsxODQzLDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE4OTQsMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CkBAIC0yMjM5LDYgKzIyNjksMTIgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li5hMjkyZTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKLQorICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTE2Niw2ICsxNjYsNyBAQAogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwT2dnUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAzMTE5OTUwLi4wYWQ0ZDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTE1MSwxMyArMTUxLDEzIEBACiAKICAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7Ci0gICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCA2OTQyMzVhLi41YTU4YWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0xNTUwLDYgKzE1NTAsMTYgQEAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1QcmVwYXJpbmcpIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChmaW5hbFN0YXR1cyk7CisgICAgICAgICAgICBtUHJlcGFyaW5nID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CisgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCBjZjc1YWVjLi4zMzg4MDk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTY1OSwyMCArNjU5LDMxIEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gLTE7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7Ci0gICAgICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOwotICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrID09IC0xICYmIG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ0NEZWNvZGVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgKz0gaW5iYW5kVHJhY2tzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCmluZGV4IDdmNDc3M2IuLjAxNTZhZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcApAQCAtMjAwLDYgKzIwMCwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1ttU2VsZWN0ZWRUcmFja107CisgICAgICAgIGlmICh0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDggfHwgdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4KSB7CisgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKIGJvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKaW5kZXggZjMxMGYzNy4uMzdiODIzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwogICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKICAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKICAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggNGFkNmVhYi4uMmYwZGEyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTEwNywxMCArMTA3LDE2IEBACiB9CiAKIHNwPEFNZXNzYWdlPiBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0U3RhdHMoKSBjb25zdCB7CisKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKQEAgLTY3Nyw3ICs2ODMsNyBAQAogICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKLSAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwogICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOwogICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKQEAgLTc0OCw3ICs3NTQsNyBAQAogICAgIHJlcGx5LT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CiAKICAgICBpZiAoZW9zKSB7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIEFMT0dWKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKQEAgLTEwMjgsNyArMTAzNCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bWUtYXQtbWVkaWFUaW1lVXMiLCAmcmVzdW1lQXRNZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylyZXN1bWVBdE1lZGlhVGltZVVzKTsKICAgICAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgfQpAQCAtMTA2OSw2ICsxMDc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGI4M2U3NjYuLjJiODEzZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNTMsNiArNTMsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZwcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKQEAgLTk2LDcgKzk3LDcgQEAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCiAgICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7CisgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UGxheWVyKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwpAQCAtMzI4LDcgKzMyOSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdGFydCgpIHsKLSAgICBBTE9HRCgic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOworICAgIEFMT0dWKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gc3RhcnRfbCgpOwogfQpAQCAtNDcwLDcgKzQ3MSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSkgewotICAgIEFMT0dEKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKKyAgICBBTE9HVigic2Vla1RvKCVwKSAoJWQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIG1zZWMsIG1vZGUsIG1TdGF0ZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwTEw7CkBAIC01NzcsNiArNTc4LDEwIEBACiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1BsYXllckZyYW1lUmF0ZSwgKGRvdWJsZSkgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKQEAgLTYwMiw2ICs2MDcsNyBAQAogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisKICAgICB9CiAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwpAQCAtNjI5LDcgKzYzNSw3IEBACiAKICAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KICAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJudXBsYXllciIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJudXBsYXllciIpOwogICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KQEAgLTk1OSw3ICs5NjUsNyBAQAogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAogICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKKyAgICBBTE9HVigibm90aWZ5TGlzdGVuZXJfbCglcCksICglZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKICAgICAgICAgICAgIHRoaXMsIG1zZywgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYmRlMDg2Mi4uMmQwYzllMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0xNTksOCArMTU5LDEyIEBACiAgICAgaWYgKGRybSAhPSBOVUxMKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHNzaERSTXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIERybVVVSUQgdXVpZCA9IHBzc2hEUk1zW2ldOwotICAgICAgICAgICAgaWYgKGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5wdHIoKSwgU3RyaW5nOCgpKSkKKyAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5wdHIoKSwgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93biwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREUk1zLmFkZCh1dWlkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGRybS5jbGVhcigpOwpAQCAtMjM5LDggKzI0MywxNCBAQAogICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKQogewogICAgIC8vIHNpemUgbmVlZGVkIHRvIHN0b3JlIGFsbCB0aGUgY3J5cHRvIGRhdGEKLSAgICBzaXplX3QgY3J5cHRvc2l6ZSA9IHNpemVvZihDcnlwdG9JbmZvKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlczsKKyAgICBzaXplX3QgY3J5cHRvc2l6ZTsKKyAgICAvLyBzaXplb2YoQ3J5cHRvSW5mbykgKyBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlczsKKyAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpLCBudW1TdWJTYW1wbGVzLCAmY3J5cHRvc2l6ZSkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coY3J5cHRvc2l6ZSwgc2l6ZW9mKENyeXB0b0luZm8pLCAmY3J5cHRvc2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoImNyeXB0byBzaXplIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIENyeXB0b0luZm8gKnJldCA9IChDcnlwdG9JbmZvKikgbWFsbG9jKGNyeXB0b3NpemUpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiY291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIiwgY3J5cHRvc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNDk5MjEzNy4uNjVkNmQ2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC04Nyw2ICs4OSwyMCBAQAogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6a01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcyA9IDEwMDAwMGxsOwogCitzdGF0aWMgYXVkaW9fZm9ybWF0X3QgY29uc3RleHByIGF1ZGlvRm9ybWF0RnJvbUVuY29kaW5nKGludDMyX3QgcGNtRW5jb2RpbmcpIHsKKyAgICBzd2l0Y2ggKHBjbUVuY29kaW5nKSB7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtOGJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7IC8vIFRPRE86IGRvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzPworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBlbmNvZGluZzogJWQiLCBfX2Z1bmNfXywgcGNtRW5jb2RpbmcpOworICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgfQorfQorCiBOdVBsYXllcjo6UmVuZGVyZXI6OlJlbmRlcmVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLApAQCAtMTg4Myw4ICsxODk5LDEzIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CiAKKyAgICAvLyByZWFkIHBjbSBlbmNvZGluZyBmcm9tIE1lZGlhQ29kZWMgb3V0cHV0IGZvcm1hdCwgaWYgYXZhaWxhYmxlCisgICAgaW50MzJfdCBwY21FbmNvZGluZzsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpID8KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcocGNtRW5jb2RpbmcpIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwgbWltZS5jX3N0cigpKTsKQEAgLTE5ODYsNyArMjAwNyw3IEBACiAgICAgICAgIGNvbnN0IFBjbUluZm8gaW5mbyA9IHsKICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCAvLyBUT0RPOiBjaGFuZ2UgdG8gYXVkaW9Gb3JtYXQKKyAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlCiAgICAgICAgIH07CkBAIC0yMDI1LDcgKzIwNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLApAQCAtMjA4Myw0ICsyMTA0LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggYTA0Nzk3NS4uYTUyMWY2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yOCw3ICsyOCw3IEBACiBjbGFzcyAgQVdha2VMb2NrOwogc3RydWN0IE1lZGlhQ2xvY2s7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U7CiAKIHN0cnVjdCBOdVBsYXllcjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZT4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlODZiNjhhLi40NzQ5YThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMTEsNiArMTEsNyBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgIF0sCiAKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKaW5kZXggNzRhYWY3Ny4uMTE4ODMyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCkBAIC0zLDkgKzMsMTMgQEAKICAgICBuYW1lOiAibGlibmJsb2ciLAogCiAgICAgc3JjczogWwotICAgICAgICAiTkJMb2cuY3BwIiwKKyAgICAgICAgIkVudHJ5LmNwcCIsCisgICAgICAgICJNZXJnZXIuY3BwIiwKICAgICAgICAgIlBlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIiwKKyAgICAgICAgIlJlYWRlci5jcHAiLAogICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKKyAgICAgICAgIlRpbWVsaW5lLmNwcCIsCisgICAgICAgICJXcml0ZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTEzLDkgKzE3LDE0IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlianNvbmNwcCIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NTYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworaW50IEVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93CisgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiBtRXZlbnQ7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gMSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsgICAvLyBGSVhNRSBpcyB0aGlzIGFuIGVycm9yPworICAgIH0KK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpICAgLy8gRHVtbXkgaW5pdGlhbGl6YXRpb24uCisgICAgOiBtUHRyKG51bGxwdHIpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCisgICAgOiBtUHRyKGVudHJ5KQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKQorICAgIDogbVB0cihvdGhlci5tUHRyKQoreworfQorCitjb25zdCBlbnRyeSYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKihlbnRyeSopIG1QdHI7Cit9CisKK2NvbnN0IGVudHJ5KiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGVudHJ5KikgbVB0cjsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICAgbVB0ciArPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkKK3sKKyAgICBtUHRyIC09IG1QdHJbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuICsrYXV4OworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gLS1hdXg7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAhPSBvdGhlci5tUHRyOworfQorCitpbnQgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyIC0gb3RoZXIubVB0cjsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gbVB0clttUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCisgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdAoreworICAgIHNpemVfdCBsZW5ndGggPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgZHN0LT53cml0ZShtUHRyLCBsZW5ndGgpOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QKK3sKKyAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikKK3sKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOworICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CisgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOworfQorCitjb25zdCBjaGFyICpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Cit9CisKK3NpemVfdCBGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKKyAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUikgeworICAgICAgICArK2l0OworICAgIH0KKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgRm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOworfQorCitsb2dfaGFzaF90IEZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKKyAgICByZXR1cm4gaGFzaDsKK30KKworaW50IEZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQorICAgIHJldHVybiBpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SID8gaXQucGF5bG9hZDxpbnQ+KCkgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICBpdC5jb3B5VG8oZHN0KTsgICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5CisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IHRpbWVzdGFtcAorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSBoYXNoCisgICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQorICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7CisgICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9GTVRfQVVUSE9SOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9CisgICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KKyAgICAgICAgc2l6ZW9mKGF1dGhvcik7CisgICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOworICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7CisgICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKKyAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgaXQuY29weVRvKGRzdCk7CisgICAgfQorICAgIGl0LmNvcHlUbyhkc3QpOworICAgICsraXQ7CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKK30KKworbG9nX2hhc2hfdCBIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Cit9CisKK2ludCBIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7CisgICAgcmV0dXJuIGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikKKyAgICAgICAgICAgID8gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgSGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KKyAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9CisgICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKKyAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKKyAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKKyAgICAvLyBDb3B5IHRoZSBhdXRob3IKKyAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7CisgICAgLy8gVXBkYXRlIGxlbmd0aHMKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQorICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCisgICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK01lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCit2b2lkIE1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IHNwPFJlYWRlcj4gJnJlYWRlcikKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKKyAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbVJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorICAgIG1SZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOworfQorCisvLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCisvLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQorc3RydWN0IE1lcmdlSXRlbQoreworICAgIGludDY0X3QgdHM7CisgICAgaW50IGluZGV4OworICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQorfTsKKworYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKQoreworICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKK30KKworLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQordm9pZCBNZXJnZXI6Om1lcmdlKCkKK3sKKyAgICBpZiAodHJ1ZSkgcmV0dXJuOyAvLyBNZXJnaW5nIGlzIG5vdCBuZWNlc3NhcnkgYXQgdGhlIG1vbWVudCwgc28gdGhpcyBpcyB0byBkaXNhYmxlIGl0CisgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ5cGFzcyBjb21waWxlciB3YXJuaW5ncyBhYm91dCBtZW1iZXIgdmFyaWFibGVzIG5vdCBiZWluZyB1c2VkLgorICAgIGNvbnN0IGludCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIHN0ZDo6dmVjdG9yPEVudHJ5SXRlcmF0b3I+IG9mZnNldHM7CisgICAgb2Zmc2V0cy5yZXNlcnZlKG5Mb2dzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgICAgIG9mZnNldHMucHVzaF9iYWNrKHNuYXBzaG90c1tpXS0+YmVnaW4oKSk7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cworICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCisgICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBhYnN0cmFjdEVudHJ5ID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChhYnN0cmFjdEVudHJ5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZShhYnN0cmFjdEVudHJ5LT50aW1lc3RhbXAoKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OyAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0CisgICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPgorICAgICAgICAgICAgY29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsIGluZGV4KTsKKyAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcworICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOworICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIE1lcmdlcjo6Z2V0UmVhZGVycygpIGNvbnN0Cit7CisgICAgLy9BdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtUmVhZGVyczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKKyAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUsICJNZXJnZVJlYWRlciIpLCBtUmVhZGVycyhtZXJnZXIuZ2V0UmVhZGVycygpKQoreworfQorCisvLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCisvLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgordm9pZCBNZXJnZVJlYWRlcjo6cHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwc2hvdCwgaW50IGF1dGhvcikKK3sKKyAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gbVRocmVhZFBlcmZvcm1hbmNlRGF0YVthdXRob3JdOworICAgIC8vIFdlIGRvbid0IGRvICJhdXRvIGl0IiBiZWNhdXNlIGl0IHJlZHVjZXMgcmVhZGFiaWxpdHkgaW4gdGhpcyBjYXNlLgorICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKKyAgICAgICAgICAgIGNvbnN0IEhpc3RUc0VudHJ5IHBheWxvYWQgPSBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5PigpOworICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCisgICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkocGF5bG9hZC50cyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRJbmZvID0gaW5mbzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZFBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLmxhdGVuY3lIaXN0LmFkZChsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtb25vdG9uaWNNcyA9IG1vbm90b25pY05zICogMWUtNjsKKyAgICAgICAgICAgIGRhdGEud29ya0hpc3QuYWRkKG1vbm90b25pY01zKTsKKyAgICAgICAgICAgIGRhdGEuYWN0aXZlICs9IG1vbm90b25pY05zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLndhcm11cEhpc3QuYWRkKHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLnVuZGVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEub3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgQUxPR1coIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQoreworICAgIC8vIGdldCBhIHNuYXBzaG90IG9mIGVhY2ggcmVhZGVyIGFuZCBwcm9jZXNzIHRoZW0KKyAgICAvLyBUT0RPIGluc2VydCBsb2NrIGhlcmUKKyAgICBjb25zdCBzaXplX3QgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgfQorICAgIC8vIFRPRE8gdW5sb2NrIGxvY2sgaGVyZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBpZiAoc25hcHNob3RzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByb2Nlc3NTbmFwc2hvdCgqKHNuYXBzaG90c1tpXSksIGkpOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCkKK3sKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGF1dG8mIGl0ZW0gOiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKG5vdyAtIGRhdGEuc3RhcnQgPj0ga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCkgeworICAgICAgICAgICAgKHZvaWQpUmVwb3J0UGVyZm9ybWFuY2U6OnNlbmRUb01lZGlhTWV0cmljcyhkYXRhKTsKKyAgICAgICAgICAgIGRhdGEucmVzZXQoKTsgICAvLyBkYXRhIGlzIHBlcnNpc3RlbnQgcGVyIHRocmVhZAorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKKyAgICAvLyBPcHRpb25zIGZvciBkdW1wc3lzCisgICAgYm9vbCBwYSA9IGZhbHNlLCBqc29uID0gZmFsc2UsIHBsb3RzID0gZmFsc2UsIHJldHJvID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZhcmcgOiBhcmdzKSB7CisgICAgICAgIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGEiKSkgeworICAgICAgICAgICAgcGEgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1qc29uIikpIHsKKyAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wbG90cyIpKSB7CisgICAgICAgICAgICBwbG90cyA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXJldHJvIikpIHsKKyAgICAgICAgICAgIHJldHJvID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIDAgLyppbmRlbnQqLywgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOworICAgIH0KKyAgICBpZiAoanNvbikgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcEpzb24oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocGxvdHMpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBQbG90cyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChyZXRybykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFJldHJvKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7CisgICAgaWYgKGF1dGhvciA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jaworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtUmVhZGVyc1thdXRob3JdLT5uYW1lKCkuY19zdHIoKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQorICAgIDogbU1lcmdlcihtZXJnZXIpLAorICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKKyAgICAgIG1UaW1lb3V0VXMoMCkKK3sKK30KKworTWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpCit7CisgICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgorICAgIHJlcXVlc3RFeGl0KCk7CisgICAgc2V0VGltZW91dFVzKDApOworICAgIGpvaW4oKTsKK30KKworYm9vbCBNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgYm9vbCBkb01lcmdlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgorICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCBtZXJnZS4gVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gd2FraW5nIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICAgICAgLy8gaXMgaGFuZGxlZCBpbiBBdWRpb0ZsaW5nZXI6Ok1lZGlhTG9nTm90aWZpZXI6OnRocmVhZExvb3AoKS4KKyAgICAgICAgbUNvbmQud2FpdChtTXV0ZXgpOworICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7CisgICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7CisgICAgfQorICAgIGlmIChkb01lcmdlKSB7CisgICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKKyAgICAgICAgbU1lcmdlci5tZXJnZSgpOworICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisgICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCisgICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKKyAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6d2FrZXVwKCkKK3sKKyAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIG1UaW1lb3V0VXMgPSB0aW1lOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcCBiL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmYTNlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxudW1lcmljPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgTkJMb2c6OkVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93Ci0gICAgaWYgKG9mZnNldCA9PSAwKQotICAgICAgICByZXR1cm4gbUV2ZW50OwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAxKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qc3RhdGljKi8KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6QWJzdHJhY3RFbnRyeT4gTkJMb2c6OkFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7Ci0gICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKLSAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX0KLQotTkJMb2c6OkFic3RyYWN0RW50cnk6OkFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Ci19Ci0KLWNvbnN0IGNoYXIgKk5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKLX0KLQotc2l6ZV90IE5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgfQotICAgIHJldHVybiBpdDsKLX0KLQotaW50NjRfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6OkZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKLSAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKLSAgICByZXR1cm4gaGFzaDsKLX0KLQotaW50IE5CTG9nOjpGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50PigpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgLy8gY29weSB0aW1lc3RhbXAKLSAgICAoKytpdCkuY29weVRvKGRzdCk7ICAgIC8vIGNvcHkgaGFzaAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsKLSAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5Ci0gICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7Ci0gICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9BVVRIT1I7Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KLSAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KLSAgICAgICAgc2l6ZW9mKGF1dGhvcik7Ci0gICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOwotICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7Ci0gICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKLSAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgaXQuY29weVRvKGRzdCk7Ci0gICAgfQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0OwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdCB7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICBkc3QtPndyaXRlKHB0ciwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdCB7Ci0gICAgbWVtY3B5KCh2b2lkKikgZHN0LCBwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpCi0gICAgOiBwdHIobnVsbHB0cikge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCi0gICAgOiBwdHIoZW50cnkpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikKLSAgICA6IHB0cihvdGhlci5wdHIpIHt9Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gKihlbnRyeSopIHB0cjsKLX0KLQotY29uc3QgTkJMb2c6OmVudHJ5KiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0IHsKLSAgICByZXR1cm4gKGVudHJ5KikgcHRyOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gICAgcHRyICs9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpIHsKLSAgICBwdHIgLT0gcHRyW05CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiArK2F1eDsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiAtLWF1eDsKLX0KLQotaW50IE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAtIG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgIT0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IHB0cltwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQ2NF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOwotfQotCi1pbnQgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOwotICAgIGlmIChpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KLSAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9Ci0gICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKLSAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKLSAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKLSAgICAvLyBDb3B5IHRoZSBhdXRob3IKLSAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7Ci0gICAgLy8gVXBkYXRlIGxlbmd0aHMKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQotICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCi0gICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gTkJMb2cuaAotTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQotICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQotewotICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOwotfQotCi1OQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCi17Ci0gICAgbVNoYXJlZC0+flNoYXJlZCgpOwotICAgIGlmIChtT3duKSB7Ci0gICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qc3RhdGljKi8KLXNpemVfdCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCi17Ci0gICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAotICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoKQotICAgIDogbVNoYXJlZChOVUxMKSwgbUZpZm8oTlVMTCksIG1GaWZvV3JpdGVyKE5VTEwpLCBtRW5hYmxlZChmYWxzZSksIG1QaWRUYWcoTlVMTCksIG1QaWRUYWdTaXplKDApCi17Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKLSAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCi17Ci0gICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQotICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKLSAgICBjaGFyIHByb2NOYW1lWzE2XTsKLSAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKLSAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQotICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOwotICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKLSAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOwotICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOwotICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OldyaXRlcjo6fldyaXRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvV3JpdGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLSAgICBkZWxldGVbXSBtUGlkVGFnOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCi0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKLSAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOwotICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwotICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCi0gICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50NjRfdCB0cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAodHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9JTlRFR0VSLCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfRkxPQVQsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVEFSVF9GTVQsIGZtdCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFbmQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBlbnRyeSA9IEVudHJ5KEVWRU5UX0VORF9GTVQsIE5VTEwsIDApOwotICAgIGxvZygmZW50cnksIHRydWUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGhhc2gpOwotICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotICAgIGludCBpOwotICAgIGRvdWJsZSBmOwotICAgIGNoYXIqIHM7Ci0gICAgaW50NjRfdCB0OwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgaWYgKCpwICE9ICclJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKCorK3ApIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOwotICAgICAgICAgICAgV3JpdGVyOjpsb2cocyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dJbnRlZ2VyKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBmID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cwotICAgICAgICAgICAgV3JpdGVyOjpsb2dGbG9hdCgoZmxvYXQpZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ1BJRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZwotICAgICAgICBjYXNlICdcMCc6Ci0gICAgICAgICAgICAtLXA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQotICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKLSAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50Ci0gICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOwotICAgIGxvZygmZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgTkJMb2c6OkVudHJ5ICpldHIsIGJvb2wgdHJ1c3RlZCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF0cnVzdGVkKSB7Ci0gICAgICAgIGxvZyhldHItPm1FdmVudCwgZXRyLT5tRGF0YSwgZXRyLT5tTGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbmVlZCA9IGV0ci0+bUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7ICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KLQotICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KLSAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgotICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZwotICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOwotICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKLSAgICAgICAgdGVtcFtpXSA9IGV0ci0+Y29weUVudHJ5RGF0YUF0KGkpOwotICAgIH0KLSAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKLSAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUVuYWJsZWQ7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKLSAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIoKQotICAgIDogV3JpdGVyKCkKLXsKLX0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQotewotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZyhzdHJpbmcpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlIGNsb2NrX2dldHRpbWUoKSBzeXNjYWxsCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodHMpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0ludGVnZXIoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRmxvYXQoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nUElEKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotfQotCi0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6c3RhcnRpbmdUeXBlcyB7TkJMb2c6OkV2ZW50OjpFVkVOVF9TVEFSVF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbUZkKC0xKSwgbUluZGVudCgwKSwgbUxvc3QoMCksCi0gICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKLXsKLX0KLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6UmVhZGVyOjp+UmVhZGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9SZWFkZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotfQotCi1jb25zdCB1aW50OF90ICpOQkxvZzo6UmVhZGVyOjpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcykgewotICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgewotICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOwotICAgICAgICBpZiAocHJldiA8IGZyb250IHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrKSB7Ci0KLSAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZXMuZmluZCgoY29uc3QgRXZlbnQpIHByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSkgIT0gdHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBwcmV2OwotICAgICAgICB9Ci0gICAgICAgIGJhY2sgPSBwcmV2OwotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKLX0KLQotLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAotLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcwotLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+IE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90KCkKLXsKLSAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotICAgIC8vIG1ha2UgYSBjb3B5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggd3JpdGVyCi0gICAgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7Ci0KLSAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKLSAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQotICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKLSAgICBzaXplX3QgbG9zdDsKLSAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKLSAgICBzc2l6ZV90IGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0KTsKLSAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKLSAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKLSAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKLSAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKLSAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCi0gICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCi0gICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCi0gICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRU5EX0ZNVCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgotICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKLSAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKLQotICAgIC8vIEZpbmQgbGFzdCBFTkRfRk1ULiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCi0gICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRU5EX0ZNVC4KLSAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGJhY2ssIGVuZGluZ1R5cGVzKTsKLSAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBFTkRfRk1UIGVudHJ5Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7Ci0gICAgICAgIC8vIGZpbmQgZmlyc3QgU1RBUlRfRk1UCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOwotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBmaXJzdFN0YXJ0VG1wLCBzdGFydGluZ1R5cGVzKSkKLSAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gU1RBUlRfRk1UIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAotICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgotICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOwotCi0gICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKLSAgICByZXR1cm4gc25hcHNob3Q7Ci0KLX0KLQotLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAotLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQotewotICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotCi0gICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7Ci0gICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKLSAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeSh0cyk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzIGlmIHVudXNlZAotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9FTkRfRk1UOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGdvdCB0byBlbmQgZm9ybWF0IGV2ZW50Iik7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGVudHJ5LT50eXBlKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgdGhlIHdhcm5pbmdzIGhlcmUgb3IgZWxzZXdoZXJlCi0gICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCi17Ci0gICAgLy8gZ2V0IGEgc25hcHNob3QsIHByb2Nlc3MgaXQKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXAgPSBnZXRTbmFwc2hvdCgpOwotICAgIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgqc25hcCk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgaW50IGluZGVudCkgewotICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAotICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCBpbmRlbnQsIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKLX0KLQotLy8gV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBjb25zb2xlCi12b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzggJnRpbWVzdGFtcCwgU3RyaW5nOCAmYm9keSkKLXsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9Ci0gICAgYm9keS5jbGVhcigpOwotfQotCi1ib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKLXsKLSAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE5CTG9nOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludDY0X3QgdHM7Ci0gICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQgeCA9ICooKGludCopIGRhdGEpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgZmxvYXQgZjsKLSAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmbG9hdCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKLSAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgU3RyaW5nOCBzdHI7Ci0gICAgc3RyLmFwcGVuZCgiWyAiKTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKLSAgICB9Ci0gICAgc3RyLmFwcGVuZCgiXSIpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OlJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpIHsKLSAgICAvLyBsb2cgdGltZXN0YW1wCi0gICAgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKLSAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci0KLSAgICAvLyBsb2cgdW5pcXVlIGhhc2gKLSAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7Ci0gICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7Ci0KLSAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQotICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7Ci0KLSAgICAvLyBsb2cgc3RyaW5nCi0gICAgTkJMb2c6OkVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOwotCi0gICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7Ci0gICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKLQotICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7Ci0gICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlJSIiCi0gICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJVwwIgotICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE5CTG9nOjpFdmVudCBldmVudCA9IChOQkxvZzo6RXZlbnQpIGFyZy0+dHlwZTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOwotCi0gICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKLQotICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKLSAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKLSAgICAgICAgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9USU1FU1RBTVAsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9JTlRFR0VSLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTE9BVCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1BJRCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7Ci0gICAgICAgIH0KLSAgICAgICAgKythcmc7Ci0gICAgfQotICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9FTkRfRk1ULCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKLSAgICArK2FyZzsKLSAgICByZXR1cm4gYXJnOwotfQotCi1OQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6Ci0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCi0gICAgICB7fQotCi12b2lkIE5CTG9nOjpNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBOQkxvZzo6TmFtZWRSZWFkZXIgJnJlYWRlcikgewotCi0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIG1OYW1lZFJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Ci19Ci0KLS8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKLS8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCi1zdHJ1Y3QgTWVyZ2VJdGVtCi17Ci0gICAgaW50NjRfdCB0czsKLSAgICBpbnQgaW5kZXg7Ci0gICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Ci19OwotCi0vLyBvcGVyYXRvcnMgbmVlZGVkIGZvciBwcmlvcml0eSBxdWV1ZSBpbiBtZXJnZQotLy8gYm9vbCBvcGVyYXRvcj4oY29uc3QgaW50NjRfdCAmdDEsIGNvbnN0IGludDY0X3QgJnQyKSB7Ci0vLyAgICAgcmV0dXJuIHQxLnR2X3NlYyA+IHQyLnR2X3NlYyB8fCAodDEudHZfc2VjID09IHQyLnR2X3NlYyAmJiB0MS50dl9uc2VjID4gdDIudHZfbnNlYyk7Ci0vLyB9Ci0KLWJvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikgewotICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKLX0KLQotLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQotdm9pZCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBtZXJnZSB0aHJlYWQKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgaW50IG5Mb2dzID0gbU5hbWVkUmVhZGVycy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKLSAgICBzdGQ6OnZlY3RvcjxOQkxvZzo6RW50cnlJdGVyYXRvcj4gb2Zmc2V0cyhuTG9ncyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7Ci0gICAgICAgIHNuYXBzaG90c1tpXSA9IG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmdldFNuYXBzaG90KCk7Ci0gICAgICAgIG9mZnNldHNbaV0gPSBzbmFwc2hvdHNbaV0tPmJlZ2luKCk7Ci0gICAgfQotICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cwotICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCi0gICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCi0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgewotICAgICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCi0gICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7Ci0gICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKLSAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+Y29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcwotICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOwotICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiYgTkJMb2c6Ok1lcmdlcjo6Z2V0TmFtZWRSZWFkZXJzKCkgY29uc3QgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgcmV0dXJuIG1OYW1lZFJlYWRlcnM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQotICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSksIG1OYW1lZFJlYWRlcnMobWVyZ2VyLmdldE5hbWVkUmVhZGVycygpKSB7fQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IE5CTG9nOjpBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkgewotICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKLSAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gbU5hbWVkUmVhZGVyc1thdXRob3JdLm5hbWUoKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTkJMb2c6Ok1lcmdlciAmbWVyZ2VyLCBOQkxvZzo6TWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQotICAgIDogbU1lcmdlcihtZXJnZXIpLAotICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKLSAgICAgIG1UaW1lb3V0VXMoMCkge30KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKSB7Ci0gICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgc2V0VGltZW91dFVzKDApOwotICAgIGpvaW4oKTsKLX0KLQotYm9vbCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgYm9vbCBkb01lcmdlOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgotICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCB3YWl0IGtUaHJlYWRTbGVlcFBlcmlvZFVzIGFuZCB0aGVuIG1lcmdlCi0gICAgICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBtVGltZW91dFVzID4gMCA/IGtUaHJlYWRTbGVlcFBlcmlvZFVzICogMTAwMCA6IExMT05HX01BWDsKLSAgICAgICAgbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWUpOwotICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7Ci0gICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7Ci0gICAgfQotICAgIGlmIChkb01lcmdlKSB7Ci0gICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKLSAgICAgICAgbU1lcmdlci5tZXJnZSgpOwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCi0gICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCi0gICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKLSAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6Ondha2V1cCgpIHsKLSAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkgewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIG1UaW1lb3V0VXMgPSB0aW1lOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKaW5kZXggZjA5ZTkzZC4uZTkxYTUxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKQEAgLTE3LDEzICsxNywxNiBAQAogCiAjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAorLy8gI2RlZmluZSBXUklURV9UT19GSUxFCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTMyLDIwICszNSwxMjYgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0xvZ1Bsb3QuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKK3ZvaWQgSGlzdG9ncmFtOjphZGQoZG91YmxlIHZhbHVlKQoreworICAgIGlmIChtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUT0RPIEhhbmRsZSBkb21haW4gYW5kIHJhbmdlIGVycm9yIGV4Y2VwdGlvbnM/CisgICAgY29uc3QgaW50IHVuYm91bmRlZEluZGV4ID0gbHJvdW5kKCh2YWx1ZSAtIG1Mb3cpIC8gbUJpblNpemUpICsgMTsKKyAgICAvLyBzdGQ6OmNsYW1wIGlzIGludHJvZHVjZWQgaW4gQysrMTcKKyAgICAvL2NvbnN0IGludCBpbmRleCA9IHN0ZDo6Y2xhbXAodW5ib3VuZGVkSW5kZXgsIDAsIChpbnQpKG1CaW5zLnNpemUoKSAtIDEpKTsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBzdGQ6Om1heCgwLCBzdGQ6Om1pbigoaW50KShtQmlucy5zaXplKCkgLSAxKSwgdW5ib3VuZGVkSW5kZXgpKTsKKyAgICBtQmluc1tpbmRleF0rKzsKKyAgICBtVG90YWxDb3VudCsrOworfQorCit2b2lkIEhpc3RvZ3JhbTo6Y2xlYXIoKQoreworICAgIHN0ZDo6ZmlsbChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSwgMCk7CisgICAgbVRvdGFsQ291bnQgPSAwOworfQorCit1aW50NjRfdCBIaXN0b2dyYW06OnRvdGFsQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtVG90YWxDb3VudDsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0RpdmlkZXIgPSAnfCc7CisgICAgc3MgPDwga1ZlcnNpb24gPDwgIiwiIDw8IG1CaW5TaXplIDw8ICIsIiA8PCBtTnVtQmlucyA8PCAiLCIgPDwgbUxvdyA8PCAiLHsiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1CaW5zW2ldICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBzcyA8PCAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCBzdGF0aWNfY2FzdDxpbnQ+KGkpIC0gMSA8PCBrRGl2aWRlciA8PCBtQmluc1tpXTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgc3MgPDwgIn0iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OmFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQpIGNvbnN0IHsKKyAgICBpZiAodG90YWxDb3VudCgpID09IDAgfHwgbUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga01hcmtlciA9ICctJzsKKyAgICAvLyBPbmUgaW5jcmVtZW50IGlzIGNvbnNpZGVyZWQgb25lIHN0ZXAgb2YgYSBiaW4ncyBoZWlnaHQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlcnNQZXJJbmNyZW1lbnQgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhJbmNyZW1lbnRzID0gNjQgKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1iZXJXaWR0aCA9IDc7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtNYXJrZXJzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsIGtNYXJrZXIpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrU3BhY2VzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsICcgJyk7CisgICAgLy8gZ2V0IHRoZSBsYXN0IG4gY2hhcmFjdGVycyBvZiBzLCBvciB0aGUgd2hvbGUgc3RyaW5nIGlmIGl0IGlzIHNob3J0ZXIKKyAgICBhdXRvIGdldFRhaWwgPSBbXShjb25zdCBzaXplX3QgbiwgY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKKyAgICAgICAgcmV0dXJuIHMuY19zdHIoKSArIHMuc2l6ZSgpIC0gc3RkOjptaW4obiwgcy5zaXplKCkpOworICAgIH07CisKKyAgICAvLyBTaW5jZSB0b3RhbENvdW50KCkgPiAwLCBtQmlucyBpcyBub3QgZW1wdHkgYW5kIG1heENvdW50ID4gMC4KKyAgICBjb25zdCB1bnNpZ25lZCBtYXhDb3VudCA9ICpzdGQ6Om1heF9lbGVtZW50KG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpKTsKKyAgICBjb25zdCBzaXplX3QgbWF4SW5jcmVtZW50cyA9IGxvZzIobWF4Q291bnQpICsgMTsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgLy8gTm9uLXplcm8gYmlucyBtdXN0IGV4aXN0IGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0b3RhbENvdW50KCkgPiAwLgorICAgIHNpemVfdCBmaXJzdE5vblplcm9CaW4gPSAwOworICAgIC8vIElmIGZpcnN0Tm9uWmVyb0JpbiByZWFjaGVzIG1CaW5zLnNpemUoKSAtIDEsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBmaXJzdE5vblplcm9CaW4gPCBtQmlucy5zaXplKCkgLSAxICYmIG1CaW5zW2ZpcnN0Tm9uWmVyb0Jpbl0gPT0gMDsgZmlyc3ROb25aZXJvQmluKyspIHt9CisgICAgY29uc3Qgc2l6ZV90IGZpcnN0QmluVG9QcmludCA9IGZpcnN0Tm9uWmVyb0JpbiA9PSAwID8gMCA6IGZpcnN0Tm9uWmVyb0JpbiAtIDE7CisKKyAgICBzaXplX3QgbGFzdE5vblplcm9CaW4gPSBtQmlucy5zaXplKCkgLSAxOworICAgIC8vIElmIGxhc3ROb25aZXJvQmluIHJlYWNoZXMgMCwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGxhc3ROb25aZXJvQmluID4gMCAmJiBtQmluc1tsYXN0Tm9uWmVyb0Jpbl0gPT0gMDsgbGFzdE5vblplcm9CaW4tLSkge30KKyAgICBjb25zdCBzaXplX3QgbGFzdEJpblRvUHJpbnQgPSBsYXN0Tm9uWmVyb0JpbiA9PSBtQmlucy5zaXplKCkgLSAxID8gbGFzdE5vblplcm9CaW4KKyAgICAgICAgICAgIDogbGFzdE5vblplcm9CaW4gKyAxOworCisgICAgZm9yIChzaXplX3QgYmluID0gZmlyc3RCaW5Ub1ByaW50OyBiaW4gPD0gbGFzdEJpblRvUHJpbnQ7IGJpbisrKSB7CisgICAgICAgIHNzIDw8IHN0ZDo6c2V0dyhpbmRlbnQgKyBrTWF4TnVtYmVyV2lkdGgpOworICAgICAgICBpZiAoYmluID09IDApIHsKKyAgICAgICAgICAgIHNzIDw8ICI8IjsKKyAgICAgICAgfSBlbHNlIGlmIChiaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgc3MgPDwgIj4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3MgPDwgbUxvdyArIChiaW4gLSAxKSAqIG1CaW5TaXplOworICAgICAgICB9CisgICAgICAgIHNzIDw8ICIgfCI7CisgICAgICAgIHNpemVfdCBpbmNyZW1lbnRzID0gMDsKKyAgICAgICAgY29uc3QgdWludDY0X3QgYmluQ291bnQgPSBtQmluc1tiaW5dOworICAgICAgICBpZiAoYmluQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpbmNyZW1lbnRzID0gbG9nMihiaW5Db3VudCkgKyAxOworICAgICAgICAgICAgc3MgPDwgZ2V0VGFpbChpbmNyZW1lbnRzICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtNYXJrZXJzKTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBnZXRUYWlsKChtYXhJbmNyZW1lbnRzIC0gaW5jcmVtZW50cyArIDEpICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtTcGFjZXMpCisgICAgICAgICAgICAgICAgPDwgYmluQ291bnQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLy8gR2l2ZW4gYW4gYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wLCBidWNrZXRzIHRoZSB0aW1lIGludGVydmFsCiAvLyBzaW5jZSB0aGUgcHJldmlvdXMgdGltZXN0YW1wIGludG8gYSBoaXN0b2dyYW0sIHNlYXJjaGVzIGZvcgogLy8gb3V0bGllcnMsIGFuYWx5emVzIHRoZSBvdXRsaWVyIHNlcmllcyBmb3IgdW5leHBlY3RlZGx5CkBAIC0yMDgsMjcgKzMxNyw2IEBACiAgICAgcmV0dXJuIGlzT3V0bGllcjsKIH0KIAotc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgd2lkdGgrKzsKLSAgICAgICAgeCA9IHggPT0gSU5UX01JTiA/IElOVF9NQVggOiAteDsKLSAgICB9Ci0gICAgLy8gYXNzZXJ0ICh4ID49IDApCi0gICAgZG8gewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0gd2hpbGUgKHggPiAwKTsKLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLS8vIGNvbXB1dGVzIHRoZSBjb2x1bW4gd2lkdGggcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgaGlzdG9ncmFtIHZhbHVlCi1pbmxpbmUgaW50IG51bWJlcldpZHRoKGRvdWJsZSBudW1iZXIsIGludCBsZWZ0UGFkZGluZykgewotICAgIC8vIEFkZGVkIHZhbHVlcyBhY2NvdW50IGZvciB3aGl0ZXNwYWNlcyBuZWVkZWQgYXJvdW5kIG51bWJlcnMsIGFuZCBmb3IgdGhlCi0gICAgLy8gZG90IGFuZCBkZWNpbWFsIGRpZ2l0IG5vdCBhY2NvdW50ZWQgZm9yIGJ5IHdpZHRoT2YKLSAgICByZXR1cm4gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcikpICsgMywgMiksIGxlZnRQYWRkaW5nICsgMSk7Ci19Ci0KIC8vIHJvdW5kcyB2YWx1ZSB0byBwcmVjaXNpb24gYmFzZWQgb24gbG9nLWRpc3RhbmNlIGZyb20gbWVhbgogX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogaW5saW5lIGRvdWJsZSBsb2dSb3VuZChkb3VibGUgeCwgZG91YmxlIG1lYW4pIHsKQEAgLTI1NCw3ICszNDIsNyBAQAogLy8gb2YgUGVyZm9ybWFuY2VBbmFseXNpcwogdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpyZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICBpZiAobUhpc3RzLmVtcHR5KCkpIHsKKyAgICBpZiAobUhpc3RzLmVtcHR5KCkgfHwgYm9keSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTI3Myw2OSArMzYxLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDIwMDsKLSAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOwotICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOwotCi0gICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKLSAgICBkb3VibGUgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCi0gICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgewotICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKLSAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7Ci0gICAgY29uc3QgaW50IGJ1Y2tldFdpZHRoID0gbnVtYmVyV2lkdGgobWF4RGVsdGEsIGxlZnRQYWRkaW5nKTsKLSAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7Ci0gICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0Ci0gICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewotICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7Ci0gICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzICUzLjJmICVzIiwgbGVmdFBhZGRpbmcgKyAxMSwKLSAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzJWQsICVsbGQsICVsbGRcbiIsIGxlZnRQYWRkaW5nICsgMTEsCisgICAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTI4OworICAgIGNoYXIgdGl0bGVbU0laRV07CisgICAgc25wcmludGYodGl0bGUsIHNpemVvZih0aXRsZSksICJcbiVzICUzLjJmICVzXG4lcyVkLCAlbGxkLCAlbGxkXG4iLAorICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIsCiAgICAgICAgICAgICAiVGhyZWFkLCBoYXNoLCBzdGFydGluZyB0aW1lc3RhbXA6ICIsIGF1dGhvciwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihzdGFydGluZ1RzKSk7Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7Ci0gICAgfQotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgewotICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgfQotICAgIC8vIHByaW50IHgtYXhpcwotICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogYnVja2V0V2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHN0YXJ0aW5nVHMpKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtMYWJlbCA9ICJtcyI7CiAKLSAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKi4qZiIsIGNvbFdpZHRoLCAxLCB4LmZpcnN0KTsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBidWNrZXRXaWR0aCwgc3BhY2VzLmNfc3RyKCksICJtc1xuIik7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlcyIsCisgICAgICAgICAgICBhdWRpb191dGlsc19wbG90X2hpc3RvZ3JhbShidWNrZXRzLCB0aXRsZSwga0xhYmVsLCBtYXhIZWlnaHQpLmNfc3RyKCkpOwogCiAgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcwogICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHM6XG4iKTsKQEAgLTM1MCw3ICszODUsOSBAQAogLy8gd3JpdGVzIHN1bW1hcnkgb2YgcGVyZm9ybWFuY2UgaW50byBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgU3RyaW5nOCBib2R5OworI2lmZGVmIFdSSVRFX1RPX0ZJTEUKICAgICBjb25zdCBjaGFyKiBjb25zdCBrRGlyZWN0b3J5ID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvIjsKKyNlbmRpZgogICAgIGZvciAoYXV0byAmIHRocmVhZCA6IHRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICAgICAgZm9yIChhdXRvICYgaGFzaDogdGhyZWFkLnNlY29uZCkgewogICAgICAgICAgICAgUGVyZm9ybWFuY2VBbmFseXNpcyYgY3VyciA9IGhhc2guc2Vjb25kOwpAQCAtMzYwLDkgKzM5NywxMSBAQAogICAgICAgICAgICAgICAgIGR1bXBMaW5lKGZkLCBpbmRlbnQsIGJvZHkpOwogICAgICAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUKKyNpZmRlZiBXUklURV9UT19GSUxFCisgICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlLiBFbmFibGUgYnkgdW5jb21tZW50aW5nIG1hY3JvIGF0IHRvcCBvZiBmaWxlLgogICAgICAgICAgICAgd3JpdGVUb0ZpbGUoY3Vyci5tSGlzdHMsIGN1cnIubU91dGxpZXJEYXRhLCBjdXJyLm1QZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXJlY3RvcnksIGZhbHNlLCB0aHJlYWQuZmlyc3QsIGhhc2guZmlyc3QpOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zNzQsNSArNDEzLDQgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU2ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplLCBuYW1lKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworUmVhZGVyOjp+UmVhZGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9SZWFkZXI7CisgICAgZGVsZXRlIG1GaWZvOworfQorCisvLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90CisvLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCisvLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KK3N0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gUmVhZGVyOjpnZXRTbmFwc2hvdChib29sIGZsdXNoKQoreworICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKKyAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQorICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKKyAgICBzaXplX3QgbG9zdCA9IDA7CisgICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07CisgICAgY29uc3Qgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7CisgICAgc3NpemVfdCBhdmFpbFRvUmVhZDsKKyAgICAvLyBBIGNhbGwgdG8gYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6Om9idGFpbigpIHBsYWNlcyB0aGUgcmVhZCBwb2ludGVyIG9uZSBidWZmZXIgbGVuZ3RoCisgICAgLy8gYmVmb3JlIHRoZSB3cml0ZXIncyBwb2ludGVyIChzaW5jZSBtRmlmb1JlYWRlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBmbHVzaD1mYWxzZSkuIFRoZQorICAgIC8vIGRvIHdoaWxlIGxvb3AgaXMgYW4gYXR0ZW1wdCB0byByZWFkIGFsbCBvZiB0aGUgRklGTydzIGNvbnRlbnRzIHJlZ2FyZGxlc3Mgb2YgaG93IGJlaGluZAorICAgIC8vIHRoZSByZWFkZXIgaXMgd2l0aCByZXNwZWN0IHRvIHRoZSB3cml0ZXIuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgc2NoZWR1bGluZyBzZXF1ZW5jZSBpcworICAgIC8vIHBvc3NpYmxlIGFuZCBjYW4gbGVhZCB0byBhIHN0YXJ2YXRpb24gc2l0dWF0aW9uOgorICAgIC8vIC0gV3JpdGVyIFQxIHdyaXRlcywgb3ZlcnJ1biB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyIFQyCisgICAgLy8gLSBUMiBjYWxscyBvYnRhaW4oKSBhbmQgZ2V0cyBFT1ZFUkZMT1csIFQyIHB0ciBwbGFjZWQgb25lIGJ1ZmZlciBzaXplIGJlaGluZCBUMSBwdHIKKyAgICAvLyAtIFQxIHdyaXRlLCBvdmVycnVuCisgICAgLy8gLSBUMiBvYnRhaW4oKSwgRU9WRVJGTE9XIChhbmQgc28gb24uLi4pCisgICAgLy8gVG8gYWRkcmVzcyB0aGlzIGlzc3VlLCB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIHRyaWVzIGZvciB0aGUgcmVhZGVyIHRvIGNhdGNoIHVwIHdpdGgKKyAgICAvLyB0aGUgd3JpdGVyLgorICAgIGludCB0cmllcyA9IDA7CisgICAgc2l6ZV90IGxvc3RUZW1wOworICAgIGRvIHsKKyAgICAgICAgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3RUZW1wKTsKKyAgICAgICAgbG9zdCArPSBsb3N0VGVtcDsKKyAgICB9IHdoaWxlIChhdmFpbFRvUmVhZCA8IDAgfHwgKyt0cmllcyA8PSBrTWF4T2J0YWluVHJpZXMpOworCisgICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKKyAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgPCAwLCAiTkJMb2cgUmVhZGVyICVzIGZhaWxlZCB0byBjYXRjaCB1cCB3aXRoIFdyaXRlciIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gQ2hhbmdlIHRvICNpZiAxIGZvciBkZWJ1Z2dpbmcuIFRoaXMgc3RhdGVtZW50IGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgYnVmZmVyIGZ1bGxuZXNzIGxldmVscworICAgIC8vIChhcyBzZWVuIGJ5IHJlYWRlcikgYW5kIGhvdyBtdWNoIGRhdGEgd2FzIGxvc3QuIElmIHlvdSBmaW5kIHRoYXQgdGhlIGZ1bGxuZXNzIGxldmVsIGlzCisgICAgLy8gZ2V0dGluZyBjbG9zZSB0byBmdWxsLCBvciB0aGF0IGRhdGEgbG9zcyBpcyBoYXBwZW5pbmcgdG8gb2Z0ZW4sIHRoZW4geW91IHNob3VsZAorICAgIC8vIHByb2JhYmx5IHRyeSBzb21lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBsb2cgbGVzcyBkYXRhCisgICAgLy8gLSBsb2cgbGVzcyBvZnRlbgorICAgIC8vIC0gaW5jcmVhc2UgdGhlIGluaXRpYWwgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgYnVmZmVyCisjaWYgMAorICAgIEFMT0dEKCJnZXRTbmFwc2hvdCBuYW1lPSVzLCBhdmFpbFRvUmVhZD0lemQsIGNhcGFjaXR5PSV6dSwgZnVsbG5lc3M9JS4zZiwgbG9zdD0lenUiLAorICAgICAgICAgICAgbmFtZSgpLmNfc3RyKCksIGF2YWlsVG9SZWFkLCBjYXBhY2l0eSwgKGRvdWJsZSlhdmFpbFRvUmVhZCAvIChkb3VibGUpY2FwYWNpdHksIGxvc3QpOworI2VuZGlmCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKKyAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKKyAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgorICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAorICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAorICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEZNVF9FTkQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KKyAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCisKKyAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7CisgICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7CisKKyAgICAvLyBGaW5kIGxhc3QgRk1UX0VORC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgorICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0ZNVF9FTkQuCisgICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgYmFjaywgaW52YWxpZEVuZFR5cGVzKTsKKyAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBGTVRfRU5EIGVudHJ5CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7CisgICAgICAgIC8vIGZpbmQgZmlyc3QgRk1UX1NUQVJUCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOworICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgZmlyc3RTdGFydFRtcCwgaW52YWxpZEJlZ2luVHlwZXMpKQorICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOworICAgICAgICB9CisgICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBGTVRfU1RBUlQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCisgICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOworICAgIH0KKworICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7CisgICAgcmV0dXJuIHNuYXBzaG90OworfQorCitib29sIFJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAoreworICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKK30KKworLy8gV2UgbWFrZSBhIHNldCBvZiB0aGUgaW52YWxpZCB0eXBlcyByYXRoZXIgdGhhbiB0aGUgdmFsaWQgdHlwZXMgd2hlbiBhbGlnbmluZworLy8gU25hcHNob3QgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcyBkdXJpbmcgbG9nIGNvcnJ1cHRpb24gY2hlY2tpbmcuCisvLyBUaGlzIGlzIGRvbmUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIG1haW50ZW5hbmNlIG92ZXJoZWFkIG9mIGFkZGluZyBhIG5ldyBFdmVudAorLy8gdHlwZSB0byB0aGUgdHdvIHNldHMgYmVsb3cgd2hlbmV2ZXIgYSBuZXcgRXZlbnQgdHlwZSBpcyBjcmVhdGVkLCBhcyBpdCBpcworLy8gdmVyeSBsaWtlbHkgdGhhdCBuZXcgdHlwZXMgYWRkZWQgd2lsbCBiZSB2YWxpZCB0eXBlcy4KKy8vIEN1cnJlbnRseSwgaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNwZWNpYWwKKy8vIGNhc2Ugb2YgYSBGb3JtYXQgRW50cnksIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcy4KKy8vIElmIGEgbmV3IEV2ZW50IGlzIGFkZGVkIHRoYXQgY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLAorLy8gdGhlbiB0aGVzZSBzZXRzIG5lZWQgdG8gYmUgdXBkYXRlZC4KKworLy8gV2Ugd2FudCB0aGUgYmVnaW5uaW5nIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhbiBGTVRfRU5ELgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRCZWdpblR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9FTkQsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworLy8gV2Ugd2FudCB0aGUgZW5kIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhIEZNVF9TVEFSVC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkRW5kVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUQVJULAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKK2NvbnN0IHVpbnQ4X3QgKlJlYWRlcjo6ZmluZExhc3RWYWxpZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKSB7CisgICAgaWYgKGZyb250ID09IG51bGxwdHIgfHwgYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKKyAgICAgICAgY29uc3QgRXZlbnQgdHlwZSA9IChjb25zdCBFdmVudClwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV07CisgICAgICAgIGlmIChwcmV2IDwgZnJvbnQKKyAgICAgICAgICAgICAgICB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2sKKyAgICAgICAgICAgICAgICB8fCB0eXBlIDw9IEVWRU5UX1JFU0VSVkVEIHx8IHR5cGUgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKKyAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBpbnZhbGlkVHlwZXMgZG9lcyBub3QgY29udGFpbiB0aGUgdHlwZSwgdGhlbiB0aGUgdHlwZSBpcyB2YWxpZC4KKyAgICAgICAgaWYgKGludmFsaWRUeXBlcy5maW5kKHR5cGUpID09IGludmFsaWRUeXBlcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgYmFjayA9IHByZXY7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAorfQorCisvLyBUT0RPIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSwgd291bGQgcHJlZmVyIHRvIGhhdmUgYSBkdW1wKCkgZ28gdG8gc3RyaW5nLCBhbmQgdGhlbiBnbworLy8gdG8gZmQgb25seSB3aGVuIGludm9rZWQgdGhyb3VnaCBiaW5kZXIuCit2b2lkIER1bXBSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50KQoreworICAgIGlmIChmZCA8IDApIHJldHVybjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90ID0gZ2V0U25hcHNob3QoZmFsc2UgLypmbHVzaCovKTsKKyAgICBpZiAoc25hcHNob3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OworCisgICAgLy8gVE9ETyBhbGwgbG9nZ2VkIHR5cGVzIHNob3VsZCBoYXZlIGEgcHJpbnRhYmxlIGZvcm1hdC4KKyAgICAvLyBUT0RPIGNhbiB3ZSBtYWtlIHRoZSBwcmludGluZyBnZW5lcmljPworICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LT5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgICAgIGl0ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGl0KSwgJnRpbWVzdGFtcCwgJmJvZHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX0xBVEVOQ1ksJS4zZiIsIGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9PVkVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfSU5GTywlZCwlcyIsIHN0YXRpY19jYXN0PGludD4oaW5mby5pZCksCisgICAgICAgICAgICAgICAgICAgIHRocmVhZFR5cGVUb1N0cmluZyhpbmZvLnR5cGUpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9VTkRFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV0FSTVVQX1RJTUUsJS4zZiIsIHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dPUktfVElNRSwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtb25vdG9uaWNOcykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfUEFSQU1TLCV6dSwldSIsIHBhcmFtcy5mcmFtZUNvdW50LCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX0VORDoKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJS4qcyVzICVzXG4iLCAoaW50KWluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgICAgICAgICBib2R5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIER1bXBSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCisgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBTdHJpbmc4IHRpbWVzdGFtcExvY2FsOworICAgIFN0cmluZzggYm9keUxvY2FsOworICAgIGlmICh0aW1lc3RhbXAgPT0gbnVsbHB0cikgeworICAgICAgICB0aW1lc3RhbXAgPSAmdGltZXN0YW1wTG9jYWw7CisgICAgfQorICAgIGlmIChib2R5ID09IG51bGxwdHIpIHsKKyAgICAgICAgYm9keSA9ICZib2R5TG9jYWw7CisgICAgfQorCisgICAgLy8gbG9nIHRpbWVzdGFtcAorICAgIGNvbnN0IGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKKyAgICB0aW1lc3RhbXAtPmNsZWFyKCk7CisgICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOworCisgICAgLy8gbG9nIHVuaXF1ZSBoYXNoCisgICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOworICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOworCisgICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKKyAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOworCisgICAgLy8gbG9nIHN0cmluZworICAgIEVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOworCisgICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7CisgICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKKworICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7CisgICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlJSIiCisgICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJVwwIgorICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50IGV2ZW50ID0gKEV2ZW50KSBhcmctPnR5cGU7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKKworICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0CisKKyAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCisgICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1NUUklORywKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0ZMT0FULAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncCc6IC8vIHBpZAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1BJRCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7CisgICAgICAgIH0KKyAgICAgICAgKythcmc7CisgICAgfQorICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9GTVRfRU5ELCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9pbnQgeCA9ICooKGludCopIGRhdGEpOworICAgIGludCB4OworICAgIG1lbWNweSgmeCwgZGF0YSwgc2l6ZW9mKHgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmxvYXQgZjsKKyAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7CisgICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDY0X3QgdHM7CisgICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIHN0ci5hcHBlbmQoIlsgIik7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJdIik7CisgICAgcmV0dXJuIHN0cjsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQoreworICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCmluZGV4IDgyN2U3MzEuLmIwNTBiODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTE1LDkgKzE1LDExIEBACiAgKi8KIAogI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMjcsMjMgKzI5LDE5NSBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkdW1wVG9Kc29uKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6VmFsdWU+IHJvb3RQdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPEpzb246OlZhbHVlPihKc29uOjpvYmplY3RWYWx1ZSk7CisgICAgSnNvbjo6VmFsdWUmIHJvb3QgPSAqcm9vdFB0cjsKKyAgICByb290WyJpb0hhbmRsZSJdID0gZGF0YS50aHJlYWRJbmZvLmlkOworICAgIHJvb3RbInR5cGUiXSA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgIHJvb3RbImZyYW1lQ291bnQiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQ7CisgICAgcm9vdFsic2FtcGxlUmF0ZSJdID0gKEpzb246OlZhbHVlOjpJbnQpZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgICByb290WyJ3b3JrTXNIaXN0Il0gPSBkYXRhLndvcmtIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsibGF0ZW5jeU1zSGlzdCJdID0gZGF0YS5sYXRlbmN5SGlzdC50b1N0cmluZygpOworICAgIHJvb3RbIndhcm11cE1zSGlzdCJdID0gZGF0YS53YXJtdXBIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsidW5kZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEudW5kZXJydW5zOworICAgIHJvb3RbIm92ZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEub3ZlcnJ1bnM7CisgICAgcm9vdFsiYWN0aXZlTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoZGF0YS5hY3RpdmUpOworICAgIHJvb3RbImR1cmF0aW9uTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoc3lzdGVtVGltZSgpIC0gZGF0YS5zdGFydCk7CisgICAgcmV0dXJuIHJvb3RQdHI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgIHNzIDw8ICJUaHJlYWQgdHlwZT0iIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpCisgICAgICAgICAgICA8PCAiIGhhbmRsZT0iIDw8IGRhdGEudGhyZWFkSW5mby5pZAorICAgICAgICAgICAgPDwgIiBzYW1wbGVSYXRlPSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZQorICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50PSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCA8PCAiXG4iOworICAgIHNzIDw8ICIgIFRocmVhZCB3b3JrIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndvcmtIaXN0LmFzY2lpQXJ0U3RyaW5nKDQgLyppbmRlbnQqLyk7CisgICAgc3MgPDwgIiAgVGhyZWFkIGxhdGVuY2llcyBpbiBtczpcbiIgPDwgZGF0YS5sYXRlbmN5SGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCB3YXJtdXAgdGltZXMgaW4gbXM6XG4iIDw8IGRhdGEud2FybXVwSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKc29uOjpWYWx1ZSByb290KEpzb246OmFycmF5VmFsdWUpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICAvLyBTa2lwIHRocmVhZHMgdGhhdCBkbyBub3QgaGF2ZSBwZXJmb3JtYW5jZSBkYXRhIHJlY29yZGVkIHlldC4KKyAgICAgICAgaWYgKGRhdGEuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkYXRhSnNvbiA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wVG9Kc29uKGRhdGEpOworICAgICAgICBpZiAoZGF0YUpzb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKCpkYXRhSnNvbilbInRocmVhZE51bSJdID0gaXRlbS5maXJzdDsKKyAgICAgICAgcm9vdC5hcHBlbmQoKmRhdGFKc29uKTsKKyAgICB9CisgICAgSnNvbjo6U3R5bGVkV3JpdGVyIHdyaXRlcjsKKyAgICBzdGQ6OnN0cmluZyByb290U3RyID0gd3JpdGVyLndyaXRlKHJvb3QpOworICAgIHdyaXRlKGZkLCByb290U3RyLmNfc3RyKCksIHJvb3RTdHIuc2l6ZSgpKTsKK30KKwordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogdGhyZWFkRGF0YU1hcCkgeworICAgICAgICBjb25zdCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGhpc3RzID0gUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBIaXN0b2dyYW1zVG9TdHJpbmcoZGF0YSk7CisgICAgICAgIHdyaXRlKGZkLCBoaXN0cy5jX3N0cigpLCBoaXN0cy5zaXplKCkpOworICAgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBSZXRyb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEsIGludDY0X3Qgbm93KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpIDw8ICIsIiA8PCBkYXRhLnRocmVhZEluZm8uaWQgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiBkYXRhLnNuYXBzaG90cykgeworICAgICAgICAvLyBUT0RPIHVzZSBhbiBlbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIG1ldGhvZC4gT25lIGdvb2QgaWRlYToKKyAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIzODE1NworICAgICAgICBpZiAoaXRlbS5maXJzdCA9PSBOQkxvZzo6RVZFTlRfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9VTkRFUlJVTiwiOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX09WRVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9PVkVSUlVOLCI7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgbm93IC0gaXRlbS5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0cm9TdHIgPSBkdW1wUmV0cm9TdHJpbmcoZGF0YSwgbm93KTsKKyAgICAgICAgd3JpdGUoZmQsIHJldHJvU3RyLmNfc3RyKCksIHJldHJvU3RyLnNpemUoKSk7CisgICAgfQorfQorCitib29sIHNlbmRUb01lZGlhTWV0cmljcyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIG1ldHJpY3MgaGVyZToKKyAgICAvLyBkb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xMS0tNmR5T1hWT3BhY1lRTFppYU9ZNVFWdFFqVXlxTngyelQ5Y0N6TEtZRS9lZGl0P3VzcD1zaGFyaW5nCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC50eXBlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEZyYW1lQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmZyYW1lY291bnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuc2FtcGxlcmF0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXb3JrSGlzdFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQud29ya01zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkTGF0ZW5jeUhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmxhdGVuY3lNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFdhcm11cEhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndhcm11cE1zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVW5kZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC51bmRlcnJ1bnMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkT3ZlcnJ1bnNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLm92ZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEFjdGl2ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuYWN0aXZlTXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkRHVyYXRpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmR1cmF0aW9uTXMiOworCisgICAgLy8gQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IEZhc3RNaXhlciB0aHJlYWQgZGF0YSB0byBiZSBzZW50IHRvIE1lZGlhIE1ldHJpY3MuCisgICAgaWYgKGRhdGEudGhyZWFkSW5mby50eXBlICE9IE5CTG9nOjpGQVNUTUlYRVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdGhyZWFkIikpOworCisgICAgY29uc3QgSGlzdG9ncmFtICZ3b3JrSGlzdCA9IGRhdGEud29ya0hpc3Q7CisgICAgaWYgKHdvcmtIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV29ya0hpc3QsIHdvcmtIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZsYXRlbmN5SGlzdCA9IGRhdGEubGF0ZW5jeUhpc3Q7CisgICAgaWYgKGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkTGF0ZW5jeUhpc3QsIGxhdGVuY3lIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZ3YXJtdXBIaXN0ID0gZGF0YS53YXJtdXBIaXN0OworICAgIGlmICh3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV2FybXVwSGlzdCwgd2FybXVwSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChkYXRhLnVuZGVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZFVuZGVycnVucywgZGF0YS51bmRlcnJ1bnMpOworICAgIH0KKworICAgIGlmIChkYXRhLm92ZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkT3ZlcnJ1bnMsIGRhdGEub3ZlcnJ1bnMpOworICAgIH0KKworICAgIC8vIFNlbmQgdG8gTWVkaWEgTWV0cmljcyBpZiB0aGUgcmVjb3JkIGlzIG5vdCBlbXB0eS4KKyAgICAvLyBUaGUgdGhyZWFkIGFuZCB0aW1lIGluZm8gYXJlIGFkZGVkIGluc2lkZSB0aGUgaWYgc3RhdGVtZW50IGJlY2F1c2UKKyAgICAvLyB3ZSB3YW50IHRvIHNlbmQgdGhlbSBvbmx5IGlmIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRvIHNlbmQuCisgICAgaWYgKGl0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgIC8vIEFkZCB0aHJlYWQgaW5mbyBmaWVsZHMuCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlU3RyaW5nID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFR5cGUsIHR5cGVTdHJpbmcpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkRnJhbWVDb3VudCwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRTYW1wbGVSYXRlLCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQWRkIHRpbWUgaW5mbyBmaWVsZHMuCisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRBY3RpdmUsIGRhdGEuYWN0aXZlIC8gMTAwMDAwMCk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWREdXJhdGlvbiwgKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCiAvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CkBAIC0xMjgsNiArMzAyLDUgQEAKICAgICBwZnMuY2xvc2UoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjAzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gVGltZWxpbmUuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK1dyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitXcml0ZXI6On5Xcml0ZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKKyAgICBkZWxldGUgbUZpZm87CisgICAgZGVsZXRlW10gbVBpZFRhZzsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmICghY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykpIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKKyAgICByZXR1cm4gb2xkOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHIubUV2ZW50LCBldHIubURhdGEsIGV0ci5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbmVlZCA9IGV0ci5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCisKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCisgICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KKyAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKKyAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKKyAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7CisgICAgICAgIHRlbXBbaV0gPSBldHIuY29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZyhldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107CisgICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKKyAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKKyAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkgeworICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfRk1UX1NUQVJULCBmbXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBuc2Vjc190IHRzID0gc3lzdGVtVGltZSgpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICBjaGFyKiBzOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgbG9nKEVWRU5UX0ZNVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGlmICgqcCAhPSAnJScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCgqKytwKSB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9TVFJJTkcsIHMsIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0LCBzaXplb2YodCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfSU5URUdFUiwgJmksIHNpemVvZihpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGQgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBmID0gKGZsb2F0KWQ7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0ZMT0FULCAmZiwgc2l6ZW9mKGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFbnRyeSBldHIoRVZFTlRfRk1UX0VORCwgbnVsbHB0ciwgMCk7CisgICAgbG9nKGV0ciwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKK3sKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2coZW50cnksIHRydXN0ZWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorc3RydWN0IGVudHJ5IHsKKyAgICBjb25zdCB1aW50OF90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworfTsKKworLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKK3N0cnVjdCBlbmRpbmcgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgbmV4dFswXTsKK307CisKKy8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKKy8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKy8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisvLyAgLi4uCisvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorLy8gIC4uLgorLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQorLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorY2xhc3MgRW50cnkgeworcHVibGljOgorICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKyAgICB+RW50cnkoKSB7fQorCisgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KKyAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV3JpdGVyOworICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKK3B1YmxpYzoKKyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKworICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Cit9OworCisvLyBlbnRyeSBpdGVyYXRvcgorY2xhc3MgRW50cnlJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNlZCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQKKyAgICAvLyBFbnRyeUl0ZXJhdG9yIG90aGVyIHRoYW4gYXNzaWduaW5nIGl0IHRvIGFub3RoZXIgdmFsaWQgRW50cnlJdGVyYXRvcgorICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBFbnRyeUl0ZXJhdG9yKCk7CisgICAgLy8gQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGVudHJ5IGlzIG5vdCBudWxscHRyLgorICAgIC8vIFBhc3NpbmcgaW4gbnVsbHB0ciBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKKworICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgbmV4dCgpIGNvbnN0OworICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBwcmV2KCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAvLyBtZW1jcHkgcHJlZmVycmVkIHRvIHJlaW50ZXJwcmV0X2Nhc3QgdG8gYXZvaWQgcG90ZW50aWFsbHkgdW5zdXBwb3J0ZWQKKyAgICAvLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4KKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4obVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7CisgICAgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUIHBheWxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk5CTG9nOjpFbnRyeUl0ZXJhdG9yIHBheWxvYWQgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7CisgICAgICAgIFQgcGF5bG9hZDsKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgICptUHRyOyAgIC8vIFNob3VsZCBub3QgYmUgbnVsbHB0ciBleGNlcHQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWVyZ2luZyBpbnRvIHRoZSBNZXJnZXIncyBidWZmZXIuCisKK2NsYXNzIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQorCisgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwdHIuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKKyAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlciwgd2hpY2ggc2hhbGwgbm90IGJlIG51bGxwdHIuCisgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHt9CisgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5CisgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IG1FbnRyeTsKK307CisKKy8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKKworLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gICAgKiBGTVRfU1RBUlQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKy8vICAgICogVElNRVNUQU1QIGVudHJ5CisvLyAgICAqIEhBU0ggZW50cnkKKy8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisvLyAgICAqIGZvcm1hdCBhcmcxCisvLyAgICAqIGZvcm1hdCBhcmcyCisvLyAgICAqIC4uLgorLy8gICAgKiBGTVRfRU5EIGVudHJ5CitjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5Gb3JtYXRFbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZworICAgIGNvbnN0IGNoYXIqICAgZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgc2l6ZV90ICAgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZ3MoKSBjb25zdDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkhpc3RvZ3JhbUVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBUT0RPIGhhdmUgYSBjb21tZW50IHNvbWV3aGVyZSBleHBsYWluaW5nIHRoZSB3aG9sZSBwcm9jZXNzIGZvciBhZGRpbmcgYSBuZXcgRVZFTlRfCisKKy8vIE5CTG9nIEV2ZW50IHR5cGVzLiBUaGUgRXZlbnRzIGFyZSBuYW1lZCB0byBwcm92aWRlIGNvbnRleHR1YWwgbWVhbmluZyBmb3Igd2hhdCBpcyBsb2dnZWQuCisvLyBJZiBhZGRpbmcgYSBuZXcgc3RhbmRhbG9uZSBFdmVudCBoZXJlLCB1cGRhdGUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBieSBhZGRpbmcgYQorLy8gTUFQX0VWRU5UX1RPX1RZUEUgc3RhdGVtZW50IGJlbG93LgorLy8gWFhYIE5vdGUgdGhhdCBhcyBvZiB0aGUgY3VycmVudCBkZXNpZ24sIEV2ZW50cyBzaG91bGQgbm90IGJlIHJlbnVtYmVyZWQgKGkuZS4gcmVvcmRlcmVkKQorLy8gaWYgdGhleSBldmVyIGxlYXZlIG1lbW9yeSAoZm9yIGV4YW1wbGUsIHdyaXR0ZW4gdG8gZmlsZSwgdXBsb2FkZWQgdG8gY2xvdWQsIGV0Yy4pLgorLy8gVE9ETyBtYWtlIHNvbWUgc29ydCBvZiBpbnRlcmZhY2UgdG8ga2VlcCB0aGVzZSAiY29udHJhY3QiIGNvbnN0YW50cy4KK2VudW0gRXZlbnQgOiB1aW50OF90IHsKKyAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKKyAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisKKyAgICAvLyBUeXBlcyBmb3IgRm9ybWF0IEVudHJ5LCBpLmUuIGZvcm1hdHRlZCBlbnRyeQorICAgIEVWRU5UX0ZNVF9TVEFSVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgIC8vIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfQVVUSE9SLCAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICBFVkVOVF9GTVRfRkxPQVQsICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfSEFTSCwgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLCAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1BJRCwgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQorICAgIEVWRU5UX0ZNVF9TVFJJTkcsICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLCAgICAgICAgLy8gdGltZXN0YW1wIHZhbHVlIGVudHJ5CisgICAgLy8gZW5kIG9mIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfRU5ELCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAvLyBUeXBlcyBmb3Igd2FrZXVwIHRpbWVzdGFtcCBoaXN0b2dyYW1zCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCisgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorCisgICAgLy8gVHlwZXMgcmVwcmVzZW50aW5nIGF1ZGlvIHBlcmZvcm1hbmNlIG1ldHJpY3MKKyAgICBFVkVOVF9MQVRFTkNZLCAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssIGRpdmlkZWQgYnkgc2FtcGxlIHJhdGUuCisgICAgRVZFTlRfT1ZFUlJVTiwgICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgb3ZlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9USFJFQURfSU5GTywgICAgICAgICAgLy8gc2VlIHRocmVhZF9pbmZvX3QgYmVsb3cKKyAgICBFVkVOVF9VTkRFUlJVTiwgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCB1bmRlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9XQVJNVVBfVElNRSwgICAgICAgICAgLy8gdGhyZWFkIHdhcm11cCB0aW1lCisgICAgRVZFTlRfV09SS19USU1FLCAgICAgICAgICAgIC8vIHRoZSB0aW1lIGEgdGhyZWFkIHRha2VzIHRvIGRvIHdvcmssIGUuZy4gcmVhZCwgd3JpdGUsIGV0Yy4KKyAgICBFVkVOVF9USFJFQURfUEFSQU1TLCAgICAgICAgLy8gc2VlIHRocmVhZF9wYXJhbXNfdCBiZWxvdworCisgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworfTsKKworLy8gTkJMb2cgY3VzdG9tLWRlZmluZWQgc3RydWN0cy4gU29tZSBOQkxvZyBFdmVudCB0eXBlcyBtYXAgdG8gdGhlc2Ugc3RydWN0cy4KKwordXNpbmcgbG9nX2hhc2hfdCA9IHVpbnQ2NF90OworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnkgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgYXV0aG9yOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIFRocmVhZFR5cGUgeworICAgIFVOS05PV04sCisgICAgTUlYRVIsCisgICAgQ0FQVFVSRSwKKyAgICBGQVNUTUlYRVIsCisgICAgRkFTVENBUFRVUkUsCit9OworCitpbmxpbmUgY29uc3QgY2hhciAqdGhyZWFkVHlwZVRvU3RyaW5nKFRocmVhZFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJDQVBUVVJFIjsKKyAgICBjYXNlIEZBU1RNSVhFUjoKKyAgICAgICAgcmV0dXJuICJGQVNUTUlYRVIiOworICAgIGNhc2UgRkFTVENBUFRVUkU6CisgICAgICAgIHJldHVybiAiRkFTVENBUFRVUkUiOworICAgIGNhc2UgVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX0lORk8KKy8vIFRoZXNlIGZpZWxkcyBhbHdheXMgc3RheSB0aGUgc2FtZSB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBzaG91bGQgb25seSBuZWVkIHRvIGJlIGxvZ2dlZCBvbmNlIHVwb24gdGhyZWFkIGluaXRpYWxpemF0aW9uLgorLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiB0aGUgbG9nIGV2ZW50IGNvcnJlc3BvbmRpbmcKKy8vIHRvIHRoaXMgdHlwZSBpcyBsb3N0LgorLy8gVE9ETyBhZGQgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhIHJlYWRlciB0byBNZWRpYUxvZ1NlcnZpY2U/CitzdHJ1Y3QgdGhyZWFkX2luZm9fdCB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSAtMTsgICAgICAvLyBUaHJlYWQgSS9PIGhhbmRsZQorICAgIFRocmVhZFR5cGUgdHlwZSA9IFVOS05PV047ICAgICAgLy8gU2VlIGVudW0gVGhyZWFkVHlwZSBhYm92ZQorfTsKKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX1BBUkFNUworLy8gVGhlc2UgZmllbGRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gY2FuIGJlIGxvZ2dlZCB3aGVuZXZlciBhIHRocmVhZCByZWNlaXZlcyBuZXcgY29uZmlndXJhdGlvbnMgb3IgcGFyYW1ldGVycy4KK3N0cnVjdCB0aHJlYWRfcGFyYW1zX3QgeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgcmVhZCBvciB3cml0ZSBidWZmZXIKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsgICAgICAgIC8vIGluIGZyYW1lcyBwZXIgc2Vjb25kCit9OworCit0ZW1wbGF0ZSA8RXZlbnQgRT4gc3RydWN0IGdldF9tYXBwZWQ7CisjZGVmaW5lIE1BUF9FVkVOVF9UT19UWVBFKEUsIFQpIFwKK3RlbXBsYXRlPD4gc3RydWN0IGdldF9tYXBwZWQ8RT4geyBcCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUgXAorICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJOQkxvZzo6RXZlbnQgbXVzdCBtYXAgdG8gdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOyBcCisgICAgdHlwZWRlZiBUIHR5cGU7IFwKK30KKworLy8gTWFwcyBhbiBOQkxvZyBFdmVudCB0eXBlIHRvIGEgQysrIFBPRCB0eXBlLgorTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfTEFURU5DWSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX09WRVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX0lORk8sIHRocmVhZF9pbmZvX3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVU5ERVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV0FSTVVQX1RJTUUsIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XT1JLX1RJTUUsIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX1BBUkFNUywgdGhyZWFkX3BhcmFtc190KTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhODUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nMTY7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBUT0RPIHVwZGF0ZSBjb21tZW50cyB0byByZWZsZWN0IGN1cnJlbnQgZnVuY3Rpb25hbGl0aWVzCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCitjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgfk1lcmdlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+ICZyZWFkZXIpOworICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgorICAgIHZvaWQgbWVyZ2UoKTsKKworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIGdldFJlYWRlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgIHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+IG1SZWFkZXJzOworCisgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KK307CisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKy8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KK2NsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7CitwdWJsaWM6CisgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIHZvaWQgcHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwLCBpbnQgYXV0aG9yKTsKKworICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQorICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICAvLyBjaGVjayBmb3IgcGVyaW9kaWMgcHVzaCBvZiBwZXJmb3JtYW5jZSBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGFuZCBwZXJmb3JtCisgICAgLy8gdGhlIHNlbmQgaWYgaXQgaXMgdGltZSB0byBkbyBzby4KKyAgICB2b2lkIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgLy8gVGhlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWVyZ2VyIGNsYXNzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBtUmVhZGVyczsKKworICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCisgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7CisKKyAgICAvLyBjb21wcmVzc2VzIGFuZCBzdG9yZXMgYXVkaW8gcGVyZm9ybWFuY2UgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgYnVmZmVycy4KKyAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgYXV0aG9yLCBpLmUuIHRocmVhZCBpbmRleC4KKyAgICBzdGQ6Om1hcDxpbnQsIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE+IG1UaHJlYWRQZXJmb3JtYW5jZURhdGE7CisKKyAgICAvLyBob3cgb2Z0ZW4gdG8gcHVzaCBkYXRhIHRvIE1lZGlhIE1ldHJpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCA9IHMybnMoKG5zZWNzX3QpMiAqIDYwICogNjApOyAvLyAyIGhvdXJzCisKKyAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKK307CisKKy8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKy8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCisvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCisgICAgdm9pZCB3YWtldXAoKTsKKworICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOworCitwcml2YXRlOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgTWVyZ2VyJiAgICAgIG1NZXJnZXI7CisKKyAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKKyAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICBNdXRleCAgICAgICAgbU11dGV4OworCisgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCisgICAgQ29uZGl0aW9uICAgIG1Db25kOworCisgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgaW50ICAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOworCisgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZmI2ZjE3OS4uZmQ3MzUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMTksNTk1ICsxOSwxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAKLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi0gICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OwotCi0gICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLSAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBjbGFzcyBXcml0ZXI7Ci0gICAgY2xhc3MgUmVhZGVyOwotCi0gICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgICAgICBFVkVOVF9SRVNFUlZFRCwKLSAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAotICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKLSAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKLSAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAotCi0gICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLSAgICB9OwotCi1wcml2YXRlOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0gICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLSAgICAvLyAgICAqIEhBU0ggZW50cnkKLSAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQotICAgIC8vICAgICogZm9ybWF0IGFyZzEKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcyCi0gICAgLy8gICAgKiAuLi4KLSAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKLQotICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotICAgIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLSAgICBzdHJ1Y3QgZW5kaW5nIHsKLSAgICAgICAgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgaXRlcmF0b3IKLSAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOwotCi0gICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OwotICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgotICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCi0gICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7Ci0gICAgfTsKLQotICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKLQotICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci0gICAgc3RydWN0IEVudHJ5IHsKLSAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQotCi0gICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICBpbnQgYXV0aG9yOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0SW50RW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAotICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLSAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0gICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLSAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgotICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKLSAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLSAgICB9OwotCi1wdWJsaWM6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0gICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi0gICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotI2lmIDAKLSAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOwotCi0jaWYgMAotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotI2VuZGlmCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKLSAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLSAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKLQotICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAotICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKLSAgICAgICAgY2hhciAgICptUGlkVGFnOwotICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgotICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKLSAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgflJlYWRlcigpOwotCi0gICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQotICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCi0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKLSAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLQotICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KLSAgICB9OwotCi0gICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgICBjbGFzcyBOYW1lZFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQotICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KLSAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KLQotICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgICAgIHZvaWQgbWVyZ2UoKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCi0gICAgfTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKLSAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCi0gICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCi0gICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLQotICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7Ci0gICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKLSAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAotICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKLSAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCi0gICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgotICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKLQotICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOwotICAgIH07Ci0KLSAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0gICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKLSAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0gICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLSAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7Ci0gICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKLSAgICAgICAgdm9pZCB3YWtldXAoKTsKLQotICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncwotICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgotICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOwotCi0gICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKLQotICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCi0gICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87Ci0KLSAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotICAgIH07Ci0KLX07ICAvLyBjbGFzcyBOQkxvZwotCi0vLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQotc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7Ci0gICAgdGltZXNwZWMgdHM7Ci0gICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmluZGV4IGRkZmU5ZDYuLmQ3YzE2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0xOSwxNCArMTksMTc2IEBACiAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBTdHJpbmc4OworCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCisvLyBUT0RPIG1ha2UgdGhpcyBhIHRlbXBsYXRlZCBjbGFzcyBhbmQgcHV0IGl0IGluIGEgc2VwYXJhdGUgZmlsZS4KKy8vIFRoZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyB3b3VsZCBiZSBiaW4gc2l6ZSBhbmQgbG93IGxpbWl0LgorLyoKKyAqIEhpc3RvZ3JhbSBwcm92aWRlcyBhIHdheSB0byBzdG9yZSBudW1lcmljIGRhdGEgaW4gaGlzdG9ncmFtIGZvcm1hdCBhbmQgcmVhZCBpdCBhcyBhIHNlcmlhbGl6ZWQKKyAqIHN0cmluZy4gVGhlIHRlcm1zICJiaW4iIGFuZCAiYnVja2V0IiBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhpc3RvZ3JhbSB7CitwdWJsaWM6CisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiaW5TaXplOyAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgICAgICBjb25zdCBzaXplX3QgbnVtQmluczsKKyAgICAgICAgY29uc3QgZG91YmxlIGxvdzsgICAgICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgfTsKKworICAgIC8vIEhpc3RvZ3JhbXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZml4ZWQgY29uZmlndXJhdGlvbiBudW1iZXJzLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gYmFzZWQKKyAgICAvLyB0aGUgZGF0YSBpcyBwb3NzaWJsZSBidXQgY29tcGxleCBiZWNhdXNlCisgICAgLy8gLSBkYXRhIHBvaW50cyBhcmUgYWRkZWQgb25lIGJ5IG9uZSwgbm90IHByb2Nlc3NlZCBhcyBhIGJhdGNoLgorICAgIC8vIC0gSGlzdG9ncmFtcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRyaWNreSB0byBhZ2dyZWdhdGUsIGFuZCB0aGV5CisgICAgLy8gICB3aWxsIG5lZWQgdG8gYmUgYWdncmVnYXRlZCBhdCB0aGUgTWVkaWEgTWV0cmljcyBjbG91ZCBzaWRlLgorICAgIC8vIC0gbm90IHByb3ZpZGluZyBsaW1pdHMgdGhlb3JldGljYWxseSBhbGxvd3MgZm9yIGluZmluaXRlIG51bWJlciBvZiBidWNrZXRzLgorCisgICAgLyoqCisgICAgICogXGJyaWVmIENyZWF0ZXMgYSBIaXN0b2dyYW0gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGJpblNpemUgdGhlIHdpZHRoIG9mIGVhY2ggYmluIG9mIHRoZSBoaXN0b2dyYW0sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqIFxwYXJhbSBudW1CaW5zIHRoZSBudW1iZXIgb2YgYmlucyBkZXNpcmVkIGluIHRoZSBoaXN0b2dyYW0gcmFuZ2UsIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogXHBhcmFtIGxvdyAgICAgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBoaXN0b2dyYW0gYnVja2V0IHZhbHVlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB1cHBlciBib3VuZCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgICAgICAgdXBwZXIgPSBsb3dlciArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqLworICAgIEhpc3RvZ3JhbShkb3VibGUgYmluU2l6ZSwgc2l6ZV90IG51bUJpbnMsIGRvdWJsZSBsb3cgPSAwLikKKyAgICAgICAgOiBtQmluU2l6ZShiaW5TaXplKSwgbU51bUJpbnMobnVtQmlucyksIG1Mb3cobG93KSwgbUJpbnMobU51bUJpbnMgKyAyKSB7fQorCisgICAgSGlzdG9ncmFtKGNvbnN0IENvbmZpZyAmYykKKyAgICAgICAgOiBIaXN0b2dyYW0oYy5iaW5TaXplLCBjLm51bUJpbnMsIGMubG93KSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIEFkZCBhIGRhdGEgcG9pbnQgdG8gdGhlIGhpc3RvZ3JhbS4gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50CisgICAgICogICAgICAgIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplIChiZWZvcmUgYWNjb3VudGluZworICAgICAqICAgICAgICBmb3IgdGhlIGxvd2VyIGJvdW5kIG9mZnNldCwgd2hpY2ggbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSkuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50IHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChkb3VibGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlbW92ZXMgYWxsIGRhdGEgcG9pbnRzIGZyb20gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGFkZGVkIHRvIHRoZSBoaXN0b2dyYW0uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbENvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU2VyaWFsaXplcyB0aGUgaGlzdG9ncmFtIGludG8gYSBzdHJpbmcuIFRoZSBmb3JtYXQgaXMgY2hvc2VuIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqICAgICAgICB0aGUgaGlzdG9ncmFtIHJlcHJlc2VudGF0aW9uIHRvIHNlbmQgdG8gdGhlIE1lZGlhIE1ldHJpY3Mgc2VydmljZS4KKyAgICAgKgorICAgICAqICAgICAgICBUaGUgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CisgICAgICogICAgICAgICAgYmluU2l6ZSxudW1CaW5zLGxvdyx7LTF8bG93Q291bnQsLi4uLGJpbkluZGV4fGNvdW50LC4uLixudW1CaW5zfGhpZ2hDb3VudH0KKyAgICAgKgorICAgICAqICAgICAgICAtIGJpbkluZGV4IGlzIGFuIGludGVnZXIgd2l0aCAwIDw9IGJpbkluZGV4IDwgbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSAocm91bmRlZCkgdmFsdWUKKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogYnVja2V0SW5kZXguCisgICAgICogICAgICAgIC0gbG93Q291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGxlc3MgdGhhbiBsb3cuCisgICAgICogICAgICAgIC0gaGlnaENvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBhIGJpbkluZGV4IG1heSBiZSBza2lwcGVkIGlmIGl0cyBjb3VudCBpcyAwLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgaGlzdG9ncmFtIHNlcmlhbGl6ZWQgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIERyYXcgbG9nIHNjYWxlIHNpZGV3YXlzIGhpc3RvZ3JhbSBhcyBBU0NJSSBhcnQgYW5kIHN0b3JlIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgLy8gRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRvdGFsQ291bnQoKSA9PSAwLgorICAgIHN0ZDo6c3RyaW5nIGFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBIaXN0b2dyYW0gdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1ZlcnNpb24gPSAxOworCisgICAgY29uc3QgZG91YmxlIG1CaW5TaXplOyAgICAgICAgICAvLyBTaXplIG9mIGVhY2ggYnVja2V0CisgICAgY29uc3Qgc2l6ZV90IG1OdW1CaW5zOyAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVja2V0cyBpbiByYW5nZSAoZXhjbHVkZXMgbG93IGFuZCBoaWdoKQorICAgIGNvbnN0IGRvdWJsZSBtTG93OyAgICAgICAgICAgICAgLy8gTG93ZXIgYm91bmQgb2YgdmFsdWVzCisKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0dWFsIGhpc3RvZ3JhbS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMgbGVzcyB0aGFuIG1Mb3cKKyAgICAvLyBhcmUgc3RvcmVkIGluIG1CaW5zWzBdLiBCaW4gaW5kZXggaSBjb3JyZXNwb25kcyB0byBtQmluc1tpKzFdLiBDb3VudHMgb2YgYmluIHZhbHVlcworICAgIC8vID49IGhpZ2ggYXJlIHN0b3JlZCBpbiBtQmluc1ttTnVtQmlucyArIDFdLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBtQmluczsKKworICAgIHVpbnQ2NF90IG1Ub3RhbENvdW50ID0gMDsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHZhbHVlcyByZWNvcmRlZAorfTsKKworLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBidXQgUGVyZm9ybWFuY2VBbmFseXNpcworLy8gYWxzbyBkb2VzIHNvbWUgYWRkaXRpb25hbCBhbmFseXppbmcgb2YgZGF0YSwgd2hpbGUgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3QgaXMKKy8vIHRvIGhvbGQgZGF0YS4KK3N0cnVjdCBQZXJmb3JtYW5jZURhdGEgeworICAgIC8vIFRPRE8gdGhlIEhpc3RvZ3JhbTo6Q29uZmlnIG51bWJlcnMgYmVsb3cgYXJlIGZvciBGYXN0TWl4ZXIuCisgICAgLy8gU3BlY2lmeSBkaWZmZXJlbnQgbnVtYmVycyBmb3Igb3RoZXIgdGhyZWFkIHR5cGVzLgorCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIG1VbmRlcnJ1bk5zIGFuZCBtT3ZlcnJ1bk5zIGluIEZhc3RNaXhlci5jcHAgZm9yIGZyYW1lQ291bnQgPSAxOTIKKyAgICAvLyBhbmQgbVNhbXBsZVJhdGUgPSA0ODAwMCwgd2hpY2ggY29ycmVzcG9uZCB0byAyIGFuZCA3IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV29ya0NvbmZpZyA9IHsgMC4yNSwgMjAsIDIufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtMYXRlbmN5Q29uZmlnID0geyAyLiwgMTAsIDEwLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV2FybXVwQ29uZmlnID0geyA1LiwgMTAsIDEwLn07CisKKyAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCB0aHJlYWRJbmZve307CisgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCB0aHJlYWRQYXJhbXN7fTsKKworICAgIC8vIFBlcmZvcm1hbmNlIERhdGEKKyAgICBIaXN0b2dyYW0gd29ya0hpc3R7a1dvcmtDb25maWd9OworICAgIEhpc3RvZ3JhbSBsYXRlbmN5SGlzdHtrTGF0ZW5jeUNvbmZpZ307CisgICAgSGlzdG9ncmFtIHdhcm11cEhpc3R7a1dhcm11cENvbmZpZ307CisgICAgaW50NjRfdCB1bmRlcnJ1bnMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTbmFwc2hvdHNUb1N0b3JlID0gMjU2OworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPE5CTG9nOjpFdmVudCwgaW50NjRfdCAvKnRpbWVzdGFtcCovPj4gc25hcHNob3RzOworICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAwOworICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBuc2Vjc190IHN0YXJ0e3N5c3RlbVRpbWUoKX07CisKKyAgICAvLyBSZXNldCB0aGUgcGVyZm9ybWFuY2UgZGF0YS4gVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSB0aHJlYWQgc3RhdGUgY2hhbmdlLgorICAgIC8vIFRocmVhZCBpbmZvIGlzIG5vdCByZXNldCBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMgbWVhbnQgdG8gYmUgYSBjb250aW51YXRpb24gb2YgdGhlIHRocmVhZAorICAgIC8vIHRoYXQgc3RydWN0IFBlcmZvcm1hbmNlRGF0YSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd29ya0hpc3QuY2xlYXIoKTsKKyAgICAgICAgbGF0ZW5jeUhpc3QuY2xlYXIoKTsKKyAgICAgICAgd2FybXVwSGlzdC5jbGVhcigpOworICAgICAgICB1bmRlcnJ1bnMgPSAwOworICAgICAgICBvdmVycnVucyA9IDA7CisgICAgICAgIGFjdGl2ZSA9IDA7CisgICAgICAgIHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHBlcmZvcm1hbmNlIGRhdGEgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3b3JrSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiBsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPT0gMAorICAgICAgICAgICAgICAgICYmIHdhcm11cEhpc3QudG90YWxDb3VudCgpID09IDAgJiYgdW5kZXJydW5zID09IDAgJiYgb3ZlcnJ1bnMgPT0gMAorICAgICAgICAgICAgICAgICYmIGFjdGl2ZSA9PSAwOworICAgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXM7CiAKIC8vIGEgbWFwIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMgaW5zdGFuY2VzCkBAIC04MCw3ICsyNDIsNyBAQAogICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CiAKICAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+IG1IaXN0czsKIAogICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycwogICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgewpAQCAtMTE5LDggKzI4MSw3IEBACiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKIHZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFJlYWRlciBBUEkKKworY2xhc3MgU25hcHNob3Q7ICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG5lZWRlZCBmb3IgUmVhZGVyOjpnZXRTbmFwc2hvdCgpCisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICB+UmVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KGJvb2wgZmx1c2ggPSB0cnVlKTsKKyAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworcHJpdmF0ZToKKyAgICAvLyBBbW91bnQgb2YgdHJpZXMgZm9yIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoIHdyaXRlciBpbiBnZXRTbmFwc2hvdCgpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPYnRhaW5UcmllcyA9IDM7CisKKyAgICAvLyBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGFsaWduIHRoZSBTbmFwc2hvdDo6YmVnaW4oKSBhbmQKKyAgICAvLyBTbmFwc2hvdDo6ZW5kKCkgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkQmVnaW5UeXBlczsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkRW5kVHlwZXM7CisKKyAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgICAgICAgICAgICAvLyBuYW1lIG9mIHJlYWRlciAoYWN0dWFsbHkgbmFtZSBvZiB3cml0ZXIpCisgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgdmFsaWQgZW50cnkgaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKTsKK307CisKKy8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAorY2xhc3MgU25hcHNob3QgeworcHVibGljOgorICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KKworICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgIHNpemVfdCBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorCitwcml2YXRlOgorICAgIFNuYXBzaG90KCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorICAgIGZyaWVuZCBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCk7CisKKyAgICB1aW50OF90ICogY29uc3QgICAgICAgbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdCA9IDA7CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1CZWdpbjsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUVuZDsKK307CisKKy8vIFRPRE8gbW92ZSB0aGlzIHRvIE1lZGlhTG9nU2VydmljZT8KK2NsYXNzIER1bXBSZWFkZXIgOiBwdWJsaWMgTkJMb2c6OlJlYWRlciB7CitwdWJsaWM6CisgICAgRHVtcFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSB7fQorICAgIER1bXBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoaU1lbW9yeSwgc2l6ZSwgbmFtZSkge30KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIGZtdEVudHJ5IF9fdW51c2VkLCBTdHJpbmc4KiBib2R5IF9fdW51c2VkKSB7fQorICAgIEVudHJ5SXRlcmF0b3IgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KTsKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworCisgICAgLy8gVGhlIGJ1ZmZlckR1bXAgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCmluZGV4IGVjMDg0MmYuLjY0YTU3MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTIyLDE5ICsyMiwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi1jbGFzcyBTdHJpbmc4OwotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhOworCisvLyBEdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGluIGEgSlNPTiBmb3JtYXQuCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy9EdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGFzIHZpc3VhbGl6ZWQgcGxvdHMuCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIER1bXBzIHNuYXBzaG90cyBhdCBpbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBwYXN0Lgordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBTZW5kIG9uZSB0aHJlYWQncyBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGlmIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGlzIG5vbnRyaXZpYWwgKGkuZS4gbm90CisvLyBhbGwgemVybyB2YWx1ZXMpLiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIHdhcyBzZW50LCBmYWxzZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlCisvLyBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nLgorYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOwogY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CiAKIGNvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKIAogLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Ci11c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47Cit1c2luZyBIaXN0ID0gc3RkOjptYXA8aW50LCBpbnQ+OwogCiB1c2luZyBtc0ludGVydmFsID0gZG91YmxlOwogdXNpbmcgamlmZnlJbnRlcnZhbCA9IGRvdWJsZTsKQEAgLTU3LDEzICs3MSwxMiBAQAogfQogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIHBlYWtzIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHRvIGEgZmlsZS4KLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvX2luZGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5Lgorc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8ge30KKyAgICB+U2hhcmVkKCkge30KKworICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5CisgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKK307CisKKy8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KK2NsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorI2lmIDAKKyAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKKyNlbmRpZgorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKKworI2lmIDAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOworCisgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyNlbmRpZgorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworCituYW1lc3BhY2UgTkJMb2cgeworCitjbGFzcyBFbnRyeTsKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFdyaXRlciBJbnRlcmZhY2UKKworLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKy8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFdyaXRlcigpID0gZGVmYXVsdDsgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgIC8vIExvZyBkYXRhIHJlbGF0ZWQgdG8gRXZlbnQgRS4gU2VlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgZm9yIHRoZSB0eXBlIG9mIGRhdGEKKyAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWUgYSBtYXBwaW5nIHN0YXRlbWVudDoKKyAgICAvLyAgICAgTUFQX1RZUEVfVE9fRVZFTlQoRSwgVCk7CisgICAgLy8gdGhlbiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmU6CisgICAgLy8gICAgIFQgZGF0YSA9IGRvQ29tcHV0YXRpb24oKTsKKyAgICAvLyAgICAgdGxOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFPihkYXRhKTsKKyAgICB0ZW1wbGF0ZTxFdmVudCBFPgorICAgIHZvaWQgICAgbG9nKHR5cGVuYW1lIGdldF9tYXBwZWQ8RT46OnR5cGUgZGF0YSkgeworICAgICAgICBsb2coRSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgZW5hYmxlKCkgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KKyAgICBib29sICAgICAgICAgICAgZGlzYWJsZSgpIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1JTWVtb3J5OyB9CisKKyAgICAvLyBQdWJsaWMgbG9nZ2luZyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsd2F5cyB1c2Ugb25lIG9mIHRoZQorICAgIC8vIHR3byBsb2coKSBmdW5jdGlvbiBjYWxscyBiZWxvdyB0byB3cml0ZSB0byBzaGFyZWQgbWVtb3J5LgorcHJvdGVjdGVkOgorICAgIC8vIFdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTyBpZiB0aGUgd3JpdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYW5kIHZpcnR1YWwgYmVjYXVzZSBMb2NrZWRXcml0ZXIgdXNlcyBhIGxvY2sgdG8gcHJvdGVjdAorICAgIC8vIHdyaXRpbmcgdG8gdGhlIEZJRk8gYmVmb3JlIHdyaXRpbmcgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAvLyBMb2cgYSBzaW5nbGUgRW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGV2ZW50LCBkYXRhLCBhbmQgbGVuZ3RoLgorICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcgcGFydHMgb2YgYSBmb3JtYXR0ZWQgZW50cnkKKyAgICB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOworCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWR7fTsgICAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA4MWE0NjQwLi45ZDMzMzhiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTE3MSwxMSArMTcxLDcgQEAKIH0KIAogc3RydWN0IENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7Ci0gICAgQ29kZWNPYnNlcnZlcigpIHt9Ci0KLSAgICB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICAgICAgbU5vdGlmeSA9IG1zZzsKLSAgICB9CisgICAgZXhwbGljaXQgQ29kZWNPYnNlcnZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgOiBtTm90aWZ5KG1zZykge30KIAogICAgIC8vIGZyb20gSU9NWE9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKQEAgLTI1MSw3ICsyNDcsNyBAQAogICAgIHZpcnR1YWwgfkNvZGVjT2JzZXJ2ZXIoKSB7fQogCiBwcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWNPYnNlcnZlcik7CiB9OwpAQCAtNTc2LDYgKzU3Miw3IEBACiAgICAgICBtVHVubmVsZWQoZmFsc2UpLAogICAgICAgbURlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCisgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtU3RhdGVHZW5lcmF0aW9uKDApLAogICAgICAgbVZlbmRvckV4dGVuc2lvbnNTdGF0dXMoa0V4dGVuc2lvbnNVbmNoZWNrZWQpIHsKICAgICBtZW1zZXQoJm1MYXN0SERSU3RhdGljSW5mbywgMCwgc2l6ZW9mKG1MYXN0SERSU3RhdGljSW5mbykpOwpAQCAtMTc0OSwyOSArMTc0NiwzMiBAQAogICAgIH0KIAogICAgIGludDMyX3Qgc3RvcmVNZXRhOwotICAgIGlmIChlbmNvZGVyCi0gICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQotICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7Ci0gICAgICAgIElPTVg6OlBvcnRNb2RlIG1vZGU7Ci0gICAgICAgIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKLSAgICAgICAgICAgICAgICBzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY05hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBtb2RlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKLSAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKLSAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcikgeworICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgICAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwODksNyArMjA4OSw4IEBACiAgICAgICAgIGlmICh1c2luZ1N3UmVuZGVyZXIpIHsKICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlbmRlcmVyIiwgMSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKQEAgLTIxODAsNyArMjE4MSw4IEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7Ci0gICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwLCBzYW1wbGVSYXRlID0gMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOworICAgICAgICAvLyBudW1DaGFubmVscyBuZWVkcyB0byBiZSBzZXQgdG8gcHJvcGVybHkgY29tbXVuaWNhdGUgUENNIHZhbHVlcy4KKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDIsIHNhbXBsZVJhdGUgPSA0NDEwMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOwogICAgICAgICBpZiAoZW5jb2RlciAmJgogICAgICAgICAgICAgICAgICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSkgewpAQCAtMjIwNiw3ICsyMjA4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCwgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0yMjM1LDYgKzIyMzcsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwRUFDM0NvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCkpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gc2V0dXBBQzRDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMzA4LDEyICsyMzE5LDE2IEBACiAgICAgICAgICAgICAodm9pZCltSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUocGNtRW5jb2RpbmcsIGNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBlbmNvZGVyICVzIGlucHV0IGZvcm1hdCBwY20gZW5jb2RpbmcgY29udmVydGVyIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAodm9pZCltT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBkZWNvZGVyICVzIG91dHB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM0Niw2ICsyMzYxLDE3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCkgeworICAgIE9NWF9BVURJT19DT05GSUdfQU5EUk9JRF9BVURJT1BSRVNFTlRBVElPTiBjb25maWc7CisgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICBjb25maWcublByZXNlbnRhdGlvbklkID0gKE9NWF9TMzIpcHJlc2VudGF0aW9uSWQ7CisgICAgY29uZmlnLm5Qcm9ncmFtSWQgPSAoT01YX1MzMilwcm9ncmFtSWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0F1ZGlvUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgewogICAgIGlmIChwcmlvcml0eSA8IDApIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTI4OTEsNiArMjkxNywzOCBAQAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRFYWMzLCAmZGVmLCBzaXplb2YoZGVmKSk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBBQzRDb2RlYygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFJhd0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBBTE9HVygiQUM0IGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZGVmLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgIGRlZi5uU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICByZXR1cm4gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7Cit9CisKIHN0YXRpYyBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHBpY2tNb2RlRnJvbUJpdFJhdGUoCiAgICAgICAgIGJvb2wgaXNBTVJXQiwgaW50MzJfdCBicHMpIHsKICAgICBpZiAoaXNBTVJXQikgewpAQCAtMjk3NCw4ICszMDMyLDggQEAKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCkgewotCisgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgZGVmOwogICAgICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwpAQCAtMjk5OCw3ICszMDU2LDggQEAKICAgICByZXR1cm4gc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIGVuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0LAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgZW5jb2RpbmcpOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwUmF3QXVkaW9Gb3JtYXQoCkBAIC0zMDU2LDYgKzMxMTUsNyBAQAogICAgIHBjbVBhcmFtcy5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogCiAgICAgaWYgKGdldE9NWENoYW5uZWxNYXBwaW5nKG51bUNoYW5uZWxzLCBwY21QYXJhbXMuZUNoYW5uZWxNYXBwaW5nKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IGluY29ycmVjdCBudW1DaGFubmVsczogJWQiLCBfX2Z1bmNfXywgbnVtQ2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKQEAgLTM3MTEsOCArMzc3MSwxNyBAQAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUlN0YXRpY0luZm8iLCAmbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iLCAmbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldEhEUlN0YXRpY0luZm8oY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpIHsKQEAgLTQyMjYsMjQgKzQyOTUsMjcgQEAKICAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOwogCiAgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKLSAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KLSAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAotICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCi0gICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICAvKiAgICBNQnBzICAgICAgTUIgICBkaW0gIGJpdHJhdGUgICAgICAgIGxldmVsICovCisgICAgICAgIHsgICAgIDE0ODUsICAgICA5OSwgICAyOCwgICAgIDY0LCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgICAgICB7ICAgICAxNDg1LCAgICAgOTksICAgMjgsICAgIDEyOCwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICAgICAgeyAgICAgMzAwMCwgICAgMzk2LCAgIDU2LCAgICAxOTIsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgICAgIHsgICAgIDYwMDAsICAgIDM5NiwgICA1NiwgICAgMzg0LCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgICAgICB7ICAgIDExODgwLCAgICAzOTYsICAgNTYsICAgIDc2OCwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICAgICAgeyAgICAxMTg4MCwgICAgMzk2LCAgIDU2LCAgIDIwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgICAgIHsgICAgMTk4MDAsICAgIDc5MiwgICA3OSwgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgICAgICB7ICAgIDIwMjUwLCAgIDE2MjAsICAxMTMsICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICAgICAgeyAgICA0MDUwMCwgICAxNjIwLCAgMTEzLCAgMTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgICAgIHsgICAxMDgwMDAsICAgMzYwMCwgIDE2OSwgIDE0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgICAgICB7ICAgMjE2MDAwLCAgIDUxMjAsICAyMDIsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICAgICAgeyAgIDI0NTc2MCwgICA4MTkyLCAgMjU2LCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgICAgIHsgICAyNDU3NjAsICAgODE5MiwgIDI1NiwgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorICAgICAgICB7ICAgNTIyMjQwLCAgIDg3MDQsICAyNjMsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKKyAgICAgICAgeyAgIDU4OTgyNCwgIDIyMDgwLCAgNDIwLCAxMzUwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCisgICAgICAgIHsgICA5ODMwNDAsICAzNjg2NCwgIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAorICAgICAgICB7ICAyMDczNjAwLCAgMzY4NjQsICA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgeyAgNDE3NzkyMCwgMTM5MjY0LCAxMDU1LCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgIDgzNTU4NDAsIDEzOTI2NCwgMTA1NSwgNDgwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDE2NzExNjgwLCAxMzkyNjQsIDEwNTUsIDgwMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbWl0cyk7IGkrKykgewpAQCAtNDM1Niw3ICs0NDI4LDcgQEAKICAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDI7CiAgICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gbUxhdGVuY3kgPT0gMCA/IDEgOiBzdGQ6Om1pbigxVSwgbUxhdGVuY3kgLSAxKTsKIAotICAgICAgICAvLyBkaXNhYmxlIEItZnJhbWVzIHVudGlsIE1QRUc0V3JpdGVyIGNhbiBndWFyYW50ZWUgZmluYWxpemluZyBmaWxlcyB3aXRoIEItZnJhbWVzCisgICAgICAgIC8vIGRpc2FibGUgQi1mcmFtZXMgdW50aWwgd2UgaGF2ZSBleHBsaWNpdCBzZXR0aW5ncyBmb3IgZW5hYmxpbmcgdGhlIGZlYXR1cmUuCiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAxOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IDA7CiAKQEAgLTUyNDQsNiArNTMxNiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUM0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUM0VFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CkBAIC01MzI0LDYgKzU0MTUsNzAgQEAKICAgICByZXR1cm4gZ2V0VmVuZG9yUGFyYW1ldGVycyhwb3J0SW5kZXgsIG5vdGlmeSk7CiB9CiAKK0Rlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogQUNvZGVjOjpnZXRIRFIxMFBsdXNJbmZvKHNpemVfdCBwYXJhbVNpemVVc2VkKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRIRFIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgbmV3U2l6ZSA9IHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpIC0gMSArCisgICAgICAgICAgICAoKHBhcmFtU2l6ZVVzZWQgPiAwKSA/IHBhcmFtU2l6ZVVzZWQgOiA1MTIpOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICB8fCBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uU2l6ZSA9IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMTsKKyAgICBzaXplX3QgcGFyYW1TaXplID0gY29uZmlnLT5uU2l6ZSAtIHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpICsgMTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBwYXJhbVNpemU7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmdldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKW1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgIGNvbmZpZywgY29uZmlnLT5uU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKGVyciAlZCkiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZSAhPSBwYXJhbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBhbHRlcnMgblBhcmFtU2l6ZTogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemUsIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAocGFyYW1TaXplVXNlZCA+IDAgJiYgY29uZmlnLT5uUGFyYW1TaXplVXNlZCAhPSBwYXJhbVNpemVVc2VkKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcmV0dXJucyB3cm9uZyBuUGFyYW1TaXplVXNlZDogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemVVc2VkLCBwYXJhbVNpemVVc2VkKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb25maWc7Cit9CisKK3ZvaWQgQUNvZGVjOjpvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwCisgICAgICAgICAgICB8fCBjb25maWdJbmRleCAhPSBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgpIHsKKyAgICAgICAgLy8gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4IGlzIHRoZSBvbmx5IHVwZGF0ZSB3ZSByZWNvZ25pemUgbm93CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oKTsKKyAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplVXNlZCA+IGNvbmZpZy0+blBhcmFtU2l6ZSkgeworICAgICAgICAvLyB0cnkgYWdhaW4gd2l0aCB0aGUgc2l6ZSBzcGVjaWZpZWQKKyAgICAgICAgY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbyhjb25maWctPm5QYXJhbVNpemVVc2VkKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgYW4gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIGV2ZW50CisgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLAorICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNvbmZpZy0+blZhbHVlLCBjb25maWctPm5QYXJhbVNpemVVc2VkKSk7Cit9CisKIHZvaWQgQUNvZGVjOjpvbkRhdGFTcGFjZUNoYW5nZWQoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDb2xvckFzcGVjdHMgJmFzcGVjdHMpIHsKICAgICAvLyBhc3BlY3RzIGFyZSBub3JtYWxseSBjb21tdW5pY2F0ZWQgaW4gQ29sb3JBc3BlY3RzCiAgICAgaW50MzJfdCByYW5nZSwgc3RhbmRhcmQsIHRyYW5zZmVyOwpAQCAtNTU1OSw2ICs1NzE0LDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6IHsKKyAgICAgICAgICAgIEFMT0dWKCJOby1vcCBieSBkZWZhdWx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjI1OSw2ICs2NDE5LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAoYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDAKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgIG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIgPSBoZHIxMFBsdXNJbmZvOworICAgICAgICB9CisKICAgICAgICAgLy8gc2F2ZSBidWZmZXJzIHNlbnQgdG8gdGhlIHN1cmZhY2Ugc28gd2UgY2FuIGdldCByZW5kZXIgdGltZSB3aGVuIHRoZXkgcmV0dXJuCiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKQEAgLTYzNjcsOCArNjUzNiwxMCBAQAogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Db2RlYy0+bU9NWE5vZGUgIT0gTlVMTCkgewotICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgICAgICAgICAgdE9teE5vZGUtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICAgICAgICAgIGlmICh0T214Tm9kZSkgeworICAgICAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KQEAgLTY0NTUsNyArNjYyNiw4IEBACiAKICAgICBDSEVDSyhtQ29kZWMtPm1PTVhOb2RlID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYyk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2VMaXN0LCBtQ29kZWMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbiArIDEpOwogCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOwpAQCAtNjQ3MCw3ICs2NjQyLDcgQEAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7CiAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKTsKIAotICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CisgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcihub3RpZnkpOwogICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIApAQCAtNjQ5NiwxNCArNjY2OCwxMiBAQAogICAgIH0KIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIobm90aWZ5KTsKLSAgICBhdXRvIHRPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7Ci0gICAgaWYgKCF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CisgICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICBpZiAodE9teE5vZGUgJiYgIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKLSAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbik7Ci0gICAgb2JzZXJ2ZXItPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5KTsKKyAgICArK21Db2RlYy0+bU5vZGVHZW5lcmF0aW9uOwogCiAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5zZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwpAQCAtNzM4NSwxMiArNzU1NSw1NyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50MzJfdCBwcmVzZW50YXRpb25JZCA9IC0xOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCIsICZwcmVzZW50YXRpb25JZCkpIHsKKyAgICAgICAgaW50MzJfdCBwcm9ncmFtSWQgPSAtMTsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIiwgJnByb2dyYW1JZCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvUHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBmYWlsZWQgc2V0QXVkaW9QcmVzZW50YXRpb24uIEZhaWx1cmUgaXMgZmluZSBzaW5jZSB0aGlzIGtleSBpcyBvcHRpb25hbCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgKHZvaWQpc2V0SGRyMTBQbHVzSW5mbyhoZHIxMFBsdXNJbmZvKTsKKyAgICB9CisKICAgICAvLyBJZ25vcmUgZXJyb3JzIGFzIGZhaWx1cmUgaXMgZXhwZWN0ZWQgZm9yIGNvZGVjcyB0aGF0IGFyZW4ndCB2aWRlbyBlbmNvZGVycy4KICAgICAodm9pZCljb25maWd1cmVUZW1wb3JhbExheWVycyhwYXJhbXMsIGZhbHNlIC8qIGluQ29uZmlndXJlICovLCBtT3V0cHV0Rm9ybWF0KTsKIAogICAgIHJldHVybiBzZXRWZW5kb3JQYXJhbWV0ZXJzKHBhcmFtcyk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbykgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMCkgeworICAgICAgICBBTE9HRSgic2V0SGRyMTBQbHVzSW5mbzogZG9lcyBub3Qgc3VwcG9ydCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBzaXplX3QgbmV3U2l6ZSA9IHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpICsgaGRyMTBQbHVzSW5mby0+c2l6ZSgpIC0gMTsKKyAgICBpZiAobUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgbmV3U2l6ZSA+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdTaXplKTsKKyAgICB9CisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPQorICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKW1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5kYXRhKCk7CisgICAgSW5pdE9NWFBhcmFtcyhjb25maWcpOworICAgIGNvbmZpZy0+blBvcnRJbmRleCA9IDA7CisgICAgY29uZmlnLT5uU2l6ZSA9IG5ld1NpemU7CisgICAgY29uZmlnLT5uUGFyYW1TaXplID0gaGRyMTBQbHVzSW5mby0+c2l6ZSgpOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgbWVtY3B5KGNvbmZpZy0+blZhbHVlLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCksIGhkcjEwUGx1c0luZm8tPnNpemUoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKW1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgIGNvbmZpZywgY29uZmlnLT5uU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKGVyciAlZCkiLCBlcnIpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIFJlbW92ZXMgdHJhaWxpbmcgdGFncyBtYXRjaGluZyB8dGFnfCBmcm9tIHxrZXl8IChlLmcuIGEgc2V0dGluZ3MgbmFtZSkuIHxtaW5MZW5ndGh8IHNwZWNpZmllcwogLy8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8ga2VlcCBpbiB8a2V5fCAoZXZlbiBpZiBpdCBoYXMgdHJhaWxpbmcgdGFncykuCiAvLyAoVXNlZCB0byByZW1vdmUgdHJhaWxpbmcgJ3ZhbHVlJyB0YWdzIGluIHNldHRpbmdzIG5hbWVzLCBlLmcuIHRvIG5vcm1hbGl6ZQpAQCAtNzgxMiw2ICs4MDI3LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0V2ZW50Q29uZmlnVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShkYXRhMSwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CisKKyAgICAgICAgICAgIG1Db2RlYy0+b25Db25maWdVcGRhdGUoKE9NWF9JTkRFWFRZUEUpZGF0YTIpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0V2ZW50QnVmZmVyRmxhZzoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC03ODc2LDYgKzgxMDAsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBUSU1FRF9PVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbmRsZWQgPSBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTc4ODcsNiArODEyMywxMSBAQAogdm9pZCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewogICAgIEFMT0dWKCJbJXNdIE5vdyBoYW5kbGluZyBvdXRwdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2UiLAogICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgIC8vIElmIHdlIGhhdmVuJ3QgdHJhbnNpdGlvbmVkIGFmdGVyIDMgc2Vjb25kcywgd2UncmUgcHJvYmFibHkgc3R1Y2suCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShBQ29kZWM6OmtXaGF0Q2hlY2tJZlN0dWNrLCBtQ29kZWMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKIH0KIAogYm9vbCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6b25PTVhGcmFtZVJlbmRlcmVkKApAQCAtODE1Myw2ICs4Mzk0LDExIEBACiAgICAgQUxPR1YoIlslc10gTm93IEZsdXNoaW5nIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKIAogICAgIG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhJbnB1dF0gPSBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSA9IGZhbHNlOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6Rmx1c2hpbmdTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTgxNjcsNiArODQxMyw3IEBACiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC04MTg3LDYgKzg0MzQsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBUSU1FRF9PVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbmRsZWQgPSBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgzMTMsNyArODU3Miw3IEBACiAgICAgfQogCiAgICAgc3A8SU9NWD4gb214ID0gY2xpZW50LmludGVyZmFjZSgpOwotICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CisgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcihuZXcgQU1lc3NhZ2UpOwogICAgIHNwPElPTVhOb2RlPiBvbXhOb2RlOwogCiAgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZvbXhOb2RlKTsKQEAgLTg0MjksMTQgKzg2ODgsMTcgQEAKICAgICAgICAgaWYgKG9teE5vZGUtPmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgMCwgJnNpZGViYW5kSGFuZGxlKSA9PSBPSykgewogICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaW5jbHVkZXMgYWRhcHRpdmUgcGxheWJhY2sKLSAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNBZGFwdGl2ZVBsYXliYWNrCi0gICAgICAgICAgICAgICAgICAgIHwgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c1R1bm5lbGVkUGxheWJhY2spOwotICAgICAgICB9IGVsc2UgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAotICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXIpID09IE9LIHx8Ci0gICAgICAgICAgICAgICAgb214Tm9kZS0+cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCi0gICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsCi0gICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgPT0gT0spIHsKLSAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNBZGFwdGl2ZVBsYXliYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGNhcHMtPnJlbW92ZURldGFpbChNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX1RVTk5FTEVEX1BMQVlCQUNLKTsKKyAgICAgICAgICAgIGlmIChvbXhOb2RlLT5zZXRQb3J0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgIT0gT0sgJiYKKyAgICAgICAgICAgICAgICAgICAgb214Tm9kZS0+cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEyODAgLyogd2lkdGggKi8sIDcyMCAvKiBoZWlnaHQgKi8pICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gYWRhcHRpdmUgcGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIGNhcHMtPnJlbW92ZURldGFpbChNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0FEQVBUSVZFX1BMQVlCQUNLKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtODQ0NCwxMSArODcwNiwyMCBAQAogICAgICAgICBPTVhfVklERU9fQ09ORklHX0FORFJPSURfSU5UUkFSRUZSRVNIVFlQRSBwYXJhbXM7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLSAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIHZlcmlmeSBpZiBmYWxsYmFjayBpcyBzdXBwb3J0ZWQ/CisKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUgZmFsbGJhY2tQYXJhbXM7CisgICAgICAgIEluaXRPTVhQYXJhbXMoJmZhbGxiYWNrUGFyYW1zKTsKKyAgICAgICAgZmFsbGJhY2tQYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIGZhbGxiYWNrUGFyYW1zLmVSZWZyZXNoTW9kZSA9IE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWM7CisKICAgICAgICAgaWYgKG9teE5vZGUtPmdldENvbmZpZygKICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBbmRyb2lkSW50cmFSZWZyZXNoLAotICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSA9PSBPSykgewotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCk7CisgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpICE9IE9LICYmCisgICAgICAgICAgICAgICAgb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoLCAmZmFsbGJhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihmYWxsYmFja1BhcmFtcykpICE9IE9LKSB7CisgICAgICAgICAgICAvLyBpbnRyYSByZWZyZXNoIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGNhcHMtPnJlbW92ZURldGFpbChNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0lOVFJBX1JFRlJFU0gpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDcxMGFlNjguLjI2NmEyNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0xMjksNiArMTI5LDcgQEAKICAgICAgICAgc2VjdXJlSGFuZGxlID0gc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uUG9pbnRlcigpKTsKICAgICB9CiAgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKKyAgICBzc2l6ZV90IGNvZGVjRGF0YU9mZnNldCA9IDA7CiAgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewogICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKICAgICAgICAgaWYgKHNlY3VyZSkgewpAQCAtMTgwLDkgKzE4MSwxNiBAQAogCiAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOwogICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICAgICAgICBTY3JhbWJsaW5nQ29udHJvbCBzY3RybCA9IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRDsKKworICAgICAgICBpZiAoa2V5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNjdHJsID0gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXTsKKyAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdGhlIFBFUyBvZmZzZXQKKyAgICAgICAgICAgIGNvZGVjRGF0YU9mZnNldCA9IGtleVsyXSB8IChrZXlbM10gPDwgOCk7CisgICAgICAgIH0KIAogICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCi0gICAgICAgICAgICAgICAga2V5ICE9IE5VTEwgPyAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdIDogU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVELAorICAgICAgICAgICAgICAgIHNjdHJsLAogICAgICAgICAgICAgICAgIGhpZGxTdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKICAgICAgICAgICAgICAgICAwLApAQCAtMjAyLDYgKzIxMCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAocmVzdWx0IDwgY29kZWNEYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICBBTE9HRCgiaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwgY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgcmVzdWx0KTsKIAogICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgewpAQCAtMjEwLDcgKzIyMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCByZXN1bHQpOworICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0IC0gY29kZWNEYXRhT2Zmc2V0KTsKIAogICAgIC8vIENvcHkgbWV0YWRhdGEgZnJvbSBjbGllbnQgdG8gY29kZWMgYnVmZmVyLgogICAgIGl0LT5tQ29kZWNCdWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5YjhiMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQVN0YXRlOjpBU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCisgICAgOiBtUGFyZW50U3RhdGUocGFyZW50U3RhdGUpIHsKK30KKworQVN0YXRlOjp+QVN0YXRlKCkgeworfQorCitzcDxBU3RhdGU+IEFTdGF0ZTo6cGFyZW50U3RhdGUoKSB7CisgICAgcmV0dXJuIG1QYXJlbnRTdGF0ZTsKK30KKwordm9pZCBBU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKK30KKwordm9pZCBBU3RhdGU6OnN0YXRlRXhpdGVkKCkgeworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCitBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKK30KKwordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOworCisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgd2hpbGUgKGN1ciAhPSBOVUxMICYmICFjdXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZykpIHsKKyAgICAgICAgLy8gSWYgeW91IGNsYWltIG5vdCB0byBoYXZlIGhhbmRsZWQgdGhlIG1lc3NhZ2UgeW91IHNob3VsZG4ndAorICAgICAgICAvLyBoYXZlIGNhbGxlZCBzZXRTdGF0ZS4uLgorICAgICAgICBDSEVDSyhzYXZlID09IG1TdGF0ZSk7CisKKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIGlmIChjdXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1coIldhcm5pbmcgbWVzc2FnZSAlcyB1bmhhbmRsZWQgaW4gcm9vdCBzdGF0ZS4iLAorICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmNoYW5nZVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnN0YXRlKSB7CisgICAgaWYgKHN0YXRlID09IG1TdGF0ZSkgeworICAgICAgICAvLyBRdWljayBleGl0IGZvciB0aGUgZWFzeSBjYXNlLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBBOworICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQS5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQjsKKyAgICBjdXIgPSBzdGF0ZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEIucHVzaChjdXIpOworICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIGNvbW1vbiB0YWlsLgorICAgIHdoaWxlIChBLnNpemUoKSA+IDAgJiYgQi5zaXplKCkgPiAwICYmIEEudG9wKCkgPT0gQi50b3AoKSkgeworICAgICAgICBBLnBvcCgpOworICAgICAgICBCLnBvcCgpOworICAgIH0KKworICAgIG1TdGF0ZSA9IHN0YXRlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBLnNpemUoKTsgKytpKSB7CisgICAgICAgIEEuZWRpdEl0ZW1BdChpKS0+c3RhdGVFeGl0ZWQoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gQi5zaXplKCk7IGkgPiAwOykgeworICAgICAgICBpLS07CisgICAgICAgIEIuZWRpdEl0ZW1BdChpKS0+c3RhdGVFbnRlcmVkKCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggYmM3NTY5Zi4uNDg4ODkwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSIsICJsaWJtZWRpYW5kayJdLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC03NywxNiArNzcsNTEgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHQiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCiAgICAgICAgICJBQ29kZWMuY3BwIiwKICAgICAgICAgIkFDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIiwKLSAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAorICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQU1SV3JpdGVyLmNwcCIsCiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAotICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJBdWRpb1NvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVySW1wbC5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCkBAIC05NCw4ICsxMjksMTAgQEAKICAgICAgICAgIkNhbWVyYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCIsCiAgICAgICAgICJEYXRhQ29udmVydGVyLmNwcCIsCisgICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTEwLDEyICsxNDcsMTcgQEAKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY1NvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk1lZGlhU3luYy5jcHAiLAorICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAorICAgICAgICAiaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAiLAogICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKICAgICAgICAgIk1lZGlhTXV4ZXIuY3BwIiwKICAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAogICAgICAgICAiTnVNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiT2dnV3JpdGVyLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKICAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLApAQCAtMTI4LDMzICsxNzAsMzEgQEAKICAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKICAgICAgICAgIlRocm90dGxlZFNvdXJjZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKICAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCi0gICAgICAgICJsaWJpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJuZXRkX2NsaWVudCIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJSU2NwcCIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLApAQCAtMTYzLDggKzIwMyw2IEBACiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTE3NCwxMiArMjEyLDE5IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgICAgICJsaWJ2cHgiLAorICAgICAgICAibGlib2dnIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYm5hdGl2ZWxvYWRlci1kdW1teS1oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcl9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLApAQCAtMjE0LDU4ICsyNTksMzQgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCisgICAgICAgICJDbGVhckZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKLSAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKLSAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKICAgICAgICAgIk5ka1V0aWxzLmNwcCIsCi0gICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGE2ZjBhMGIuLjE5OWI1N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTExOCw2ICsxMTgsMTMgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIG1ldGFkYXRhIGIvMTE4NjIwODcxIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE4NjIwODcxIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTE4NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1ByZXNlbnRhdGlvbkluZm86OkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLX0KLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjp+QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgewotICAgIG1QcmVzZW50YXRpb25zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9QcmVzZW50YXRpb25JbmZvOjphZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbikgewotICAgIG1QcmVzZW50YXRpb25zLnB1c2gocHJlc2VudGF0aW9uKTsKLX0KLQotc2l6ZV90IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Y291bnRQcmVzZW50YXRpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtUHJlc2VudGF0aW9ucy5zaXplKCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gQXVkaW9QcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlbiB2YWxpZCBpbmRleAotLy8gaW5kZXggbXVzdCBiZSA+PTAgYW5kIDwgY291bnRQcmVzZW50YXRpb25zKCkKLWNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnNbaW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IGVlNmZlMTcuLjUwMjczMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTUwNiw0ICs1MDYsMTEgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgICpwb3J0SWQgPSBtUmVjb3JkLT5nZXRQb3J0SWQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2EyY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJGaWxlU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICA6IG1GZCgtMSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUxlbmd0aCgtMSksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworCisgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOworCisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1PZmZzZXQob2Zmc2V0KSwKKyAgICAgIG1MZW5ndGgobGVuZ3RoKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisgICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCisgICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7CisKKyAgICBpZiAobU9mZnNldCA8IDApIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoIDwgMCkgeworICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7CisgICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OworICAgIH0KKyAgICBzdHJ1Y3Qgc3RhdCBzOworICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKKyAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7CisgICAgICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOworICAgIH0KKworICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCisgICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCisgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisKK30KKworQ2xlYXJGaWxlU291cmNlOjp+Q2xlYXJGaWxlU291cmNlKCkgeworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1MZW5ndGggPj0gMCkgeworICAgICAgICBpZiAob2Zmc2V0ID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAgLy8gcmVhZCBiZXlvbmQgRU9GLgorICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IG51bUF2YWlsYWJsZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+IG51bUF2YWlsYWJsZSkgeworICAgICAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgICpzaXplID0gbUxlbmd0aDsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggZWVmNTMxNC4uYWVlN2ZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTIyLDkwICsyMiwyOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmaWxlbmFtZSksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKXsKLQotICAgIGlmIChmaWxlbmFtZSkgewotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKLQotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQogfQogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotICAgIDogbUZkKGZkKSwKLSAgICAgIG1PZmZzZXQob2Zmc2V0KSwKLSAgICAgIG1MZW5ndGgobGVuZ3RoKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCkgewotICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOwotCi0gICAgaWYgKG1PZmZzZXQgPCAwKSB7Ci0gICAgICAgIG1PZmZzZXQgPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA8IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgewotICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOwotICAgICAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAotICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOwotCiB9CiAKIEZpbGVTb3VyY2U6On5GaWxlU291cmNlKCkgewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLQogICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKICAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKICAgICAgICAgbURybUJ1ZiA9IE5VTEw7CkBAIC0xMjQsMTAgKzYyLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KIHNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtRmQgPCAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ3LDMwICs4MSwxMiBAQAogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwgJiYgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAogICAgICAgICAgICAgPT0gbURlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKSB7Ci0gICAgICAgIHJldHVybiByZWFkQXREUk0ob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdERSTV9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICB9IGVsc2UgewotICAgICAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgICpzaXplID0gbUxlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3A8RGVjcnlwdEhhbmRsZT4gRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewogICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHJldHVybiBudWxscHRyOyAvLyBubyBEUk0gaW4gbWVkaWEgZXh0cmFjdG9yCiAgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKQEAgLTE5NCw3ICsxMTAsNyBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Citzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CiAgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgewogICAgICAgICBtRHJtQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbRFJNX0NBQ0hFX1NJWkVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNjIzMTQ1NC4uMThhNmJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC01MDEsOSArNTAxLDE1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNyY0Zvcm1hdDsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImZvcm1hdCBtaXNzaW5nIGRpbWVuc2lvbiBvciBjb2xvcjogJXMiLAorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwogICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKQEAgLTUyMiwxOSArNTI4LDI3IEBACiAgICAgYWRkRnJhbWUoZnJhbWVNZW0pOwogICAgIFZpZGVvRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOwogCi0gICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgZnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBmcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTY4MSw5ICs2OTUsMTAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkpOwogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKApAQCAtNjk4LDYgKzcxMywxOCBAQAogCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKICAgICBkc3RMZWZ0ID0gbVRpbGVzRGVjb2RlZCAlIG1HcmlkQ29scyAqIHdpZHRoOwogICAgIGRzdFRvcCA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHMgKiBoZWlnaHQ7CkBAIC03MjcsMTEgKzc1NCwxMCBAQAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIG1GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwgbUZyYW1lLT5tSGVpZ2h0LCBtRnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDBmMjQzMjkuLmQxMThlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CiAKLSNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogSFRUUEJhc2U6OkhUVFBCYXNlKCkKQEAgLTExNCwzMCArMTEyLDQgQEAKICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgewotICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKLSAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKLSAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCBkOWM0ZTA1Li42MjU5YjE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC04NSw3ICs4NSw3IEBACiBzdGF0aWMgY29uc3QgaW50IGtUaW1lc3RhbXBEZWJ1Z0NvdW50ID0gMTA7CiBzdGF0aWMgY29uc3QgaW50IGtJdGVtSWRCYXNlID0gMTAwMDA7CiBzdGF0aWMgY29uc3QgY2hhciBrRXhpZkhlYWRlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgJ1wwJywgJ1wwJ307Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrVGlmZkhlYWRlck9mZnNldCA9IGh0b25sKHNpemVvZihrRXhpZkhlYWRlcikpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweGZmLCAweGUxfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hbmRhdG9yeUhldmNOYWxVbml0VHlwZXNbM10gPSB7CiAgICAga0hldmNOYWxVbml0VHlwZVZwcywKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KICAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KLSAgICBib29sIGlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIGJvb2wgaXNFeGlmRGF0YShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0OwogICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgYWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZik7CiAgICAgdm9pZCBmbHVzaEl0ZW1SZWZzKCk7CkBAIC0xMzcsNiArMTM3LDggQEAKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byBpbmNyZWFzZSB0aGlzIGNvbnNpZGVyaW5nIHRoZSBidWcKKyAgICAgICAgLy8gYWJvdXQgY2FtZXJhIGFwcCBub3Qgc2VuZGluZyB2aWRlbyBmcmFtZXMgY29udGludW91c2x5PwogICAgICAgICBrTWF4Q3R0c09mZnNldFRpbWVVcyA9IDEwMDAwMDBMTCwgIC8vIDEgc2Vjb25kCiAgICAgICAgIGtTYW1wbGVBcnJheVNpemUgPSAxMDAwLAogICAgIH07CkBAIC0zMTcsNiArMzE5LDcgQEAKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPiAqbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4gKm1TdHRzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptQ3R0c1RhYmxlRW50cmllczsKKyAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPiAqbUVsc3RUYWJsZUVudHJpZXM7IC8vIDNjb2x1bW5zOiBzZWdEdXJhdGlvbiwgbWVkaWFUaW1lLCBtZWRpYVJhdGUKIAogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaW1lVXM7CiAgICAgaW50NjRfdCBtTWluQ3R0c09mZnNldFRpY2tzOwpAQCAtMzYxLDcgKzM2NCw3IEBACiAKICAgICBWZWN0b3I8dWludDE2X3Q+IG1Qcm9wZXJ0aWVzOwogICAgIEl0ZW1SZWZzIG1EaW1nUmVmczsKLSAgICBJdGVtUmVmcyBtQ2RzY1JlZnM7CisgICAgVmVjdG9yPHVpbnQxNl90PiBtRXhpZkxpc3Q7CiAgICAgdWludDE2X3QgbUltYWdlSXRlbUlkOwogICAgIGludDMyX3QgbUlzUHJpbWFyeTsKICAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKQEAgLTQxNiw2ICs0MTksOCBAQAogICAgIC8vIER1cmF0aW9uIGlzIHRpbWUgc2NhbGUgYmFzZWQKICAgICB2b2lkIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKICAgICB2b2lkIGFkZE9uZUN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKKyAgICB2b2lkIGFkZE9uZUVsc3RUYWJsZUVudHJ5KHVpbnQzMl90IHNlZ21lbnREdXJhdGlvbiwgaW50MzJfdCBtZWRpYVRpbWUsCisgICAgICAgIGludDE2X3QgbWVkaWFSYXRlLCBpbnQxNl90IG1lZGlhUmF0ZUZyYWN0aW9uKTsKIAogICAgIGJvb2wgaXNUcmFja01hbEZvcm1lZCgpIGNvbnN0OwogICAgIHZvaWQgc2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKTsKQEAgLTQ0OCw2ICs0NTMsNyBAQAogICAgIHZvaWQgd3JpdGVWaWRlb0ZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVNZXRhZGF0YUZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVTdGJsQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOworICAgIHZvaWQgd3JpdGVFZHRzQm94KCk7CiAKICAgICBUcmFjayhjb25zdCBUcmFjayAmKTsKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwpAQCAtNDgzLDYgKzQ4OSw3IEBACiAKICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xTEw7CiAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CisgICAgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA9IDA7CiAgICAgbVBhdXNlZCA9IGZhbHNlOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTEyNzIsNiArMTI3OSwxMCBAQAogICAgIC8vIEFkanVzdCB0aGUgZ2xvYmFsIHN0YXJ0IHRpbWUuCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgKz0gbWluQ3R0c09mZnNldFRpbWVVcyAtIGtNYXhDdHRzT2Zmc2V0VGltZVVzOwogCisgICAgLy8gQWRkIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoLXZlIG9yIHplcm8pIHRvIHRoZSBkdXJhdGlvbiBvZiBmaXJzdCBlbnRyeSBpbiBTVFRTLgorICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CisgICAgQUxPR1YoIm1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgOiUiIFBSSWQzMiwgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyk7CisKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICghKCppdCktPmlzSGVpYygpKSB7CkBAIC0xMzU3LDE0ICsxMzY4LDE2IEBACiB9CiAKIG9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgYm9vbCBpc0V4aWYsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LAorICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0LCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgewogICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7CiAKICAgICBpZiAodXNlUHJlZml4KSB7CiAgICAgICAgIGFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woYnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICA6OndyaXRlKG1GZCwgJmtUaWZmSGVhZGVyT2Zmc2V0LCA0KTsgLy8gZXhpZl90aWZmX2hlYWRlcl9vZmZzZXQgZmllbGQKKyAgICAgICAgaWYgKHRpZmZIZHJPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gaHRvbmwodGlmZkhkck9mZnNldCk7CisgICAgICAgICAgICA6OndyaXRlKG1GZCwgJnRpZmZIZHJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAogICAgICAgICAgICAgbU9mZnNldCArPSA0OwogICAgICAgICB9CiAKQEAgLTE3NDcsNiArMTc2MCwxMSBAQAogICAgIHJldHVybiBtU3RhcnRUaW1lc3RhbXBVczsKIH0KIAoraW50MzJfdCBNUEVHNFdyaXRlcjo6Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXM7Cit9CisKIHNpemVfdCBNUEVHNFdyaXRlcjo6bnVtVHJhY2tzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwpAQCAtMTc3Niw2ICsxNzk0LDcgQEAKICAgICAgIG1TdHNzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKSksCiAgICAgICBtU3R0c1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCkpLAogICAgICAgbUN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKKyAgICAgIG1FbHN0VGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigzKSksIC8vIFJlc2VydmUgMyByb3dzLCBhIHJvdyBoYXMgMyBpdGVtcwogICAgICAgbU1pbkN0dHNPZmZzZXRUaW1lVXMoMCksCiAgICAgICBtTWluQ3R0c09mZnNldFRpY2tzKDApLAogICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcygwKSwKQEAgLTE3ODYsNyArMTgwNSw2IEBACiAgICAgICBtU3RhcnRUaW1lc3RhbXBVcygtMSksCiAgICAgICBtUm90YXRpb24oMCksCiAgICAgICBtRGltZ1JlZnMoImRpbWciKSwKLSAgICAgIG1DZHNjUmVmcygiY2RzYyIpLAogICAgICAgbUltYWdlSXRlbUlkKDApLAogICAgICAgbUlzUHJpbWFyeSgwKSwKICAgICAgIG1XaWR0aCgwKSwKQEAgLTE4NDIsNDYgKzE4NjAsNDggQEAKIAogLy8gQ2xlYXIgYWxsIHRoZSBpbnRlcm5hbCBzdGF0ZXMgZXhjZXB0IHRoZSBDU0QgZGF0YS4KIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpyZXNldEludGVybmFsKCkgewotICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgIG1SZXN1bWVkID0gZmFsc2U7Ci0gICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKLSAgICAgIG1Jc01hbGZvcm1lZCA9IGZhbHNlOwotICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7Ci0gICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOwotICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSAwOwotICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzelRhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotCi0gICAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOwotICAgICAgICAgbUNvNjRUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczxvZmY2NF90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdHNjVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHNzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKKyAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKKyAgICBtVHJhY2tEdXJhdGlvblVzID0gMDsKKyAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOworICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKKyAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0Y29UYWJsZUVudHJpZXM7CisgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUNvNjRUYWJsZUVudHJpZXM7CisgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtRWxzdFRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKKyAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMyk7CisgICAgfQorICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpIHsKQEAgLTE5MDAsNiArMTkyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Rzc1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA4ICsgICAvLyBjdHRzIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWxzdFRhYmxlRW50cmllcy0+Y291bnQoKSAqIDEyICsgICAvLyBlbHN0IGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3pCb3hTaXplQnl0ZXM7ICAgICAgICAgICAgLy8gc3RzeiBib3ggc2l6ZQogICAgIH0KQEAgLTE5MzYsNiArMTk1NywxNiBAQAogICAgIG1DdHRzVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoZHVyYXRpb24pKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZUVsc3RUYWJsZUVudHJ5KAorICAgIHVpbnQzMl90IHNlZ21lbnREdXJhdGlvbiwgaW50MzJfdCBtZWRpYVRpbWUsIGludDE2X3QgbWVkaWFSYXRlLCBpbnQxNl90IG1lZGlhUmF0ZUZyYWN0aW9uKSB7CisgICAgQUxPR1YoInNlZ21lbnREdXJhdGlvbjoldSwgbWVkaWFUaW1lOiVkIiwgc2VnbWVudER1cmF0aW9uLCBtZWRpYVRpbWUpOworICAgIEFMT0dWKCJtZWRpYVJhdGUgOiUiIFBSSWQxNiAiLCBtZWRpYVJhdGVGcmFjdGlvbiA6JSIgUFJJZDE2ICIsIE9yZWQgJXUiLCBtZWRpYVJhdGUsCisgICAgICAgIG1lZGlhUmF0ZUZyYWN0aW9uLCAoKCgodWludDMyX3QpbWVkaWFSYXRlKSA8PCAxNikgfCAoKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSkpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2VnbWVudER1cmF0aW9uKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubChtZWRpYVRpbWUpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSk7Cit9CisKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpzZXROZXh0RmQoaW50IGZkKSB7CiAgICAgQUxPR1YoImFkZE5leHRGZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTE5NTQsMTEgKzE5ODUsMzQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgTVBFRzRXcml0ZXI6OlRyYWNrOjppc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0hlaWMKLSAgICAgICAgICAgICYmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gc2l6ZW9mKGtFeGlmSGVhZGVyKSkKLSAgICAgICAgICAgICYmICFtZW1jbXAoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK2Jvb2wgTVBFRzRXcml0ZXI6OlRyYWNrOjppc0V4aWZEYXRhKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0IHsKKyAgICBpZiAoIW1Jc0hlaWMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEV4aWYgYmxvY2sgc3RhcnRpbmcgd2l0aCAnRXhpZlwwXDAnCisgICAgc2l6ZV90IGxlbmd0aCA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIGlmICgobGVuZ3RoID4gc2l6ZW9mKGtFeGlmSGVhZGVyKSkKKyAgICAgICAgJiYgIW1lbWNtcChkYXRhLCBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSkpIHsKKyAgICAgICAgKnRpZmZIZHJPZmZzZXQgPSBzaXplb2Yoa0V4aWZIZWFkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBFeGlmIGJsb2NrIHN0YXJ0aW5nIHdpdGggZm91cmNjICdFeGlmJyBmb2xsb3dlZCBieSBBUFAxIG1hcmtlcgorICAgIGlmICgobGVuZ3RoID4gc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyAyICsgc2l6ZW9mKGtFeGlmSGVhZGVyKSkKKyAgICAgICAgICAgICYmICFtZW1jbXAoZGF0YSwga0V4aWZBcHAxTWFya2VyLCBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSkKKyAgICAgICAgICAgICYmICFtZW1jbXAoZGF0YSArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgMiwga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpKSB7CisgICAgICAgIC8vIHNraXAgJ0V4aWYnIGZvdXJjYworICAgICAgICBidWZmZXItPnNldF9yYW5nZSg0LCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gNCk7CisKKyAgICAgICAgLy8gMi1ieXRlIEFQUDEgKyAyLWJ5dGUgc2l6ZSBmb2xsb3dlZCBieSBrRXhpZkhlYWRlcgorICAgICAgICAqdGlmZkhkck9mZnNldCA9IDIgKyAyICsgc2l6ZW9mKGtFeGlmSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKQEAgLTE5ODQsNyArMjAzOCw3IEBACiAgICAgfQogCiAgICAgaWYgKGlzRXhpZikgewotICAgICAgICAgbUNkc2NSZWZzLnZhbHVlLnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CisgICAgICAgICBtRXhpZkxpc3QucHVzaF9iYWNrKG1Pd25lci0+YWRkSXRlbV9sKHsKICAgICAgICAgICAgIC5pdGVtVHlwZSA9ICJFeGlmIiwKICAgICAgICAgICAgIC5pc1ByaW1hcnkgPSBmYWxzZSwKICAgICAgICAgICAgIC5pc0hpZGRlbiA9IGZhbHNlLApAQCAtMjA4Nyw3ICsyMTQxLDE2IEBACiAKICAgICBpZiAobUltYWdlSXRlbUlkID4gMCkgewogICAgICAgICBtT3duZXItPmFkZFJlZnNfbChtSW1hZ2VJdGVtSWQsIG1EaW1nUmVmcyk7Ci0gICAgICAgIG1Pd25lci0+YWRkUmVmc19sKG1JbWFnZUl0ZW1JZCwgbUNkc2NSZWZzKTsKKworICAgICAgICBpZiAoIW1FeGlmTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBUaGUgImNkc2MiIHJlZiBpcyBmcm9tIHRoZSBtZXRhZGF0YS9leGlmIGl0ZW0gdG8gdGhlIGltYWdlIGl0ZW0uCisgICAgICAgICAgICAvLyBTbyB0aGUgcmVmcyBhbGwgY29udGFpbiB0aGUgaW1hZ2UgaXRlbS4KKyAgICAgICAgICAgIEl0ZW1SZWZzIGNkc2NSZWZzKCJjZHNjIik7CisgICAgICAgICAgICBjZHNjUmVmcy52YWx1ZS5wdXNoX2JhY2sobUltYWdlSXRlbUlkKTsKKyAgICAgICAgICAgIGZvciAodWludDE2X3QgZXhpZkl0ZW0gOiBtRXhpZkxpc3QpIHsKKyAgICAgICAgICAgICAgICBtT3duZXItPmFkZFJlZnNfbChleGlmSXRlbSwgY2RzY1JlZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC0yMTczLDYgKzIyMzYsNyBAQAogICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOworICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKIAogICAgIG1TdHN6VGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IE5VTEw7CkBAIC0yMTgxLDYgKzIyNDUsNyBAQAogICAgIG1TdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBOVUxMOworICAgIG1FbHN0VGFibGVFbnRyaWVzID0gTlVMTDsKIAogICAgIGlmIChtQ29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgewogICAgICAgICBmcmVlKG1Db2RlY1NwZWNpZmljRGF0YSk7CkBAIC0yMjM3LDE0ICsyMzAyLDE2IEBACiAgICAgd2hpbGUgKCFjaHVuay0+bVNhbXBsZXMuZW1wdHkoKSkgewogICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IGNodW5rLT5tU2FtcGxlcy5iZWdpbigpOwogCi0gICAgICAgIGludDMyX3QgaXNFeGlmOwotICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzRXhpZiwgJmlzRXhpZikpIHsKLSAgICAgICAgICAgIGlzRXhpZiA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQ7CisgICAgICAgIGlmICghKCppdCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICBrS2V5RXhpZlRpZmZPZmZzZXQsIChpbnQzMl90KikmdGlmZkhkck9mZnNldCkpIHsKKyAgICAgICAgICAgIHRpZmZIZHJPZmZzZXQgPSAwOwogICAgICAgICB9CisgICAgICAgIGJvb2wgaXNFeGlmID0gKHRpZmZIZHJPZmZzZXQgPiAwKTsKICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSBjaHVuay0+bVRyYWNrLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCiAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47Ci0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIHRpZmZIZHJPZmZzZXQsICZieXRlc1dyaXR0ZW4pOwogCiAgICAgICAgIGlmIChjaHVuay0+bVRyYWNrLT5pc0hlaWMoKSkgewogICAgICAgICAgICAgY2h1bmstPm1UcmFjay0+YWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0yOTcwLDEwICszMDM3LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBib29sIGlzRXhpZiA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgaW50MzJfdCBpc011eGVyRGF0YTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc011eGVyRGF0YSwgJmlzTXV4ZXJEYXRhKSAmJiBpc011eGVyRGF0YSkgewogICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG9uZSB0eXBlIG9mIG11eGVyIGRhdGEsIHdoaWNoIGlzIEV4aWYgZGF0YSBibG9jay4KLSAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyLCAmdGlmZkhkck9mZnNldCk7CiAgICAgICAgICAgICBpZiAoIWlzRXhpZikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBiYWQgRXhpZiBkYXRhIGJsb2NrIik7CiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yOTk1LDcgKzMwNjMsNyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0V4aWYsIDEpOworICAgICAgICAgICAgY29weS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUV4aWZUaWZmT2Zmc2V0LCB0aWZmSGRyT2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBib29sIHVzZVByZWZpeCA9IHRoaXMtPnVzZVByZWZpeCgpICYmICFpc0V4aWY7CiAKQEAgLTMyNjgsNyArMzMzNiw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICAgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woCisgICAgICAgICAgICAgICAgICAgIGNvcHksIHVzZVByZWZpeCwgdGlmZkhkck9mZnNldCwgJmJ5dGVzV3JpdHRlbik7CiAKICAgICAgICAgICAgIGlmIChtSXNIZWljKSB7CiAgICAgICAgICAgICAgICAgYWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0zNTI2LDcgKzM1OTUsNyBAQAogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RHVyYXRpb25VcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpOworICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzICsgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkgKyBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpOwogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdCB7CkBAIC0zNjEyLDYgKzM2ODEsNyBAQAogICAgIHVpbnQzMl90IG5vdyA9IGdldE1wZWc0VGltZSgpOwogICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKICAgICAgICAgd3JpdGVUa2hkQm94KG5vdyk7CisgICAgICAgIHdyaXRlRWR0c0JveCgpOwogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CiAgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKICAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOwpAQCAtMzY3NCw2ICszNzQ0LDI5IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgLy8gVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkKKworICAgIC8vICBIQUNLIHRvIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZSBJU08gc3RhbmRhcmQuCisgICAgLy8KKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgaXMgYWRkZWQgZnJvbSBBUEkgMjYgYW5kIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgIC8vICBmdWxseSBmb2xsb3dlZCB0aGUgVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTItMjAxNQorICAgIC8vICBpbiB0aGF0IG9ubHkgdGhlIG1pbWVfZm9ybWF0IGlzIHdyaXR0ZW4gb3V0LiBjb250ZW50X2VuY29kaW5nIGFuZAorICAgIC8vICBkYXRhX3JlZmVyZW5jZV9pbmRleCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0LiBUaGlzIGxlYWRzIHRvIHRoZSBmYWlsdXJlCisgICAgLy8gIHdoZW4gc29tZSBNUDQgcGFyc2VyIHRyaWVzIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSB0cmFjayBhY2NvcmRpbmcgdG8gdGhlCisgICAgLy8gIHN0YW5kYXJkLiBUaGUgaGFjayBoZXJlIHdpbGwgbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlCisgICAgLy8gIHN0YW5kYXJkIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdvdWxkIGVuYWJsZQorICAgIC8vICBBbmRyb2lkIHZlcnNpb25zIGJlZm9yZSBBUEkgMjkgdG8gYmUgYWJsZSB0byByZWFkIG91dCB0aGUgc3RhbmRhcmQgY29tcGxpYW50CisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGdlbmVyYXRlZCB3aXRoIEFuZHJvaWQgQVBJIDI5IGFuZCB1cHdhcmQuIFRoZSB0cmljayBpcyBiYXNlZAorICAgIC8vICBvbiB0aGUgZmFjdCB0aGF0IHRoZSBNZXRhZGF0YSB0cmFjayBtdXN0IHN0YXJ0IHdpdGggcHJlZml4IOKAnGFwcGxpY2F0aW9uL+KAnSBhbmQKKyAgICAvLyAgdGhvc2UgbWlzc2luZyBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIEFuZHJvaWQncyBNZXRhZGF0YSB0cmFjay4gQnkgd3JpdHRpbmcKKyAgICAvLyAgb3V0IHRoZSBtaW1lX2Zvcm1hdCB0d2ljZSwgdGhlIGZpcnN0IG1pbWVfZm9ybWF0IHdpbGwgYmUgdXNlZCB0byBmaWxsIG91dCB0aGUKKyAgICAvLyAgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgZmllbGRzLiBPbiB0aGUKKyAgICAvLyAgcGFyc2VyIHNpZGUsIHRoZSBleHRyYWN0ZXIgYmVmb3JlIEFQSSAyOSAgd2lsbCByZWFkIG91dCB0aGUgZmlyc3QgbWltZV9mb3JtYXQKKyAgICAvLyAgY29ycmVjdGx5IGFuZCBkcm9wIHRoZSBzZWNvbmQgbWltZV9mb3JtYXQuIFRoZSBleHRyYWN0b3IgZnJvbSBBUEkgMjkgd2lsbAorICAgIC8vICBjaGVjayBpZiB0aGUgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGFyZSBmaWxsZWQKKyAgICAvLyAgd2l0aCDigJxhcHBsaWNhdGlvbuKAnSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaworICAgIC8vICBhbmQgcmVhZCBvdXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7CisKICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsgIC8vIG1ldGFkYXRhIG1pbWVfZm9ybWF0CiAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gbWV0dAogfQpAQCAtMzk1OSw2ICs0MDUyLDMzIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlRWR0c0JveCgpeworICAgIEFMT0dWKCIlcyA6IGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcyBvZiB0cmFjazolIiBQUklkNjQgIiB1cyIsIGdldFRyYWNrVHlwZSgpLAorICAgICAgICBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSk7CisKKyAgICAvLyBQcmVwb25lIHZpZGVvIHBsYXliYWNrLgorICAgIGlmIChtTWluQ3R0c09mZnNldFRpY2tzICE9IG1NYXhDdHRzT2Zmc2V0VGlja3MpIHsKKyAgICAgICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICAgICAgdWludDMyX3QgdGtoZER1cmF0aW9uID0gKGdldER1cmF0aW9uVXMoKSAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpbnQ2NF90IG1lZGlhVGltZSA9ICgoa01heEN0dHNPZmZzZXRUaW1lVXMgLSBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpCisgICAgICAgICAgICAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpZiAodGtoZER1cmF0aW9uID4gMCAmJiBtZWRpYVRpbWUgPiAwKSB7CisgICAgICAgICAgICBhZGRPbmVFbHN0VGFibGVFbnRyeSh0a2hkRHVyYXRpb24sIG1lZGlhVGltZSwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7IC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVsc3Q7CisgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWR0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVNZGhkQm94KHVpbnQzMl90IG5vdykgewogICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAgICAgaW50NjRfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKQEAgLTQwOTUsNyArNDIxNSw5IEBACiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICBDSEVDSyhtU3R0c1RhYmxlRW50cmllcy0+Z2V0KGR1cmF0aW9uLCAxKSk7CiAgICAgICAgIGR1cmF0aW9uID0gaHRvbmwoZHVyYXRpb24pOyAgLy8gQmFjayB0byBob3N0IGJ5dGUgb3JkZXIKLSAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubChkdXJhdGlvbiArIGdldFN0YXJ0VGltZU9mZnNldFNjYWxlZFRpbWUoKSksIDEpOworICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldFNjYWxlZCA9ICgoKGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsKKyAgICAgICAgICAgIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkpICogbVRpbWVTY2FsZSkgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoKGludDMyX3QpZHVyYXRpb24gKyBzdGFydFRpbWVPZmZzZXRTY2FsZWQpLCAxKTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKaW5kZXggOGJmZjlmNy4uNGY5YmM2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyAhPSAtMSkgewogICAgICAgICBpbnQ2NF90IG9sZE5vd01lZGlhVXMgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMKKyAgICAgICAgaWYgKG5vd01lZGlhVXMgPCBvbGROb3dNZWRpYVVzICsga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzCiAgICAgICAgICAgICAgICAgJiYgbm93TWVkaWFVcyA+IG9sZE5vd01lZGlhVXMgLSBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCBmYTU5Y2RiLi45YzU4ZTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtNTUwLDcgKzU1MCw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7CiAgICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtDb2RlY0tleU5hbWUpOwogICAgIH0KIAogICAgIG1MYXRlbmN5SGlzdC5zZXR1cChrTGF0ZW5jeUhpc3RCdWNrZXRzLCBrTGF0ZW5jeUhpc3RXaWR0aCwga0xhdGVuY3lIaXN0Rmxvb3IpOwpAQCAtODYyLDkgKzg2Miw5IEBACiAvL3N0YXRpYwogc3A8Q29kZWNCYXNlPiBNZWRpYUNvZGVjOjpHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpIHsKICAgICBpZiAob3duZXIpIHsKLSAgICAgICAgaWYgKHN0cm5jbXAob3duZXIsICJkZWZhdWx0IiwgOCkgPT0gMCkgeworICAgICAgICBpZiAoc3RyY21wKG93bmVyLCAiZGVmYXVsdCIpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQUNvZGVjOwotICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3duZXIsICJjb2RlYzIiLCA3KSA9PSAwKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDYpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDQ29kZWMoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkxMSwxMCArOTExLDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOwotICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7Ci0gICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMTk3LDYgKzIxOTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1TdXJmYWNlLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjc0LDcgKzI2ODEsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVJbnB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IGVhZmYyODMuLjNkNThkNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTc3LDcgKzc3LDggQEAKICAgICByZXR1cm4gcHJvZmlsaW5nTmVlZGVkOwogfQogCi1PbXhJbmZvQnVpbGRlciBzT214SW5mb0J1aWxkZXI7CitPbXhJbmZvQnVpbGRlciBzT214SW5mb0J1aWxkZXJ7dHJ1ZSAvKiBhbGxvd1N1cmZhY2VFbmNvZGVycyAqL307CitPbXhJbmZvQnVpbGRlciBzT214Tm9TdXJmYWNlRW5jb2RlckluZm9CdWlsZGVye2ZhbHNlIC8qIGFsbG93U3VyZmFjZUVuY29kZXJzICovfTsKIAogTXV0ZXggc0NvZGVjMkluZm9CdWlsZGVyTXV0ZXg7CiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZT4gc0NvZGVjMkluZm9CdWlsZGVyOwpAQCAtOTgsNyArOTksMTEgQEAKICAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZVRlc3QgPQogICAgICAgICBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6R2V0Q0NvZGVjSW5zdGFuY2UoKS0+Y3JlYXRlSW5wdXRTdXJmYWNlKCk7CiAgICAgaWYgKHN1cmZhY2VUZXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkFsbG93aW5nIGFsbCBPTVggY29kZWNzIik7CiAgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teEluZm9CdWlsZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiQWxsb3dpbmcgb25seSBub24tc3VyZmFjZS1lbmNvZGVyIE9NWCBjb2RlY3MiKTsKKyAgICAgICAgYnVpbGRlcnMucHVzaF9iYWNrKCZzT214Tm9TdXJmYWNlRW5jb2RlckluZm9CdWlsZGVyKTsKICAgICB9CiAgICAgYnVpbGRlcnMucHVzaF9iYWNrKEdldENvZGVjMkluZm9CdWlsZGVyKCkpOwogICAgIHJldHVybiBidWlsZGVyczsKQEAgLTIxNSwxNCArMjIwLDI1IEBACiAgICAgICAgICAgICBtQ29kZWNJbmZvcy5iZWdpbigpLAogICAgICAgICAgICAgbUNvZGVjSW5mb3MuZW5kKCksCiAgICAgICAgICAgICBbXShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8xLCBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8yID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mbzEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzEtPnJhbmsoKSA8IGluZm8yLT5yYW5rKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG51bGwgaXMgbG93ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8xID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpbmZvMiAhPSBudWxscHRyICYmIGluZm8xLT5nZXRSYW5rKCkgPCBpbmZvMi0+Z2V0UmFuaygpKTsKICAgICAgICAgICAgIH0pOworCisgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzCisgICAgYm9vbCBkZWR1cGUgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuZGVkdXBlLWNvZGVjcyIsIHRydWUpOworICAgIGlmIChkZWR1cGUpIHsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvZGVjc1NlZW47CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1Db2RlY0luZm9zLmJlZ2luKCk7IGl0ICE9IG1Db2RlY0luZm9zLmVuZCgpOyApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvZGVjTmFtZSA9ICgqaXQpLT5nZXRDb2RlY05hbWUoKTsKKyAgICAgICAgICAgIGlmIChjb2RlY3NTZWVuLmNvdW50KGNvZGVjTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvZGVjc1NlZW4uZW1wbGFjZShjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIGl0Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0ID0gbUNvZGVjSW5mb3MuZXJhc2UoaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBNZWRpYUNvZGVjTGlzdDo6fk1lZGlhQ29kZWNMaXN0KCkgewpAQCAtMjcyLDEwICsyODgsMTcgQEAKIH0KIAogc3NpemVfdCBNZWRpYUNvZGVjTGlzdDo6ZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBWZWN0b3I8QVN0cmluZz4gYWxpYXNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmIChzdHJjbXAobUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQorICAgICAgICBtQ29kZWNJbmZvc1tpXS0+Z2V0QWxpYXNlcygmYWxpYXNlcyk7CisgICAgICAgIGZvciAoY29uc3QgQVN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICBpZiAoYWxpYXMgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIC1FTk9FTlQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKaW5kZXggY2FjNTNmNC4uZGQ3YzNlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApAQCAtMjI4LDE4ICsyMjgsMTggQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1pbWVzOwotICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNaW1lcygmbWltZXMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOworICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiAmY2FwcyA9Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtaW1lc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1lZGlhVHlwZXNbaV0uY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAoIWZvcmNlVG9NZWFzdXJlICYmCiAgICAgICAgICAgICAgICAgKGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzIikgfHwKICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0RGV0YWlscygpLT5jb250YWlucygibWF4LWNvbmN1cnJlbnQtaW5zdGFuY2VzIikpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNpemVfdCBtYXggPSBkb1Byb2ZpbGVDb2RlY3MoaW5mby0+aXNFbmNvZGVyKCksIG5hbWUsIG1pbWVzW2ldLCBjYXBzKTsKKyAgICAgICAgICAgIHNpemVfdCBtYXggPSBkb1Byb2ZpbGVDb2RlY3MoaW5mby0+aXNFbmNvZGVyKCksIG5hbWUsIG1lZGlhVHlwZXNbaV0sIGNhcHMpOwogICAgICAgICAgICAgaWYgKG1heCA+IDApIHsKICAgICAgICAgICAgICAgICBDb2RlY1NldHRpbmdzIHNldHRpbmdzOwogICAgICAgICAgICAgICAgIGNoYXIgbWF4U3RyWzMyXTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCiAgICAgICAgICAgICAgICAgQVN0cmluZyBrZXkgPSBuYW1lOwogICAgICAgICAgICAgICAgIGtleS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKG1pbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKG1lZGlhVHlwZXNbaV0pOwogCiAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmlzRW5jb2RlcigpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXJfcmVzdWx0cy0+YWRkKGtleSwgc2V0dGluZ3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCmluZGV4IGIzMmU0NzAuLmM0ZmIxOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKQEAgLTM3LDYgKzM3LDE2IEBACiAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm9Xcml0ZXIoaW5mby5nZXQoKSkpOwogfQogCitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+CisgICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjpmaW5kTWVkaWFDb2RlY0luZm8oY29uc3QgY2hhciAqbmFtZSkgeworICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogbUNvZGVjSW5mb3MpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoaW5mby0+Z2V0Q29kZWNOYW1lKCksIG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPihuZXcgTWVkaWFDb2RlY0luZm9Xcml0ZXIoaW5mby5nZXQoKSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCiB2b2lkIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjp3cml0ZUdsb2JhbFNldHRpbmdzKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmdsb2JhbFNldHRpbmdzKSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAma3YgOiBtR2xvYmFsU2V0dGluZ3MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggZTIyYWQwZC4uNWQyMjkxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTY0Myw2ICs2NDMsMTAgQEAKICAgICAgICAgICAgIG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAgICAgICAgICAgICBvdXRwdXQtPm1FbmNvZGVyUmVhY2hlZEVPUyA9IHRydWU7CiAgICAgICAgICAgICBvdXRwdXQtPm1FcnJvckNvZGUgPSBlcnI7CisgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICAgICAgICAgIG1TdG9wcGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbVB1bGxlci0+c3RvcCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0cHV0LT5tQ29uZC5zaWduYWwoKTsKIAogICAgICAgICAgICAgcmVhY2hlZEVPUyA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShwbHVnaW4tPmdldFRyYWNrKHBsdWdpbi0+ZGF0YSwgaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0TWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+c2V0TWVkaWFDYXMocGx1Z2luLT5kYXRhLCBjYXNUb2tlbiwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCBiMGJmMjY5Li5hOTM4ZDUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTE4LDE3ICsxOCwyMCBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvckZhY3RvcnkiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxuYXRpdmVsb2FkZXIvZGxleHRfbmFtZXNwYWNlcy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KQEAgLTcwLDQ5ICs3Myw0OCBAQAogCiAgICAgQUxPR1YoIk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKIAotICAgIFVwZGF0ZUV4dHJhY3RvcnMobnVsbHB0cik7CisgICAgVXBkYXRlRXh0cmFjdG9ycygpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2UgZGVjcnlwdGlvbiBpZiBuZWVkZWQKICAgICBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG51bGxwdHIgLyogbWltZSAqLyk7CiAKICAgICB2b2lkICptZXRhID0gbnVsbHB0cjsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CisgICAgdm9pZCAqY3JlYXRvciA9IE5VTEw7CisgICAgRnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCBjb25maWRlbmNlOwogICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gcGx1Z2luOwotICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UuZ2V0KCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4pOworICAgIHVpbnQzMl90IGNyZWF0b3JWZXJzaW9uID0gMDsKKyAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luLCAmY3JlYXRvclZlcnNpb24pOwogICAgIGlmICghY3JlYXRvcikgewogICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGF1dG9kZXRlY3QgbWVkaWEgY29udGVudC4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKnJldCA9IGNyZWF0b3Ioc291cmNlLmdldCgpLCBtZXRhKTsKLSAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgTWVkaWFFeHRyYWN0b3IgKmV4ID0gbnVsbHB0cjsKKyAgICBpZiAoY3JlYXRvclZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxIHx8CisgICAgICAgICAgICBjcmVhdG9yVmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgQ01lZGlhRXh0cmFjdG9yICpyZXQgPSAoKENyZWF0b3JGdW5jKWNyZWF0b3IpKHNvdXJjZS0+d3JhcCgpLCBtZXRhKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICAgICAgfQorICAgICAgICBleCA9IHJldCAhPSBudWxscHRyID8gbmV3IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihyZXQpIDogbnVsbHB0cjsKICAgICB9CiAKICAgICBBTE9HVigiQ3JlYXRlZCBhbiBleHRyYWN0b3IgJyVzJyB3aXRoIGNvbmZpZGVuY2UgJS4yZiIsCi0gICAgICAgICByZXQgIT0gbnVsbHB0ciA/IHJldC0+bmFtZSgpIDogIjxudWxsPiIsIGNvbmZpZGVuY2UpOworICAgICAgICAgZXggIT0gbnVsbHB0ciA/IGV4LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CiAKLSAgICByZXR1cm4gQ3JlYXRlSU1lZGlhRXh0cmFjdG9yRnJvbU1lZGlhRXh0cmFjdG9yKHJldCwgc291cmNlLCBwbHVnaW4pOwotfQotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpIHsKLSAgICAvLyBUT0RPOiBWZXJpZnkgYXBrIHBhdGggd2l0aCBwYWNrYWdlIG1hbmFnZXIgaW4gZXh0cmFjdG9yIHByb2Nlc3MuCi0gICAgQUxPR1YoIkxvYWQgcGx1Z2lucyBmcm9tOiAlcyIsIGFwa1BhdGguY19zdHIoKSk7Ci0gICAgVXBkYXRlRXh0cmFjdG9ycyhhcGtQYXRoLmVtcHR5KCkgPyBudWxscHRyIDogYXBrUGF0aC5jX3N0cigpKTsKKyAgICByZXR1cm4gQ3JlYXRlSU1lZGlhRXh0cmFjdG9yRnJvbU1lZGlhRXh0cmFjdG9yKGV4LCBzb3VyY2UsIHBsdWdpbik7CiB9CiAKIHN0cnVjdCBFeHRyYWN0b3JQbHVnaW4gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBkZWY7CisgICAgRXh0cmFjdG9yRGVmIGRlZjsKICAgICB2b2lkICpsaWJIYW5kbGU7CiAgICAgU3RyaW5nOCBsaWJQYXRoOwogICAgIFN0cmluZzggdXVpZFN0cmluZzsKIAotICAgIEV4dHJhY3RvclBsdWdpbihNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZmluaXRpb24sIHZvaWQgKmhhbmRsZSwgU3RyaW5nOCAmcGF0aCkKKyAgICBFeHRyYWN0b3JQbHVnaW4oRXh0cmFjdG9yRGVmIGRlZmluaXRpb24sIHZvaWQgKmhhbmRsZSwgU3RyaW5nOCAmcGF0aCkKICAgICAgICAgOiBkZWYoZGVmaW5pdGlvbiksIGxpYkhhbmRsZShoYW5kbGUpLCBsaWJQYXRoKHBhdGgpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBFeHRyYWN0b3JEZWY6OmV4dHJhY3Rvcl91dWlkOyBpKyspIHsKICAgICAgICAgICAgIHV1aWRTdHJpbmcuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgZGVmLmV4dHJhY3Rvcl91dWlkLmJbaV0pOwogICAgICAgICB9CiAgICAgfQpAQCAtMTI1LDE3ICsxMjcsMjUgQEAKIH07CiAKIE11dGV4IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbk11dGV4Owotc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CitzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOwogYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdJZ25vcmVWZXJzaW9uID0gZmFsc2U7CitzdGQ6OnN0cmluZyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdMaW5rZWRMaWJyYXJpZXM7CiAKIC8vIHN0YXRpYwotTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbikgewordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlNldExpbmtlZExpYnJhcmllcyhjb25zdCBzdGQ6OnN0cmluZyYgbGlua2VkTGlicmFyaWVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CisgICAgZ0xpbmtlZExpYnJhcmllcyA9IGxpbmtlZExpYnJhcmllczsKK30KKworLy8gc3RhdGljCit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0NCwxMyArMTU0LDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgICAgICAgICBjdXJDcmVhdG9yID0gKHZvaWQqKSAoKml0KS0+ZGVmLnUudjIuc25pZmYoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52My5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJDcmVhdG9yKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOwogICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CkBAIC0xNjAsNiArMTgwLDcgQEAKICAgICAgICAgICAgICAgICAqZnJlZU1ldGEgPSBuZXdGcmVlTWV0YTsKICAgICAgICAgICAgICAgICBwbHVnaW4gPSAqaXQ7CiAgICAgICAgICAgICAgICAgYmVzdENyZWF0b3IgPSBjdXJDcmVhdG9yOworICAgICAgICAgICAgICAgICpjcmVhdG9yVmVyc2lvbiA9ICgqaXQpLT5kZWYuZGVmX3ZlcnNpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKQEAgLTE3MywxMCArMTk0LDEwIEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxICYmCisgICAgICAgICAgICBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkyLDcgKzIxMyw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTQsNjYgKzIzNSwyMSBAQAogfQogCiAvL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKAotICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Ci0gICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGFwa1BhdGgpOwotICAgIFppcEFyY2hpdmVIYW5kbGUgemlwSGFuZGxlOwotICAgIGludDMyX3QgcmV0ID0gT3BlbkFyY2hpdmUoYXBrUGF0aCwgJnppcEhhbmRsZSk7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIGNoYXIgYWJpW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5jcHUuYWJpIiwgYWJpLCAiYXJtNjQtdjhhIik7Ci0gICAgICAgIFN0cmluZzggcHJlZml4OCA9IFN0cmluZzg6OmZvcm1hdCgibGliLyVzLyIsIGFiaSk7Ci0gICAgICAgIFppcFN0cmluZyBwcmVmaXgocHJlZml4OC5jX3N0cigpKTsKLSAgICAgICAgWmlwU3RyaW5nIHN1ZmZpeCgiZXh0cmFjdG9yLnNvIik7Ci0gICAgICAgIHZvaWQqIGNvb2tpZTsKLSAgICAgICAgcmV0ID0gU3RhcnRJdGVyYXRpb24oemlwSGFuZGxlLCAmY29va2llLCAmcHJlZml4LCAmc3VmZml4KTsKLSAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgIFppcFN0cmluZyBuYW1lOwotICAgICAgICAgICAgd2hpbGUgKE5leHQoY29va2llLCAmZW50cnksICZuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChhcGtQYXRoKSArICIhLyIgKwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWUubmFtZSksIG5hbWUubmFtZV9sZW5ndGgpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IE9wZW4gd2l0aCBhIGxpbmtlciBuYW1lc3BhY2Ugc28gdGhhdCBpdCBjYW4gYmUgbGlua2VkIHdpdGggc3ViLWxpYnJhcmllcwotICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgYXBrIGluc3RlYWQgb2Ygc3lzdGVtIGxpYnJhcmllcyBhbHJlYWR5IGxvYWRlZC4KLSAgICAgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICAgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZGxvcGVuKCVzKSAlcyIsIGxpYlBhdGguc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5kSXRlcmF0aW9uKGNvb2tpZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZmluZCBwbHVnaW5zIGZyb20gJXMsICVkIiwgYXBrUGF0aCwgcmV0KTsKLSAgICAgICAgfQotICAgICAgICBDbG9zZUFyY2hpdmUoemlwSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiglcykgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgIH0KLX0KLQotLy9zdGF0aWMKIHZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKLSAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CiAgICAgRElSICpsaWJEaXIgPSBvcGVuZGlyKGxpYkRpclBhdGgpOwogICAgIGlmIChsaWJEaXIpIHsKICAgICAgICAgc3RydWN0IGRpcmVudCogbGliRW50cnk7CiAgICAgICAgIHdoaWxlICgobGliRW50cnkgPSByZWFkZGlyKGxpYkRpcikpKSB7CisgICAgICAgICAgICBpZiAobGliRW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiLyIgKyBsaWJFbnRyeS0+ZF9uYW1lOwogICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CiAgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAoTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CisgICAgICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgIChHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOwogICAgICAgICAgICAgICAgIGlmIChnZXREZWYpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKApAQCAtMjkzLDE3ICsyNjksOTQgQEAKICAgICB9CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlVwZGF0ZUV4dHJhY3RvcnMoY29uc3QgY2hhciAqbmV3VXBkYXRlQXBrUGF0aCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7CisvL3N0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luQXBleCgKKyAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOworICAgIEFMT0dWKCJsaW5rZWQgbGlicyAlcyIsIGdMaW5rZWRMaWJyYXJpZXMuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBsaWJEaXJQYXRoRXggPSBsaWJEaXJQYXRoOworICAgIGxpYkRpclBhdGhFeCArPSAiL2V4dHJhY3RvcnMiOworICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKmV4dHJhY3Rvck5zID0gYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKCJleHRyYWN0b3IiLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxkX2xpYnJhcnlfcGF0aAorICAgICAgICAgICAgbGliRGlyUGF0aCwgIC8vIGRlZmF1bHRfbGlicmFyeV9wYXRoCisgICAgICAgICAgICBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVELAorICAgICAgICAgICAgbGliRGlyUGF0aEV4LmNfc3RyKCksICAvLyBwZXJtaXR0ZWRfd2hlbl9pc29sYXRlZF9wYXRoCisgICAgICAgICAgICBudWxscHRyKTsgLy8gcGFyZW50CisgICAgaWYgKCFhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcyhleHRyYWN0b3JOcywgbnVsbHB0ciwgZ0xpbmtlZExpYnJhcmllcy5jX3N0cigpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxpbmsgbmFtZXNwYWNlLiBGYWlsZWQgdG8gbG9hZCBleHRyYWN0b3IgcGx1Zy1pbnMgaW4gYXBleC4iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyBkbGV4dGluZm8gPSB7CisgICAgICAgIC5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRSwKKyAgICAgICAgLmxpYnJhcnlfbmFtZXNwYWNlID0gZXh0cmFjdG9yTnMsCisgICAgfTsKKworICAgIC8vIHRyeSBleHRyYWN0b3JzIHN1YmZvbGRlciBmaXJzdAorICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoRXguY19zdHIoKSk7CisKKyAgICBpZiAobGliRGlyKSB7CisgICAgICAgIGxpYkRpclBhdGggPSBsaWJEaXJQYXRoRXguY19zdHIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaWJEaXIgPSBvcGVuZGlyKGxpYkRpclBhdGgpOworICAgIH0KKyAgICBpZiAobGliRGlyKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OworICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgeworICAgICAgICAgICAgaWYgKGxpYkVudHJ5LT5kX25hbWVbMF0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGxpYkRpclBhdGgpICsgIi8iICsgbGliRW50cnktPmRfbmFtZTsKKyAgICAgICAgICAgIGlmICghbGliUGF0aC5jb250YWlucygiZXh0cmFjdG9yLnNvIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCAmZGxleHRpbmZvKTsKKyAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CisgICAgICAgICAgICAgICAgaWYgKGdldERlZikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZGxvcGVuKCVzKSAlcyIsIGxpYlBhdGguc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIobGliRGlyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbmRpciglcykiLCBsaWJEaXJQYXRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIGNvbXBhcmVGdW5jKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIGZpcnN0LCBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBzZWNvbmQpIHsKKyAgICByZXR1cm4gc3RyY21wKGZpcnN0LT5kZWYuZXh0cmFjdG9yX25hbWUsIHNlY29uZC0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOworCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOworCiAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IG5ld0xpc3QobmV3IExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisgICAgZ0lnbm9yZVZlcnNpb24gPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuZXh0cmFjdG9yLmlnbm9yZV92ZXJzaW9uIiwgZmFsc2UpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+KCkpOworCisgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGV4KCIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9saWIiCisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgLCAqbmV3TGlzdCk7CiAKICAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3N5c3RlbS9saWIiCiAjaWZkZWYgX19MUDY0X18KQEAgLTMxMSwxNCArMzY0LDM5IEBACiAjZW5kaWYKICAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICpuZXdMaXN0KTsKIAotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsobmV3VXBkYXRlQXBrUGF0aCwgKm5ld0xpc3QpOworICAgIG5ld0xpc3QtPnNvcnQoY29tcGFyZUZ1bmMpOworICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKKworICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKLSAgICBnUGx1Z2lucyA9IG5ld0xpc3Q7CiAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gdHJ1ZTsKIH0KIAorLy8gc3RhdGljCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgeworICAgICAgICByZXR1cm4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CisgICAgfQorICAgIEFMT0dWKCJnZXQgc2VydmljZSBtYW5hZ2VyIik7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKKworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPiBtZWRpYUV4U2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgcmV0dXJuIG1lZGlhRXhTZXJ2aWNlLT5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPigpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgIFN0cmluZzggb3V0OwpAQCAtMzM1LDEyICs0MTMsMjUgQEAKICAgICAgICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKICAgICAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIgICUyNXM6IHBsdWdpbl92ZXJzaW9uKCVkKSwgdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+bGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCBzdXBwb3J0czogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiVzICIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAobm8gcGx1Z2lucyByZWdpc3RlcmVkKVxuIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggOThmNTliNS4uOWJhMmFkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1Myw4IEBACiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKGZkKTsKICAgICB9CiAKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CkBAIC01OSw2ICs2Miw4IEBACiAgICAgICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGtleSB1c2VzIHJlY29yZGVyIGZpbGUgdHlwZXMuCiAgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9IRUlGKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX09HRyk7CiAgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM5YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9CisKK01lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgeworICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCisgICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKKyAgICAqbW9kZSA9IG1TZWVrTW9kZTsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tIHVud3JhcHBlciAtLS0tLS0tLS0tLS0tLS0gKi8KKworTWVkaWFUcmFja0NVbndyYXBwZXI6Ok1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIHdyYXBwZXIgPSBjbWVkaWF0cmFjazsKKyAgICBidWZmZXJHcm91cCA9IG51bGxwdHI7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyICpNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Y3JlYXRlKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIGlmIChjbWVkaWF0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyKGNtZWRpYXRyYWNrKTsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpIHsKKyAgICB3cmFwcGVyLT5mcmVlKHdyYXBwZXItPmRhdGEpOworICAgIGZyZWUod3JhcHBlcik7CisgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKGJ1ZmZlckdyb3VwID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RhcnQod3JhcHBlci0+ZGF0YSwgYnVmZmVyR3JvdXAtPndyYXAoKSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RvcCh3cmFwcGVyLT5kYXRhKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICp0bXBGb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+Z2V0Rm9ybWF0KHdyYXBwZXItPmRhdGEsIHRtcEZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgdG1wRm9ybWF0OworICAgIGZvcm1hdCA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICB1aW50MzJfdCBvcHRzID0gMDsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkpIHsKKyAgICAgICAgb3B0cyB8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtQb3NpdGlvbiA9IDA7CisgICAgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1Bvc2l0aW9uLCAmc2Vla01vZGUpKSB7CisgICAgICAgIG9wdHMgfD0gU0VFSzsKKyAgICAgICAgb3B0cyB8PSAodWludDMyX3QpIHNlZWtNb2RlOworICAgIH0KKyAgICBDTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+cmVhZCh3cmFwcGVyLT5kYXRhLCAmYnVmLCBvcHRzLCBzZWVrUG9zaXRpb24pOworICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSAoTWVkaWFCdWZmZXJCYXNlKilidWYtPmhhbmRsZTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gKCpidWZmZXIpLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBidWYtPm1ldGFfZGF0YShidWYtPmhhbmRsZSk7CisgICAgICAgIC8vIG9ubHkgY29udmVydCB0aGUga2V5cyB3ZSdyZSBhY3R1YWxseSBleHBlY3RpbmcsIGFzIGRvaW5nCisgICAgICAgIC8vIHRoZSBmdWxsIGNvbnZlcnRNZXNzYWdlVG9NZXRhZGF0YSgpIGZvciBldmVyeSBidWZmZXIgaXMKKyAgICAgICAgLy8gdG9vIGV4cGVuc2l2ZQorICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRpbWVVcyIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRpbWUsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGFyZ2V0LXRpbWUiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUYXJnZXRUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJpcy1zeW5jLWZyYW1lIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1tb2RlIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidmFsaWQtc2FtcGxlcyIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbGJ1ZjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLXBsYWluLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8ta2V5IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8taXYiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigic2VpIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5U0VJLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworYm9vbCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICByZXR1cm4gd3JhcHBlci0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQod3JhcHBlci0+ZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCmluZGV4IDA0ZjZhZGUuLmRiYzI4N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCkBAIC0xNiwxNSArMTYsMjUgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YVV0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIGludDMyX3Qgd2lkdGg7CiAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgaW50MzJfdCBzYXJXaWR0aDsKQEAgLTQ2LDIxICs1Niw4NiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1ldGEgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FyV2lkdGg7CisgICAgaW50MzJfdCBzYXJIZWlnaHQ7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKCh2b2lkKilkYXRhLCAgc2l6ZSk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKKyAgICBpZiAoY3NkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBoZWlnaHQpOworICAgIGlmIChzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIHNhcldpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgc2FySGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPCA3KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJpdHMoZGF0YSwgc2l6ZSk7CisKKyAgICAvLyBhZHRzX2ZpeGVkX2hlYWRlcgorCisgICAgaWYgKGJpdHMuZ2V0Qml0cygxMikgIT0gMHhmZmZ1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBhdGRzX2ZpeGVkX2hlYWRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cyg0KTsgIC8vIElELCBsYXllciwgcHJvdGVjdGlvbl9hYnNlbnQKKworICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKKyAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKKyAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAorICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7CisgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgbWV0YSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKLSAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKLSAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ4X3QgKmNzZCwgLyogb3V0ICovCisgICAgICAgIHNpemVfdCAqZXNkc19zaXplLCAvKiBpbi9vdXQgKi8KKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAvKiBpbiAqLworICAgICAgICBpbnQzMl90ICpzYW1wbGluZ19yYXRlIC8qIG91dCAqLworKSB7CiAgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAogICAgIH07Ci0gICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07Ci0gICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbF9jb25maWd1cmF0aW9uOworICAgICpzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CiAgICAgICAgIDB4MDMsIDIyLApAQCAtODMsNyArMTU4LDkgQEAKICAgICB9OwogCiAgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2Yoa1N0YXRpY0VTRFMpICsgMjsKLSAgICB1aW50OF90ICpjc2QgPSBuZXcgdWludDhfdFtjc2RTaXplXTsKKyAgICBpZiAoY3NkU2l6ZSA+ICplc2RzX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBtZW1jcHkoY3NkLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CiAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPQpAQCAtOTIsMTQgKzE2OSwxOTggQEAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0KICAgICAgICAgKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOwogCisgICAgKmVzZHNfc2l6ZSA9IGNzZFNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGNzZFsyXTsKKyAgICBjc2RbMF0gPSAoKHByb2ZpbGUgKyAxKSA8PCAzKSB8IChzYW1wbGluZ19mcmVxX2luZGV4ID4+IDEpOworICAgIGNzZFsxXSA9ICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKKyAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCisgICAgfTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjc2QsIHNpemVvZihjc2QpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIHVpbnQ4X3QgY3NkWzI0XTsKKyAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihjc2QpOworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZCwgJmNzZFNpemUsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgICAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb24sICZzYW1wbGVSYXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKIAogICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLQorICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKICAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGNzZCwgY3NkU2l6ZSk7Ci0gICAgZGVsZXRlIFtdIGNzZDsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorCitzdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOworCisgICAgc2l6ZV90IGluTGVuID0gc3RybmxlbigoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOworICAgIHNpemVfdCBmbGFjU2l6ZSA9IGluTGVuIC8gNCAqIDM7CisgICAgdWludDhfdCAqZmxhYyA9IG5ldyB1aW50OF90W2ZsYWNTaXplXTsKKyAgICBpZiAoIWRlY29kZUJhc2U2NChmbGFjLCAmZmxhY1NpemUsIChjb25zdCBjaGFyKilkYXRhKSkgeworICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7CisKKyAgICB1aW50MzJfdCBwaWNUeXBlOworICAgIHVpbnQzMl90IHR5cGVMZW47CisgICAgdWludDMyX3QgZGVzY0xlbjsKKyAgICB1aW50MzJfdCBkYXRhTGVuOworICAgIGNoYXIgdHlwZVsxMjhdOworCisgICAgaWYgKGZsYWNTaXplIDwgOCkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKKworICAgIGlmIChwaWNUeXBlICE9IDMpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOworICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAorICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOworICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOworCisgICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKKworICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOworICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKKyAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOworCisgICAgZGVsZXRlW10gZmxhYzsKK30KKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKSB7CisgICAgLy8gSGFwdGljIHRhZyBpcyBvbmx5IGtlcHQgaGVyZSBhcyBpdCB3aWxsIG9ubHkgYmUgdXNlZCBpbiBleHRyYWN0b3IgdG8gZ2VuZXJhdGUgY2hhbm5lbCBtYXNrLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IGhhcHRpYyA9ICJoYXB0aWMiOworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwgQU1FRElBRk9STUFUX0tFWV9USVRMRSB9LAorICAgICAgICB7ICJBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCB9LAorICAgICAgICB7ICJBTEJVTUFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJDT01QSUxBVElPTiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gfSwKKyAgICAgICAgeyAiQUxCVU0iLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIH0sCisgICAgICAgIHsgIkNPTVBPU0VSIiwgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiB9LAorICAgICAgICB7ICJHRU5SRSIsIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgfSwKKyAgICAgICAgeyAiQVVUSE9SIiwgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgfSwKKyAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiB9LAorICAgICAgICB7ICJEQVRFIiwgQU1FRElBRk9STUFUX0tFWV9EQVRFIH0sCisgICAgICAgIHsgIllFQVIiLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIH0sCisgICAgICAgIHsgIkFORFJPSURfTE9PUCIsIEFNRURJQUZPUk1BVF9LRVlfTE9PUCB9LAorICAgICAgICB7ICJBTkRST0lEX0hBUFRJQyIsIGhhcHRpYyB9LAorICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfTE9PUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9MT09QLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGhhcHRpYykgeworICAgICAgICAgICAgICAgICAgICBjaGFyICplbmQ7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhcHRpY0NoYW5uZWxDb3VudCA9IHN0cnRvbCgmY29tbWVudFt0YWdMZW4gKyAxXSwgJmVuZCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBoYXB0aWMsIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IoJWQpIHdoZW4gcGFyc2luZyBoYXB0aWMgY2hhbm5lbCBjb3VudCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCBhMWQzNGZjLi41MjJjODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI1Niw2ICsyNTYsMTAgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpkaXNjb25uZWN0KCkgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEFMT0dWKCJkaXNjb25uZWN0aW5nIEhUVFBCYXNlZFNvdXJjZSIpOwpAQCAtNTY3LDEyICs1NzEsMTkgQEAKICAgICByZXR1cm4gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChmaW5hbFN0YXR1cyk7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICpzaXplID0gYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZnNldCwgJmZpbmFsU3RhdHVzKTsKKyAgICByZXR1cm4gZmluYWxTdGF0dXM7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKG1MYXN0QWNjZXNzUG9zLCBmaW5hbFN0YXR1cyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CiAgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwogCiAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CkBAIC01ODAsOSArNTkxLDEwIEBACiAgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOwogICAgIH0KIAorICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogbUxhc3RBY2Nlc3NQb3M7CiAgICAgb2ZmNjRfdCBsYXN0Qnl0ZVBvc0NhY2hlZCA9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Ci0gICAgaWYgKG1MYXN0QWNjZXNzUG9zIDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gbUxhc3RBY2Nlc3NQb3M7CisgICAgaWYgKG9mZnNldCA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDQ5ZWI1ZTkuLjgzYjg3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjA1LDE1ICsyMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTc5MCwxNiArNzgwLDEyIEBACiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBvZmY2NF90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKC0xLCAmY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgaWYgKChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQorICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKICAgICAgICAgICAgICYmIGdldFRvdGFsQml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQotICAgICAgICAgICAgY2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KICAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKICAgICAgICAgKmVvcyA9IChmaW5hbFN0YXR1cyAhPSBPSyk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODA4LDQgKzc5NCwzNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gUmV0dXJuIE9LIGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gYXVkaW8gcHJlc2VudGF0aW9uIGluZm8uCisvLyBSZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTSBpZiBubyB0cmFja3MgYXJlIGF2YWlsYWJsZS4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CisgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tVHJhY2tJbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YShpbmZvLT5tU2FtcGxlcy5iZWdpbigpLT5tQnVmZmVyLT5tZXRhX2RhdGEoKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucygmaW5TdHJlYW0sIHByZXNlbnRhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlRyYWNrICV6dSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiU291cmNlIGRvZXMgbm90IGNvbnRhaW4gYW55IGF1ZGlvIHByZXNlbnRhdGlvbiIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPZ2dXcml0ZXIiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK30KKworLy8gc3RvcmUgdGhlIGludDMyIHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVpbnQoY2hhciAqYnVmLCBpbnQgYmFzZSwgaW50MzJfdCB2YWwpIHsKKyAgICBidWZbYmFzZSArIDNdID0gKCh2YWwpID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAyXSA9ICgodmFsKSA+PiAxNikgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMV0gPSAoKHZhbCkgPj4gOCkgJiAweGZmOworICAgIGJ1ZltiYXNlXSA9ICh2YWwpJjB4ZmY7Cit9CisKKy8vIGxpbmthZ2UgYmV0d2VlbiBvdXIgaGVhZGVyIE9nZ1N0cmVhbVN0YXRlIGFuZCB0aGUgdW5kZXJseWluZyBvZ2dfc3RyZWFtX3N0YXRlCisvLyBzbyB0aGF0IGNvbnN1bWVycyBvZiBvdXIgaW50ZXJmYWNlIGRvIG5vdCByZXF1aXJlIHRoZSBvZ2cgaGVhZGVycyB0aGVtc2VsdmVzLgorc3RydWN0IE9nZ1N0cmVhbVN0YXRlIDogcHVibGljIG9nZ19zdHJlYW1fc3RhdGUge307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworT2dnV3JpdGVyOjpPZ2dXcml0ZXIoaW50IGZkKQorICAgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMCA/IE5PX0lOSVQgOiBPSykgeworICAgIC8vIGVtcHR5Cit9CisKK09nZ1dyaXRlcjo6fk9nZ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAobUZkICE9IC0xKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KKworICAgIGZyZWUobU9zKTsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0IGlzIGxpbWl0ZWQgdG8gc2luZ2xlIHRyYWNrIG9mIE9wdXMgYXVkaW8uCisgICAgY29uc3QgY2hhciogbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKKyAgICBpZiAoc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCBvcHVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1PcyA9IChPZ2dTdHJlYW1TdGF0ZSopIG1hbGxvYyhzaXplb2Yob2dnX3N0cmVhbV9zdGF0ZSkpOworICAgIGlmIChvZ2dfc3RyZWFtX2luaXQoKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgcmFuZCgpKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgib2dnIHN0cmVhbSBpbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBPZ2cgaGVhZGVycy4KKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5IGZvciBzYW1wbGUgcmF0ZSIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyX2RhdGE7CisgICAgc2l6ZV90IHBhY2tldF9zaXplOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmaGVhZGVyX2RhdGEsICZwYWNrZXRfc2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm9wdXMgaGVhZGVyIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopaGVhZGVyX2RhdGE7CisgICAgb3AuYnl0ZXMgPSBwYWNrZXRfc2l6ZTsKKyAgICBvcC5iX29fcyA9IDE7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMDsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICBpbnQgcmV0OworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisKKyAgICBjb25zdCBjaGFyKiB2ZW5kb3Jfc3RyaW5nID0gImxpYm9wdXMiOworICAgIGNvbnN0IGludCB2ZW5kb3JfbGVuZ3RoID0gc3RybGVuKHZlbmRvcl9zdHJpbmcpOworICAgIGludCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGggPSAwOworCisgICAgY29uc3QgaW50IGNvbW1lbnRzX2xlbmd0aCA9IDggKyA0ICsgdmVuZG9yX2xlbmd0aCArIDQgKyB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGg7CisgICAgY2hhciogY29tbWVudHMgPSAoY2hhciopbWFsbG9jKGNvbW1lbnRzX2xlbmd0aCk7CisgICAgaWYgKGNvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBvZ2cgY29tbWVudCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1lbWNweShjb21tZW50cywgIk9wdXNUYWdzIiwgOCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDgsIHZlbmRvcl9sZW5ndGgpOworICAgIG1lbWNweShjb21tZW50cyArIDEyLCB2ZW5kb3Jfc3RyaW5nLCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICB3cml0ZWludChjb21tZW50cywgMTIgKyB2ZW5kb3JfbGVuZ3RoLCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGgpOworCisgICAgb3AucGFja2V0ID0gKHVuc2lnbmVkIGNoYXIqKWNvbW1lbnRzOworICAgIG9wLmJ5dGVzID0gY29tbWVudHNfbGVuZ3RoOworICAgIG9wLmJfb19zID0gMDsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAxOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtYXhUaW1lc3RhbXBVcyAtIDIwMDAwKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIGR1cmF0aW9uKCUiIFBSSWQ2NCAiIHVzKSBleGNlZWRzIGxpbWl0KCUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZ2dfcGFja2V0IG9wOworICAgICAgICBvZ2dfcGFnZSBvZzsKKyAgICAgICAgb3AucGFja2V0ID0gKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgb3AuYnl0ZXMgPSAobG9uZylidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBvcC5iX29fcyA9IDA7CisgICAgICAgIG9wLmVfb19zID0gbVJlYWNoZWRFT1MgPyAxIDogMDsKKyAgICAgICAgLy8gZ3JhbnVsZXBvcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBDTSBhdWRpbyBzYW1wbGVzIEAgNDgga0h6LCB1cCB0byBhbmQKKyAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgICAgb2dnX2ludDY0X3QgZ3JhbnVsZXBvcyA9ICg0ODAwMCAqIG1Fc3RpbWF0ZWREdXJhdGlvblVzKSAvIDEwMDAwMDA7CisgICAgICAgIG9wLmdyYW51bGVwb3MgPSBncmFudWxlcG9zOworCisgICAgICAgIC8vIEhlYWRlcnMgYXJlIGF0IHBhY2tldHMgMCBhbmQgMS4KKyAgICAgICAgb3AucGFja2V0bm8gPSAyICsgKG9nZ19pbnQzMl90KW1DdXJyZW50UGFja2V0SWQrKzsKKyAgICAgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworICAgICAgICBzaXplX3QgbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgICAgICAgICAgbiA9IG4gKyBvZy5oZWFkZXJfbGVuICsgb2cuYm9keV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BwZWRQcmVtYXR1cmVseSA9IGZhbHNlOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIGVuZCBvZiBzdHJlYW0gaXMgYW4gb2sgdGhpbmcKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSyAmJiBzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuIG1SZWFjaGVkRU9TOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCmluZGV4IDk2Yjg5NmIuLjg5MTA0NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKICNlbmRpZgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgpAQCAtNTMsMTggKzUzLDEzIEBACiBuYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CiAKIGJvb2wgaGFzUHJlZml4KGNvbnN0IGhpZGxfc3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKLSAgICByZXR1cm4gc3RybmNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CisgICAgcmV0dXJuIHN0cm5jYXNlY21wKHMuY19zdHIoKSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSkgPT0gMDsKIH0KIAogc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgIGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUsIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAorICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtZWRpYVR5cGUsIGJvb2wgaXNFbmNvZGVyLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKSB7CiAgICAgc3A8QUNvZGVjPiBjb2RlYyA9IG5ldyBBQ29kZWMoKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBub2RlLm93bmVyLmNfc3RyKCksIG5vZGUubmFtZS5jX3N0cigpLCBtaW1lLCBpc0VuY29kZXIsIGNhcHMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiBub2RlLmF0dHJpYnV0ZXMpIHsKICAgICAgICAgLy8gQWxsIGZlYXR1cmVzIGhhdmUgYW4gaW50MzIgdmFsdWUgZXhjZXB0CiAgICAgICAgIC8vICJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCB3aGljaCBoYXMgYSBzdHJpbmcgdmFsdWUuCkBAIC04MSwxMiArNzYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLCBhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gcXVlcnkgY2FwYWJpbGl0aWVzIG1heSByZW1vdmUgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjCisgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWVkaWFUeXBlLCBpc0VuY29kZXIsIGNhcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiB9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCi1PbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoKSB7CitPbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycykKKyAgICA6IG1BbGxvd1N1cmZhY2VFbmNvZGVycyhhbGxvd1N1cmZhY2VFbmNvZGVycykgewogfQogCiBzdGF0dXNfdCBPbXhJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CkBAIC0xMzQsMTA3ICsxMzYsODcgQEAKICAgICAvLyBDb252ZXJ0IHJvbGVzIHRvIGxpc3RzIG9mIGNvZGVjcwogCiAgICAgLy8gY29kZWMgbmFtZSAtPiBpbmRleCBpbnRvIHN3Q29kZWNzL2h3Q29kZWNzCi0gICAgc3RkOjptYXA8aGlkbF9zdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4+Ci0gICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvLCBod0NvZGVjTmFtZTJJbmZvOworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PiBjb2RlY05hbWUySW5mbzsKIAotICAgIGNoYXIgcmFua1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0gMHgxMDA7Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIHJhbmssIG51bGxwdHIpKSB7Ci0gICAgICAgIGRlZmF1bHRSYW5rID0gc3RkOjpzdHJ0b3VsKHJhbmssIG51bGxwdHIsIDEwKTsKLSAgICB9CisgICAgdWludDMyX3QgZGVmYXVsdFJhbmsgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIDB4MTAwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3QXVkaW9SYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctYXVkaW8iLCAweDEwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3T3RoZXJSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctb3RoZXIiLCAweDIxMHUpOworCiAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OlJvbGVJbmZvJiByb2xlIDogcm9sZXMpIHsKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHR5cGVOYW1lID0gcm9sZS50eXBlOwogICAgICAgICBib29sIGlzRW5jb2RlciA9IHJvbGUuaXNFbmNvZGVyOwotICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7Ci0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgbXVzdCBiZSBhZGRlZCBhZnRlcgotICAgICAgICAvLyBwbGF0Zm9ybSAoc29mdHdhcmUpIG5vZGVzLiBod0NvZGVjcyBpcyB1c2VkIHRvIGhvbGQgaGFyZHdhcmUgbm9kZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGFmdGVyIHNvZnR3YXJlIG5vZGVzIGZvciB0aGUgc2FtZSByb2xlLgotICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7Ci0gICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSA6IHJvbGUubm9kZXMpIHsKKyAgICAgICAgYm9vbCBpc0F1ZGlvID0gaGFzUHJlZml4KHJvbGUudHlwZSwgImF1ZGlvLyIpOworICAgICAgICBib29sIGlzVmlkZW9PckltYWdlID0gaGFzUHJlZml4KHJvbGUudHlwZSwgInZpZGVvLyIpIHx8IGhhc1ByZWZpeChyb2xlLnR5cGUsICJpbWFnZS8iKTsKKworICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8gJm5vZGUgOiByb2xlLm5vZGVzKSB7CiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSBpbWFnZSBhbmQgdmlkZW8gZW5jb2RlcnMgdXNlIHN1cmZhY2UgaW5wdXQKKyAgICAgICAgICAgIGlmICghbUFsbG93U3VyZmFjZUVuY29kZXJzICYmIGlzVmlkZW9PckltYWdlICYmIGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJkaXNhYmxpbmcgJXMgZm9yIG1lZGlhIHR5cGUgJXMgYmVjYXVzZSB3ZSBhcmUgbm90IHVzaW5nIE9NWCBpbnB1dCBzdXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLmNfc3RyKCksIHJvbGUudHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYm9vbCBpc1NvZnR3YXJlID0gaGFzUHJlZml4KG5vZGVOYW1lLCAiT01YLmdvb2dsZSIpOwotICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87Ci0gICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gc3dDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IHN3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYzJpID0gaHdDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIHRoaXMgbm9kZSBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBhZnRlciBhbGwgc29mdHdhcmUgbm9kZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBod0NvZGVjcy5wdXNoX2JhY2soJm5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB1aW50MzJfdCByYW5rID0gaXNTb2Z0d2FyZQorICAgICAgICAgICAgICAgICAgICA/IChpc0F1ZGlvID8gZGVmYXVsdFN3QXVkaW9SYW5rIDogZGVmYXVsdFN3T3RoZXJSYW5rKQorICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRSYW5rOworICAgICAgICAgICAgLy8gZ2V0IHJhbmsgZnJvbSBJT214U3RvcmUgdmlhIGF0dHJpYnV0ZQorICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5rZXkgPT0gInJhbmsiKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZFJhbmsgPSByYW5rOworICAgICAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKGF0dHJpYnV0ZS52YWx1ZS5jX3N0cigpLCAiJXUlYyIsICZyYW5rLCAmZHVtbXkpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSBvbGRSYW5rOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgIGF1dG8gYzJpID0gY29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CisgICAgICAgICAgICBpZiAoYzJpID09IGNvZGVjTmFtZTJJbmZvLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsocmFuayk7CisKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cnMgPSAwOworICAgICAgICAgICAgICAgIC8vIGFsbCBPTVggY29kZWNzIGFyZSB2ZW5kb3IgY29kZWNzIChpbiB0aGUgdmVuZG9yIHBhcnRpdGlvbiksIGJ1dAorICAgICAgICAgICAgICAgIC8vIHRyZWF0IE9NWC5nb29nbGUgY29kZWNzIGFzIG5vbi1oYXJkd2FyZS1hY2NlbGVyYXRlZCBhbmQgbm9uLXZlbmRvcgorICAgICAgICAgICAgICAgIGlmICghaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLmJlZ2luKCksIG5vZGUuYXR0cmlidXRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSAmaSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmtleSA9PSAiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+c2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNZWRpYVR5cGUodHlwZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyIsCisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1lZGlhIHR5cGUgJXMgdG8gY29kZWMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0gICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQotICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgotICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICpub2RlIDogaHdDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS0+b3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAqbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBzb2Z0d2FyZSBjb2RlY3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5jX3N0cigpLCBub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjQyLDQgKzIyNCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA5ZDJjNDJiLi5iMGNlNjg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAKICAgICBtQW5hbHl0aWNzSXRlbSA9IG51bGxwdHI7CiAgICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleUV4dHJhY3Rvcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleUV4dHJhY3Rvcik7CiAKICAgICAgICAgLy8gdHJhY2sgdGhlIGNvbnRhaW5lciBmb3JtYXQgKG1wZWcsIGFhYywgd3ZtLCBldGMpCiAgICAgICAgIHNpemVfdCBudHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM2MjYwM2MuLmNmNGVkYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM0LDI1ICszNSwxNiBAQAogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6flN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCkge30KIAotc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKLSAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAotICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIsICIubXhtZiIsCi0gICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKLSAgICAgICAgIi5tNHYiLCAiLm9nYSIsICIubTRyIgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KLSAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1WYWxpZEV4dGVuc2lvbnM7ICsraSkgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCBrVmFsaWRFeHRlbnNpb25zW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KK3N0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgeworCisgICAgaWYgKGdTdXBwb3J0ZWRFeHRlbnNpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMuY291bnQoc3RkOjpzdHJpbmcoZXh0ZW5zaW9uICsgMSkpICE9IDA7CiB9CiAKIE1lZGlhU2NhblJlc3VsdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGUoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDIxYWNjYWQuLmZhM2QzNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjgxLDEyICsyODIsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLQogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CkBAIC0zNTQsMTUgKzM0OSwxNSBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICBzcDxWaWRlb0ZyYW1lRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgewogICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKaW5kZXggNTE5ZTg3MC4uYjkwNjQ5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCkBAIC0yNyw5ICsyOCwxNyBAQAogLyogc3RhdGljICovIE11dGV4IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzTXV0ZXg7CiAvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOwogCi1TdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKLSAgICA6IG1DcmVhdGVDb2RlYyhudWxscHRyKSwKLSAgICAgIG1DcmVhdGVCdWlsZGVyKG51bGxwdHIpIHsKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga0NDb2RlY1BsdWdpblBhdGhbXSA9ICJsaWJzZnBsdWdpbl9jY29kZWMuc28iOworCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcubWVkaWEuY29kZWMyIiwgMCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiQ0NvZGVjIGlzIGRpc2FibGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKICAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKQEAgLTQ2LDcgKzU1LDcgQEAKICAgICB9CiAgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCiAgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7Ci0gICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNyZWF0ZUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUlucHV0U3VyZmFjZSAoJXMpIiwgZGxlcnJvcigpKTsKICAgICB9CiB9CkBAIC04Nyw3ICs5Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CiAgICAgaWYgKCFzSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOwotICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKCJsaWJzdGFnZWZyaWdodF9jY29kZWMuc28iKSk7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoa0NDb2RlY1BsdWdpblBhdGgpKTsKICAgICB9CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCmluZGV4IDk5OWQzMGMuLjc4ZWZmYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAgICAgc3RhdGljIE11dGV4IHNNdXRleDsKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CiAKLSAgICB2b2lkICptTGliSGFuZGxlOwotICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKLSAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZTsKKyAgICB2b2lkICptTGliSGFuZGxle251bGxwdHJ9OworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlY3tudWxscHRyfTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcntudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZXtudWxscHRyfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAzMzYxNGQ2Li4xNmIzMzE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgpAQCAtNzQsNyArNzUsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIDAgdmFsdWVzIGFyZSB1bnNwZWNpZmllZAogICAgIGludDMyX3QgcmFuZ2UgPSAwOwogICAgIGludDMyX3QgcHJpbWFyaWVzID0gMDsKQEAgLTExOSw3ICsxMjAsOCBAQAogICAgIH0KIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKLSAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKKyAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQorICAgICAgICAgICAgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIG90aGVyd2lzZSwgdmVyaWZ5IHRoYXQgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldApAQCAtMTkwLDYgKzE5Miw5IEBACiAgICAgICAgIHsgNTAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCiAgICAgICAgIHsgNTEsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCiAgICAgICAgIHsgNTIsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgNjAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgNjIsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKICAgICAgICAgeyA2NiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSB9LApAQCAtNTY4LDggKzU3MywxNjMgQEAKICAgICB9CiB9CiAKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJtYW51ZmFjdHVyZXIiLCBrS2V5TWFudWZhY3R1cmVyIH0sCisgICAgICAgIHsgInRpdGxlIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgInllYXIiLCBrS2V5WWVhciB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGZsb2F0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY2FwdHVyZS1yYXRlIiwga0tleUNhcHR1cmVGcmFtZXJhdGUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWUgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXRpbWUiLCBrS2V5VGh1bWJuYWlsVGltZSB9LAorICAgICAgICB7ICJ0aW1lVXMiLCBrS2V5VGltZSB9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9uIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImZyYW1lLWNvdW50Iiwga0tleUZyYW1lQ291bnQgfSwKKyAgICAgICAgeyAibWF4LWJpdHJhdGUiLCBrS2V5TWF4Qml0UmF0ZSB9LAorICAgICAgICB7ICJwY20tYmlnLWVuZGlhbiIsIGtLZXlQY21CaWdFbmRpYW4gfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItY291bnQiLCBrS2V5VGVtcG9yYWxMYXllckNvdW50IH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWlkIiwga0tleVRlbXBvcmFsTGF5ZXJJZCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAidmFsaWQtc2FtcGxlcyIsIGtLZXlWYWxpZFNhbXBsZXMgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBidWZmZXJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bWFydCIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gfSwKKyAgICAgICAgeyAicHNzaCIsIGtLZXlQc3NoIH0sCisgICAgICAgIHsgImNyeXB0by1pdiIsIGtLZXlDcnlwdG9JViB9LAorICAgICAgICB7ICJjcnlwdG8ta2V5Iiwga0tleUNyeXB0b0tleSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIiwga0tleUVuY3J5cHRlZFNpemVzIH0sCisgICAgICAgIHsgImNyeXB0by1wbGFpbi1zaXplcyIsIGtLZXlQbGFpblNpemVzIH0sCisgICAgICAgIHsgImljYy1wcm9maWxlIiwga0tleUljY1Byb2ZpbGUgfSwKKyAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAorICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCisgICAgfQorfTsKKwordm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGVsZW0uc2Vjb25kLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogZmxvYXRNYXBwaW5ncykgeworICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEZsb2F0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDY0TWFwcGluZ3MpIHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDMyTWFwcGluZ3MpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGJ1ZmZlck1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZyhlbGVtLmZpcnN0LCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRmxvYXQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLmdldCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKIAogICAgIGZvcm1hdC0+Y2xlYXIoKTsKIApAQCAtNTg2LDYgKzc0Niw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICBtc2ctPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKG1ldGEsIG1zZyk7CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC01OTksNiArNzYxLDE2IEBACiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgYnVmZmVyKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKICAgICBpbnQzMl90IHN5c3RlbUlkOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNBU3lzdGVtSUQsICZzeXN0ZW1JZCkpIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2Etc3lzdGVtLWlkIiwgc3lzdGVtSWQpOwpAQCAtNzEyLDYgKzg4NCwxNiBAQAogICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoKihIRFJTdGF0aWNJbmZvKilkYXRhLCBtc2cpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhtZXRhLCBtc2cpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtNzIzLDYgKzkwNSwxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwogCisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBjaGFubmVsTWFzayk7CkBAIC0xMDAxLDYgKzExODgsMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBhcnNlSGV2Y1Byb2ZpbGVMZXZlbEZyb21IdmNjKChjb25zdCB1aW50OF90ICopZGF0YSwgZGF0YVNpemUsIG1zZyk7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVYxQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgaWYgKGVzZHMuSW5pdENoZWNrKCkgIT0gKHN0YXR1c190KU9LKSB7CkBAIC0xMDQ4LDcgKzEyNDUsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1iaXRyYXRlIiwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtUeXBlRDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIHBhcnNlSDI2M1Byb2ZpbGVMZXZlbEZyb21EMjYzKHB0ciwgc2l6ZSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewpAQCAtMTE0OCwxMyArMTM0NSw2IEBACiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCi0gICAgLy8gVE9ETyBleHBvc2UgImNyeXB0by1rZXkiL2tLZXlDcnlwdG9LZXkgdGhyb3VnaCBwdWJsaWMgYXBpCi0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3J5cHRvLWtleSIsIGJ1ZmZlcik7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgKmZvcm1hdCA9IG1zZzsKIAogICAgIHJldHVybiBPSzsKQEAgLTEzNTMsNiArMTU0MywyMSBAQAogICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwogICAgIH0KIAorICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhtc2csIG1ldGEpOworCisgICAgaW50MzJfdCBzeXN0ZW1JZDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNhLXN5c3RlbS1pZCIsICZzeXN0ZW1JZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIHN5c3RlbUlkKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjYVNlc3Npb25JZCwgY2FQdnREYXRhOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1zZXNzaW9uLWlkIiwgJmNhU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsIGNhU2Vzc2lvbklkLT5kYXRhKCksIGNhU2Vzc2lvbklkLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsICZjYVB2dERhdGEpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLCBjYVB2dERhdGEtPmRhdGEoKSwgY2FQdnREYXRhLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwpAQCAtMTM4NCw3ICsxNTg5LDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOworICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xNDQ3LDYgKzE2NTIsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyMTBQbHVzSW5mbywgMCwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhQ29sb3JBc3BlY3RzKG1zZywgbWV0YSk7CiAKICAgICAgICAgQVN0cmluZyB0c1NjaGVtYTsKQEAgLTE0NzEsNiArMTY4MiwxMCBAQAogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBjaGFubmVsTWFzayk7CkBAIC0xNDg5LDYgKzE3MDQsMTEgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlJc0FEVFMsIGlzQURUUyk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUFBQ0FPVCwgYWFjUHJvZmlsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IHBjbUVuY29kaW5nOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsICZwY21FbmNvZGluZykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwpAQCAtMTUyOSwyOCArMTc0OSw1MiBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlc2RzKGNzZDBzaXplICsgMzEpOwogICAgICAgICAgICAgLy8gVGhlIHdyaXR0ZW4gRVNEUyBpcyBhY3R1YWxseSBmb3IgYW4gYXVkaW8gc3RyZWFtLCBidXQgaXQncyBlbm91Z2gKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGNzZDAtPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gY3NkMC0+ZGF0YSgpOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZlNpemUgPSBjc2QxLT5zaXplKCk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZiA9IGNzZDEtPmRhdGEoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2Vla1ByZVJvbGxCdWZTaXplID0gY3NkMi0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmID0gY3NkMi0+ZGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXh0cmFjdCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCBmcm9tIGNzZC0wLAorICAgICAgICAgICAgICogaWYgY3NkLTEgYW5kIGNzZC0yIGFyZSBub3QgcHJlc2VudCAqLworICAgICAgICAgICAgaWYgKCFjb2RlY0RlbGF5QnVmICYmICFzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpLCAmb3B1c0hlYWRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplKTsKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0NvZGVjRGVsYXksIDAsIGNvZGVjRGVsYXlCdWYsIGNvZGVjRGVsYXlCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgc2Vla1ByZVJvbGxCdWYsIHNlZWtQcmVSb2xsQnVmU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKQEAgLTE1NjAsMTEgKzE4MDQsMTcgQEAKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYWNNYWdpY0Nvb2tpZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWF2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1oZXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJlc2RzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJtcGVnMi1zdHJlYW0taGVhZGVyIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImQyNjMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCkBAIC0xNjQwLDYgKzE4OTAsOSBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICBBVURJT19GT1JNQVRfT1BVU30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsICAgICAgICAgQVVESU9fRk9STUFUX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLCAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwgICAgICAgICBBVURJT19GT1JNQVRfQUM0fSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICAgICAgICBBVURJT19GT1JNQVRfRkxBQ30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0FMQUMgfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KQEAgLTE2OTMsNDMgKzE5NDYsNDMgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pCiB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgKCppbmZvKSA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CiAKLSAgICBpbmZvLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwgbWltZSkgIT0gT0spIHsKKyAgICBpbmZvLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LCBtaW1lKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiIENvdWxkbid0IG1hcCBtaW1lIHR5cGUgXCIlc1wiIHRvIGEgdmFsaWQgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAhIiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby5mb3JtYXQpOworICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby0+Zm9ybWF0KTsKICAgICB9CiAKLSAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby5mb3JtYXQpIHsKKyAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby0+Zm9ybWF0KSB7CiAgICAgICAgIC8vIGNhbid0IG9mZmxvYWQgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBzb3VyY2UgZm9ybWF0IGlzCiAgICAgICAgIEFMT0dFKCJtaW1lIHR5cGUgXCIlc1wiIG5vdCBhIGtub3duIGF1ZGlvIGZvcm1hdCIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gUmVkZWZpbmUgYWFjIGZvcm1hdCBhY2NvcmRpbmcgdG8gaXRzIHByb2ZpbGUKICAgICAvLyBPZmZsb2FkaW5nIGRlcGVuZHMgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4KICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc3JhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBzYW1wbGUgcmF0ZSIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLnNhbXBsZV9yYXRlID0gc3JhdGU7CisgICAgaW5mby0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKIAogICAgIGludDMyX3QgY21hc2sgPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNtYXNrKSB8fCBjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKQEAgLTE3NDMsMjUgKzE5OTYsMzQgQEAKICAgICAgICAgICAgIGNtYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaW5mby5jaGFubmVsX21hc2sgPSBjbWFzazsKKyAgICBpbmZvLT5jaGFubmVsX21hc2sgPSBjbWFzazsKIAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggZHVyYXRpb24iLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOworICAgIGluZm8tPmR1cmF0aW9uX3VzID0gZHVyYXRpb247CiAKICAgICBpbnQzMl90IGJyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZicmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5iaXRfcmF0ZSA9IGJyYXRlOworICAgIGluZm8tPmJpdF9yYXRlID0gYnJhdGU7CiAKIAotICAgIGluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwotICAgIGluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87Ci0gICAgaW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICBpbmZvLT5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CisgICAgaW5mby0+aGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgaW5mby0+aXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgcmV0dXJuIE9LOworfQogCitib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwpAQCAtMTkzMSw0ICsyMTkzLDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA5MDIwZmMxLi40ZTViNWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE5LDggKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgpAQCAtMzIsMzIxICszMSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7Ci0gICAgaWYgKCpsaHMgPCAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYwotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCi0gICAgOiBtUGVyaW9kKC0xKSwKLSAgICAgIG1QaGFzZSgwKSwKLSAgICAgIG1QcmltZWQoZmFsc2UpLAotICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKLSAgICAgIG1MYXN0VGltZSgtMSksCi0gICAgICBtTnVtU2FtcGxlcygwKSB7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKLSAgICAvL3Rlc3QoKTsKLQotICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgIG1MYXN0VGltZSA9IC0xOwotCi0gICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAotICAgIGlmIChmcHMgPD0gMC5mKSB7Ci0gICAgICAgIG1QZXJpb2QgPSAtMTsKLSAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7Ci0gICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKLSAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmVzdGFydCgpOwotfQotCi0vLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKLSAgICBtTnVtU2FtcGxlcyA9IDA7Ci0gICAgbVBoYXNlID0gLTE7Ci19Ci0KLSNpZiAwCi0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgewotICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOwotICAgIG1UaW1lc1swXSA9IDA7Ci0gICAgbVRpbWVzWzFdID0gcGVyaW9kOwotICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7Ci0gICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKLSAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OwotICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7Ci0gICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7Ci0gICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7Ci0gICAgbU51bVNhbXBsZXMgPSA4OwotICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7Ci0gICAgLy8gYSA9IDAuOCg1KSsKLSAgICAvLyBiID0gLTAuMTQwOTcoMikrCi0gICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCi0gICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCi0gICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKLSAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7Ci0gICAgfQotCi0gICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKLSAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3Qgc3VtWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZID0gMDsKLQotICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQotICAgIG5zZWNzX3QgbGFzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgewotICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKLSAgICAgICAgfQotICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KLSAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZwotICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAotICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgotICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKLSAgICAgICAgc3VtWCArPSB4OwotICAgICAgICBzdW1ZICs9IHk7Ci0gICAgICAgIHN1bVhYICs9IHggKiB4OwotICAgICAgICBzdW1YWSArPSB4ICogeTsKLSAgICAgICAgc3VtWVkgKz0geSAqIHk7Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKLSAgICBpZiAoZGl2ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOwotICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKLSAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOwotICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7Ci0gICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50Ci0gICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKLSAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCi0gICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLSAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCi0KLSAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKLSAgICAvLyAybmQgb3JkZXIgZGVsdGFzCi0gICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKLSAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgewotICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFRpbWUgPSB0aW1lOwotICAgIH0KLSAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKLSAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKLSAgICBpZiAobnVtRGVsdGFzID4gMSkgewotICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgewotICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7Ci0gICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKLSAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKLSAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAotICAgIGludDY0X3QgYmVzdFNjb3JlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07Ci0gICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOwotI2lmIDEKLSAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKLSAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOwotICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgewotICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzY29yZSA9IG1hdGNoZXM7Ci0jaWYgMAotICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCi0gICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7Ci0gICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKLSAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOwotICAgICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKLSAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKLSAgICBpZiAobUxhc3RUaW1lID49IDAKLSAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKLSAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKLSAgICAgICAgcmVzdGFydCgpOwotICAgIH0KLQotICAgIG1MYXN0VGltZSA9IHRpbWU7Ci0gICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7Ci0gICAgKyttTnVtU2FtcGxlczsKLQotICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7Ci0gICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7Ci0gICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOwotICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0gICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICBpZiAobVBoYXNlIDwgMCkgewotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQotICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKLSAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKLSAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb0ZpdCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgewotICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KLSAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKLQotICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKLSAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLQotICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1QZXJpb2Q7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCi0KLVZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQotICAgIDogbVZzeW5jVGltZSgwKSwKLSAgICAgIG1Wc3luY1BlcmlvZCgwKSwKLSAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKLSAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKLSAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7CitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKIH0KIAogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjp1cGRhdGVWc3luYygpIHsKICAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOwotICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKIAotICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKLSAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKICAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKICAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpAQCAtMzY4LDEzNiArNjAsNiBAQAogICAgIH0KIH0KIAotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7Ci0gICAgdXBkYXRlVnN5bmMoKTsKLQotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlc3RhcnQoKSB7Ci0gICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKLSAgICBtVGltZUNvcnJlY3Rpb24gPSAwOwotCi0gICAgbVBsbC5yZXN0YXJ0KCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7Ci0gICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Ci19Ci0KLWZsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIDAuZjsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKLSAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKLQotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7Ci0gICAgICAgIHVwZGF0ZVZzeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0gICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKLSAgICB9Ci0KLSAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQotICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKLSAgICAgICAgbVZzeW5jVGltZSAtPQotICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0KLSAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCi0gICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKLSAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0KLSAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOwotICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKLSAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKLSAgICAgICAgc2l6ZV90IE4gPSAxMjsKLSAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQotICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7Ci0gICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCi0gICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCi0gICAgICAgICAgICBOID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7Ci0gICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgewotICAgICAgICAgICAgb2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOwotICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKLSAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKLSAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOwotICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7Ci0gICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKLSAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KLSAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7Ci0KLSAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQwotICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQotICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKLSAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKLSAgICAgICAgICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcwotICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7Ci0gICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKLSAgICByZXR1cm4gcmVuZGVyVGltZTsKLX0KLQogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgewogICAgIG1Db21wb3Nlci5jbGVhcigpOwogfQpAQCAtNTA3LDQgKzY5LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NjkwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlcjIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Nob3Jlb2dyYXBoZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZzeW5jVHJhY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBWc3luY1RyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZXsKK3B1YmxpYzoKKyAgICBWc3luY1RyYWNrZXIoKTsKKyAgICB+VnN5bmNUcmFja2VyKCkge30KKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisgICAgbnNlY3NfdCBnZXRWc3luY1RpbWUobnNlY3NfdCBwZXJpb2RPZmZzZXQpOworICAgIHZvaWQgYWRkU2FtcGxlKG5zZWNzX3QgdGltZXN0YW1wKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhTYW1wbGVzID0gMzI7CisgICAgc3RhdGljIGNvbnN0IGludCBrTWluU2FtcGxlc0ZvclVwZGF0ZSA9IDY7CisgICAgaW50IG1OdW1TYW1wbGVzOworICAgIGludCBtRmlyc3RTYW1wbGU7CisgICAgbnNlY3NfdCBtUmVmZXJlbmNlVGltZTsKKyAgICBuc2Vjc190IG1QaGFzZTsKKyAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgbnNlY3NfdCBtVGltZXN0YW1wU2FtcGxlc1trTWF4U2FtcGxlc107CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICB2b2lkIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9OworCitWc3luY1RyYWNrZXI6OlZzeW5jVHJhY2tlcigpCisgICAgOiBtTnVtU2FtcGxlcygwKSwKKyAgICAgIG1GaXJzdFNhbXBsZSgwKSwKKyAgICAgIG1SZWZlcmVuY2VUaW1lKDApLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVBlcmlvZCgwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U2FtcGxlczsgaSsrKSB7CisgICAgICAgIG1UaW1lc3RhbXBTYW1wbGVzW2ldID0gMDsKKyAgICB9Cit9CisKK25zZWNzX3QgVnN5bmNUcmFja2VyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNUaW1lKG5zZWNzX3QgcGVyaW9kT2Zmc2V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IHBoYXNlID0gbVJlZmVyZW5jZVRpbWUgKyBtUGhhc2U7CisKKyAgICAvLyByZXN1bHQgPSAoKChub3cgLSBwaGFzZSkgLyBtUGVyaW9kKSArIHBlcmlvZE9mZnNldCArIDEpICogbVBlcmlvZCArIHBoYXNlCisgICAgLy8gcHJldmVudCBvdmVyZmxvdworICAgIG5zZWNzX3QgcmVzdWx0ID0gKG5vdyAtIHBoYXNlKSAvIG1QZXJpb2Q7CisgICAgaWYgKHJlc3VsdCA+IExPTkdfTE9OR19NQVggLSBwZXJpb2RPZmZzZXQgLSAxKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBwZXJpb2RPZmZzZXQgKyAxOworICAgIH0KKyAgICBpZiAocmVzdWx0ID4gTE9OR19MT05HX01BWCAvIG1QZXJpb2QpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICo9IG1QZXJpb2Q7CisgICAgfQorICAgIGlmIChyZXN1bHQgPiBMT05HX0xPTkdfTUFYIC0gcGhhc2UpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9IHBoYXNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIG1QaGFzZSA9IDA7CisgICAgICAgIG1SZWZlcmVuY2VUaW1lID0gdGltZXN0YW1wOworICAgIH0KKyAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIG1OdW1TYW1wbGVzKSAlIGtNYXhTYW1wbGVzOworICAgIG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gPSB0aW1lc3RhbXA7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwga01heFNhbXBsZXMpIHsKKyAgICAgICAgbU51bVNhbXBsZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmlyc3RTYW1wbGUgPSAobUZpcnN0U2FtcGxlICsgMSkgJSBrTWF4U2FtcGxlczsKKyAgICB9CisgICAgdXBkYXRlTW9kZWxMb2NrZWQoKTsKK30KKwordm9pZCBWc3luY1RyYWNrZXI6OnVwZGF0ZU1vZGVsTG9ja2VkKCkgeworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNaW5TYW1wbGVzRm9yVXBkYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbnNlY3NfdCBkdXJhdGlvblN1bSA9IDA7CisgICAgbnNlY3NfdCBtaW5EdXJhdGlvbiA9IExPTkdfTUFYOworICAgIG5zZWNzX3QgbWF4RHVyYXRpb24gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgaW50IHByZXYgPSAoaWR4ICsga01heFNhbXBsZXMgLSAxKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIGR1cmF0aW9uID0gbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSAtIG1UaW1lc3RhbXBTYW1wbGVzW3ByZXZdOworICAgICAgICBkdXJhdGlvblN1bSArPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1pbkR1cmF0aW9uID4gZHVyYXRpb24pIHsgbWluRHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgICAgICBpZiAobWF4RHVyYXRpb24gPCBkdXJhdGlvbikgeyBtYXhEdXJhdGlvbiA9IGR1cmF0aW9uOyB9CisgICAgfQorCisgICAgZHVyYXRpb25TdW0gLT0gKG1pbkR1cmF0aW9uICsgbWF4RHVyYXRpb24pOworICAgIG1QZXJpb2QgPSBkdXJhdGlvblN1bSAvIChtTnVtU2FtcGxlcyAtIDMpOworCisgICAgZG91YmxlIHNhbXBsZUF2Z1ggPSAwLjA7CisgICAgZG91YmxlIHNhbXBsZUF2Z1kgPSAwLjA7CisgICAgZG91YmxlIHNjYWxlID0gMi4wICogTV9QSSAvIChkb3VibGUpIG1QZXJpb2Q7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG1OdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBpKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIHNhbXBsZSA9IG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gLSBtUmVmZXJlbmNlVGltZTsKKyAgICAgICAgZG91YmxlIHNhbXBsZVBoYXNlID0gKGRvdWJsZSkgKHNhbXBsZSAlIG1QZXJpb2QpICogc2NhbGU7CisgICAgICAgIHNhbXBsZUF2Z1ggKz0gY29zKHNhbXBsZVBoYXNlKTsKKyAgICAgICAgc2FtcGxlQXZnWSArPSBzaW4oc2FtcGxlUGhhc2UpOworICAgIH0KKworICAgIHNhbXBsZUF2Z1ggLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgc2FtcGxlQXZnWSAvPSAoZG91YmxlKSBtTnVtU2FtcGxlcyAtIDEuMDsKKyAgICBtUGhhc2UgPSAobG9uZykgKGF0YW4yKHNhbXBsZUF2Z1ksIHNhbXBsZUF2Z1gpIC8gc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCBmcmFtZUNhbGxiYWNrKGxvbmcgZnJhbWVUaW1lTmFub3MsIHZvaWQqIGRhdGEpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8VnN5bmNUcmFja2VyPiB2c3luY1RyYWNrZXIoc3RhdGljX2Nhc3Q8VnN5bmNUcmFja2VyKj4oZGF0YSkpOworICAgIHZzeW5jVHJhY2tlci0+YWRkU2FtcGxlKGZyYW1lVGltZU5hbm9zKTsKKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjayhBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgZnJhbWVDYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHZzeW5jVHJhY2tlci5nZXQoKSkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKSB7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga09uZU1pbGxpc2VjSW5OYW5vc2VjID0gMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT25lU2VjSW5OYW5vc2VjID0ga09uZU1pbGxpc2VjSW5OYW5vc2VjICogMTAwMDsKKworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzID0gZW52LT5GaW5kQ2xhc3MoCisgICAgICAgICAgICAiYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsIik7CisgICAgamNsYXNzIGpEaXNwbGF5Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9EaXNwbGF5Iik7CisKKyAgICBqbWV0aG9kSUQgakdldEluc3RhbmNlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsCisgICAgICAgICAgICAiZ2V0SW5zdGFuY2UiLCAiKClMYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsOyIpOworICAgIGpvYmplY3QgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLCBqR2V0SW5zdGFuY2UpOworCisgICAgamZpZWxkSUQgakRFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqRGlzcGxheUNscywgIkRFRkFVTFRfRElTUExBWSIsICJJIik7CisgICAgamludCBERUZBVUxUX0RJU1BMQVkgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpEaXNwbGF5Q2xzLCBqREVGQVVMVF9ESVNQTEFZKTsKKworICAgIGptZXRob2RJRCBqZ2V0UmVhbERpc3BsYXkgPSBlbnYtPkdldE1ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRSZWFsRGlzcGxheSIsICIoSSlMYW5kcm9pZC92aWV3L0Rpc3BsYXk7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5TWFuYWdlckdsb2JhbE9iaiwgamdldFJlYWxEaXNwbGF5LCBERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpHZXRSZWZyZXNoUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlDbHMsICJnZXRSZWZyZXNoUmF0ZSIsICIoKUYiKTsKKyAgICBqZmxvYXQgamF2YVJlZnJlc2hSYXRlID0gZW52LT5DYWxsRmxvYXRNZXRob2QoamF2YURpc3BsYXlPYmosIGpHZXRSZWZyZXNoUmF0ZSk7CisgICAgbnNlY3NfdCB2c3luY1BlcmlvZCA9IChuc2Vjc190KSAoa09uZVNlY0luTmFub3NlYyAvIChmbG9hdCkgamF2YVJlZnJlc2hSYXRlKTsKKworICAgIGptZXRob2RJRCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldEFwcFZzeW5jT2Zmc2V0TmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YUFwcFZzeW5jT2Zmc2V0ID0gZW52LT5DYWxsTG9uZ01ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldEFwcFZzeW5jT2Zmc2V0TmFub3MpOworICAgICphcHBWc3luY09mZnNldFB0ciA9IChuc2Vjc190KSBqYXZhQXBwVnN5bmNPZmZzZXQ7CisKKyAgICBqbWV0aG9kSUQgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakRpc3BsYXlDbHMsICJnZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zIiwgIigpSiIpOworICAgIGpsb25nIGphdmFQcmVzZW50YXRpb25EZWFkbGluZSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCisgICAgICAgICAgICBqYXZhRGlzcGxheU9iaiwgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MpOworCisgICAgKnNmVnN5bmNPZmZzZXRQdHIgPSB2c3luY1BlcmlvZCAtICgobnNlY3NfdCkgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lIC0ga09uZU1pbGxpc2VjSW5OYW5vc2VjKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9yZW9ncmFwaGVyIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIENob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSk7CisgICAgc3RhdHVzX3QgaW5pdCh2b2lkKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWR5VG9SdW4oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2hvcmVvZ3JhcGhlclRocmVhZCgpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hvcmVvZ3JhcGhlclRocmVhZCk7CisgICAgdm9pZCogbURhdGE7Cit9OworCitDaG9yZW9ncmFwaGVyVGhyZWFkOjpDaG9yZW9ncmFwaGVyVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpIDogVGhyZWFkKGNhbkNhbGxKYXZhKSB7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OmluaXQodm9pZCogZGF0YSkgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1EYXRhID0gZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7CisgICAgQUxvb3Blcl9wcmVwYXJlKEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTKTsKKyAgICBpZiAoQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjayhBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLCBmcmFtZUNhbGxiYWNrLCBtRGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENob3Jlb2dyYXBoZXJUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgQUxvb3Blcl9wb2xsT25jZSgtMSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6OlZpZGVvRnJhbWVTY2hlZHVsZXIyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKKworICAgIGdldFZzeW5jT2Zmc2V0KCZtQXBwVnN5bmNPZmZzZXQsICZtU2ZWc3luY09mZnNldCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgdGhyZWFkTG9jayhtTG9jayk7CisgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQgPSBuZXcgQ2hvcmVvZ3JhcGhlclRocmVhZCh0cnVlKTsKKworICAgIG1Wc3luY1RyYWNrZXIgPSBuZXcgVnN5bmNUcmFja2VyKCk7CisgICAgaWYgKG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5pbml0KHN0YXRpY19jYXN0PHZvaWQqPihtVnN5bmNUcmFja2VyLmdldCgpKSkgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1DaG9yZW9ncmFwaGVyVGhyZWFkICE9IE5VTEwgJiYgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJ1bigiQ2hvcmVvZ3JhcGhlciIpICE9IE9LKSB7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjp1cGRhdGVWc3luYygpIHsKKyAgICBtVnN5bmNUaW1lID0gMDsKKyAgICBtVnN5bmNQZXJpb2QgPSAwOworCisgICAgaWYgKG1Wc3luY1RyYWNrZXIgIT0gTlVMTCkgeworICAgICAgICBtVnN5bmNQZXJpb2QgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1BlcmlvZCgpOworICAgICAgICBtVnN5bmNUaW1lID0gbVZzeW5jVHJhY2tlci0+Z2V0VnN5bmNUaW1lKG1TZlZzeW5jT2Zmc2V0IC0gbUFwcFZzeW5jT2Zmc2V0KTsKKyAgICB9CisgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6cmVsZWFzZSgpIHsKKyAgICAvLyBEbyBub3QgY2hhbmdlIG9yZGVyCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgdGhyZWFkTG9jayhtTG9jayk7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtVnN5bmNUcmFja2VyLmNsZWFyKCk7Cit9CisKK1ZpZGVvRnJhbWVTY2hlZHVsZXIyOjp+VmlkZW9GcmFtZVNjaGVkdWxlcjIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMDdmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7CisgICAgaWYgKCpsaHMgPCAqcmhzKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprSGlzdG9yeVNpemU7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprSGlzdG9yeVNpemU7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOworc3RhdGljIGNvbnN0IGludDY0X3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyNSUKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxJQorc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xczsgICAgIC8vIDEgc2VjCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAvLyAxMCBzZWMKKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6UExMKCkKKyAgICA6IG1QZXJpb2QoLTEpLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVByaW1lZChmYWxzZSksCisgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nKDApLAorICAgICAgbUxhc3RUaW1lKC0xKSwKKyAgICAgIG1OdW1TYW1wbGVzKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKKyAgICAvL3Rlc3QoKTsKKworICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgIG1MYXN0VGltZSA9IC0xOworCisgICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAorICAgIGlmIChmcHMgPD0gMC5mKSB7CisgICAgICAgIG1QZXJpb2QgPSAtMTsKKyAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7CisgICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKKyAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgfQorCisgICAgcmVzdGFydCgpOworfQorCisvLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc3RhcnQoKSB7CisgICAgbU51bVNhbXBsZXMgPSAwOworICAgIG1QaGFzZSA9IC0xOworfQorCisjaWYgMAorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnRlc3QoKSB7CisgICAgbnNlY3NfdCBwZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDYwOworICAgIG1UaW1lc1swXSA9IDA7CisgICAgbVRpbWVzWzFdID0gcGVyaW9kOworICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7CisgICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKKyAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OworICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7CisgICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7CisgICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7CisgICAgbU51bVNhbXBsZXMgPSA4OworICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7CisgICAgLy8gYSA9IDAuOCg1KSsKKyAgICAvLyBiID0gLTAuMTQwOTcoMikrCisgICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCisgICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKK30KKworI2VuZGlmCisKK2Jvb2wgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6Zml0KAorICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKworICAgIGlmICgocGVyaW9kID4+IGtQcmVjaXNpb24pID09IDAgKSB7CisgICAgICAgIEFMT0dXKCJQZXJpb2QgaXMgMCwgb3IgYWZ0ZXIgaW5jbHVkaW5nIHByZWNpc2lvbiBpcyAwIC0gd291bGQgY2F1c2UgZGl2MCwgcmV0dXJuaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1bVggPSAwOworICAgIGludDY0X3Qgc3VtWFggPSAwOworICAgIGludDY0X3Qgc3VtWFkgPSAwOworICAgIGludDY0X3Qgc3VtWVkgPSAwOworICAgIGludDY0X3Qgc3VtWSA9IDA7CisKKyAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKKyAgICBuc2Vjc190IGxhc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCisgICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKKyAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKKyAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KKyAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7CisgICAgICAgIHN1bVggKz0geDsKKyAgICAgICAgc3VtWSArPSB5OworICAgICAgICBzdW1YWCArPSB4ICogeDsKKyAgICAgICAgc3VtWFkgKz0geCAqIHk7CisgICAgICAgIHN1bVlZICs9IHkgKiB5OworICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorCisgICAgaW50NjRfdCBkaXYgICA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7CisgICAgaWYgKGRpdiA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGFfbm9tID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKKyAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7CisgICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKKyAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOworICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAorICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7CisgICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnByaW1lKHNpemVfdCBudW1TYW1wbGVzVG9Vc2UpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorICAgIENIRUNLKG51bVNhbXBsZXNUb1VzZSA+PSAzKTsgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHNhbXBsZXMKKworICAgIC8vIGVzdGltYXRlIHZpZGVvIGZyYW1lcmF0ZSBmcm9tIGRlbHRhcyBiZXR3ZWVuIHRpbWVzdGFtcHMsIGFuZAorICAgIC8vIDJuZCBvcmRlciBkZWx0YXMKKyAgICBWZWN0b3I8bnNlY3NfdD4gZGVsdGFzOworICAgIG5zZWNzX3QgbGFzdFRpbWUsIGZpcnN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaW5kZXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFRpbWUgPiBrTWluUGVyaW9kKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGE6ICVsbGQiLCAobG9uZyBsb25nKSh0aW1lIC0gbGFzdFRpbWUpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaCh0aW1lIC0gbGFzdFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlyc3RUaW1lID0gdGltZTsKKyAgICAgICAgfQorICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorICAgIGRlbHRhcy5zb3J0KGNvbXBhcmU8bnNlY3NfdD4pOworICAgIHNpemVfdCBudW1EZWx0YXMgPSBkZWx0YXMuc2l6ZSgpOworICAgIGlmIChudW1EZWx0YXMgPiAxKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNaW5MaW1pdCA9IG1heChkZWx0YXNbMF0gLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2LCBrTWluUGVyaW9kKTsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1heExpbWl0ID0gZGVsdGFzW251bURlbHRhcyAvIDJdICoga011bHRpcGxlc1RocmVzaG9sZERpdjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG51bURlbHRhcyAvIDIgKyAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZWx0YXNbaV0gPiBkZWx0YU1heExpbWl0KSB7CisgICAgICAgICAgICAgICAgZGVsdGFzLnJlc2l6ZShpKTsKKyAgICAgICAgICAgICAgICBudW1EZWx0YXMgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEybmQgPSBkZWx0YXNbaV0gLSBkZWx0YXNbaSAtIDFdOworICAgICAgICAgICAgaWYgKGRlbHRhMm5kID49IGRlbHRhTWluTGltaXQpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTI6ICVsbGQiLCAobG9uZyBsb25nKShkZWx0YTJuZCkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKGRlbHRhMm5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZSB0aGUgb25lIHRoYXQgeWllbGRzIHRoZSBiZXN0IG1hdGNoCisgICAgaW50NjRfdCBiZXN0U2NvcmU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YSA9IGRlbHRhc1tpXTsKKyAgICAgICAgaW50NjRfdCBzY29yZSA9IDA7CisjaWYgMQorICAgICAgICAvLyBzaW1wbGVzdCBzY29yZTogbnVtYmVyIG9mIGRlbHRhcyB0aGF0IGFyZSBuZWFyIG11bHRpcGxlcworICAgICAgICBzaXplX3QgbWF0Y2hlcyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGVsdGFzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBuc2Vjc190IGVyciA9IHBlcmlvZGljRXJyb3IoZGVsdGFzW2pdLCBkZWx0YSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgZGVsdGEgLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2KSB7CisgICAgICAgICAgICAgICAgKyttYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjb3JlID0gbWF0Y2hlczsKKyNpZiAwCisgICAgICAgIC8vIGNvdWxkIGJlIHdlaWdoZWQgYnkgdGhlICgxIC0gbm9ybWFsaXplZCBlcnJvcikKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIGVyciA9ICgxIDw8ICgyICoga1ByZWNpc2lvbikpIC0gZXJyOworICAgICAgICAgICAgc2NvcmUgKj0gbWF4KDAsIGVycik7CisgICAgICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgLy8gb3IgdXNlIHRoZSBlcnJvciBhcyBhIG5lZ2F0aXZlIHNjb3JlCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBzY29yZSA9IC1kZWx0YSAqIGVycjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChpID09IDAgfHwgc2NvcmUgPiBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOworICAgICAgICAgICAgbVBlcmlvZCA9IGRlbHRhOworICAgICAgICAgICAgbVBoYXNlID0gZmlyc3RUaW1lOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKKyAgICBpZiAobUxhc3RUaW1lID49IDAKKyAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKKyAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKKyAgICAgICAgcmVzdGFydCgpOworICAgIH0KKworICAgIG1MYXN0VGltZSA9IHRpbWU7CisgICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7CisgICAgKyttTnVtU2FtcGxlczsKKworICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7CisgICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7CisgICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOworICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7CisgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICBpZiAobVBoYXNlIDwgMCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQorICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKKyAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKKyAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KKyAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKKworICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKworICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1QZXJpb2Q7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgeworICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkKKyAgICA6IG1Wc3luY1RpbWUoMCksCisgICAgICBtVnN5bmNQZXJpb2QoMCksCisgICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCisgICAgICBtTGFzdFZzeW5jVGltZSgtMSksCisgICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7CisgICAgdXBkYXRlVnN5bmMoKTsKKworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpyZXN0YXJ0KCkgeworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzdGFydCgpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBpZiAobVZzeW5jUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gbVZzeW5jUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKK30KKworZmxvYXQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldEZyYW1lUmF0ZSgpIHsKKyAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKKyAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIDAuZjsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7CisgICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7CisKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgeworICAgICAgICB1cGRhdGVWc3luYygpOworICAgIH0KKworICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgeworICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7CisgICAgfQorCisgICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKKyAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7CisgICAgICAgIG1Wc3luY1RpbWUgLT0KKyAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7CisgICAgfQorCisgICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQorICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCisgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworCisgICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKKyAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7CisgICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCisgICAgICAgIHNpemVfdCBOID0gMTI7CisgICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KKyAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQorICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOworICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQorICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLworICAgICAgICAgICAgTiA9IDIwOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOworICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKKyAgICAgICAgICAgIG9mZnNldCArPQorICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOworICAgICAgICB9CisgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gKG5zZWNzX3QpTjsKKyAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247CisgICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7CisgICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIChuc2Vjc190KU4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKKyAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgeworICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5CisgICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9CisgICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOworICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOworICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KKyAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOworCisgICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPiAwKQorICAgICAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA8IFVMT05HX01BWCkKKyAgICAgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgKiAyCisgICAgICAgICAgICAgICAgICAgIHx8IG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAqIDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGlvbiBiZXlvbmQgbGltaXQ6ICVsbGQgdnMgJWxsZCAodnN5bmNzIGZvciBsYXN0IGZyYW1lOiAlenUsIG1pbjogJXp1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcmVzdGFydGluZy4gcmVuZGVyPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVGltZUNvcnJlY3Rpb24sIChsb25nIGxvbmcpY29ycmVjdGlvbkxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNzRm9yTGFzdEZyYW1lLCBtaW5Wc3luY3NQZXJGcmFtZSwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSk7CisgICAgICAgICAgICAgICAgcmVzdGFydCgpOworICAgICAgICAgICAgICAgIHJldHVybiBvcmlnUmVuZGVyVGltZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7CisgICAgfQorCisgICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKKyAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7CisgICAgcmV0dXJuIHJlbmRlclRpbWU7Cit9CisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjp+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7fQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAppbmRleCBkYjg2MjE4Li4yMThmZTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKQEAgLTQsNyArNCw3IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0KKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiQ29udmVyc2lvbi5jcHAiLAogICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCkBAIC0yNSw3ICsyNSw2IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKQEAgLTM4LDggKzM3LDYgQEAKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAotCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcAppbmRleCBmZmVkMDA1Li45MWQ3Yzc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcApAQCAtOTgsNiArOTgsMTcgQEAKICAqLwogCiAvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAorc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogKHQuaXNEZWFkT2JqZWN0KCkgPyBERUFEX09CSkVDVCA6IFVOS05PV05fRVJST1IpOworfQorCisvKioKICAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBiaW5kZXI6OlN0YXR1c2AuCiAgKgogICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCkBAIC0xMDcsMjIgKzExOCwxMSBAQAogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cygKICAgICAgICAgUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKAotICAgICAgICAgICAgdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1IsCisgICAgICAgICAgICB0b1N0YXR1c1QodCksCiAgICAgICAgICAgICB0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiB9CiAKIC8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190Ci1zdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKICAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgogICoKICAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDcxY2VlZDguLmE0Mzc0YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC03NjcsNyArNzY3LDcgQEAKICAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKICAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKQEAgLTExMDYsNiArMTEwNiwxNCBAQAogICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKICAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKIAorICAgICAgICAvLyBTZXQgaW1wbC4gZGVmaW5lZCBmb3JtYXQgYXMgZGVmYXVsdC4gRGVwZW5kaW5nIG9uIHRoZSB1c2FnZSBmbGFncworICAgICAgICAvLyB0aGUgZGV2aWNlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgZGVyaXZlIHRoZSBleGFjdCBmb3JtYXQuCisgICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBzdXJmYWNlIGRlZmF1bHQgZm9ybWF0IHJldDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IDM3OWQ0MWUuLmUwZjI2ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtMTA1OCw4ICsxMDU4LDggQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdEFWQzo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaDoKICAgICAgICAgewpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCBhNDNjZGYxLi44MjUzYjdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMjE5LDggKzIxOSw4IEBACiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0cmF0ZSk7CiAKLSAgICBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAxNjc0Y2IyLi4zZDRhNDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMjksNyArMjksNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IDRkYjAwNjAuLjg0MmE3Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC04OSwxMiArODksMTIgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDQwOTYgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CiAgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKLSAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSBzaXplb2YoZmxvYXQpOwogCiAgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOwogICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KIApAQCAtMTk1LDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gbU51bWVyaWNhbERhdGE7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAyOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0yODEsNiArMjgxLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdCAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDE2KSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0zMDEsMTEgKzMxNCwxMyBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCisgICAgY29uc3QgYm9vbCBvdXRwdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisKICAgICBBTE9HVigib25RdWV1ZUZpbGxlZCAlZC8lZDoiLCBpblF1ZXVlLmVtcHR5KCksIG91dFF1ZXVlLmVtcHR5KCkpOwogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtRmluaXNoZWREZWNvZGVyKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIGludDE2X3QgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICB2b2lkICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKICAgICAgICAgc2l6ZV90IG91dEJ1ZmZlclNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOwogCkBAIC0zNzQsNyArMzg5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwgb3V0cHV0RmxvYXQpOwogICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0zOTMsNyArNDA4LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtU2F3SW5wdXRFT1MpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKE5VTEwsIDAsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogaW5CdWZmZXIgKi8sIDAgLyogaW5CdWZmZXJMZW4gKi8sCisgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUsIG91dHB1dEZsb2F0KTsKICAgICAgICAgICAgIG1GaW5pc2hlZERlY29kZXIgPSB0cnVlOwogICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZmluaXNoIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKQEAgLTQ1Niw3ICs0NzMsOCBAQAogICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CiAgICAgICAgICAgICBQb3J0SW5mbyAqaW5mbyA9IGVkaXRQb3J0SW5mbygxIC8qIHBvcnRJbmRleCAqLyk7CiAgICAgICAgICAgICBpZiAoIWluZm8tPm1EZWYuYkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpbmZvLT5tRGVmLm5CdWZmZXJTaXplID0gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogMjsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRGVmLm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCmluZGV4IGI2M2Y3YWQuLmJhMDIwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKQEAgLTQ1LDEwICs0NSwxNCBAQAogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga051bVNhbXBsZXNQZXJGcmFtZSA9IDIwNDg7IC8vIGFkanVzdGVkIGJhc2VkIG9uIHN0cmVhbS4KKwogICAgIGVudW0gewogICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICAgPSA0LAogICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyAgPSA0LAogICAgIH07CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAppbmRleCA5YjY5NmRhLi5iMzJhYjA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icApAQCAtMjgsNyArMjgsMTAgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYmFzZV9oZWFkZXJzIl0sCi0gICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCA5NTVmMjExLi4zYWRkMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEZsYWNFbmNvZGVyLmgiCi0KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIApAQCAtNzUsNyArNzUsOSBAQAogICAgIH0KIAogICAgIGlmICghbVNpZ25hbGxlZEVycm9yKSB7IC8vIG5vIHVzZSBhbGxvY2F0aW5nIGlucHV0IGJ1ZmZlciBpZiB3ZSBoYWQgYW4gZXJyb3IgYWJvdmUKLSAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2Moc2l6ZW9mKEZMQUNfX2ludDMyKSAqIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgLy8gMnggdGhlIHBjbTE2IHNhbXBsZXMgY2FuIGV4aXN0IHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBwY21GbG9hdCBzYW1wbGVzLgorICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgICAgICBzaXplb2YoRkxBQ19faW50MzIpICoga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOwogICAgICAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlNvZnRGbGFjRW5jb2Rlcjo6U29mdEZsYWNFbmNvZGVyKG5hbWU9JXMpIGVycm9yIGFsbG9jYXRpbmcgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIiwgbmFtZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTE1LDE0ICsxMTcsMTQgQEAKICAgICAvLyBjb25maWd1cmUgaW5wdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4SW5wdXRCdWZmZXJTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTEzNCw3ICsxMzYsNyBAQAogICAgIC8vIGNvbmZpZ3VyZSBvdXRwdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOy8vIFRPRE8gdmVyaWZ5IHRoYXQgMSBpcyBlbm91Z2gKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CiAgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE91dHB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CkBAIC0xOTMsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTI3MCwxMiArMjcyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVkIGNoYW5uZWxzIGF0ICVkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUVuY29kZXIoKTsKQEAgLTM1Niw2ICszNzIsMTAgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gc2FtcGxlU2l6ZSAqIG1OdW1DaGFubmVsczsKKwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogCiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1TZW50T3V0cHV0RU9TKSB7CkBAIC0zODEsMTMgKzQwMSwyMSBAQAogICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOwogICAgICAgICAgICAgbUN1cnJlbnRJbnB1dFRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1MxNiAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBmcmFtZVNpemU7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gc2FtcGxlU2l6ZTsKIAotICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgaWYgKGlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlIG5iSW5wdXRTYW1wbGVzIG1heSBiZSAyeCBhcyBsYXJnZSBmb3IgcGNtMTYgZGF0YS4KKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKICAgICAgICAgICAgIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKQEAgLTUyNiwxMCArNTU0LDEyIEBACiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CiAgICAgfQogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBpbnQgY29kZWNCaXRzUGVyU2FtcGxlID0gaW5wdXRGbG9hdCA/IDI0IDogMTY7CiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtTnVtQ2hhbm5lbHMpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbVNhbXBsZVJhdGUpOwotICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIDE2KTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBjb2RlY0JpdHNQZXJTYW1wbGUpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwKICAgICAgICAgICAgICh1bnNpZ25lZCltQ29tcHJlc3Npb25MZXZlbCk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDY0YTZiMWUuLjcyMmZjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTQ1LDggKzQ1LDEwIEBACiAKIHByaXZhdGU6CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtOdW1CdWZmZXJzID0gMjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpICogMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4Q2hhbm5lbHMgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPQorICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gNjU1MzY7ICAgIC8vVE9ETyBjaGVjayBpZiB0aGlzIGNhbiBiZSByZWR1Y2VkCiAKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKQEAgLTU0LDYgKzU2LDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggYzE0OTgzYS4uODc3Y2I1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIAorI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDYgIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0ZW1wbGF0ZTxjbGFzcyBUPgpAQCAtMTg0LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggYTc1NDgzYS4uM2QxMDA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTYxNyw2ICs2MTcsNyBAQAogICAgIHJldHVybjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93X2ludHJhKAogICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDc1Y2E4NDYuLjljMGZjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMTg2LDggKzE4Niw4IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwogICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKICNlbHNlCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CkBAIC0yMTMsNiArMjEzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwpAQCAtMzM5LDI3ICszNDAsMzMgQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAKICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2Vsc2UKICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwogICAgIH0KICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbmRpZgogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwogI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKQEAgLTM4Myw4ICszOTAsMTAgQEAKIAogICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTQzMSwxMCArNDQwLDEyIEBACiAjZWxzZQogICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewpAQCAtNDQyLDYgKzQ1Myw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogCiAgICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKQEAgLTQ1MCw2ICs0NjIsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogCiAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KQEAgLTQ1OSw5ICs0NzIsMTEgQEAKICAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCiAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewpAQCAtNDY5LDYgKzQ4NCw3IEBACiAgICAgfQogICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKIAogICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwpAQCAtNDg5LDggKzUwNSwxMCBAQAogICAgIH0KICAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAwMGYyZGQzLi43MWUxMTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2lmbmRlZiBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KICNkZWZpbmUgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCmluZGV4IDUzMTQ5YzEuLmVjYzMyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMzc3LDE1ICszNzcsMTUgQEAKIC8qICBJbi9vdXQgICA6IE5yLCBCLCBSciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJ2aWRlbyIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLQogUFZfU1RBVFVTIFJDX1VwZGF0ZUJ1ZmZlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyLCBJbnQgbnVtX3NraXApCiB7CiAgICAgcmF0ZUNvbnRyb2wgKnJjICA9IHZpZGVvLT5yY1tjdXJyTGF5ZXJdOwogICAgIE11bHRpUGFzcyAgICpwTVAgPSB2aWRlby0+cE1QW2N1cnJMYXllcl07CiAKLSAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCByYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQorICAgIGlmIChyYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gUFZfRkFJTDsKIAogICAgIHJjLT5WQlZfZnVsbG5lc3MgICAtPSAoSW50KShyYy0+Yml0cmF0ZSAvIHJjLT5mcmFtZXJhdGUgKiBudW1fc2tpcCk7IC8vcmNbY3VyckxheWVyXS0+UnA7CkBAIC01MjQsNiArNTI0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiB2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKHZvaWQgKmlucHV0KQpAQCAtNTM3LDcgKzUzOCw3IEBACiAgICAgSW50IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0LCBwcmV2X2NvdW50ZXJfZGlmZiwgY3Vycl9jb3VudGVyX2RpZmYsIGJvdW5kOwogICAgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBmb3IgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogc29tZSBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyByZW1haW5lZCBoZXJlIHRvIGJlIGRvbmUgYmVjYXVzZSBwTVAgY2Fubm90IGJlIGluc2VydGVkIGludG8gdXBkYXRlUmF0ZUNvbnRyb2woKSovCkBAIC02OTMsNiArNjk0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UIGFuZCByYy0+UWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbnB1dCBhcmd1bWVudCAiaW5wdXQiIGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgYnkgY2FsbGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKyBRUCBjYWxjdWxhdGlvbiB3aXRoIGEgbmV3IHF1YWRyYXRpYyBtZXRob2QgKi8KQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgIGZsb2F0IGN1cnJfbWFkLCBwcmV2X21hZCwgY3Vycl9SRCwgcHJldl9SRCwgYXZlcmFnZV9tYWQsIGF2ZXJfUVA7CiAKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCBlN2QzMDVkLi44MDA4M2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKIAogICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIG1EZWNvZGVyQnVmID0gY2FsbG9jKDEsIG1lbVJlcXVpcmVtZW50cyk7CiAKICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgbUlzRmlyc3QgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCAzZGY0ZDRjLi5jNjU1NTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSw5ICsxLDYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0TVBFRzIuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDhkNWYzZTcuLjBmMmZmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIxMFBsdXMsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKIH07CiAKIFNvZnRWUFg6OlNvZnRWUFgoCkBAIC04NCw2ICs4NSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTY3LDcgKzE3MiwxMiBAQAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7Ci0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBQcml2SW5mbyAqcHJpdkluZm8gPSAoUHJpdkluZm8gKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHByaXZJbmZvLT5tVGltZVN0YW1wOworICAgICAgICBpZiAocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CkBAIC0yNzUsNyArMjg1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubVRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbkluZm8tPm1GcmFtZUNvbmZpZykgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvID0gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tSGRyMTBQbHVzSW5mby5jbGVhcigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKQEAgLTI4NSw3ICszMDEsNyBAQAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CiAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgJm1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XSwgMCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IFZQWF9DT0RFQ19PSykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBiNjJiNTI2Li4wYWE4ZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFCdWZmZXI7CisKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFgoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUsCkBAIC00MSw2ICs0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTYwLDcgKzYzLDExIEBACiAKICAgICB2b2lkICptQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCi0gICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICBzdHJ1Y3QgUHJpdkluZm8geworICAgICAgICBPTVhfVElDS1MgbVRpbWVTdGFtcDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c0luZm87CisgICAgfTsKKyAgICBQcml2SW5mbyBtUHJpdkluZm9ba051bUJ1ZmZlcnNdOwogICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IDJkZmJhMTMuLmQwY2IwNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTQwMSw4ICs0MDEsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC00NDIsNyArNDQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKaW5kZXggZGQ4NmQzNi4uMjYzZDEzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCkBAIC04NCw4ICs4NCw4IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbSk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICAvLyBPTVggY2FsbGJhY2sgd2hlbiBidWZmZXJzIGF2YWlsYWJsZQogICAgIC8vIE5vdGUgdGhhdCBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCBkNDBmNTI1Li40ZjYxYWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTQzMCw4ICs0MzAsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIDJuZCBhbmQgM3JkIGlucHV0IGJ1ZmZlciBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbgorICAgICAgICAgICAgICAgIC8vICBhbiBpbnQ2NF90IChzZWUgYmVsb3cpLCBzbyBtYWtlIHN1cmUgd2UgZ2V0IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gIHRoYXQgbXVjaC4gVGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gMTkgYnl0ZXMsCisgICAgICAgICAgICAgICAgLy8gIGJ1dCB0aGF0IGlzIGNoZWNrZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1IZWFkZXI7CiAgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOwogICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CkBAIC00NTIsNiArNDYxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKaW5kZXggYjk5YmNkOC4uZGE4Njc1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgY29uc3QgT01YX1UzMiBrU3VwcG9ydGVkUHJvZmlsZXNbXSA9IHsKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsIE9NWF9BVURJT19BQUNPYmplY3RIRSwgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywKLSAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsCisgICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFCiB9OwogCiBTb2Z0WEFBQzo6U29mdFhBQUMoY29uc3QgY2hhciogbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCkBAIC0xMTAsMTUgKzExMCwyMiBAQAogCiB7CiAgICAgaW5pdFBvcnRzKCk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgSUFfTk9fRVJST1IpOwogfQogCiBTb2Z0WEFBQzo6flNvZnRYQUFDKCkgewotICAgIGludCBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpZiAoMCAhPSBlcnJDb2RlKSB7Ci0gICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVycl9jb2RlKTsKICAgICB9CiAKKyAgICBlcnJfY29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOworICAgIH0KICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CiB9CkBAIC0xNjQsMzYgKzE3MSwxNiBAQAogICAgIGFkZFBvcnQoZGVmKTsKIH0KIAotc3RhdHVzX3QgU29mdFhBQUM6OmluaXREZWNvZGVyKCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7CiAgICAgaW50IHVpX2RyY192YWw7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGxvb3AgPSAwOwogCiAgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gbVhoZWFhY0NvZGVjSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBtTXBlZ0REcmNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNUEVHLUQgRFJDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGxvb3AgPSAxOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgJWRcbiIsIGxvb3ApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdKSBmcmVlKG1NZW1vcnlBcnJheVtsb29wXSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU1hbGxvY0NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgIH0KIAogICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CkBAIC0yNzQsNyArMjYxLDcgQEAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKIAogI2VuZGlmCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFhBQUM6OmludGVybmFsR2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CkBAIC01NDcsOSArNTM0LDYgQEAKICAgICAvKiBzYW1wbGUgY3VycmVudGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CiAgICAgICAgIG51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWEFBQyBhc3N1bWVzIDIgYnl0ZXMgcGVyIHNhbXBsZSEgbVBjbVdkU3ogJWQiLCBtUGNtV2RTeik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjksOCArNTUzLDggQEAKICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCiAgICAgICAgICAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLwotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTY4Miw4ICs2NjYsOCBAQAogICAgICAgICAgICAgLyogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUgICovCiAgICAgICAgICAgICAvKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICgwICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CkBAIC04NDUsNyArODI5LDcgQEAKICAgICB9CiB9CiAKLWludCBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CkBAIC04NzEsMTYgKzg1NSwxMyBAQAogICAgICAgICAgICAgIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogIgogICAgICAgICAgICAgIiVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAogICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7Ci0gICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7Ci0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRyYWluRGVjb2RlcigpIHsKLSAgICByZXR1cm4gMDsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogdm9pZCBTb2Z0WEFBQzo6b25SZXNldCgpIHsKQEAgLTkyMSw3ICs5MDIsNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjppbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKICAgICBMT09QSURYIGk7CiAKICAgICAvKiBFcnJvciBjb2RlICovCkBAIC05MzksMTEgKzkyMCwxMSBAQAogICAgIFVXT1JEMzIgdWlfcHJvY19tZW1fdGFic19zaXplOwogICAgIC8qIEFQSSBzaXplICovCiAgICAgVVdPUkQzMiBwdWlfYXBpX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOwogCiAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CiAgICAgbUlucHV0QnVmZmVyID0gMDsKICAgICBtT3V0cHV0QnVmZmVyID0gMDsKLSAgICBtTWFsbG9jQ291bnQgPSAwOwogCiAgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NTQsMjAgKzkzNSwxMyBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShOVUxMLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CiAKICAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC05NzksMjMgKzk1MywxNiBAQAogCiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwogCi0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBpZiAobU1wZWdERHJjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgZHJjIGFwaSBzdHJ1Y3R1cmUgRmFpbGVkIik7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbWVtc2V0KG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdLCAwLCBwdWlfYXBpX3NpemUpOworICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOwogCi0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1NcGVnRERyY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbWVtc2V0KG1NcGVnRERyY0hhbmRsZSwgMCwgcHVpX2FwaV9zaXplKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC0xMDIxLDIzICs5ODgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwKICAgICAgICAgICAgICAgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLwotICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudCAtIDFdKSk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAorICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOwogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwNjYsMTcgKzEwMjcsMTIgQEAKICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CiAKLSAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOwotICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgIG1NYWxsb2NDb3VudCsrOworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAogICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CkBAIC0xMDk1LDcgKzEwNTEsNyBAQAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CiAgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOwogCkBAIC0xMTU0LDE0ICsxMTEwLDc2IEBACiAKICAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmNvbmZpZ01QRUdERHJjKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGlfZWZmZWN0X3R5cGU7CiAgICAgaW50IGlfbG91ZF9ub3JtOwogICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKICAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKLSAgICBpbnQgbl9tZW1zOwogICAgIGludCBpOworICAgIGludCB1aV9wcm9jX21lbV90YWJzX3NpemUgPSAwOworICAgIHBWT0lEIHB2X2FsbG9jX3B0ciA9IE5VTEw7CiAKICNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQwogICAgIHsKQEAgLTEyMTIsODMgKzEyMzAsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSwgJmlfc2JyX21vZGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKIAorICAgICAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHB2X2FsbG9jX3B0ciwgMCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsIE5VTEwpOwogCiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgewotICAgICAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKLSAgICAgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKIAotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfYWxpZ25tZW50KTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLQotICAgICAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImluaXRNUEVHREREcmMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJfY29kZTsKICAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZTsKLSAgICAgICAgICAgIHVpX3NpemUgPSA4MTkyICogMjsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyY0luQnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjSW5CdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotCi0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjT3V0QnVmKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKLSAgICAgICAgfQogICAgICAgICAvKiBEUkMgYnVmZmVycwogICAgICAgICAgICAgYnVmWzBdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQgbG91ZG5lc3MgcmVsYXRlZAogICAgICAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLwpAQCAtMTQyMywxMCArMTQwMiwxMCBAQAogICAgIH0KICNlbmRpZgogCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwgaW50MzJfdCogb3V0Qnl0ZXMpIHsKICAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKQEAgLTE1MTYsMjQgKzE0OTUsMzMgQEAKICAgICAgICAgbWVtY3B5KG1PdXRwdXRCdWZmZXIsIG1EcmNPdXRCdWYsICpvdXRCeXRlcyk7CiAgICAgfQogI2VuZGlmCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CiAgICAgQUxPR0koImRlSW5pdFhBQUNEZWNvZGVyIik7CiAKICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCAwLCBOVUxMKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0lOUFVUX09WRVIiKTsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1hbGxvY0NvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtpXSkgZnJlZShtTWVtb3J5QXJyYXlbaV0pOworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CiAgICAgfQotICAgIG1NYWxsb2NDb3VudCA9IDA7Ci0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CiAgICAgcmV0dXJuIGVycl9jb2RlOwogfQogCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HSSgiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCiBJQV9FUlJPUkNPREUgU29mdFhBQUM6OmdldFhBQUNTdHJlYW1JbmZvKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOwogCkBAIC0xNTQ2LDExICsxNTM0LDE5IEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTLCAmbU51bUNoYW5uZWxzKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogUENNIHdvcmQgc2l6ZSAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLCAmbVBjbVdkU3opOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlOiAlZCwgRXhwZWN0ZWQgaXMgMiIsIG1QY21XZFN6KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KIAogICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKaW5kZXggNjE3NjA4Mi4uYTYyYTc5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSAiaW1wZF9hcGljbWRfc3RhbmRhcmRzLmgiCiAjaW5jbHVkZSAiaW1wZF9kcmNfY29uZmlnX3BhcmFtcy5oIgogCi0jZGVmaW5lIE1BWF9NRU1fQUxMT0NTIDEwMAotCiBleHRlcm4gIkMiIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWT0lEIHB2X3ZhbHVlKTsKIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCkBAIC04MCwxOCArNzgsMTkgQEAKICAgICBlbnVtIHsgTk9ORSwgQVdBSVRJTkdfRElTQUJMRUQsIEFXQUlUSU5HX0VOQUJMRUQgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOwogCiAgICAgdm9pZCBpbml0UG9ydHMoKTsKLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgaW50IGRyYWluRGVjb2RlcigpOwotICAgIGludCBpbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpbnQgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdNUEVHRERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcyk7CiAKLSAgICBpbnQgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKLSAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKLSAgICBpbnQgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpOwotCi0gICAgaW50IGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CiAgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CiAgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LCBpbnQzMl90IGRyY1JlZkxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24KQEAgLTEyMCw5ICsxMTksOCBAQAogICAgIGludDhfdCogbURyY091dEJ1ZjsKICAgICBpbnQzMl90IG1NcGVnRERSQ1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtRFJDRmxhZzsKLQotICAgIHZvaWQqIG1NZW1vcnlBcnJheVtNQVhfTUVNX0FMTE9DU107Ci0gICAgaW50MzJfdCBtTWFsbG9jQ291bnQ7CisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRYQUFDKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCA3MGY1MmMzLi5kMTM2ZDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIxLDEwICsyMSwxMyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCisjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfYXJnYi5oIgorI2luY2x1ZGUgImxpYnl1di9wbGFuYXJfZnVuY3Rpb25zLmgiCiAjaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTQ1LDEwICs0OCwyOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBib29sIGlzUkdCKE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworfQorCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0J0NzA5KCkgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDkpOworfQorCisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzSnBlZygpIHsKKyAgICByZXR1cm4gKChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUpCisgICAgICAgICAgICB8fCAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1KSkKKyAgICAgICAgICAgICYmIChtUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsKTsKK30KKwogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCiAgICAgICBtRHN0Rm9ybWF0KHRvKSwKKyAgICAgIG1TcmNDb2xvclNwYWNlKHswLCAwLCAwfSksCiAgICAgICBtQ2xpcChOVUxMKSB7CiB9CiAKQEAgLTcxLDI0ICs5Miw0NiBAQAogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisjZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OworI2VuZGlmCisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzRHN0UkdCKCkgY29uc3QgewotICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICByZXR1cm4gaXNSR0IobURzdEZvcm1hdCk7CiB9CiAKK3ZvaWQgQ29sb3JDb252ZXJ0ZXI6OnNldFNyY0NvbG9yU3BhY2UoCisgICAgICAgIHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpIHsKKyAgICBpZiAoaXNSR0IobVNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR1coIkNhbid0IHNldCBjb2xvciBzcGFjZSBvbiBSR0Igc291cmNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNyY0NvbG9yU3BhY2UubVN0YW5kYXJkID0gc3RhbmRhcmQ7CisgICAgbVNyY0NvbG9yU3BhY2UubVJhbmdlID0gcmFuZ2U7CisgICAgbVNyY0NvbG9yU3BhY2UubVRyYW5zZmVyID0gdHJhbnNmZXI7Cit9CisKKy8qCisgKiBJZiBzdHJpZGUgaXMgbm9uLXplcm8sIGNsaWVudCdzIHN0cmlkZSB3aWxsIGJlIHVzZWQuIEZvciBwbGFuYXIKKyAqIG9yIHNlbWktcGxhbmFyIFlVViBmb3JtYXRzLCBzdHJpZGUgbXVzdCBiZSBldmVuIG51bWJlcnMuCisgKiBJZiBzdHJpZGUgaXMgemVybywgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoIGFuZCBicHAKKyAqIG9mIHRoZSBmb3JtYXQsIGFzc3VtaW5nIG5vIHBhZGRpbmcgb24gdGhlIHJpZ2h0IGVkZ2UuCisgKi8KIENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OkJpdG1hcFBhcmFtcygKICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCkKQEAgLTEwMiw2ICsxNDUsOCBAQAogICAgICAgbUNyb3BCb3R0b20oY3JvcEJvdHRvbSkgewogICAgIHN3aXRjaChtQ29sb3JGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIG1CcHAgPSAyOwogICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CkBAIC0xMTMsMTMgKzE1OCw3IEBACiAgICAgICAgIG1TdHJpZGUgPSA0ICogbVdpZHRoOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgotICAgICAgICBtQnBwID0gMjsKLSAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgpAQCAtMTMzLDYgKzE3MiwxMCBAQAogICAgICAgICBtU3RyaWRlID0gbVdpZHRoOwogICAgICAgICBicmVhazsKICAgICB9CisgICAgLy8gdXNlIGNsaWVudCdzIHN0cmlkZSBpZiBpdCdzIHNwZWNpZmllZC4KKyAgICBpZiAoc3RyaWRlICE9IDApIHsKKyAgICAgICAgbVN0cmlkZSA9IHN0cmlkZTsKKyAgICB9CiB9CiAKIHNpemVfdCBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpjcm9wV2lkdGgoKSBjb25zdCB7CkBAIC0xNDUsMjEgKzE4OCwyMSBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydCgKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LAorICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wUmlnaHQsIHNpemVfdCBzcmNDcm9wQm90dG9tLAogICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwgc2l6ZV90IGRzdFN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pIHsKICAgICBCaXRtYXBQYXJhbXMgc3JjKAogICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KHNyY0JpdHMpLAotICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20sIG1TcmNGb3JtYXQpOwogCiAgICAgQml0bWFwUGFyYW1zIGRzdCgKICAgICAgICAgICAgIGRzdEJpdHMsCi0gICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LAorICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwgZHN0U3RyaWRlLAogICAgICAgICAgICAgZHN0Q3JvcExlZnQsIGRzdENyb3BUb3AsIGRzdENyb3BSaWdodCwgZHN0Q3JvcEJvdHRvbSwgbURzdEZvcm1hdCk7CiAKICAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKQEAgLTIwMSw3ICsyNDQsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoc3JjLCBkc3QpOworI2Vsc2UKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKHNyYywgZHN0KTsKKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTI3Niw2ICszMjMsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKyNkZWZpbmUgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCByZ2IpIGludCAoKmZ1bmMpKCAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgY29uc3QgdWludDgqLCBpbnQsICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCB1aW50OCosIGludCwgaW50LCBpbnQpICAgICAgIFwKKyAgICAgICAgPSBtU3JjQ29sb3JTcGFjZS5pc0J0NzA5KCkgPyBsaWJ5dXY6Okg0MjBUbyMjcmdiIFwKKyAgICAgICAgOiBtU3JjQ29sb3JTcGFjZS5pc0pwZWcoKSA/IGxpYnl1djo6SjQyMFRvIyNyZ2IgIFwKKyAgICAgICAgOiBsaWJ5dXY6Okk0MjBUbyMjcmdiCisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyVXNlTGliWVVWKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKQEAgLTI5MywxOSArMzQ3LDI4IEBACiAKICAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKLSAgICAgICAgbGlieXV2OjpJNDIwVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBSR0I1NjUpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FCR1IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBQkdSKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQVJHQik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0zMTQsNiArMzc3LDM2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cworICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworCisgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIGxpYnl1djo6TlYxMlRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgIGxpYnl1djo6TlYxMlRvQVJHQihzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICB9CisKKyAgIHJldHVybiBPSzsKK30KKwogc3RkOjpmdW5jdGlvbjx2b2lkICh2b2lkICosIHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsCiAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqKT4KIGdldFJlYWRGcm9tU3JjKE9NWF9DT0xPUl9GT1JNQVRUWVBFIHNyY0Zvcm1hdCkgewpAQCAtNzkzLDE1ICs4ODYsMTUgQEAKIAogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKKyAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKQorICAgICAgICAgICAgZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHApOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiBzcmMubUhlaWdodAotICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tSGVpZ2h0ICogc3JjLm1TdHJpZGUgKworICAgICAgICAoc3JjLm1Dcm9wVG9wIC8gMikgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC04NDMsMTMgKzkzNiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3JjX3kgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgc3JjX3kgKz0gc3JjLm1TdHJpZGU7CiAKICAgICAgICAgaWYgKHkgJiAxKSB7Ci0gICAgICAgICAgICBzcmNfdSArPSBzcmMubVdpZHRoOworICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1TdHJpZGU7CiAgICAgICAgIH0KIAotICAgICAgICBkc3RfcHRyICs9IGRzdC5tV2lkdGg7CisgICAgICAgIGRzdF9wdHIgPSAodWludDE2X3QqKSgodWludDhfdCopZHN0X3B0ciArIGRzdC5tU3RyaWRlKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggNjU3YTA1Yi4uMzU5ZGYzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtNDQsNiArNDQsNyBAQAogICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpLAogICAgICAgbVdpZHRoKDApLAogICAgICAgbUhlaWdodCgwKSwKKyAgICAgIG1TdHJpZGUoMCksCiAgICAgICBtQ3JvcExlZnQoMCksCiAgICAgICBtQ3JvcFRvcCgwKSwKICAgICAgIG1Dcm9wUmlnaHQoMCksCkBAIC02Nyw5ICs2OCwxMCBAQAogICAgIGludDMyX3QgY29sb3JGb3JtYXROZXc7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdE5ldykpOwogCi0gICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3OwotICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmd2lkdGhOZXcpKTsKKyAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXcsIHN0cmlkZU5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGhOZXcpKTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJmhlaWdodE5ldykpOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlTmV3KSk7CiAKICAgICBpbnQzMl90IGNyb3BMZWZ0TmV3LCBjcm9wVG9wTmV3LCBjcm9wUmlnaHROZXcsIGNyb3BCb3R0b21OZXc7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRSZWN0KApAQCAtMTA2LDYgKzEwOCw3IEBACiAgICAgbUNvbG9yRm9ybWF0ID0gc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KGNvbG9yRm9ybWF0TmV3KTsKICAgICBtV2lkdGggPSB3aWR0aE5ldzsKICAgICBtSGVpZ2h0ID0gaGVpZ2h0TmV3OworICAgIG1TdHJpZGUgPSBzdHJpZGVOZXc7CiAgICAgbUNyb3BMZWZ0ID0gY3JvcExlZnROZXc7CiAgICAgbUNyb3BUb3AgPSBjcm9wVG9wTmV3OwogICAgIG1Dcm9wUmlnaHQgPSBjcm9wUmlnaHROZXc7CkBAIC0yNzYsMjAgKzI3OSwxNSBAQAogICAgIGlmIChtQ29udmVydGVyKSB7CiAgICAgICAgIG1Db252ZXJ0ZXItPmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlLAogICAgICAgICAgICAgICAgIG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tLAogICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LCAwLAogICAgICAgICAgICAgICAgIDAsIDAsIG1Dcm9wV2lkdGggLSAxLCBtQ3JvcEhlaWdodCAtIDEpOwogICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz1tQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0obUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKS8yOwotICAgICAgICBzcmNfdiArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1TdHJpZGUgKiBtSGVpZ2h0ICsgbUNyb3BUb3AgKiBtU3RyaWRlIC8gNDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSAoY29uc3QgdWludDhfdCAqKXNyY191ICsgbVN0cmlkZSAqIG1IZWlnaHQgLyA0OwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CiAgICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKQEAgLTMwNSw3ICszMDMsNyBAQAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIG1lbWNweShkc3RfeSwgc3JjX3ksIG1Dcm9wV2lkdGgpOwogCi0gICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOwogICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CiAgICAgICAgIH0KIApAQCAtMzEzLDE5ICszMTEsMTUgQEAKICAgICAgICAgICAgIG1lbWNweShkc3RfdSwgc3JjX3UsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKICAgICAgICAgICAgIG1lbWNweShkc3Rfdiwgc3JjX3YsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKIAotICAgICAgICAgICAgc3JjX3UgKz0gbVdpZHRoIC8gMjsKLSAgICAgICAgICAgIHNyY192ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdSArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IG1TdHJpZGUgLyAyOwogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfeSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGE7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwotCi0gICAgICAgIHNyY195ICs9IG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7Ci0gICAgICAgIHNyY192ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQgKiAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1TdHJpZGUgKiBtSGVpZ2h0ICsgbUNyb3BUb3AgKiBtU3RyaWRlIC8gNDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSAoY29uc3QgdWludDhfdCAqKXNyY191ICsgbVN0cmlkZSAqIG1IZWlnaHQgLyA0OwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CiAgICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKQEAgLTM0MCwyMSArMzM0LDIxIEBACiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG1Dcm9wV2lkdGg7ICsreCkgewotICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKHNyY195W3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfeSlbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgKG1Dcm9wSGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgKG1Dcm9wV2lkdGggKyAxKSAvIDI7ICsreCkgewotICAgICAgICAgICAgICAgIGRzdF91W3hdID0gKHVpbnQ4X3QpKHNyY191W3hdID4+IDIpOwotICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKHNyY192W3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF91W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdSlbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY192KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3UgKz0gbVdpZHRoIC8gMjsKLSAgICAgICAgICAgIHNyY192ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdSArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IG1TdHJpZGUgLyAyOwogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbAppbmRleCAwYjU1NGEyLi40N2E5NzE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKQEAgLTE3LDUxICsxNyw2MSBAQAogPEluY2x1ZGVkPgogICAgIDxEZWNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcDMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXBlZyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC0zMjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI3MzUwLDgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtYWxhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC00ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjMyMDAwLTUwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5vcHVzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2MDAwLTUxMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9yYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KQEAgLTY5LDI5ICs3OSw0MCBAQAogICAgIDwvRGVjb2RlcnM+CiAgICAgPEVuY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CiAgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC04IiAgZGVmYXVsdD0iNSIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDUSIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTIwMDAsMTYwMDAsMjQwMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjUwMC01MTIwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9FbmNvZGVycz4KIDwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMGRjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKaW5kZXggYWRiNDViMy4uZTIwMTc0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0xNyw2ICsxNyw3IEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC0yNiw2ICsyNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CiAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KQEAgLTM0LDYgKzM2LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTQ0LDYgKzQ3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC01NCw2ICs1OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNjMsNiArNjgsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTcxLDE2ICs3NywyNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdjEuZGVjb2RlciIgdHlwZT0idmlkZW8vYXYwMSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI5Nng5NiIgbWF4PSIxOTIweDEwODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIyNCIgbWF4PSIyMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS02MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9EZWNvZGVycz4KIAogICAgIDxFbmNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtOTAsNyArMTA3LDE3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMzIweDEyOCIgbWF4PSI1MTJ4NTEyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS00MDk2IiAvPiA8IS0tIG1heCA1MTJ4NTEyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMjI4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC05OSw2ICsxMjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTEwOSw2ICsxMzcsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNmJmYWIxNi4uMzA3YzliMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yNywxNyArMjcsMjEgQEAKICAgICB9LAogCiAgICAgc3RhdGljOiB7Ci0gICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkOiB7Ci0gICAgICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYm1lZGlhX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAppbmRleCBkZmRjNDFjLi5jZWYwYmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPiAvLyBmbG9hdF9mcm9tX2kzMgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMTcsMTA0ICsxMTgsNDMgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuICBTZWUgc2ltaWxhciBjb2RlIGF0IEZMQUNFeHRyYWN0b3IuY3BwCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIG5DaGFubmVscykgeworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRPRE86IDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjM4LDggKzE3OCw3IEBACiAgICAgICBtU3RyZWFtSW5mb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1Xcml0ZVJlcXVlc3RlZChmYWxzZSksCiAgICAgICBtV3JpdGVDb21wbGV0ZWQoZmFsc2UpLAotICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSwKLSAgICAgIG1Db3B5KG51bGxwdHIpIHsKKyAgICAgIG1FcnJvclN0YXR1cygoRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzKSAtMSkgewogICAgIEFMT0dWKCJjdG9yOiIpOwogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwogICAgIG1lbXNldCgmbVdyaXRlSGVhZGVyLCAwLCBzaXplb2YobVdyaXRlSGVhZGVyKSk7CkBAIC0zNzksNiArMzE4LDcgQEAKICAgICAgICAgY2FzZSA4OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDMyOiAvLyBnZW5lcmFsbHkgcmFyZSwgYnV0IGlzIHN1cHBvcnRlZCBpbiB0aGUgZnJhbWV3b3JrCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzg3LDMxICszMjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgICB9LAotICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgIH0sCi0gICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgICB9LAotICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgIH0sCi0gICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgICB9LAotICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgIH0sCi0gICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOiB0YWJsZSkgewotICAgICAgICBpZiAoZW50cnkubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIG1Db3B5ID0gZW50cnkubUNvcHk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBtZXRhZGF0YSBibG9ja3MuCiAgICAgbUJ1ZmZlclBvcyA9IDA7CiAgICAgbUJ1ZmZlckRhdGFTaXplID0gMDsKQEAgLTQyMCw3ICszMzUsNyBAQAogfQogCiBzdGF0dXNfdCBGTEFDRGVjb2Rlcjo6ZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbikgeworICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0KSB7CiAgICAgQUxPR1YoImRlY29kZU9uZUZyYW1lOiBpbnB1dCBzaXplKCV6dSkiLCBpbkJ1ZmZlckxlbik7CiAKICAgICBpZiAoIW1TdHJlYW1JbmZvVmFsaWQpIHsKQEAgLTQ2OSwyMSArMzg0LDMzIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoKTsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbHMgKiBzYW1wbGVTaXplOworICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIGlmIChidWZmZXJTaXplID4gKm91dEJ1ZmZlckxlbikgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG91dHB1dCBidWZmZXIgaG9sZHMgb25seSBwYXJ0aWFsIGZyYW1lICV6dTolenUiLAogICAgICAgICAgICAgICAgICpvdXRCdWZmZXJMZW4sIGJ1ZmZlclNpemUpOwotICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gKGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgYmxvY2tzaXplID0gKm91dEJ1ZmZlckxlbiAvIGZyYW1lU2l6ZTsKKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGZyYW1lU2l6ZTsKICAgICB9CiAKLSAgICBpZiAobUNvcHkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZGVjb2RlT25lRnJhbWU6IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkOiBjaGFubmVscyglZCksIEJpdHNQZXJTYW1wbGUoJWQpIiwKLSAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3V0cHV0IGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShvdXRCdWZmZXIsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPSBnZXRCaXRzUGVyU2FtcGxlKCk7CisgICAgaWYgKG91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0KICAgICAqb3V0QnVmZmVyTGVuID0gYnVmZmVyU2l6ZTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAppbmRleCBhZjQxOWEyLi42OTRmY2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWV0YWRhdGEoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbik7CiAgICAgc3RhdHVzX3QgZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgICAgIGludDE2X3QgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4pOworICAgICAgICAgICAgdm9pZCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbiwgYm9vbCBvdXRwdXRGbG9hdCA9IGZhbHNlKTsKICAgICB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB+RkxBQ0RlY29kZXIoKTsKIApAQCAtODksOCArODksNiBAQAogICAgIC8vIG1vc3QgcmVjZW50IGVycm9yIHJlcG9ydGVkIGJ5IGxpYkZMQUMgZGVjb2RlcgogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKLSAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICpzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0KICAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICAvLyBGTEFDIHN0cmVhbSBkZWNvZGVyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzdmNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKLSAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgewotfQotCi1BU3RhdGU6On5BU3RhdGUoKSB7Ci19Ci0KLXNwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVBhcmVudFN0YXRlOwotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7Ci0KLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgewotICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCi0gICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKLQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgaWYgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCi0gICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKLSAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7Ci0gICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7Ci0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBBLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOwotICAgIGN1ciA9IHN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQi5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCi0gICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7Ci0gICAgICAgIEEucG9wKCk7Ci0gICAgICAgIEIucG9wKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gc3RhdGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA1ZTc2YzY3Li5hMjc2NzIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE3MCw3ICsxNzAsOSBAQAogCiAgICAgaW50NjRfdCB3aGVuVXM7CiAgICAgaWYgKGRlbGF5VXMgPiAwKSB7Ci0gICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCkgKyBkZWxheVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gR2V0Tm93VXMoKTsKKyAgICAgICAgd2hlblVzID0gKGRlbGF5VXMgPiBJTlQ2NF9NQVggLSBub3dVcyA/IElOVDY0X01BWCA6IG5vd1VzICsgZGVsYXlVcyk7CisKICAgICB9IGVsc2UgewogICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpOwogICAgIH0KQEAgLTIwOCw2ICsyMTAsOSBAQAogCiAgICAgICAgIGlmICh3aGVuVXMgPiBub3dVcykgewogICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IElOVDY0X01BWCAvIDEwMDApIHsKKyAgICAgICAgICAgICAgICBkZWxheVVzID0gSU5UNjRfTUFYIC8gMTAwMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCBkZWxheVVzICogMTAwMGxsKTsKIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmRjMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk5ldHdvcmtTZXNzaW9uIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQU5ldHdvcmtTZXNzaW9uLmgiCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOwotc3RhdGljIGNvbnN0IGludDMyX3Qga01heFVEUFJldHJpZXMgPSAyMDA7Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBleHBsaWNpdCBOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5OZXR3b3JrVGhyZWFkKCk7Ci0KLXByaXZhdGU6Ci0gICAgQU5ldHdvcmtTZXNzaW9uICptU2Vzc2lvbjsKLQotICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOZXR3b3JrVGhyZWFkKTsKLX07Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgZW51bSBNb2RlIHsKLSAgICAgICAgTU9ERV9SVFNQLAotICAgICAgICBNT0RFX0RBVEFHUkFNLAotICAgICAgICBNT0RFX1dFQlNPQ0tFVCwKLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgTElTVEVOSU5HX1JUU1AsCi0gICAgICAgIExJU1RFTklOR19UQ1BfREdSQU1TLAotICAgICAgICBEQVRBR1JBTSwKLSAgICB9OwotCi0gICAgU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICAgICAgaW50IHMsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICBpbnQzMl90IHNlc3Npb25JRCgpIGNvbnN0OwotICAgIGludCBzb2NrZXQoKSBjb25zdDsKLSAgICBzcDxBTWVzc2FnZT4gZ2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc1JUU1BTZXJ2ZXIoKSBjb25zdDsKLSAgICBib29sIGlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdDsKLQotICAgIGJvb2wgd2FudHNUb1JlYWQoKTsKLSAgICBib29sIHdhbnRzVG9Xcml0ZSgpOwotCi0gICAgc3RhdHVzX3QgcmVhZE1vcmUoKTsKLSAgICBzdGF0dXNfdCB3cml0ZU1vcmUoKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgdm9pZCBzZXRNb2RlKE1vZGUgbW9kZSk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflNlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEID0gMSwKLSAgICB9OwotICAgIHN0cnVjdCBGcmFnbWVudCB7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgaW50NjRfdCBtVGltZVVzOwotICAgICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIH07Ci0KLSAgICBpbnQzMl90IG1TZXNzaW9uSUQ7Ci0gICAgU3RhdGUgbVN0YXRlOwotICAgIE1vZGUgbU1vZGU7Ci0gICAgaW50IG1Tb2NrZXQ7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgYm9vbCBtU2F3UmVjZWl2ZUZhaWx1cmUsIG1TYXdTZW5kRmFpbHVyZTsKLSAgICBpbnQzMl90IG1VRFBSZXRyaWVzOwotCi0gICAgTGlzdDxGcmFnbWVudD4gbU91dEZyYWdtZW50czsKLQotICAgIEFTdHJpbmcgbUluQnVmZmVyOwotCi0gICAgaW50NjRfdCBtTGFzdFN0YWxsUmVwb3J0VXM7Ci0KLSAgICB2b2lkIG5vdGlmeUVycm9yKGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpOwotICAgIHZvaWQgbm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pOwotCi0gICAgdm9pZCBkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmZnJhZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uKTsKLX07Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6Ok5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKQotICAgIDogbVNlc3Npb24oc2Vzc2lvbikgewotfQotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6On5OZXR3b3JrVGhyZWFkKCkgewotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBtU2Vzc2lvbi0+dGhyZWFkTG9vcCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6U2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICBpbnQgcywKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU2Vzc2lvbklEKHNlc3Npb25JRCksCi0gICAgICBtU3RhdGUoc3RhdGUpLAotICAgICAgbU1vZGUoTU9ERV9EQVRBR1JBTSksCi0gICAgICBtU29ja2V0KHMpLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1TYXdTZW5kRmFpbHVyZShmYWxzZSksCi0gICAgICBtVURQUmV0cmllcyhrTWF4VURQUmV0cmllcyksCi0gICAgICBtTGFzdFN0YWxsUmVwb3J0VXMoLTFsbCkgewotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbEFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCBsb2NhbEFkZHJMZW4gPSBzaXplb2YobG9jYWxBZGRyKTsKLQotICAgICAgICBpbnQgcmVzID0gZ2V0c29ja25hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsb2NhbEFkZHIsICZsb2NhbEFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICByZXMgPSBnZXRwZWVybmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKGxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIGxvY2FsQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgcmVtb3RlQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0Q2xpZW50Q29ubmVjdGVkKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoInNlcnZlci1pcCIsIGxvY2FsQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2VydmVyLXBvcnQiLCBudG9ocyhsb2NhbEFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoImNsaWVudC1pcCIsIHJlbW90ZUFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImNsaWVudC1wb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6flNlc3Npb24oKSB7Ci0gICAgQUxPR1YoIlNlc3Npb24gJWQgZ29uZSIsIG1TZXNzaW9uSUQpOwotCi0gICAgY2xvc2UobVNvY2tldCk7Ci0gICAgbVNvY2tldCA9IC0xOwotfQotCi1pbnQzMl90IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2Vzc2lvbklEKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbklEOwotfQotCi1pbnQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzb2NrZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb2NrZXQ7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXRNb2RlKE1vZGUgbW9kZSkgewotICAgIG1Nb2RlID0gbW9kZTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQgfHwgbU1vZGUgIT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfV0VCU09DS0VUOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxBTWVzc2FnZT4gQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtTm90aWZ5OwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNSVFNQU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1JUU1A7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1RDUF9ER1JBTVM7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvUmVhZCgpIHsKLSAgICByZXR1cm4gIW1TYXdSZWNlaXZlRmFpbHVyZSAmJiBtU3RhdGUgIT0gQ09OTkVDVElORzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9Xcml0ZSgpIHsKLSAgICByZXR1cm4gIW1TYXdTZW5kRmFpbHVyZQotICAgICAgICAmJiAobVN0YXRlID09IENPTk5FQ1RJTkcKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gQ09OTkVDVEVEICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IERBVEFHUkFNICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpyZWFkTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKLQotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSByZWN2ZnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIGJ1Zi0+ZGF0YSgpLCBidWYtPmNhcGFjaXR5KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWYtPnNldFJhbmdlKDAsIG4pOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgaXAgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnJvbUFkZHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUuJXUuJXUuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwID4+IDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgJiAweGZmKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZyb21Qb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBidWYpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0spOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdmZyb20gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY3Zmcm9tIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjaGFyIHRtcFs1MTJdOwotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSByZWN2KG1Tb2NrZXQsIHRtcCwgc2l6ZW9mKHRtcCksIDApOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG1JbkJ1ZmZlci5hcHBlbmQodG1wLCBuKTsKLQotI2lmIDAKLSAgICAgICAgQUxPR0koImluOiIpOwotICAgICAgICBoZXhkdW1wKHRtcCwgbik7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICAvLyBUQ1Agc3RyZWFtIGNhcnJ5aW5nIDE2LWJpdCBsZW5ndGgtcHJlZml4ZWQgZGF0YWdyYW1zLgotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBwYWNrZXRTaXplID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IHBhY2tldFNpemUgKyAyKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBhY2tldFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDIsIHBhY2tldFNpemUpOwotCi0gICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIHBhY2tldC0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgcGFja2V0U2l6ZSArIDIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX1JUU1ApIHsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPiAwICYmIG1JbkJ1ZmZlci5jX3N0cigpWzBdID09ICckJykgewotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZW5ndGggPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSArIDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0ICsgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEJpbmFyeURhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwiLCBtSW5CdWZmZXIuY19zdHIoKVsxXSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhID0gbmV3IEFCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YS0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDQsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBkYXRhLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCA0ICsgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0KLSAgICAgICAgICAgICAgICBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5jX3N0cigpLCBtSW5CdWZmZXIuc2l6ZSgpLCBlcnIgIT0gT0ssICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAobXNnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGEpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImRhdGEiLCBtc2cpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSNpZiAxCi0gICAgICAgICAgICAvLyBYWFggVGhlIChvbGQpIGRvbmdsZSBzZW5kcyB0aGUgd3JvbmcgY29udGVudCBsZW5ndGggaGVhZGVyIG9uIGEKLSAgICAgICAgICAgIC8vIFNFVF9QQVJBTUVURVIgcmVxdWVzdCB0aGF0IHNpZ25hbHMgYSAid2ZkX2lkcl9yZXF1ZXN0Ii4KLSAgICAgICAgICAgIC8vICgxNyBpbnN0ZWFkIG9mIDE5KS4KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQgPSBtc2ctPmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICYmICFtZW1jbXAoY29udGVudCwgIndmZF9pZHJfcmVxdWVzdFxyXG4iLCAxNykKLSAgICAgICAgICAgICAgICAgICAgJiYgbGVuZ3RoID49IDE5Ci0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aF0gPT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGggKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX1dFQlNPQ0tFVCk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCk7Ci0gICAgICAgIC8vIGhleGR1bXAoZGF0YSwgbUluQnVmZmVyLnNpemUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IHBheWxvYWRMZW4gPSBkYXRhWzFdICYgMHg3ZjsKLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID09IDEyNikgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTE2X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuID09IDEyNykgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA4ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTY0X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gMDsKLSAgICAgICAgICAgIGlmIChkYXRhWzFdICYgMHg4MCkgewotICAgICAgICAgICAgICAgIC8vIE1BU0s9PTEKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWFzayA9IFUzMl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPiBtSW5CdWZmZXIuc2l6ZSgpIHx8IG9mZnNldCA+IG1JbkJ1ZmZlci5zaXplKCkgLSBwYXlsb2FkTGVuKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIGZ1bGwgbWVzc2FnZS4KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGF5bG9hZExlbik7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksICZkYXRhW29mZnNldF0sIHBheWxvYWRMZW4pOwotCi0gICAgICAgICAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXlsb2FkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhKClbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0V2ViU29ja2V0TWVzc2FnZSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJoZWFkZXJCeXRlIiwgZGF0YVswXSk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIG9mZnNldCArIHBheWxvYWRMZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2IGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7Ci0jaWYgMAotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRGVsYXlNcyA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heERlbGF5TXMgPSAzMDA7Ci0KLSAgICBjb25zdCBjaGFyICprUGF0dGVybiA9ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIjsKLSAgICBzaXplX3Qga1BhdHRlcm5TaXplID0gc3RybGVuKGtQYXR0ZXJuKTsKLQotICAgIGludCBuID0gKGtQYXR0ZXJuU2l6ZSAqIChkZWxheU1zIC0ga01pbkRlbGF5TXMpKQotICAgICAgICAgICAgICAgIC8gKGtNYXhEZWxheU1zIC0ga01pbkRlbGF5TXMpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIG4gPSAwOwotICAgIH0gZWxzZSBpZiAoKHNpemVfdCluID4ga1BhdHRlcm5TaXplKSB7Ci0gICAgICAgIG4gPSBrUGF0dGVyblNpemU7Ci0gICAgfQotCi0gICAgQUxPR0koIlslbGxkXTogKCU0bGxkIG1zKSAlc1xuIiwKLSAgICAgICAgICBmcmFnLm1UaW1lVXMgLyAxMDAwLAotICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAga1BhdHRlcm4gKyBrUGF0dGVyblNpemUgLSBuKTsKLSNlbmRpZgotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndyaXRlTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGFncmFtID0gZnJhZy5tQnVmZmVyOwotCi0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBkYXRhZ3JhbS0+ZGF0YSgpLCBkYXRhZ3JhbS0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgaWYgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBkYXRhZ3JhbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU2VuZCBkYXRhZ3JhbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIHNvY2tsZW5fdCBvcHRpb25MZW4gPSBzaXplb2YoZXJyKTsKLSAgICAgICAgQ0hFQ0tfRVEoZ2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJm9wdGlvbkxlbiksIDApOwotICAgICAgICBDSEVDS19FUShvcHRpb25MZW4sIChzb2NrbGVuX3Qpc2l6ZW9mKGVycikpOwotCi0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgbm90aWZ5RXJyb3Ioa1doYXRFcnJvciwgLWVyciwgIkNvbm5lY3Rpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotCi0gICAgICAgICAgICByZXR1cm4gLWVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgbm90aWZ5KGtXaGF0Q29ubmVjdGVkKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05ORUNURUQpOwotICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgc3NpemVfdCBuID0gLTE7Ci0gICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGZyYWcubUJ1ZmZlci0+ZGF0YSgpLCBmcmFnLm1CdWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYWcubUJ1ZmZlci0+c2V0UmFuZ2UoCi0gICAgICAgICAgICAgICAgZnJhZy5tQnVmZmVyLT5vZmZzZXQoKSArIG4sIGZyYWcubUJ1ZmZlci0+c2l6ZSgpIC0gbik7Ci0KLSAgICAgICAgaWYgKGZyYWcubUJ1ZmZlci0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0jaWYgMAotICAgIGludCBudW1CeXRlc1F1ZXVlZDsKLSAgICBpbnQgcmVzID0gaW9jdGwobVNvY2tldCwgU0lPQ09VVFEsICZudW1CeXRlc1F1ZXVlZCk7Ci0gICAgaWYgKHJlcyA9PSAwICYmIG51bUJ5dGVzUXVldWVkID4gNTAgKiAxMDI0KSB7Ci0gICAgICAgIGlmIChudW1CeXRlc1F1ZXVlZCA+IDQwOTYwMCkgewotICAgICAgICAgICAgQUxPR1coIiEhISBudW1CeXRlc1F1ZXVlZCA9ICVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgaWYgKG1MYXN0U3RhbGxSZXBvcnRVcyA8IDBsbAotICAgICAgICAgICAgICAgIHx8IG5vd1VzID4gbUxhc3RTdGFsbFJlcG9ydFVzICsgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXROZXR3b3JrU3RhbGwpOwotICAgICAgICAgICAgbXNnLT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotCi0gICAgICAgICAgICBtTGFzdFN0YWxsUmVwb3J0VXMgPSBub3dVczsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBDSEVDSyhtU3RhdGUgPT0gQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBEQVRBR1JBTSk7Ci0KLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKWRhdGEpOwotICAgIH0KLQotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfTEUoc2l6ZSwgNjU1MzUpOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgKyAyKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSBzaXplID4+IDg7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIDIsIGRhdGEsIHNpemUpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX1dFQlNPQ0tFVCkgewotICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBrVXNlTWFzayA9IGZhbHNlOyAgLy8gQ2hyb21pdW0gZG9lc24ndCBsaWtlIGl0LgotCi0gICAgICAgIHNpemVfdCBudW1IZWFkZXJCeXRlcyA9IDIgKyAoa1VzZU1hc2sgPyA0IDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG51bUhlYWRlckJ5dGVzICsgc2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHg4MTsgIC8vIEZJTj09MSB8IG9wY29kZT0xICh0ZXh0KQotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IGtVc2VNYXNrID8gMHg4MCA6IDB4MDA7Ci0KLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI3OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNF0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNV0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNl0gPSAoc2l6ZSA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbN10gPSAoc2l6ZSA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs5XSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa1VzZU1hc2spIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSByYW5kKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gNF0gPSAobWFzayA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAzXSA9IChtYXNrID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDJdID0gKG1hc2sgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAxXSA9IG1hc2sgJiAweGZmOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplX3Qpc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgoY29uc3QgdWludDhfdCAqKWRhdGEpW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgbnVtSGVhZGVyQnl0ZXMsIGRhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgRnJhZ21lbnQgZnJhZzsKLQotICAgIGZyYWcubUZsYWdzID0gMDsKLSAgICBpZiAodGltZVZhbGlkKSB7Ci0gICAgICAgIGZyYWcubUZsYWdzID0gRlJBR01FTlRfRkxBR19USU1FX1ZBTElEOwotICAgICAgICBmcmFnLm1UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotCi0gICAgZnJhZy5tQnVmZmVyID0gYnVmZmVyOwotCi0gICAgbU91dEZyYWdtZW50cy5wdXNoX2JhY2soZnJhZyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnlFcnJvcigKLSAgICAgICAgYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEVycm9yKTsKLSAgICBtc2ctPnNldEludDMyKCJzZW5kIiwgc2VuZCk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6QU5ldHdvcmtTZXNzaW9uKCkKLSAgICA6IG1OZXh0U2Vzc2lvbklEKDEpIHsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotfQotCi1BTmV0d29ya1Nlc3Npb246On5BTmV0d29ya1Nlc3Npb24oKSB7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0YXJ0KCkgewotICAgIGlmIChtVGhyZWFkICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludCByZXMgPSBwaXBlKG1QaXBlRmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIG1UaHJlYWQgPSBuZXcgTmV0d29ya1RocmVhZCh0aGlzKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1UaHJlYWQtPnJ1bigiQU5ldHdvcmtTZXNzaW9uIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgICAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICAgICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RvcCgpIHsKLSAgICBpZiAobVRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOwotICAgIGludGVycnVwdCgpOwotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotCi0gICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgMCAvKiBwb3J0ICovLAotICAgICAgICAgICAgaG9zdCwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlVURQU2Vzc2lvbihsb2NhbFBvcnQsIE5VTEwsIDAsIG5vdGlmeSwgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpIHsKLSAgICBpbnQgZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKTsKLSAgICBpZiAoZmxhZ3MgPCAwKSB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbG9jYWxBZGRyLAotICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpzZXNzaW9uSUQgPSAwOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGludCBzLCByZXM7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKLQotICAgIHMgPSBzb2NrZXQoCi0gICAgICAgICAgICBBRl9JTkVULAotICAgICAgICAgICAgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTSwKLSAgICAgICAgICAgIDApOwotCi0gICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgY29uc3QgaW50IHllcyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pIHsKLSAgICAgICAgaW50IHNpemUgPSAyNTYgKiAxMDI0OwotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbnQgZmxhZyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmZmxhZywgc2l6ZW9mKGZsYWcpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB0b3MgPSAyMjQ7ICAvLyBWT0lDRQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLSAgICB9IGVsc2UgaWYgKGxvY2FsQWRkciAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIgPSAqbG9jYWxBZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbl9hZGRyX3QgeCA9IG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQUxPR0koImNvbm5lY3Rpbmcgc29ja2V0ICVkIHRvICVkLiVkLiVkLiVkOiVkIiwKLSAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgKHggPj4gMjQpLAotICAgICAgICAgICAgICAoeCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAoeCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgIHggJiAweGZmLAotICAgICAgICAgICAgICBudG9ocyhhZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgcmVzID0gY29ubmVjdChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgQ0hFQ0tfTFQocmVzLCAwKTsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlBST0dSRVNTKSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gYmluZChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBsaXN0ZW4ocywgNCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgU2Vzc2lvbjo6U3RhdGUgc3RhdGU7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQQ2xpZW50OgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfVENQX0RHUkFNUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQU2VydmVyOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfUlRTUDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpEQVRBR1JBTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgIHMsCi0gICAgICAgICAgICBub3RpZnkpOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50KSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9SVFNQKTsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgKnNlc3Npb25JRCA9IHNlc3Npb24tPnNlc3Npb25JRCgpOwotCi0gICAgZ290byBiYWlsOwotCi1iYWlsMjoKLSAgICBjbG9zZShzKTsKLSAgICBzID0gLTE7Ci0KLWJhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICBpbnQgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLAotICAgICAgICBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5zZW5kUmVxdWVzdChkYXRhLCBzaXplLCB0aW1lVmFsaWQsIHRpbWVVcyk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBzZXNzaW9uLT5zd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OmludGVycnVwdCgpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBkdW1teSA9IDA7Ci0KLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gd3JpdGUobVBpcGVGZFsxXSwgJmR1bW15LCAxKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgQUxPR1coIkVycm9yIHdyaXRpbmcgdG8gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjp0aHJlYWRMb29wKCkgewotICAgIGZkX3NldCBycywgd3M7Ci0gICAgRkRfWkVSTygmcnMpOwotICAgIEZEX1pFUk8oJndzKTsKLQotICAgIEZEX1NFVChtUGlwZUZkWzBdLCAmcnMpOwotICAgIGludCBtYXhGZCA9IG1QaXBlRmRbMF07Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1JlYWQoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmcnMpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZ3cyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHNlbGVjdChtYXhGZCArIDEsICZycywgJndzLCBOVUxMLCBOVUxMIC8qIHR2ICovKTsKLQotICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HRSgic2VsZWN0IGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoRkRfSVNTRVQobVBpcGVGZFswXSwgJnJzKSkgewotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHJlYWQobVBpcGVGZFswXSwgJmMsIDEpOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiRXJyb3IgcmVhZGluZyBmcm9tIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAtLXJlczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgTGlzdDxzcDxTZXNzaW9uPiA+IHNlc3Npb25zVG9BZGQ7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1TZXNzaW9ucy5zaXplKCk7IHJlcyA+IDAgJiYgaSA+IDA7KSB7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykgfHwgRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIC0tcmVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKSB8fCBzZXNzaW9uLT5pc1RDUERhdGFncmFtU2VydmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRTb2NrZXQgPSBhY2NlcHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbWFrZSBjbGllbnQgc29ja2V0IG5vbiBibG9ja2luZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJWQuJWQuJWQuJWQ6JWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc29ja2V0ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBjbGllbnRTZXNzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uOjpDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTZXNzaW9uLT5zZXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNlc3Npb246Ok1PREVfUlRTUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1RvQWRkLnB1c2hfYmFjayhjbGllbnRTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJhY2NlcHQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnJlYWRNb3JlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZWFkTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+d3JpdGVNb3JlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGVNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghc2Vzc2lvbnNUb0FkZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gKnNlc3Npb25zVG9BZGQuYmVnaW4oKTsKLSAgICAgICAgICAgIHNlc3Npb25zVG9BZGQuZXJhc2Uoc2Vzc2lvbnNUb0FkZC5iZWdpbigpKTsKLQotICAgICAgICAgICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJhZGRlZCBjbGllbnRTZXNzaW9uICVkIiwgc2Vzc2lvbi0+c2Vzc2lvbklEKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDI5Y2YxZWQuLjUzM2NkNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTQsOCArNCw4IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTU2LDE4ICs1NywyMiBAQAogICAgICAgICAiQUJ1ZmZlci5jcHAiLAogICAgICAgICAiQURlYnVnLmNwcCIsCiAgICAgICAgICJBSGFuZGxlci5jcHAiLAotICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQUxvb3Blci5jcHAiLAogICAgICAgICAiQUxvb3BlclJvc3Rlci5jcHAiLAogICAgICAgICAiQU1lc3NhZ2UuY3BwIiwKLSAgICAgICAgIkFOZXR3b3JrU2Vzc2lvbi5jcHAiLAogICAgICAgICAiQVN0cmluZy5jcHAiLAogICAgICAgICAiQVN0cmluZ1V0aWxzLmNwcCIsCisgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkJ5dGVVdGlscy5jcHAiLAogICAgICAgICAiQ29sb3JVdGlscy5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCiAgICAgICAgICJNZWRpYUtleXMuY3BwIiwKLSAgICAgICAgIlBhcnNlZE1lc3NhZ2UuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhLmNwcCIsCisgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKKyAgICAgICAgIk9wdXNIZWFkZXIuY3BwIiwKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgICAgICAiYmFzZTY0LmNwcCIsCiAgICAgICAgICJoZXhkdW1wLmNwcCIsCkBAIC04MywzICs4OCwyMCBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1ETk9fSU1FTU9SWSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24mIHByZXNlbnRhdGlvbnMsCisgICAgICAgIHN0ZDo6b3N0cmVhbSogc2VyaWFsaXplZE91dHB1dCkgeworICAgIHVpbnQzMl90IG51bVByZXNlbnRhdGlvbnMgPSBwcmVzZW50YXRpb25zLnNpemUoKTsKKyAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBhcCA6IHByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFwLm1WZXJzaW9uID09IFBSRVNFTlRBVElPTl9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVZlcnNpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1WZXJzaW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByZXNlbnRhdGlvbklkKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1Qcm9ncmFtSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzID0gYXAubUxhYmVscy5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJm51bUxhYmVscykpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxhYmVsIDogYXAubUxhYmVscykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsS2V5U2l6ZSA9IGxhYmVsLmZpcnN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbEtleVNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbEtleVNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5maXJzdC5jX3N0cigpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplID0gbGFiZWwuc2Vjb25kLnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbFZhbFNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5zZWNvbmQuY19zdHIoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgbGFuZ1NpemUgPSBhcC5tTGFuZ3VhZ2Uuc2l6ZSgpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYW5nU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFuZ1NpemUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGFwLm1MYW5ndWFnZS5jX3N0cigpLCBsYW5nU2l6ZSk7CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhzdGQ6OmlzdHJlYW0qIHNlcmlhbGl6ZWRJbnB1dCwKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9uczsKKyAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bVByZXNlbnRhdGlvbnMpLCBzaXplb2YobnVtUHJlc2VudGF0aW9ucykpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1QcmVzZW50YXRpb25zOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2ZXJzaW9uKSwgc2l6ZW9mKHZlcnNpb24pKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZCgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByb2dyYW1JZCksIHNpemVvZihhcC5tUHJvZ3JhbUlkKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUxhYmVsczsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtTGFiZWxzKSwgc2l6ZW9mKG51bUxhYmVscykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG51bUxhYmVsczsgKytqKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxLZXlTaXplKSwgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsS2V5KGxhYmVsS2V5U2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsS2V5LmRhdGEoKSwgbGFiZWxLZXlTaXplKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsVmFsU2l6ZTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhYmVsVmFsU2l6ZSksIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYWJlbFZhbChsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYWJlbFZhbC5kYXRhKCksIGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxLZXkuZGF0YSgpKSwgbGFiZWxLZXlTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhYmVsVmFsLmRhdGEoKSksIGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbGFuZ3VhZ2VTaXplOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYW5ndWFnZVNpemUpLCBzaXplb2YobGFuZ3VhZ2VTaXplKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYW5ndWFnZShsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhbmd1YWdlLmRhdGEoKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhbmd1YWdlLmRhdGEoKSksIGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBwcmVzZW50YXRpb24gaW5mbyB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAppbmRleCBjNGVhYTI3Li4wNzBlMzI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM0Miw2ICszNDMsMTQgQEAKICAgICBhc3BlY3RzLm1SYW5nZSA9IGZ1bGxSYW5nZSA/IENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsIDogQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQ7CiB9CiAKK3ZvaWQgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCBpbnRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqb3V0dHJhbnNmZXIpIHsKKyAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocHJpbWFyaWVzLCBpbnRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisgICAgY29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoYXNwZWN0cywgcmFuZ2UsIHN0YW5kYXJkLCBvdXR0cmFuc2Zlcik7Cit9CisKIC8vIHN0YXRpYwogQ29sb3JBc3BlY3RzIENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCkgewogICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwpAQCAtNjg0LDYgKzY5MywxMyBAQAogICAgICAgICAgICAgdHJhbnNmZXIsIGFzU3RyaW5nKChDb2xvclRyYW5zZmVyKXRyYW5zZmVyKSk7CiB9CiAKKworLy8gc3RhdGljCit2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KAorICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm8sIGZvcm1hdC0+bUZvcm1hdCk7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdCgKICAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlYWMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogc3RhdGljICovCitzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IE1lZGlhQnVmZmVyOjptVXNlU2hhcmVkTWVtb3J5KDApOworCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShkYXRhKSwKKyAgICAgIG1TaXplKHNpemUpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7Cit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEodHJ1ZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCisgICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7CisjZW5kaWYKKyAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7CisgICAgICAgIHNpemVfdCBuZXdTaXplID0gMDsKKyAgICAgICAgaWYgKCFfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNpemUsIHNpemVvZihTaGFyZWRDb250cm9sKSwgJm5ld1NpemUpKSB7CisgICAgICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIobmV3U2l6ZSwgIk1lZGlhQnVmZmVyIik7CisgICAgICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShuZXdTaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnksIHRyeWluZyByZWd1bGFyIGFsbG9jYXRpb24hIik7CisgICAgICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltTWVtb3J5LT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCk7CisgICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShidWZmZXItPmRhdGEoKSksCisgICAgICBtU2l6ZShidWZmZXItPnNpemUoKSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAorICAgICAgbUJ1ZmZlcihidWZmZXIpLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHByZXZDb3VudCA9IG1SZWZDb3VudC5mZXRjaF9zdWIoMSk7CisgICAgaWYgKHByZXZDb3VudCA9PSAxKSB7CisgICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtT2JzZXJ2ZXItPnNpZ25hbEJ1ZmZlclJldHVybmVkKHRoaXMpOworICAgIH0KKyAgICBDSEVDSyhwcmV2Q291bnQgPiAwKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6Y2xhaW0oKSB7CisgICAgQ0hFQ0sobU9ic2VydmVyICE9IE5VTEwpOworICAgIENIRUNLX0VRKG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLCAxKTsKKworICAgIG1SZWZDb3VudC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKKyAgICAodm9pZCkgbVJlZkNvdW50LmZldGNoX2FkZCgxKTsKK30KKwordm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaXplOworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX29mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJhbmdlT2Zmc2V0OworfQorCitzaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX2xlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJhbmdlTGVuZ3RoOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgeworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkgeworICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKKyAgICB9CisgICAgQ0hFQ0sob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKTsKKworICAgIG1SYW5nZU9mZnNldCA9IG9mZnNldDsKKyAgICBtUmFuZ2VMZW5ndGggPSBsZW5ndGg7Cit9CisKK01ldGFEYXRhQmFzZSYgTWVkaWFCdWZmZXI6Om1ldGFfZGF0YSgpIHsKKyAgICByZXR1cm4gKm1NZXRhRGF0YTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6cmVzZXQoKSB7CisgICAgbU1ldGFEYXRhLT5jbGVhcigpOworICAgIHNldF9yYW5nZSgwLCBtU2l6ZSk7Cit9CisKK01lZGlhQnVmZmVyOjp+TWVkaWFCdWZmZXIoKSB7CisgICAgQ0hFQ0sobU9ic2VydmVyID09IE5VTEwpOworCisgICAgaWYgKG1Pd25zRGF0YSAmJiBtRGF0YSAhPSBOVUxMICYmIG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgbURhdGEgPSBOVUxMOworICAgIH0KKworICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOworICAgfQorICAgZGVsZXRlIG1NZXRhRGF0YTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKKyAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKKyAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjlhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KKworLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCisvLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KK3N0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKKyAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA6OkludGVybmFsRGF0YSB7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisgICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KKyAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1CdWZmZXJzOworfTsKKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtV3JhcHBlcihudWxscHRyKSwgbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Cit9CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbVdyYXBwZXIobnVsbHB0ciksIG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICBpbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6aW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIHsKKyAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OworCisgICAgaWYgKG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMCAmJiBidWZmZXJzID4gbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKKyAgICAgICAgQUxPR1coIlByZWFsbG9jYXRlZCBidWZmZXJzICV6dSA+IGdyb3d0aExpbWl0ICV6dSwgaW5jcmVhc2luZyBncm93dGhMaW1pdCIsCisgICAgICAgICAgICAgICAgYnVmZmVycywgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpOworICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7CisgICAgfQorCisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgeworICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7CisgICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgorICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKKyAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOworICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7CisgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7CisgICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7CisgICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICAodm9pZClrU2hhcmVkTWVtb3J5VGhyZXNob2xkOworI2VuZGlmCisKKyAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOworICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKKyAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7CisgICAgfQorfQorCitNZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7CisgICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7CisKKyAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7CisKKyAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKKyAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKKyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKKyAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgorICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgZGVsZXRlIG1JbnRlcm5hbDsKKyAgICBkZWxldGUgbVdyYXBwZXI7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKworICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KKyAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAKKyAgICAgICAgICAgICYmIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpID49IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0CisgICAgICAgICAgICAmJiBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworfQorCitib29sIE1lZGlhQnVmZmVyR3JvdXA6Omhhc19idWZmZXJzKCkgeworICAgIGlmIChtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgorICAgIH0KKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBzaXplX3QgYmlnZ2VzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IGJpZ2dlc3QpIHsKKyAgICAgICAgICAgICAgICBiaWdnZXN0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgorICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplID09IDAgPyBiaWdnZXN0IDoKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSA8IFNJWkVfTUFYIC8gMyAqIDIgLyogTkI6IG9yZGVyaW5nICovID8KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSAqIDMgLyAyIDogcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihhbGxvY2F0ZVNpemUpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBzaXplICV6dSIsIGFsbG9jYXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gSW52YWxpZCBhbGxvYywgcHJlZmVyIG5vdCB0byBjYWxsIHJlbGVhc2UuCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IHZzIGF2YWlsYWJsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUsICgqZnJlZSktPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICpmcmVlID0gYnVmZmVyOyAvLyBpbi1wbGFjZSByZXBsYWNlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IiwgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYnVmZmVyLT5hZGRfcmVmKCk7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGlmIChub25CbG9ja2luZykgeworICAgICAgICAgICAgKm91dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZSwgYmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCisgICAgICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi53YWl0KG1JbnRlcm5hbC0+bUxvY2spOworICAgIH0KKyAgICAvLyBOZXZlciBnZXRzIGhlcmUuCit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlckdyb3VwOjpidWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggZTVhODVlOS4uOWQxZWMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVjEgPSAidmlkZW8vYXYwMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKQEAgLTUwLDEyICs1MSwxNCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00gPSAiYXVkaW8vZ3NtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMyA9ICJhdWRpby9hYzMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDID0gImF1ZGlvL2FsYWMiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZWRlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPcHVzIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworaW50IFdyaXRlT3B1c0hlYWRlcnMoY29uc3QgT3B1c0hlYWRlciAmaGVhZGVyLCBpbnQgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0U2l6ZSwgdWludDY0X3QgY29kZWNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZWtQcmVSb2xsKSB7CisgICAgaWYgKG91dHB1dFNpemUgPCBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHVuaWZpZWQgT1BVUyBDU0QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBoZWFkZXJMZW4gPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBpbnB1dFNhbXBsZVJhdGUsIG91dHB1dCwKKyAgICAgICAgb3V0cHV0U2l6ZSk7CisgICAgaWYgKGhlYWRlckxlbiA8IDApIHsKKyAgICAgICAgQUxPR0QoIldyaXRlT3B1c0hlYWRlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaGVhZGVyTGVuID49IChvdXRwdXRTaXplIC0gMiAqIEFPUFVTX1RPVEFMX0NTRF9TSVpFKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdWludDY0X3QgbGVuZ3RoID0gQU9QVVNfTEVOR1RIOworCisgICAgLyoKKyAgICAgIEZvbGxvd2luZyBpcyB0aGUgQ1NEIHN5bnRheCBmb3Igc2lnbmFsbGluZyBjb2RlYyBkZWxheSBhbmQKKyAgICAgIHNlZWsgcHJlLXJvbGwgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgYWZ0ZXIgT3B1c0hlYWRlcgorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IFNhbXBsZXMgKDggYnl0ZXMpCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNETFkgLSBTaWduYWxzIENvZGVjIERlbGF5CisgICAgICBBT1BVU1BSTCAtIFNpZ25hbHMgc2VlayBwcmUgcm9sbAorCisgICAgICBMZW5ndGggc2hvdWxkIGJlIDguCisgICAgKi8KKworICAgIC8vIEFkZCBjb2RlYyBkZWxheQorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmY29kZWNEZWxheSwgQU9QVVNfQ1NEX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19DU0RfU0laRTsKKworICAgIC8vIEFkZCBza2lwIHByZSByb2xsCisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmc2Vla1ByZVJvbGwsIEFPUFVTX0NTRF9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfQ1NEX1NJWkU7CisKKyAgICByZXR1cm4gaGVhZGVyTGVuOworfQorCit2b2lkIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKSB7CisgICAgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICpjb2RlY0RlbGF5U2l6ZSA9IDA7CisgICAgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKyAgICAqc2Vla1ByZVJvbGxTaXplID0gMDsKKyAgICAqb3B1c0hlYWRCdWYgPSAodm9pZCAqKWRhdGE7CisgICAgKm9wdXNIZWFkU2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICBpZiAoZGF0YV9zaXplID49IEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUpIHsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGRhdGFfc2l6ZSAtIEFPUFVTX1RPVEFMX0NTRF9TSVpFKSB7CisgICAgICAgICAgICB1aW50OF90ICpjc2RCdWYgPSAodWludDhfdCAqKWRhdGEgKyBpOworICAgICAgICAgICAgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRTaXplID0gc3RkOjptaW4oKm9wdXNIZWFkU2l6ZSwgaSk7CisgICAgICAgICAgICAgICAgKmNvZGVjRGVsYXlCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpjb2RlY0RlbGF5U2l6ZSA9IEFPUFVTX0NTRF9TSVpFOworICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfVE9UQUxfQ1NEX1NJWkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgKm9wdXNIZWFkU2l6ZSA9IHN0ZDo6bWluKCpvcHVzSGVhZFNpemUsIGkpOworICAgICAgICAgICAgICAgICpzZWVrUHJlUm9sbEJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsU2l6ZSA9IEFPUFVTX0NTRF9TSVpFOworICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfVE9UQUxfQ1NEX1NJWkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCkgewotICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9IG5ldyBQYXJzZWRNZXNzYWdlOwotICAgIHNzaXplX3QgcmVzID0gbXNnLT5wYXJzZShkYXRhLCBzaXplLCBub01vcmVEYXRhKTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICpsZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbGVuZ3RoID0gcmVzOwotICAgIHJldHVybiBtc2c7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6OlBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6On5QYXJzZWRNZXNzYWdlKCkgewotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGtleSA9IG5hbWU7Ci0gICAga2V5LnRvbG93ZXIoKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtRGljdC5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBtRGljdC52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotCi0gICAgaWYgKCFmaW5kU3RyaW5nKG5hbWUsICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIgKlBhcnNlZE1lc3NhZ2U6OmdldENvbnRlbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db250ZW50LmNfc3RyKCk7Ci19Ci0KLXNzaXplX3QgUGFyc2VkTWVzc2FnZTo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSkgewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNzaXplX3QgbGFzdERpY3RJbmRleCA9IC0xOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgYm9vbCBoZWFkZXJzQ29tcGxldGUgPSBmYWxzZTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgbGluZUVuZE9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgd2hpbGUgKGxpbmVFbmRPZmZzZXQgKyAxIDwgc2l6ZQotICAgICAgICAgICAgICAgICYmIChkYXRhW2xpbmVFbmRPZmZzZXRdICE9ICdccicKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbbGluZUVuZE9mZnNldCArIDFdICE9ICdcbicpKSB7Ci0gICAgICAgICAgICArK2xpbmVFbmRPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCArIDEgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lKCZkYXRhW29mZnNldF0sIGxpbmVFbmRPZmZzZXQgLSBvZmZzZXQpOwotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIHJlcXVlc3Qvc3RhdHVzIGxpbmUuCi0KLSAgICAgICAgICAgIG1EaWN0LmFkZChBU3RyaW5nKCJfIiksIGxpbmUpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgPT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBBbiBlbXB0eSBsaW5lIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keS4KLSAgICAgICAgICAgIGhlYWRlcnNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmUuY19zdHIoKVswXSA9PSAnICcgfHwgbGluZS5jX3N0cigpWzBdID09ICdcdCcpIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGZvbGRlZCBoZWFkZXIgdmFsdWVzLgotCi0gICAgICAgICAgICBpZiAobGFzdERpY3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgbWFsZm9ybWVkIHNpbmNlIHRoZSBmaXJzdCBoZWFkZXIgbGluZQotICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjb250aW51ZSBhbnl0aGluZy4uLgotCi0gICAgICAgICAgICAgICAgQVN0cmluZyAmdmFsdWUgPSBtRGljdC5lZGl0VmFsdWVBdChsYXN0RGljdEluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7Ci0gICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIGtleShsaW5lLCAwLCBjb2xvblBvcyk7Ci0gICAgICAgICAgICBrZXkudHJpbSgpOwotICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKLQotICAgICAgICAgICAgbGluZS5lcmFzZSgwLCBjb2xvblBvcyArIDEpOwotCi0gICAgICAgICAgICBsYXN0RGljdEluZGV4ID0gbURpY3QuYWRkKGtleSwgbGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICB9Ci0KLSAgICBpZiAoIWhlYWRlcnNDb21wbGV0ZSAmJiAoIW5vTW9yZURhdGEgfHwgb2Zmc2V0ID09IDApKSB7Ci0gICAgICAgIC8vIFdlIGVpdGhlciBzYXcgdGhlIGVtcHR5IGxpbmUgc2VwYXJhdGluZyBoZWFkZXJzIGZyb20gYm9keQotICAgICAgICAvLyBvciB3ZSBzYXcgYXQgbGVhc3QgdGhlIHN0YXR1cyBsaW5lIGFuZCBrbm93IHRoYXQgbm8gbW9yZSBkYXRhCi0gICAgICAgIC8vIGlzIGdvaW5nIHRvIGZvbGxvdy4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbURpY3QuZWRpdFZhbHVlQXQoaSkudHJpbSgpOwotICAgIH0KLQotICAgIGludDMyX3QgY29udGVudExlbmd0aDsKLSAgICBpZiAoIWZpbmRJbnQzMigiY29udGVudC1sZW5ndGgiLCAmY29udGVudExlbmd0aCkgfHwgY29udGVudExlbmd0aCA8IDApIHsKLSAgICAgICAgY29udGVudExlbmd0aCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsTGVuZ3RoID0gb2Zmc2V0ICsgY29udGVudExlbmd0aDsKLQotICAgIGlmIChzaXplIDwgdG90YWxMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1Db250ZW50LnNldFRvKCZkYXRhW29mZnNldF0sIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgc2l6ZV90IHByZXZPZmZzZXQgPSAwOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBsaW5lLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBzcGFjZVBvcyA9IGxpbmUuZmluZCgiICIsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgewotICAgICAgICAgICAgc3BhY2VQb3MgPSBsaW5lLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG9mZnNldCA9IHNwYWNlUG9zICsgMTsKLSAgICB9Ci0KLSAgICBmaWVsZC0+c2V0VG8obGluZSwgcHJldk9mZnNldCwgb2Zmc2V0IC0gcHJldk9mZnNldCAtIDEpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdGF0dXNDb2RlU3RyaW5nOwotICAgIGlmICghZ2V0UmVxdWVzdEZpZWxkKDEsICZzdGF0dXNDb2RlU3RyaW5nKSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnN0YXR1c0NvZGUgPSBzdHJ0b2woc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCkKLSAgICAgICAgICAgIHx8ICgqc3RhdHVzQ29kZSkgPCAxMDAgfHwgKCpzdGF0dXNDb2RlKSA+IDk5OSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQVN0cmluZyBQYXJzZWRNZXNzYWdlOjpkZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQVN0cmluZyAma2V5ID0gbURpY3Qua2V5QXQoaSk7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlID0gbURpY3QudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoa2V5ID09IEFTdHJpbmcoIl8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBsaW5lLmFwcGVuZChrZXkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQodmFsdWUpOwotICAgICAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICBsaW5lLmFwcGVuZChtQ29udGVudCk7Ci0KLSAgICByZXR1cm4gbGluZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgewotICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7Ci0KLSAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7Ci0gICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSkgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0gICAgaWYgKCFHZXRBdHRyaWJ1dGUocywga2V5LCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKaW5kZXggOGYzMjU4Mi4uODM0Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApAQCAtMjgsMTQgKzI4LDMxIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIHNpemVfdCBidWZTaXplID0gbiAvIDQgKiAzOworICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGJ1ZlNpemUpOworCisgICAgaWYgKGRlY29kZUJhc2U2NChidWYtPmRhdGEoKSwgJmJ1ZlNpemUsIHMuY19zdHIoKSkpIHsKKyAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBidWZTaXplKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpIHsKKyAgICBzaXplX3QgbiA9IHN0cmxlbihzKTsKKworICAgIGlmICgobiAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHNpemVfdCBwYWRkaW5nID0gMDsKLSAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgaWYgKG4gPj0gMSAmJiBzW24gLSAxXSA9PSAnPScpIHsKICAgICAgICAgcGFkZGluZyA9IDE7CiAKLSAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgeworICAgICAgICBpZiAobiA+PSAyICYmIHNbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CiAKLSAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgc1tuIC0gM10gPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ1LDE1ICs2MiwxMyBAQAogICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KICAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOwogCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuKTsKLSAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKLSAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG91dCA9PSBOVUxMIHx8ICppbk91dEJ1ZlNpemUgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgaiA9IDA7CiAgICAgdWludDMyX3QgYWNjdW0gPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgY2hhciBjID0gc1tpXTsKICAgICAgICAgdW5zaWduZWQgdmFsdWU7CiAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewogICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnOwpAQCAtNjYsMTAgKzgxLDEwIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgfHwgYyA9PSAnXycpIHsKICAgICAgICAgICAgIHZhbHVlID0gNjM7CiAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGkgPCBuIC0gcGFkZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFsdWUgPSAwOwpAQCAtODYsNyArMTAxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBidWZmZXI7CisgICAgKmluT3V0QnVmU2l6ZSA9IGo7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBjaGFyIGVuY29kZTZCaXQodW5zaWduZWQgeCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZWJhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNkZWZpbmUgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYSBudW1iZXIgb2YgbGl2ZSBzb2NrZXRzIChkYXRhZ3JhbSBhbmQgc3RyZWFtLWJhc2VkKQotLy8gb24gYSBzaW5nbGUgdGhyZWFkLiBDbGllbnRzIGFyZSBub3RpZmllZCBhYm91dCBhY3Rpdml0eSB0aHJvdWdoIEFNZXNzYWdlcy4KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQU5ldHdvcmtTZXNzaW9uKCk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvLyBwYXNzaXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIC8vIGFjdGl2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplID0gLTEsCi0gICAgICAgICAgICBib29sIHRpbWVWYWxpZCA9IGZhbHNlLCBpbnQ2NF90IHRpbWVVcyA9IC0xbGwpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gTm90aWZpY2F0aW9uUmVhc29uIHsKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0Q2xpZW50Q29ubmVjdGVkLAotICAgICAgICBrV2hhdERhdGEsCi0gICAgICAgIGtXaGF0RGF0YWdyYW0sCi0gICAgICAgIGtXaGF0QmluYXJ5RGF0YSwKLSAgICAgICAga1doYXRXZWJTb2NrZXRNZXNzYWdlLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU5ldHdvcmtTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IE5ldHdvcmtUaHJlYWQ7Ci0gICAgc3RydWN0IFNlc3Npb247Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBzcDxUaHJlYWQ+IG1UaHJlYWQ7Ci0KLSAgICBpbnQzMl90IG1OZXh0U2Vzc2lvbklEOwotCi0gICAgaW50IG1QaXBlRmRbMl07Ci0KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKLQotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgfTsKLSAgICBzdGF0dXNfdCBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgdm9pZCB0aHJlYWRMb29wKCk7Ci0gICAgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5ldHdvcmtTZXNzaW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQV9ORVRXT1JLX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisjZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIEF1ZGlvUHJlc2VudGF0aW9uVmVyc2lvbiB7CisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEID0gMCwKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl8xLAorfTsKKworZW51bSBNYXN0ZXJpbmdJbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgdWludDMyX3QgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQ7CisgICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQgPSAtMTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1MYWJlbHM7CisgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgIE1hc3RlcmluZ0luZGljYXRpb24gbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKKyAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uVjEgOiBwdWJsaWMgQXVkaW9QcmVzZW50YXRpb24geworICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEoKSB7CisgICAgICAgIG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb247CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBkNmM3NjhkLi5jZDBhZjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29sb3JVdGlscyB7CkBAIC0xMzUsNiArMTM3LDkgQEAKICAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCiAgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCB0cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAogICAgICAgICAgICAgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGlzb3RyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpOwogCiAgICAgLy8gdW5wYWNrIGEgdWludDMyX3QgdG8gYSBmdWxsIENvbG9yQXNwZWN0cyBzdHJ1Y3QKICAgICBzdGF0aWMgQ29sb3JBc3BlY3RzIHVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCk7CkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCisgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggNTg3NThiYy4uZTY4ODUyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwpAQCAtNTIsNiArNTMsOCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmZjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIE9QVVNfSEVBREVSX0hfCisjZGVmaW5lIE9QVVNfSEVBREVSX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQ29uc3RhbnRzIHVzZWQgZm9yIGRlbGltaXRpbmcgT3B1cyBDU0QgKi8KKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiAiQU9QVVNETFkiCisjZGVmaW5lIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSICJBT1BVU1BSTCIKKyNkZWZpbmUgQU9QVVNfQ1NEX1NJWkUgOAorI2RlZmluZSBBT1BVU19MRU5HVEggOAorI2RlZmluZSBBT1BVU19NQVJLRVJfU0laRSA4CisjZGVmaW5lIEFPUFVTX0xFTkdUSF9TSVpFIDgKKyNkZWZpbmUgQU9QVVNfVE9UQUxfQ1NEX1NJWkUgXAorICAgICgoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIChBT1BVU19DU0RfU0laRSkpCisjZGVmaW5lIEFPUFVTX0NTRDBfTUlOU0laRSAxOQorI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFIFwKKyAgICAoKEFPUFVTX0NTRDBfTUlOU0laRSkgKyAyICogKEFPUFVTX1RPVEFMX0NTRF9TSVpFKSkKKworLyogQ1NEMCBhdCBtYXggY2FuIGJlIDIyIGJ5dGVzICsgbWF4IG51bWJlciBvZiBjaGFubmVscyAoMjU1KSAqLworI2RlZmluZSBBT1BVU19DU0QwX01BWFNJWkUgMjc3CisjZGVmaW5lIEFPUFVTX1VOSUZJRURfQ1NEX01BWFNJWkUgXAorICAgICgoQU9QVVNfQ1NEMF9NQVhTSVpFKSArIDIgKiAoQU9QVVNfVE9UQUxfQ1NEX1NJWkUpKQorCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBjaGFubmVsX21hcHBpbmc7CisgICAgaW50IG51bV9zdHJlYW1zOworICAgIGludCBudW1fY291cGxlZDsKKyAgICBpbnQxNl90IGdhaW5fZGI7CisgICAgaW50IHNraXBfc2FtcGxlczsKKyAgICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpOworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpOwordm9pZCBHZXRPcHVzSGVhZGVyQnVmZmVycyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb3B1c0hlYWRCdWYsIHNpemVfdCAqb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqY29kZWNEZWxheUJ1Ziwgc2l6ZV90ICpjb2RlY0RlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlZWtQcmVSb2xsQnVmLCBzaXplX3QgKnNlZWtQcmVSb2xsU2l6ZSk7CitpbnQgV3JpdGVPcHVzSGVhZGVycyhjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRTaXplLCB1aW50NjRfdCBjb2RlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2Vla1ByZVJvbGwpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPUFVTX0hFQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQzYTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5jYXBzdWxhdGVzIGFuICJIVFRQL1JUU1Agc3R5bGUiIHJlc3BvbnNlLCBpLmUuIGEgc3RhdHVzIGxpbmUsCi0vLyBrZXkvdmFsdWUgcGFpcnMgbWFraW5nIHVwIHRoZSBoZWFkZXJzIGFuZCBhbiBvcHRpb25hbCBib2R5L2NvbnRlbnQuCi1zdHJ1Y3QgUGFyc2VkTWVzc2FnZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCk7Ci0KLSAgICBib29sIGZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKLQotICAgIGNvbnN0IGNoYXIgKmdldENvbnRlbnQoKSBjb25zdDsKLQotICAgIGJvb2wgZ2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0OwotICAgIGJvb2wgZ2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdDsKLQotICAgIEFTdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKLQotICAgIHN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKTsKLQotICAgIHN0YXRpYyBib29sIEdldEludDMyQXR0cmlidXRlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSk7Ci0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcnNlZE1lc3NhZ2UoKTsKLQotcHJpdmF0ZToKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBBU3RyaW5nPiBtRGljdDsKLSAgICBBU3RyaW5nIG1Db250ZW50OwotCi0gICAgUGFyc2VkTWVzc2FnZSgpOwotCi0gICAgc3NpemVfdCBwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlZE1lc3NhZ2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKaW5kZXggYWJjOTVlMC4uNjBmYjlmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKQEAgLTI2LDYgKzI2LDkgQEAKIHN0cnVjdCBBU3RyaW5nOwogCiBzcDxBQnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3QgQVN0cmluZyAmcyk7CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpOworCiB2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKIAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTdjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJNZWRpYUhUVFAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyTWVkaWFIVFRQOjpDbGVhck1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKKyAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAorICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAorICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCisgICAgICBtQ2FjaGVkU2l6ZSgwbGwpIHsKK30KKworQ2xlYXJNZWRpYUhUVFA6On5DbGVhck1lZGlhSFRUUCgpIHsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7CisgICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworICAgIH0KKworICAgIG1MYXN0VVJJID0gdXJpOworICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAorICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KKyAgICB1cmkgPSBOVUxMOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKKworICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7CisKKyAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkNsZWFyTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgeworICAgIG1OYW1lID0gU3RyaW5nOCgiQ2xlYXJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IENsZWFyTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgeworICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KKyAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKKworICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCisgICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgorCisgICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7CisgICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7CisgICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgICpzaXplID0gbUNhY2hlZFNpemU7CisKKyAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOworfQorCit1aW50MzJfdCBDbGVhck1lZGlhSFRUUDo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOworfQorCisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIHJldHVybiBtaW1lVHlwZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA3YzkyNDdlLi4wZmJhM2RjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0zMCwxMCArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAotICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAotICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCi0gICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgIDogQ2xlYXJNZWRpYUhUVFAoY29ubiksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CiAKQEAgLTQxLDExNyArMzgsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9Ci0KLSAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOwotICAgIH0KLQotICAgIG1MYXN0VVJJID0gdXJpOwotICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAotICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KLSAgICB1cmkgPSBOVUxMOwotCi0gICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKLQotICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7Ci0KLSAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7Ci0KLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgewotICAgIG1OYW1lID0gU3RyaW5nOCgiTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXNzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKLSAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KLSAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKLQotICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQotICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KLQotICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgewotICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOwotICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOwotCi0gICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKLX0KLQotdWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOwotfQotCiAvLyBEUk0uLi4KIAogc3A8RGVjcnlwdEhhbmRsZT4gTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7CkBAIC0xNzYsMzMgKzYyLDYgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLVN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCB1cmk7Ci0gICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVUeXBlOwotfQotCiB2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgewogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDkwNTNkNjIuLmMwZWUxNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMjksMTggKzI5LDE4IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCmluZGV4IDcyNjA0ZTMuLjU5MjY1ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTM4LDcgKzM4LDcgQEAKIEhUVFBEb3dubG9hZGVyOjpIVFRQRG93bmxvYWRlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgotICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgQ2xlYXJNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCiAgICAgbUV4dHJhSGVhZGVycyhoZWFkZXJzKSwKICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSkgewogfQpAQCAtOTEsNyArOTEsNyBAQAogCiAgICAgaWYgKHJlY29ubmVjdCkgewogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgewotICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IENsZWFyRmlsZVNvdXJjZSh1cmwgKyA3KTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKICAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggMmVjZmE0My4uNWU3ZjkwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMTIzNCw3ICsxMjM0LDcgQEAKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBpbnQ2NF90IHRpbWVVcywgYm9vbCBuZXdVcmkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmkuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAKICAgICAgICAgICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdXJpRGVidWdTdHJpbmcobVN0cmVhbXNbaWR4XS5tVXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKICAgICAgICAgQ0hFQ0soaWR4ID49IDApOwogICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB1cmlEZWJ1Z1N0cmluZyhtU3RyZWFtc1tpZHhdLm1VcmkpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BwaW5nIG5ld1VyaSA9ICVzIiwgbmV3VXJpLmNfc3RyKCkpOwogICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShuZXdVcmkpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgbmV3VXJpOiAlcyIsIG5ld1VyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCB1cmlEZWJ1Z1N0cmluZyhuZXdVcmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDk3NWUyYjUuLmIyMzYxYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtNzA2LDYgKzcwNiwxMiBAQAogICAgICAgICArK2xpbmVObzsKICAgICB9CiAKKyAgICAvLyBwbGF5bGlzdCBoYXMgbm8gaXRlbSwgd291bGQgY2F1c2UgZXhjZXB0aW9uCisgICAgaWYgKG1JdGVtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgicGxheWxpc3QgaGFzIG5vIGl0ZW0iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKICAgICAvLyBlcnJvciBjaGVja2luZyBvZiBhbGwgZmllbGRzIHRoYXQncyByZXF1aXJlZCB0byBhcHBlYXIgb25jZQogICAgIC8vIChjdXJyZW50bHkgb25seSBjaGVja2luZyAidGFyZ2V0LWR1cmF0aW9uIiksIGFuZAogICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIHBsYXlsaXN0IHByb3BlcnRpZXMgKGVnLiBtVGFyZ2V0RHVyYXRpb25VcykKQEAgLTExOTksOCArMTIwNSw3IEBACiAgICAgICAgICAgICBpZiAodmFsLnNpemUoKSA8IDIKICAgICAgICAgICAgICAgICAgICAgfHwgdmFsLmNfc3RyKClbMF0gIT0gJyInCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpW3ZhbC5zaXplKCkgLSAxXSAhPSAnIicpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLCBnb3QgJyVzJyBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIGZvciBVUkkuIik7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTM5MSw2ICsxMzk2LDcgQEAKICAgICAgICAgY2FzZSAnUURNQyc6CiAgICAgICAgIGNhc2UgJ3VsYXcnOgogICAgICAgICBjYXNlICd2ZHZhJzoKKyAgICAgICAgY2FzZSAnYWMtNCc6CiAgICAgICAgICAgICByZXR1cm4gIXN0cmNtcCgiYXVkaW8iLCB0eXBlKTsKIAogICAgICAgICBjYXNlICdhdmMxJzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDU2MmM2MjUuLmQxNTM1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtMzY1LDEwICszNjUsMTAgQEAKICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggY2lwaGVyIGtleSBmcm9tICclcycuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIGlmIChrZXktPnNpemUoKSAhPSAxNikgewotICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwga2V5VVJJLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIApAQCAtMTM2Niw3ICsxMzY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYnl0ZXNSZWFkOwotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCAudHMgc2VnbWVudCBhdCB1cmwgJyVzJyIsIHVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmlEZWJ1Z1N0cmluZyh1cmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCBmOWY4YTNkLi43MTUxZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMyw2ICszLDEwIEBACiAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IDA4NTYwOGIuLjc5MmE2OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9JRDMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTU2LDYgKzU4LDU1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVtb3J5U291cmNlKTsKIH07CiAKK2NsYXNzIERhdGFTb3VyY2VVbndyYXBwZXIgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgeworCitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZVVud3JhcHBlcihEYXRhU291cmNlSGVscGVyICpzb3VyY2VoZWxwZXIpIHsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZWhlbHBlcjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBPSzsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOworfTsKKworCitJRDM6OklEMyhEYXRhU291cmNlSGVscGVyICpzb3VyY2VoZWxwZXIsIGJvb2wgaWdub3JlVjEsIG9mZjY0X3Qgb2Zmc2V0KQorICAgIDogbUlzVmFsaWQoZmFsc2UpLAorICAgICAgbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1GaXJzdEZyYW1lT2Zmc2V0KDApLAorICAgICAgbVZlcnNpb24oSUQzX1VOS05PV04pLAorICAgICAgbVJhd1NpemUoMCkgeworICAgIERhdGFTb3VyY2VVbndyYXBwZXIgc291cmNlKHNvdXJjZWhlbHBlcik7CisgICAgbUlzVmFsaWQgPSBwYXJzZVYyKCZzb3VyY2UsIG9mZnNldCk7CisKKyAgICBpZiAoIW1Jc1ZhbGlkICYmICFpZ25vcmVWMSkgeworICAgICAgICBtSXNWYWxpZCA9IHBhcnNlVjEoJnNvdXJjZSk7CisgICAgfQorfQorCiBJRDM6OklEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKICAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKICAgICAgIG1EYXRhKE5VTEwpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCmluZGV4IGE5MjQxOTcuLjhiMjAxODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTUxLDEyICs1MSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QmFuZHdpZHRoSGlzdG9yeVNpemUoc2l6ZV90IG51bUhpc3RvcnlJdGVtcyk7CiAKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKLQotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCk7Ci0KICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAppbmRleCA3YzIzOTFlLi41ZTQzM2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IElEMyB7CiAgICAgZW51bSBWZXJzaW9uIHsKQEAgLTM1LDYgKzM2LDcgQEAKICAgICAgICAgSUQzX1YyXzQsCiAgICAgfTsKIAorICAgIGV4cGxpY2l0IElEMyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIElEMyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlKTsKICAgICB+SUQzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCBmNDM5YTFjLi41OTZlZmI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCiAgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKQEAgLTUxLDYgKzUzLDggQEAKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KIAorICAgIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgc2l6ZV90IGNhY2hlZFNpemUoKTsKQEAgLTEzNSw3ICsxMzksNyBAQAogICAgIHNzaXplX3QgcmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmNjRfdCBvZmZzZXQpOwogCi0gICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OworICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2wob2ZmNjRfdCBvZmZzZXQsIHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Q7CiAKICAgICB2b2lkIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgKICAgICAgICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQgPSBmYWxzZSwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggYzI4NjUxNi4uNjRkY2E0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICBDb2xvckNvbnZlcnRlciAqbUNvbnZlcnRlcjsKICAgICBZVVZNb2RlIG1ZVVZNb2RlOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGU7CiAgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKICAgICBpbnQzMl90IG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggMWE0NGUxZi4uYzUwNjc3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDcgKzI2LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRGF0YVNvdXJjZTsKLWNsYXNzIE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IEltYWdlRGVjb2RlcjsKIHN0cnVjdCBGcmFtZVJlY3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDk3ZDE1YTcuLjlkNDZkMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAogICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgICAgICBrV2hhdEZvcmNlU3RhdGVUcmFuc2l0aW9uICAgID0gJ2ZzdHQnLAorICAgICAgICBrV2hhdENoZWNrSWZTdHVjayAgICAgICAgICAgID0gJ0NzdGsnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTIzNiw2ICsyMzcsOCBAQAogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtTGFzdE5hdGl2ZVdpbmRvd0Nyb3A7CiAgICAgaW50MzJfdCBtTGFzdE5hdGl2ZVdpbmRvd0RhdGFTcGFjZTsKICAgICBIRFJTdGF0aWNJbmZvIG1MYXN0SERSU3RhdGljSW5mbzsKKyAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlcjsKKyAgICBzcDxBQnVmZmVyPiBtTGFzdEhkcjEwUGx1c0J1ZmZlcjsKICAgICBzcDxBTWVzc2FnZT4gbUNvbmZpZ0Zvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwpAQCAtMjg5LDYgKzI5Miw3IEBACiAKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OwogICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4OworICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4OwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEFDb2RlY0J1ZmZlckNoYW5uZWw+IG1CdWZmZXJDaGFubmVsOwogCkBAIC00MjMsNiArNDI3LDExIEBACiAgICAgLy8gdW5zcGVjaWZpZWQgdmFsdWVzLgogICAgIHZvaWQgb25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKIAorICAgIC8vIG5vdGlmaWVzIHRoZSBjb2RlYyB0aGF0IHRoZSBjb25maWcgd2l0aCB8Y29uZmlnSW5kZXh8IGhhcyBjaGFuZ2VkLCB0aGUgdmFsdWUKKyAgICAvLyBjYW4gYmUgcXVlcmllZCBieSBPTVggZ2V0Q29uZmlnLCBhbmQgdGhlIGNvbmZpZyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgbmV4dAorICAgIC8vIG91dHB1dCBidWZmZXIgbm90aWZpZWQgYWZ0ZXIgdGhpcyBjYWxsYmFjay4KKyAgICB2b2lkIG9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpOworCiAgICAgLy8gZ2V0cyBpbmRleCBvciBzZXRzIGl0IHRvIDAgb24gZXJyb3IuIFJldHVybnMgZXJyb3IgZnJvbSBjb2RlYy4KICAgICBzdGF0dXNfdCBpbml0RGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKTsKIApAQCAtNDM0LDEyICs0NDMsMjIgQEAKICAgICAvLyBzZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAorICAgIC8vIHNldHMgfGhkcjEwUGx1c0luZm98LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KKyAgICBzdGF0dXNfdCBzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKTsKKwogICAgIC8vIGdldHMgfHBhcmFtc3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm8oRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpOwogCiAgICAgLy8gZ2V0cyBIRFIgc3RhdGljIGluZm9ybWF0aW9uIGZvciB0aGUgdmlkZW8gZW5jb2Rlci9kZWNvZGVyIHBvcnQgYW5kIHNldHMgdGhlbSBpbnRvIHxmb3JtYXR8LgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm9Gb3JWaWRlb0NvZGVjKE9NWF9VMzIgcG9ydEluZGV4LCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKKyAgICAvLyBnZXRzIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBwYXJhbXMuIElmIHxwYXJhbVNpemVVc2VkfCBpcyB6ZXJvLCBpdCdzCisgICAgLy8gcG9zc2libGUgdGhhdCB0aGUgcmV0dXJuZWQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIG9ubHkgaGFzIHRoZQorICAgIC8vIG5QYXJhbVNpemVVc2VkIGZpZWxkIHVwZGF0ZWQsIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhlIHN0b3JhZ2UgaXMgaW5zdWZmaWNpZW50LgorICAgIC8vIEluIHRoaXMgY2FzZSwgZ2V0SERSMTBQbHVzSW5mbygpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB8cGFyYW1TaXplVXNlZHwKKyAgICAvLyBzcGVjaWZpZWQgdG8gdGhlIHByZXZpb3VzIHJldHVybmVkIHZhbHVlLgorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogZ2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCA9IDApOworCiAgICAgdHlwZWRlZiBzdHJ1Y3QgZHJjUGFyYW1zIHsKICAgICAgICAgaW50MzJfdCBkcmNDdXQ7CiAgICAgICAgIGludDMyX3QgZHJjQm9vc3Q7CkBAIC00NjAsNiArNDc5LDggQEAKIAogICAgIHN0YXR1c190IHNldHVwRUFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIAorICAgIHN0YXR1c190IHNldHVwQUM0Q29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpOworCiAgICAgc3RhdHVzX3Qgc2VsZWN0QXVkaW9Qb3J0Rm9ybWF0KAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9BVURJT19DT0RJTkdUWVBFIGRlc2lyZWRGb3JtYXQpOwogCkBAIC00NjcsNyArNDg4LDggQEAKICAgICBzdGF0dXNfdCBzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMsCkBAIC00NzYsNiArNDk4LDcgQEAKICAgICBzdGF0dXNfdCBzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKICAgICBzdGF0dXNfdCBzZXRMYXRlbmN5KHVpbnQzMl90IGxhdGVuY3kpOwogICAgIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworICAgIHN0YXR1c190IHNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKTsKICAgICBzdGF0dXNfdCBzZXRPcGVyYXRpbmdSYXRlKGZsb2F0IHJhdGVGbG9hdCwgYm9vbCBpc1ZpZGVvKTsKICAgICBzdGF0dXNfdCBnZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgKmludHJhUmVmcmVzaFBlcmlvZCk7CiAgICAgc3RhdHVzX3Qgc2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90IGludHJhUmVmcmVzaFBlcmlvZCwgYm9vbCBpbkNvbmZpZ3VyZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDIwNmQzMjIuLmIwZTMyZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTY5LDYgKzY5LDcgQEAKIAogICAgIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2xlYXJGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gQ2xlYXJGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJGaWxlU291cmNlKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CisgICAgTXV0ZXggbUxvY2s7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7CisgICAgQ2xlYXJGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MDdhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBDbGVhck1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhck1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xlYXJNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9NRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNWIzNTQzZC4uNzViMGQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtMzUsMjEgKzM1LDMyIEBACiAKICAgICBib29sIGlzRHN0UkdCKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFNyY0NvbG9yU3BhY2UodWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2Zlcik7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0KAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKKyAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOworICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CisgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKKworICAgICAgICBib29sIGlzQnQ3MDkoKTsKKyAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICB9OworCiAgICAgc3RydWN0IEJpdG1hcFBhcmFtcyB7CiAgICAgICAgIEJpdG1hcFBhcmFtcygKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CkBAIC02NSw2ICs3Niw3IEBACiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CisgICAgQ29sb3JTcGFjZSBtU3JjQ29sb3JTcGFjZTsKICAgICB1aW50OF90ICptQ2xpcDsKIAogICAgIHVpbnQ4X3QgKmluaXRDbGlwKCk7CkBAIC03OCw2ICs5MCw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2E0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWI4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCisgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAorICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCisgICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOworCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90ICogLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKKyAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDg2MDQ4OTAuLmI2MTBlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0yMCw0NyArMjAsMjkgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBDbGVhckZpbGVTb3VyY2UgewogcHVibGljOgogICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIC8vIEZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAogICAgIEZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzRHJtKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBpbnQgbUZkOwotICAgIGludDY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1MZW5ndGg7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgU3RyaW5nOCBtTmFtZTsKLQogICAgIC8qZm9yIERSTSovCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CkBAIC02OCw3ICs1MCw3IEBACiAgICAgc3NpemVfdCBtRHJtQnVmU2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOwogCi0gICAgc3NpemVfdCByZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBGaWxlU291cmNlKGNvbnN0IEZpbGVTb3VyY2UgJik7CiAgICAgRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEZpbGVTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKaW5kZXggZjBlYmQ0OC4uYjgzYTk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCBmMTg5NDBkLi44MDMxNTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOyAvLyBTdGFydCB0aW1lIG9mZnNldCB3aGVuIEIgRnJhbWVzIGFyZSBwcmVzZW50CiAgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAKICAgICB2b2lkIHNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIGludDY0X3QgZ2V0U3RhcnRUaW1lc3RhbXBVcygpOyAgLy8gTm90IGNvbnN0CisgICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CkBAIC0yNTUsNyArMjU3LDkgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOworICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKICAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOwogICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZDQ5YzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQorICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgorICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQorICAgICAgICBtTWVtb3J5ID0gbWVtOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgorICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCisgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcworICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KKyAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCisgICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7CisKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworCisgICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KKyAgICB2b2lkIGNsYWltKCk7CisKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7CisgICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOworICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7CisKKyAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgorICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7CisgICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOworICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKKyAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQorICAgIH07CisKKyAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODBlNDliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2JmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworfTsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOworCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOworCisgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICAgICAgZGVsZXRlIG1Gb3JtYXQ7CisgICAgfTsKKworICAgIENNZWRpYUJ1ZmZlciAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVsZWFzZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmVsZWFzZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkICogeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5kYXRhKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNpemUgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNpemUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2Vfb2Zmc2V0ID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2VfbGVuZ3RoID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2V0X3JhbmdlID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2V0X3JhbmdlKG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+bWV0YV9kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiBBTWVkaWFGb3JtYXQqIHsKKyAgICAgICAgICAgIGlmICgoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIG1XcmFwcGVyID0gbnVsbHB0cjsKKyAgICAgICAgbUZvcm1hdCA9IG51bGxwdHI7CisgICAgfQorcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXIgKm1XcmFwcGVyOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwOWIzZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjExNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKKworICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBib29sIGhhc19idWZmZXJzKCk7CisKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKKyAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOworCisgICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPmFkZF9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoc2l6ZSk7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFkZF9idWZmZXIoYnVmKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aW5pdCA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIC0+IGJvb2wgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5pbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgICAgICAgLy8gICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+bVdyYXBwZXItPmluaXQgPSBudWxscHRyOyAvLyBlbmZvcmNlIGNhbGwtb25jZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmFjcXVpcmVfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZiwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYWNxdWlyZWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmFjcXVpcmVkQnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIGFjcXVpcmVkQnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gYWNxdWlyZWRCdWYtPndyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmhhc19idWZmZXJzID0gW10odm9pZCAqaGFuZGxlKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmhhc19idWZmZXJzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbVdyYXBwZXI7CisgICAgc3RydWN0IEludGVybmFsRGF0YTsKKyAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICB2b2lkIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjJkY2E1YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zMSw2ICszMSwyMSBAQAogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOwogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDogICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDogICAgICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOiAgICAgICAgICAgICAgcmV0dXJuICJIaWdoMTAiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDIyOiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0MjIiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOiByZXR1cm4gIkNvbnN0cmFpbmVkQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6ICAgICByZXR1cm4gIkNvbnN0cmFpbmVkSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7CkBAIC00OCw2ICs2MywzNSBAQAogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNiAgICAgICA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYxICAgICAgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MiAgICAgID0gMHg4MDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMWI6ICAgIHJldHVybiAiMWIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDEyOiAgICByZXR1cm4gIjEuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMzogICAgcmV0dXJuICIxLjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWQ0xldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7CkBAIC01OSw2ICsxMDMsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNQcm9maWxlQmFzZWxpbmU6ICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZTogcmV0dXJuICJCYWNrd2FyZENvbXBhdGlibGUiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSVNXVjI6ICAgICAgICAgICAgICByZXR1cm4gIklTV1YyIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb246ICAgIHJldHVybiAiSGlnaENvbXByZXNzaW9uIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUludGVybmV0OiAgICAgICAgICAgcmV0dXJuICJJbnRlcm5ldCI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5OiAgICAgICAgcmV0dXJuICJIaWdoTGF0ZW5jeSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwxMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDIwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMzAgICAgICA9IDB4MDQ7CkBAIC02OCw2ICsxMjcsMjAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSDI2M0xldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNMZXZlbDEwOiAgIHJldHVybiAiMTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDIwOiAgIHJldHVybiAiMjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDMwOiAgIHJldHVybiAiMzAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQwOiAgIHJldHVybiAiNDAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQ1OiAgIHJldHVybiAiNDUiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDUwOiAgIHJldHVybiAiNTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDYwOiAgIHJldHVybiAiNjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDcwOiAgIHJldHVybiAiNzAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICAgICA9IDB4MDQ7CkBAIC04NSw2ICsxNTgsMjggQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgICByZXR1cm4gIlNpbXBsZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICAgcmV0dXJuICJDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICAgcmV0dXJuICJOYml0IjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICAgcmV0dXJuICJTY2FsYWJsZVRleHR1cmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgICByZXR1cm4gIlNpbXBsZUZhY2UiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgICByZXR1cm4gIlNpbXBsZUZCQSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgIHJldHVybiAiQmFzaWNBbmltYXRlZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgIHJldHVybiAiSHlicmlkIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiAgcmV0dXJuICJBZHZhbmNlZFJlYWxUaW1lIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICAgcmV0dXJuICJDb3JlU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgICByZXR1cm4gIkFkdmFuY2VkQ29kaW5nIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICAgcmV0dXJuICJBZHZhbmNlZENvcmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6ICByZXR1cm4gIkFkdmFuY2VkU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgICByZXR1cm4gIkFkdmFuY2VkU2ltcGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKQEAgLTk2LDYgKzE5MSwyMiBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzRMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMDogICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwwYjogIHJldHVybiAiMGIiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwxOiAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDI6ICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMzogICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwzYjogIHJldHVybiAiM2IiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0OiAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDRhOiAgcmV0dXJuICI0YSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDU6ICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNjogICByZXR1cm4gIjYiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMDsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlNDIyICAgICAgICAgICAgICAgICA9IDB4MDI7CkBAIC0xMDMsMTIgKzIxNCwzNSBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMlByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlU2ltcGxlOiAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlTWFpbjogICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZTQyMjogICAgICAgcmV0dXJuICI0MjIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNOUjogICAgICAgcmV0dXJuICJTTlIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNwYXRpYWw6ICAgcmV0dXJuICJTcGF0aWFsIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVIaWdoOiAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxMTDogIHJldHVybiAiTEwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxNTDogIHJldHVybiAiTUwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxIMTQ6IHJldHVybiAiSDE0IjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSEw6ICByZXR1cm4gIkhMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSFA6ICByZXR1cm4gIkhQIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOwpAQCAtMTIyLDE5ICsyNTYsNzAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEVMRCAgICAgICAgPSAzOTsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFhIRSAgICAgICAgPSA0MjsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BQUNPYmplY3QoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TWFpbjogICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFBQ09iamVjdExDOiAgICAgICAgICAgcmV0dXJuICJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U1NSOiAgICAgICAgICByZXR1cm4gIlNTUiI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TFRQOiAgICAgICAgICByZXR1cm4gIkxUUCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEU6ICAgICAgICAgICByZXR1cm4gIkhFIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RTY2FsYWJsZTogICAgIHJldHVybiAiU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVSTEM6ICAgICAgICAgcmV0dXJuICJFUkxDIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUlNjYWxhYmxlOiAgIHJldHVybiAiRVJTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TEQ6ICAgICAgICAgICByZXR1cm4gIkxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RIRV9QUzogICAgICAgIHJldHVybiAiSEVfUFMiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVMRDogICAgICAgICAgcmV0dXJuICJFTEQiOworICAgICAgICBjYXNlIEFBQ09iamVjdFhIRTogICAgICAgICAgcmV0dXJuICJYSEUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDhMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJWMCI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjE6IHJldHVybiAiVjEiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24yOiByZXR1cm4gIlYyIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJWMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhQcm9maWxlTWFpbiA9IDB4MDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUwID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUxID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUyID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOVByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6ICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUxOiAgICAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjogICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTM6ICAgICAgICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOiAgICAgICAgcmV0dXJuICIySERSIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjogICAgICAgIHJldHVybiAiM0hEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6ICByZXR1cm4gIjJIRFJQbHVzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjEwUGx1czogIHJldHVybiAiM0hEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDExID0gMHgyOwpAQCAtMTUxLDEwICszMzYsMTEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIFZQOUxldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIFZQOUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIFZQOUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMiA9IDB4MDQ7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMDogICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMTogICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMjogICAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMiAgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIxID0gMHgyOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMiA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjMgPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzEgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMiA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMzID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNCAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDEgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDIgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDMgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNSAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUxID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MiA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTMgPSAweDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjEgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MiA9IDB4NDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYzID0gMHg4MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNyAgPSAweDEwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzEgPSAweDIwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzIgPSAweDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzMgPSAweDgwMDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIyOiAgICByZXR1cm4gIjIuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMzogICAgcmV0dXJuICIyLjMiOworICAgICAgICBjYXNlIEFWMUxldmVsMzogICAgIHJldHVybiAiMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMTogICAgcmV0dXJuICIzLjEiOworICAgICAgICBjYXNlIEFWMUxldmVsMzI6ICAgIHJldHVybiAiMy4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMzOiAgICByZXR1cm4gIjMuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNDM6ICAgIHJldHVybiAiNC4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIEFWMUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MzogICAgcmV0dXJuICI1LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNjogICAgIHJldHVybiAiNiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MTogICAgcmV0dXJuICI2LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNjI6ICAgIHJldHVybiAiNi4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYzOiAgICByZXR1cm4gIjYuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3OiAgICAgcmV0dXJuICI3IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDcxOiAgICByZXR1cm4gIjcuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MjogICAgcmV0dXJuICI3LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNzM6ICAgIHJldHVybiAiNy4zIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluICAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMCAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpblN0aWxsICAgPSAweDA0OwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzID0gMHgyMDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0hFVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjogICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwOiAgICAgICAgICAgICByZXR1cm4gIk1haW4xMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluU3RpbGw6ICAgICAgICAgIHJldHVybiAiTWFpblN0aWxsIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6ICAgIHJldHVybiAiTWFpbjEwSERSMTBQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOwpAQCAtMTgzLDYgKzQ2OCwzOCBAQAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MiA9IDB4MTAwMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjIgPSAweDIwMDAwMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDE6ICAgIHJldHVybiAiTWFpbiAxIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDE6ICAgIHJldHVybiAiSGlnaCAxIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDI6ICAgIHJldHVybiAiTWFpbiAyIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDI6ICAgIHJldHVybiAiSGlnaCAyIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDIxOiAgIHJldHVybiAiTWFpbiAyLjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMjE6ICAgcmV0dXJuICJIaWdoIDIuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzOiAgICByZXR1cm4gIk1haW4gMyI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwzOiAgICByZXR1cm4gIkhpZ2ggMyI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzMTogICByZXR1cm4gIk1haW4gMy4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDMxOiAgIHJldHVybiAiSGlnaCAzLjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDogICAgcmV0dXJuICJNYWluIDQiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNDogICAgcmV0dXJuICJIaWdoIDQiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDE6ICAgcmV0dXJuICJNYWluIDQuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw0MTogICByZXR1cm4gIkhpZ2ggNC4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDU6ICAgIHJldHVybiAiTWFpbiA1IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDU6ICAgIHJldHVybiAiSGlnaCA1IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDUxOiAgIHJldHVybiAiTWFpbiA1LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTE6ICAgcmV0dXJuICJIaWdoIDUuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1MjogICByZXR1cm4gIk1haW4gNS4yIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDUyOiAgIHJldHVybiAiSGlnaCA1LjIiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjogICAgcmV0dXJuICJNYWluIDYiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjogICAgcmV0dXJuICJIaWdoIDYiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjE6ICAgcmV0dXJuICJNYWluIDYuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2MTogICByZXR1cm4gIkhpZ2ggNi4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDYyOiAgIHJldHVybiAiTWFpbiA2LjIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjI6ICAgcmV0dXJuICJIaWdoIDYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyID0gMHg0OwpAQCAtMTk0LDYgKzUxMSwyMiBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ID0gMHgxMDA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgPSAweDIwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvblByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlcjogcmV0dXJuICJEdmF2UGVyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuOiByZXR1cm4gIkR2YXZQZW4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXI6IHJldHVybiAiRHZoZURlciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbjogcmV0dXJuICJEdmhlRGVuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyOiByZXR1cm4gIkR2aGVEdHIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG46IHJldHVybiAiRHZoZVN0biI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aDogcmV0dXJuICJEdmhlRHRoIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiOiByZXR1cm4gIkR2aGVEdGIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdDogIHJldHVybiAiRHZoZVN0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2U6ICByZXR1cm4gIkR2YXZTZSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDI0ICAgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMzAgICAgPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMjQgICA9IDB4NDsKQEAgLTIwNCwxMCArNTM3LDM0IEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNDggICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNjAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEhkMjQ6ICByZXR1cm4gIkhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxIZDMwOiAgcmV0dXJuICJIZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkMjQ6IHJldHVybiAiRmhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMDogcmV0dXJuICJGaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDYwOiByZXR1cm4gIkZoZDYwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMjQ6IHJldHVybiAiVWhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMDogcmV0dXJuICJVaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDQ4OiByZXR1cm4gIlVoZDQ4IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNjA6IHJldHVybiAiVWhkNjAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DQlIgPSAyOwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NRID0gMDsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9WQlIgPSAxOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0JpdHJhdGVNb2RlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DQlI6ICByZXR1cm4gIkNCUiI7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX0NROiAgIHJldHVybiAiQ1EiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9WQlI6ICByZXR1cm4gIlZCUiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCAgICAgICAgICAgICA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1ICAgICAgICAgICA9IDU7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0ICAgICAgICAgICA9IDQ7CkBAIC0yNjEsNiArNjE4LDY0IEBACiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICA9IDB4N2ZhMzBjMDA7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3ZjAwMDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Db2xvckZvcm1hdChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NDogICAgICAgICAgICAgICByZXR1cm4gIjEyYml0UkdCNDQ0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1OiAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QVJHQjE1NTUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQ6ICAgICAgICAgICAgIHJldHVybiAiMTZiaXRBUkdCNDQ0NCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRCR1I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdEJHUjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdFJHQjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NTogICAgICAgICAgICAgcmV0dXJuICIxOGJpdEFSR0IxNjY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Qml0QkdSNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Yml0UkdCNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2OiAgICAgICAgICAgICByZXR1cm4gIjE5Yml0QVJHQjE2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjY6ICAgICAgICAgICAgIHJldHVybiAiMjRCaXRBQkdSNjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NzogICAgICAgICAgICAgcmV0dXJuICIyNGJpdEFSR0IxODg3IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2OiAgICAgICAgICAgICByZXR1cm4gIjI0Qml0QVJHQjY2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRCR1I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRSR0I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODg6ICAgICAgICAgICAgIHJldHVybiAiMjViaXRBUkdCMTg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFCR1I4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QVJHQjg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRCR1JBODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMjogICAgICAgICAgICAgICAgcmV0dXJuICI4Yml0UkdCMzMyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDYllDclk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNiWUNyWSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q3JZQ2JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDcllDYlkiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwxNjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDE2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyNCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDMyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMzIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw4OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdE1vbm9jaHJvbWU6ICAgICAgICAgICAgICAgIHJldHVybiAiTW9ub2Nocm9tZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdDogICAgICAgICAgICAgcmV0dXJuICJSYXdCYXllcjEwYml0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQ6ICAgICAgICAgICAgICByZXR1cm4gIlJhd0JheWVyOGJpdCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZDogICAgcmV0dXJuICJSYXdCYXllcjhiaXRjb21wcmVzc2VkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6ICAgICAgICAgICAgICByZXR1cm4gIlJHQkFGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6ICAgICAgICAgICAgICAgcmV0dXJuICJSR0JGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJTdXJmYWNlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZQ2JZQ3I6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIllDYllDciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WUNyWUNiOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZQ3JZQ2IiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDExUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQxMVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjBQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjJQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIyUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOiAgICAgcmV0dXJuICJRQ09NX1lVVjQyMFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6IHJldHVybiAiVElfWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfSW50cmFSZWZyZXNoW10gPSAiaW50cmEtcmVmcmVzaCI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1BhcnRpYWxGcmFtZVtdID0gInBhcnRpYWwtZnJhbWUiOwpAQCAtMjcwLDYgKzY4NSw3IEBACiAvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVjFbXSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWQ1tdID0gInZpZGVvL2F2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IRVZDW10gPSAidmlkZW8vaGV2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHNFtdID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzI3LDYgKzc0Myw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CkBAIC0zMzUsNiArNzUyLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9TVEFOREFSRFtdID0gImNvbG9yLXN0YW5kYXJkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9UUkFOU0ZFUltdID0gImNvbG9yLXRyYW5zZmVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT01QTEVYSVRZW10gPSAiY29tcGxleGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEW10gPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9EVVJBVElPTltdID0gImR1cmF0aW9uVXMiOwogY29uc3RleHByIGNoYXIgS0VZX0ZFQVRVUkVfW10gPSAiZmVhdHVyZS0iOwogY29uc3RleHByIGNoYXIgS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUxbXSA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKQEAgLTM0Miw2ICs3NjAsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7CiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hEUjEwX1BMVVNfSU5GT1tdID0gImhkcjEwLXBsdXMtaW5mbyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSEVJR0hUW10gPSAiaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JX0ZSQU1FX0lOVEVSVkFMW10gPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0RbXSA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CkBAIC0zNTQsOCArNzczLDEwIEBACiBjb25zdGV4cHIgY2hhciBLRVlfTEFURU5DWVtdID0gImxhdGVuY3kiOwogY29uc3RleHByIGNoYXIgS0VZX0xFVkVMW10gPSAibGV2ZWwiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9CSVRfUkFURVtdID0gIm1heC1iaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSW10gPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1dJRFRIW10gPSAibWF4LXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NSU1FW10gPSAibWltZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CkBAIC00MTAsOCArODMxLDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRVtdID0gInRpbWUtb2Zmc2V0LXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAicmVxdWVzdC1zeW5jIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORFtdID0gImRyb3AtaW5wdXQtZnJhbWVzIjsKK2NvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FW10gPSAiZHJvcC1zdGFydC10aW1lLXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggNTlmNTdjNy4uZjUzYjIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtNDgsNiArNDgsMTMgQEAKICAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KICAgICAgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgLyoqCisgICAgICogRmluZCBhbiBleGlzdGluZyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBjb2RlYyBuYW1lIGFuZCByZXR1cm4gYQorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm91bmQgYWRkZWQgYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGlmIGZvdW5kLCBvciBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpjb2RlY05hbWUpOwogcHJpdmF0ZToKICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDZhNWM2YjYuLjA5NjM5ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTcwLDcgKzcwLDEyIEBACiAgICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTiAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKIAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLjQzNThhYWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDkgQEAKICNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM1LDI2ICszNCwyOSBAQAogICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogICAgIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwotICAgIHN0YXRpYyB2b2lkIExvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICBzdGF0aWMgdm9pZCBTZXRMaW5rZWRMaWJyYXJpZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmtlZExpYnJhcmllcyk7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIE11dGV4IGdQbHVnaW5NdXRleDsKLSAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKICAgICBzdGF0aWMgYm9vbCBnUGx1Z2luc1JlZ2lzdGVyZWQ7CisgICAgc3RhdGljIGJvb2wgZ0lnbm9yZVZlcnNpb247CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdMaW5rZWRMaWJyYXJpZXM7CiAKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogCi0gICAgc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBzbmlmZihEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwKLSAgICAgICAgICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbik7CisgICAgc3RhdGljIHZvaWQgKnNuaWZmKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCisgICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIHVpbnQzMl90ICpjcmVhdG9yVmVyc2lvbik7CiAKLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpOworICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUV4dHJhY3RvcnMoKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAppbmRleCBmZTBlNjEzLi5hY2FhNmM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKQEAgLTE5LDUwICsxOSwyMSBAQAogI2RlZmluZSBNRURJQV9IVFRQX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOwogCi1zdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKK3N0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgQ2xlYXJNZWRpYUhUVFAgewogICAgIE1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYUhUVFAoKTsKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOwotICAgIEFTdHJpbmcgbUxhc3RVUkk7Ci0KLSAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7Ci0gICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKLQogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCmluZGV4IDY2ZjRkNzIuLjY5ZDZjZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICAgIE9VVFBVVF9GT1JNQVRfV0VCTSAgICAgICAgPSAxLAogICAgICAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCAgID0gMiwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGICAgICAgICA9IDMsCisgICAgICAgIE9VVFBVVF9GT1JNQVRfT0dHICAgICAgICAgPSA0LAogICAgICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKICAgICB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDE2MGY4ZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDFlMTIxOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQwN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVUQV9EQVRBX0JBU0VfSF8KKworI2RlZmluZSBNRVRBX0RBVEFfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCitlbnVtIHsKKyAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCisgICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKKyAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAorICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCisgICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KKyAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAorICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAorICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAorICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKKworICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQorICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKKworICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCisgICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQorICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCisgICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCisgICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQorICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKKyAgICBrS2V5Qml0c1BlclNhbXBsZSAgICAgPSAnYml0cycsICAvLyBpbnQzMl90IChiaXRzIHBlciBzYW1wbGUpCisgICAga0tleVN0cmVhbUhlYWRlciAgICAgID0gJ3N0SGQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RVNEUyAgICAgICAgICAgICAgPSAnZXNkcycsICAvLyByYXcgZGF0YQorICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKKyAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUFWMUMgICAgICAgICAgICAgID0gJ2F2MWMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQorICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCisgICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKKyAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUlzTXV4ZXJEYXRhICAgICAgID0gJ211eGQnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5VGltZSAgICAgICAgICAgICAgPSAndGltZScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RGVjb2RpbmdUaW1lICAgICAgPSAnZGVjVCcsICAvLyBpbnQ2NF90IChkZWNvZGluZyB0aW1lc3RhbXAgaW4gdXNlY3MpCisgICAga0tleU5UUFRpbWUgICAgICAgICAgID0gJ250cFQnLCAgLy8gdWludDY0X3QgKG50cC10aW1lc3RhbXApCisgICAga0tleVRhcmdldFRpbWUgICAgICAgID0gJ3RhclQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVBpeGVsRm9ybWF0ICAgICAgID0gJ3BpeGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvckZvcm1hdCAgICAgICA9ICdjb2xmJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q29sb3JTcGFjZSAgICAgICAgPSAnY29scycsICAvLyBpbnQzMl90CisgICAga0tleVBsYXRmb3JtUHJpdmF0ZSAgID0gJ3ByaXYnLCAgLy8gcG9pbnRlcgorICAgIGtLZXlEZWNvZGVyQ29tcG9uZW50ICA9ICdkZWNDJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QnVmZmVySUQgICAgICAgICAgPSAnYmZJRCcsCisgICAga0tleU1heElucHV0U2l6ZSAgICAgID0gJ2lucFMnLAorICAgIGtLZXlNYXhXaWR0aCAgICAgICAgICA9ICdtYXhXJywKKyAgICBrS2V5TWF4SGVpZ2h0ICAgICAgICAgPSAnbWF4SCcsCisgICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAorICAgIGtLZXlFbmNvZGVyRGVsYXkgICAgICA9ICdlbmNkJywgIC8vIGludDMyX3QgKGZyYW1lcykKKyAgICBrS2V5RW5jb2RlclBhZGRpbmcgICAgPSAnZW5jcCcsICAvLyBpbnQzMl90IChmcmFtZXMpCisKKyAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCisgICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZworICAgIGtLZXlBbGJ1bUFydGlzdCAgICAgICA9ICdhYXJ0JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5Q29tcG9zZXIgICAgICAgICAgPSAnY29tcCcsICAvLyBjc3RyaW5nCisgICAga0tleUdlbnJlICAgICAgICAgICAgID0gJ2dlbnInLCAgLy8gY3N0cmluZworICAgIGtLZXlUaXRsZSAgICAgICAgICAgICA9ICd0aXRsJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5WWVhciAgICAgICAgICAgICAgPSAneWVhcicsICAvLyBjc3RyaW5nCisgICAga0tleUFsYnVtQXJ0ICAgICAgICAgID0gJ2FsYkEnLCAgLy8gY29tcHJlc3NlZCBpbWFnZSBkYXRhCisgICAga0tleUF1dGhvciAgICAgICAgICAgID0gJ2F1dGgnLCAgLy8gY3N0cmluZworICAgIGtLZXlDRFRyYWNrTnVtYmVyICAgICA9ICdjZHRyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGlzY051bWJlciAgICAgICAgPSAnZG51bScsICAvLyBjc3RyaW5nCisgICAga0tleURhdGUgICAgICAgICAgICAgID0gJ2RhdGUnLCAgLy8gY3N0cmluZworICAgIGtLZXlXcml0ZXIgICAgICAgICAgICA9ICd3cml0JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5Q29tcGlsYXRpb24gICAgICAgPSAnY3BpbCcsICAvLyBjc3RyaW5nCisgICAga0tleUxvY2F0aW9uICAgICAgICAgID0gJ2xvYyAnLCAgLy8gY3N0cmluZworICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSAgPSAnY2FwRicsICAvLyBmbG9hdCAoY2FwdHVyZSBmcHMpCisKKyAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAorICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKKyAgICBrS2V5VmlkZW9MZXZlbCAgICAgICAgPSAndmxldicsICAvLyBpbnQzMl90CisKKyAgICAvLyBTZXQgdGhpcyBrZXkgdG8gZW5hYmxlIGF1dGhvcmluZyBmaWxlcyBpbiA2NC1iaXQgb2Zmc2V0CisgICAga0tleTY0Qml0RmlsZU9mZnNldCAgID0gJ2ZvYnQnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5MkJ5dGVOYWxMZW5ndGggICAgPSAnMk5BTCcsICAvLyBpbnQzMl90IChib29sKQorCisgICAgLy8gSWRlbnRpZnkgdGhlIGZpbGUgb3V0cHV0IGZvcm1hdCBmb3IgYXV0aG9yaW5nCisgICAgLy8gUGxlYXNlIHNlZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPiBmb3IgdGhlIHN1cHBvcnRlZAorICAgIC8vIGZpbGUgb3V0cHV0IGZvcm1hdHMuCisgICAga0tleUZpbGVUeXBlICAgICAgICAgID0gJ2Z0eXAnLCAgLy8gaW50MzJfdAorCisgICAgLy8gVHJhY2sgYXV0aG9yaW5nIHByb2dyZXNzIHN0YXR1cworICAgIC8vIGtLZXlUcmFja1RpbWVTdGF0dXMgaXMgdXNlZCB0byB0cmFjayBwcm9ncmVzcyBpbiBlbGFwc2VkIHRpbWUKKyAgICBrS2V5VHJhY2tUaW1lU3RhdHVzICAgPSAndGt0bScsICAvLyBpbnQ2NF90CisKKyAgICBrS2V5UmVhbFRpbWVSZWNvcmRpbmcgPSAncnRyYycsICAvLyBib29sIChpbnQzMl90KQorICAgIGtLZXlOdW1CdWZmZXJzICAgICAgICA9ICduYmJmJywgIC8vIGludDMyX3QKKworICAgIC8vIE9nZyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgbG9vcGluZy4uLgorICAgIGtLZXlBdXRvTG9vcCAgICAgICAgICA9ICdhdXRMJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5VmFsaWRTYW1wbGVzICAgICAgPSAndmFsRCcsICAvLyBpbnQzMl90CisKKyAgICBrS2V5SXNVbnJlYWRhYmxlICAgICAgPSAndW5yZScsICAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gQW4gaW5kaWNhdGlvbiB0aGF0IGEgdmlkZW8gYnVmZmVyIGhhcyBiZWVuIHJlbmRlcmVkLgorICAgIGtLZXlSZW5kZXJlZCAgICAgICAgICA9ICdyZW5kJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtZWRpYQorICAgIGtLZXlNZWRpYUxhbmd1YWdlICAgICA9ICdsYW5nJywgIC8vIGNzdHJpbmcKKworICAgIC8vIFRoZSBtYW51ZmFjdHVyZXIgY29kZSBmb3IgdGhpcyBtZWRpYQorICAgIGtLZXlNYW51ZmFjdHVyZXIgID0gJ21hbnUnLCAgLy8gY3N0cmluZworCisgICAgLy8gVG8gc3RvcmUgdGhlIHRpbWVkIHRleHQgZm9ybWF0IGRhdGEKKyAgICBrS2V5VGV4dEZvcm1hdERhdGEgICAgPSAndGV4dCcsICAvLyByYXcgZGF0YQorCisgICAga0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycyA9ICdzZWN1JywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5SXNBRFRTICAgICAgICAgICAgPSAnYWR0cycsICAvLyBib29sIChpbnQzMl90KQorICAgIGtLZXlBQUNBT1QgICAgICAgICAgICA9ICdhYW90JywgIC8vIGludDMyX3QKKworICAgIC8vIElmIGEgTWVkaWFCdWZmZXIncyBkYXRhIHJlcHJlc2VudHMgKGF0IGxlYXN0IHBhcnRpYWxseSkgZW5jcnlwdGVkCisgICAgLy8gZGF0YSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYWlkIGluIGRlY3J5cHRpb24uCisgICAgLy8gVGhlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgcGFpcnMgb2YgcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhCisgICAgLy8gZnJhZ21lbnRzLCBpLmUuIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YSBhbHRlcm5hdGUuCisgICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IGlzIGJ5IGNvbnZlbnRpb24gcGxhaW4gZGF0YSAoaWYgdGhhdCdzIG5vdCB0aGUKKyAgICAvLyBjYXNlLCBzaW1wbHkgc3BlY2lmeSBwbGFpbiBmcmFnbWVudCBzaXplIG9mIDApLgorICAgIC8vIGtLZXlFbmNyeXB0ZWRTaXplcyBhbmQga0tleVBsYWluU2l6ZXMgZWFjaCBtYXAgdG8gYW4gYXJyYXkgb2YKKyAgICAvLyBzaXplX3QgdmFsdWVzLiBUaGUgc3VtIHRvdGFsIG9mIGFsbCBzaXplX3QgdmFsdWVzIG9mIGJvdGggYXJyYXlzCisgICAgLy8gbXVzdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRhdGEgKGkuZS4gTWVkaWFCdWZmZXIncyByYW5nZV9sZW5ndGgoKSkuCisgICAgLy8gSWYgYm90aCBhcnJheXMgYXJlIHByZXNlbnQsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgIC8vIElmIG9ubHkgZW5jcnlwdGVkIHNpemVzIGFyZSBwcmVzZW50IGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwKKyAgICAvLyBwbGFpbiBzaXplcyBhcmUgMCwgaS5lLiBhbGwgZnJhZ21lbnRzIGFyZSBlbmNyeXB0ZWQuCisgICAgLy8gVG8gcHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlc2UgYXJyYXksIHVzZSB0aGUgTWV0YURhdGFCYXNlOjpzZXREYXRhIEFQSSwgaS5lLgorICAgIC8vIGNvbnN0IHNpemVfdCBlbmNTaXplc1tdOworICAgIC8vIG1ldGEtPnNldERhdGEoCisgICAgLy8gIGtLZXlFbmNyeXB0ZWRTaXplcywgMCAvKiB0eXBlICovLCBlbmNTaXplcywgc2l6ZW9mKGVuY1NpemVzKSk7CisgICAgLy8gQSBwbGFpbiBzaXplcyBhcnJheSBieSBpdHNlbGYgbWFrZXMgbm8gc2Vuc2UuCisgICAga0tleUVuY3J5cHRlZFNpemVzICAgID0gJ2VuY3InLCAgLy8gc2l6ZV90W10KKyAgICBrS2V5UGxhaW5TaXplcyAgICAgICAgPSAncGxhaScsICAvLyBzaXplX3RbXQorICAgIGtLZXlDcnlwdG9LZXkgICAgICAgICA9ICdjcnlLJywgIC8vIHVpbnQ4X3RbMTZdCisgICAga0tleUNyeXB0b0lWICAgICAgICAgID0gJ2NyeUknLCAgLy8gdWludDhfdFsxNl0KKyAgICBrS2V5Q3J5cHRvTW9kZSAgICAgICAgPSAnY3J5TScsICAvLyBpbnQzMl90CisKKyAgICBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSA9ICdjcnlTJywgIC8vIGludDMyX3QKKworICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCisgICAga0tleUNBU3lzdGVtSUQgICAgICAgID0gJ2NhaWQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDQVNlc3Npb25JRCAgICAgICA9ICdzZWlkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUNBUHJpdmF0ZURhdGEgICAgID0gJ2NhZGMnLCAgLy8gcmF3IGRhdGEKKworICAgIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgPSAnY2JsaycsICAvLyB1aW50OF90CisgICAga0tleVNraXBCeXRlQmxvY2sgICAgID0gJ3NibGsnLCAgLy8gdWludDhfdAorCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KKyAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KKyAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KKyAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBIMjY0IHN1cHBsZW1lbnRhbCBlbmhhbmNlbWVudCBpbmZvcm1hdGlvbiBvZmZzZXRzL3NpemVzCisgICAga0tleVNFSSAgICAgICAgICAgICAgID0gJ3NlaSAnLCAvLyByYXcgZGF0YQorCisgICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cworICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KKworICAgIC8vIEhEUiByZWxhdGVkCisgICAga0tleUhkclN0YXRpY0luZm8gICAgPSAnaGRyUycsIC8vIEhEUlN0YXRpY0luZm8KKyAgICBrS2V5SGRyMTBQbHVzSW5mbyAgICA9ICdoZHJEJywgLy8gcmF3IGRhdGEKKworICAgIC8vIGNvbG9yIGFzcGVjdHMKKyAgICBrS2V5Q29sb3JSYW5nZSAgICAgICA9ICdjUm5nJywgLy8gaW50MzJfdCwgY29sb3IgcmFuZ2UsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlJhbmdlCisgICAga0tleUNvbG9yUHJpbWFyaWVzICAgPSAnY1BybScsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIFByaW1hcmllcywgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUHJpbWFyaWVzCisgICAga0tleVRyYW5zZmVyRnVuY3Rpb24gPSAndEZ1bicsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIEZ1bmN0aW9uLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5UcmFuc2Zlci4KKyAgICBrS2V5Q29sb3JNYXRyaXggICAgICA9ICdjTXR4JywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCisgICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCisgICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCisKKyAgICBrS2V5VGlsZVdpZHRoICAgICAgICA9ICd0aWxXJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIHdpZHRoCisgICAga0tleVRpbGVIZWlnaHQgICAgICAgPSAndGlsSCcsIC8vIGludDMyX3QsIEhFSUYgdGlsZSBoZWlnaHQKKyAgICBrS2V5R3JpZFJvd3MgICAgICAgICA9ICdncmRSJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHJvd3MKKyAgICBrS2V5R3JpZENvbHMgICAgICAgICA9ICdncmRDJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGNvbHVtbnMKKyAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcm9maWxlIGRhdGEKKyAgICBrS2V5SXNQcmltYXJ5SW1hZ2UgICA9ICdwcmltJywgLy8gYm9vbCAoaW50MzJfdCksIGltYWdlIHRyYWNrIGlzIHRoZSBwcmltYXJ5IGltYWdlCisgICAga0tleUZyYW1lQ291bnQgICAgICAgPSAnbmZybScsIC8vIGludDMyX3QsIHRvdGFsIG51bWJlciBvZiBmcmFtZSBpbiB2aWRlbyB0cmFjaworICAgIGtLZXlFeGlmT2Zmc2V0ICAgICAgID0gJ2V4b2YnLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgb2Zmc2V0CisgICAga0tleUV4aWZTaXplICAgICAgICAgPSAnZXhzeicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBzaXplCisgICAga0tleUV4aWZUaWZmT2Zmc2V0ICAgPSAndGhkcicsIC8vIGludDMyX3QsIGlmID4gMCwgYnVmZmVyIGNvbnRhaW5zIGV4aWYgZGF0YSBibG9jayB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpZmYgaGRyIGF0IHNwZWNpZmllZCBvZmZzZXQKKyAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKKyAgICBrS2V5QWxhY01hZ2ljQ29va2llICA9ICdhbG1jJywgLy8gcmF3IGRhdGEKKworICAgIC8vIEFDLTQgQXVkaW9QcmVzZW50YXRpb25JbmZvCisgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbyA9ICdhdWRQJywgIC8vIHJhdyBkYXRhCit9OworCitlbnVtIHsKKyAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAorICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKKyAgICBrVHlwZUFWMUMgICAgICAgID0gJ2F2MWMnLAorICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCit9OworCitlbnVtIHsKKyAgICBrQ3J5cHRvTW9kZVVuZW5jcnlwdGVkID0gMCwKKyAgICBrQ3J5cHRvTW9kZUFlc0N0ciAgICAgID0gMSwKKyAgICBrQ3J5cHRvTW9kZUFlc0NiYyAgICAgID0gMiwKK307CisKK2NsYXNzIFBhcmNlbDsKKworY2xhc3MgTWV0YURhdGFCYXNlIHsKK3B1YmxpYzoKKyAgICBNZXRhRGF0YUJhc2UoKTsKKyAgICBNZXRhRGF0YUJhc2UoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKTsKKyAgICBNZXRhRGF0YUJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgfk1ldGFEYXRhQmFzZSgpOworCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgVFlQRV9OT05FICAgICA9ICdub25lJywKKyAgICAgICAgVFlQRV9DX1NUUklORyA9ICdjc3RyJywKKyAgICAgICAgVFlQRV9JTlQzMiAgICA9ICdpbjMyJywKKyAgICAgICAgVFlQRV9JTlQ2NCAgICA9ICdpbjY0JywKKyAgICAgICAgVFlQRV9GTE9BVCAgICA9ICdmbG9hJywKKyAgICAgICAgVFlQRV9QT0lOVEVSICA9ICdwdHIgJywKKyAgICAgICAgVFlQRV9SRUNUICAgICA9ICdyZWN0JywKKyAgICB9OworCisgICAgdm9pZCBjbGVhcigpOworICAgIGJvb2wgcmVtb3ZlKHVpbnQzMl90IGtleSk7CisKKyAgICBib29sIHNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgYm9vbCBzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpOworICAgIGJvb2wgc2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sIHNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpOworICAgIGJvb2wgc2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKTsKKworICAgIGJvb2wgc2V0UmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCisgICAgICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CisKKyAgICBib29sIGZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kUG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKip2YWx1ZSkgY29uc3Q7CisKKyAgICBib29sIGZpbmRSZWN0KAorICAgICAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAorICAgICAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7CisKKyAgICBib29sIHNldERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKKworICAgIGJvb2wgaGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0OworCisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworICAgIHZvaWQgZHVtcFRvTG9nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3I7CisgICAgZnJpZW5kIGNsYXNzIE1ldGFEYXRhOworCisgICAgc3RydWN0IHR5cGVkX2RhdGE7CisgICAgc3RydWN0IFJlY3Q7CisgICAgc3RydWN0IE1ldGFEYXRhSW50ZXJuYWw7CisgICAgTWV0YURhdGFJbnRlcm5hbCAqbUludGVybmFsRGF0YTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCmluZGV4IGQ1YTgwODAuLmRjYWYyN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCkBAIC0yMCwxMyArMjAsMjQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKIAorYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCit2b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE1FVEFfREFUQV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1NGE3MDk1Li5mMzRmOWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNjQsOCArNjUsNiBAQAogCiAgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKLQogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CiAKQEAgLTk3LDYgKzk2LDggQEAKIAogICAgIGJvb2wgZ2V0Q2FjaGVkRHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUHJlc2VudGF0aW9ucyhzaXplX3QgdHJhY2tJZHgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdU1lZGlhRXh0cmFjdG9yKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODM3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9HR19XUklURVJfSF8KKworI2RlZmluZSBPR0dfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT2dnV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBPZ2dXcml0ZXIoaW50IGZkKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSogcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJvdGVjdGVkOgorICAgIH5PZ2dXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgaW50NjRfdCBtU2FtcGxlUmF0ZTsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWRTaXplQnl0ZXM7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkRHVyYXRpb25VczsKKworICAgIHN0YXRpYyB2b2lkKiBUaHJlYWRXcmFwcGVyKHZvaWQqKTsKKyAgICBzdGF0dXNfdCB0aHJlYWRGdW5jKCk7CisgICAgYm9vbCBleGNlZWRzRmlsZVNpemVMaW1pdCgpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCk7CisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKworICAgIGludDMyX3QgbUN1cnJlbnRQYWNrZXRJZDsKKyAgICBPZ2dTdHJlYW1TdGF0ZSogbU9zID0gbnVsbHB0cjsKKworICAgIE9nZ1dyaXRlcihjb25zdCBPZ2dXcml0ZXImKTsKKyAgICBPZ2dXcml0ZXImIG9wZXJhdG9yPShjb25zdCBPZ2dXcml0ZXImKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT0dHX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCmluZGV4IDI4ZjYwOTQuLjE0MTBhMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKQEAgLTIzLDggKzIzLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE9teEluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworcHJpdmF0ZToKKyAgICBib29sIG1BbGxvd1N1cmZhY2VFbmNvZGVyczsgLy8gYWxsb3cgc3VyZmFjZSBlbmNvZGVycworCiBwdWJsaWM6Ci0gICAgT214SW5mb0J1aWxkZXIoKTsKKyAgICBleHBsaWNpdCBPbXhJbmZvQnVpbGRlcihib29sIGFsbG93U3VyZmFjZUVuY29kZXJzKTsKICAgICB+T214SW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTA5ZTY2OS4uOTkyNTExNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBSRU1PVEVfTUVESUFfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKaW5kZXggMWQ3MjBhZi4uMDNkMzg2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaApAQCAtMzcsMTIgKzM3LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAogICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcyk7CiAKIHByaXZhdGU6CiAgICAgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7Ci0gICAgTWVkaWFUcmFjayAqbVNvdXJjZTsKKyAgICBNZWRpYVRyYWNrICptVHJhY2s7CiAgICAgc3A8UmVmQmFzZT4gbUV4dHJhY3RvclBsdWdpbjsKIAogICAgIGV4cGxpY2l0IFJlbW90ZU1lZGlhU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IDZhMjhlMGIuLmU4ZTBhMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTMwLDYgKzMwLDggQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKK3N0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CiB2b2lkIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIHNwPE1ldGFEYXRhPiAmbWV0YSk7CkBAIC01MCw2ICs1MiwxMCBAQAogLy8gU2VuZCBpbmZvcm1hdGlvbiBmcm9tIE1ldGFEYXRhIHRvIHRoZSBIQUwgdmlhIEF1ZGlvU2luawogc3RhdHVzX3Qgc2VuZE1ldGFEYXRhVG9IYWwoc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+JiBzaW5rLCBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogCisvLyBSZXR1cm4gfGF1ZGlvX29mZmxvYWRfaW5mb190fCBmaWxsZWQgZnJvbSBnaXZlbiBtZXRhZGF0YQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pOworCiAvLyBDaGVjayB3aGV0aGVyIHRoZSBzdHJlYW0gZGVmaW5lZCBieSBtZXRhIGNhbiBiZSBvZmZsb2FkZWQgdG8gaGFyZHdhcmUKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKaW5kZXggOWQ5N2RmZC4uZmNmY2JlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNyw4NyArMTcsMjQgQEAKICNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCiAjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSVN1cmZhY2VDb21wb3NlcjsKIAotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CiAgICAgVmlkZW9GcmFtZVNjaGVkdWxlcigpOwotCi0gICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCi0gICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOwotICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlawotICAgIHZvaWQgcmVzdGFydCgpOwotICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQotICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKLQotICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQotICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKLQotICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCi0gICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7Ci0KLSAgICB2b2lkIHJlbGVhc2UoKTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKIAogcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUExMIHsKLSAgICAgICAgUExMKCk7Ci0KLSAgICAgICAgLy8gcmVzZXQgUExMIHRvIG5ldyBQTEwKLSAgICAgICAgdm9pZCByZXNldChmbG9hdCBmcHMgPSAtMSk7Ci0gICAgICAgIC8vIGtlZXAgY3VycmVudCBlc3RpbWF0ZSwgYnV0IHJlc3RhcnQgcGhhc2UKLSAgICAgICAgdm9pZCByZXN0YXJ0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgcGVyaW9kIG9yIDAgaWYgbm90IHlldCBwcmltZWQKLSAgICAgICAgbnNlY3NfdCBhZGRTYW1wbGUobnNlY3NfdCB0aW1lKTsKLSAgICAgICAgbnNlY3NfdCBnZXRQZXJpb2QoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIG5zZWNzX3QgbVBlcmlvZDsKLSAgICAgICAgbnNlY3NfdCBtUGhhc2U7Ci0KLSAgICAgICAgYm9vbCAgICBtUHJpbWVkOyAgICAgICAgLy8gaGF2ZSBhbiBlc3RpbWF0ZSBmb3IgdGhlIHBlcmlvZAotICAgICAgICBzaXplX3QgIG1TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0KLSAgICAgICAgbnNlY3NfdCBtTGFzdFRpbWU7ICAgICAgLy8gbGFzdCBpbnB1dCB0aW1lCi0gICAgICAgIG5zZWNzX3QgbVJlZml0QXQ7ICAgICAgIC8vIG5leHQgaW5wdXQgdGltZSB0byBmaXQgYXQKLQotICAgICAgICBzaXplX3QgIG1OdW1TYW1wbGVzOyAgICAvLyBjYW4gZ28gcGFzdCBrSGlzdG9yeVNpemUKLSAgICAgICAgbnNlY3NfdCBtVGltZXNba0hpc3RvcnlTaXplXTsKLQotICAgICAgICB2b2lkIHRlc3QoKTsKLSAgICAgICAgLy8gcmV0dXJucyB3aGV0aGVyIGZpdCB3YXMgc3VjY2Vzc2Z1bAotICAgICAgICBib29sIGZpdChuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKTsKLSAgICAgICAgdm9pZCBwcmltZShzaXplX3QgbnVtU2FtcGxlcyk7Ci0gICAgfTsKLQotICAgIHZvaWQgdXBkYXRlVnN5bmMoKTsKLQotICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKLSAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKLSAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbwotCi0gICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKLSAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKLQotICAgIFBMTCBtUGxsOyAgICAgICAgICAgICAgICAgIC8vIFBMTCBmb3IgdmlkZW8gZnJhbWUgcmF0ZSBiYXNlZCBvbiByZW5kZXIgdGltZQotCisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOwogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXIpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWI5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfMl9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBWc3luY1RyYWNrZXI7CitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZDsKKworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIyIDogcHVibGljIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOworICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZVZzeW5jKCkgb3ZlcnJpZGU7CisKKyAgICBuc2Vjc190IG1BcHBWc3luY09mZnNldDsKKyAgICBuc2Vjc190IG1TZlZzeW5jT2Zmc2V0OworICAgIHNwPFZzeW5jVHJhY2tlcj4gbVZzeW5jVHJhY2tlcjsKKyAgICBzcDxDaG9yZW9ncmFwaGVyVGhyZWFkPiBtQ2hvcmVvZ3JhcGhlclRocmVhZDsKKyAgICBNdXRleCBtTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVmNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9CQVNFX0hfCisjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIDogcHVibGljIFJlZkJhc2UgeworICAgIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCk7CisKKyAgICAvLyAocmUpaW5pdGlhbGl6ZSBzY2hlZHVsZXIKKyAgICB2b2lkIGluaXQoZmxvYXQgdmlkZW9GcHMgPSAtMSk7CisgICAgLy8gdXNlIGluIGNhc2Ugb2YgdmlkZW8gcmVuZGVyLXRpbWUgZGlzY29udGludWl0eSwgZS5nLiBzZWVrCisgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgLy8gZ2V0IGFkanVzdGVkIG5hbm90aW1lIGZvciBhIHZpZGVvIGZyYW1lIHJlbmRlciBhdCByZW5kZXJUaW1lCisgICAgbnNlY3NfdCBzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpOworCisgICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworCisgICAgLy8gcmV0dXJucyB0aGUgY3VycmVudCBmcmFtZXMtcGVyLXNlY29uZCwgb3IgMC5mIGlmIG5vdCBwcmltZWQKKyAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGlzdG9yeVNpemUgPSA4OworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0VnN5bmNQZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7ICAvLyA2MEh6CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgbnNlY3NfdCBtVnN5bmNUaW1lOyAgICAgICAgLy8gdnN5bmMgdGltaW5nIGZyb20gZGlzcGxheQorICAgIG5zZWNzX3QgbVZzeW5jUGVyaW9kOworICAgIG5zZWNzX3QgbVZzeW5jUmVmcmVzaEF0OyAgIC8vIG5leHQgdGltZSB0byByZWZyZXNoIHRpbWluZyBpbmZvCisKK3ByaXZhdGU6CisgICAgc3RydWN0IFBMTCB7CisgICAgICAgIFBMTCgpOworCisgICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCisgICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOworICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCisgICAgICAgIHZvaWQgcmVzdGFydCgpOworICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCisgICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7CisgICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgICAgIG5zZWNzX3QgbVBoYXNlOworCisgICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKKyAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOworCisgICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQorICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0CisKKyAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCisgICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07CisKKyAgICAgICAgdm9pZCB0ZXN0KCk7CisgICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7CisgICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlVnN5bmMoKSA9IDA7CisKKyAgICBuc2Vjc190IG1MYXN0VnN5bmNUaW1lOyAgICAvLyBlc3RpbWF0ZWQgdnN5bmMgdGltZSBmb3IgbGFzdCBmcmFtZQorICAgIG5zZWNzX3QgbVRpbWVDb3JyZWN0aW9uOyAgIC8vIHJ1bm5pbmcgYWRqdXN0bWVudAorICAgIFBMTCBtUGxsOyAgICAgICAgICAgICAgICAgIC8vIFBMTCBmb3IgdmlkZW8gZnJhbWUgcmF0ZSBiYXNlZCBvbiByZW5kZXIgdGltZQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDc0NTI5MDEuLjE0ODIwNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTIzLDEwICsyMywxMCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTQ2LDEyICs0NiwxMyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIGhhcmR3YXJlOjpIaWRsTWVtb3J5OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7CiB1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwordHlwZWRlZiBoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3IgVEFsbG9jYXRvcjsKK3R5cGVkZWYgaGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5IFRNZW1vcnk7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0xMTcsMTUgKzExOCwxMiBAQAogICAgIHZvaWQgc2lnbmFsTmV3U2FtcGxlQWVzS2V5KGNvbnN0IHNwPEFNZXNzYWdlPiAma2V5SXRlbSk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFN0cmVhbUluZm8gewotICAgICAgICB1bnNpZ25lZCBtVHlwZTsKLSAgICAgICAgdW5zaWduZWQgbVBJRDsKLSAgICAgICAgaW50MzJfdCBtQ0FTeXN0ZW1JZDsKLSAgICB9OwogCiAgICAgQVRTUGFyc2VyICptUGFyc2VyOwogICAgIHVuc2lnbmVkIG1Qcm9ncmFtTnVtYmVyOwogICAgIHVuc2lnbmVkIG1Qcm9ncmFtTWFwUElEOworICAgIHVpbnQzMl90IG1QTVRWZXJzaW9uOworICAgIHVpbnQzMl90IG1QTVRfQ1JDOwogICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxTdHJlYW0+ID4gbVN0cmVhbXM7CiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKICAgICB1aW50NjRfdCBtRmlyc3RQVFM7CkBAIC0xNDIsMTUgKzE0MCwxNSBAQAogfTsKIAogc3RydWN0IEFUU1BhcnNlcjo6U3RyZWFtIDogcHVibGljIFJlZkJhc2UgewotICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLAotICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElELAotICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlLAotICAgICAgICAgICB1bnNpZ25lZCBQQ1JfUElELAotICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9JRCk7CisgICAgU3RyZWFtKFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pOwogCiAgICAgdW5zaWduZWQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CisgICAgdW5zaWduZWQgdHlwZUV4dCgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlRXh0OyB9CiAgICAgdW5zaWduZWQgcGlkKCkgY29uc3QgeyByZXR1cm4gbUVsZW1lbnRhcnlQSUQ7IH0KICAgICB2b2lkIHNldFBJRCh1bnNpZ25lZCBwaWQpIHsgbUVsZW1lbnRhcnlQSUQgPSBwaWQ7IH0KKyAgICB2b2lkIHNldEF1ZGlvUHJlc2VudGF0aW9ucyhBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gYXVkaW9QcmVzZW50YXRpb25zKSB7CisgICAgICAgIG1BdWRpb1ByZXNlbnRhdGlvbnMgPSBhdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfQogCiAgICAgdm9pZCBzZXRDYXNJbmZvKAogICAgICAgICAgICAgaW50MzJfdCBzeXN0ZW1JZCwKQEAgLTE5NCw2ICsxOTIsNyBAQAogICAgIFByb2dyYW0gKm1Qcm9ncmFtOwogICAgIHVuc2lnbmVkIG1FbGVtZW50YXJ5UElEOwogICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlOworICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlRXh0OwogICAgIHVuc2lnbmVkIG1QQ1JfUElEOwogICAgIGludDMyX3QgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXI7CiAKQEAgLTIxMCwxMyArMjA5LDE2IEBACiAgICAgYm9vbCBtU2NyYW1ibGVkOwogICAgIGJvb2wgbVNhbXBsZUVuY3J5cHRlZDsKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07Ci0gICAgc3A8SU1lbW9yeT4gbU1lbTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7Ci0gICAgc3A8SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgc3A8VE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgc3A8VEFsbG9jYXRvcj4gbUhpZGxBbGxvY2F0b3I7CiAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOworICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBtQXVkaW9QcmVzZW50YXRpb25zOworCisgICAgLy8gU2VuZCBhdWRpbyBwcmVzZW50YXRpb25zIGFsb25nIHdpdGggYWNjZXNzIHVuaXRzLgorICAgIHZvaWQgYWRkQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgLy8gRmx1c2ggYWNjdW11bGF0ZWQgcGF5bG9hZCBpZiBuZWNlc3NhcnkgLS0tIGkuZS4gYXQgRU9TIG9yIGF0IHRoZSBzdGFydCBvZgogICAgIC8vIGFub3RoZXIgcGF5bG9hZC4gZXZlbnQgaXMgc2V0IGlmIHRoZSBmbHVzaGVkIHBheWxvYWQgaXMgUEVTIHdpdGggYSBzeW5jCkBAIC0yOTksNiArMzAxLDggQEAKICAgICA6IG1QYXJzZXIocGFyc2VyKSwKICAgICAgIG1Qcm9ncmFtTnVtYmVyKHByb2dyYW1OdW1iZXIpLAogICAgICAgbVByb2dyYW1NYXBQSUQocHJvZ3JhbU1hcFBJRCksCisgICAgICBtUE1UVmVyc2lvbigweGZmZmZmZmZmKSwKKyAgICAgIG1QTVRfQ1JDKDB4ZmZmZmZmZmYpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAogICAgICAgbUZpcnN0UFRTKDApLAogICAgICAgbUxhc3RSZWNvdmVyZWRQVFMobGFzdFJlY292ZXJlZFBUUykgewpAQCAtNDQ3LDcgKzQ1MSw3IEBACiAgICAgICAgIGlmIChkZXNjcmlwdG9yX2xlbmd0aCA+IGluZm9MZW5ndGgpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSA5ICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgewogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CiAgICAgICAgICAgICBjYURlc2NyaXB0b3ItPm1QSUQgPSBici0+Z2V0Qml0cygxNikgJiAweDFmZmY7CkBAIC00ODYsNyArNDkwLDEzIEBACiAKICAgICBNWV9MT0dWKCIgIHByb2dyYW1fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cygxNikpOwogICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKLSAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg1KSk7CisgICAgYm9vbCBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gZmFsc2U7CisgICAgdW5zaWduZWQgcG10VmVyc2lvbiA9IGJyLT5nZXRCaXRzKDUpOworICAgIGlmIChwbXRWZXJzaW9uICE9IG1QTVRWZXJzaW9uKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UVmVyc2lvbiA9IHBtdFZlcnNpb247CisgICAgfQorICAgIE1ZX0xPR1YoIiAgdmVyc2lvbl9udW1iZXIgPSAldSIsIHBtdFZlcnNpb24pOwogICAgIE1ZX0xPR1YoIiAgY3VycmVudF9uZXh0X2luZGljYXRvciA9ICV1IiwgYnItPmdldEJpdHMoMSkpOwogICAgIE1ZX0xPR1YoIiAgc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKICAgICBNWV9MT0dWKCIgIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKQEAgLTUxMyw0MyArNTIzLDE2NiBAQAogICAgIC8vIGluZm9CeXRlc1JlbWFpbmluZyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWFrZSB1cCB0aGUKICAgICAvLyB2YXJpYWJsZSBsZW5ndGggc2VjdGlvbiBvZiBFU19pbmZvcy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUKICAgICAvLyBmaW5hbCBDUkMuCi0gICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OworICAgIGludDMyX3QgaW5mb0J5dGVzUmVtYWluaW5nID0gc2VjdGlvbl9sZW5ndGggLSA5IC0gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDQ7CiAKICAgICB3aGlsZSAoaW5mb0J5dGVzUmVtYWluaW5nID49IDUpIHsKLQotICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlID0gYnItPmdldEJpdHMoOCk7Ci0gICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBzdHJlYW1UeXBlKTsKLQorICAgICAgICBTdHJlYW1JbmZvIGluZm87CisgICAgICAgIGluZm8ubVR5cGUgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgQUxPR1YoIiAgICBzdHJlYW1fdHlwZSA9IDB4JTAyeCIsIGluZm8ubVR5cGUpOwogICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDMpKTsKIAotICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElEID0gYnItPmdldEJpdHMoMTMpOwotICAgICAgICBBTE9HVigiICAgIGVsZW1lbnRhcnlfUElEID0gMHglMDR4IiwgZWxlbWVudGFyeVBJRCk7CisgICAgICAgIGluZm8ubVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKKyAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGluZm8ubVBJRCk7CiAKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cyg0KSk7CiAKICAgICAgICAgdW5zaWduZWQgRVNfaW5mb19sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgICAgIEFMT0dWKCIgICAgRVNfaW5mb19sZW5ndGggPSAldSIsIEVTX2luZm9fbGVuZ3RoKTsKKyAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKIAogICAgICAgICBDQURlc2NyaXB0b3Igc3RyZWFtQ0E7Ci0gICAgICAgIGJvb2wgaGFzU3RyZWFtQ0EgPSBmaW5kQ0FEZXNjcmlwdG9yKGJyLCBFU19pbmZvX2xlbmd0aCwgJnN0cmVhbUNBKTsKKyAgICAgICAgaW5mby5tVHlwZUV4dCA9IEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVg7CisKKyAgICAgICAgaW5mby5tQXVkaW9QcmVzZW50YXRpb25zLmNsZWFyKCk7CisgICAgICAgIGJvb2wgaGFzU3RyZWFtQ0EgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKEVTX2luZm9fbGVuZ3RoID4gMiAmJiBpbmZvQnl0ZXNSZW1haW5pbmcgPj0gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl90YWcgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIEFMT0dWKCIgICAgICB0YWcgPSAweCUwMngiLCBkZXNjcmlwdG9yX3RhZyk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgbGVuID0gJXUiLCBkZXNjcmlwdG9yX2xlbmd0aCk7CisKKyAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBFU19pbmZvX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9DQSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgICAgICAgICAgaGFzU3RyZWFtQ0EgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1TeXN0ZW1JRCA9IGJyLT5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoIC09IDQ7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVByaXZhdGVEYXRhLmFzc2lnbihici0+ZGF0YSgpLCBici0+ZGF0YSgpICsgZGVzY3JpcHRvcl9sZW5ndGgpOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLm1UeXBlID09IFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQSAmJgorICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NUYWdFeHQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnX2V4dCA9IDB4JTAyeCIsIGRlc2NUYWdFeHQpOworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgLy8gVGhlIEFDNCBkZXNjcmlwdG9yIGlzIHVzZWQgaW4gdGhlIFBTSSBQTVQgdG8gaWRlbnRpZnkgc3RyZWFtcyB3aGljaCBjYXJyeSBBQzQKKyAgICAgICAgICAgICAgICAvLyBhdWRpby4KKyAgICAgICAgICAgICAgICBpZiAoZGVzY1RhZ0V4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FVRElPX1BSRVNFTEVDVElPTiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMTAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3ByZXNlbGVjdGlvbnMgPSBici0+Z2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKDMpOyAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9wcmVzZWxlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1QcmVzZW50YXRpb25JZCA9IGJyLT5nZXRCaXRzKDUpOyAgLy8gcHJlc2VsZWN0aW9uX2lkCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvX3JlbmRlcmluZ19pbmRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IHN0YXRpY19jYXN0PE1hc3RlcmluZ0luZGljYXRpb24+KGJyLT5nZXRCaXRzKDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVyYWN0aXZpdHlfZW5hYmxlZCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ZX0xPR1YoIiAgICAgIGludGVyYWN0aXZpdHlfZW5hYmxlZCA9ICVkIiwgaW50ZXJhY3Rpdml0eV9lbmFibGVkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsYW5ndWFnZV9jb2RlX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRleHRfbGFiZWxfcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdWx0aV9zdHJlYW1faW5mb19wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmdXR1cmVfZXh0ZW5zaW9uID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlX2NvZGVfcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDI0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGFuZ3VhZ2VbNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMF0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsxXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzJdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IFN0cmluZzgobGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1hcHMgdGhlIHByZXNlbnRhdGlvbiBpZCB0byB0aGUgbWVzc2FnZSBpZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVYVF9ERVNDUklQVE9SX0RWQl9NRVNTQUdFIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgcHJlc2VudGF0aW9uIGxhYmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfbGFiZWxfcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWVzc2FnZV9pZCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ZX0xPR1YoIiAgICAgIG1lc3NhZ2VfaWQgPSAldSIsIG1lc3NhZ2VfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2F1eF9jb21wb25lbnRzID0gYnItPmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKDUpOyAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAobnVtX2F1eF9jb21wb25lbnRzICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKG51bV9hdXhfY29tcG9uZW50cyAqIDgpOyAgLy8gY29tcG9uZW50X3RhZworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1dHVyZV9leHRlbnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggPSBici0+Z2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAoZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggKiA4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggKiA4KTsgIC8vIGZ1dHVyZV9leHRlbnNpb25fYnl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tQXVkaW9QcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKGhhc1N0cmVhbUNBICYmICFtUGFyc2VyLT5tQ2FzTWFuYWdlci0+YWRkU3RyZWFtKAotICAgICAgICAgICAgICAgIG1Qcm9ncmFtTnVtYmVyLCBlbGVtZW50YXJ5UElELCBzdHJlYW1DQSkpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgaW5mby5tUElELCBzdHJlYW1DQSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KLSAgICAgICAgU3RyZWFtSW5mbyBpbmZvOwotICAgICAgICBpbmZvLm1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgaW5mby5tUElEID0gZWxlbWVudGFyeVBJRDsKLSAgICAgICAgaW5mby5tQ0FTeXN0ZW1JZCA9IGhhc1Byb2dyYW1DQSA/IHByb2dyYW1DQS5tU3lzdGVtSUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3RyZWFtQ0EgPyBzdHJlYW1DQS5tU3lzdGVtSUQgIDogLTE7Ci0gICAgICAgIGluZm9zLnB1c2goaW5mbyk7CisgICAgICAgIGlmIChoYXNQcm9ncmFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHByb2dyYW1DQTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNTdHJlYW1DQSkgeworICAgICAgICAgICAgaW5mby5tQ0FEZXNjcmlwdG9yID0gc3RyZWFtQ0E7CisgICAgICAgIH0KIAotICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOworICAgICAgICBpbmZvcy5wdXNoKGluZm8pOwogICAgIH0KIAogICAgIGlmIChpbmZvQnl0ZXNSZW1haW5pbmcgIT0gMCkgewogICAgICAgICBBTE9HVygiU2VjdGlvbiBkYXRhIHJlbWFpbnMgdW5jb25zdW1lZCIpOwogICAgIH0KLSAgICBNWV9MT0dWKCIgIENSQyA9IDB4JTA4eCIsIGJyLT5nZXRCaXRzKDMyKSk7CisgICAgdW5zaWduZWQgY3JjID0gYnItPmdldEJpdHMoMzIpOworICAgIGlmIChjcmMgIT0gbVBNVF9DUkMpIHsKKyAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1QTVRfQ1JDID0gY3JjOworICAgIH0KKyAgICBNWV9MT0dWKCIgIENSQyA9IDB4JTA4eCIsIGNyYyk7CiAKICAgICBib29sIFBJRHNDaGFuZ2VkID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewpAQCAtNjAxLDE2ICs3MzQsMTkgQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1zLmluZGV4T2ZLZXkoaW5mby5tUElEKTsKIAogICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgUENSX1BJRCwgaW5mby5tQ0FTeXN0ZW1JZCk7CisgICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpcywgUENSX1BJRCwgaW5mbyk7CiAKICAgICAgICAgICAgIGlmIChtU2FtcGxlQWVzS2V5SXRlbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtLT5zaWduYWxOZXdTYW1wbGVBZXNLZXkobVNhbXBsZUFlc0tleUl0ZW0pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQVN5c3RlbUlkID49IDA7CisgICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDA7CiAgICAgICAgICAgICBtU3RyZWFtcy5hZGQoaW5mby5tUElELCBzdHJlYW0pOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGluZGV4ID49IDAgJiYgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaW5kZXgpLT5pc0F1ZGlvKCkKKyAgICAgICAgICAgICAgICAgJiYgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCkgeworICAgICAgICAgICAgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaW5kZXgpLT5zZXRBdWRpb1ByZXNlbnRhdGlvbnMoaW5mby5tQXVkaW9QcmVzZW50YXRpb25zKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSkgewpAQCAtNzE3LDM0ICs4NTMsMzMgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga0luaXRpYWxTdHJlYW1CdWZmZXJTaXplID0gMTkyICogMTAyNDsKIAogQVRTUGFyc2VyOjpTdHJlYW06OlN0cmVhbSgKLSAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpCisgICAgICAgIFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pCiAgICAgOiBtUHJvZ3JhbShwcm9ncmFtKSwKLSAgICAgIG1FbGVtZW50YXJ5UElEKGVsZW1lbnRhcnlQSUQpLAotICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICBtRWxlbWVudGFyeVBJRChpbmZvLm1QSUQpLAorICAgICAgbVN0cmVhbVR5cGUoaW5mby5tVHlwZSksCisgICAgICBtU3RyZWFtVHlwZUV4dChpbmZvLm1UeXBlRXh0KSwKICAgICAgIG1QQ1JfUElEKFBDUl9QSUQpLAogICAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIoLTEpLAogICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKICAgICAgIG1FT1NSZWFjaGVkKGZhbHNlKSwKICAgICAgIG1QcmV2UFRTKDApLAogICAgICAgbVF1ZXVlKE5VTEwpLAotICAgICAgbVNjcmFtYmxlZChDQV9zeXN0ZW1fSUQgPj0gMCkgewotCisgICAgICBtU2NyYW1ibGVkKGluZm8ubUNBRGVzY3JpcHRvci5tU3lzdGVtSUQgPj0gMCksCisgICAgICBtQXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucykgewogICAgIG1TYW1wbGVFbmNyeXB0ZWQgPQogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEICB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEOwogCiAgICAgQUxPR1YoIm5ldyBzdHJlYW0gUElEIDB4JTAyeCwgdHlwZSAweCUwMngsIHNjcmFtYmxlZCAlZCwgU2FtcGxlRW5jcnlwdGVkOiAlZCIsCi0gICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlLCBtU2NyYW1ibGVkLCBtU2FtcGxlRW5jcnlwdGVkKTsKKyAgICAgICAgICAgIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9Ci0gICAgICAgICAgICAoaXNWaWRlbygpICYmIG1TY3JhbWJsZWQpID8gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TY3JhbWJsZWREYXRhIDoKLSAgICAgICAgICAgIChtU2FtcGxlRW5jcnlwdGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2FtcGxlRW5jcnlwdGVkRGF0YSA6Ci0gICAgICAgICAgICAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAoKChpc1ZpZGVvKCkgfHwgaXNBdWRpbygpKSAmJiBtU2NyYW1ibGVkKSkgeworICAgICAgICBmbGFncyA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YTsKKyAgICB9IGVsc2UgaWYgKG1TYW1wbGVFbmNyeXB0ZWQpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGE7CisgICAgfQogCiAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNb2RlIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OklOVkFMSUQ7CiAKQEAgLTc4MSwxMyArOTE2LDIzIEBACiAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzM7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfRUFDMzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkVBQzM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEE7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInN0cmVhbSBQSUQgMHglMDJ4IGhhcyBpbnZhbGlkIHN0cmVhbSB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtODA3LDcgKzk1MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpc0F1ZGlvKCkgPyBNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEKTsKICAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgQ0Ffc3lzdGVtX0lEKTsKKyAgICAgICAgICAgIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvciA9IGluZm8ubUNBRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBUHJpdmF0ZURhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEuc2l6ZSgpKTsKKwogICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICB9CiAgICAgfQpAQCAtODI3LDE2ICs5NzgsNDMgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPT0gTlVMTCA/IDAgOiBtQnVmZmVyLT5jYXBhY2l0eSgpLCBuZWVkZWRTaXplLCBtU2NyYW1ibGVkKTsKIAogICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciwgbmV3U2NyYW1ibGVkQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG5ld01lbTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG5ld0RlYWxlcjsKKyAgICBzcDxUTWVtb3J5PiBuZXdNZW07CiAgICAgaWYgKG1TY3JhbWJsZWQpIHsKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyAoYWxpZ25tZW50IC0gMSkpICYgfihhbGlnbm1lbnQgLSAxKTsKLSAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwotICAgICAgICBuZXdEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG5lZWRlZFNpemUsICJBVFNQYXJzZXIiKTsKLSAgICAgICAgbmV3TWVtID0gbmV3RGVhbGVyLT5hbGxvY2F0ZShuZWVkZWRTaXplKTsKLSAgICAgICAgbmV3U2NyYW1ibGVkQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3TWVtLT5wb2ludGVyKCksIG5ld01lbS0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1IaWRsQWxsb2NhdG9yID0gVEFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgICAgICAgICBpZiAobUhpZGxBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBjYW4ndCBnZXQgaGlkbCBhbGxvY2F0b3IiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGlkbF9tZW1vcnkgaGlkbE1lbVRva2VuOworICAgICAgICBib29sIHN1Y2Nlc3M7CisgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtSGlkbEFsbG9jYXRvci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbmVlZGVkU2l6ZSwKKyAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZoaWRsTWVtVG9rZW5dKAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQgYXQgdGhlIHRyYW5zcG9ydDogJXMiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgdHJhbnNTdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWVtID0gbWFwTWVtb3J5KGhpZGxNZW1Ub2tlbik7CisgICAgICAgIGlmIChuZXdNZW0gPT0gbnVsbHB0ciB8fCBuZXdNZW0tPmdldFBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBmYWlsZWQgdG8gbWFwIG1lbW9yeSIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+Z2V0UG9pbnRlcigpLCBuZXdNZW0tPmdldFNpemUoKSk7CiAKICAgICAgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkobmV3U2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksCkBAIC04NDUsMjQgKzEwMjMsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgICAgIH0KLSAgICAgICAgbU1lbSA9IG5ld01lbTsKLSAgICAgICAgbURlYWxlciA9IG5ld0RlYWxlcjsKKyAgICAgICAgbUhpZGxNZW1vcnkgPSBuZXdNZW07CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKIAotICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gaGlkbE1lbVRva2VuOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gMFVMTDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAgKHVpbnQ2NF90KW5lZWRlZFNpemU7CiAKLSAgICAgICAgbUhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOwotCi0gICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgb2Zmc2V0ICV6ZCwgc2l6ZSAlenUiLAotICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBvZmZzZXQsIHNpemUpOworICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbmVlZGVkU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtOTg2LDkgKzExNTUsMTIgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzQ3LDcgKzE1MTksNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobURlc2NyYW1ibGVkQnVmZmVyID09IE5VTEwgfHwgbU1lbSA9PSBOVUxMKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1IaWRsTWVtb3J5ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJlY2VpdmVkIHNjcmFtYmxlZCBwYWNrZXRzIHdpdGhvdXQgc2hhcmVkIG1lbW9yeSEiKTsKIAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTEzOTUsNyArMTU2Nyw3IEBACiAgICAgLy8gUGVyZm9ybSB0aGUgMXN0IHBhc3MgZGVzY3JhbWJsaW5nIGlmIG5lZWRlZAogICAgIGlmIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSB7CiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwotICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CisgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CiAgICAgICAgIHN1YlNhbXBsZXMucmVzaXplKGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKQEAgLTE0MTIsMTAgKzE1ODQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdWludDY0X3Qgc3JjT2Zmc2V0ID0gMCwgZHN0T2Zmc2V0ID0gMDsKLSAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBzaG91bGQgYmUgc2tpcHBlZAorICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgogICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgc3JjT2Zmc2V0ID0gZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CiAgICAgICAgIH0KIApAQCAtMTQzMSw5ICsxNjAyLDkgQEAKICAgICAgICAgICAgICAgICAoU2NyYW1ibGluZ0NvbnRyb2wpIHNjdHJsLAogICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLAotICAgICAgICAgICAgICAgIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qc3JjT2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAotICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qZHN0T2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZieXRlc1dyaXR0ZW4sICZkZXRhaWxlZEVycm9yXSAoCiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgewpAQCAtMTQ0MiwxNyArMTYxMywyOSBAQAogICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcyIsCi0gICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7Ci0gICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOworCisgICAgICAgIC8vIFNldCBkZXNjcmFtYmxlQnl0ZXMgdG8gdGhlIHJldHVybmVkIHJlc3VsdC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgYmUgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgZGF0YS4KKyAgICAgICAgLy8gKGVnLiB3aGVuIHdlJ3JlIGRlc2NyYW1ibGluZyB0aGUgUEVTIGhlYWRlciBwb3J0aW9uIG9mIGEgc2VjdXJlIHN0cmVhbSwKKyAgICAgICAgLy8gdGhlIHBsdWdpbiBtaWdodCBjdXQgaXQgb2ZmIHJpZ2h0IGFmdGVyIHRoZSBQRVMgaGVhZGVyLikKKyAgICAgICAgZGVzY3JhbWJsZUJ5dGVzID0gYnl0ZXNXcml0dGVuOwogICAgIH0KIAorICAgIC8vIHxidWZmZXJ8IHBvaW50cyB0byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggd2UnZCBwYXJzZSB0aGUgUEVTIGhlYWRlci4KKyAgICAvLyBXaGVuIHRoZSBvdXRwdXQgc3RyZWFtIGlzIHNjcmFtYmxlZCwgaXQgcG9pbnRzIHRvIG1EZXNjcmFtYmxlZEJ1ZmZlcgorICAgIC8vICh1bmxlc3MgYWxsIHBhY2tldHMgaW4gdGhpcyBQRVMgYXJlIGFjdHVhbGx5IGNsZWFyLCBpbiB3aGljaCBjYXNlLAorICAgIC8vIGl0IHBvaW50cyB0byBtQnVmZmVyIHNpbmNlIHdlIG5ldmVyIGNvcGllZCBpbnRvIG1EZXNjcmFtYmxlZEJ1ZmZlcikuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBjbGVhciwgaXQgcG9pbnRzIHRvIG1CdWZmZXIsIGFuZCB3ZSdsbAorICAgIC8vIGNvcHkgYWxsIGRlc2NyYW1ibGVkIGRhdGEgYmFjayB0byBtQnVmZmVyLgorICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1CdWZmZXI7CiAgICAgaWYgKG1RdWV1ZS0+aXNTY3JhbWJsZWQoKSkgewogICAgICAgICAvLyBRdWV1ZSBzdWJTYW1wbGUgaW5mbyBmb3Igc2NyYW1ibGVkIHF1ZXVlCiAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihtU3ViU2FtcGxlcy5zaXplKCkgKiA0KTsKQEAgLTE0NjQsOCArMTY0Nyw3IEBACiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TdWJTYW1wbGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN1YlNhbXBsZXMuZW5kKCk7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKChpdC0+dHJhbnNwb3J0X3NjcmFtYmxpbmdfbW9kZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHBlc1NjcmFtYmxpbmdDb250cm9sID09IDApCi0gICAgICAgICAgICAgICAgICAgIHx8IGkgPCBkZXNjcmFtYmxlU3ViU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNsZWFyU2l6ZVB0cltpXSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgICAgIGVuY1NpemVQdHJbaV0gPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0NzQsMTQgKzE2NTYsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzU3luYyB8PSBpdC0+cmFuZG9tX2FjY2Vzc19pbmRpY2F0b3I7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgorICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgeworICAgICAgICAgICAgY2xlYXJTaXplUHRyWzBdID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgZW5jU2l6ZVB0clswXSAtPSBwZXNPZmZzZXQ7CisgICAgICAgIH0KICAgICAgICAgLy8gUGFzcyB0aGUgb3JpZ2luYWwgVFMgc3Vic2FtcGxlIHNpemUgbm93LiBUaGUgUEVTIGhlYWRlciBhZGp1c3QKICAgICAgICAgLy8gd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIHNjcmFtYmxlZCBBVSBpcyBkZXF1ZXVlZC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IGlmIGRlc2NyYW1ibGVCeXRlcyBpcyAwLCBpdCBtZWFucyB0aGlzIFBFUyBjb250YWlucyBvbmx5CisgICAgICAgIC8vIGFsbCB0cyBwYWNrZXRzLCBsZWFkaW5nQ2xlYXJCeXRlcyBpcyBlbnRpcmUgYnVmZmVyIHNpemUuCiAgICAgICAgIG1RdWV1ZS0+YXBwZW5kU2NyYW1ibGVkRGF0YSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSwgc2N0cmwsCi0gICAgICAgICAgICAgICAgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgKGRlc2NyYW1ibGVCeXRlcyA+IDApID8gZGVzY3JhbWJsZUJ5dGVzIDogbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIHNjdHJsLCBpc1N5bmMsIGNsZWFyU2l6ZXNCdWZmZXIsIGVuY1NpemVzQnVmZmVyKTsKKworICAgICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0gbURlc2NyYW1ibGVkQnVmZmVyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSwgbURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CiAgICAgfQogCi0gICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisgICAgQUJpdFJlYWRlciBicihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZiciwgZXZlbnQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTUxNCw2ICsxNzExLDEzIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6YWRkQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0U3RyZWFtKHN0ZDo6aW9zOjpvdXQpOworICAgIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhtQXVkaW9QcmVzZW50YXRpb25zLCAmb3V0U3RyZWFtKTsKKyAgICBzcDxBQnVmZmVyPiBhcCA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShvdXRTdHJlYW0uc3RyKCkuZGF0YSgpLCBvdXRTdHJlYW0uc3RyKCkuc2l6ZSgpKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0QnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGFwKTsKK30KKwogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCiAgICAgICAgIHVuc2lnbmVkIFBFU19zY3JhbWJsaW5nX2NvbnRyb2wsCkBAIC0xNTY0LDYgKzE3NjgsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvUHJlc2VudGF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJvblBheWxvYWREYXRhOiBjcmVhdGVkIEFub3RoZXJQYWNrZXRTb3VyY2UgUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbVN0cmVhbVR5cGUpOwpAQCAtMTU3Niw2ICsxNzgzLDkgQEAKICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRGb3JtYXQoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c2V0Rm9ybWF0KG1RdWV1ZS0+Z2V0Rm9ybWF0KCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCA0NWNhMDZiLi4wZmYyZDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTE0Miw2ICsxNDMsNyBAQAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX1ZJREVPICAgICAgICAgID0gMHgwMiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMV9BVURJTyAgICAgICAgICA9IDB4MDMsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU8gICAgICAgICAgPSAweDA0LAorICAgICAgICBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgICAgID0gMHgwNiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTICAgICA9IDB4MGYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzRfVklERU8gICAgICAgICAgPSAweDEwLAogICAgICAgICBTVFJFQU1UWVBFX01FVEFEQVRBICAgICAgICAgICAgID0gMHgxNSwKQEAgLTE1Myw2ICsxNTUsNyBAQAogICAgICAgICAvLyBTdHJlYW0gdHlwZSAweDgzIGlzIG5vbi1zdGFuZGFyZCwKICAgICAgICAgLy8gaXQgY291bGQgYmUgTFBDTSBvciBUcnVlSEQgQUMzCiAgICAgICAgIFNUUkVBTVRZUEVfTFBDTV9BQzMgICAgICAgICAgICAgPSAweDgzLAorICAgICAgICBTVFJFQU1UWVBFX0VBQzMgICAgICAgICAgICAgICAgID0gMHg4NywKIAogICAgICAgICAvL1NhbXBsZSBFbmNyeXB0ZWQgdHlwZXMKICAgICAgICAgU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCAgICAgICA9IDB4REIsCkBAIC0xNjAsNiArMTYzLDIxIEBACiAgICAgICAgIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRCAgICAgICAgPSAweEMxLAogICAgIH07CiAKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRnJvbSBJU08vSUVDIDEzODE4LTE6IDIwMDcgKEUpLCBUYWJsZSAyLTQ1CisgICAgICAgIERFU0NSSVBUT1JfQ0EgICAgICAgICAgICAgICAgICAgPSAweDA5LAorCisgICAgICAgIC8vIERWQiBCbHVlQm9vayBBMDM4IFRhYmxlIDEyCisgICAgICAgIERFU0NSSVBUT1JfRFZCX0VYVEVOU0lPTiAgICAgICAgPSAweDdGLAorICAgIH07CisKKyAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMDkKKyAgICBlbnVtIHsKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCAgICAgICAgICAgICAgICAgID0gMHgxNSwKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX0FVRElPX1BSRVNFTEVDVElPTiAgID0gMHgxOSwKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX1JFU0VSVkVEX01BWCAgICAgICAgID0gMHg3RiwKKyAgICB9OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVRTUGFyc2VyKCk7CiAKQEAgLTE2OSwxMSArMTg3LDIwIEBACiAgICAgc3RydWN0IFBTSVNlY3Rpb247CiAgICAgc3RydWN0IENhc01hbmFnZXI7CiAgICAgc3RydWN0IENBRGVzY3JpcHRvciB7Ci0gICAgICAgIGludDMyX3QgbVN5c3RlbUlEOworICAgICAgICBDQURlc2NyaXB0b3IoKSA6IG1QSUQoMCksIG1TeXN0ZW1JRCgtMSkge30KICAgICAgICAgdW5zaWduZWQgbVBJRDsKKyAgICAgICAgaW50MzJfdCBtU3lzdGVtSUQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Qcml2YXRlRGF0YTsKICAgICB9OwogCisgICAgc3RydWN0IFN0cmVhbUluZm8geworICAgICAgICB1bnNpZ25lZCBtVHlwZTsKKyAgICAgICAgdW5zaWduZWQgbVR5cGVFeHQ7CisgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIENBRGVzY3JpcHRvciBtQ0FEZXNjcmlwdG9yOworICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKyAgICB9OworCiAgICAgc3A8Q2FzTWFuYWdlcj4gbUNhc01hbmFnZXI7CiAKICAgICB1aW50MzJfdCBtRmxhZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggZjlkY2JjOS4uYTUwN2I5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMzAsOSArMzAsMTQgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKaW5kZXggNjZkN2RjMS4uNjJlM2E0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCkBAIC0yMjMsOSArMjIzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGtLZXlNcGVnVXNlckRhdGEsIDAsIG1wZWdVc2VyRGF0YS0+ZGF0YSgpLCBtcGVnVXNlckRhdGEtPnNpemUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBhcDsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsICZhcCkgJiYgYXAgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKAorICAgICAgICAgICAgICAgICAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAwLCBhcC0+ZGF0YSgpLCBhcC0+c2l6ZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY3J5cHRvTW9kZTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b01vZGUiLCAmY3J5cHRvTW9kZSkpIHsKICAgICAgICAgICAgIGludDMyX3QgY3J5cHRvS2V5OworICAgICAgICAgICAgaW50MzJfdCBwZXNPZmZzZXQ7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhckJ5dGVzQnVmZmVyLCBlbmNCeXRlc0J1ZmZlcjsKIAogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3J5cHRvS2V5IiwgJmNyeXB0b0tleSkpOwpAQCAtMjMzLDYgKzI0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICYmIGNsZWFyQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiZW5jQnl0ZXMiLCAmZW5jQnl0ZXNCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICYmIGVuY0J5dGVzQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicGVzT2Zmc2V0IiwgJnBlc09mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBlc09mZnNldCA+PSAwKSAmJiAocGVzT2Zmc2V0IDwgNjU1MzYpKTsKIAogICAgICAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgY3J5cHRvTW9kZSk7CiAKQEAgLTI0MCw2ICsyNDksMTEgQEAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGFycmF5WzBdID0gKHVpbnQ4X3QpIChjcnlwdG9LZXkgJiAweGZmKTsKKyAgICAgICAgICAgIC8vIGFycmF5WzFdIGNvbnRhaW5zIFBFUyBoZWFkZXIgZmxhZywgd2hpY2ggd2UgZG9uJ3QgdXNlLgorICAgICAgICAgICAgLy8gYXJyYXlbMn4zXSBjb250YWluIHRoZSBQRVMgb2Zmc2V0LgorICAgICAgICAgICAgYXJyYXlbMl0gPSAodWludDhfdCkgKHBlc09mZnNldCAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXlbM10gPSAodWludDhfdCkgKChwZXNPZmZzZXQgPj4gOCkgJiAweGZmKTsKKwogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IGM5ZTUxOWYuLmI5MWVkY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtODYsNiArODYsMjEgQEAKICAgICBtQ2FzU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCitzdGF0aWMgaW50MzJfdCByZWFkVmFyaWFibGVCaXRzKEFCaXRSZWFkZXIgJmJpdHMsIGludDMyX3QgbmJpdHMpIHsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpbnQzMl90IG1vcmVfYml0cyA9IDE7CisKKyAgICB3aGlsZSAobW9yZV9iaXRzKSB7CisgICAgICAgIHZhbHVlICs9IGJpdHMuZ2V0Qml0cyhuYml0cyk7CisgICAgICAgIG1vcmVfYml0cyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICAgICAgaWYgKCFtb3JlX2JpdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgdmFsdWUgPDw9IG5iaXRzOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKIC8vIFBhcnNlIEFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKIC8vIHVwZGF0ZSBtZXRhZGF0YSBvbmx5IGFwcGxpY2FibGUsIGFuZCByZXR1cm4gdGhlIHBheWxvYWQgc2l6ZQogc3RhdGljIHVuc2lnbmVkIHBhcnNlQUMzU3luY0ZyYW1lKApAQCAtMTk1LDggKzIxMCwxNTMgQEAKICAgICByZXR1cm4gcGF5bG9hZFNpemU7CiB9CiAKLXN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBQzNIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBwYXJzZUFDM1N5bmNGcmFtZShwdHIsIHNpemUsIE5VTEwpID4gMDsKKy8vIFBhcnNlIEVBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCisvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKKy8vIEFUU0MgQS81MjoyMDEyIEUyLjMuMQorc3RhdGljIHVuc2lnbmVkIHBhcnNlRUFDM1N5bmNGcmFtZSgKKyAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlMltdID0gezI0MDAwLCAyMjA1MCwgMTYwMDB9OworCisgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7CisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGJpdHMgbGVmdCBmb3IgZnVydGhlciBwYXJzaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYml0cy5nZXRCaXRzKDE2KSAhPSAweDBCNzcpIHsKKyAgICAgICAgQUxPR0UoIk5vIHZhbGlkIHN5bmMgd29yZCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyB3ZSBwYXJzZSB1cCB0byBic2lkIHNvIHRoZXJlIG5lZWRzIHRvIGJlIGF0IGxlYXN0IHRoYXQgbWFueSBiaXRzCisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIgKyAzICsgMTEgKyAyICsgMiArIDMgKyAxICsgNSkgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdHJtdHlwID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChzdHJtdHlwID09IDMpIHsKKyAgICAgICAgQUxPR0UoIkluY29ycmVjdCBzdHJtdHlwIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIHN1YnN0cmVhbWlkID0gYml0cy5nZXRCaXRzKDMpOworICAgIC8vIG9ubHkgdGhlIGZpcnN0IGluZGVwZW5kZW50IHN0cmVhbSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpICYmIHN1YnN0cmVhbWlkICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgZnJtc2l6ID0gYml0cy5nZXRCaXRzKDExKTsKKyAgICB1bnNpZ25lZCBmc2NvZCA9IGJpdHMuZ2V0Qml0cygyKTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgaWYgKGZzY29kID09IDB4MykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZDIgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZDIgPT0gMykgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBmc2NvZDIgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICB1bnNpZ25lZCBsZmVvbiA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1bnNpZ25lZCBic2lkID0gYml0cy5nZXRCaXRzKDUpOworICAgIGlmIChic2lkIDwgMTEgfHwgYnNpZCA+IDE2KSB7CisgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBFQUMzIGhlYWRlci4gQ291bGQgYmUgQUMtMyBvciBzb21lIHVua25vd24gRUFDMyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3QgaW5kZXBlbmRhbnQgc3RyZWFtCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwgJiYgKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiRUFDMyBjaGFubmVsQ291bnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFMT0dWKCJFQUMzIHNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSBmcm1zaXogKyAxOworICAgIHBheWxvYWRTaXplIDw8PSAxOyAgLy8gY29udmVydCBmcm9tIDE2LWJpdCB3b3JkcyB0byBieXRlcworCisgICAgcmV0dXJuIHBheWxvYWRTaXplOworfQorCisvLyBQYXJzZSBBQzQgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUKKy8vIGFuZCB1cGRhdGUgZnJhbWVTaXplIGFuZCBtZXRhZGF0YS4KK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUFDNFN5bmNGcmFtZSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSksIEFubmV4IEMKKyAgICAvLyBUaGUgc3luY193b3JkIGNhbiBiZSBlaXRoZXIgMHhBQzQwIG9yIDB4QUM0MS4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTeW5jV29yZEFDNDAgPSAweEFDNDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQxID0gMHhBQzQxOworCisgICAgc2l6ZV90IGhlYWRlclNpemUgPSAwOworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGludDMyX3Qgc3luY1dvcmQgPSBiaXRzLmdldEJpdHMoMTYpOworICAgIGlmICgoc3luY1dvcmQgIT0ga1N5bmNXb3JkQUM0MCkgJiYgKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN5bmN3b3JkIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaGVhZGVyU2l6ZSArPSAyOworCisgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBoZWFkZXJTaXplICs9IDI7CisgICAgaWYgKGZyYW1lU2l6ZSA9PSAweEZGRkYpIHsKKyAgICAgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDI0KTsKKyAgICAgICAgaGVhZGVyU2l6ZSArPSAzOworICAgIH0KKworICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBmcmFtZSBzaXplIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZnJhbWVTaXplICs9IGhlYWRlclNpemU7CisgICAgLy8gSWYgdGhlIHN5bmNfd29yZCBpcyAweEFDNDEsIGEgY3JjX3dvcmQgaXMgYWxzbyB0cmFuc21pdHRlZC4KKyAgICBpZiAoc3luY1dvcmQgPT0ga1N5bmNXb3JkQUM0MSkgeworICAgICAgICBmcmFtZVNpemUgKz0gMjsgLy8gY3JjX3dvcmQKKyAgICB9CisgICAgQUxPR1YoIkFDNCBmcmFtZVNpemUgPSAldSIsIGZyYW1lU2l6ZSk7CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgNi4yLjEuMQorICAgIHVpbnQzMl90IGJpdHN0cmVhbVZlcnNpb24gPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKGJpdHN0cmVhbVZlcnNpb24gPT0gMykgeworICAgICAgICBiaXRzdHJlYW1WZXJzaW9uICs9IHJlYWRWYXJpYWJsZUJpdHMoYml0cywgMik7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cygxMCk7IC8vIFNlcXVlbmNlIENvdW50ZXIKKworICAgIHVpbnQzMl90IGJXYWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDEpOworICAgIGlmIChiV2FpdEZyYW1lcykgeworICAgICAgICB1aW50MzJfdCB3YWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDMpOworICAgICAgICBpZiAod2FpdEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIGJyX2NvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAgVjEuMS4xIFRhYmxlIDgyCisgICAgYm9vbCBmc0luZGV4ID0gYml0cy5nZXRCaXRzKDEpOworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGZzSW5kZXggPyA0ODAwMCA6IDQ0MTAwOworCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0QUM0IFNldHRpbmcgbUZvcm1hdCIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAvLyBbRklYTUVdIEFDNCBjaGFubmVsIGNvdW50IGlzIGRlZmluZWQgcGVyIHByZXNlbnRhdGlvbi4gUHJvdmlkZSBhIGRlZmF1bHQgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBhcyBzdGVyZW8gZm9yIHRoZSBlbnRpcmUgc3RyZWFtLgorICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcihjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCAmZnJhbWVTaXplKSB7CisgICAgcmV0dXJuIHBhcnNlQUM0U3luY0ZyYW1lKHB0ciwgc2l6ZSwgZnJhbWVTaXplLCBOVUxMKTsKIH0KIAogc3RhdGljIGJvb2wgSXNTZWVtaW5nbHlWYWxpZEFEVFNIZWFkZXIoCkBAIC0yNzksNyArNDM5LDggQEAKICAgICAgICAgQUxPR0UoImFwcGVuZGluZyBkYXRhIGFmdGVyIEVPUyIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CisKKyAgICBpZiAoIWlzU2NyYW1ibGVkKCkgJiYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkpIHsKICAgICAgICAgc3dpdGNoIChtTW9kZSkgewogICAgICAgICAgICAgY2FzZSBIMjY0OgogICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgpAQCAtMzkwLDEyICs1NTEsMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBBQzM6CisgICAgICAgICAgICBjYXNlIEVBQzM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpKSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUoJnB0cltpXSwgc2l6ZSAtIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VFQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDA2LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIChFKUFDMyBzeW5jd29yZCBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNiw2ICs1ODQsNDMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBBQzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gQSB2YWxpZCBBQzQgc3RyZWFtIHNob3VsZCBoYXZlIG1pbmltdW0gb2YgNyBieXRlcyBpbiBpdHMgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIChTeW5jIGhlYWRlciA0IGJ5dGVzICsgQUM0IHRvYyAzIGJ5dGVzKQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcigmcHRyW2ldLCBzaXplIC0gaSwgZnJhbWVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUM0IHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemUgIT0gc2l6ZSAtIHN0YXJ0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBQzQgZnJhbWUgc2l6ZSBpcyAldSBieXRlcywgd2hpbGUgdGhlIGJ1ZmZlciBzaXplIGlzICV6ZCBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIHNpemUgLSBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICZwdHJbc3RhcnRPZmZzZXRdOworICAgICAgICAgICAgICAgIHNpemUgLT0gc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgTVBFR19BVURJTzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CkBAIC00OTQsNiArNjk5LDcgQEAKIAogdm9pZCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZFNjcmFtYmxlZERhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgIGludDMyX3Qga2V5SWQsIGJvb2wgaXNTeW5jLAogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcykgewogICAgIGlmICghaXNTY3JhbWJsZWQoKSkgewpAQCAtNTIxLDYgKzcyNyw3IEBACiAKICAgICBTY3JhbWJsZWRSYW5nZUluZm8gc2NyYW1ibGVkSW5mbzsKICAgICBzY3JhbWJsZWRJbmZvLm1MZW5ndGggPSBzaXplOworICAgIHNjcmFtYmxlZEluZm8ubUxlYWRpbmdDbGVhckJ5dGVzID0gbGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgc2NyYW1ibGVkSW5mby5tS2V5SWQgPSBrZXlJZDsKICAgICBzY3JhbWJsZWRJbmZvLm1Jc1N5bmMgPSBpc1N5bmM7CiAgICAgc2NyYW1ibGVkSW5mby5tQ2xlYXJTaXplcyA9IGNsZWFyU2l6ZXM7CkBAIC01MzMsNyArNzQwLDYgQEAKIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpIHsKICAgICBzaXplX3QgbmV4dFNjYW4gPSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgaW50MzJfdCBwZXNPZmZzZXQgPSAwLCBwZXNTY3JhbWJsaW5nQ29udHJvbCA9IDA7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChuZXh0U2NhbiwgJnBlc09mZnNldCwgJnBlc1NjcmFtYmxpbmdDb250cm9sKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CkBAIC01NDQsNiArNzUwLDcgQEAKICAgICAvLyByZXR1cm4gc2NyYW1ibGVkIHVuaXQKICAgICBpbnQzMl90IGtleUlkID0gcGVzU2NyYW1ibGluZ0NvbnRyb2wsIGlzU3luYyA9IDAsIHNjcmFtYmxlZExlbmd0aCA9IDA7CiAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgZW5jU2l6ZXM7CisgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHdoaWxlIChtU2NyYW1ibGVkUmFuZ2VJbmZvcy5zaXplKCkgPiBtUmFuZ2VJbmZvcy5zaXplKCkpIHsKICAgICAgICAgYXV0byBpdCA9IG1TY3JhbWJsZWRSYW5nZUluZm9zLmJlZ2luKCk7CiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBmZXRjaGluZyBzY3JhbWJsZWQgcmFuZ2U6IHNpemU9JXp1IiwgbU1vZGUsIGl0LT5tTGVuZ3RoKTsKQEAgLTU2MSw2ICs3NjgsNyBAQAogICAgICAgICBjbGVhclNpemVzID0gaXQtPm1DbGVhclNpemVzOwogICAgICAgICBlbmNTaXplcyA9IGl0LT5tRW5jU2l6ZXM7CiAgICAgICAgIGlzU3luYyA9IGl0LT5tSXNTeW5jOworICAgICAgICBsZWFkaW5nQ2xlYXJCeXRlcyA9IGl0LT5tTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIG1TY3JhbWJsZWRSYW5nZUluZm9zLmVyYXNlKGl0KTsKICAgICB9CiAgICAgaWYgKHNjcmFtYmxlZExlbmd0aCA9PSAwKSB7CkBAIC01NjgsMjYgKzc3Niw3NCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBza2lwIHRoZSBQRVMgaGVhZGVyLCBhbmQgY29weSB0aGUgcmVzdCBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAotICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCi0gICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCkgKyBwZXNPZmZzZXQsCi0gICAgICAgICAgICBzY3JhbWJsZWRMZW5ndGggLSBwZXNPZmZzZXQpOwotCi0gICAgLy8gZml4IHVwIGZpcnN0IHNhbXBsZSBzaXplIGFmdGVyIHNraXBwaW5nIHRoZSBQRVMgaGVhZGVyCi0gICAgaWYgKHBlc09mZnNldCA+IDApIHsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RDbGVhclNpemUgPSAqKGludDMyX3QqKWNsZWFyU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RFbmNTaXplID0gKihpbnQzMl90KillbmNTaXplcy0+ZGF0YSgpOwotICAgICAgICAvLyBDdXQgYXdheSB0aGUgUEVTIGhlYWRlcgotICAgICAgICBpZiAoZmlyc3RDbGVhclNpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciBUUy1sZXZlbCBzY3JhbWJsaW5nLCB3ZSBkZXNjcmFtYmxlZCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vIChvciBpdCB3YXMgY2xlYXIgdG8gYmVnaW4gd2l0aCkKLSAgICAgICAgICAgIGZpcnN0Q2xlYXJTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdEVuY1NpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGJlIFBFUy1sZXZlbCBzY3JhbWJsaW5nCi0gICAgICAgICAgICBmaXJzdEVuY1NpemUgLT0gcGVzT2Zmc2V0OwotICAgICAgICB9CisgICAgLy8gUmV0cmlldmUgdGhlIGxlYWRpbmcgY2xlYXIgYnl0ZXMgaW5mbywgYW5kIHVzZSBpdCB0byBzZXQgdGhlIGNsZWFyCisgICAgLy8gcmFuZ2Ugb24gbUJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluY2x1ZGVzIHRoZQorICAgIC8vIFBFUyBoZWFkZXIgcG9ydGlvbiwgd2hpbGUgbUJ1ZmZlciBkb2Vzbid0LgorICAgIGlmICgoaW50MzJfdClsZWFkaW5nQ2xlYXJCeXRlcyA+IHBlc09mZnNldCkgeworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBsZWFkaW5nQ2xlYXJCeXRlcyAtIHBlc09mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogCisgICAgLy8gVHJ5IHRvIHBhcnNlIGZvcm1hdHMsIGFuZCBpZiB1bmF2YWlsYWJsZSBzZXQgdXAgYSBkdW1teSBmb3JtYXQuCisgICAgLy8gT25seSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbW9kZXMgZm9yIHNjcmFtYmxlZCBjb250ZW50IGZvciBub3cuCisgICAgLy8gKHdpbGwgYmUgZXhwYW5kZWQgbGF0ZXIpLgorICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgY2FzZSBIMjY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFBQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypwcm9maWxlKi8sIDcgLypzYW1wbGluZ19mcmVxX2luZGV4Ki8sIDEgLypjaGFubmVsX2NvbmZpZyovKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGUgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwKKyAgICAgICAgICAgICAgICAwLCBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOworICAgIH0KKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgLy8gY29weSBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAorICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIHNjcmFtYmxlZExlbmd0aCk7CisKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CkBAIC02MDAsNiArODU2LDcgQEAKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjcnlwdG9LZXkiLCBrZXlJZCk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImNsZWFyQnl0ZXMiLCBjbGVhclNpemVzKTsKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigiZW5jQnl0ZXMiLCBlbmNTaXplcyk7CisgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigicGVzT2Zmc2V0IiwgcGVzT2Zmc2V0KTsKIAogICAgIG1lbW1vdmUobVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgc2NyYW1ibGVkTGVuZ3RoLApAQCAtNjE0LDcgKzg3MSwxMSBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmICgobUZsYWdzICYga0ZsYWdfQWxpZ25lZERhdGEpICYmIG1Nb2RlID09IEgyNjQgJiYgIWlzU2NyYW1ibGVkKCkpIHsKKyAgICBpZiAoaXNTY3JhbWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKKyAgICB9CisKKyAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNjQ4LDcgKzkwOSwxMCBAQAogICAgICAgICBjYXNlIEFBQzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwogICAgICAgICBjYXNlIEFDMzoKLSAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgICAgICBjYXNlIEVBQzM6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgICAgICBjYXNlIE1QRUc0X1ZJREVPOgpAQCAtNjY2LDM0ICs5MzAsMzggQEAKICAgICB9CiB9CiAKLXNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKSB7CitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0RUFDMygpIHsKICAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOyAgLy8gaW4gYnl0ZXMKICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKIAotICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGlmIChzeW5jU3RhcnRQb3MgKyAyID49IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvczsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3M7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZShwdHIsIHNpemUsICZmb3JtYXQpOworICAgICAgICB9CiAgICAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDM1slZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAogICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKIAogICAgICAgICArK3N5bmNTdGFydFBvczsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKLSAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDMyIpOworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgRS9BQzMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDEsNyArOTY5LDYgQEAKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLQogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOwpAQCAtNzEwLDcgKzk3NywxMiBAQAogCiAgICAgLy8gTm90IGRlY3J5cHRpbmcgaWYga2V5IGluZm8gbm90IGF2YWlsYWJsZSAoZS5nLiwgc2Nhbm5lci9leHRyYWN0b3IgcGFyc2luZyB0cyBmaWxlcykKICAgICBpZiAobVNhbXBsZURlY3J5cHRvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgQUxPR0UoIkVBQzMgQVUgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogICAgIG1BVUluZGV4Kys7CiAKQEAgLTczMCw2ICsxMDAyLDY5IEBACiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKSB7CisgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUM0WyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgICAgICAgICAgbUFVSW5kZXgsIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworCisgICAgICAgICsrc3luY1N0YXJ0UG9zOworICAgIH0KKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSkgeworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgQUM0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BVUluZGV4Kys7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKworICAgIG1lbW1vdmUoCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKwogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCkgewogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODUxLDI1ICsxMTg2LDExIEBACiAgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOwotICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCi0KICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTg4NCwxMiArMTIwNSwxMiBAQAogCiAgICAgICAgICAgICBBTE9HSSgiZm91bmQgQUFDIGNvZGVjIGNvbmZpZyAoJWQgSHosICVkIGNoYW5uZWxzKSIsCiAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCi0gICAgICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKKyAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCisgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOworCiAgICAgICAgIC8vIGFkdHNfdmFyaWFibGVfaGVhZGVyCiAKICAgICAgICAgLy8gY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCwgY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0CkBAIC0xMDA0LDI3ICsxMzI1LDYgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKIAogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwpAQCAtMTMyNCwyNSArMTYyNCw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggNGUyZDM5OC4uMTIxYmIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMTI0LDExICsxMjQsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewotICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInF1aXJrOjpyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDQ0N2FmNmYuLjJlMDQxZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC02MSwxMCArNjEsNyBAQAogICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKICAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CiAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KLSAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAotICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgotICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGZhbHNlOyAvLyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLCB1c2luZyByYW5rIGluc3RlYWQKICAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CiAgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGogPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCAxMGI5NWQ5Li40MzgzMDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtNTMsNyArNTMsNiBAQAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgICAgICAibGlidm5ka3N1cHBvcnQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDllZDRhOTkuLjFiODQ5M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTUwLDYgKzE1MCw4IEBACiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDgiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA5IiwgInZpZGVvX2VuY29kZXIudnA5IiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2MSIsICJ2aWRlb19lbmNvZGVyLmF2MSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5yYXciLCAiYXVkaW9fZW5jb2Rlci5yYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLApAQCAtMTY0LDYgKzE2NiwxMCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWMzIiwgImF1ZGlvX2VuY29kZXIuYWMzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzIiwgImF1ZGlvX2VuY29kZXIuZWFjMyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzNfam9jIiwgImF1ZGlvX2VuY29kZXIuZWFjM19qb2MiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWM0IiwgImF1ZGlvX2VuY29kZXIuYWM0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKICAgICAgICAgICAgICJpbWFnZV9kZWNvZGVyLmhlaWMiLCAiaW1hZ2VfZW5jb2Rlci5oZWljIiB9LAogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggNTVhZmUwNC4uZGRiNDU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtSGFuZGxlcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8U2ltcGxlU29mdE9NWENvbXBvbmVudD4odGhpcykpLAogICAgICAgbVN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCi0gICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1GcmFtZUNvbmZpZyhmYWxzZSkgewogICAgIG1Mb29wZXItPnNldE5hbWUobmFtZSk7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKIApAQCAtMjA0LDYgKzIwNSwyMSBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgYm9vbCBmcmFtZUNvbmZpZyA9IG1GcmFtZUNvbmZpZzsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IGludGVybmFsU2V0Q29uZmlnKGluZGV4LCBwYXJhbXMsICZmcmFtZUNvbmZpZyk7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZyYW1lQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApAQCAtMzM2LDYgKzM1MiwxMCBAQAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBpZiAobUZyYW1lQ29uZmlnKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZyYW1lLWNvbmZpZyIsIG1GcmFtZUNvbmZpZyk7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZhbHNlOworICAgIH0KICAgICBtc2ctPnBvc3QoKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtMzc4LDYgKzM5OCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiaGVhZGVyIiwgKHZvaWQgKiopJmhlYWRlcikpOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvbmZpZzsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZyYW1lLWNvbmZpZyIsICZmcmFtZUNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBmcmFtZUNvbmZpZyA9IDA7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CiAKQEAgLTM5Myw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKIAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1GcmFtZUNvbmZpZyA9IChib29sKWZyYW1lQ29uZmlnOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKChtc2dUeXBlID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJJbnB1dCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA5MzVkYzM0Li5lODUzZGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0xNTQsMTIgKzE1NCwxMiBAQAogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OwotICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICBpbnQzMl90IGJwcCA9IChtT3V0cHV0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgPyAyIDogMTsKKyAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBicHA7CiAgICAgb3V0RGVmLT5uQnVmZmVyU2l6ZSA9Ci0gICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogYnBwICogMykgLyAyOworICAgICAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiAzKSAvIDI7CiAKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICppbkRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBpbkRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwpAQCAtNTAyLDcgKzUwMiw4IEBACiAgICAgICAgICAgICAvLyBUaGVzZSB2YWx1ZXMgd2VyZSBjaG9zZW4gdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93cyBmdXJ0aGVyIGRvd24gdGhlIGxpbmUsIGFuZCBkbwogICAgICAgICAgICAgLy8gbm90IGluZGljYXRlIHN1cHBvcnQgZm9yIDMya3gzMmsgdmlkZW8uCiAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiAzMjc2OCB8fCBuZXdIZWlnaHQgPiAzMjc2OAotICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blN0cmlkZSA8IC0zMjc2OAorICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjI4ODU0MjEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQpAQCAtNjAxLDEzICs2MDIsNDAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzT3V0cHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNPdXRwdXRzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGluZm8gPSAoKml0KS5nZXQoKTsKKworICAgICAgICAgICAgICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogb3V0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgICAgICBvdXRQYXJhbXMtPm5QYXJhbVNpemVVc2VkID0gaW5mby0+c2l6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJ1ZmZlciBwcm92aWRlZCBieSB0aGUgY2xpZW50IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICAgICAgICAgICAgLy8gc3RvcmFnZSwgcmV0dXJuIHRoZSBzaXplIG9ubHkgYW5kIGRvIG5vdCByZW1vdmUgdGhlIHBhcmFtIHlldC4KKyAgICAgICAgICAgICAgICBpZiAob3V0UGFyYW1zLT5uUGFyYW1TaXplID49IGluZm8tPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkob3V0UGFyYW1zLT5uVmFsdWUsIGluZm8tPmRhdGEoKSwgaW5mby0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhkcjEwUGx1c091dHB1dHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlcmZsb3c7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpeworT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKXsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDoKICAgICAgICAgewpAQCAtNjU3LDExICs2ODUsNTUgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogaW5QYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoKmZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgdG8gYXBwZW5kIHRvIHRoZSBjdXJyZW50IGZyYW1lIGNvbmZpZyBzZXQuCisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaW1wbHkgcmVwbGFjZSB3aXRoIHRoZSBsYXN0IHNldCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpZiAobUhkcjEwUGx1c0lucHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICooLS1tSGRyMTBQbHVzSW5wdXRzLmVuZCgpKSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6IGFwcGVuZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbmZpZyB3aGlsZSBubyBmcmFtZSBjb25maWcgaXMgcHJlc2VudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGZyYW1lIGNvbmZpZywgc2V0dGluZyAqZnJhbWVDb25maWcgdG8gdHJ1ZSBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBtYXJrcyB0aGUgbmV4dCBxdWV1ZWQgaW5wdXQgZnJhbWUgdG8gYXBwbHkgaXQuCisgICAgICAgICAgICAgICAgKmZyYW1lQ29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtSGRyMTBQbHVzSW5wdXRzLnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KIH0KIAorc3A8QUJ1ZmZlcj4gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6ZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKSB7CisgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNJbnB1dHMuYmVnaW4oKTsKKyAgICBzcDxBQnVmZmVyPiBpbmZvID0gKml0OworICAgIG1IZHIxMFBsdXNJbnB1dHMuZXJhc2UoaXQpOworICAgIHJldHVybiBpbmZvOworfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pIHsKKyAgICBtSGRyMTBQbHVzT3V0cHV0cy5wdXNoX2JhY2soaW5mbyk7CisgICAgbm90aWZ5KE9NWF9FdmVudENvbmZpZ1VwZGF0ZSwKKyAgICAgICAgICAga091dHB1dFBvcnRJbmRleCwKKyAgICAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICBOVUxMKTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKQEAgLTY3Niw2ICs3NDgsMTAgQEAKICAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgewogICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iKQorICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIAogICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7CkBAIC02OTMsNiArNzY5LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGE5ZmNlNTUuLjBmMjI5ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0xOTAsNyArMTkwLDEyIEBACiAgKi8KIC8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAogaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7CisgICAgaWYgKHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSk7CisgICAgfSBlbHNlIGlmICh0LmlzRGVhZE9iamVjdCgpKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggMWQxZjJiZC4uNmJiZWRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0yOCw2ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOworc3RydWN0IEFCdWZmZXI7CiAKIHN0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbCB7CiAgICAgT01YX1UzMiBtUHJvZmlsZTsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptSGVhZGVyOwogICAgICAgICBib29sIG1Pd25lZEJ5VXM7CisgICAgICAgIGJvb2wgbUZyYW1lQ29uZmlnOwogICAgIH07CiAKICAgICBzdHJ1Y3QgUG9ydEluZm8gewpAQCAtNzYsNiArNzksOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CisKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZnZXRQb3J0UXVldWUoT01YX1UzMiBwb3J0SW5kZXgpOwogCkBAIC0xMDEsNiArMTA3LDcgQEAKICAgICBPTVhfU1RBVEVUWVBFIG1UYXJnZXRTdGF0ZTsKIAogICAgIFZlY3RvcjxQb3J0SW5mbz4gbVBvcnRzOworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUZyYW1lQ29uZmlnOwogCiAgICAgYm9vbCBpc1NldFBhcmFtZXRlckFsbG93ZWQoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3Q7CkBAIC0xMTQsNiArMTIxLDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKwogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggNTZmYzY5MS4uM2IzODFjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDEsCiAgICAgICAgIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMiwKKyAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAzLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY4LDggKzcxLDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwpAQCAtODAsNiArODMsOCBAQAogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCk7CisKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYm90aCBtaW5pbXVtIGJ1ZmZlciBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZgogICAgIC8vIGlucHV0IHBvcnQgdG8gYmUgfG51bUlucHV0QnVmZmVyc3wuIEl0IHdpbGwgYWxzbyBzZXQgYm90aCBtaW5pbXVtIGJ1ZmZlcgogICAgIC8vIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mIG91dHB1dCBwb3J0IHRvIGJlIHxudW1PdXRwdXRCdWZmZXJzfC4KQEAgLTE2Niw2ICsxNzEsOSBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIHRoZSBDb2xvckFzcGVjdHMuCiAgICAgdm9pZCBkdW1wQ29sb3JBc3BlY3RzKGNvbnN0IENvbG9yQXNwZWN0cyAmY29sb3JBc3BlY3RzKTsKIAorICAgIHNwPEFCdWZmZXI+IGRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKTsKKwogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtTWluSW5wdXRCdWZmZXJTaXplOwogICAgIHVpbnQzMl90IG1NaW5Db21wcmVzc2lvblJhdGlvOwpAQCAtMTc0LDYgKzE4Miw5IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgbUNvZGluZ1R5cGU7CiAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgKm1Qcm9maWxlTGV2ZWxzOwogICAgIHNpemVfdCBtTnVtUHJvZmlsZUxldmVsczsKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBIZHIxMFBsdXNJbmZvTGlzdDsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzSW5wdXRzOworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNPdXRwdXRzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZjM2OTgyLi5mYjAzMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtOSw3ICs5LDYgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtMjksNiArMjgsNyBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDE1YTc2NTUuLmMyZjEwNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDAxNjE3YjYuLjc4OWU2MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTU5LDggKzYwLDggQEAKICAgICBpZiAobVNvY2tldCA+PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4sIGNsb3NpbmcgdGhlIHNvY2tldC4iKTsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMjE0LDggKzIxNSw4IEBACiAKICAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgewogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yNTQsNyArMjU1LDcgQEAKIAogICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKGhvc3QuY19zdHIoKSk7CiAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJVbmtub3duIGhvc3QgJXMiLCBob3N0LmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiVW5rbm93biBob3N0ICVzIiwgdXJpRGVidWdTdHJpbmcoaG9zdCkuY19zdHIoKSk7CiAKICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCAtRU5PRU5UKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKQEAgLTI2Niw5ICsyNjcsOSBAQAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRTUCIpOwotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOwogICAgIH0KIAogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CkBAIC0yOTcsOCArMjk4LDggQEAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cGVyZm9ybURpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgIH0KICAgICBjbG9zZShtU29ja2V0KTsKICAgICBtU29ja2V0ID0gLTE7CkBAIC0zODksOCArMzkwLDggQEAKIAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDMyNTA4NGMuLjkyNjM1NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtODAsNyArODAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzIiwgbGluZS5jX3N0cigpKTsKIAogICAgICAgICBzd2l0Y2ggKGxpbmUuY19zdHIoKVswXSkgewogICAgICAgICAgICAgY2FzZSAndic6CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkpIHsKKyAgICBpZiAoc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0PSIsIDQpICYmIHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdDoiLCA0KSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggNTk1MWRkZi4uOWJjOWM4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtMSw1ICsxLDUgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQUFNUkFzc2VtYmxlci5jcHAiLApAQCAtNDksNiArNDksMjEgQEAKICAgICB9LAogfQogCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorCisgICAgc3JjczogWyJOZXR3b3JrVXRpbHMuY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGlibmV0ZF9jbGllbnRfaGVhZGVycyJdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwX3BsYXllcjIiLAorCisgICAgc3JjczogWyJOZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCJdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiXSwKK30KKwogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGNjX3Rlc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggZDE4MzUxNi4uYjQ1MTVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC0zNDQsOCArMzQ1LDcgQEAKIAogICAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUobVNlc3Npb25Ib3N0LmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb29rIHVwIGFkZHJlc3Mgb2Ygc2Vzc2lvbiBob3N0ICclcyciLAotICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25Ib3N0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9vayB1cCBhZGRyZXNzIG9mIHNlc3Npb24gaG9zdCIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtNTMwLDcgKzUzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKEFTdHJpbmdQcmludGYoIiV1IiwgcG9ydCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwpAQCAtNzU3LDEwICs3NTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhY2stPm1Vc2luZ0ludGVybGVhdmVkVENQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUQ1BTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVENQU29ja2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSh0cmFjay0+bVJUUFNvY2tldCk7CkBAIC04ODYsMTAgKzg4NiwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdGFnCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoaW5mby0+bVJUUFNvY2tldCk7CkBAIC0xNjY1LDEyICsxNjY1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICZpbmZvLT5tUlRQU29ja2V0LCAmaW5mby0+bVJUQ1BTb2NrZXQsICZydHBQb3J0KTsKIAogICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0LCBtVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0LCBtVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0LCBtVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PSIpOwpAQCAtMTkxMiw3ICsxOTEyLDcgQEAKICAgICAgICAgICAgIG1MYXN0TWVkaWFUaW1lVXMgPSBtZWRpYVRpbWVVczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgMCAmJiAhbVNlZWthYmxlKSB7CiAgICAgICAgICAgICBBTE9HVigiZHJvcHBpbmcgZWFybHkgYWNjZXNzVW5pdC4iKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzZiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KKyNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgeworICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdGFnZ2luZyBzb2NrZXQgJWQgZm9yIHVpZCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgdWlkLCBnZXRldWlkKCkpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgeworICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7CisgICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCkgeworICAgIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoc29ja2ZkLCBnZXRldWlkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZWU0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTkVUV09SS19VVElMU19IXworI2RlZmluZSBORVRXT1JLX1VUSUxTX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE5ldHdvcmtVdGlscyB7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7CisgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7CisKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7CisgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBORVRXT1JLX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIxNTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKworLy8gTmV0d29ya1V0aWxzIGltcGxlbWVudGF0aW9uIGZvciBhcHBsaWNhdGlvbiBwcm9jZXNzLgorbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50LCB1aWRfdCwgdWludDMyX3QpIHsKKyAgICAvLyBObyBvcC4gRnJhbWV3b3JrIGFscmVhZHkgaGFuZGxlcyB0aGUgZGF0YSB1c2FnZSBiaWxsaW5nIGZvciBhcHBsaWNhdGlvbnMuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCkgeworICAgIC8vIE5vIG9wLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCwgdWlkX3QpIHsKKyAgICAvLyBObyBvcC4gRnJhbWV3b3JrIGFscmVhZHkgaGFuZGxlcyB0aGUgZGF0YSB1c2FnZSBiaWxsaW5nIGZvciBhcHBsaWNhdGlvbnMuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCBkNDU5Y2JkLi42NjVkNTFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OZXRMb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUNhbmNlbGxlZChmYWxzZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IENsZWFyTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpIHsKICAgICBtTmV0TG9vcGVyLT5zZXROYW1lKCJzZHAgbmV0Iik7CiAgICAgbU5ldExvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAogICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAppbmRleCBhNGU4ODlkLi42OTM1NjU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icApAQCAtMjIsMyArMjIsMzMgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCiB9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0MiIsCisKKyAgICBzcmNzOiBbIlRleHREZXNjcmlwdGlvbnMyLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZWFjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczI6OlRleHREZXNjcmlwdGlvbnMyKCkgeworfQorCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBpZiAoZmxhZ3MgJiBJTl9CQU5EX1RFWFRfM0dQUCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBHTE9CQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgcGxheWVyTXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIE9VVF9PRl9CQU5EX1RFWFRfU1JUKSB7CisgICAgICAgIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIFBhcnNlIHRoZSBTUlQgdGV4dCBzYW1wbGUsIGFuZCBzdG9yZSB0aGUgdGltaW5nIGFuZCB0ZXh0IHNhbXBsZSBpbiBhIFBsYXllck1lc3NhZ2UuCisvLyBUaGUgUGxheWVyTWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gTWVkaWFQbGF5ZXIyLmphdmEgdGhyb3VnaCBldmVudCwgYW5kIHdpbGwgYmUKKy8vIHBhcnNlZCBpbiBUaW1lZFRleHQuamF2YS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEV4dHJhY3QgdGhlIGxvY2FsIDNHUFAgZGlzcGxheSBkZXNjcmlwdGlvbnMuIDNHUFAgbG9jYWwgZGVzY3JpcHRpb25zCisvLyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2FtcGxlIGlmIGFueS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisKKyAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHNzaXplX3QgdGV4dExlbiA9ICgqZGF0YSkgPDwgOCB8ICgqKGRhdGEgKyAxKSk7CisKKyAgICBpZiAoc2l6ZSA8IHRleHRMZW4gKyAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0ZXh0IHNhbXBsZSBsZW5ndGggYW5kIHRleHQgc2FtcGxlIGl0c2VsZgorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEgKyAyLCB0ZXh0TGVuKTsKKworICAgIGlmIChzaXplID4gdGV4dExlbiArIDIpIHsKKyAgICAgICAgZGF0YSArPSAodGV4dExlbiArIDIpOworICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOyAgICAgIC8vIHNpemUgaW5jbHVkZXMgc2l6ZSBhbmQgdHlwZQorICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBjaHVua1NpemUgPiBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gY2h1bmtTaXplIC0gODsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgLy8gJ3Rib3gnIGJveCB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCB2YWx1ZXMKKyAgICAgICAgICAgIC8vIG9mIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQbGF5ZXJNZXNzYWdlCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9HTE9CQUxfU0VUVElORyk7CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSArIDQpOworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CisKKyAgICAgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAxOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNraXAgRElTUExBWV9GTEFHUywgU1RSVUNUX0pVU1RJRklDQVRJT04sIGFuZCBCQUNLR1JPVU5EX0NPTE9SX1JHQkEKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDE4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSByZW1haW5pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKQEAgLTAsMCArMSw4OCBAQAorIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dERlc2NyaXB0aW9uczIgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7Citwcml2YXRlOgorICAgIFRleHREZXNjcmlwdGlvbnMyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHREZXNjcmlwdGlvbnMyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IDI2NmI2MTEuLjY0ZWNjMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTMxLDQgKzMxLDggQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKaW5kZXggYTUxMjBiOS4uNGQ1MDRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKQEAgLTMwNSw2ICszMDUsNyBAQAogfQogCiBzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCiAgICAgICAgIGludCBjaGFucywKICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCkBAIC0zMjIsNyArMzIzLDcgQEAKICAgICAgICAgICAgIHVpZCwKICAgICAgICAgICAgIGxhY2luZywKICAgICAgICAgICAgIGxhbmcsCi0gICAgICAgICAgICAiQV9WT1JCSVMiLAorICAgICAgICAgICAgY29kZWMsCiAgICAgICAgICAgICBrQXVkaW9UeXBlLAogICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaAppbmRleCBmZmJiYTFiLi5hOTRjMjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSA9IDEwMDAwMDAsIGRvdWJsZSBkdXIgPSAwKTsKIAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCiAgICAgICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgICAgICBkb3VibGUgcmF0ZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAppbmRleCA0ZDczZWI4Li5iMGEzMDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIApAQCAtMTEyLDQ2ICsxMTQsMTAyIEBACiAvLyBzdGF0aWMKIHNwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjphdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKICAgICBpbnQzMl90IG5DaGFubmVscywgc2FtcGxlcmF0ZTsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOwotICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKLSAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OwotICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOwotICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKyAgICBjb25zdCBjaGFyKiBtaW1lVHlwZTsKIAogICAgIGlmICghbWQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmaGVhZGVyRGF0YTMsICZoZWFkZXJTaXplMykpIHsKKyAgICAgICAgfHwgIW1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKQorICAgICAgICB8fCAhbWQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWVUeXBlKSkgewogICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5cyBmb3IgYXVkaW8gdHJhY2siKTsKICAgICAgICAgbWQtPmR1bXBUb0xvZygpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpKSB7CisgICAgICAgIC8vIE9wdXMgaW4gV2ViTSBpcyBhIHdlbGwta25vd24sIHlldCB1bmRlci1kb2N1bWVudGVkLCBmb3JtYXQuIFRoZSBjb2RlYyBwcml2YXRlIGRhdGEKKyAgICAgICAgLy8gb2YgdGhlIHRyYWNrIGlzIGFuIE9wdXMgT2dnIGhlYWRlciAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4NDUjc2VjdGlvbi01LjEpCisgICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSB0cmFjayBpc24ndCBzdGFuZGFyZGl6ZWQsIGl0cyB2YWx1ZSBzaG91bGQgYmUgIkFfT1BVUyIuCisgICAgICAgIE9wdXNIZWFkZXIgaGVhZGVyOworICAgICAgICBoZWFkZXIuY2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgICAgICAgIGhlYWRlci5udW1fc3RyZWFtcyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9jb3VwbGVkID0gMDsKKyAgICAgICAgLy8gLSBDaGFubmVsIG1hcHBpbmcgZmFtaWx5ICg4IGJpdHMgdW5zaWduZWQpCisgICAgICAgIC8vICAtLSAgMCA9IG9uZSBzdHJlYW06IG1vbm8gb3IgTCxSIHN0ZXJlbworICAgICAgICAvLyAgLS0gIDEgPSBjaGFubmVscyBpbiB2b3JiaXMgc3BlYyBvcmRlcjogbW9ubyBvciBMLFIgc3RlcmVvIG9yIC4uLiBvciBGTCxDLEZSLFJMLFJSLExGRSwgLi4uCisgICAgICAgIC8vICAtLSAgMi4uMjU0ID0gcmVzZXJ2ZWQgKHRyZWF0IGFzIDI1NSkKKyAgICAgICAgLy8gIC0tICAyNTUgPSBubyBkZWZpbmVkIGNoYW5uZWwgbWVhbmluZworICAgICAgICAvLworICAgICAgICAvLyAgb3VyIGltcGxlbWVudGF0aW9uIGVuY29kZXM6ICAwLCAxLCBvciAyNTUKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobkNoYW5uZWxzID4gOCkgPyAyNTUgOiAobkNoYW5uZWxzID4gMikpOworICAgICAgICBoZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIGhlYWRlci5za2lwX3NhbXBsZXMgPSAwOwogCi0gICAgb2ZmX3Qgb2ZmID0gMDsKLSAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKLSAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7Ci0gICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworICAgICAgICAvLyBoZWFkZXJzIGFyZSAyMS1ieXRlcyArIHNvbWV0aGluZyBkcml2ZW4gYnkgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBleHBlY3QgbnVtYmVycyBpbiB0aGUgbG93IDMwJ3MgaGVyZS4gV3JpdGVPcHVzSGVhZGVyKCkgd2lsbCB0ZWxsIHVzCisgICAgICAgIC8vIGlmIHRoaW5ncyBhcmUgYmFkLgorICAgICAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcl9kYXRhWzEwMF07CisgICAgICAgIGludCBoZWFkZXJTaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgc2FtcGxlcmF0ZSwgKHVpbnQ4X3QqKWhlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyX2RhdGEpKTsKIAotICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7Ci0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKyAgICAgICAgaWYgKGhlYWRlclNpemUgPCAwKSB7CisgICAgICAgICAgICAvLyBkaWRuJ3QgZmlsbCBvdXQgdGhhdCBoZWFkZXIgZm9yIHNvbWUgcmVhc29uCisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdlbmVyYXRlIE9QVVMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUxOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOwotICAgIG9mZiArPSBoZWFkZXJTaXplMjsKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAwOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemU7CiAKLSAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAotICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1Zik7Ci0gICAgcmV0dXJuIGVudHJ5OworICAgICAgICBvZmZfdCBvZmYgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgdWludDhfdCogY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworCisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCAodWludDhfdCopaGVhZGVyX2RhdGEsIGhlYWRlclNpemUpOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPQorICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoIkFfT1BVUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwgY29kZWNQcml2YXRlQnVmKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7CisgICAgICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICAgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7CisgICAgICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKworICAgICAgICBpZiAoIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKQorICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmaGVhZGVyRGF0YTMsICZoZWFkZXJTaXplMykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGhlYWRlciBmb3JtYXQga2V5cyBmb3Igdm9yYmlzIHRyYWNrIik7CisgICAgICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworCisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisgICAgICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKworICAgICAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOworICAgICAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworCisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOworICAgICAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7CisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOworICAgICAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7CisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworCisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9CisgICAgICAgICAgICAgICAgV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9WT1JCSVMiLCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGUsIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBpcyBub3QgYSBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IiwgbWltZVR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHNpemVfdCBXZWJtV3JpdGVyOjpudW1UcmFja3MoKSB7CkBAIC0zODIsMTYgKzQ0MCwxOCBAQAogICAgIGNvbnN0IGNoYXIgKnZwOCA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKICAgICBjb25zdCBjaGFyICp2cDkgPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiAgICAgY29uc3QgY2hhciAqdm9yYmlzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworICAgIGNvbnN0IGNoYXIqIG9wdXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTOwogCiAgICAgc2l6ZV90IHN0cmVhbUluZGV4OwogICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgdnA4LCBzdHJsZW4odnA4KSkgfHwKICAgICAgICAgIXN0cm5jYXNlY21wKG1pbWUsIHZwOSwgc3RybGVuKHZwOSkpKSB7CiAgICAgICAgIHN0cmVhbUluZGV4ID0ga1ZpZGVvSW5kZXg7Ci0gICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSB8fAorICAgICAgICAgICAgICAgIXN0cm5jYXNlY21wKG1pbWUsIG9wdXMsIHN0cmxlbihvcHVzKSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrQXVkaW9JbmRleDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzLCAlcyBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcyk7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzLCAlcywgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgIG1pbWUsIHZwOCwgdnA5LCB2b3JiaXMsIG9wdXMpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCmluZGV4IGVkZDhmYmMuLjgxOTA1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsOSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKaW5kZXggMmRlYzlmYS4uNzA0NmY2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxleHBhdC5oPgogCi0jaW5jbHVkZSA8Y2N0eXBlPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyNiw4ICszMjcsOCBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiUXVpcmsiKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZFF1aXJrKGF0dHJzKTsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiUXVpcmsiKSB8fCBzdHJFcShuYW1lLCAiQXR0cmlidXRlIikpIHsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRRdWlyayhhdHRycywgbmFtZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKICAgICAgICAgICAgICAgICAodm9pZClhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fRU5DT0RFUikpOwpAQCAtMzQ4LDYgKzM0OSw4IEBACiAgICAgICAgICAgICBpZiAob3V0c2lkZSAmJgogICAgICAgICAgICAgICAgICAgICAoc3RyRXEobmFtZSwgIkxpbWl0IikgfHwgc3RyRXEobmFtZSwgIkZlYXR1cmUiKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJBbGlhcyIpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpYWRkQWxpYXMoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTGltaXQiKSkgewogICAgICAgICAgICAgICAgICh2b2lkKWFkZExpbWl0KGF0dHJzKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkZlYXR1cmUiKSkgewpAQCAtNDk5LDYgKzUwMiw3IEBACiAgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CiAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHI7CiAgICAgY29uc3QgY2hhciAqdXBkYXRlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICpyYW5rID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewpAQCAtNTIwLDYgKzUyNCwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmsiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHJhbmsgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYW5rID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC01NzYsMTAgKzU4NiwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHJhbmsgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoIW1DdXJyZW50Q29kZWMtPnNlY29uZC5yYW5rLmVtcHR5KCkgJiYgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsgIT0gcmFuaykgeworICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogY29kZSBcIiVzXCIgcmFuayBjaGFuZ2VkIGZyb20gXCIlc1wiIHRvIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1DdXJyZW50Q29kZWMtPnNlY29uZC5yYW5rLmNfc3RyKCksIHJhbmspOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucmFuayA9IHJhbms7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKSB7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICp0YWcpIHsKICAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC02MDYsNyArNjI1LDEyIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnF1aXJrU2V0LmVtcGxhY2UobmFtZSk7CisgICAgc3RkOjpzdHJpbmcgdGFnU3RyaW5nID0gdGFnOworICAgIHN0ZDo6dHJhbnNmb3JtKHRhZ1N0cmluZy5iZWdpbigpLCB0YWdTdHJpbmcuZW5kKCksIHRhZ1N0cmluZy5iZWdpbigpLCA6OnRvbG93ZXIpOworICAgIHRhZ1N0cmluZy5hcHBlbmQoIjo6Iik7CisgICAgdGFnU3RyaW5nLmFwcGVuZChuYW1lKTsKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZSh0YWdTdHJpbmcuY19zdHIoKSk7CisgICAgQUxPR0koImFkZGluZyAlcyB0byAlcyIsIHRhZ1N0cmluZy5jX3N0cigpLCBtQ3VycmVudENvZGVjLT5maXJzdC5jX3N0cigpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc2MCw2ICs3ODQsNyBAQAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpIHx8CiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJzaXplIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIikgfHwKKyAgICAgICAgICAgIHN0ckhhc1ByZWZpeChhX25hbWUsICJwZXJmb3JtYW5jZS1wb2ludC0iKSB8fAogICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKICAgICAgICAgLy8gInJhbmdlIiBpcyBzcGVjaWZpZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKICAgICAgICAgLy8gMSkgbWluLW1heApAQCAtOTY0LDYgKzk4OSwzNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRBbGlhczogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRBbGlhczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBFdmVyeSBmZWF0dXJlIG11c3QgaGF2ZSBhIG5hbWUuCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiYWxpYXMgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmFsaWFzZXMuZW1wbGFjZV9iYWNrKG5hbWUpOworICAgIHJldHVybiBPSzsKK30KKwogY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCYKICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZXJ2aWNlQXR0cmlidXRlTWFwOwpAQCAtOTk4LDYgKzEwNTEsNyBAQAogICAgICAgICBjb25zdCBhdXRvJiBjb2RlY05hbWUgPSBjb2RlYy5maXJzdDsKICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBjb2RlYy5zZWNvbmQuaXNFbmNvZGVyOwogICAgICAgICBzaXplX3Qgb3JkZXIgPSBjb2RlYy5zZWNvbmQub3JkZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJhbmsgPSBjb2RlYy5zZWNvbmQucmFuazsKICAgICAgICAgY29uc3QgYXV0byYgdHlwZU1hcCA9IGNvZGVjLnNlY29uZC50eXBlTWFwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiB0eXBlTWFwKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvJiB0eXBlTmFtZSA9IHR5cGUuZmlyc3Q7CkBAIC0xMDQxLDExICsxMDk1LDIxIEBACiAKICAgICAgICAgICAgIE5vZGVJbmZvIG5vZGVJbmZvOwogICAgICAgICAgICAgbm9kZUluZm8ubmFtZSA9IGNvZGVjTmFtZTsKKyAgICAgICAgICAgIC8vIE5PVEU6IG5vIGFsaWFzZXMgYXJlIGV4cG9zZWQgaW4gcm9sZSBpbmZvCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgcXVpcmtzIGFyZSBleHBvc2VkIGFzIG5vZGUgYXR0cmlidXRlcwogICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5yZXNlcnZlKHR5cGVBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogdHlwZUF0dHJpYnV0ZU1hcCkgewogICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRle2F0dHJpYnV0ZS5maXJzdCwgYXR0cmlidXRlLnNlY29uZH0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmcXVpcmsgOiBjb2RlYy5zZWNvbmQucXVpcmtTZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RySGFzUHJlZml4KHF1aXJrLmNfc3RyKCksICJhdHRyaWJ1dGU6OiIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXtxdWlyaywgInByZXNlbnQifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyYW5rLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhBdHRyaWJ1dGV7InJhbmsiLCByYW5rfSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAogICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKaW5kZXggY2M2OWU1Mi4uN2E5ODZiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKQEAgLTY1LDYgKzY1LDggQEAKICAgICAgICAgc2l6ZV90IG9yZGVyOyAgICAgIC8vLzwgT3JkZXIgb2YgYXBwZWFyYW5jZSBpbiB0aGUgZmlsZSAoc3RhcnRpbmcgZnJvbSAwKQogICAgICAgICBRdWlya1NldCBxdWlya1NldDsgLy8vPCBTZXQgb2YgcXVpcmtzIHJlcXVlc3RlZCBieSB0aGlzIGNvZGVjCiAgICAgICAgIFR5cGVNYXAgdHlwZU1hcDsgICAvLy88IE1hcCBvZiB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxpYXNlczsgLy8vPCBOYW1lIGFsaWFzZXMgZm9yIHRoaXMgY29kZWMKKyAgICAgICAgc3RkOjpzdHJpbmcgcmFuazsgIC8vLzwgUmFuayBvZiB0aGlzIGNvZGVjLiBUaGlzIGlzIGEgbnVtZXJpYyBzdHJpbmcuCiAgICAgfTsKIAogICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBDb2RlY1Byb3BlcnRpZXM+IENvZGVjOwpAQCAtNzYsNiArNzgsNyBAQAogICAgIHN0cnVjdCBOb2RlSW5mbyB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CiAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlTGlzdDsKKyAgICAgICAgLy8gbm90ZTogYWxpYXNlcyBhcmUgbm90IGV4cG9zZWQgaGVyZSBhcyB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgcm9sZSBtYXAKICAgICB9OwogCiAgICAgLyoqCkBAIC0xNzEsOCArMTc0LDkgQEAKICAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHIpOwogCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnRhZyk7CiAgICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0dXNfdCBhZGRBbGlhcyhjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggZjI1ZmM3MS4uYWQzYzA2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTIxMiw3ICsyMTIsNiBAQAogICAgIHVpbnQxNl90IHZhbHVlID0gc2V0dXAtPndWYWx1ZTsKICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CiAgICAgYnVmLnJlc2l6ZShsZW5ndGgpOwotICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKCEodHlwZSAmIFVTQl9ESVJfSU4pKSB7CiAgICAgICAgIGlmICg6OnJlYWQobUNvbnRyb2wsIGJ1Zi5kYXRhKCksIGxlbmd0aCkgIT0gbGVuZ3RoKSB7CkBAIC0yMjUsOCArMjI0LDggQEAKICAgICAgICAgY2FzZSBNVFBfUkVRX1JFU0VUOgogICAgICAgICBjYXNlIE1UUF9SRVFfQ0FOQ0VMOgogICAgICAgICAgICAgZXJybm8gPSBFQ0FOQ0VMRUQ7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvLyAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cykgKyA0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IGNjZGRkNmUuLmNhOGNiNzggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC05OSw2ICs5OSw3IEBACiAgICAgTVRQX0VWRU5UX1NUT1JFX0FEREVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAorICAgIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELAogfTsKIAogTXRwU2VydmVyOjpNdHBTZXJ2ZXIoSU10cERhdGFiYXNlKiBkYXRhYmFzZSwgaW50IGNvbnRyb2xGZCwgYm9vbCBwdHAsCkBAIC0yNTksNiArMjYwLDExIEBACiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwgaGFuZGxlKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgQUxPR1YoInNlbmRPYmplY3RJbmZvQ2hhbmdlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsIGhhbmRsZSk7Cit9CisKIHZvaWQgTXRwU2VydmVyOjpzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpIHsKICAgICBBTE9HVigic2VuZFN0b3JlQWRkZWQgJTA4WFxuIiwgaWQpOwogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfU1RPUkVfQURERUQsIGlkKTsKQEAgLTQ0Miw2ICs0NDgsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgaWYgKHJlc3BvbnNlICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgIEFMT0dXKCJbTVRQXSBnb3QgcmVzcG9uc2UgMHglWCBpbiBjb21tYW5kICVzICgleCkiLCByZXNwb25zZSwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOwogICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CkBAIC02NTIsOCArNjYxLDggQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOwogICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOwotICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXNcbiIsIGhhbmRsZSwKLSAgICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzICgweCUwNFgpXG4iLCBoYW5kbGUsCisgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSksIHByb3BlcnR5KTsKIAogICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5VmFsdWUoaGFuZGxlLCBwcm9wZXJ0eSwgbURhdGEpOwogfQpAQCAtOTQ2LDcgKzk1NSw4IEBACiAgICAgaWYgKCFtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgLy8gZGF0ZSBtb2RpZmllZAogICAgIC8vIGtleXdvcmRzIGZvbGxvdwogCi0gICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogJTA0WFxuIiwgKGNvbnN0IGNoYXIgKiluYW1lLCBmb3JtYXQpOworICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6IDB4JTA0WCAoJXMpXG4iLCAoY29uc3QgY2hhciopbmFtZSwgZm9ybWF0LAorICAgICAgICAgIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKICAgICB0aW1lX3QgbW9kaWZpZWRUaW1lOwogICAgIGlmICghcGFyc2VEYXRlVGltZShtb2RpZmllZCwgbW9kaWZpZWRUaW1lKSkKICAgICAgICAgbW9kaWZpZWRUaW1lID0gMDsKQEAgLTk2Nyw5ICs5NzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRTsKICAgICB9CiAKLSAgICBBTE9HRCgicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dWKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLCBmb3JtYXQsCiAgICAgICAgICAgICBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR0QoImhhbmRsZTogJWQsIHBhcmVudDogJWQsIHN0b3JhZ2VJRDogJTA4WCIsIGhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCBmNjkzOWQ3Li4xZjg3OTlmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggMWI4ZGRkOS4uYTkyNTRjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDEzIEBACiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CiAKKy8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAKQEAgLTU1LDcgKzYyLDYgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0KICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCkBAIC02NSwyMiArNzEsMjcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJtZWRpYV9qbmkiLAogICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJhbmRyb2lkIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTEwNCw1ICsxMTUsNjMgQEAKIGxsbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW5kay5tYXAudHh0IiwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFuZGtfdXRpbHMiLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0IiwKKyAgICBzcmNzOiBbInRlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURfX0FORFJPSURfVk5ES19fIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggYmU2MzVmZi4uYzNlYjQzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXIuaD4KICNpbmNsdWRlIDxncmFsbG9jdXNhZ2UvR3JhbGxvY1VzYWdlQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQzLDYgKzQ0LDEwIEBACiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtDb250ZXh0S2V5ICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprR3JhcGhpY0J1ZmZlcktleSA9ICJHcmFwaGljQnVmZmVyIjsKIAorc3RhdGljIGNvbnN0ZXhwciBpbnQga1dpbmRvd0hhbFRva2VuU2l6ZU1heCA9IDI1NjsKKworc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoY29uc3QgSGFsVG9rZW4gJmhhbFRva2VuKTsKKwogYm9vbAogQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSkgewogICAgIC8vIENoZWNrIHdoZXRoZXIgdXNhZ2UgaGFzIGVpdGhlciBDUFVfUkVBRF9PRlRFTiBvciBDUFVfUkVBRCBzZXQuIE5vdGUgdGhhdCBjaGVjayBhZ2FpbnN0CkBAIC02Myw2ICs2OCw4IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSEVJQzoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIC8vIEZvciBwcml2YXRlIGZvcm1hdCwgY3B1IHVzYWdlIGlzIHByb2hpYml0ZWQuCkBAIC04OSw2ICs5Niw4IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSEVJQzoKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMzAxLDYgKzMxMCw5IEBACiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEJ1ZmZlckl0ZW1Db25zdW1lciBidWZmZXIgZGF0YVNwYWNlIik7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CisgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVCkgeworICAgICAgICBnYkNvbnN1bWVyLT5zZXRDb25zdW1lcklzUHJvdGVjdGVkKHRydWUpOworICAgIH0KIAogICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CiAgICAgaWYgKG1TdXJmYWNlID09IG51bGxwdHIpIHsKQEAgLTM1MCw4ICszNjIsMTAgQEAKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChpbWFnZS0+bUxvY2spOwotICAgICAgICByZWxlYXNlSW1hZ2VMb2NrZWQoaW1hZ2UsIC8qcmVsZWFzZUZlbmNlRmQqLy0xKTsKKyAgICAgICAgLy8gRG8gbm90IGFsdGVyIG1BY3F1aXJlZEltYWdlcyB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG9uIGl0CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEsIC8qY2xlYXJDYWNoZSovZmFsc2UpOwogICAgIH0KKyAgICBtQWNxdWlyZWRJbWFnZXMuY2xlYXIoKTsKIAogICAgIC8vIERlbGV0ZSBCdWZmZXIgSXRlbXMKICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwpAQCAtMzYzLDYgKzM3NywxNSBAQAogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5hYmFuZG9uKCk7CiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobnVsbHB0cik7CiAgICAgfQorCisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgc2l6ZSA9IG1XaW5kb3dIYW5kbGUtPmRhdGFbMF07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtV2luZG93SGFuZGxlLT5kYXRhWzFdKSwgc2l6ZSk7CisgICAgICAgIGRlbGV0ZUhhbFRva2VuKGhhbFRva2VuKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobVdpbmRvd0hhbmRsZSk7CisgICAgfQogfQogCiBtZWRpYV9zdGF0dXNfdApAQCAtNDgxLDcgKzUwNCw3IEBACiB9CiAKIHZvaWQKLUFJbWFnZVJlYWRlcjo6cmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgeworQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUpIHsKICAgICBCdWZmZXJJdGVtKiBidWZmZXIgPSBpbWFnZS0+bUJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlzIG5vdCBmYXRhbApAQCAtNTA1LDYgKzUyOCwxMCBAQAogICAgIGltYWdlLT5tTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBpbWFnZS0+bUlzQ2xvc2VkID0gdHJ1ZTsKIAorICAgIGlmICghY2xlYXJDYWNoZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIC8vIGNsZWFudXAgYWNxdWlyZWQgaW1hZ2UgbGlzdAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwpAQCAtNTIyLDYgKzU0OSwyNSBAQAogICAgIH0KIH0KIAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyOjpnZXRXaW5kb3dOYXRpdmVIYW5kbGUobmF0aXZlX2hhbmRsZSAqKmhhbmRsZSkgeworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4obVByb2R1Y2VyKTsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBpZiAoIWNyZWF0ZUhhbFRva2VuKGhnYnAsICZoYWxUb2tlbikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBtV2luZG93SGFuZGxlID0gY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoaGFsVG9rZW4pOworICAgIGlmICghbVdpbmRvd0hhbmRsZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIGludAogQUltYWdlUmVhZGVyOjpnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAtMTsKQEAgLTU4NSw2ICs2MzEsMzMgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKAorICAgICAgICBjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pIHsKKyAgICAvLyBXZSBhdHRlbXB0IHRvIHN0b3JlIGhhbFRva2VuIGluIHRoZSBpbnRzIG9mIHRoZSBuYXRpdmVfaGFuZGxlX3QgYWZ0ZXIgaXRzCisgICAgLy8gc2l6ZS4gVGhlIGZpcnN0IGludCBzdG9yZXMgdGhlIHNpemUgb2YgdGhlIHRva2VuLiBXZSBzdG9yZSB0aGlzIGluIGFuIGludAorICAgIC8vIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMgd2hlcmUgc2l6ZV90IGFuZCBpbnQgZG8gbm90IGhhdmUgdGhlIHNhbWUKKyAgICAvLyBhbGlnbm1lbnQuCisgICAgc2l6ZV90IG5oRGF0YUJ5dGVTaXplID0gaGFsVG9rZW4uc2l6ZSgpOworICAgIGlmIChuaERhdGFCeXRlU2l6ZSA+IGtXaW5kb3dIYWxUb2tlblNpemVNYXgpIHsKKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHRva2VuIGlzbid0IHJlYXNvbmFibGUuLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IG51bUludHMgPSBjZWlsKG5oRGF0YUJ5dGVTaXplIC8gc2l6ZW9mKGludCkpICsgMTsKKworICAgIC8vIFdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdywgd2hldGhlciBudW1JbnRzIGNhbiBmaXQgaW4gYW4gaW50LCBzaW5jZSB3ZQorICAgIC8vIGV4cGVjdCBrV2luZG93SGFsVG9rZW5TaXplTWF4IHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdC4KKyAgICAvLyBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3Qgd2l0aCAwIG51bUZkcyBhbmQgbnVtSW50cyBudW1iZXIgb2YgaW50cy4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgbnVtSW50cyk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIHRva2VuIGluIHRoZSBmaXJzdCBpbnQuCisgICAgbmgtPmRhdGFbMF0gPSBuaERhdGFCeXRlU2l6ZTsKKyAgICBtZW1jcHkoJihuaC0+ZGF0YVsxXSksIGhhbFRva2VuLmRhdGEoKSwgbmhEYXRhQnl0ZVNpemUpOworICAgIHJldHVybiBuaDsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLApAQCAtNTk0LDYgKzY2NywxOSBAQAogICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4sIG1heEltYWdlcywgcmVhZGVyKTsKIH0KIAorZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICAgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlci0+Z2V0V2luZG93TmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK30gLy9leHRlcm4gIkMiCisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCBiZWQ4YTIxLi5lMzI4Y2IxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZU5leHRJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVMYXRlc3RJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0V2luZG93TmF0aXZlSGFuZGxlKC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCiAgICAgQU5hdGl2ZVdpbmRvdyogZ2V0V2luZG93KCkgICAgY29uc3QgeyByZXR1cm4gbVdpbmRvdy5nZXQoKTsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRXaWR0aCgpICAgICBjb25zdCB7IHJldHVybiBtV2lkdGg7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0SGVpZ2h0KCkgICAgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfTsKQEAgLTg2LDcgKzg4LDcgQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlSW1hZ2VMb2NrZWQoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKIAogICAgIC8vIENhbGxlZCBieSBBSW1hZ2UvfkFJbWFnZVJlYWRlciB0byBjbG9zZSBpbWFnZS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdyYWIgQUltYWdlOjptTG9jawotICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7CisgICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUgPSB0cnVlKTsKIAogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVyV2lkdGgoQnVmZmVySXRlbSogYnVmZmVyKTsKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlckhlaWdodChCdWZmZXJJdGVtKiBidWZmZXIpOwpAQCAtMTYwLDYgKzE2Miw3IEBACiAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICBtV2luZG93OworICAgIG5hdGl2ZV9oYW5kbGVfdCogICAgICAgICAgIG1XaW5kb3dIYW5kbGUgPSBudWxscHRyOwogCiAgICAgTGlzdDxBSW1hZ2UqPiAgICAgICAgICAgICAgbUFjcXVpcmVkSW1hZ2VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYzIzZjE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCmluZGV4IGQ3MTkzY2EuLmI4YWY1ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCmluZGV4IDlkMDBlNWUuLjFhYmVlOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0yMywxNiArMjMsMjMgQEAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CiAKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC00MSwxNCArNDgsMjAgQEAKICAgICBBTWVkaWFEYXRhU291cmNlUmVhZEF0IHJlYWRBdDsKICAgICBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSBnZXRTaXplOwogICAgIEFNZWRpYURhdGFTb3VyY2VDbG9zZSBjbG9zZTsKKyAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSBnZXRBdmFpbGFibGVTaXplOworICAgIHNwPERhdGFTb3VyY2U+IG1JbXBsOworICAgIHVpbnQzMl90IG1GbGFnczsKIH07CiAKIE5ka0RhdGFTb3VyY2U6Ok5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRTaXplKTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmNsb3NlKTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmNsb3NlKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKTsKKyAgICBtRGF0YVNvdXJjZS0+bUltcGwgPSBkYXRhU291cmNlLT5tSW1wbDsKKyAgICBtRGF0YVNvdXJjZS0+bUZsYWdzID0gZGF0YVNvdXJjZS0+bUZsYWdzOwogfQogCiBOZGtEYXRhU291cmNlOjp+TmRrRGF0YVNvdXJjZSgpIHsKQEAgLTU5LDkgKzcyLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit1aW50MzJfdCBOZGtEYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbURhdGFTb3VyY2UtPm1GbGFnczsKK30KKwogc3NpemVfdCBOZGtEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKQEAgLTkyLDYgKzEwOSw5NSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgTmRrRGF0YVNvdXJjZTo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZXB0cikgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgc2l6ZXB0ciAhPSBOVUxMKSB7CisgICAgICAgIHNpemUgPSBtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZS0+dXNlcmRhdGEsIG9mZnNldCk7CisgICAgICAgICpzaXplcHRyID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHNpemUgPj0gMCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGludCB2ZXJzaW9uKSB7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIG9iaikpOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gbmV3IEpNZWRpYTJIVFRQU2VydmljZShlbnYsIG9iaik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoCisgICAgICAgIEpOSUVudiAqZW52LAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IGNoYXIgKmNsYXp6LAorICAgICAgICBjb25zdCBjaGFyICptZXRob2QsCisgICAgICAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZSwKKyAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOworICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiaHR0cCBzZXJ2aWNlIG11c3QgYmUgY3JlYXRlZCBmcm9tIEphdmEgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKGNsYXp6KTsKKyAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYSgyKUh0dHBTZXJ2aWNlIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsIG1ldGhvZCwgc2lnbmF0dXJlKTsKKyAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKworICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwganVyaSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihlbnYsIHNlcnZpY2UsIHZlcnNpb24pOworICAgIHJldHVybiBodHRwU2VydmljZTsKKworfQorCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pIHsKKworICAgIEpOSUVudiAqZW52OworICAgIGNvbnN0IGNoYXIgKmNsYXp6LCAqbWV0aG9kLCAqc2lnbmF0dXJlOworCisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSI7CisgICAgICAgICAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2UiOworICAgICAgICAgICAgbWV0aG9kID0gImNyZWF0ZUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBTZXJ2aWNlOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoZW52LCB1cmksIGNsYXp6LCBtZXRob2QsIHNpZ25hdHVyZSwgdmVyc2lvbik7CisKK30KKwogZXh0ZXJuICJDIiB7CiAKIEVYUE9SVApAQCAtMTA1LDYgKzIxMSwzMiBAQAogfQogCiBFWFBPUlQKK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIHsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IHNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleV92YWx1ZXNbaSAqIDJdKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgoa2V5X3ZhbHVlc1tpICogMiArIDFdKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShzZXJ2aWNlLCB1cmksICZoZWFkZXJzKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTE9HSSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlICVzIGZsYWdzICV1Iiwgc291cmNlLT50b1N0cmluZygpLmNfc3RyKCksIHNvdXJjZS0+ZmxhZ3MoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZSogYVNvdXJjZSA9IGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKHNvdXJjZSk7CisgICAgYVNvdXJjZS0+bUltcGwgPSBzb3VyY2U7CisgICAgYVNvdXJjZS0+bUZsYWdzID0gc291cmNlLT5mbGFncygpOworICAgIHJldHVybiBhU291cmNlOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgewogICAgIEFMT0dWKCJkdG9yIik7CiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewpAQCAtMTMyLDUgKzI2NCwxNiBAQAogICAgIG1Tb3VyY2UtPmNsb3NlID0gY2xvc2U7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Y2xvc2UobVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemUpIHsKKyAgICBtU291cmNlLT5nZXRBdmFpbGFibGVTaXplID0gZ2V0QXZhaWxhYmxlU2l6ZTsKK30KKwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNTdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmdldEF2YWlsYWJsZVNpemUob2Zmc2V0LCAmc2l6ZSk7CisgICAgcmV0dXJuICBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMzMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNkZWZpbmUgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgQU1lZGlhRGF0YVNvdXJjZSogY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtU291cmNlLCBzb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1Tb3VyY2UsIERhdGFTb3VyY2VfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1Tb3VyY2UsIERhdGFTb3VyY2VfY2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUpOworICAgIHJldHVybiBtU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCmluZGV4IGVhOWM4NjUuLjE2ZmY5NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQzLDExICs0NCwxMyBAQAogICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOwpAQCAtNTksNSArNjIsNyBAQAogCiB9OwogCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pOworCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCBiNmVhMTgzLi4yZGViMWE0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTI3NCw3ICsyNzQsMTAgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7Ci0gICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7CisgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0ciwKKyAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgIHJldHVybiAoc3RhdHVzID09IE9LKSAmJiBpc1N1cHBvcnRlZDsKIH0KIAogRVhQT1JUCkBAIC00MzAsNiArNDMzLDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNjk3LDcgKzcwMSw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGFjODM3YTMuLjI4ZTRmMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC00MCwyNCArNDEsMjMgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87Ci0gICAgfQotCi0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwogICAgIHNwPEFCdWZmZXI+IG1Qc3NoQnVmOwogfTsKIAorc3A8QUJ1ZmZlcj4gVTMyQXJyYXlUb1NpemVCdWYoc2l6ZV90IG51bVN1YlNhbXBsZXMsIHVpbnQzMl90ICpkYXRhKSB7CisgICAgaWYgKG51bVN1YlNhbXBsZXMgPiAgU0laRV9NQVggLyBzaXplb2Yoc2l6ZV90KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gc2l6ZWJ1ZiA9IG5ldyBBQnVmZmVyKG51bVN1YlNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgc2l6ZV90ICpzaXplcyA9IChzaXplX3QgKilzaXplYnVmLT5kYXRhKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IHNpemVzICE9IE5VTEwgJiYgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgeworICAgICAgICBzaXplc1tpXSA9IGRhdGFbaV07CisgICAgfQorICAgIHJldHVybiBzaXplYnVmOworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC04Miw0NyArODIsMzUgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKIH0KIAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdmFsdWVzKSB7CisKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBjcmVhdGUgaHR0cCBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5c1tpXSk7CisgICAgICAgIFN0cmluZzggdmFsdWU4KHZhbHVlc1tpXSk7CisgICAgICAgIGhlYWRlcnMuYWRkKGtleTgsIHZhbHVlOCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJpLCBudW1oZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgbG9jYXRpb24pOwotICAgIC8vIFRPRE86IGFkZCBoZWFkZXIgc3VwcG9ydAotCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKLSAgICBpZiAoZW52ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UocGF0aCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBKYXZhIHRocmVhZCIpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKLSAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKLSAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKLSAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7Ci0KLSAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7Ci0KLSAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7Ci0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOwotICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOwotICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlV2l0aEhlYWRlcnMobURhdGEsIGxvY2F0aW9uLCAwLCBOVUxMLCBOVUxMKTsKIH0KIAogRVhQT1JUCkBAIC0zNjMsNyArMzUxLDcgQEAKICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZihzaXplX3QpOworICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2YodWludDMyX3QpOwogCiAgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOwogICAgIHNpemVfdCBjbGVhcnNpemU7CkBAIC0zOTcsNiArMzg1LDE2IEBACiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCisgICAgaWYgKHNpemVvZih1aW50MzJfdCkgIT0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJidWYgICA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNsZWFyZGF0YSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGNyeXB0ZWRidWYgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljcnlwdGVkZGF0YSk7CisgICAgICAgIGNsZWFyZGF0YSAgID0gY2xlYXJidWYgICAgPT0gTlVMTCA/IE5VTEwgOiBjbGVhcmJ1Zi0+ZGF0YSgpOworICAgICAgICBjcnlwdGVkZGF0YSA9IGNyeXB0ZWRkYXRhID09IE5VTEwgPyBOVUxMIDogY3J5cHRlZGJ1Zi0+ZGF0YSgpOworICAgICAgICBpZihjcnlwdGVkZGF0YSA9PSBOVUxMIHx8IGNsZWFyZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAogICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICh1aW50OF90Kikga2V5LApAQCAtNDcyLDYgKzQ3MCwxNiBAQAogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwgbXBlZ1VzZXJEYXRhKTsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkICphdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyOworICAgIHNpemVfdCBhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGg7CisgICAgaWYgKHNhbXBsZU1ldGEtPmZpbmREYXRhKAorICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmRhdGFUeXBlLAorICAgICAgICAgICAgJmF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXIsICZhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlciwgYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoKTsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEpOworICAgIH0KKwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGYzMmI4M2UuLjI2YTYyMzggMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpAQCAtMzIsMzEgKzMzLDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0cnVjdCBBTWVkaWFGb3JtYXQgewotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIFN0cmluZzggbURlYnVnOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKLX07Ci0KIGV4dGVybiAiQyIgewogCi0vLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKLSAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7Ci0gICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKLSAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7Ci0gICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOwotICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgewotICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKLX0KLQotCiAvKgogICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdwogICovCkBAIC03NCw2ICs1MiwyMSBAQAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPmNsZWFyKCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSB7CisgICAgaWYgKCF0byB8fCAhZnJvbSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICB0by0+bUZvcm1hdC0+Y2xlYXIoKTsKKyAgICB0by0+bUZvcm1hdC0+ZXh0ZW5kKGZyb20tPm1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIAogRVhQT1JUCiBjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0ICptRGF0YSkgewpAQCAtMjU2LDcgKzI0OSw3IEBACiB9CiAKIEVYUE9SVAotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQogICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CiAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CkBAIC0yNzUsNjUgKzI2OCwxMjAgQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNID0gImFsYnVtIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUID0gImFsYnVtYXJ0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUID0gImFsYnVtYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCA9ICJhcnRpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gPSAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCA9CisgICAgICAgICJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEID0gImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQgPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgPSAiYXV0aG9yIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSA9ICJiaXRyYXRlLW1vZGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAiYml0cy1wZXItc2FtcGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSA9ICJjYXB0dXJlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiA9ICJjZHRyYWNrbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgPSAiY29sb3ItcmFuZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgPSAiY29sb3Itc3RhbmRhcmQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgPSAiY29sb3ItdHJhbnNmZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gPSAiY29tcGlsYXRpb24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSA9ICJjb21wbGV4aXR5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSID0gImNvbXBvc2VyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCA9ICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSA9ICJjcnlwdG8tZGVmYXVsdC1pdi1zaXplIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyA9ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyA9ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViA9ICJjcnlwdG8taXYiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSA9ICJjcnlwdG8ta2V5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFID0gImNyeXB0by1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUyA9ICJjcnlwdG8tcGxhaW4tc2l6ZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyA9ICJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRCA9ICJjc2QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAgPSAiY3NkLTAiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEgPSAiY3NkLTEiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIgPSAiY3NkLTIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyA9ICJjc2QtYXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDID0gImNzZC1oZXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgPSAiZDI2MyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EQVRFID0gImRhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiA9ICJkaXNjbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCA9ICJjcm9wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUID0gImRpc3BsYXktaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEggPSAiZGlzcGxheS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgPSAiZW5jb2Rlci1kZWxheSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcgPSAiZW5jb2Rlci1wYWRkaW5nIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VTRFMgPSAiZXNkcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCA9ICJleGlmLW9mZnNldCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUgPSAiZXhpZi1zaXplIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCA9ICJmcmFtZS1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgPSAiZ2VucmUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TID0gImdyaWQtY29scyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MgPSAiZ3JpZC1yb3dzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyA9ICJoZHItc3RhdGljLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSMTBfUExVU19JTkZPID0gImhkcjEwLXBsdXMtaW5mbyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgPSAiaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFID0gImljYy1wcm9maWxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EID0gImludHJhLXJlZnJlc2gtcGVyaW9kIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMgPSAiaXMtYWR0cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUID0gImlzLWF1dG9zZWxlY3QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCA9ICJpcy1kZWZhdWx0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSA9ICJpcy1mb3JjZWQtc3VidGl0bGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSA9ICJpcy1zeW5jLWZyYW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZID0gImxhdGVuY3kiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgPSAibGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gPSAibG9jYXRpb24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9PUCA9ICJsb29wIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUID0gImx5cmljaXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFID0gIm1heC1iaXRyYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUUgPSAibWltZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSA9ICJtcGVnLXVzZXItZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSID0gIm1wZWcyLXN0cmVhbS1oZWFkZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUgPSAib3BlcmF0aW5nLXJhdGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HID0gInBjbS1lbmNvZGluZyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gPSAicGNtLWJpZy1lbmRpYW4iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCA9ICJwc3NoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OID0gInJvdGF0aW9uLWRlZ3JlZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCA9ICJzYXItaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCA9ICJzYXItd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERSA9ICJzdHJpZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgPSAidGFyZ2V0LXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgPSAidGVtcG9yYWwtbGF5ZXItY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQgPSAidGVtcG9yYWwtbGF5ZXItaWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcgPSAidHMtc2NoZW1hIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgPSAidGV4dC1mb3JtYXQtZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUID0gInRodW1ibmFpbC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgPSAidGh1bWJuYWlsLXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIID0gInRodW1ibmFpbC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCA9ICJ0aWxlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIID0gInRpbGUtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUyA9ICJ0aW1lVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgPSAidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggZGZmYzRkNy4uZTc5OTI2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM2LDE0ICszNyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjE0ZDg4Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSw0MiBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5LAorCisgICAgLyoqCisgICAgICogQ29tcHJlc3NlZCBIRUlDIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZm9ybWF0IGRlZmluZXMgdGhlIEhFSUMgYnJhbmQgb2YgSGlnaCBFZmZpY2llbmN5IEltYWdlIEZpbGUKKyAgICAgKiBGb3JtYXQgYXMgZGVzY3JpYmVkIGluIElTTy9JRUMgMjMwMDgtMTIuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfSEVJQyA9IDB4NDg0NTQ5NDYsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDY4ZGUxNzYuLmU1ZDg2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtMzcsNiArMzcsOSBAQAogI2RlZmluZSBfTkRLX0lNQUdFX1JFQURFUl9ICiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgpAQCAtNDYxLDYgKzQ2NCwyMyBAQAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcigKICAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworLyoKKyAqIEdldCB0aGUgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFOYXRpdmVXaW5kb3cgb3duZWQgYnkgdGhlCisgKiBBSW1hZ2VSZWFkZXIgcHJvdmlkZWQuCisgKgorICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgorICogQHBhcmFtIGhhbmRsZSBUaGUgb3V0cHV0IG5hdGl2ZV9oYW5kbGVfdC4gVGhpcyBuYXRpdmUgaGFuZGxlIGlzIG93bmVkIGJ5CisgKiAgICAgICAgICAgICAgIHRoaXMgaW1hZ2UgcmVhZGVyLgorICoKKyAqIEByZXR1cm4gQU1FRElBX09LIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGlmIHJlYWRlciBvciBoYW5kbGUgYXJlIE5VTEwuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIGlmIHNvbWUgb3RoZXIgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoCisgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qIG91dCAqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAppbmRleCBlYTViYTBjLi4xNmIxZWIzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaApAQCAtNDMsMTQgKzQzLDkgQEAKIC8qCiAgKiBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHRocmVhZAogICogb3IgdGhyZWFkIHBvb2wuIE5vIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGFib3V0IHdoaWNoIHRocmVhZChzKSB3aWxsIGJlIHVzZWQgZm9yCi0gKiBjYWxsYmFja3MuIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgb25seQotICogZXZlciBiZSBpbnZva2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCi0gKgotICogVGhlcmUgd2lsbCBiZSBhIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcG9pbnQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoYXQKLSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlIG9mIHlvdXIgQU1lZGlhRGF0YVNvdXJjZSBhcmUgdmlzaWJsZSB0byBmdXR1cmUKLSAqIGNhbGxzLiBUaGlzIG1lYW5zIHlvdSBkb24ndCBuZWVkIHRvIGRvIHlvdXIgb3duIHN5bmNocm9uaXphdGlvbiB1bmxlc3MgeW91J3JlCi0gKiBtb2RpZnlpbmcgdGhlIEFNZWRpYURhdGFTb3VyY2UgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlCi0gKiBmcmFtZXdvcmsuCisgKiBjYWxsYmFja3MuIEZvciBleGFtcGxlLCB8Y2xvc2V8IGNhbiBiZSBpbnZva2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlCisgKiB0aHJlYWQgaW52b2tpbmcgfHJlYWRBdHwuIEFzIHN1Y2gsIHRoZSBJbXBsZW1lbnRhdGlvbnMgb2YgQU1lZGlhRGF0YVNvdXJjZSBjYWxsYmFja3MKKyAqIG11c3QgYmUgdGhyZWFkc2FmZS4KICAqLwogCiAvKioKQEAgLTc0LDkgKzY5LDE5IEBACiB0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKLSAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCi0gKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgfGNsb3NlfCBpcyBjYWxsZWQKLSAqIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZS4KKyAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQKKyAqIHJlc291cmNlcy4KKyAqCisgKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IHxjbG9zZXwgaXMKKyAqIGNhbGxlZCwgbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlIGV4Y2VwdAorICogZm9yIHxjbG9zZXwgaXRzZWxmLgorICoKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBhbGxvd3MgcmVhZEF0IGNhbGxzIHRoYXQgd2VyZSBibG9ja2VkIHdhaXRpbmcKKyAqIGZvciBJL08gZGF0YSB0byByZXR1cm4gcHJvbXB0bHkuCisgKgorICogV2hlbiB1c2luZyBBTWVkaWFEYXRhU291cmNlIGFzIGlucHV0IHRvIEFNZWRpYUV4dHJhY3RvciwgY2xvc2luZworICogaGFzIHRoZSBlZmZlY3Qgb2YgdW5ibG9ja2luZyBzbG93IHJlYWRzIGluc2lkZSBvZiBzZXREYXRhU291cmNlCisgKiBhbmQgcmVhZFNhbXBsZURhdGEuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOwogCkBAIC04Niw2ICs5MSwzOCBAQAogICovCiBBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKKyAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBSZXR1cm4gLTEgd2hlbiBzdWNoIGFuIGVzdGltYXRlIGlzIG5vdCBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBkYXRhIHNvdXJjZS4gUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmb3IgdGhlIG5ldyBkYXRhIHNvdXJjZSBvYmplY3QgZmFpbHMuCisgKgorICogU2V0IHRoZSB8dXJpfCBmcm9tIHdoaWNoIHRoZSBkYXRhIHNvdXJjZSB3aWxsIHJlYWQsCisgKiBwbHVzIGFkZGl0aW9uYWwgaHR0cCBoZWFkZXJzIHdoZW4gaW5pdGlhdGluZyB0aGUgcmVxdWVzdC4KKyAqCisgKiBIZWFkZXJzIHdpbGwgY29udGFpbiBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gfGtleV92YWx1ZXN8CisgKiBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgKgorICoga2V5X3ZhbHVlc1swXTprZXlfdmFsdWVzWzFdCisgKiBrZXlfdmFsdWVzWzJdOmtleV92YWx1ZXNbM10KKyAqIC4uLgorICoga2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMl06a2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMiArIDFdCisgKgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaShjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogLyoqCiAgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCiAgKi8KQEAgLTEzNyw2ICsxNzQsMzAgQEAKIAogI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSopIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYnl0ZXMKKyAqIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGRhdGEgc291cmNlIHN0YXJ0aW5nIGF0IGFuIG9mZnNldCB3aXRob3V0CisgKiBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZQorICogZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAppbmRleCA3NWY0NjA1Li4yYmUxZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCkBAIC02Myw2ICs2Myw3IEBACiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKICAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAogICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gOCwKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCA2YTE3OTZmLi5lM2Q5ZmU2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTcyLDcgKzcyLDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwKICAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24pIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggNWY3ODA0ZC4uZGRmNTI5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC04MywxMyArODMsOSBAQAogLyoqCiAgKiBUaGUgcHJvdmlkZWQgZGF0YSBpcyBjb3BpZWQgaW50byB0aGUgZm9ybWF0LgogICovCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAotCi0vKioKLSAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/Ci0gKi8KIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiBfX0lOVFJPRFVDRURfSU4oMjgpOwpAQCAtMTU2LDcgKzE1Miw2IEBACiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0KICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOApAQCAtMTcwLDYgKzE2NSw3NCBAQAogICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiByZW1vdmUgYWxsIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBnaXZlbiBBTWVkaWFGb3JtYXQKKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBjb3B5IG9uZSBBTWVkaWFGb3JtYXQgdG8gYW5vdGhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9PUCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BTlVGQUNUVVJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ZRUFSIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0IGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKaW5kZXggMTczZTdiNC4uN2JkZDNhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKKysrIGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKQEAgLTQsNiArNCw3IEBACiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZUFzeW5jOyAjIGludHJvZHVjZWQ9MjYKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZTsgI3ZuZGsKICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0Rm9ybWF0OyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0SGVpZ2h0OyAjIGludHJvZHVjZWQ9MjQKQEAgLTM0LDY0ICszNSwxMTYgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FSVElTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVY7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9HRU5SRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1M7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0U7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1k7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9PUDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BTlVGQUNUVVJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QU1NIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfWUVBUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGU7CkBAIC0xNDIsNiArMTk1LDkgQEAKICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ld1VyaTsgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlOyAgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9jbG9zZVNlc3Npb247CiAgICAgQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRDsKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKQEAgLTE2Myw2ICsyMTksOCBAQAogICAgIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXI7CiAgICAgQU1lZGlhRHJtX3NldFByb3BlcnR5Qnl0ZUFycmF5OwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZzsKKyAgICBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURybV9zZXRPbktleXNDaGFuZ2VMaXN0ZW5lcjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRHJtX3NpZ247CiAgICAgQU1lZGlhRHJtX3ZlcmlmeTsKICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZTsKQEAgLTE4Niw2ICsyNDQsOCBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcjsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRm9ybWF0X2NvcHk7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKICAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBmZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxOZGtJbWFnZVJlYWRlclByaXYuaD4KKyNpbmNsdWRlIDx2bmRrL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ltYWdlQnVmZmVyVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU47CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEltYWdlcyA9IDE7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCA9IDEzODQ4ODg2MTE7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAgPSBmYWxzZTsKK3N0YXRpYyBjb25zdGV4cHIgYW5kcm9pZF9kYXRhc3BhY2Uga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CitzdGF0aWMgY29uc3QgUmVjdCBrUXVldWVCdWZmZXJJbnB1dFJlY3QgPSBSZWN0KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSA9IDA7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSA9IDA7CitzdGF0aWMgY29uc3Qgc3A8RmVuY2U+IGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzID0gMTAwICogMTAwMDsKKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2Uoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwga0ltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUJ1ZmZlclVzYWdlICwga01heEltYWdlcywgJmltYWdlUmVhZGVyXyk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICBBU1NFUlRfTkUoaW1hZ2VSZWFkZXJfLCBudWxscHRyKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJEZXRhY2hlZENiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWFnZVJlYWRlcl8pIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIEFJbWFnZSAqb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfT0s7CisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW10oQUltYWdlICppbWcpIHsgQUltYWdlX2RlbGV0ZShpbWcpOyB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIGltYWdlIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoaW1hZ2VSZWFkZXJfLCAmb3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfTkUoaW1nLCBudWxscHRyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhIGhhbmRsZSB0byB0aGUgaW1hZ2UncyBoYXJkd2FyZSBidWZmZXIgYW5kIGEKKyAgICAgICAgLy8gbmF0aXZlIGhhbmRsZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyICpoYXJkd2FyZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIEFTU0VSVF9ORShoYXJkd2FyZUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICAgICAgaW1hZ2VBdmFpbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgaW1hZ2VDb25kVmFyXy5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikgeworICAgICAgICAodm9pZClyZWFkZXI7CisgICAgICAgIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKnRoaXNDb250ZXh0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqPihjb250ZXh0KTsKKyAgICAgICAgdGhpc0NvbnRleHQtPkhhbmRsZUltYWdlQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJSZW1vdmVkKHZvaWQgKiwgQUltYWdlUmVhZGVyICosIEFIYXJkd2FyZUJ1ZmZlciAqKSB7CisgICAgfQorCisgICAgQUltYWdlUmVhZGVyICppbWFnZVJlYWRlcl8gPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlUmVhZGVyQXZhaWxhYmxlQ2Jfe3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgaW1hZ2VSZWFkZXJEZXRhY2hlZENiX3t0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworICAgIHN0ZDo6bXV0ZXggaW1hZ2VBdmFpbGFibGVNdXRleF87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW1hZ2VDb25kVmFyXzsKKyAgICBib29sIGltYWdlQXZhaWxhYmxlXyA9IGZhbHNlOworfTsKKworc3RhdGljIHZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBBSW1hZ2VSZWFkZXIuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShpbWFnZVJlYWRlcl8sICZuaCk7CisgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG9ubHkgaW50cyBpbiB0aGUgaGFuZGxlLgorICAgIEFTU0VSVF9FUShuaC0+bnVtRmRzLCAwKTsKKyAgICBBU1NFUlRfTkUobmgtPm51bUludHMsIDApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgSEdCUCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGhhbmRsZS4KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0gIEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShuaCk7CisgICAgQVNTRVJUX05FKGhnYnAsIG51bGxwdHIpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGhnYnApOworICAgIGludCBkZXF1ZXVlZFNsb3QgPSAtMTsKKyAgICBzcDxGZW5jZT4gZGVxdWV1ZWRGZW5jZTsKKyAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBvdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5jb25uZWN0KG51bGxwdHIsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgZmFsc2UsICZvdXRwdXQpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZGVxdWV1ZSBhIGJ1ZmZlci4KKyAgICBBU1NFUlRfRVEoT0ssCisgICAgICAgICAgICAgIH5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OICYKKyAgICAgICAgICAgICAgICAgICAgICAoaWdicC0+ZGVxdWV1ZUJ1ZmZlcigmZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUZvcm1hdCwga0ltYWdlQnVmZmVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpKTsKKyAgICBFWFBFQ1RfTEUoMCwgZGVxdWV1ZWRTbG90KTsKKyAgICBFWFBFQ1RfR1QoQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMsIGRlcXVldWVkU2xvdCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBkZXF1ZXVlZEJ1ZmZlcjsKKyAgICBpZ2JwLT5yZXF1ZXN0QnVmZmVyKGRlcXVldWVkU2xvdCwgJmRlcXVldWVkQnVmZmVyKTsKKyAgICB1aW50OF90KiBpbWcgPSBudWxscHRyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPmxvY2soa0ltYWdlQnVmZmVyVXNhZ2UsICh2b2lkKiopKCZpbWcpKSk7CisKKyAgICAvLyBXcml0ZSBpbiBzb21lIGR1bW15IGltYWdlIGRhdGEuCisgICAgZmlsbFJHQkE4QnVmZmVyKGltZywgZGVxdWV1ZWRCdWZmZXItPmdldFdpZHRoKCksIGRlcXVldWVkQnVmZmVyLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRCdWZmZXItPmdldFN0cmlkZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT51bmxvY2soKSk7CisgICAgUXVldWVCdWZmZXJJbnB1dCBxdWV1ZUJ1ZmZlcklucHV0KGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UpOworICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+cXVldWVCdWZmZXIoZGVxdWV1ZWRTbG90LCBxdWV1ZUJ1ZmZlcklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KSk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgb25JbWFnZUF2YWlsYWJsZSBjYWxsYmFjayBpcyBjYWxsZWQsIG9yIHRpbWVvdXQgY29tcGxldGVzLgorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgaW1hZ2VDb25kVmFyXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXXsgcmV0dXJuIHRoaXMtPmltYWdlQXZhaWxhYmxlXzt9KTsKKyAgICBFWFBFQ1RfVFJVRShpbWFnZUF2YWlsYWJsZV8pIDw8ICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGltYWdlIGRhdGEgdG8gYmUgaGFuZGxlZCFcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOworCitzdGF0aWMgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUCAoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgaGFsVG9rZW4gdmVjPHVpbnQ4X3Q+CisgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGNvbnN0X2Nhc3Q8aW50ICo+KCYoaGFuZGxlLT5kYXRhWzFdKSkpLAorICAgICAgICBoYW5kbGUtPmRhdGFbMF0pOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIHJldHVybiBoZ2JwOworfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAwICB8fAorICAgICAgICBoYW5kbGUtPm51bUludHMgPCBzdGQ6OmNlaWwoc2l6ZW9mKHNpemVfdCkgLyBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQKGhhbmRsZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgYWltZworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBkNmRhZTViLi5hMTE2MDJiIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2LDI1ICsxNiwzOSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgIF0sCiAKKyAgICBsb2d0YWdzOiBbIkV2ZW50TG9nVGFncy5sb2d0YWdzIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHByb2R1Y3RfaXNfaW90OiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLURUQVJHRVRfQU5EUk9JRF9USElOR1MiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMGVhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0wLDAgKzEsNDEgQEAKKyMgVGhlIGVudHJpZXMgaW4gdGhpcyBmaWxlIG1hcCBhIHNwYXJzZSBzZXQgb2YgbG9nIHRhZyBudW1iZXJzIHRvIHRhZyBuYW1lcy4KKyMgVGhpcyBpcyBpbnN0YWxsZWQgb24gdGhlIGRldmljZSwgaW4gL3N5c3RlbS9ldGMsIGFuZCBwYXJzZWQgYnkgbG9nY2F0LgorIworIyBUYWcgbnVtYmVycyBhcmUgZGVjaW1hbCBpbnRlZ2VycywgZnJvbSAwIHRvIDJeMzEuICAoTGV0J3MgbGVhdmUgdGhlCisjIG5lZ2F0aXZlIHZhbHVlcyBhbG9uZSBmb3Igbm93LikKKyMKKyMgVGFnIG5hbWVzIGFyZSBvbmUgb3IgbW9yZSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzIG9yIHVuZGVyc2NvcmVzLCBpLmUuCisjICJbQS1aXVthLXpdWzAtOV1fIi4gIERvIG5vdCBpbmNsdWRlIHNwYWNlcyBvciBwdW5jdHVhdGlvbiAodGhlIGZvcm1lcgorIyBpbXBhY3RzIGxvZyByZWFkYWJpbGl0eSwgdGhlIGxhdHRlciBtYWtlcyByZWdleCBzZWFyY2hlcyBtb3JlIGFubm95aW5nKS4KKyMKKyMgVGFnIG51bWJlcnMgYW5kIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcworIyBzdGFydGluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4KKyMKKyMgT3B0aW9uYWxseSwgYWZ0ZXIgdGhlIHRhZyBuYW1lcyBjYW4gYmUgcHV0IGEgZGVzY3JpcHRpb24gZm9yIHRoZSB2YWx1ZShzKQorIyBvZiB0aGUgdGFnLiBEZXNjcmlwdGlvbiBhcmUgaW4gdGhlIGZvcm1hdAorIyAgICAoPG5hbWU+fGRhdGEgdHlwZVt8ZGF0YSB1bml0XSkKKyMgTXVsdGlwbGUgdmFsdWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorIworIyBUaGUgZGF0YSB0eXBlIGlzIGEgbnVtYmVyIGZyb20gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisjIDE6IGludAorIyAyOiBsb25nCisjIDM6IHN0cmluZworIyA0OiBsaXN0CisjCisjIFRoZSBkYXRhIHVuaXQgaXMgYSBudW1iZXIgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisjIDE6IE51bWJlciBvZiBvYmplY3RzCisjIDI6IE51bWJlciBvZiBieXRlcworIyAzOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzCisjIDQ6IE51bWJlciBvZiBhbGxvY2F0aW9ucworIyA1OiBJZAorIyA2OiBQZXJjZW50CisjIERlZmF1bHQgdmFsdWUgZm9yIGRhdGEgb2YgdHlwZSBpbnQvbG9uZyBpcyAyIChieXRlcykuCisjCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSB0YWdzLgorCisjIDYxMDAwIC0gNjExOTkgcmVzZXJ2ZWQgZm9yIGF1ZGlvc2VydmVyCisKKzYxMDAwIGF1ZGlvc2VydmVyX2JpbmRlcl90aW1lb3V0IChjb21tYW5kfDMpCisKKyMgTk9URSAtIHRoZSByYW5nZSAxMDAwMDAwLTIwMDAwMDAgaXMgcmVzZXJ2ZWQgZm9yIHBhcnRuZXJzIGFuZCBvdGhlcnMgd2hvCisjIHdhbnQgdG8gZGVmaW5lIHRoZWlyIG93biBsb2cgdGFncyB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIGNvcmUgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWM0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZVV0aWxpdGllcyIKKworI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKKyAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKKyAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKKyAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCisgKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgorICovCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CisKK3N0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKKyAgICB9CisgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcworICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQorICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKKyAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCisgICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCisgICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgorICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2VzWzBdOworfQorCitzdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQorICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgorICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgorICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQorICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXBwT3BzLmNoZWNrT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKK30KKworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKK30KKwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm47CisKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Cit9CisKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCisgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKKyAgICAvLyBnaXZlbiB0aGlzIGlzIGEgcGVybWlzc2lvbiBjaGVjaywgY291bGQgdGhpcyBiZSBpc0F1ZGlvU2VydmVyT3JSb290VWlkKCk/CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgKKyAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQpOworCisjaWZkZWYgVEFSR0VUX0FORFJPSURfVEhJTkdTCisgICAgaWYgKCFvaykgeworICAgICAgICAvLyBVc2UgYSBzZWNvbmRhcnkgcGVybWlzc2lvbiBvbiBBbmRyb2lkIFRoaW5ncyB0byBhbGxvdyBhIG1vcmUgbGVuaWVudCBsZXZlbCBvZiBwcm90ZWN0aW9uLgorICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCgKKyAgICAgICAgICAgICAgICAiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dFKCJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworI2Vsc2UKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbmRpZgorICAgIHJldHVybiBvazsKK30KKworYm9vbCBkdW1wQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKKyAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCisgICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkKK3sKKyAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgSU1lbW9yeSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGlNZW1vcnktPmdldE1lbW9yeSgpOworICAgIGlmIChoZWFwID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBoZWFwIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG9mZl90IHNpemUgPSBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoaU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwgfHwgc2l6ZSA8IChvZmZfdClpTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogcG9pbnRlciAlcCBzaXplICV6dSBmZCBzaXplICV1IiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpTWVtb3J5LT5wb2ludGVyKCksIGlNZW1vcnktPnNpemUoKSwgKHVpbnQzMl90KXNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcCBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZjRlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogc3RhdGljICovCitzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIHN0YXRpYyBzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gc1RpbWVDaGVja1RocmVhZCA9IG5ldyBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZCgpOworICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKKyAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCit7Cit9CisKK1RpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKKyAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKKyAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOworICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKKyAgICByZXR1cm4gZW5kVGltZU5zOworfQorCit2b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCitib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgY29uc3QgY2hhciAqdGFnOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisKKyAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOworICAgICAgICAvLyBLZXllZFZlY3RvciBtTW9uaXRvclJlcXVlc3RzIGlzIG9yZGVyZWQgc28gdGFrZSBmaXJzdCBlbnRyeSBhcyBuZXh0IHRpbWVvdXQKKyAgICAgICAgaWYgKG1Nb25pdG9yUmVxdWVzdHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGVuZFRpbWVOcyA9IG1Nb25pdG9yUmVxdWVzdHMua2V5QXQoMCk7CisgICAgICAgICAgICB0YWcgPSBtTW9uaXRvclJlcXVlc3RzLnZhbHVlQXQoMCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBuc2Vjc190IHdhaXRUaW1lTnMgPSBlbmRUaW1lTnMgLSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGlmICh3YWl0VGltZU5zID4gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWVOcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dfRVZFTlRfU1RSSU5HKExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCwgdGFnKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBSU1BR0VfUkVBREVSX1VUSUxTX0gKKyNkZWZpbmUgQUlNQUdFX1JFQURFUl9VVElMU19ICisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpbWcgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gUmV0cmlldmVzIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbmF0aXZlX2hhbmRsZV90CisvLyBwcm92aWRlZCAodGhpcyBuYXRpdmUgaGFuZGxlIE1VU1QgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoKSkuCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpOworCit9Ly8gbmFtZXNwYWNlIGFpbWcKK30vLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BSU1BR0VfUkVBREVSX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZDNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXworI2RlZmluZSBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGtlZXAgdmFsdWVzIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2F2L21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCitlbnVtIHsKKyAgTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VUID0gNjEwMDAsCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY1NGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQXVkaW8gcGVybWlzc2lvbiB1dGlsaXRpZXMKKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gc3lzdGVtIHNlcnZpY2VzLgorLy8gV2UgYWxsb3cgdGhhdCBzb21lIHNlcnZpY2VzIG1pZ2h0IGhhdmUgc2VwYXJhdGUgcHJvY2Vzc2VzIHRvCisvLyBoYW5kbGUgbXVsdGlwbGUgdXNlcnMsIGUuZy4gdTEwX3N5c3RlbSwgdTEwX2JsdWV0b290aCwgdTEwX3JhZGlvLgorc3RhdGljIGlubGluZSBib29sIGlzU2VydmljZVVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Cit9CisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIGF1ZGlvc2VydmVyLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVI7Cit9CisKKy8vIFVzZWQgZm9yIHNvbWUgcGVybWlzc2lvbiBjaGVja3MuCisvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIHx8IHVpZCA9PSBBSURfUk9PVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgY29tZSBmcm9tIHN5c3RlbSBzZXJ2ZXIgb3IgaW50ZXJuYWwuCisvLyBOb3RlOiBzeXN0ZW0gc2VydmVyIGlzIG11bHRpcHJvY2VzcyBmb3IgbXVsdGlwbGUgdXNlcnMuICBhdWRpb3NlcnZlciBpcyBub3QuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpID09IEFJRF9TWVNURU0gfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gTWVkaWFzZXJ2ZXIgbWF5IGZvcndhcmQgdGhlIGNsaWVudCBQSUQgYW5kIFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsOworLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHN3aXRjaCAodWlkKSB7CisgICAgY2FzZSBBSURfTUVESUE6CisgICAgY2FzZSBBSURfQVVESU9TRVJWRVI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOworYm9vbCBkdW1wQWxsb3dlZCgpOworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CitzdGF0dXNfdCBjaGVja0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApyZW5hbWUgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY5ZGM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgcGFja2FnZSBpcyBleGNsdWRlZCBmcm9tIGJ1aWxkIGZvciBub3cgc2luY2UgQVBJcyB1c2luZyB0aGlzIGFwayBiZWNhbWUgaGlkZGVuLgotIwotI0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLSNpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKSAjIEJ1aWxkIE1lZGlhQ29tcG9uZW50cyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgUERLIGJ1aWxkLiAgTWVkaWFDb21wb25lbnRzIHdvbid0Ci0jIyBidWlsZCBpbiBQREsgYnVpbGRzIGJlY2F1c2UgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSBpcyBub3QgYXZhaWxhYmxlIGJ1dAotIyMgSU1lZGlhU2Vzc2lvbjIuYWlkbCBhbmQgSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBhcmUgdXNpbmcgY2xhc3NlcyBmcm9tCi0jIyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhLgotIwotI2luY2x1ZGUgJChDTEVBUl9WQVJTKQotIwotI0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHMKLSNMT0NBTF9NT0RVTEVfT1dORVIgOj0gZ29vZ2xlCi0jCi0jIyBUT0RPOiBjcmVhdGUgYSBzZXBhcmF0ZSBrZXkgZm9yIHRoaXMgcGFja2FnZS4KLSNMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQotIwotIyMgVE9ETzogVXNlIFN5c3RlbSBTREsgb25jZSBwdWJsaWMgQVBJcyBhcmUgYXBwcm92ZWQKLSMjIExPQ0FMX1NES19WRVJTSU9OIDo9IHN5c3RlbV9jdXJyZW50Ci0jTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLSMKLSNMT0NBTF9TUkNfRklMRVMgOj0gXAotIyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAotIyAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCi0jCi0jTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5jZmcKLSMKLSNMT0NBTF9NVUxUSUxJQiA6PSBmaXJzdAotIwotI0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucwotIwotIyMgVG8gZW1iZWQgbmF0aXZlIGxpYnJhcmllcyBpbiBwYWNrYWdlLCB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93LgotIyNMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCi0jI0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSMjICAgIGxpYmFhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJhbXJleHRyYWN0b3IgXAotIyMgICAgbGliZmxhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1rdmV4dHJhY3RvciBcCi0jIyAgICBsaWJtcDNleHRyYWN0b3IgXAotIyMgICAgbGlibXA0ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wZWcyZXh0cmFjdG9yIFwKLSMjICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0jIyAgICBsaWJ3YXZleHRyYWN0b3IgXAotIwotIyMgVE9ETzogUmVtb3ZlIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBzdXBwb3J0IGxpYnJhcmllcy4KLSNMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgKz0gXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctYXBwY29tcGF0IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LXBhbGV0dGUKLSNMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQotIwotI2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQotIwotI2VuZGlmICAjIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpCi0jCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmZGNhMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgotCi0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIENvbXBvbmVudHMgVXBkYXRlIgotICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZXh0cmFjdE5hdGl2ZUxpYnM9ImZhbHNlIj4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmY3MzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBLZWVwIGVudHJ5IHBvaW50IGZvciB1cGRhdGFibGUgSmF2YSBjbGFzc2VzCi0ta2VlcCBwdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgewotICAgcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSBpbml0aWFsaXplKGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmZDUxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjODI1Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZGRlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5Y2Q3NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5MmFkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3MDdlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmQwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NWVlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFkMzQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZiNjVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU0ZjYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZlYmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDMwNWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZkZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM5ZGY3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMzNDRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAzNDIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjNlNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBjMjVhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkYjljMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NmMxMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2JmNDg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTExYjVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlZDUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y3ZTBjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU1OGE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGExYTg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlhZWQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2OGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M3NzdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA4Nzk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDJjOWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDJhYjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmVhNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3OTBjNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGQ1ODYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmI3NzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYzk4NDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjYxN2UxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZlZjNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEwMDQ3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNWQ2YTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxMzQzMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODk5Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3OGUwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MmZjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ODRlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwYWM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMTA0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzA2Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZDQ5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM5MzM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM1YTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjYzM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTE4MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YTUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNWRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3MjRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2I0MTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMThhYmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MTEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYjE5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiYTNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM0ZDViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTU3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDM4NGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNjI5Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhYjY4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3Zjc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzY2EzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWVjZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQwYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYmUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZjFiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE4YjQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGMyYzAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmFlNDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGMyODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmOTMyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMWY2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmYWZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJiZDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2ExZjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzEwNjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYjgwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYmEwMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdmMmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY1NDc4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTVhZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGI3ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmU1NzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNWQ2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGZhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZmUwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM0OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFlOTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDIxOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzBmYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMmYyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3MWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3ZjYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDFiMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmI2OTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlMTAxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzNTJjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzMmU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZiYTMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNiNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGJiMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1NzBmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNDAzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ0YmZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q2MDQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQ1NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmM0OGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOGY4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiOTBlNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzIzNGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0NTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWNmNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDA4YjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYjNmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZThiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmYzA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmExNmFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTk4Y2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmQxNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MDQ1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZGIxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM4MjhhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNjYzczLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGNlZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDFiOWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMWRkMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNzhlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MyY2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M1YmVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWQwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTU5MjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4N2UyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNmRiOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDIyNWJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY5N2RlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2VjMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQwYmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NWUzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzN2M2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYzEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NjE3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzA3NzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWQ3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzhkNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MDM0OWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjdjNDYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmNlYmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzMmE3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2MmNhMzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMzEyNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMWUxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1ZTg3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiNDQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhN2UwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MzUzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NWMzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhM2JhNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVjYTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMxODNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY2YjM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVhOGZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWIxMzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTJiNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MGFhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZWZlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYzMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNmZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODE2YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI5MzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNWI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYTBmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzJhNjU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRlYmMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTc4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2Y5OTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmYWQ5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDhkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmZDVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiNWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTFlZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzEwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYzA4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2YjMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU4ZmUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yjg0MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjQwNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjMThjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzUzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI5MWIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFjNjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDRhNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTBhNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWYzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NTFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg2NjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI4MTgzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTNmMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWUxNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM5MTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzNjYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NDRjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjM3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkMWRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU3MTA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjU5NmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2OGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMGRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUzOWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjMTVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWViYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOTFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNjZmOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhMzRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJkZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGJjYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmZmEwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmN2U1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFjNGRjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmE4NmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDEwOTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTZmMGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MDAxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MTU4MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk2MjA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5NTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTFiZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZThmMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMmU5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWQyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBkNTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzYxYWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTNmODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDE2NmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNTI3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMmE4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM3YWY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YzMWVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDlmNTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGViNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMGUxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MjVlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2ZTE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJmMWVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmRjZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTliODE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWU0NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWNhODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjNzVkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiZDI3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiMGFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxNGFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2ZlNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjJjMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjIxMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTdlM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYwMWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkyOGQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmZDc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTcxYThjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjYjZjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM4ODYzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzMzUwMzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmE0ODU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2E2Nzg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOTVkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTcyODIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YwZjUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODBkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzM5MzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAyNTM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjhmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDI3N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1YmZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWQ2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjRhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMwNjQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5MzI0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjE4ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNGU1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVmMDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVjNzU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1YzdmYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjg3ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdkMGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmYTcyYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTBlZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ0MzU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NzdjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjdmMGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxOWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1OTIxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yjc2YjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTk1MjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMWE2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9iYWNrZ3JvdW5kIj4KLSAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiMyNjAwMDAwMCIgLz4KLSAgICAgICAgPC9zaGFwZT4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvc2Vjb25kYXJ5UHJvZ3Jlc3MiPgotICAgICAgICA8Y2xpcD4KLSAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzVDZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLTwvbGF5ZXItbGlzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzU5NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJvdmFsIiA+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgPHNpemUKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgotICAgICAgICBhbmRyb2lkOndpZHRoPSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY3MWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yMCwxMUg3LjgzbDUuNTksLTUuNTlMMTIsNGwtOCw4IDgsOCAxLjQxLC0xLjQxTDcuODMsMTNIMjB2LTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjI4ZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDEyaC0ydjNoLTN2Mmg1di01ek03LDloM0wxMCw3TDUsN3Y1aDJMNyw5ek0yMSwzTDMsM2MtMS4xLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC45LDIgMiwyaDE4YzEuMSwwIDIsLTAuOSAyLC0yTDIzLDVjMCwtMS4xIC0wLjksLTIgLTIsLTJ6TTIxLDE5LjAxTDMsMTkuMDFMMyw0Ljk5aDE4djE0LjAyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzEyYjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwzdjkuMjhjLTAuNDcsLTAuMTcgLTAuOTcsLTAuMjggLTEuNSwtMC4yOEM4LjAxLDEyIDYsMTQuMDEgNiwxNi41UzguMDEsMjEgMTAuNSwyMWMyLjMxLDAgNC4yLC0xLjc1IDQuNDUsLTRIMTVWNmg0VjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjcyMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2ZDE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNS40MSw3LjQxTDE0LDZsLTYsNiA2LDYgMS40MSwtMS40MUwxMC44MywxMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTAsNkw4LjU5LDcuNDEgMTMuMTcsMTJsLTQuNTgsNC41OUwxMCwxOGw2LC02eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWU2NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI1MTJkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iNTEyZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSI1MTIiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iNTEyIj4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNjE2MTYxIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNIDAgMCBIIDUxMiBWIDUxMiBIIDAgViAwIFoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM1MjUyNTIiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNTYsMTUxdjEyMy4xNGMtNi44OC00LjAyLTE0LjgyLTYuNDgtMjMuMzMtNi40OCBjLTI1Ljc4LDAtNDYuNjcsMjAuODgtNDYuNjcsNDYuNjdjMCwyNS43OCwyMC44OCw0Ni42Nyw0Ni42Nyw0Ni42N3M0Ni42Ny0yMC44OCw0Ni42Ny00Ni42N1YxOTcuNjdIMzI2VjE1MUgyNTZ6IiAvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGYxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxncm91cD4KLSAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMjQsMjRIMFYwaDI0djI0eiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOS42IDEzLjVoLjRjLjIgMCAuNCwtLjEuNSwtLjJzLjIsLS4yLjIsLS40di0uMnMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNXMtLjEuMSwtLjIuMSwtLjEuMSwtLjEuMnYuMmgtMWMwLC0uMiAwLC0uMy4xLC0uNXMuMiwtLjMuMywtLjQuMywtLjIuNCwtLjIuNCwtLjEuNSwtLjFjLjIgMCAuNCAwIC42LjFzLjMuMS41LjIuMi4yLjMuNC4xLjMuMS41di4zcy0uMS4yLC0uMS4zLC0uMS4yLC0uMi4yLC0uMi4xLC0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQsLS4xLjVzLS4yLjMsLS4zLjQsLS4zLjIsLS41LjIsLS40LjEsLS42LjFjLS4yIDAsLS40IDAsLS41LC0uMXMtLjMsLS4xLC0uNSwtLjIsLS4yLC0uMiwtLjMsLS40LC0uMSwtLjQsLS4xLC0uNmguOHYuMnMuMS4xLjEuMi4xLjEuMi4xaC41cy4xLC0uMS4yLC0uMS4xLC0uMS4xLC0uMnYtLjVzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjZ2LS43em01LjcuN2MwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6TTQgMTNjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04aC0yYzAgMy4zLC0yLjcgNiwtNiA2cy02LC0yLjcsLTYsLTYgMi43LC02IDYsLTZ2NGw1LC01LC01LC01djRjLTQuNCAwLC04IDMuNiwtOCA4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjZiYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTcsMTRMNSwxNHY1aDV2LTJMNywxN3YtM3pNNSwxMGgyTDcsN2gzTDEwLDVMNSw1djV6TTE3LDE3aC0zdjJoNXYtNWgtMnYzek0xNCw1djJoM3YzaDJMMTksNWgtNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMDRlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNSwxNmgzdjNoMnYtNUw1LDE0djJ6TTgsOEw1LDh2Mmg1TDEwLDVMOCw1djN6TTE0LDE5aDJ2LTNoM3YtMmgtNXY1ek0xNiw4TDE2LDVoLTJ2NWg1TDE5LDhoLTN6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxZDc1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMQotMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45IC45MiBDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMSAuNDUgLTIuMQotMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2IC41OSAtLjg2IC41OSAtMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEKLTEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmUyMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjM0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjM0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgMC41NS0wLjQ1IDEtMSAxaC0wLjc1djEuNWgtMS41VjE1SDE0Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXY0em0tMy41LTAuNWgydi0zaC0ydjN6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FmNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxOUg1VjVoN1YzSDVjLTEuMTEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjg5LDIgMiwyaDE0YzEuMSwwIDIsLTAuOSAyLC0ydi03aC0ydjd6TTE0LDN2MmgzLjU5bC05LjgzLDkuODMgMS40MSwxLjQxTDE5LDYuNDFWMTBoMlYzaC03eiIvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGFhZWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3YyLjIxbDIuNDUsMi40NWMwLjAzLC0wLjIgMC4wNSwtMC40MSAwLjA1LC0wLjYzek0xOSwxMmMwLDAuOTQgLTAuMiwxLjgyIC0wLjU0LDIuNjRsMS41MSwxLjUxQzIwLjYzLDE0LjkxIDIxLDEzLjUgMjEsMTJjMCwtNC4yOCAtMi45OSwtNy44NiAtNywtOC43N3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxek00LjI3LDNMMyw0LjI3IDcuNzMsOUwzLDl2Nmg0bDUsNXYtNi43M2w0LjI1LDQuMjVjLTAuNjcsMC41MiAtMS40MiwwLjkzIC0yLjI1LDEuMTh2Mi4wNmMxLjM4LC0wLjMxIDIuNjMsLTAuOTUgMy42OSwtMS44MUwxOS43MywyMSAyMSwxOS43M2wtOSwtOUw0LjI3LDN6TTEyLDRMOS45MSw2LjA5IDEyLDguMThMMTIsNHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JlMjI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMSwxNkw5LDE2TDksOGgydjh6TTE1LDE2aC0yTDEzLDhoMnY4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM5ZGVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTEwLDE2LjV2LTlsNiw0LjUgLTYsNC41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2ZDVkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJldmVuT2RkIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIsMiw2LjQ4LDIsMTJjMCw1LjUyLDQuNDgsMTAsMTAsMTBjNS41MiwwLDEwLTQuNDgsMTAtMTAKLUMyMiw2LjQ4LDE3LjUyLDIsMTIsMnoKLU0xOCwxMmMwLDMuMzEtMi42OSw2LTYsNmMtMy4zMSwwLTYtMi42OS02LTZoMmMwLDIuMjEsMS43OSw0LDQsNHM0LTEuNzksNC00cy0xLjc5LTQtNC00djNMOCw3bDQtNHYzCi1DMTUuMzEsNiwxOCw4LjY5LDE4LDEyeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ODZiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LC02IDYsLTYsLTIuNywtNiwtNkg0YzAgNC40IDMuNiA4IDggOHM4LC0zLjYgOCwtOCwtMy42LC04LC04LC04em0tMS4xIDExSDEwdi0zLjNMOSAxM3YtLjdsMS44LC0uNmguMVYxNnptNC4zLC0xLjhjMCAuMyAwIC42LC0uMS44bC0uMy42cy0uMy4zLC0uNS4zLC0uNC4xLC0uNi4xLC0uNCAwLC0uNiwtLjEsLS4zLC0uMiwtLjUsLS4zLC0uMiwtLjMsLS4zLC0uNiwtLjEsLS41LC0uMSwtLjh2LS43YzAsLS4zIDAsLS42LjEsLS44bC4zLC0uNnMuMywtLjMuNSwtLjMuNCwtLjEuNiwtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOSwtLjh2LS41cy0uMSwtLjIsLS4xLC0uMywtLjEsLS4xLC0uMiwtLjIsLS4yLC0uMSwtLjMsLS4xLC0uMiAwLC0uMy4xbC0uMi4ycy0uMS4yLC0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMywtLjFsLjIsLS4ycy4xLC0uMi4xLC0uM3YtMS41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWNiNmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwzSDVDMy44OSwzLDMsMy45LDMsNXYxNGMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY1QzIxLDMuOSwyMC4xLDMsMTksM3oKLU0xMyw5aDRjMC41NSwwLDEsMC40NSwxLDF2NCBjMCwwLjU1LTAuNDUsMS0xLDFoLTRWOXoKLU05LjUsMTMuNXYtMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMVYxMGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxdjFIOS41di0wLjVoLTJ2MUgxMAotYzAuNTUsMCwxLDAuNDUsMSwxVjE0YzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi0xaDEuNXYwLjVIOS41egotTTE0LjUsMTMuNWgydi0zaC0yVjEzLjV6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZWNjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS40MywxMi45OGMwLjA0LC0wLjMyIDAuMDcsLTAuNjQgMC4wNywtMC45OHMtMC4wMywtMC42NiAtMC4wNywtMC45OGwyLjExLC0xLjY1YzAuMTksLTAuMTUgMC4yNCwtMC40MiAwLjEyLC0wLjY0bC0yLC0zLjQ2Yy0wLjEyLC0wLjIyIC0wLjM5LC0wLjMgLTAuNjEsLTAuMjJsLTIuNDksMWMtMC41MiwtMC40IC0xLjA4LC0wLjczIC0xLjY5LC0wLjk4bC0wLjM4LC0yLjY1QzE0LjQ2LDIuMTggMTQuMjUsMiAxNCwyaC00Yy0wLjI1LDAgLTAuNDYsMC4xOCAtMC40OSwwLjQybC0wLjM4LDIuNjVjLTAuNjEsMC4yNSAtMS4xNywwLjU5IC0xLjY5LDAuOThsLTIuNDksLTFjLTAuMjMsLTAuMDkgLTAuNDksMCAtMC42MSwwLjIybC0yLDMuNDZjLTAuMTMsMC4yMiAtMC4wNywwLjQ5IDAuMTIsMC42NGwyLjExLDEuNjVjLTAuMDQsMC4zMiAtMC4wNywwLjY1IC0wLjA3LDAuOThzMC4wMywwLjY2IDAuMDcsMC45OGwtMi4xMSwxLjY1Yy0wLjE5LDAuMTUgLTAuMjQsMC40MiAtMC4xMiwwLjY0bDIsMy40NmMwLjEyLDAuMjIgMC4zOSwwLjMgMC42MSwwLjIybDIuNDksLTFjMC41MiwwLjQgMS4wOCwwLjczIDEuNjksMC45OGwwLjM4LDIuNjVjMC4wMywwLjI0IDAuMjQsMC40MiAwLjQ5LDAuNDJoNGMwLjI1LDAgMC40NiwtMC4xOCAwLjQ5LC0wLjQybDAuMzgsLTIuNjVjMC42MSwtMC4yNSAxLjE3LC0wLjU5IDEuNjksLTAuOThsMi40OSwxYzAuMjMsMC4wOSAwLjQ5LDAgMC42MSwtMC4yMmwyLC0zLjQ2YzAuMTIsLTAuMjIgMC4wNywtMC40OSAtMC4xMiwtMC42NGwtMi4xMSwtMS42NXpNMTIsMTUuNWMtMS45MywwIC0zLjUsLTEuNTcgLTMuNSwtMy41czEuNTcsLTMuNSAzLjUsLTMuNSAzLjUsMS41NyAzLjUsMy41IC0xLjU3LDMuNSAtMy41LDMuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMjgxMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiwxOGw4LjUsLTZMNiw2djEyek0xNiw2djEyaDJWNmgtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRhMzE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiw2aDJ2MTJMNiwxOHpNOS41LDEybDguNSw2TDE4LDZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTcyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS41LDUuNXYxM2gtMTV2LTEzSDE5LjV6IE0xOSw0SDVDMy44OSw0LDMsNC45LDMsNnYxMmMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY2QzIxLDQuOSwyMC4xLDQsMTksNEwxOSw0eiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTExLDExSDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTgsMTFoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAsMC41NS0wLjQ1LDEtMSwxaC0zYy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTFjMDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDdIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCAwLjU1LTAuNDUgMS0xIDFIN2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXptNyAwaC0xLjV2LTAuNWgtMnYzaDJWMTNIMTh2MWMwIDAuNTUtMC40NSAxLTEgMWgtM2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmIyYjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTMsOXY2aDRsNSw1TDEyLDRMNyw5TDMsOXpNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2OC4wNWMxLjQ4LC0wLjczIDIuNSwtMi4yNSAyLjUsLTQuMDJ6TTE0LDMuMjN2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXMtMi4xMSw1Ljg1IC01LDYuNzF2Mi4wNmM0LjAxLC0wLjkxIDcsLTQuNDkgNywtOC43N3MtMi45OSwtNy44NiAtNywtOC43N3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZmYxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM3ZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWY3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjQxNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxZGZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2Q4NGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodCIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjOGM3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUwZTBmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci0KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjN2VjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrIGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2RhcmsiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjIzNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0IGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2xpZ2h0IiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjcyYmM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNmZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMThhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxZjAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0NWEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI3YTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMDhhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzZjZTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNGZkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWRiYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYXVkaW90cmFja19saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmExNzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMC40IgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJmMjk4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgotICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGQzNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC41IgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiIC8+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NmRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDdhNzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNTk1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wcmV2IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmZ3ZCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTcwNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0IzMDBGRjAwIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWJiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZWE1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTI4ZDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDc4NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NThmMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2JhciIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhciI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkJhY2siLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNXNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfcmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9leHRlcm5hbF9saW5rIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTBzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2xhdW5jaCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkxhdW5jaCIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nhc3QiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24iIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPC9SZWxhdGl2ZUxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jZW50ZXJfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9taW5pbWFsX2V4dHJhX3ZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCi0gICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPgotCi0gICAgICAgIDxTZWVrQmFyCi0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tY3YyX3NlZWtfYmFyX2Rlc2MiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjEwZHAiLz4KLQotICAgICAgICA8VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc19idWZmZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9idWZmZXJfdmlld19oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIwZHAiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2JhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NGRwIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9za2lwX3RpbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JvdHRvbV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiA+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9jdXJyZW50IgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuQ3VycmVudCIvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2ludGVycHVuY3QiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5JbnRlcnB1bmN0Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfZW5kIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuRW5kIi8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50RW5kPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhc2ljX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotCi0gICAgICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfcmVtYWluaW5nIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXRlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5NdXRlIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkNDIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19yaWdodCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCIvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4dHJhX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotCi0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbV9idXR0b25zIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZGVvX3F1YWxpdHkiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5ncyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfbGVmdCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjODBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL01pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OWUxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfdGl0bGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfbGlzdCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiIC8+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3NlYXJjaGluZyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgICAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRwIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmluZGV0ZXJtaW5hdGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg4NzliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI1NmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2ljb24iCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyNGRwIiAvPgotCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2Rlc2MiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDQ0NzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZXhwYW5kYWJsZV9hcmVhIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGlhbG9nX2FyZWEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRGbG9hdGluZyI+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl90aXRsZV9iYXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KLSAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2Nsb3NlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jdXN0b21fY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kZWZhdWx0X2NvbnRyb2wiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvclByaW1hcnkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX21lZGlhX21haW5fY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPgotICAgICAgICAgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfcGxheWJhY2tfY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfcGxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfZGl2aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmNlIGRpYWxvZydzIHRvcCBsYXlvdXQgbXJfZXhwYW5kYWJsZV9hcmVhIGlzIGNsaWNrYWJsZSwgaXQgcHJvcGFnYXRlcyBwcmVzc2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGl0cyBub24tY2xpY2thYmxlIGNoaWxkcmVuLiBTcGVjaWZ5IGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIiB0byBwcmV2ZW50IHZvbHVtZSBzbGlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoYXZpbmcgZmFsc2UgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9ncm91cF9leHBhbmRfY29sbGFwc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9ncm91cF9saXN0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclN0eWxlPSJvdXRzaWRlT3ZlcmxheSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0ZyYW1lTGF5b3V0PgotICAgICAgICA8U2Nyb2xsVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25QYW5lbCIKLSAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9idXR0b25CYXJTdHlsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxJbmRpY2F0b3JzPSJ0b3B8Ym90dG9tIj4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZHAiPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmV1dHJhbEJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmVnYXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjEiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclBvc2l0aXZlQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICA8L2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0PgotICAgICAgICA8L1Njcm9sbFZpZXc+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5MDU4Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC92b2x1bWVfaXRlbV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2MGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9pdGVtX2ljb24iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgLz4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMwNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOmRpdmlkZXI9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlckhlaWdodD0iMGRwIj4KLTwvTGlzdFZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWZjNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxncmFkaWVudAotICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiCi0gICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfZW5kIgotICAgICAgICBhbmRyb2lkOmFuZ2xlPSItMjcwIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIzMGFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN0ZWxzZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVG9lc3RlbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbm9wcGllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVWl0c2FhaS1rbm9wcGllLiBPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlVpdHNhYWkta25vcHBpZS4gS29wcGVsIHRhbnMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVWl0c2FhaS1rbm9wcGllLiBHZWtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWFpIHVpdCBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlZpbmQgdGFucyB0b2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT250a29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSG91IG9wIHVpdHNhYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1hYWsgdG9lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkxhYXQgd2FnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlZvdSB1aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlZvdSBpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVta3Vuc3dlcmsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lZ2x5ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgaXMgZ2VraWVzIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmxpZ3RpbmcgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNhYWkgdGFucyBza2VybSB1aXQiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Yi14Yit4YuT4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGImOGIo+GIquGLq+GLjuGJvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGLqENhc3Qg4Yqg4Yud4Yir4YitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4YyN4YqV4YqZ4YqQ4Ym1IOGJsOGJi+GIreGMp+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDhiqDhi53hiKvhiK0g4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhibDhjIjhipPhip3hibfhiI0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCDhiqDhi7XhiK3hjI0g4YuI4YuwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YiY4Yij4Yiq4Yur4YuO4Ym94YqVIOGJoOGIm+GMjeGKmOGJtSDhiIvhi60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YyN4YqV4YqZ4YqQ4Ym1IOGKoOGJi+GIreGMpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3Qg4Yib4Yu14Yio4YyNIOGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Yud4YyLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Yqg4Yyr4YuN4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhiIjhiqDhjY3hibMg4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Yqg4Yi14Y2LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhiLDhiaXhiLXhiaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhi6jhiqDhiI3hiaDhiJ0g4Yi14YqQLeGMpeGJoOGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhibDhipXhiLjhiKvhibPhib0g4Yuo4Yu14Yid4Y2FIOGImOGJhuGMo+GMoOGIquGLqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Yid4YqV4YidIOGIm+GIheGLsOGIqOGImOGIqOGMgyDhiqDhiI3hibDhiJjhiKjhjKDhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGIneGKleGInSDhiJjhiKjhjIMg4Yqg4Yut4YyI4Yqd4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhiJvhi6sg4YyI4Yy94YqVIOGJoOGImOGLjeGIsOGLtSDhiIvhi60iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmI5N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2KfZhNmG2LjYp9mFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itin2YTYo9is2YfYstipIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYstixINin2YTYpdix2LPYp9mELiDYrNin2LHZjSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itil2LHYs9in2YQg2KXZhNmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KzYp9ix2Y0g2KfZhNio2K3YqyDYudmGINij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KXZitmC2KfZgSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KXYutmE2KfZgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itiq2LTYutmK2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Itil2YrZgtin2YEg2YXYpNmC2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYpdmK2YLYp9mBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KrZiNiz2YrYuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2KrYtdi62YrYsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti12YjYsdipINin2YTYo9mE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iti02LHZiti3INiq2YXYsdmK2LEg2YXYs9iq2YjZiSDYp9mE2LXZiNiqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLZhNmFINmK2KrZhSDYp9iu2KrZitin2LEg2KPZiiDZiNiz2KfYpti3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLZhNinINiq2KrZiNmB2LEg2KPZiiDZhdi52YTZiNmF2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2KzYp9ix2Y0g2KXYsdiz2KfZhCDYp9mE2LTYp9i02KkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzYwYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFtIGTDvHltyZlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbSBkw7x5bcmZc2kuIEJhxJ9sYW50xLEga8mZc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bGR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkJ1cmEgeWF5xLFtbGF5xLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYXh0YXLEsWzEsXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsW7EsSBryZlzaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW3EsSBkYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlFhcGFkxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmR1cnVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGF5YW5kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbMmZbmRpcmluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZxLHEn2NhbWxhxZ9kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gaW5jyZlzyZluyZl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTyZlzIGjJmXJtaSBkaXlpcmPJmXlpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIZcOnIGJpciBtZWRpYSBzZcOnaWxtyZl5aWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IsaPbMOnYXRhbiBtyZlsdW1hdCB5b3hkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbWxhbsSxciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViZDZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSBQcmViYWNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgUHJlYmFjaS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIFByZWJhY2kuIFBvdmV6dWplIHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIFByZWJhY2kuIFBvdmV6YW4gamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlYmFjdWogbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQcm9uYWxhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1c3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW1hIGl6YWJyYW5paCBtZWRpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pc3UgZG9zdHVwbmUgbmlrYWt2ZSBpbmZvcm1hY2lqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM5MWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0ZbRgdGC0Y3QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDRi9C70LDQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQkNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0IbQtNC30LUg0L/QsNC00LrQu9GO0YfRjdC90L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCf0LDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GW0YDQsNCy0LDRhtGMINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDRi9C70LDQtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC00LvRg9GH0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9GL0L3RltGG0Ywg0YLRgNCw0L3RgdC70Y/RhtGL0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/RgNCw0LnQs9GA0LDRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0YvQv9GL0L3RltGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JLQvtC60LvQsNC00LrQsCDQsNC70YzQsdC+0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9Cw0Z7Qt9GD0L3QvtC6INCz0YPRh9C90LDRgdGG0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGL0Y/RhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQhtC90YTQsNGA0LzQsNGG0YvRjyDQsNC00YHRg9GC0L3RltGH0LDQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvSDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTJkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQktGA0YrQt9C60LDRgtCwINC1INC/0YDQtdC60YDQsNGC0LXQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQodCy0YrRgNC30LLQsCDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCj0YHRgtCw0L3QvtCy0LXQvdCwINC1INCy0YDRitC30LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQtNCw0LLQsNC90LUg0LrRitC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLRitGA0YHRj9GCINGB0LUg0YPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrRgNCw0YLRj9Cy0LDQvdC1INC90LAg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/QuNGA0LDQvdC1INC90LAg0L/RgNC10LTQsNCy0LDQvdC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQsNGA0Y/QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0LrQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0L7RgdGC0LDQstGP0L3QtSDQvdCwINC/0LDRg9C30LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0LjRgNCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0YrQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC40LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCDQvdCwINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C70YrQt9Cz0LDRhyDQt9CwINGB0LjQu9Cw0YLQsCDQvdCwINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0Y/QvNCwINC40LfQsdGA0LDQvdCwINC80YPQu9GC0LjQvNC10LTQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndGP0LzQsCDQvdCw0LvQuNGH0L3QsCDQuNC90YTQvtGA0LzQsNGG0LjRjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdGK0YIg0YHQtSDQv9GA0LXQtNCw0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNTkzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgprjgpr/gprjgp43gpp/gp4fgpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeB4KaV4KeN4KakIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpo/gpqTgp4cg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmv+CmleCnhyDgppbgp4vgpoHgppzgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kaa4Ka+4Kay4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpqzgpr/gprDgpr7gpq4g4Kam4Ka/4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kal4Ka+4Kau4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kas4Kah4Ka8IOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Ka44KaZ4KeN4KaV4KeB4Kaa4Ka/4KakIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCmheCnjeCmr+CmvuCmsuCmrOCmvuCmriDgprbgp4jgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kat4Kay4Ka/4KaJ4KauIOCmuOCnjeCmsuCmvuCmh+CmoeCmvuCmsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KaV4KeL4Kao4KeLIOCmruCmv+CmoeCmv+Cmr+CmvOCmviDgpqjgpr/gprDgp43gpqzgpr7gpprgpqgg4KaV4Kaw4Ka+IOCmueCmr+CmvOCmqOCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KaV4KeL4Kao4KeLIOCmpOCmpeCnjeCmryDgpongpqrgprLgpqzgp43gpqcg4Kao4KeH4KaHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgprjgp43gppXgp43gprDgp4Dgpqgg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWM3NDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3ZlemFubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZWRhbiBtZWRpaiBuaWplIG9kYWJyYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbWEgZG9zdHVwbmloIGluZm9ybWFjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODVhY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzIGRcJ2VtZXRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzIEVtZXQuIERlc2Nvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzIEVtZXQuIFNcJ2VzdMOgIGNvbm5lY3RhbnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzIEVtZXQuIENvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1ldCBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU1wnZXN0YW4gY2VyY2FudCBkaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25uZWN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkF0dXJhIGxcJ2VtaXNzacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUYW5jYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVlaXgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvc2EgZW4gcGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdHVyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkRlc3BsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXBsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hdGdlIGRlIGxcJ8OgbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGxsaXNjYW50IGRlIHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzXCdoYSBzZWxlY2Npb25hdCBjYXAgZml0eGVyIG11bHRpbcOoZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoaSBoYSBpbmZvcm1hY2nDsyBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzc2nDsyBkZSBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhODkyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphxZnDrXplbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gT2Rwb2plbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qb3bDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJPZGVzw61sYXQgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIbGVkw6Fuw60gemHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3Rhdml0IG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2xZnDrXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQxZllaHLDoXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYmFsIGFsYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zdXZuw61rIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lYnlsYSB2eWJyw6FuYSDFvsOhZG7DoSBtw6lkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lanNvdSBrwqBkaXNwb3ppY2kgxb7DoWRuw6kgaW5mb3JtYWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJPZGVzw61sw6Fuw60gb2JzYWh1IG9icmF6b3ZreSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YTc5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcC4gRm9yYmluZGVsc2VuIGVyIGFmYnJ1ZHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcC4gT3ByZXR0ZXIgZm9yYmluZGVsc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwLiBUaWxzbHV0dGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGVyIGVuaGVkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZicnlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBtZWQgYXQgY2FzdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU8OmdCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iTHlkc3R5cmtlc2t5ZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdlbiBtZWRpZXIgZXIgbWFya2VyZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRlciBlciBpbmdlbiB0aWxnw6ZuZ2VsaWdlIG9wbHlzbmluZ2VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Omcm1lbiBjYXN0ZXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY1N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdlcsOkdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LVN5bWJvbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBOaWNodCB2ZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJiaW5kdW5nIHdpcmQgaGVyZ2VzdGVsbHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdHJlYW1lbiBhdWYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHZXLDpHRlIHdlcmRlbiBnZXN1Y2h0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJWZXJiaW5kdW5nIHRyZW5uZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdHJlYW1pbmcgYmVlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2NobGllw59lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IldpZWRlcmdlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTWF4aW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWluaW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtY292ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2NoaWViZXJlZ2xlciBmw7xyIGRpZSBMYXV0c3TDpHJrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2VpbmUgTWVkaWVuIGF1c2dld8OkaGx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLZWluZSBJbmZvcm1hdGlvbmVuIHZlcmbDvGdiYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkJpbGRzY2hpcm0gd2lyZCBnZXN0cmVhbXQuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmNjliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Is6jz43Pg8+EzrfOvM6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Is6jz4XPg866zrXPhc6tz4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLOms6/z4XOvM+Azq8gQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6Rz4DOv8+Dz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrcuIM6jz43Ovc60zrXPg863IM+DzrUgzrXOvs6tzrvOuc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzqPPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Is6czrXPhM6szrTOv8+Dzrcgz4POtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Is6Vz43Pgc61z4POtyDPg8+Fz4POus61z4XPjs69Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Is6Rz4DOv8+Dz43Ovc60zrXPg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4izpTOuc6xzrrOv8+Azq4gzrzOtc+EzqzOtM6/z4POt8+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLOms67zrXOr8+DzrnOvM6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4izpHOvc6xz4DOsc+BzrHOs8+JzrPOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4izqDOsc+Nz4POtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Is6UzrnOsc66zr/PgM6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4izpHOvc6sz4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4izqPPjc68z4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Is6Vzr7Pjs+Gz4XOu867zr8gzqzOu868z4DOv8+FzrwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4izqHPhc64zrzOuc+Dz4TOuc66z4wgzq3Ovc+EzrHPg863z4Igzq7Ph86/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Is6UzrXOvSDOrc+Hzr/Phc69IM61z4DOuc67zrXOs861zq8gzrzOrc+DzrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Is6UzrXOvSDPhc+AzqzPgc+Hzr/Phc69IM60zrnOsc64zq3Pg865zrzOtc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Is6czrXPhM6szrTOv8+Dzrcgzr/OuM+Mzr3Ot8+CIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3MDA3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCOU3lzdGVt4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjkRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI/igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI/igI5DYXN0IGJ1dHRvbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjkNhc3QgYnV0dG9uLiBDb25uZWN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjkNhc3QgYnV0dG9uLiBDb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCOQ2FzdCB0b+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjkZpbmRpbmcgZGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI5EaXNjb25uZWN04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCOU3RvcCBjYXN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI5DbG9zZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjlBsYXnigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjlBhdXNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCOU3RvcOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjkV4cGFuZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCOQ29sbGFwc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI7igI7igI/igI5BbGJ1bSBhcnTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOVm9sdW1lIHNsaWRlcuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOTm8gbWVkaWEgc2VsZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjk5vIGluZm8gYXZhaWxhYmxl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI5DYXN0aW5nIHNjcmVlbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFlYWQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChkZXNjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhbmRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgbGEgdHJhbnNtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbiBkZWwgw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZWwgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2Ugc2VsZWNjaW9uw7MgbmluZ8O6biBjb250ZW5pZG8gbXVsdGltZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iU2luIGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGllbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzMDA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbnZpYXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW52aWFyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGVudsOtbyBkZSBjb250ZW5pZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlIHZvbHVtZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5nw7puIG1lZGlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoYXkgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVudmlhbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMyMzViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlPDvHN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlNlYWRtZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDnGxla2FuZGVudXBwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5xsZWthbmRlbnVwcC4gw5xoZW5kdXMgb24ga2F0a2VzdGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw5xsZWthbmRtaW5lIHNlYWRtZXNzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlYWRtZXRlIG90c2ltaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGtlc3RhIMO8aGVuZHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGVhdGEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxnZW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFc2l0YW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBlYXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBlYXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFpZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkFoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWkga3VqdW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGVsaXR1Z2V2dXNlIGxpdWd1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVlZGlhdCBwb2xlIHZhbGl0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRlYXZlIHB1dWR1YiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYWFuaWt1dmEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExOWU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2FpbHVhayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklnb3JyaSBib3RvaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJZ29ydHpla28gYm90b2lhLiBEZXNrb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR6ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR1dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSWdvcnJpIGhvbmE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iR2FpbHVhayBiaWxhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNrb25la3RhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVdHppIGlnb3J0emVhcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikl0eGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFcnJlcHJvZHV6aXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iR2VsZGl0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlphYmFsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRvbGVzdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWFyZW4gYXphbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQm9sdW1lbmFyZW4gZ3JhZHVhdHphaWxlYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRXogZGEgaGF1dGF0dSBtdWx0aW1lZGlhLWVkdWtpcmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFeiBkYWdvIGluZm9ybWF6aW9yaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBhbnRhaWxhIGlnb3J0emVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjNzc5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz24zYs9iq2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiv2qnZhdmHINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYp9ix2KrYqNin2Lcg2YLYt9i5INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYr9ix2K3Yp9mEINmF2LHYqtio2LfigIzYs9in2LLbjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2YXYsdiq2KjYtyDYtNivIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LHYs9in2YQg2YXYrdiq2YjYpyDYqNmHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2b7bjNiv2Kcg2qnYsdiv2YYg2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfYsdiq2KjYp9i3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KrZiNmC2YEg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNiz2KrZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itm+2K7YtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXaqdirIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KrZiNmC2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqNiy2LHaryDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2qnZiNqG2qkg2qnYsdiv2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYudqp2LMg2LHZiNuMINis2YTYryDYotmE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmE2LrYstmG2K/ZhyDZhduM2LLYp9mGINi12K/YpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2LHYs9in2YbZhyDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLYp9i32YTYp9i52KfYqiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiv2LHYrdin2YQg2YHYsdiz2KrYp9iv2YYg2LXZgdit2YciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODM0MzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSsOkcmplc3RlbG3DpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJMYWl0dGVldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtcGFpbmlrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtcGFpbmlrZS4gWWh0ZXlzIGthdGthaXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldMOkw6RuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXR0eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdW9yYXRvaXN0b24ga29oZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFdHNpdMOkw6RuIGxhaXR0ZWl0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrYWlzZSB5aHRleXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJMb3BldGEgc3VvcmF0b2lzdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iVG9pc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJLZXNrZXl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQeXPDpHl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWFqZW5uYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGlpdmlzdMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pbiBrYW5zaWt1dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iw4TDpG5lbnZvaW1ha2t1dWRlbiBsaXVrdXPDpMOkZGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFaSB2YWxpdHR1YSBtZWRpYWEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWV0b2phIGVpIG9sZSBzYWF0YXZpbGxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTdW9yYXRvaXN0ZXRhYW4gbsOkeXR0w7bDpCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY5ODRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3V0b24gRGlmZnVzZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3V0b24gRGlmZnVzZXIuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZXhpb24gZW4gY291cnPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRGlmZnVzZXIgc3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTZSBkw6ljb25uZWN0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHLDqWdsYWdlIGR1IHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMzMTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikljw7RuZSBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWPDtG5lIENhc3QuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWPDtG5lIENhc3QuIENvbm5leGlvbuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJY8O0bmUgQ2FzdC4gQ29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxz4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVjdHVyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnPigKYiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmMzNTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW1pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVtaXRpci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVyIGVtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJQZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJBbXBsaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb250cmFlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzcHJhemFibGUgZG8gdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOb24gc2Ugc2VsZWNjaW9uYXJvbiByZWN1cnNvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm9uIGhhaSBpbmZvcm1hY2nDs24gZGlzcG/DsWlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNpw7NuIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q1ZjNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCquOCqv+CquOCrjeCqn+CqriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqongqqrgqpXgqrDgqqPgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuN4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqiCDgqrDgqrngq43gqq/gq4HgqoIg4Kqb4KuHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCqhuCqqOCqviDgqqrgqrAg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCqieCqquCqleCqsOCqo+CriyDgqrbgq4vgqqfgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrgOCqjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCqteCqvuCqqOCrgeCqgiDgqrDgq4vgqpXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCqrOCqguCqpyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgqprgqrLgqr7gqrXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCqpeCri+CqreCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCqteCqv+CquOCrjeCqpOCrg+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCquOCqguCqleCrgeCqmuCqv+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqobgqrLgq43gqqzgqq4g4KqV4Kqy4Kq+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCqteCrieCqsuCrjeCqr+CrgeCqriDgqrjgq43gqrLgqr7gqofgqqHgqrAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCqleCri+CqiCDgqq7gq4DgqqHgqr/gqq/gqr4g4Kqq4Kq44KqC4KqmIOCqleCqsOCrh+CqsiDgqqjgqqXgq4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCqleCri+CqiCDgqq7gqr7gqrngqr/gqqTgq4Ag4KqJ4Kqq4Kqy4Kqs4KuN4KqnIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Kq44KuN4KqV4KuN4Kqw4KuA4Kqo4Kqo4KuHIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmE1OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KS+4KSH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYsg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpIfgpLgg4KSq4KSwIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpL7gpIfgpLgg4KSi4KWC4KSC4KSiIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKjgpL4g4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkmuCksuCkvuCkj+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkm+Cli+Ckn+CkviDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleCli+CkiCDgpK7gpYDgpKHgpL/gpK/gpL4g4KSa4KSv4KSo4KS/4KSkIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+CkiCDgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSu4KWM4KSc4KWC4KSmIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3gpJ8g4KS54KWLIOCksOCkueClgCDgpLngpYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDNlZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3VzdGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBlbWl0aXJhbmplLiBWZXphIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2YXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWtjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYcW+aW1hbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBnbGFzbm/Eh3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamUgb2RhYnJhbiBuaWplZGFuIG1lZGlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqZSBuaXN1IGRvc3R1cG5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWl0aXJhbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmJkZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iUmVuZHN6ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRXN6a8O2esO2ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOBdGvDvGxkw6lzIGdvbWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDgXRrw7xsZMOpcyBnb21iLiBLYXBjc29sYXQgYm9udHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296dGF0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw4F0a8O8bGTDqXMgaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRXN6a8O2esO2ayBrZXJlc8Opc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTGV2w6FsYXN6dMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IsOBdGvDvGxkw6lzIGxlw6FsbMOtdMOhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkJlesOhcsOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlasOhdHN6w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTesO8bmV0ZWx0ZXTDqXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJMZcOhbGzDrXTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLaWJvbnTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IsOWc3N6ZWNzdWvDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJMZW1lemJvcsOtdMOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhhbmdlcsWRc3phYsOhbHl6w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pbmNzIG3DqWRpYSBraXbDoWxhc3p0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pbmNzIGluZm9ybcOhY2nDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS8OpcGVybnnFkXRhcnRhbG9tIMOhdGvDvGxkw6lzZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjODJiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLVgNWh1bTVodWv1aHWgNWjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItWN1aHWgNaE1aXWgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVtiDVodW21bvVodW/1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1aHVriDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLUuNW21b/WgNWl1oQg1b3VodaA1oTVqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItWN1aHWgNaE1aXWgNWrINW41oDVuNW21bjWgtW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItSx1bbVu9Wh1b/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i1LTVodWk1aHWgNWl1oHVttWl1awg1bDVpdW81aHWgNWx1aHVr9W41oLVtNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLVk9Wh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i1YbVvtWh1aPVodaA1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLUtNWh1aTVodaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i1LTVodWk1aHWgNWl1oHVttWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLUuNW21aTVodaA1bHVodWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i1L/VuNWu1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i1LHVrNWi1bjVtNWrINW31aHVutWr1a8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i1YHVodW11bbVqyDVuNaC1arVo9W21bjWgtWp1bXVodW2INWv1aHWgNWj1aHVvtW41oDVq9W5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLVhNWl1aTVq9WhINaG1aHVtdWs1aXWgCDVudWl1bYg1ajVttW/1oDVvtWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItWP1aXVstWl1a/VuNaC1anVtdW41oLVttW21aXWgNWoINWw1aHVvdWh1bbVpdWs1asg1bnVpdW2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLUt9Wv1oDVodW21agg1bDVpdW81aHWgNWx1aHVr9W+1bjWgtW0INWnIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI3NTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbmdrYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUb21ib2wgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRvbWJvbCBDYXN0LiBUZXJwdXR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVG9tYm9sIENhc3QuIE1lbmdodWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVG9tYm9sIENhc3QuIFRlcmh1YnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pc2lrYW4ga2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIZW50aWthbiBjYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1dGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMdWFza2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDaXV0a2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FtcHVsIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJpbGFoIGdlc2VyIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlkYWsgYWRhIG1lZGlhIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlkYWsgYWRhIGluZm8geWFuZyB0ZXJzZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXNpIGxheWFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM1ZWE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IktlcmZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlTDpmtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIEFmdGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmdpc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2VuZGEgw7p0IMOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTGVpdGHDsCBhw7AgdMOma2p1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZnRlbmdqYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3TDtsOwdmEgw7p0c2VuZGluZ3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikxva2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSGzDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0w7bDsHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iU3TDpmtrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWlubmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUGzDtnR1dW1zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhsasOzw7BzdHlya3NzbGXDsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVuZ2lubiBtacOwaWxsIHZhbGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRW5nYXIgdXBwbMO9c2luZ2FyIMOtIGJvw7BpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa2rDoXIgc2VuZHVyIMO6dCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ZTNhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHVsc2FudGUgVHJhc21ldHRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHVsc2FudGUgVHJhc21ldHRpLiBEaXNjb25uZXNzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzaW9uZSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYXNtZXR0aSBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmljZXJjYSBkaSBkaXNwb3NpdGl2aSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTY29sbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGkgdHJhc21pc3Npb25lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDaGl1ZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSaXByb2R1Y2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSW50ZXJyb21waSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkVzcGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbXByaW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQ29wZXJ0aW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRpc3Bvc2l0aXZvIGRpIHNjb3JyaW1lbnRvIGRlbCB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lc3N1biBjb250ZW51dG8gbXVsdGltZWRpYWxlIHNlbGV6aW9uYXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZXNzdW5hIGluZm9ybWF6aW9uZSBkaXNwb25pYmlsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhc21pc3Npb25lIGRlbGxvIHNjaGVybW8gaW4gY29yc28iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmIwY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i157Xoteo15vXqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XoNeV16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteq15fXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157Xl9eV15HXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLXlNei15HXqNeUINeQ15wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLXnteX16TXqSDXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLXoNeq16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLXlNek16HXpyDXkNeqINeU15TXoteR16jXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i16HXkteV16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLXlNek16LXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i15TXqdeU15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLXlNek16HXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IteU16jXl9eRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLXm9eV15XXpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itei15jXmdek16og15DXnNeR15XXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLXnteX15XXldefINei15XXptee15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itec15Ag16DXkdeX16jXlCDXnteT15nXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i15DXmdefINee15nXk9eiINeW157XmdefIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLXlNei15HXqNeqINee16HXmiDXnteq15HXptei16oiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDk3MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i44K344K544OG44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuerr+acqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuOCreODo+OCueODiOOCouOCpOOCs+ODsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprop6PpmaTmuIjjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2mua4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLjgq3jg6Pjgrnjg4jjgZnjgovjg4fjg5DjgqTjgrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLnq6/mnKvjgpLmpJzntKLjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5o6l57aa44KS6Kej6ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i44Kt44Oj44K544OI44KS5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLplonjgZjjgosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLlho3nlJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuS4gOaZguWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5oqY44KK44Gf44Gf44KAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i44Ki44Or44OQ44Og44Ki44O844OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+OCueODqeOCpOODgOODvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i44Oh44OH44Kj44Ki44GM6YG45oqe44GV44KM44Gm44GE44G+44Gb44KTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmg4XloLHjgYzjgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IueUu+mdouOCkuOCreODo+OCueODiOOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMDgxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhg6Hhg5jhg6Hhg6Lhg5Thg5vhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDkuGDkOGDl+GDmOGDqOGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg6Phg5rhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOQOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmOGDoSDhg5vhg53hg6vhg5jhg5Thg5Hhg5AuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YOZ4YOQ4YOV4YOo4YOY4YOg4YOY4YOhIOGDkuGDkOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGDk+GDkOGDruGDo+GDoOGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGDk+GDkOGDmeGDleGDoOGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YOe4YOQ4YOj4YOW4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YOS4YOQ4YOo4YOa4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhg6nhg5Dhg5nhg5Thg6rhg5Xhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhg5Dhg5rhg5Hhg53hg5vhg5jhg6Eg4YOS4YOQ4YOg4YOU4YOZ4YOQ4YOc4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGDruGDm+GDmOGDoSDhg6Hhg5rhg5Dhg5jhg5Phg5Thg6Dhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGDm+GDlOGDk+GDmOGDkCDhg5Dhg6Dhg6nhg5Thg6Phg5rhg5gg4YOQ4YOgIOGDkOGDoOGDmOGDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOU4YOZ4YOg4YOQ4YOc4YOY4YOhIOGDkuGDkOGDk+GDkOGDquGDlOGDm+GDkCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkY2JiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQltKv0LnQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLSmtKx0YDRi9C70pPRi9C70LDRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDINGC0q/QudC80LXRgdGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDQkNC20YvRgNCw0YLRg9C70YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCa0LXQu9C10YHRltCz0LUg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLSmtKx0YDRi9C70pPRi9C70LDRgNC00Ysg0YLQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg9C00Ysg0YLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQmtGW0LTRltGA0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0YjQtdCx0LXRgNGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YvQsdGL0YEg0LTQtdKj0LPQtdC50ZbQvdGW0qMg0LbSr9Cz0ZbRgNGC0LrRltGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCV0YjQsdGW0YAg0YLQsNGB0YPRiNGLINGC0LDSo9C00LDQu9C80LDSk9Cw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItKa0L7QuyDQttC10YLRltC80LTRliDQsNKb0L/QsNGA0LDRgiDQttC+0psiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L3QtNGLINGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ3ODBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGelOGfkuGemuGeluGfkOGek+GfkuGekiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhnpThn4rhnrzhno/hnrvhnoThnoHhnrbhnp8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6A4Z624Z6P4Z+L4Z6V4Z+S4Z6P4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6A4Z+G4Z6W4Z674Z6E4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnpfhn5LhnofhnrbhnpThn4vhnqDhnr7hnpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Z6U4Z6J4Z+S4Z6H4Z684Z6T4Z6R4Z+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6f4Z+S4Z6c4Z+C4Z6E4Z6a4Z6A4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGeleGfkuGeiuGetuGeheGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGeiOGelOGfi+Gel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Z6U4Z634Z6RIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Z6F4Z624Z6A4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhnpXhn5LhnqLhnrbhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhnojhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhnpbhnoThn5LhnprhnrjhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGelOGehOGfkuGemuGeveGemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGen+GfkuGek+GetuGeiuGfg+Gen+Get+Gem+GfkuGelOGfiOGeouGetuGem+Gfi+GelOGfiuGeu+GemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhnprhnpThnrbhnprhnoDhnpjhn5Lhnprhnrfhno/hnp/hn4bhnqHhn4HhnoQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGeguGfkuGemOGetuGek+GegOGetuGemuGeh+GfkuGemuGevuGen+GemOGfgeGejOGfgOGekeGfgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Z6Y4Z634Z6T4Z6Y4Z624Z6T4Z6W4Z+Q4Z6P4Z+M4Z6Y4Z624Z6T4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhnoDhn4bhnpbhnrvhnoThnoHhnrbhnp/hnqLhn4HhnoDhn5LhnprhnoThn4siPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzdmZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LK44LK/4LK44LON4LKf4LKCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCyuOCyvuCyp+CyqOCyl+Cys+CzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LKy4LK+4LKX4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LKk4LKX4LOK4LKC4LKh4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCyh+CypuCyleCzjeCyleCzhiDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsrjgsr7gsqfgsqjgspfgsrPgsqjgs43gsqjgs4Eg4LK54LOB4LKh4LOB4LKV4LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4HgsrXgsr/gspXgs4Yg4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsq7gs4Hgsprgs43gsprgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsqrgs43gsrLgs4cg4LKu4LK+4LKh4LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsrXgsr/gsrDgsr7gsq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsrXgsr/gsrjgs43gsqTgsrDgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCyuOCyguCyleCzgeCymuCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCyhuCysuCzjeCyrOCyruCzjSDgspXgsrLgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LK14LK+4LKy4LON4LKv4LOC4LKu4LONIOCyuOCzjeCysuCziOCyoeCysOCzjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyp+CzjeCyr+CyriDgsobgsq/gs43gspXgs4bgsq7gsr7gsqHgsrLgsr7gspfgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsrngsr/gsqTgsr8g4LKy4LKt4LON4LKv4LK14LK/4LKy4LON4LKyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsqrgsrDgsqbgs4bgsq/gsqjgs43gsqjgs4Eg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg5M2E5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuyLnOyKpO2FnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLquLDquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLsoITshqEg67KE7Yq8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIO2VtOygnOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLsoITshqEg67KE7Yq8LiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i7KCE7Iah7ZWgIOq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuq4sOq4sOulvCDssL7ripQg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuyXsOqysCDtlbTsoJwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLsoITshqEg7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLri6vquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLsnqzsg50iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuydvOyLnOykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Iu2OvOy5mOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i7KCR6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i7JWo67KU7JWE7Yq4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuuzvOulqCDsiqzrnbzsnbTrjZQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuyEoO2Dne2VnCDrr7jrlJTslrQg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLsoJXrs7TqsIAg7JeG7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i7ZmU66m0IOyghOyGoSDspJEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODEzYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KLRg9GC0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotKv0LfQvNOp0LrRgtOp0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INCw0LbRi9GA0LDQvyDRgtGD0YDQsNGCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRg9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGL0L8g0YLRg9GA0LDRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotOp0LzTqdC90LrSr9Cz06kg0YfRi9Cz0LDRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotKv0LfQvNOp0LrRgtOp0YAg0LjQt9C00LXQu9Kv0q/QtNOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LbRi9GA0LDRgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGL0YjQuiDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0L3RgyDRgtC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQltCw0LHRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0YvQvdC00YvRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQotC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNC50YvQvyDQutOp0YDRgdOp0YLSr9KvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltGL0LnRi9GI0YLRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDQvNGD0LrQsNCx0LDRgdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItKu0L3QtNKvINC60LDRgtGD0YPQu9Cw0YLRg9GD0YfRgyDRgdGL0LTRi9GA0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JHQuNGAINC00LAg0LzQtdC00LjQsCDRhNCw0LnQuyDRgtCw0L3QtNCw0LvQs9Cw0L0g0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQrdGHINC80LDQsNC70YvQvNCw0YIg0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRi9C70YPRg9C00LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmMWUxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjEzMmRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjYxZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjE4ZHA8L2RpbWVuPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTczN2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC6peC6sOC6muC6u+C6miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguq3gurjgupvgurDguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgupvgurjgu4jguqHigIvguoTgurLigIvguqrigIvgupfgu4wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDguoHgurPguqXgurHguofgu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZ4Lqr4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LqB4Lqz4Lql4Lqx4LqH4oCL4LqK4Lqt4LqB4oCL4Lqr4Lqy4oCL4Lqt4Lq44oCL4Lqb4Lqw4oCL4LqB4Lqt4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC6ouC6uOC6lOC6geC6suC6meC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lqb4Lq04LqUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Lqr4Lq84Lq04LuJ4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguqLgurjgupTguorgurvgu4jguqfguoTgurLguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguqLgurjgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguoLgurDguqvguo3gurLguo0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC6q+C6jeC7jeC7ieC6peC6u+C6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC7nOC7ieC6suC6m+C6u+C6geC6reC6sOC6peC6sOC6muC7jeC7ieC6siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgupXgurvguqfgupvgurHguprguqXgurDgupTgurHguprguqrgur3guociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC6muC7jeC7iOKAi+C7hOC6lOC7ieKAi+C7gOC6peC6t+C6reC6geKAi+C6oeC6teKAi+C7gOC6lOC6jeKAi+C7g+C6lOKAi+C7hOC6p+C7iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Lqa4LuN4LuI4oCL4Lqh4Lq14oCL4LqC4LuN4LuJ4oCL4Lqh4Lq54LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguoHgurLgupnguqrgurvgu4jguofgup7gurLguprgu5zgu4ngurLguojgu40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDM2ZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLErnJlbmdpbmlhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlBlcmRhdmltbyBteWd0dWthcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlBlcmRhdmltbyBteWd0dWthcy4gQXRzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmdpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5ndGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUGVyZHVvdGkgxK8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSYW5kYW1pIMSvcmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0anVuZ3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3VzdGFiZHl0aSBwZXJkYXZpbcSFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJVxb5kYXJ5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlByaXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3VzdGFiZHl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IknFoXNrbGVpc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdXRyYXVrdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bW8gdmlyxaFlbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdhcnN1bW8gxaFsaWF1xb5pa2xpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVwYXNpcmlua3RhIGpva2lhIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5mb3JtYWNpamEgbmVwYXNpZWtpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQZXJkdW9kYW1hcyBla3JhbmFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQwNjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3TEk21hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkllcsSrY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQXByYWlkZXMgcG9nYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIHDEgXJ0cmF1a3RzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJBcHJhaWRlcyBwb2dhLiBOb3RpZWsgc2F2aWVub2p1bWEgaXp2ZWlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBpenZlaWRvdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQXByYWlkxKvFoWFuYSB1eiBpZXLEq2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTm90aWVrIGllcsSrxI11IG1la2zEk8WhYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0dmllbm90Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXB0dXLEk3QgYXByYWlkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQWl6dsSTcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBdHNrYcWGb3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkFwdHVyxJN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJenbEk3JzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FrxLxhdXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWEgdsSBY2nFhsWhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNrYcS8dW1hIHNsxKtkbmlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOYXYgYXRsYXPEq3RpIG11bHRpdmlkZXMgZmFpbGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5hdiBwaWVlamFtYSBpbmZvcm3EgWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik5vdGllayBla3LEgW5hIGFwcmFpZGUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGVlMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC+0L/Rh9C10YLQviDQt9CwIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0JjRgdC60LvRg9GH0LXQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0KHQtSDQv9C+0LLRgNC30YPQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQn9C+0LLRgNC30LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCV0LzQuNGC0YPQstCw0Zgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCh0LUg0LHQsNGA0LDQsNGCINGD0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JjRgdC60LvRg9GH0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC+0L/RgNC4INCz0L4g0LXQvNC40YLRg9Cy0LDRmtC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQoNC10L/RgNC+0LTRg9GG0LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC+0L/RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0L7QsdC10YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCa0L7RgNC40YbQsCDQvdCwINCw0LvQsdGD0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JvQuNC30LPQsNGHINC30LAg0ZjQsNGH0LjQvdCwINC90LAg0LfQstGD0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQvNC10LTQuNGD0LzQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LAg0LTQvtGB0YLQsNC/0L3QuCDQuNC90YTQvtGA0LzQsNGG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdC+0YIg0YHQtSDQtdC80LjRgtGD0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MTRiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtLjgtL/gtLjgtY3gtLHgtY3gtLHgtIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LSf4LS+4LSq4LWN4LSq4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSa4LWN4LSa4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3igIzgtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSk4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC0h+C0pOC0v+C0suC1h+C0leC1jeC0leC1jSDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4g4LSV4LSj4LWN4LSf4LWG4LSk4LWN4LSk4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1vSDgtKjgtL/gtbzgtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC0heC0teC0uOC0vuC0qOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC0quC1jeC0suC1hyDgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC0pOC1veC0leC1jeC0leC0vuC0suC0giDgtKjgtL/gtbzgtKTgtY3gtKTgtYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtKjgtL/gtLDgtY3igI3gtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtLXgtL/gtJXgtLjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC0muC1geC0sOC1geC0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC0huC1veC0rOC0giDgtIbgtbzgtJ/gtY3gtJ/gtY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LS14LWL4LSz4LS/4LSv4LSCIOC0uOC1jeC0suC1iOC0oeC1vCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LSu4LWA4LSh4LS/4LSv4LSv4LWK4LSo4LWN4LSo4LWB4LSCIOC0pOC0v+C0sOC0nuC1jeC0nuC1huC0n+C1geC0pOC1jeC0pOC0v+C0n+C1jeC0n+C0v+C0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LS14LS/4LS14LSw4LSZ4LWN4LSZ4LSz4LWK4LSo4LWN4LSo4LWB4LSCIOC0suC0reC1jeC0r+C0ruC0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LS44LWN4oCM4LSV4LWN4LSw4LWA4LW7IOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4N2M5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLTqdGF06nTqdGA06nQvNC20q/Sr9C0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KHQsNC70YHQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7Qs9C00YHQvtC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCU0LDQvNC20YPRg9C70LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi06nRhdOp06nRgNOp0LzQtiDRhdCw0LnQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCh0LDQu9Cz0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCU0LDQvNC20YPRg9C70LDRhdGL0LMg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCl0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KLQvtCz0LvRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotKv0YAg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCU0Y3Qu9Cz0Y3RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KXRg9GA0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0KbQvtC80LPQuNC50L0g0LfRg9GA0LDQsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGD0YPQvdGLINGC0q/QstGI0LjQvSDRgtCw0LDRgNGD0YPQu9Cw0LPRhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0K/QvNCw0YAg0Ycg0LzQtdC00LjQsCDRgdC+0L3Qs9C+0L7Qs9Kv0LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCc0Y3QtNGN0Y3Qu9GN0Lsg0LHQsNC50YXQs9Kv0Lkg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JTRjdC70LPRjdGG0LjQudCzINC00LDQvNC20YPRg9C70LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYmViYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+CkoyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkoeCkv+CkuOCljeCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS+4KS14KSwIOCkleCkvuCkuOCljeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgg4KS24KWL4KSn4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpY3igI3gpJXgpKjgpYfgpJXgpY3igI3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCko+ClhyDgpKXgpL7gpILgpKzgpLXgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKrgpY3gpLLgpYcg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLXgpL/gpLDgpL7gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKXgpL7gpILgpKzgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpYPgpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpYHgpJrgpL/gpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSF4KSy4KWN4KSs4KSuIOCkleCksuCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpY3gpLngpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSv4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpK7gpYDgpKHgpL/gpK/gpL4g4KSo4KS/4KS14KSh4KSy4KS+IOCkqOCkvuCkueClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSj4KSk4KWA4KS54KWAIOCkruCkvuCkueCkv+CkpOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWU0ODAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRhbmcgSGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0YW5nIGhhbnRhci4gU2FtYnVuZ2FuIGRpcHV0dXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dGFuZyBoYW50YXIuIE1lbnlhbWJ1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0YW5nIGhhbnRhci4gRGlzYW1idW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkhhbnRhciBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJCZXJoZW50aSBtZW5naGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik1haW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktlbWJhbmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJ1bnR1aGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNlbmkgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUGVsdW5jdXIga2VsYW50YW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IlRpYWRhIG1lZGlhIGRpcGlsaWgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik1ha2x1bWF0IHRpZGFrIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJNZW5naGFudGFyIHNrcmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkODA1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGAheGAlOGAheGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhgIDhgKzhgIXhgLrhgJDhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCB4YCc4YCv4YCQ4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAmeGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAlOGAseGAnuGAiuGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCR4YCs4YC44YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIXhgIDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgg4YCb4YC+4YCs4YCW4YC94YCx4YCB4YC84YCE4YC64YC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGAhuGAgOGAuuGAnuGAveGAmuGAuuGAmeGAvuGAryDhgJbhgLzhgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgIHhgLzhgIThgLrhgLgg4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhgJXhgK3hgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhgJbhgL3hgIThgLfhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGAgeGAj+GAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGAluGAvOGAlOGAt+GAuuGAgeGAu+GAm+GAlOGAuuGBgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YCB4YCx4YCr4YCA4YC64YCe4YCt4YCZ4YC64YC44YCb4YCU4YC6Li4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YCh4YCa4YC64YCc4YC64YCY4YCZ4YC64YCV4YCv4YC2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGAoeGAnuGAtuGAoeGAkOGAreGAr+GAuOGAoeGAgOGAu+GAmuGAuuGAgeGAu+GAreGAlOGAuuGAnuGAiuGAt+GAuiDhgIbhgJzhgK3hgK/hgIDhgLrhgJLhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGAmeGAiuGAuuGAnuGAiuGAt+GAuuGAmeGAruGAkuGAruGAmeGAviDhgJnhgJvhgL3hgLHhgLjhgIHhgLvhgJrhgLrhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGAoeGAgeGAu+GAgOGAuuGAoeGAnOGAgOGAuiDhgJnhgJvhgJvhgL7hgK3hgJThgK3hgK/hgIThgLrhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGAkOGAiuGAuuGAuOGAluGAvOGAkOGAuuGAm+GAseGAuCDhgJnhgLvhgIDhgLrhgJThgL7hgKzhgJXhgLzhgIThgLoiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzY0YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWlrb25ldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnJha29ibGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEtvYmxlciB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBUaWxrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTw7hrZXIgZXR0ZXIgZW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb2JsZSBmcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wcCBjYXN0aW5nZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1a2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsbCBhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2V0dCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0dmlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlkZWJyeXRlciBmb3Igdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkR1IGhhciBpa2tlIHZhbGd0IG5vZW4gbWVkaWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmdlbiBpbmZvcm1hc2pvbiBlciB0aWxnamVuZ2VsaWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3RlciBza2plcm1lbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpKrgpY3gpLDgpKPgpL7gpLLgpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSJ4KSq4KSV4KSw4KSj4KS54KSw4KWCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkreCkr+CliyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkueClgeCkgeCkpuCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkr+CkuOCkruCkviBDYXN0IOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkr+CkqOCljeCkpOCljeCksOCkueCksOClgiDgpKrgpKTgpY3gpKTgpL4g4KSy4KSX4KS+4KSJ4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkteCkv+CkmuCljeCkm+Clh+CkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJjYXN0aW5nIOCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSo4KWN4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkrOCknOCkvuCkieCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KS44KSC4KSV4KWN4KS34KS/4KSq4KWN4KSkIOCkquCkvuCksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KSt4KWL4KSy4KWN4KSv4KWB4KSu4KSV4KWLIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWB4KSo4KWIIOCkruCkv+CkoeCkv+Ckr+CkviDgpJrgpK/gpKgg4KSt4KSP4KSV4KWLIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkieCkquCksuCkrOCljeCkpyDgpJvgpYjgpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOCkv+CkqCBjYXN0IOCkl+CksOCljeCkpuCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZjYyZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyYXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWNvb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIHZlcmJyb2tlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyBtYWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWljb29uLiBWZXJib25kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVuIG5hYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBcHBhcmF0ZW4gem9la2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ikxvc2tvcHBlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdGVuIHN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNsdWl0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwZWxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iT25kZXJicmVrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWl0dm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYW1lbnZvdXdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaG9lcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVzY2h1aWZyZWdlbGFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5mb3JtYXRpZSBiZXNjaGlrYmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2NoZXJtIGNhc3RlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZGY3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqLjgqL/gqLjgqJ/gqK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kih4Ki/4Ki14Ki+4KiI4Ki44Ki+4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCoj+CopeCphyDgqJXgqL7gqLjgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kih4KmA4Ki14Ki+4KiI4Ki44Ki+4KiCIOCoqOCpguCpsCDgqLLgqbHgqK3gqL/gqIYg4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuColeCovuCouOConyDgqJXgqLDgqKjgqL4g4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCoquCosuCphyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCosOCpi+ColeCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqLXgqL/gqLjgqKTgqL7gqLAg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KiQ4Kiy4Kis4KiuIOCohuCosOConyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqLXgqYzgqLLgqK/gqYLgqK4g4Ki44Kiy4Ki+4KiI4Kih4KiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqJXgqYvgqIgg4Ki14KmAIOCoruCpgOCooeCpgOCohiDgqKjgqLngqYDgqIIg4Kia4KmB4Kij4Ki/4KiGIOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KiV4KmL4KiIIOConOCovuCoo+ColeCovuCosOCpgCDgqIngqKrgqLLgqKzgqKcg4Kio4Ki54KmA4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqLjgqJXgqY3gqLDgqYDgqKgg4Kic4KmL4KmcIOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJhNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyesSFZHplbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHJ6eWNpc2sgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUm96xYLEhWN6b25vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIMWBxIVjesSZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUG/FgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJ6ZXN5xYJhaiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlpuYWpkb3dhbmllIHVyesSFZHplxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2TFgsSFY3oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXRyenltYWogcHJ6ZXN5xYJhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYW1rbmlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT2R0d8OzcnoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IldzdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvendpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ilp3acWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2vFgmFka2EgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlN1d2FrIGfFgm/Fm25vxZtjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHd5YnJhbm8gbXVsdGltZWRpw7N3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCcmFrIGluZm9ybWFjamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByemVzecWCYW0gZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTYxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBUcmFuc21pdGlyLiBEZXNsaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBUcmFuc21pdGlyLiBBIGxpZ2FyLi4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBUcmFuc21pdGlyLiBMaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQSBsb2NhbGl6YXIgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Fzc29jaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGFyYXIgYSB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVkdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbG8gZGUgZGVzbGl6ZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bSBzdXBvcnRlIG11bHRpbcOpZGlhIHNlbGVjaW9uYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQSB0cmFuc21pdGlyIG8gZWNyw6MiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzYxOWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmIyZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bveml0aXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBEZWNvbmVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIFNlIGNvbmVjdGVhesSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gQ29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJvaWVjdGHIm2kgcGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZSBjYXV0xIMgZGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVjb25lY3RhyJtpLXbEgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik51IG1haSBwcm9pZWN0YcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iw45uY2hpZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZWRhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLDjm50cmVydXBlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iT3ByacibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4dGluZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlc3Ryw6JuZ2XIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJHcmFmaWNhIGFsYnVtdWx1aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlzb3IgcGVudHJ1IHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWNpdW4gZmnImWllciBtZWRpYSBzZWxlY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnUgc3VudCBkaXNwb25pYmlsZSBpbmZvcm1hyJtpaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2UgcHJvaWVjdGVhesSDIGVjcmFudWwiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDYyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC+0YLQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQsNC10YLRgdGPLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQktGL0LHQtdGA0LjRgtC1INGD0YHRgtGA0L7QudGB0YLQstC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtC40YHQuiDRg9GB0YLRgNC+0LnRgdGC0LLigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J7RgtC60LvRjtGH0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC10LrRgNCw0YLQuNGC0Ywg0YLRgNCw0L3RgdC70Y/RhtC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLQvtGB0L/RgNC+0LjQt9Cy0LXRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC+0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCg0LXQs9GD0LvRj9GC0L7RgCDQs9GA0L7QvNC60L7RgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNC40LDRhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JTQsNC90L3Ri9GFINC90LXRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiDRg9C00LDQu9C10L3QvdC+0LzRgyDQvNC+0L3QuNGC0L7RgNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVjZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC2tOC2r+C3iuC2sOC2reC3kuC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtovgtrTgt4/gtoLgtpwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uC4g4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2uOC3kuC2seC3iiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC3gOC3kuC2muC3j+C3geC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC2i+C2tOC3j+C2guC2nCDgt4Pgt5ngt4Dgt5PgtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC3gOC3kuC2muC3j+C3gSDgtprgt5Lgtrvgt5Pgtrgg4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LeA4LeD4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Law4LeP4LeA4Lax4La6IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LeA4LeS4La74LeP4La4IOC2nOC2seC3iuC3gOC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtq/gt5Lgtpwg4LeE4La74LeS4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgt4Tgtprgt5Tgt4XgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtofgtr3gt4rgtrbgtrgg4Laa4La94LeP4LeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC3hOC2rCDgtrTgtrvgt5Lgtrjgt48g4LeD4LeK4La94La64LeS4Lap4La74La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtrjgt4/gtrDgt4rigI3gtrrgtrog4Lat4Led4La74LePIOC2seC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4La94La24LePIOC2nOC2rSDgt4Tgt5Dgtprgt5Ig4Lat4Lec4La74Lat4LeU4La74LeUIOC2seC3nOC2uOC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LeA4LeS4Laa4LeP4LeBIOC2reC3kuC2u+C2uiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YWExMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphcmlhZGVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjWlkbG8gcHJlbm9zdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNaWRsbyBwcmVub3N1LiBPZHBvamVuw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlww6FqYSBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVub3MgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIxL5hZGFqw7ogc2EgemFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvamnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3RhdmnFpSBwcmVuw6HFoWFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdnJpZcWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlaHJhxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJaYmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2Jyw6F6b2sgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc8O6dmHEjSBobGFzaXRvc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgc8O6IHZ5YnJhbsOpIMW+aWFkbmUgbcOpZGnDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmllIHPDuiBrwqBkaXNwb3rDrWNpaSDFvmlhZG5lIGluZm9ybcOhY2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVuw6HFoWEgc2Egb2JyYXpvdmthIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0Y2U0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJOYXByYXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHByZWtpbmplbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIHByZWR2YWphbmplLiBWenBvc3RhdmxqYW5qZSBwb3ZlemF2ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgdnpwb3N0YXZsamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlZHZhamFuamUgcHJlazoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJc2thbmplIG5hcHJhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHBvdmV6YXZvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXN0YXZpIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXByaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJhesWhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdHJuaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRyc25payB6YSBnbGFzbm9zdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmkgaXpicmFuZSBwcmVkc3Rhdm5vc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJQb2RhdGtpIG5pc28gbmEgdm9sam8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWR2YWphbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmUxMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQYWppc2pldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBzaGvDq3B1dHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIFBvIGxpZGhldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgbGlkaHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWV0byB0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlBvIGvDq3Jrb24gcGFqaXNqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTaGvDq3B1dGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOZGFsbyB0cmFuc21ldGltaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1ieWxsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTHVhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1esOrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTmRhbG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaZ2plcm9qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUGFsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iS29wZXJ0aW5hIGUgYWxidW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJScsOrc2hxaXTDq3NpIGkgdm9sdW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTnVrIHUgemdqb2RoIGFzbmrDqyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnVrIGplcGV0IGFzbmrDqyBpbmZvcm1hY2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUG8gdHJhbnNtZXRvbiBla3JhbmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFiYWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXRktCw0ZjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQktC10LfQsCDRmNC1INC/0YDQtdC60LjQvdGD0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9GD0ZjQtSDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfQsNC9INGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LHQsNGG0YPRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/RgNC+0L3QsNC70LDQttC10ZrQtSDRg9GA0LXRktCw0ZjQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutC40L3QuCDQstC10LfRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCX0LDRg9GB0YLQsNCy0Lgg0L/RgNC10LHQsNGG0LjQstCw0ZrQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQsNGD0YHRgtCw0LLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC60YPQv9C4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QvNC+0YIg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCa0LvQuNC30LDRhyDQt9CwINGY0LDRh9C40L3RgyDQt9Cy0YPQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC10LzQsCDQuNC30LDQsdGA0LDQvdC40YUg0LzQtdC00LjRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC40YHRgyDQtNC+0YHRgtGD0L/QvdC1INC90LjQutCw0LrQstC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0YDQtdCx0LDRhtGD0ZjQtSDRgdC1INC10LrRgNCw0L0iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2QzZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXBwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyw6Vua29wcGxhZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RhIHRpbGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZXRhciBlZnRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvcHBsYSBmcsOlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlNsdXRhIGNhc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdMOkbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVsYSB1cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXZicnl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXTDtmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLb21wcmltZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2tpdm9tc2xhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x5bXJlZ2xhZ2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2EgbWVkaWEgaGFyIHZhbHRzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXQgZmlubnMgaW5nZW4gaW5mb3JtYXRpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6RybWVuIGNhc3RhcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MmNiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJNZnVtbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJWaWZhYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IktpdHVmZSBjaGEga3V0dW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWVvbmRvbGV3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbmF1bmdhbmlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWV1bmdhbmlzaHdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlR1bWEga3dlbnllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSW5hdGFmdXRhIHZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9uZG9hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQWNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZ1bmdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQ2hlemEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlNpdGlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTaW1hbWlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYW51YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iS3VuamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW5hYSB5YSBhbGJhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2l0ZWxlemkgY2hhIHNhdXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIYWt1bmEgbWF1ZGh1aSB5YWxpeW9jaGFndWxpd2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ikhha3VuYSBtYWVsZXpvIHlhbGl5b3BhdGlrYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJbmF0dW1hIHNrcmluaSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyMzQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj42MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj45MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YWI4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NTAlPC9pdGVtPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+NzAlPC9pdGVtPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3OGYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCumuCuv+CuuOCvjeCun+CuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgrqTgrr/grrDgr4jgrq/grr/grp/gr4Eg4K6q4K6f4K+N4K6f4K6p4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6k4K+B4K6j4K+N4K6f4K6/4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCuh+CupOCuseCvjeCuleCvgSDgroXgrqngr4Hgrqrgr43grqrgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr4jgrqTgr40g4K6k4K+H4K6f4K+B4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCupOCviuCun+CusOCvjeCuquCviOCupOCvjSDgrqTgr4HgrqPgr43grp/grr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrrXgrqTgr4gg4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgrq7gr4Lgrp/gr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgrofgrq/grpXgr43grpXgr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCuh+Cun+CviOCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuteCupOCuseCvjeCuleCuvuCuqSDgrqrgr4rgrqTgr43grqTgrr7grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgrrXgrr/grrDgrr/grrXgrr7grpXgr43grpXgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCumuCvgeCusOCvgeCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCuhuCusuCvjeCuquCuruCvjSDgrobgrrDgr43grp/gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4K6S4K6y4K6/4K6v4K6z4K614K+BIOCuuOCvjeCusuCviOCun+CusOCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4K6u4K+A4K6f4K6/4K6v4K6+IOCujuCupOCvgeCuteCvgeCuruCvjSDgrqTgr4fgrrDgr43grqjgr43grqTgr4bgrp/gr4HgrpXgr43grpXgrqrgr43grqrgrp/grrXgrr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCupOCuleCuteCusuCvjSDgro7grqTgr4HgrrXgr4Hgrq7grr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCupOCuv+CusOCviOCur+CviCDgroXgrqngr4Hgrqrgr43grqrgr4HgrpXgrr/grrHgr4DgrrDgr43grpXgrrPgr40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzEyZTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LC44LC/4LC44LGN4LCf4LCu4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsL8g4LCs4LCf4LCo4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCwpuCxgOCwqOCwv+CwleCwvyDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LCC4LCh4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LCo4LGBIOCwleCwqOCxgeCwl+CxiuCwguCwn+Cxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LC+4LCo4LGN4LCo4LC/IOCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LCu4LGC4LC44LC/4LC14LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LCq4LGN4LCy4LGHIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LCq4LC+4LCc4LGNIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCwteCwv+CwuOCxjeCwpOCwsOCwv+CwguCwquCwnOCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LCV4LGB4LCm4LC/4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LCG4LCy4LGN4LCs4LCu4LGNIOCwhuCwsOCxjeCwn+CxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsLXgsL7gsLLgsY3gsK/gsYLgsK7gsY0g4LC44LGN4LCy4LCv4LC/4LCh4LCw4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsK7gsYDgsKHgsL/gsK/gsL4g4LCP4LCm4LGAIOCwjuCwguCwmuCxgeCwleCxi+CwrOCwoeCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LC44LCu4LC+4LCa4LC+4LCw4LCCIOCwheCwguCwpuCxgeCwrOCwvuCwn+CxgeCwsuCxiyDgsLLgsYfgsKbgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCwuOCxjeCwleCxjeCwsOCxgOCwqOCxjeKAjOCwqOCxgSDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE4YWU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC4o+C4sOC4muC4miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LiB4Liz4Lil4Lix4LiH4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4reC5geC4peC5ieC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguYHguITguKrguJXguYzguYTguJvguKLguLHguIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguIHguLPguKXguLHguIfguITguYnguJnguKvguLLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lir4Lii4Li44LiU4LmB4LiE4Liq4LiV4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLguJvguLTguJQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguYDguKXguYjguJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC4q+C4ouC4uOC4lOC4iuC4seC5iOC4p+C4hOC4o+C4suC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC4q+C4ouC4uOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC4guC4ouC4suC4oiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lii4Li44LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Lib4LiB4Lit4Lix4Lil4Lia4Lix4LmJ4LihIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC5geC4luC4muC5gOC4peC4t+C5iOC4reC4meC4m+C4o+C4seC4muC4o+C4sOC4lOC4seC4muC5gOC4quC4teC4ouC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LmE4Lih4LmI4LmE4LiU4LmJ4LmA4Lil4Li34Lit4LiB4Liq4Li34LmI4Lit4LmE4Lin4LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguYTguKHguYjguKHguLXguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC4geC4s+C4peC4seC4h+C5geC4hOC4quC4leC5jOC4q+C4meC5ieC4suC4iOC4rSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiZTNkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTWdhIERldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dHRvbiBuYSBJLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWRpc2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dHRvbiBuYSBJLWNhc3QuIEt1bW9rb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5ha2Frb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkktY2FzdCBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5hZ2hhaGFuYXAgbmcgbWdhIGRldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJJZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkloaW50byBhbmcgcGFnLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IklzYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iSS1wbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJLXBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSWhpbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFsYXdha2luIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJJLWNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNsaWRlciBuZyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IldhbGFuZyBwaW5pbGluZyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iV2FsYW5nIGF2YWlsYWJsZSBuYSBpbXBvcm1hc3lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS2luYS1jYXN0IGFuZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjYzOTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFubGEgZMO8xJ9tZXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFudMSxIGtlc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbsSxeW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbmTEsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLFnnVyYXlhIHlhecSxbmxhOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGJ1bHVudXlvciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxecSxIGtlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbsSxIGR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iS2FwYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyYWtsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEdXJkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9sZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkRhcmFsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYsO8bSBrYXBhxJ/EsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTZXMgZMO8emV5aSBrYXlkxLFybWEgw6d1YnXEn3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZHlhIHNlw6dpbG1lZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJpbGdpIHlvayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFubGFuxLF5b3IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDM2NWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNC40YHRgtGA0L7RlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0JLRltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QvdGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GO0LLQsNGC0Lgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNC40YHRgtGA0L7Rl9CyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCS0ZbQtNC60LvRjtGH0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC40L/QuNC90LjRgtC4INGC0YDQsNC90YHQu9GP0YbRltGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0ZbQtNGC0LLQvtGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQt9GD0L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J/RgNC40L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQvtC30LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LrQu9Cw0LTQuNC90LrQsCDQsNC70YzQsdC+0LzRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C+0LLQt9GD0L3QvtC6INCz0YPRh9C90L7RgdGC0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGW0LAt0YTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LDRlCDQtNCw0L3QuNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGA0LDQvdGB0LvRj9GG0ZbRjyDQtdC60YDQsNC90LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmM1OTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPYs9m52YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KLZhNin2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2LrbjNixINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB2Ygg2LHbgdinINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsyDZhduM2rog2qnYp9iz2bkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYotmE2KfYqiDYqtmE2KfYtCDbgdmIINix24HbkiDbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2LrbjNixINmF2YbYs9mE2qkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLaqdin2LPZuSDaqdix2YbYpyDYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItqG2YTYp9im24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXZiNmC2YjZgSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itix2YjaqduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLZvtq+24zZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYs9qp24zakduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYp9mE2KjZhSDYotix2bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YjYp9mE24zZiNmFINiz2YTYp9im24zaiNixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLaqdmI2KbbjCDZhduM2ojbjNinINmF2YbYqtiu2Kgg2YbbgduM2rog24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2qnZiNim24wg2YXYudmE2YjZhdin2Kog2K/Ys9iq24zYp9ioINmG24HbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYs9qp2LHbjNmGINqp2KfYs9m5INuB2Ygg2LHbgduMINuB25IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTA4MTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iVGl6aW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUXVyaWxtYWxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFV6aWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5tb3FkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlF1eWlkYWdpZ2EgdHJhbnNsYXRzaXlhIHFpbGlzaDoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJRdXJpbG1hbGFybmkgdG9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlVsYW5pc2huaSB1emlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlRyYW5zbGF0c2l5YW5pIHRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWW9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQm9zaGxhc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlRv4oCYeHRhdGliIHR1cmlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IllveWlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWWln4oCYaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gbXVxb3Zhc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVG92dXNoIGJhbGFuZGxpZ2kgc2xheWRlcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik11bHRpbWVkaWEgdGFubGFtYWdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGVjaCBxYW5kYXkgbWHigJlsdW1vdCB5b+KAmHEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFubmkgdHJhbnNsYXRzaXlhIHFpbGlzaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OGNjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJI4buHIHRo4buRbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVGhp4bq/dCBi4buLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iTsO6dCB0cnV54buBbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mgbmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJOw7p0IHRydXnhu4FuLiDEkGFuZyBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJOw7p0IHRydXnhu4FuLiDEkMOjIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRydXnhu4FuIHThu5tpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4ixJBhbmcgdMOsbSB0aGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iROG7q25nIHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLEkMOzbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQaMOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVOG6oW0gZOG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iROG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTeG7nyBy4buZbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRodSBn4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuG6om5oIGLDrGEgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVGhhbmggdHLGsOG7o3Qgw6JtIGzGsOG7o25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLaMO0bmcgY8OzIHBoxrDGoW5nIHRp4buHbiBuw6BvIMSRxrDhu6NjIGNo4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2jDtG5nIGPDsyB0aMO0bmcgdGluIG7DoG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IsSQYW5nIHRydXnhu4FuIG3DoG4gaMOsbmgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMmQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757ufIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleWwhOaMiemSriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleWwhOaMiemSruOAguW3suaWreW8gOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5bCE5oyJ6ZKu44CC5q2j5Zyo6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleWwhOaMiemSruOAguW3sui/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXlsITliLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjmn6Xmib7orr7lpIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5bCEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLlhbPpl60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuaaguWBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxleW8gCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS26LW3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5LiT6L6R5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keWdlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YCJ5oup5Lu75L2V5aqS5L2TIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmsqHmnInku7vkvZXnm7jlhbPkv6Hmga8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleWwhOWxj+W5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlNWMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV44CC5bey6Kej6Zmk6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXjgILmraPlnKjpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV44CC5bey6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuiHsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLlsJrmnKrpgbjmk4flqpLpq5QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iuaykuacieips+e0sOizh+aWmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXvvJvlt7LkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIle+8m+mAo+e3muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXvvJvlt7LpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+5YiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumBuOWPluS7u+S9leWqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ5Y+v55So55qE6LOH6KiKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDdjNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSXNpc3RpbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJbmtpbm9iaG8geWUtQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdW5xYW55dWxpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXlheGh1bnl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V4aHVueWl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWthemEga3UtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSXRob2xhIGFtYWRpdmF5aXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik5xYW11bGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJNaXNhIHVrdXNha2F6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVmFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkRsYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJNaXNhIGlzaWtoYXNoYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTWlzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik53ZWJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJHb3FhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iVWJ1Y2lrbyBiZS1hbGJoYW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IklzaWxheWlkYSBzZXZvbHVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXlpa2hvIGltaWRpeWEgZWtoZXRoaXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBbHVraG8gdWx3YXppIG9sdXRob2xha2FsYXlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJc2lrcmluaSBzb2t1c2FrYXphIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzMyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9InNwZWVkX211bHRpcGxpZWRfYnlfMTAwIj4KLSAgICAgICAgPGl0ZW0+MjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjUwPC9pdGVtPgotICAgICAgICA8aXRlbT43NTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgotICAgICAgICA8aXRlbT4xMjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjE1MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MjAwPC9pdGVtPgotICAgIDwvaW50ZWdlci1hcnJheT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Mjg1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lZGlhUm91dGVCdXR0b24iPgotICAgICAgICA8IS0tIFRoaXMgZHJhd2FibGUgaXMgYSBzdGF0ZSBsaXN0IHdoZXJlIHRoZSAiY2hlY2tlZCIgc3RhdGUKLSAgICAgICAgICAgICBpbmRpY2F0ZXMgYWN0aXZlIG1lZGlhIHJvdXRpbmcuICBDaGVja2FibGUgaW5kaWNhdGVzIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICBhbmQgbm9uLWNoZWNrZWQgLyBub24tY2hlY2thYmxlIGluZGljYXRlcwotICAgICAgICAgICAgIHRoYXQgbWVkaWEgaXMgcGxheWluZyB0byB0aGUgbG9jYWwgZGV2aWNlIG9ubHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBUaW50IHRvIGFwcGx5IHRvIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25UaW50IiBmb3JtYXQ9ImNvbG9yIiAvPgotCi0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluV2lkdGgiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0IiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotCi0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVRoZW1lIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmMyOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8Y29sb3IgbmFtZT0iZ3JheSI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9IndoaXRlIj4jZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGVfb3BhY2l0eV83MCI+I0IzZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmxhY2tfb3BhY2l0eV83MCI+I0IzMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0Ij4jNTAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfZW5kIj4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJib3R0b21fYmFyX2JhY2tncm91bmQiPiM0MDIwMjAyMDwvY29sb3I+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YjAyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gRGlhbG9nIHNpemUgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+MzIwZHA8L2RpbWVuPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+MzIwZHA8L2RpbWVuPgotCi0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjI4OGRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjY4ZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiPjE2ZHA8L2RpbWVuPgotICAgIDwhLS0gR3JvdXAgbGlzdCBleHBhbmQvY29sbGFwc2UgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgotICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIGluIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgb3V0IGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyI+MjAwPC9pbnRlZ2VyPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiPjE1MGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiPjM2ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSI+MjBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjE4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xMnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xMHNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoIj4yMjVkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiPjU0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIj4zMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4yN2RwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEzc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3NldHRpbmdzX29mZnNldCI+OGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIj40ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3BhdXNlX2ljb25fc2l6ZSI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9pY29uX3NpemUiPjI4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfbWluaW1hbF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2ljb25fbWFyZ2luIj4xMGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSI+MjMyZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiPjE3NmRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSI+MmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+MTJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0Ij41ZHA8L2RpbWVuPgotICAgIDwhLS0gVE9ETzogYWRqdXN0IGJvdHRvbSBiYXIgdmlldyAtLT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5N2EzYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLQotICAgIDwhLS0gTmFtZSBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIHByaW9yIHRvIEplbGx5YmVhbi4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiPlN5c3RlbTwvc3RyaW5nPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgdXNlciByb3V0ZSBjYXRlZ29yeSBjcmVhdGVkIHdoZW4gcHVibGlzaGluZyByb3V0ZXMgdG8gdGhlIHN5c3RlbSBpbiBKZWxseWJlYW4gYW5kIGFib3ZlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiPkRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gU3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbHRpcCBvZiBNZWRpYVJvdXRlQnV0dG9uCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iPkNhc3QgYnV0dG9uPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBubyByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgZGV2aWNlLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyI+Q2FzdCBidXR0b24uIENvbm5lY3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIGEgcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgb2YgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIj5DYXN0IHRvPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyI+RmluZGluZyBkZXZpY2VzPC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgotCi0gICAgPCEtLSBCdXR0b24gdG8gc3RvcCBwbGF5YmFjayBhbmQgZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIj5TdG9wIGNhc3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBkaWFsb2cgY2xvc2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iPkNsb3NlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGxheSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5Ij5QbGF5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGF1c2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiPlBhdXNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgc3RvcCBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIj5TdG9wPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgZXhwYW5kIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIHNob3dzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCI+RXhwYW5kPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgY29sbGFwc2UgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gaGlkZXMgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiPkNvbGxhcHNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogYWxidW0gYXJ0IGJ1dHRvbi4gQ2xpY2tpbmcgb24gdGhlIGFsYnVtIGFydCB0YWtlcyB1c2VyIHRvIGEgcHJlZGVmaW5lZCBhY3Rpdml0eSBwZXIgbWVkaWEgYXBwLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCI+QWxidW0gYXJ0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogdm9sdW1lIHNsaWRlci4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiPlZvbHVtZSBzbGlkZXI8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gbWVkaWEgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBwbGF5YmFjay4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCI+Tm8gbWVkaWEgc2VsZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gdGl0bGUvZGVzY3JpcHRpb24gaGF2ZSBiZWVuIGZvdW5kIGZvciBhIGdpdmVuIHNvbmcvdmlkZW8uIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiPk5vIGluZm8gYXZhaWxhYmxlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiI+Q2FzdGluZyBzY3JlZW48L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNvbnRhaW5lciBpcyBub3QgdmFsaWQgZm9yIHByb2dyZXNzaXZlIGRvd25sb2FkL3BsYXliYWNrLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF9pbnZhbGlkX3Byb2dyZXNzaXZlX3BsYXliYWNrIj5UaGlzIHZpZGVvIGlzblwndCB2YWxpZCBmb3Igc3RyZWFtaW5nIHRvIHRoaXMgZGV2aWNlLjwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIGJ5IGFueSBhcHAuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X3Vua25vd24iPkNhblwndCBwbGF5IHRoaXMgdmlkZW8uPC9zdHJpbmc+Ci0gICAgPCEtLSBCdXR0b24gdG8gY2xvc2UgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl9idXR0b24iPk9LPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgc2tpcCB3YWl0IHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUiPgotICAgICAgICBZb3UgY2FuIHNraXAgQWQgaW4gPHhsaWZmOmcgaWQ9IndhaXRfdGltZSIgZXhhbXBsZT0iNSI+JTEkZDwveGxpZmY6Zz5zCi0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHRvdGFsIHJlbWFpbmluZyB0aW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lIj4KLSAgICAgICAgQWQgwrcgPHhsaWZmOmcgaWQ9InJlbWFpbmluZ190aW1lIiBleGFtcGxlPSIxOjE1Ij4lMSRzPC94bGlmZjpnPiByZW1haW5pbmcKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHRvIGdvIHRvIGFuIGV4dGVybmFsIHdlYnNpdGUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCI+VmlzaXQgQWR2ZXJ0aXNlcjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdGV4dCI+Q2xvc2VkIGNhcHRpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0Ij5PZmY8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQiPkF1ZGlvIHRyYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQiPk5vbmU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfdGV4dCI+VmlkZW8gcXVhbGl0eTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQiPkF1dG88L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCI+SGVscCAmYW1wOyBmZWVkYmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCI+UGxheWJhY2sgc3BlZWQ8L3N0cmluZz4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcyI+Ci0gICAgICAgIDxpdGVtPjAuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjc1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Tm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbT4xLjI1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MS41eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Mng8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGZvciBkaXNwbGF5aW5nIHRpbWUuIFVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHNpemUgbGF5b3V0IHRvIHVzZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyIj4wMDowMDowMDwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHN1YnRpdGxlIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJ0cmFja19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGF1ZGlvIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJhdWRpb19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gc29uZyB0aXRsZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCI+U29uZyB0aXRsZSB1bmtub3duPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gYXJ0aXN0IG5hbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0Ij5BcnRpc3QgdW5rbm93bjwvc3RyaW5nPgotCi0gICAgPCEtLUNvbnRlbnQgRGVzY3JpcHRpb25zIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9iYWNrX2J1dHRvbl9kZXNjIj5CYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2MiPlNlZSBtb3JlIGJ1dHRvbnM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2MiPkJhY2sgdG8gcHJldmlvdXMgYnV0dG9uIGxpc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2Vla19iYXJfZGVzYyI+UGxheWJhY2sgcHJvZ3Jlc3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2MiPlNldHRpbmdzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2MiPlZpZGVvIFF1YWxpdHkgU2VsZWN0aW9uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29uIj5TdWJ0aXRsZSBpcyBvbi4gQ2xpY2sgdG8gaGlkZSBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb2ZmIj5TdWJ0aXRsZSBpcyBvZmYuIENsaWNrIHRvIHNob3cgaXQuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3JlcGxheV9idXR0b25fZGVzYyI+UmVwbGF5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3BsYXlfYnV0dG9uX2Rlc2MiPlBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MiPlBhdXNlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjIj5QcmV2aW91cyBtZWRpYTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9uZXh0X2J1dHRvbl9kZXNjIj5OZXh0IG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3Jld2luZF9idXR0b25fZGVzYyI+UmV3aW5kIGJ5IDEwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZmZ3ZF9idXR0b25fZGVzYyI+R28gZm9yd2FyZCBieSAzMCBzZWNvbmRzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2xhdW5jaF9idXR0b25fZGVzYyI+TGF1bmNoIExpbms8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MiPk11dGVkLiBDbGljayB0byB1bm11dGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdW5tdXRlZF9idXR0b25fZGVzYyI+Q2xpY2sgdG8gTXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYyI+RnVsbCBzY3JlZW48L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhOGVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjQ2ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij41ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NWRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MzZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4zNmRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uQmFjayI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfYXJyb3dfYmFjazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9iYWNrX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uTGF1bmNoIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19sYXVuY2g8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbGF1bmNoX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj40ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkN1cnJlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkludGVycHVuY3QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+wrc8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5FbmQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX2hvcml6b250YWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5DQyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2NjX2lzX29mZjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mdWxsc2NyZWVuPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2V0dGluZ3M8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uTXV0ZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfdW5tdXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5Ij4KLSAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5PC9pdGVtPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml92aWRlb19xdWFsaXR5X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC40PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPnRvcHxjZW50ZXI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuMzU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfHJpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY1PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij4yNGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxsZWZ0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNjkwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2Rhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5MaWdodC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlRpdGxlIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5TdWJoZWFkIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkJvZHkxIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlOGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08cmVzb3VyY2VzPgotICAgIDwhLS1qYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iY2MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJmZndkIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibWVkaWFjb250cm9sbGVyX3Byb2dyZXNzIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibmV4dCIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InBhdXNlIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icHJldiIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InJldyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWUiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lX2N1cnJlbnQiIC8tLT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE3NTRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b248L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2Rhcms8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodENvbnRyb2xQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZ3JleTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQ8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodC5EYXJrQ29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcmsiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KLQotICAgIDwvc3R5bGU+Ci0gICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2ggYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxYTFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBVc2FnZSAnLiBydW5jdHMuc2gnCi0KLWZ1bmN0aW9uIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZSgpIHsKLSAgZWNobyAncnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzIFtvcHRpb25dOiBCdWlsZCwgZmxhc2ggZGV2aWNlLCcKLSAgZWNobyAnICAgICAgICAgICAgICBhbmQgcnVuIHN1YnNldCBvZiBDdHNNZWRpYVRlc3RDYXNlcyB0aGF0IE1lZGlhQ29tcG9uZW50cyBjb3ZlcnMuJwotICBlY2hvICcgICAgICAgICAgKldhcm5pbmcqIFRoaXMgYnlwYXNzZXMgQ1RTIHNldHVwIChlLmcuIGRvd25sb2FkIG1lZGlhIGNvbnRlbnRzIGZyb20gc2VydmVyKScKLSAgZWNobyAnICAgICAgICAgIEZvciBydW5uaW5nIENUUyBpbiBvZmZpY2lhbCB3YXksIHVzZSBhdGVzdCBvciBjdHMtdHJhZGVmZWQgJwotICBlY2hvICcgICAgIC1ofC0taGVscDogVGhpcyBoZWxwJwotICBlY2hvICcgICAgIC0tc2tpcDogU2tpcCBidWlsZCBhbmQgZmxhc2guIEp1c3QgcmVydW4tdGVzdHMnCi0gIGVjaG8gJyAgICAgLS1taW46IE9ubHkgcmVidWlsZCB0ZXN0cyBhbmQgdXBkYXRhYmxlIGxpYnJhcnkuJwotICBlY2hvICcgICAgIC0tdGVzdDogT25seSByZWJ1aWxkIHRlc3RzJwotICBlY2hvICcgICAgIC1zIFtkZXZpY2VfaWRdOiBTcGVjaWZ5IGEgZGV2aWNlIG5hbWUgdG8gcnVuIHRlc3QgYWdhaW5zdC4nCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lICR7QURCSE9TVH0gaW5zdGVhZC4nCi0gIGVjaG8gJyAgICAgLXIgW2NvdW50XTogUmVwZWF0IHRlc3RzIGZvciBnaXZlbiBjb3VudC4gSXQgd2lsbCBzdG9wIHdoZW4gZmFpbHMuJwotICBlY2hvICcgICAgIC0taWdub3JlOiBLZWVwIHJlcGVhdGluZyB0ZXN0cyBldmVuIHdoZW4gaXQgZmFpbHMuJwotICBlY2hvICcgICAgIC10IFt0ZXN0XTogT25seSBydW4gdGhlIHNwZWNpZmljIHRlc3QuIENhbiBiZSBlaXRoZXIgYSBjbGFzcyBvciBhIG1ldGhvZC4nCi19Ci0KLWZ1bmN0aW9uIHJ1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cygpIHsKLSAgIyBFZGl0IGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvdGhlciB0ZXN0cy4KLSAgIyBMaXN0IHVwIGxpYnMgYW5kIGFwa3MgaW4gdGhlIG1lZGlhX2FwaSBuZWVkZWQgZm9yIHRlc3RzLCBhbmQgcGxhY2UgdGVzdCB0YXJnZXQgYXQgdGhlIGxhc3QuCi0gIGxvY2FsIFRFU1RfUEFDS0FHRV9ESVI9KCJmcmFtZXdvcmtzL2F2L3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0IikKLSAgbG9jYWwgVEVTVF9QQUNLQUdFPSgiYW5kcm9pZC5tZWRpYS5jdHMiKQotICBsb2NhbCBCVUlMRF9UQVJHRVRTPSgiTWVkaWFDb21wb25lbnRzIiAiQ3RzTWVkaWFUZXN0Q2FzZXMiKQotICAjIERvbid0IGluY2x1ZGUgTWVkaWFDb21wb25lbnRzIC0tIGlmIHdlIHNpbXBseSBpbnN0YWxsIGl0LCBzeXN0ZW0gc2VydmVyCi0gICMgd291bGRuJ3QgdXNlIHRoZSBpbnN0YWxsZWQgb25lLgotICBsb2NhbCBJTlNUQUxMX1RBUkdFVFM9KCJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gIGxvY2FsIFRFU1RfUlVOTkVSPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICBsb2NhbCBERVBFTkRFTkNJRVM9KCJtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQiICJhbmRyb2lkLXN1cHBvcnQtdGVzdCIgImNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwiKQotICBsb2NhbCBERUZBVUxUX1RFU1RfVEFSR0VUPSIiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUJyb3dzZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUNvbnRyb2xsZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMl9QZXJtaXNzaW9uVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb25NYW5hZ2VyX01lZGlhU2Vzc2lvbjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLlNlc3Npb25Ub2tlbjJUZXN0IgotICBpZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCi0gICAgZWNobyAiTmVlZHMgdG8gbHVuY2ggYSB0YXJnZXQgZmlyc3QiCi0gICAgcmV0dXJuCi0gIGZpCi0KLSAgbG9jYWwgb2xkX3BhdGg9JHtPTERQV0R9Ci0gIHdoaWxlIHRydWU7IGRvCi0gICAgbG9jYWwgT1BUSU9OX1NLSVA9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9NSU49ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fUkVQRUFUX0NPVU5UPSIxIgotICAgIGxvY2FsIE9QVElPTl9JR05PUkU9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUX1RBUkdFVD0iJHtERUZBVUxUX1RFU1RfVEFSR0VUfSIKLSAgICBsb2NhbCBhZGJob3N0X2xvY2FsCi0gICAgd2hpbGUgKCggIiQjIiApKTsgZG8KLSAgICAgIGNhc2UgIiR7MX0iIGluCi0gICAgICAgIC1ofC0taGVscCkKLSAgICAgICAgICBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgICA7OwotICAgICAgICAtLXNraXApCi0gICAgICAgICAgT1BUSU9OX1NLSVA9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1taW4pCi0gICAgICAgICAgT1BUSU9OX01JTj0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLXRlc3QpCi0gICAgICAgICAgT1BUSU9OX1RFU1Q9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLXMpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBhZGJob3N0X2xvY2FsPSR7MX0KLSAgICAgICAgICA7OwotICAgICAgICAtcikKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9SRVBFQVRfQ09VTlQ9IiR7MX0iCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1pZ25vcmUpCi0gICAgICAgICAgT1BUSU9OX0lHTk9SRT0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtdCkKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9URVNUX1RBUkdFVD0iJHsxfSIKLSAgICAgIGVzYWMKLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotCi0gICAgIyBCdWlsZCBhZGIgY29tbWFuZC4KLSAgICBsb2NhbCBhZGIKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGFkYmhvc3RfbG9jYWw9JHtBREJIT1NUfQotICAgIGZpCi0gICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCi0gICAgICBsb2NhbCBkZXZpY2VfY291bnQ9JChhZGIgZGV2aWNlcyB8IHNlZCAnL15bWzpzcGFjZTpdXSokL2QnIHwgd2MgLWwpCi0gICAgICBpZiBbWyAiJHtkZXZpY2VfY291bnR9IiAhPSAiMiIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiVG9vIG1hbnkgZGV2aWNlcy4gU3BlY2lmeSBhIGRldmljZS4iICYmIGJyZWFrCi0gICAgICBmaQotICAgICAgYWRiPSJhZGIiCi0gICAgZWxzZQotICAgICAgYWRiPSJhZGIgLXMgJHthZGJob3N0X2xvY2FsfSIKLSAgICBmaQotCi0gICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtURVNUX1BBQ0tBR0VfRElSfSIKLSAgICAjbG9jYWwgVEVTVF9QQUNLQUdFPSQoc2VkIC1uICdzL14uKlxicGFja2FnZVxiPSJcKFthLXowLTlcLl0qXCkiLiokL1wxL3AnICR7dGFyZ2V0X2Rpcn0vQW5kcm9pZE1hbmlmZXN0LnhtbCkKLQotICAgIGlmIFtbICIke09QVElPTl9TS0lQfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuCi0gICAgICBsb2NhbCBkZXBlbmRlbmN5Ci0gICAgICBsb2NhbCBidWlsZF9kZXBlbmRlbmN5PSIiCi0gICAgICBmb3IgZGVwZW5kZW5jeSBpbiAke0RFUEVOREVOQ0lFU1tAXX07IGRvCi0gICAgICAgIGlmIFtbICIke2RlcGVuZGVuY3l9IiA9PSAib3V0LyIqIF1dOyB0aGVuCi0gICAgICAgICAgaWYgW1sgISAtZiAke0FORFJPSURfQlVJTERfVE9QfS8ke2RlcGVuZGVuY3l9IF1dOyB0aGVuCi0gICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBmaQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgW1sgIiQoZmluZCAke09VVH0gLW5hbWUgJHtkZXBlbmRlbmN5fV9pbnRlcm1lZGlhdGVzIHwgd2MgLWwpIiA9PSAiMCIgXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBpZiBbWyAiJHtidWlsZF9kZXBlbmRlbmN5fSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkJ1aWxkaW5nIGRlcGVuZGVuY2llcy4gV2lsbCBvbmx5IHByaW50IHN0ZGVyci4iCi0gICAgICAgIG0gJHtERVBFTkRFTkNJRVNbQF19IC1qID4gL2Rldi9udWxsCi0gICAgICBmaQotCi0gICAgICAjIEJ1aWxkIHRlc3QgYXBrIGFuZCByZXF1aXJlZCBhcGsuCi0gICAgICBsb2NhbCBidWlsZF90YXJnZXRzCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0lOU1RBTExfVEFSR0VUU1tAXX0iCi0gICAgICBlbGlmIFtbICIke09QVElPTl9NSU59IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsc2UKLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSBkcm9pZCIKLSAgICAgIGZpCi0gICAgICBtICR7YnVpbGRfdGFyZ2V0c30gLWogfHwgYnJlYWsKLQotICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgIyBGbGFzaCBvbmx5IHdoZW4gbmVlZGVkCi0gICAgICAgIGxvY2FsIGRldmljZV9idWlsZF90eXBlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJ1aWxkLnR5cGUpIgotICAgICAgICBpZiBbWyAiJHtkZXZpY2VfYnVpbGRfdHlwZX0iID09ICJ1c2VyIiBdXTsgdGhlbgotICAgICAgICAgICMgVXNlciBidWlsZC4gQ2Fubm90IGFkYiBzeW5jCi0gICAgICAgICAgJHthZGJ9IHJlYm9vdCBib290bG9hZGVyCi0gICAgICAgICAgZmFzdGJvb3QgZmxhc2hhbGwKLSAgICAgICAgZWxzZQotICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgbG9jYWwgZGV2aWNlX3Zlcml0eV9tb2RlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJvb3QudmVyaXR5bW9kZSkiCi0gICAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX3Zlcml0eV9tb2RlfSIgIT0gImRpc2FibGVkIiBdXTsgdGhlbgotICAgICAgICAgICAgJHthZGJ9IGRpc2FibGUtdmVyaXR5Ci0gICAgICAgICAgICAke2FkYn0gcmVib290Ci0gICAgICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCi0gICAgICAgICAgICAke2FkYn0gcm9vdAotICAgICAgICAgIGZpCi0gICAgICAgICAgJHthZGJ9IHJlbW91bnQKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RvcAotICAgICAgICAgICR7YWRifSBzaGVsbCBzZXRwcm9wIGxvZy50YWcuTWVkaWFTZXNzaW9uU2VydmljZSBERUJVRwotICAgICAgICAgICR7YWRifSBzeW5jCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHN0YXJ0Ci0gICAgICAgIGZpCi0gICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgIyBFbnN1cmUgcGFja2FnZSBtYW5hZ2VyIGlzIGxvYWRlZC4KLSAgICAgICAgIyBUT0RPKGphZXdhbik6IEZpbmQgYmV0dGVyIHdheSB0byB3YWl0Ci0gICAgICAgIHNsZWVwIDE1Ci0gICAgICBmaQotCi0gICAgICAjIEluc3RhbGwgYXBrcwotICAgICAgbG9jYWwgaW5zdGFsbF9mYWlsZWQ9ImZhbHNlIgotICAgICAgZm9yIHRhcmdldCBpbiAke0lOU1RBTExfVEFSR0VUU1tAXX07IGRvCi0gICAgICAgIGxvY2FsIGFwa19wYXRoPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGspCi0gICAgICAgIGxvY2FsIGFwa19udW09JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwayB8IHdjIC1sKQotICAgICAgICBpZiBbWyAiJHthcGtfbnVtfSIgIT0gIjEiIF1dOyB0aGVuCi0gICAgICAgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhICR7dGFyZ2V0fS5hcGsuIEZvdW5kICR7YXBrX251bX0gYXBrcyIgJiYgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgICAgZWNobyAiSW5zdGFsbGluZyAke3RhcmdldH0uYXBrLiBwYXRoPSR7YXBrX3BhdGh9IgotICAgICAgICAke2FkYn0gaW5zdGFsbCAtciAke2Fwa19wYXRofQotICAgICAgICBpZiBbWyAiJHs/fSIgIT0gIjAiIF1dOyB0aGVuCi0gICAgICAgICAgaW5zdGFsbF9mYWlsZWQ9InRydWUiCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2luc3RhbGxfZmFpbGVkfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkZhaWxlZCB0byBpbnN0YWxsLiBUZXN0IHdvdWxkbid0IHJ1bi4iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBsb2NhbCB0ZXN0X3RhcmdldD0iIgotICAgIGlmIFtbIC1uICIke09QVElPTl9URVNUX1RBUkdFVH0iIF1dOyB0aGVuCi0gICAgICB0ZXN0X3RhcmdldD0iLWUgY2xhc3MgJHtPUFRJT05fVEVTVF9UQVJHRVR9IgotICAgIGZpCi0KLSAgICBsb2NhbCBpCi0gICAgbG9jYWwgdG1wZmlsZT0kKHRlbXBmaWxlKQotICAgIGZvciAoKGk9MTsgaSA8PSAke09QVElPTl9SRVBFQVRfQ09VTlR9OyBpKyspKTsgZG8KLSAgICAgIGVjaG8gIlJ1biB0ZXN0ICR7aX0vJHtPUFRJT05fUkVQRUFUX0NPVU5UfSIKLSAgICAgICR7YWRifSBzaGVsbCBhbSBpbnN0cnVtZW50ICR7dGVzdF90YXJnZXR9IC13ICR7VEVTVF9QQUNLQUdFfS8ke1RFU1RfUlVOTkVSfSA+JiAke3RtcGZpbGV9Ci0gICAgICBjYXQgJHt0bXBmaWxlfQotICAgICAgaWYgW1sgIiR7T1BUSU9OX0lHTk9SRX0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBpZiBbWyAtbiAiJChncmVwICR7dG1wZmlsZX0gLWUgJ0ZBSUxVUkVcfGNyYXNoZWQnKSIgXV07IHRoZW4KLSAgICAgICAgICAjIGFtIGluc3RydW1lbnQgZG9lc24ndCByZXR1cm4gZXJyb3IgY29kZSBzbyBuZWVkIHRvIGdyZXAgcmVzdWx0IG1lc3NhZ2UgaW5zdGVhZAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBybSAke3RtcGZpbGV9Ci0gICAgYnJlYWsKLSAgZG9uZQotfQotCi1lY2hvICJGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhZGRlZCB0byB5b3VyIGVudmlyb25tZW50OiIKLV9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4YjcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFTZXNzaW9uMjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZnJvbSBNZWRpYVNlc3Npb24yIHRvIE1lZGlhQ29udHJvbGxlcjIuCi0gKiA8cD4KLSAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCi0gKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCi0gKi8KLS8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0vLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFDb250cm9sbGVyMiB7Ci0gICAgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpOwotICAgIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpOwotICAgIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoaW4gQnVuZGxlIHBsYXliYWNrSW5mbyk7Ci0gICAgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSk7Ci0gICAgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIGluIEJ1bmRsZSBleHRyYXMpOwotCi0gICAgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBpbiBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBpbiBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgcmVwZWF0TW9kZSwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpOwotCi0gICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KTsKLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChpbiBCdW5kbGUgY29tbWFuZHMpOwotCi0gICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQnJvd3NlciBzZXBjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKGluIEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgaW4gQnVuZGxlIHJvb3RFeHRyYSk7Ci0gICAgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmVzdWx0KTsKLSAgICB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyByb290TWVkaWFJZCwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ0NjdkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhQ29udHJvbGxlcjIgdG8gTWVkaWFTZXNzaW9uMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0gLy8gICAgICAgICAgICAgICBOb3RlIHRoYXQgUGFyY2VsbGVkU2xpY2VMaXN0IGlzbid0IGEgZ29vZCBpZGVhIGZvciB0aGUgcHVycG9zZS4gKHNlZTogYi8zNzQ5MzY3NykKLW9uZXdheSBpbnRlcmZhY2UgSU1lZGlhU2Vzc2lvbjIgewotICAgIC8vIFRPRE8oamFld2FuKTogYWRkIG9uQ29tbWFuZCgpIHRvIHNlbmQgcHJpdmF0ZSBjb21tYW5kCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIFdlIG1heSBjb25zaWRlciB0byBhZGQgYW5vdGhlciBiaW5kZXIganVzdCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAgICAvLyAgICAgICAgICAgICAgIG5vdCB0byBleHBvc2Ugb3RoZXIgbWV0aG9kcyB0byB0aGUgY29udHJvbGxlciB3aG9zZSBjb25uZWN0aW9uIHdhc24ndCBhY2NlcHRlZC4KLSAgICAvLyAgICAgICAgICAgICAgIEJ1dCB0aGlzIHdvdWxkIGJlIGVub3VnaCBmb3Igbm93IGJlY2F1c2UgaXQncyB0aGUgc2FtZSBhcyBleGlzdGluZwotICAgIC8vICAgICAgICAgICAgICAgTWVkaWFCcm93c2VyIGFuZCBNZWRpYUJyb3dzZXJTZXJ2aWNlLgotICAgIHZvaWQgY29ubmVjdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBjYWxsaW5nUGFja2FnZSk7Ci0gICAgdm9pZCByZWxlYXNlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0KLSAgICB2b2lkIHNldFZvbHVtZVRvKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOwotICAgIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBpbiBCdW5kbGUgYXJncyk7Ci0gICAgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIHZvaWQgcHJlcGFyZUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZXRSYXRpbmcoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIHJhdGluZyk7Ci0KLSAgICB2b2lkIHNldFBsYXlsaXN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotICAgIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBsaWJyYXJ5IHNlcnZpY2Ugc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBnZXRMaWJyYXJ5Um9vdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSByb290SGludHMpOwotICAgIHZvaWQgZ2V0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkKTsKLSAgICB2b2lkIGdldENoaWxkcmVuKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgdW5zdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5MDk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyMkltcGwgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQnJvd3NlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlcjIiOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogY2hhbmdlLgotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBNZWRpYUJyb3dzZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjIpIHN1cGVyLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3RfaW1wbChCdW5kbGUgcm9vdEhpbnRzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRMaWJyYXJ5Um9vdChnZXRDb250cm9sbGVyU3R1YigpLCByb290SGludHMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnVuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW1faW1wbChTdHJpbmcgbWVkaWFJZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0SXRlbShnZXRDb250cm9sbGVyU3R1YigpLCBtZWRpYUlkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0Q2hpbGRyZW4oZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZWFyY2goZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHRfaW1wbChTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0U2VhcmNoUmVzdWx0KGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJvb3RIaW50cywgZmluYWwgU3RyaW5nIHJvb3RNZWRpYUlkLCBmaW5hbCBCdW5kbGUgcm9vdEV4dHJhKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldExpYnJhcnlSb290RG9uZShnZXRJbnN0YW5jZSgpLCByb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0SXRlbURvbmUoZ2V0SW5zdGFuY2UoKSwgbWVkaWFJZCwgaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldENoaWxkcmVuRG9uZShnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TZWFyY2hSZXN1bHRDaGFuZ2VkKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRTZWFyY2hSZXN1bHREb25lKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2hpbGRyZW5DaGFuZ2VkKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5MzY1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1Q7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlJlcGVhdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuU2h1ZmZsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMlN0dWIgbUNvbnRyb2xsZXJTdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtVG9rZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyLkRlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZWxlYXNlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAUmVwZWF0TW9kZSBpbnQgbVJlcGVhdE1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQFNodWZmbGVNb2RlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1QbGF5ZXJTdGF0ZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmxvYXQgbVBsYXliYWNrU3BlZWQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtQWxsb3dlZENvbW1hbmRzOwotCi0gICAgLy8gQXNzaWdubWVudCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIGhvbGQsIGJ1dCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50Ci0gICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIC8vIFBvc3RmaXggLUJpbmRlciBpcyBhZGRlZCB0byBleHBsaWNpdGx5IHNob3cgdGhhdCBpdCdzIHBvdGVudGlhbGx5IHJlbW90ZSBwcm9jZXNzIGNhbGwuCi0gICAgLy8gVGVjaG5pY2FsbHkgLUludGVyZmFjZSBpcyBtb3JlIGNvcnJlY3QsIGJ1dCBpdCBtYXkgbWlzcmVhZCB0aGF0IGl0J3MgaW50ZXJmYWNlICh2cyBjbGFzcykKLSAgICAvLyBzbyBsZXQncyBrZWVwIHRoaXMgcG9zdGZpeCB1bnRpbCB3ZSBmaW5kIGJldHRlciBwb3N0Zml4LgotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIHZvbGF0aWxlIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZXF1aXJlIHNlc3Npb24gYWN0aXZlbmVzcyBjaGFuZ2VkIGxpc3RlbmVyLCBiZWNhdXNlIGNvbnRyb2xsZXIgY2FuIGJlCi0gICAgLy8gICAgICAgICAgICAgICBhdmFpbGFibGUgd2hlbiB0aGUgc2Vzc2lvbidzIHBsYXllciBpcyBudWxsLgotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRva2VuIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ29udHJvbGxlclN0dWIgPSBuZXcgTWVkaWFDb250cm9sbGVyMlN0dWIodGhpcyk7Ci0gICAgICAgIG1Ub2tlbiA9IHRva2VuOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgbURlYXRoUmVjaXBpZW50ID0gKCkgLT4gewotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogTW9yZSBzYW5pdHkgY2hlY2tzLgotICAgICAgICBpZiAobVRva2VuLmdldFR5cGUoKSA9PSBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTikgewotICAgICAgICAgICAgLy8gU2Vzc2lvbgotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBzeXN0ZW0gc2VydmVyIChNZWRpYVNlc3Npb25TZXJ2aWNlKSB0aGF0IHdhbnRzIHRvIG1vbml0b3Igc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBiaW5kIGlmIGFibGUuLgotICAgICAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBiaW5kZXIgaW4gdGhlIHNlc3Npb24gdG9rZW4gaW5zdGVhZCBvZiBiaW5kIGJ5IGl0cyBvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBob2xkcyB0aGUgYmluZGluZyB0byB0aGUgc2VydmljZSAqZm9yZXZlciogYW5kIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZXZlciBzdG9wLgotICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBzeXN0ZW0gc2VydmVyIHdhbnRzIHRvIGRpc3BhdGNoIG1lZGlhIGtleSBldmVudHMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBkZWFkIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN5c3RlbSBzZXJ2ZXIgYmluZHMgdG8gYSBzZXNzaW9uIHNlcnZpY2UuIFNob3VsZCB1bmJpbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubmVjdFRvU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIFNlcnZpY2UuIE5lZWRzIHRvIGdldCBmcmVzaCBiaW5kZXIgd2hlbmV2ZXIgY29ubmVjdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIGltcGwgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbik7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSwgaW1wbC5nZXRTZXJ2aWNlTmFtZSgpKTsKLQotICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2UoKSBpbnN0ZWFkIG9mIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0byBzdGFydCBzZXNzaW9uIHNlcnZpY2UgZm9yIHRocmVlCi0gICAgICAgIC8vIHJlYXNvbnMuCi0gICAgICAgIC8vIDEuIFByZXZlbnQgc2Vzc2lvbiBzZXJ2aWNlIG93bmVyJ3Mgc3RvcFNlbGYoKSBmcm9tIGRlc3Ryb3lpbmcgc2VydmljZS4KLSAgICAgICAgLy8gICAgV2l0aCB0aGUgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLCBzZXJ2aWNlJ3MgY2FsbCBvZiBzdG9wU2VsZigpIHdpbGwgdHJpZ2dlciBpbW1lZGlhdGUKLSAgICAgICAgLy8gICAgb25EZXN0cm95KCkgY2FsbHMgb24gdGhlIG1haW4gdGhyZWFkIGV2ZW4gd2hlbiBvbkNvbm5lY3QoKSBpcyBydW5uaW5nIGluIGFub3RoZXIKLSAgICAgICAgLy8gICAgdGhyZWFkLgotICAgICAgICAvLyAyLiBNaW5pbWl6ZSBBUElzIGZvciBkZXZlbG9wZXJzIHRvIHRha2UgY2FyZSBhYm91dC4KLSAgICAgICAgLy8gICAgV2l0aCBiaW5kU2VydmljZSgpLCBkZXZlbG9wZXJzIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgU2VydmljZS5vbkJpbmQoKQotICAgICAgICAvLyAgICBidXQgU2VydmljZS5vblN0YXJ0Q29tbWFuZCgpIHNob3VsZCBiZSBhbHNvIHRha2VuIGNhcmUgYWJvdXQgd2l0aCB0aGUKLSAgICAgICAgLy8gICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLgotICAgICAgICAvLyAzLiBGdXR1cmUgc3VwcG9ydCBmb3IgVUktbGVzcyBwbGF5YmFjawotICAgICAgICAvLyAgICBJZiBhIHNlcnZpY2Ugd2FudHMgdG8ga2VlcCBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWl0aGVyIGZvcmVncm91bmQgc2VydmljZSBvcgotICAgICAgICAvLyAgICBib3VuZGVkIHNlcnZpY2UuIEJ1dCB0aGVyZSBoYWQgYmVlbiByZXF1ZXN0IGZvciB0aGUgZmVhdHVyZSBmb3Igc3lzdGVtIGFwcHMKLSAgICAgICAgLy8gICAgYW5kIHVzaW5nIGJpbmRTZXJ2aWNlKCkgd2lsbCBiZSBiZXR0ZXIgZml0IHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgewotICAgICAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlQXNVc2VyKCkgZm9yIGJpbmRpbmcgZnJvbSBzeXN0ZW0gc2VydmljZSB0byBhdm9pZCBmb2xsb3dpbmcgd2FybmluZy4KLSAgICAgICAgICAgIC8vIENvbnRleHRJbXBsOiBDYWxsaW5nIGEgbWV0aG9kIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3aXRob3V0IGEgcXVhbGlmaWVkIHVzZXIKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlQXNVc2VyKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUsCi0gICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuZ2V0VXNlckhhbmRsZUZvclVpZChtVG9rZW4uZ2V0VWlkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIHN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXNzaW9uKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb25CaW5kZXIuY29ubmVjdChtQ29udHJvbGxlclN0dWIsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNhbGwgY29ubmVjdGlvbiByZXF1ZXN0LiBGcmFtZXdvcmsgd2lsbCByZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBmcm9tICIgKyBtVG9rZW4pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZS1lbnRlcmFuY2UgZnJvbSB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNSZWxlYXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJTdHViLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFzQmluZGVyKCkudW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOwotICAgICAgICAgICAgICAgIGJpbmRlci5yZWxlYXNlKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vLW9wLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKG1JbnN0YW5jZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YiBnZXRDb250cm9sbGVyU3R1YigpIHsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyU3R1YjsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFDb250cm9sbGVyMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgaXNuJ3QgYWxsb3dlZCB0by4KLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kQ29kZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZD0iICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICByZXR1cm4gYmluZGVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1BsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QcmV2aW91c0l0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvTmV4dEl0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGNvbW1hbmRDb2RlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZENvZGUsIGFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHlfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG9faW1wbChpbnQgdmFsdWUsIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRWb2x1bWVUbyhtQ29udHJvbGxlclN0dWIsIHZhbHVlLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZV9pbXBsKGludCBkaXJlY3Rpb24sIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGp1c3RWb2x1bWUobUNvbnRyb2xsZXJTdHViLCBkaXJlY3Rpb24sIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEKTsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmdfaW1wbChTdHJpbmcgbWVkaWFJZCwgUmF0aW5nMiByYXRpbmcpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmF0aW5nIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSYXRpbmcobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCByYXRpbmcudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIGNiKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGNvbW1hbmQpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlbmRDdXN0b21Db21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZC50b0J1bmRsZSgpLCBhcmdzLCBjYik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQobGlzdC5nZXQoaSkudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFBsYXlsaXN0KG1Db250cm9sbGVyU3R1YiwgYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0TWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtQ29udHJvbGxlclN0dWIsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZF9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgZmFzdCBmb3J3YXJkIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQotICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX0ZBU1RfRk9SV0FSRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmV3aW5kX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCByZXdpbmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fUkVXSU5EKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9zaXRpb24gc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGFyZ3MucHV0TG9uZyhNZWRpYVNlc3Npb24yU3R1Yi5BUkdVTUVOVF9LRVlfUE9TSVRJT04sIHBvcyk7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE8sIGFyZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYWRkUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbW92ZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5yZXBsYWNlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRTaHVmZmxlTW9kZShtQ29udHJvbGxlclN0dWIsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSZXBlYXRNb2RlKG1Db250cm9sbGVyU3R1YiwgcmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllclN0YXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBvc2l0aW9uID0gbVBvc2l0aW9uTXMgKyAobG9uZykgKG1QbGF5YmFja1NwZWVkICogdGltZURpZmYpOwotICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cGVjdGVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWRfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1NwZWVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRNZWRpYUl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWVyU3RhdGVDaGFuZ2VzKGZpbmFsIGludCBzdGF0ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQobUluc3RhbmNlLCBzdGF0ZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lIHRvIHNlZWsgY29tcGxldGVkCi0gICAgdm9pZCBwdXNoUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgZXZlbnRUaW1lTXMsIGZpbmFsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IGV2ZW50VGltZU1zOwotICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlZWtDb21wbGV0ZWQobUluc3RhbmNlLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoZmluYWwgZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1NwZWVkQ2hhbmdlZChtSW5zdGFuY2UsIHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpeCB0aGlzIC0tIGl0J3Mgbm93IGJ1ZmZlcmVkIHN0YXRlCi0gICAgICAgICAgICAvL21DYWxsYmFjay5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKG1JbnN0YW5jZSwgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhmaW5hbCBQbGF5YmFja0luZm8gaW5mbykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja0luZm9DaGFuZ2VkKG1JbnN0YW5jZSwgaW5mbyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXlsaXN0Q2hhbmdlcyhmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKLSAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFJlcGVhdE1vZGVDaGFuZ2VzKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHJlcGVhdE1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkVycm9yKG1JbnN0YW5jZSwgZXJyb3JDb2RlLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICB2b2lkIG9uQ29ubmVjdGVkTm90TG9ja2VkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsCi0gICAgICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbywKLSAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWROb3RMb2NrZWQgc2Vzc2lvbkJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcgotICAgICAgICAgICAgICAgICAgICArICIsIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsIHx8IGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiByZWplY3RlZC4KLSAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBiZSBub3RpZmllZCBhYm91dCB0aGUgY29ubmVjdGlvbiByZXN1bHQgbWFueSB0aW1lcy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFByb2JhYmx5IGEgYnVnIG9yIG1hbGljaW91cyBhcHAuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRzID0gYWxsb3dlZENvbW1hbmRzOwotICAgICAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gcG9zaXRpb25FdmVudFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOwotICAgICAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUgbG9jYWwgYmluZGVyIGlzIG5vLW9wLAotICAgICAgICAgICAgICAgICAgICAvLyBzbyBjYW4gYmUgdXNlZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRlYWRsb2NrLgotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGRpZWQgdG9vIGVhcmx5LiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBjb21tYW5kcyB0byBwcmV2ZW50cyBpbGxlZ2FsIEFQSSBjYWxscy4KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG1heSB0cmlnZ2VyIENvbnRyb2xsZXJDYWxsYmFja3Mgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBCdXQgaXQncyBoYXJkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyb2xsZXIgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKG1JbnN0YW5jZSwgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNsb3NlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJpY2sgdG8gY2FsbCByZWxlYXNlKCkgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jawotICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRldmVsb3BlcidzIGN1c3RvbSBsb2NrIHdpdGhpbiB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkuCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgZmluYWwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ3VzdG9tQ29tbWFuZCBjbWQ9IiArIGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLgotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQ29tbWFuZChtSW5zdGFuY2UsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKG1JbnN0YW5jZSwgY29tbWFuZHMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChmaW5hbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUxheW91dENoYW5nZWQobUluc3RhbmNlLCBsYXlvdXQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIG1haW4tdGhyZWFkLgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQ29ubmVjdGVkICIgKyBuYW1lICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICAgICAgICAgIGlmICghbVRva2VuLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgbmFtZSArICIgd2FzIGNvbm5lY3RlZCwgYnV0IGV4cGVjdGVkIHBrZz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpICsgIiB3aXRoIGlkPSIgKyBtVG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciA9IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKHNlc3Npb25CaW5kZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFRlbXBvcmFsIGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBjcmFzaC4gU3lzdGVtIHdpbGwgYXV0b21hdGljYWxseQotICAgICAgICAgICAgLy8gcmViaW5kLCBzbyBqdXN0IG5vLW9wLgotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZWFsbHk/IEVpdGhlciBkaXNjb25uZWN0IGNsZWFubHkgb3IKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gc2VydmljZSAiICsgbmFtZSArICIgaXMgZGlzY29ubmVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmluZGluZ0RpZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAvLyBQZXJtYW5lbnQgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIHBhY2thZ2UgdXBkYXRlIG9yIHJlbW92ZWQuCi0gICAgICAgICAgICAvLyBUaGlzIFNlc3Npb25TZXJ2aWNlUmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBhY2NvcmRpbmdseSwgYnV0IGZvcmdldCBzZXNzaW9uIGJpbmRlciBoZXJlCi0gICAgICAgICAgICAvLyBmb3Igc3VyZS4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm9JbXBsIGltcGxlbWVudHMgUGxheWJhY2tJbmZvUHJvdmlkZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwucGxheWJhY2tfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jb250cm9sX3R5cGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLm1heF92b2x1bWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfVk9MVU1FID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jdXJyZW50X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fQVRUUklCVVRFUyA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuYXVkaW9fYXR0cnMiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tJbmZvIG1JbnN0YW5jZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKLQotICAgICAgICBwcml2YXRlIFBsYXliYWNrSW5mb0ltcGwoaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBwbGF5YmFja1R5cGU7Ci0gICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOwotICAgICAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OwotICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFBsYXliYWNrSW5mbyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXliYWNrSW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBCdW5kbGUgdG9CdW5kbGUoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgbVBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT05UUk9MX1RZUEUsIG1Db250cm9sVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9NQVhfVk9MVU1FLCBtTWF4Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FLCBtQ3VycmVudFZvbHVtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUywgbUF1ZGlvQXR0cnMpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbFR5cGUsIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mb0ltcGwocGxheWJhY2tUeXBlLCBhdHRycywgY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lVHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBidW5kbGUuZ2V0SW50KEtFWV9DT05UUk9MX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IG1heFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX01BWF9WT0xVTUUpOwotICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMgPSBidW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lVHlwZSwgYXR0cnMsIHZvbHVtZUNvbnRyb2wsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmM1ZGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMlN0dWIgZXh0ZW5kcyBJTWVkaWFDb250cm9sbGVyMi5TdHViIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlcjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXIySW1wbD4gbUNvbnRyb2xsZXI7Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YihNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlcjJJbXBsIGdldENvbnRyb2xsZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250cm9sbGVyIGlzIHJlbGVhc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUJyb3dzZXIySW1wbCBnZXRCcm93c2VyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgTWVkaWFCcm93c2VyMkltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMkltcGwpIGNvbnRyb2xsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoc3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUG9zaXRpb25DaGFuZ2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudFRpbWVNcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGV2ZW50VGltZU1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwb3NpdGlvbk1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUG9zaXRpb25DaGFuZ2VzKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3BlZWRDaGFuZ2VkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoc3BlZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyZWRQb3NpdGlvbk1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBidWZmZXJlZFBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZSwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXlsaXN0QnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwbGF5bGlzdEJ1bmRsZSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBpdGVtIGluIHBsYXlsaXN0Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdENoYW5nZXMocGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VzKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUmVwZWF0TW9kZUNoYW5nZXMocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5YmFja0luZm9DaGFuZ2VkKEJ1bmRsZSBwbGF5YmFja0luZm8pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIGluZm8gPSBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKTsKLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWJhY2tJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoc2h1ZmZsZU1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgc2h1ZmZsZU1vZGUsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1CdW5kbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGVMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpdGVtTGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25Db25uZWN0ZWROb3RMb2NrZWQoc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRHcm91cCksCi0gICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgICAgICBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgaXRlbUxpc3QsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25EaXNjb25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKExpc3Q8QnVuZGxlPiBjb21tYW5kQnV0dG9ubGlzdCkgewotICAgICAgICBpZiAoY29tbWFuZEJ1dHRvbmxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21MYXlvdXRDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZEJ1dHRvbmxpc3QiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZEJ1dHRvbmxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbW1hbmRCdXR0b24gYnV0dG9uID0gQ29tbWFuZEJ1dHRvbkltcGwuZnJvbUJ1bmRsZShjb21tYW5kQnV0dG9ubGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LmFkZChidXR0b24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKEJ1bmRsZSBjb21tYW5kc0J1bmRsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzID0gU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kc0J1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUNvbW1hbmQoQnVuZGxlIGNvbW1hbmRCdW5kbGUsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNZWRpYUJyb3dzZXIgc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgQnVuZGxlIHJvb3RFeHRyYSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgaXRlbUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldEl0ZW1Eb25lKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldENoaWxkcmVuRG9uZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uU2VhcmNoUmVzdWx0Q2hhbmdlZCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0U2VhcmNoUmVzdWx0RG9uZSgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkNoaWxkcmVuQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBhMGYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX0JST1dTQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfUExBWUFCTEU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZsYWdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotcHVibGljIGNsYXNzIE1lZGlhSXRlbTJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GTEFHUyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuZmxhZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVUQURBVEEgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLm1ldGFkYXRhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VVSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLnV1aWQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwotICAgIHByaXZhdGUgZmluYWwgVVVJRCBtVVVJRDsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgIC8vIEZyb20gdGhlIHB1YmxpYyBBUEkKLSAgICBwdWJsaWMgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgdGhpcyhtZWRpYUlkLCBkc2QsIG1ldGFkYXRhLCBmbGFncywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncywgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobWVkaWFJZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYWlkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWQgPSBtZWRpYUlkOwotICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkc2Q7Ci0gICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgbVVVSUQgPSAodXVpZCA9PSBudWxsKSA/IFVVSUQucmFuZG9tVVVJRCgpIDogdXVpZDsKLQotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFJdGVtMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lZGlhSXRlbTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFJdGVtMiBvdGhlciA9IChNZWRpYUl0ZW0yKSBvYmo7Ci0gICAgICAgIHJldHVybiBtVVVJRC5lcXVhbHMoKChNZWRpYUl0ZW0ySW1wbCkgb3RoZXIuZ2V0UHJvdmlkZXIoKSkubVVVSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIG9iamVjdCBhcyBhIGJ1bmRsZSB0byBzaGFyZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgYnVuZGxlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfRkxBR1MsIG1GbGFncyk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfTUVUQURBVEEsIG1NZXRhZGF0YS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9VVUlELCBtVVVJRC50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHV1aWRTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9VVUlEKTsKLSAgICAgICAgcmV0dXJuIGZyb21CdW5kbGUoYnVuZGxlLCBVVUlELmZyb21TdHJpbmcodXVpZFN0cmluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBVVUlEfS4KLSAgICAgKiBJZiB7QGxpbmsgVVVJRH0KLSAgICAgKiBjYW4gYmUgbnVsbCBmb3IgY3JlYXRpbmcgbmV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHBhcmFtIHV1aWQgQSB7QGxpbmsgVVVJRH0gdG8gb3ZlcnJpZGUuIENhbiBiZSB7QGxpbmsgbnVsbH0gZm9yIG92ZXJyaWRlLgotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgotICAgICAqLwotICAgIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGUoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSwgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gYnVuZGxlLmdldEJ1bmRsZShLRVlfTUVUQURBVEEpOwotICAgICAgICBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBidW5kbGUuZ2V0SW50KEtFWV9GTEFHUyk7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG51bGwsIG1ldGFkYXRhLCBmbGFncywgdXVpZCkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbTJ7Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOwotICAgICAgICBzYi5hcHBlbmQoIiwgbU1ldGFkYXRhPSIpLmFwcGVuZChtTWV0YWRhdGEpOwotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1GbGFnczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1JZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYUlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZ2V0RGF0YVNvdXJjZURlc2NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgQEZsYWdzIGludCBtRmxhZ3M7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOwotICAgICAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKEJ1aWxkZXIgaW5zdGFuY2UsIGludCBmbGFncykgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkX2ltcGwoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGF0YVNvdXJjZURlc2NfaW1wbChATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZGF0YVNvdXJjZURlc2MpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRhdGFTb3VyY2VEZXNjOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKG1NZXRhZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX01FRElBX0lEKSA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vICBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiBpdHMgc3VmZmljaWVudCAoZS5nLiBVc2UgVVVJRCBpbnN0ZWFkPykKLSAgICAgICAgICAgICAgICBpZCA9IChtTWVkaWFJZCAhPSBudWxsKSA/IG1NZWRpYUlkIDogdG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG1EYXRhU291cmNlRGVzYywgbU1ldGFkYXRhLCBtRmxhZ3MpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNGNkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJCYXNlSW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uIG1MaWJyYXJ5U2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZV9pbXBsKCk7Ci0KLSAgICAgICAgLy8gRWZmZWN0aXZlbHkgZmluYWwKLSAgICAgICAgTWVkaWFTZXNzaW9uMiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBNZWRpYUxpYnJhcnlTZXNzaW9uLCBidXQgcmV0dXJuZWQgTWVkaWFTZXNzaW9uMiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MaWJyYXJ5U2Vzc2lvbiA9IChNZWRpYUxpYnJhcnlTZXNzaW9uKSBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFMaWJyYXJ5U2Vzc2lvblByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHBsYXllciwgaWQsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyLCBzZXNzaW9uQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIC8vIERvbid0IHB1dCBhbnkgZXh0cmEgaW5pdGlhbGl6YXRpb24gaGVyZS4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgICAgICAgICAvLyBTeXN0ZW0gc2VydmljZSB3aWxsIHJlY29nbml6ZSB0aGlzIHNlc3Npb24gaW5zaWRlIG9mIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBhbmQgd291bGQKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhpcyBzZXNzaW9uIGFzc3VtaW5nIHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQuIEhvd2V2ZXIsIGlmIGFueQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gbG9naWMgaXMgaGVyZSwgY2FsbHMgZnJvbSB0aGUgc2VydmVyIHdvdWxkIGZhaWwuCi0gICAgICAgICAgICAvLyBzZWU6IE1lZGlhU2Vzc2lvbjJTdHViI2Nvbm5lY3QoKQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaykgc3VwZXIuZ2V0Q2FsbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKGNvbnRyb2xsZXIsIHBhcmVudElkLCBpdGVtQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChjb250cm9sbGVyLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLCBCdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlicmFyeVJvb3RJbXBsIGltcGxlbWVudHMgTGlicmFyeVJvb3RQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlicmFyeVJvb3QgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm9vdElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBMaWJyYXJ5Um9vdEltcGwoTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3RJZCBzaG91bGRuJ3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3RJZDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm9vdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjNTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJpdG1hcEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5Mb25nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuUmF0aW5nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuVGV4dEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFNZXRhZGF0YTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYU1ldGFkYXRhMkltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEyIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfVEVYVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0JJVE1BUCA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0ZMT0FUID0gNDsKLSAgICBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9JRCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRE9XTkxPQURfU1RBVFVTLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FVVEhPUiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9DT01QT1NFUgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAQml0bWFwS2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9VUklfT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRfVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMkltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIodGhpcyk7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5X2ltcGwoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5nZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKGtleSwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgZ2V0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBSYXRpbmcyIHJhdGluZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoa2V5KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSByYXRpbmcKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBSYXRpbmcuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJhdGluZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEZsb2F0KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpdG1hcCBnZXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCaXRtYXAgYm1wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJtcCA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgQml0bWFwLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibXA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhbiBidW5kbGUKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhbiBleHRyYSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFNZXRhZGF0YTIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIChidW5kbGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IE1lZGlhTWV0YWRhdGEySW1wbChidW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHNvdXJjZS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChpbnQgbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIodGhpcyk7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtQnVuZGxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJ1bmRsZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtcCA9IChCaXRtYXApIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLmdldEhlaWdodCgpID4gbWF4Qml0bWFwU2l6ZSB8fCBibXAuZ2V0V2lkdGgoKSA+IG1heEJpdG1hcFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBDaGFyU2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0xPTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGxvbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSwgUmF0aW5nMiB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfUkFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBSYXRpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShrZXksIHZhbHVlLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXksIEJpdG1hcCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfQklUTUFQKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBCaXRtYXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9GTE9BVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgZmxvYXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEZsb2F0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTLCBidW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKG1CdW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUJpdG1hcChCaXRtYXAgYm1wLCBpbnQgbWF4U2l6ZSkgewotICAgICAgICAgICAgZmxvYXQgbWF4U2l6ZUYgPSBtYXhTaXplOwotICAgICAgICAgICAgZmxvYXQgd2lkdGhTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldEhlaWdodCgpOwotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKGJtcC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChibXAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJtcCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDRlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFQbGF5bGlzdEFnZW50SW1wbCBpbXBsZW1lbnRzIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUGxheWxpc3RBZ2VudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBtSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAotICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzLmdldChjYWxsYmFjaykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbGxiYWNrIGlzIGFscmVhZHkgYWRkZWQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0PSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFNodWZmbGVNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UmVwZWF0TW9kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW1faW1wbChATm9uTnVsbCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkc2Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIGlmIChpdGVtTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBpdGVtTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSA9PSBkc2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGdldENhbGxiYWNrcygpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY2FsbGJhY2tzLnB1dEFsbChtQ2FsbGJhY2tzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FsbGJhY2tzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNjA0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX0NVU1RPTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb24yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ly9Mb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJTdHViIG1TZXNzaW9uU3R1YjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVNlc3Npb25Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBtUGxheWxpc3RFdmVudENhbGxiYWNrOwotCi0gICAgLy8gbVBsYXllciBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYW5kIHdlIHNob3VsZG4ndCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAvLyBub3IgbGVhdmUgbG9nIGFsd2F5cyBmb3IgdXNpbmcgbVBsYXllciB3aGVuIGl0J3MgbnVsbC4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgLy8gV2hlbiBhIE1lZGlhU2Vzc2lvbjIgaXMgY2xvc2VkLCB0aGVyZSBjb3VsZCBiZSBhIHBlbmRlZCBvcGVyYXRpb24gaW4gdGhlIHNlc3Npb24gY2FsbGJhY2sKLSAgICAvLyBleGVjdXRvciB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgcGxheWVyLiBIZXJlJ3MgdGhlIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHRoYXQuCi0gICAgLy8KLSAgICAvLyAgIHB1YmxpYyB2b2lkIG9uRm9vKCkgewotICAgIC8vICAgICBpZiAobVBsYXllciA9PSBudWxsKSByZXR1cm47IC8vIGZpcnN0IGNoZWNrCi0gICAgLy8gICAgIG1TZXNzaW9uQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRvcigoKSAtPiB7Ci0gICAgLy8gICAgICAgLy8gRXJyb3IuIFNlc3Npb24gbWF5IGJlIGNsb3NlZCBhbmQgbVBsYXllciBjYW4gYmUgbnVsbCBoZXJlLgotICAgIC8vICAgICAgIG1QbGF5ZXIuZm9vKCk7Ci0gICAgLy8gICAgIH0pOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gQnkgYWRkaW5nIHByb3RlY3RpdmUgY29kZSwgd2UgY2FuIGFsc28gcHJvdGVjdCBBUElzIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjbG9zZSgpCi0gICAgLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBwdXQgdm9sYXRpbGUgaGVyZT8KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbVNlc3Npb25QbGF5bGlzdEFnZW50OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotCi0gICAgLyoqCi0gICAgICogQ2FuIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfS4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwbGF5ZXIKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gcGxheWxpc3RBZ2VudAotICAgICAqIEBwYXJhbSB2b2x1bWVQcm92aWRlcgotICAgICAqIEBwYXJhbSBzZXNzaW9uQWN0aXZpdHkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2tFeGVjdXRvcgotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24ySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgb3RoZXIgcGFyYW1zLgotICAgICAgICBtSW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIEFyZ3VtZW50IGNoZWNrcyBhcmUgZG9uZSBieSBidWlsZGVyIGFscmVhZHkuCi0gICAgICAgIC8vIEluaXRpYWxpemUgZmluYWxzIGZpcnN0LgotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBjYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OwotICAgICAgICBtU2Vzc2lvblN0dWIgPSBuZXcgTWVkaWFTZXNzaW9uMlN0dWIodGhpcyk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKHRoaXMpOwotICAgICAgICBtUGxheWxpc3RFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKHRoaXMpOwotCi0gICAgICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGUgaWQgYW5kIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgU3RyaW5nIGxpYnJhcnlTZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25TZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwgJiYgbGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX0xJQlJBUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbGlicmFyeVNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTl9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBzZXNzaW9uU2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG51bGwsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0KLSAgICAgICAgLy8gQXNrIHNlcnZlciBmb3IgdGhlIHNhbml0eSBjaGVjaywgYW5kIHN0YXJ0cwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIG1ha2luZyBzZXNzaW9uIElEIHVuaXF1ZSAncGVyIHBhY2thZ2UnIGNhbm5vdCBiZSBkb25lIGluIGhlcmUuCi0gICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBrbm93IGlmIHRoZSBwYWNrYWdlIGhhcyBhbm90aGVyIHByb2Nlc3MgYW5kIGhhcyBhbm90aGVyIHNlc3Npb24gd2l0aCB0aGUKLSAgICAgICAgLy8gc2FtZSBpZC4gTm90ZSB0aGF0ICdJRCBpcyB1bmlxdWUgcGVyIHBhY2thZ2UnIGlzIGltcG9ydGFudCBmb3IgY29udHJvbGxlciB0byBkaXN0aW5ndWlzaAotICAgICAgICAvLyBhIHNlc3Npb24gaW4gYW5vdGhlciBwYWNrYWdlLgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgaWYgKCFtYW5hZ2VyLmNyZWF0ZVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZXNzaW9uIHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSB1c2VkIGJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYW5vdGhlciBwcm9jZXNzLiBVc2UgTWVkaWFDb250cm9sbGVyMiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlQWN0aW9uLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VBY3Rpb24pOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gc2VydmljZXMgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoc2VydmljZUludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gU2Vzc2lvblRva2VuMkltcGwuZ2V0U2Vzc2lvbklkKHNlcnZpY2VzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJZCAhPSBudWxsICYmIFRleHRVdGlscy5lcXVhbHMoaWQsIHNlcnZpY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvLm5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllcihNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQsCi0gICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG9sZEFnZW50OwotICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbyA9IGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVQcm92aWRlciwgcGxheWVyLmdldEF1ZGlvQXR0cmlidXRlcygpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgb2xkUGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG9sZEFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQodGhpcywgbVBsYXllcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ec21IZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRHNtSGVscGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWdlbnQgPSBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IGFnZW50OwotICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG9sZFBsYXllcikgewotICAgICAgICAgICAgcGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpIHsKLSAgICAgICAgICAgIGFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChvbGRBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkQWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoaW5mbyk7Ci0gICAgICAgICAgICBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKG9sZFBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXBlYXQgdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBwbGF5bGlzdCBhZ2VudC4KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMpIHsKLSAgICAgICAgUGxheWJhY2tJbmZvIGluZm87Ci0gICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtOwotICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBhdHRycy5nZXRWb2x1bWVDb250cm9sU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF5IGhhcHBlbiBpZiB0aGUgQXVkaW9BdHRyaWJ1dGVzIGRvZXNuJ3QgaGF2ZSB1c2FnZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIHRoZSBTVFJFQU1fTVVTSUMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgYXVkaW8gbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnlpbmcgdm9sdW1lIGxldmVsLgotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzVm9sdW1lRml4ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKHN0cmVhbSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUgLyogQ29udHJvbFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDb250cm9sVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRNYXhWb2x1bWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgewotICAgICAgICAvLyBTdG9wIHN5c3RlbSBzZXJ2aWNlIGZyb20gbGlzdGVuaW5nIHRoaXMgc2Vzc2lvbiBmaXJzdC4KLSAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgIG1hbmFnZXIuZGVzdHJveVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pOwotCi0gICAgICAgIGlmIChtU2Vzc2lvblN0dWIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbiBpcyBub3cgdW5hdmFpbGFibGUsIGlkPSIgKyBtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXNzaW9uIHN0dWIuCi0gICAgICAgICAgICBtU2Vzc2lvblN0dWIuZGVzdHJveU5vdExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXI7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBsYXllcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb25uZWN0ZWRDb250cm9sbGVyc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViLmdldENvbnRyb2xsZXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChBdWRpb0ZvY3VzUmVxdWVzdCBhZnIpIHsKLSAgICAgICAgLy8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wbGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5yZXNldCgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTGF5b3V0X2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGF5b3V0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChjb250cm9sbGVyLCBsYXlvdXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgZm9sbG93cwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHNfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kcyBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZXRBbGxvd2VkQ29tbWFuZHMoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UGxheWxpc3QobGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRQbGF5bGlzdEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wcmVwYXJlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yX2ltcGwoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5RXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbChATm9uTnVsbCBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgewotICAgICAgICBpZiAoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlbHBlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihoZWxwZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LmNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gRW5mb3JjZXMgZGV2ZWxvcGVycyB0byBjYWxsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGUgaW5pdGlhbGx5IGdpdmVuIHRocmVhZAotICAgIC8vIGJlY2F1c2UgY2FsbHMgZnJvbSB0aGUgTWVkaWFDb250cm9sbGVyMiB3aWxsIGJlIHJ1biBvbiB0aGUgdGhyZWFkLgotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGFsbG93IGNhbGxzIGZyb20gdGhlIG11bHRpcGxlIHRocmVhZD8KLSAgICAvLyAgICAgICAgICAgICAgIEkgcHJlZmVyIHRoaXMgd2F5IGJlY2F1c2UgYWxsb3dpbmcgbXVsdGlwbGUgdGhyZWFkIG1heSBjYXNlIHRyaWNreSBpc3N1ZSBsaWtlCi0gICAgLy8gICAgICAgICAgICAgICBiLzYzNDQ2MzYwLiBJZiB0aGUge0BsaW5rICNzZXRQbGF5ZXIoKX0gd2l0aCB7QGNvZGUgbnVsbH0gY2FuIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gICAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCwgdHJhbnNwb3J0IGNvbnRyb2xzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhhdC4KLSAgICAvLyAgICAgICAgICAgICAgIFRoYXQncyBiYXNpY2FsbHkgdGhlIGRldmVsb3BlcidzIG1pc3Rha2UsIGJ1dCB0aGV5IGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQncwotICAgIC8vICAgICAgICAgICAgICAgaGFwcGVuaW5nIGJlaGluZCB1bnRpbCB3ZSB0ZWxsIHRoZW0gc28uCi0gICAgLy8gICAgICAgICAgICAgICBJZiBlbmZvcmNpbmcgY2FsbGxpbmcgdGhyZWFkIGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBjYW4gYWx0ZXJuYXRpdmVseSBwaWNrCi0gICAgLy8gICAgICAgICAgICAgICAxLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcy4KLSAgICAvLyAgICAgICAgICAgICAgIDIuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLCBleGNlcHQgZm9yIHRoZQotICAgIC8vICAgICAgICAgICAgICAgICAge0BsaW5rICNzZXRQbGF5ZXIoKX0uCi0gICAgdm9pZCBlbnN1cmVDYWxsaW5nVGhyZWFkKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBvciByZW1vdmUKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKG1IYW5kbGVyLmdldExvb3BlcigpICE9IExvb3Blci5teUxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSdW4gdGhpcyBvbiB0aGUgZ2l2ZW4gdGhyZWFkIik7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQobGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKHJlcGVhdE1vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQoTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCkgRmluZCBiZXR0ZXIgd2F5IGZvciBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSAvLwotICAgICAgICAvLyAgICAgICAgICAgICAgIEluIHRoZW9yeSwgU2Vzc2lvbi5nZXRYWFgoKSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIFBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZCB3ZSBzaG91bGQgbm90aWZ5IGluZm9ybWF0aW9uIG9mIHRoZSBzZXNzaW9uLmdldFhYWCgpIGluc3RlYWQgb2YKLSAgICAgICAgLy8gICAgICAgICAgICAgICBwbGF5ZXIuZ2V0WFhYKCkKLSAgICAgICAgLy8gTm90aWZ5IHRvIGNvbnRyb2xsZXJzIGFzIHdlbGwuCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICBpZiAoc3RhdGUgIT0gb2xkUGxheWVyLmdldFBsYXllclN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb24gPSBwbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoY3VycmVudFRpbWVNcywgcG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgc3BlZWQgPSBwbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICBpZiAoc3BlZWQgIT0gb2xkUGxheWVyLmdldFBsYXliYWNrU3BlZWQoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKHNwZWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChidWZmZXJlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcigpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXI7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgU2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrOwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjJTdHViIGdldFNlc3Npb25TdHViKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViOwotICAgIH0KLQotICAgIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgICAgICBwcml2YXRlIE15UGxheWVyRXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXJyZW50TWVkaWFJdGVtQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYVByZXBhcmVkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uTWVkaWFQcmVwYXJlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXllclN0YXRlQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gc2Vzc2lvbi5nZXRQbGF5bGlzdEFnZW50KCk7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gYWdlbnQuZ2V0TWVkaWFJdGVtKGRzZCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGl0ZW0gZm9yIGRzZD0iICsgZHNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZEltcGwgaW1wbGVtZW50cyBDb21tYW5kUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ09ERQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jb21tYW5kX2NvZGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY3VzdG9tX2NvbW1hbmQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmV4dHJhcyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29tbWFuZENvZGU7Ci0gICAgICAgIC8vIE5vbm51bGwgaWYgaXQncyBjdXN0b20gY29tbWFuZAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ3VzdG9tQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gY29tbWFuZENvZGU7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgICBtRXh0cmFzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIEBOb25OdWxsIFN0cmluZyBhY3Rpb24sCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBDT01NQU5EX0NPREVfQ1VTVE9NOwotICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBhY3Rpb247Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3VzdG9tQ29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBCdW5kbGUgaW5zdGFuY2UgZnJvbSB0aGUgQ29tbWFuZAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT01NQU5EX0NPREUsIG1Db21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ELCBtQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgQ29tbWFuZCBpbnN0YW5jZSBmcm9tIHRoZSBCdW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb2RlID0gY29tbWFuZC5nZXRJbnQoS0VZX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY29kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXN0b21Db21tYW5kID0gY29tbWFuZC5nZXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQpOwotICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGN1c3RvbUNvbW1hbmQsIGNvbW1hbmQuZ2V0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRJbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbW1hbmRJbXBsIG90aGVyID0gKENvbW1hbmRJbXBsKSBvYmo7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbXBhcmUgQ29tbWFuZHMgd2l0aCB0aGUgZ2VuZXJhdGVkIFVVSUQsIGFzIHdlJ3JlIGRvaW5nIGZvciB0aGUgTUkyLgotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZSA9PSBvdGhlci5tQ29tbWFuZENvZGUKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtQ3VzdG9tQ29tbWFuZCwgb3RoZXIubUN1c3RvbUNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICAgICAgcmV0dXJuICgobUN1c3RvbUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyBtQ3VzdG9tQ29tbWFuZC5oYXNoQ29kZSgpIDogMCkgKiBwcmltZSArIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudCBzZXQgb2Yge0BsaW5rIFNlc3Npb25Db21tYW5kMn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kR3JvdXBJbXBsIGltcGxlbWVudHMgQ29tbWFuZEdyb3VwUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXNlc3Npb24yLmNvbW1hbmRncm91cC5jb21tYW5kcyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBhbGwgY29tbWFuZCBjb2RlcwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERSA9ICJDT01NQU5EX0NPREVfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWVyQmFzZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyA9ICJDT01NQU5EX0NPREVfUExBWUJBQ0tfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWxpc3RBZ2VudAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCA9ICJDT01NQU5EX0NPREVfUExBWUxJU1RfIjsKLQotICAgICAgICBwcml2YXRlIFNldDxTZXNzaW9uQ29tbWFuZDI+IG1Db21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtSW5zdGFuY2U7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIE9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlciBpbnN0YW5jZW9mIENvbW1hbmRHcm91cEltcGwpIHsKLSAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkQWxsKCgoQ29tbWFuZEdyb3VwSW1wbCkgb3RoZXIpLm1Db21tYW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbCgpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbFByZWRlZmluZWRDb21tYW5kc19pbXBsKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5YmFja0NvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0spOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5bGlzdENvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKTogRG9uJ3QgdXNlIHJlZmxlY3Rpb24gZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gTWVkaWFTZXNzaW9uMi5jbGFzcy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKG5ldyBTZXNzaW9uQ29tbWFuZDIoZmllbGRzW2ldLmdldEludChudWxsKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCAiICsgZmllbGRzW2ldICsgIiBpbiBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRzLmNvbnRhaW5zKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChpbnQgY29kZSkgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZSBoYXNDb21tYW5kKENvbW1hbmQpIGZvciBjdXN0b20gY29tbWFuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gY29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobUNvbW1hbmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBidW5kbGUgZnJvbSB0aGUgQ29tbWFuZEdyb3VwCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbW1hbmQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTLCBsaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ29tbWFuZEdyb3VwIGZyb20gdGhlIGJ1bmRsZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8UGFyY2VsYWJsZT4gbGlzdCA9IGNvbW1hbmRzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTKTsKLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRHcm91cCA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBwYXJjZWxhYmxlID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocGFyY2VsYWJsZSBpbnN0YW5jZW9mIEJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gKEJ1bmRsZSkgcGFyY2VsYWJsZTsKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZEdyb3VwLmFkZENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJvbGxlckluZm9JbXBsIGltcGxlbWVudHMgQ29udHJvbGxlckluZm9Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckluZm8gbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNUcnVzdGVkOwotICAgICAgICBwcml2YXRlIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIG1Db250cm9sbGVyQmluZGVyOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVySW5mb0ltcGwoQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwKLSAgICAgICAgICAgICAgICBpbnQgcGlkLCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJCaW5kZXIgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgICAgIC8vIEFzayBzZXJ2ZXIgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyB0cnVzdGVkLgotICAgICAgICAgICAgLy8gQXBwIGNhbm5vdCBrbm93IHRoaXMgYmVjYXVzZSBhcHBzIGNhbm5vdCBxdWVyeSBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IKLSAgICAgICAgICAgIC8vIGFub3RoZXIgcGFja2FnZSwgYnV0IHN5c3RlbSBzZXJ2ZXIgY2FuIGRvLgotICAgICAgICAgICAgbUlzVHJ1c3RlZCA9IG1hbmFnZXIuaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKAotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RydXN0ZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNUcnVzdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKChDb250cm9sbGVySW5mbykgb2JqKS5nZXRQcm92aWRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbnRyb2xsZXJJbmZvIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIsIHVpZD0iICsgbVVpZCArICIsIHRydXN0ZWQ9IgotICAgICAgICAgICAgICAgICAgICArIG1Jc1RydXN0ZWQgKyAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mb0ltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIG90aGVyID0gKENvbnRyb2xsZXJJbmZvSW1wbCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkuZXF1YWxzKG90aGVyLm1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udHJvbGxlckluZm8gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUJpbmRlciBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBDb250cm9sbGVySW5mb0ltcGwgZnJvbShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbnRyb2xsZXJJbmZvSW1wbCkgY29udHJvbGxlci5nZXRQcm92aWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kQnV0dG9uSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9SRVNfSUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmljb25fcmVzX2lkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNQTEFZX05BTUUKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmRpc3BsYXlfbmFtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5leHRyYXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmVuYWJsZWQiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOwotICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbkltcGwoQE51bGxhYmxlIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBpbnQgaWNvblJlc0lkLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGlzcGxheU5hbWUsIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXNJZDsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBDb21tYW5kQnV0dG9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUKLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGdldENvbW1hbmRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEljb25SZXNJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uUmVzSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5ELCBtQ29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0lDT05fUkVTX0lELCBtSWNvblJlc0lkKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSwgbURpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgbUVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBATnVsbGFibGUgQ29tbWFuZEJ1dHRvbiBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoYnVuZGxlLmdldEJ1bmRsZShLRVlfQ09NTUFORCkpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0SWNvblJlc0lkKGJ1bmRsZS5nZXRJbnQoS0VZX0lDT05fUkVTX0lELCAwKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldERpc3BsYXlOYW1lKGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFeHRyYXMoYnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFsZm9ybWVkIG9yIHZlcnNpb24gbWlzbWF0Y2guIFJldHVybiBudWxsIGZvciBub3cuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIENvbW1hbmRCdXR0b259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldENvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0SWNvblJlc0lkX2ltcGwoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICAgICAgbUljb25SZXNJZCA9IHJlc0lkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXREaXNwbGF5TmFtZV9pbXBsKFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICYmIG1Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5hYmxlZCBidXR0b24gbmVlZHMgQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNvbnRyb2xsZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBudWxsICYmIG1Db21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gQ09NTUFORF9DT0RFX0NVU1RPTQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1JY29uUmVzSWQgPT0gMCB8fCBUZXh0VXRpbHMuaXNFbXB0eShtRGlzcGxheU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXN0b20gY29tbWFuZHMgbmVlZHMgaWNvbiBhbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBuYW1lIHRvIGRpc3BsYXkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kQnV0dG9uSW1wbChtQ29tbWFuZCwgbUljb25SZXNJZCwgbURpc3BsYXlOYW1lLCBtRXh0cmFzLCBtRW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXJCYXNlSW1wbDxUIGV4dGVuZHMgTWVkaWFTZXNzaW9uMiwgQyBleHRlbmRzIFNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRlckJhc2VQcm92aWRlcjxULCBDPiB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgICAgIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgICAgICBTdHJpbmcgbUlkOwotICAgICAgICBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICAgICAgQyBtQ2FsbGJhY2s7Ci0gICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICAgICAgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0Ci0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIHBsYXllciBpcyBhCi0gICAgICAgICAqICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbjJ9IG9yIHtAbGluayBNZWRpYUNvbnRyb2xsZXIyfS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWxzbyBuZWVkIGV4ZWN1dG9yCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyQmFzZUltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAgICAgLy8gRW5zdXJlIG5vbi1udWxsCi0gICAgICAgICAgICBtSWQgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RBZ2VudF9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICBpZiAocGxheWxpc3RBZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWxpc3RBZ2VudCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBwbGF5bGlzdEFnZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVByb3ZpZGVyX2ltcGwoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQWN0aXZpdHlfaW1wbChQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gcGk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWRfaW1wbChATm9uTnVsbCBTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWxsYmFja19pbXBsKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBDIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGFic3RyYWN0IFQgYnVpbGRfaW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb250ZXh0IGNvbnRleHQsIEJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvbkNhbGxiYWNrKCkge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjU3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5NZWRpYUxpYnJhcnlTZXNzaW9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbnRyb2xsZXJJbmZvSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24yU3R1YiBleHRlbmRzIElNZWRpYVNlc3Npb24yLlN0dWIgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUE9TSVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0lURU1fSU5ERVggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfaXRlbV9pbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUExBWUxJU1RfUEFSQU1TID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wbGF5bGlzdF9wYXJhbXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yU3R1YiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogUmVuYW1lLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8U2Vzc2lvbkNvbW1hbmQyPiBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0ID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8SUJpbmRlciwgQ29udHJvbGxlckluZm8+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgU2V0PElCaW5kZXI+IG1Db25uZWN0aW5nQ29udHJvbGxlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNlc3Npb25Db21tYW5kR3JvdXAyPiBtQWxsb3dlZENvbW1hbmRHcm91cE1hcCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXQ8U3RyaW5nPj4gbVN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJTdHViKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDb21tYW5kR3JvdXBJbXBsIGdyb3VwID0gbmV3IENvbW1hbmRHcm91cEltcGwoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5YmFja0NvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWxpc3RDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIFNldDxTZXNzaW9uQ29tbWFuZDI+IGNvbW1hbmRzID0gZ3JvdXAuZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogY29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5hcHBlbmQoY29tbWFuZC5nZXRDb21tYW5kQ29kZSgpLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95Tm90TG9ja2VkKCkgewotICAgICAgICBmaW5hbCBMaXN0PENvbnRyb2xsZXJJbmZvPiBsaXN0OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwotICAgICAgICAgICAgbGlzdCA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGNvbnRyb2xsZXJCaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAoKENvbnRyb2xsZXJJbmZvSW1wbCkgbGlzdC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayBob2xkIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJCaW5kZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBpcyBnb25lLiBTaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlJ3JlIGRlc3Ryb3lpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZ2V0TGlicmFyeVNlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKCEoc2Vzc2lvbiBpbnN0YW5jZW9mIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlc3Npb24gaXNuJ3QgYSBsaWJyYXJ5IHNlc3Npb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSBzZXNzaW9uOwotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBtQ29udHJvbGxlcnMuZ2V0KGNhbGxlci5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0U2Vzc2lvbigpIGFscmVhZHkgbG9nZ2VkIGlmIHNlc3Npb24gaXMgY2xvc2VkLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm9JbXBsIGltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Db250cm9sbGVycy5nZXQoaW1wbC5nZXRJZCgpKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db25uZWN0aW5nQ29udHJvbGxlcnMuY29udGFpbnMoaW1wbC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlciArICIgaXNuJ3QgY29ubmVjdGVkIG5vciBjb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5nZXQoY29tbWFuZENvZGUpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db21tYW5kUmVxdWVzdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJ1biByZWplY3RlZCBjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbW1hbmQgKGNvZGU9IiArIGNvbW1hbmRDb2RlICsgIikgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlciArICIgd2FzIHJlamVjdGVkIGJ5ICIgKyBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm93c2VyQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24gPSBnZXRMaWJyYXJ5U2Vzc2lvbigpOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKGludCBjb21tYW5kQ29kZSwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBjYWxsIHRoaXMgQVBJIGRpcmVjdGx5LiBVc2Ugbm90aWZ5KCkgaW5zdGVhZC4KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5SW50ZXJuYWwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsIHx8IGlDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVubmFibGUucnVuKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIudG9TdHJpbmcoKSArICIgaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBpdCdzIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gb3IgRGVhZFN5c3RlbUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFdlJ2QgYmV0dGVyIHRvIGxlYXZlIGxvZyBmb3IgdGhvc2UgY2FzZXMgYmVjYXVzZQotICAgICAgICAgICAgLy8gICAtIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gbWVhbnMgdGhhdCB3ZSBtYXkgbmVlZCB0byBmaXggb3VyIGNvZGUuCi0gICAgICAgICAgICAvLyAgICAgKGUuZy4gYWRkIHBhZ2luYXRpb24gb3Igc3BlY2lhbCB3YXkgdG8gZGVsaXZlciBCaXRtYXApCi0gICAgICAgICAgICAvLyAgIC0gRGVhZFN5c3RlbUV4Y2VwdGlvbiBtZWFucyB0aGF0IGVycm9ycyBhcm91bmQgaXQgY2FuIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJFeGNlcHRpb24gaW4gIiArIGNvbnRyb2xsZXIudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db250cm9sbGVyQ2xvc2VkKElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB7Ci0gICAgICAgIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMucmVtb3ZlKGlDb250cm9sbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzaW5nICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uRGlzY29ubmVjdGVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBSURMIG1ldGhvZHMgZm9yIHNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzZXNzaW9uLmdldENvbnRleHQoKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBuZXcgQ29udHJvbGxlckluZm8oY29udGV4dCwKLSAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpLCBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpLCBjYWxsaW5nUGFja2FnZSwgY2FsbGVyKTsKLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgLy8gS2VlcCBjb25uZWN0aW5nIGNvbnRyb2xsZXJzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgc2Vzc2lvbnMgdG8gY2FsbCBBUElzIGluIHRoZSBvbkNvbm5lY3QoKSAoZS5nLiBzZXRDdXN0b21MYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHBlbmRpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmFkZChDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db25uZWN0KAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIC8vIERvbid0IHJlamVjdCBjb25uZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBmcm9tIHRydXN0ZWQgYXBwLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGZhaWwgdG8gcmV0cmlldmUgc2Vzc2lvbidzIGluZm9ybWF0aW9uIHRvIGRpc3BhdGNoCi0gICAgICAgICAgICAvLyBtZWRpYSBrZXlzIHRvLgotICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHQgPSBhbGxvd2VkQ29tbWFuZHMgIT0gbnVsbCB8fCBjb250cm9sbGVySW5mby5pc1RydXN0ZWQoKTsKLSAgICAgICAgICAgIGlmIChhY2NlcHQpIHsKLSAgICAgICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgY29udHJvbGxlckltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFjY2VwdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRydXN0ZWQgYXBwcywgc2VuZCBub24tbnVsbCBhbGxvd2VkIGNvbW1hbmRzIHRvIGtlZXAgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlckltcGwuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlckltcGwuZ2V0SWQoKSwgIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXJJbmZvLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiBjb25uZWN0aW9uIGlzIGFjY2VwdGVkLCBub3RpZnkgdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAgICAgLy8gSXQncyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW5ub3QgY2FsbCBzeW5jaHJvbm91cyBjYWxscyBiZXR3ZWVuIHNlc3Npb24vY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSdyZSBkb2luZyB0aGlzIGFmdGVyIHRoZSBvbkNvbm5lY3Rpb25DaGFuZ2VkKCksIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZQotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoYXQgZXZlbnRzIGhlcmUgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZSBvbkNvbm5lY3RlZCgpIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyAgICAgICBJTWVkaWFDb250cm9sbGVyMiBpcyBvbmV3YXkgKGkuZS4gYXN5bmMgY2FsbCkgYW5kIFN0dWIgd2lsbAotICAgICAgICAgICAgICAgIC8vICAgICAgIHVzZSB0aHJlYWQgcG9sbCBmb3IgaW5jb21pbmcgY2FsbHMuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBsYXllclN0YXRlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0gKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQbGF5YmFja0luZm8oKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb24uZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5bGlzdCgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBGaW5kIGEgd2F5IHRvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBpdGVtQnVuZGxlID0gaXRlbS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUuYWRkKGl0ZW1CdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEb3VibGUgY2hlY2sgaWYgc2Vzc2lvbiBpcyBzdGlsbCB0aGVyZSwgYmVjYXVzZSBjbG9zZSgpIGNhbiBiZSBjYWxsZWQgaW4gYW5vdGhlcgotICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25Db25uZWN0ZWQoTWVkaWFTZXNzaW9uMlN0dWIudGhpcywgYWxsb3dlZENvbW1hbmRzLnRvQnVuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRQb3NpdGlvbk1zLCBwbGF5YmFja0luZm9CdW5kbGUsIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLCBzZXNzaW9uQWN0aXZpdHkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGhlcmUuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlamVjdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgotICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYW4gaXNzdWUgYmVjYXVzZSB3ZSdsbCBpZ25vcmUgaXQgYW55d2F5LgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoY2FsbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUbyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIGludCB2YWx1ZSwgZmluYWwgaW50IGZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTZXQgbG9jYWwgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25TZXRWb2x1bWVUbyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkanVzdCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vbkFkanVzdFZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgY29tbWFuZENvZGUsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVk6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUFJFUEFSRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE86Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZWVrVG8oYXJncy5nZXRMb25nKEFSR1VNRU5UX0tFWV9QT1NJVElPTikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlc2VuZCB1bmtub3duIChuZXcpIGNvbW1hbmRzIHRocm91Z2ggdGhlIGN1c3RvbSBjb21tYW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBjb21tYW5kQnVuZGxlLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3MsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZW5kQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXN0b21Db21tYW5kKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJhdGluZ0J1bmRsZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fU0VUX1JBVElORywKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nQnVuZGxlIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFJhdGluZzIgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKHJhdGluZ0J1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZXRSYXRpbmcoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBtZWRpYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVCwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UGxheWxpc3QoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgVVVJRCBpbiB0aGUgcGxheWxpc3QKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKHBsYXlsaXN0LmdldChpKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UGxheWxpc3QobGlzdCwgTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIGFkZFBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmFkZFBsYXlsaXN0SXRlbShpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIHJlcGxhY2VQbGF5bGlzdEl0ZW0uCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfVE9fUExBWUxJU1RfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNraXBUb1BsYXlsaXN0SXRlbSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSXRlbSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1BsYXlsaXN0SXRlbShNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfUFJFVl9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX05FWFRfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFJlcGVhdE1vZGUocmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3IgTGlicmFyeVNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGZpbmFsIExpYnJhcnlSb290IHJvb3QgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRMaWJyYXJ5Um9vdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRSb290SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldEV4dHJhcygpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRJdGVtKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0SXRlbShzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQpOwotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCByZXN1bHQgPT0gbnVsbCA/IG51bGwgOiByZXN1bHQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldENoaWxkcmVuKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0Q2hpbGRyZW4oKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhIGl0ZW1zICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgbmVnYXRpdmUgcGFnZSAvIHBhZ2VTaXplLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWdlPSIgKyBwYWdlICsgIiBwYWdlU2l6ZT0iICsgcGFnZVNpemUgKyAiIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0U2VhcmNoUmVzdWx0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0U2VhcmNoUmVzdWx0KCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpdGVtcyBtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbikgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIG9wdGlvbik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9uID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnB1dChjb250cm9sbGVyLCBzdWJzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHBhcmVudElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInVuc3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uVW5zdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBwYXJlbnRJZCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVBJcyBmb3IgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgUG9zdC1QKSBOZWVkIGEgd2F5IHRvIGdldCBjb250cm9sbGVyIHdpdGggcGVybWlzc2lvbnMKLSAgICBwdWJsaWMgTGlzdDxDb250cm9sbGVySW5mbz4gZ2V0Q29udHJvbGxlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVycy5hZGQobUNvbnRyb2xsZXJzLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyczsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoaW50IHN0YXRlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUG9zaXRpb25DaGFuZ2VkKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja1NwZWVkQ2hhbmdlZChzcGVlZCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGxheW91dEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9ICgoQ29tbWFuZEJ1dHRvbkltcGwpIGxheW91dC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0QnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0QnVuZGxlcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QuZ2V0KGkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHBsYXlsaXN0LmdldChpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RDaGFuZ2VkKGJ1bmRsZUxpc3QsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUmVwZWF0TW9kZUNoYW5nZWQocmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblNodWZmbGVNb2RlQ2hhbmdlZChzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gcGxheWJhY2tJbmZvKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPQotICAgICAgICAgICAgICAgICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkgcGxheWJhY2tJbmZvLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja0luZm9DaGFuZ2VkKHBsYXliYWNrSW5mb0J1bmRsZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kcyhDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzLnRvQnVuZGxlKCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwgaWYgcmVzdWx0IHJlY2VpdmVyIGlzIgotICAgICAgICAgICAgICAgICAgICArICIgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncykgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25FcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1YnNjcmliZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbnMgPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PSBudWxsIHx8ICFzdWJzY3JpcHRpb25zLmNvbnRhaW5zKHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gTWlzYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgU2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBOb3RpZnlSdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2ViNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8vIFRPRE8oamFld2FuKTogTmVlZCBhIHRlc3QgZm9yIHNlc3Npb24gc2VydmljZSBpdHNlbGYuCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1QU2Vzc2lvblNlcnZpY2UiOyAvLyB0byBtZWV0IDIzIGNoYXIgbGltaXQgaW4gTG9nIHRhZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZSB0aGlzLiAoYi83NDA5NDYxMSkKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEludGVudCBtU3RhcnRTZWxmSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoIiArIGluc3RhbmNlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb24gb25VcGRhdGVOb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBVSSBsYXRlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUluc3RhbmNlLmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBtU3RhcnRTZWxmSW50ZW50ID0gbmV3IEludGVudChtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRDbGFzcygpKTsKLQotICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjIobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IGdldFNlc3Npb25UeXBlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHNlcnZpY2UsIGJ1dCB3YXMgIiArIHRva2VuLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb24gPSBtSW5zdGFuY2Uub25DcmVhdGVTZXNzaW9uKHRva2VuLmdldElkKCkpOwotICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbCB8fCAhdG9rZW4uZ2V0SWQoKS5lcXVhbHMobVNlc3Npb24uZ2V0VG9rZW4oKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gd2l0aCBpZCAiICsgdG9rZW4uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBnb3QgIiArIG1TZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBoZXJlLgotICAgICAgICAvLyBtU2Vzc2lvbi5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrLCBtU2Vzc2lvbi5nZXRFeGVjdXRvcigpKTsKLSAgICB9Ci0KLSAgICBAVG9rZW5UeXBlIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kX2ltcGwoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lZGlhU2Vzc2lvbjJJbXBsKSBtU2Vzc2lvbi5nZXRQcm92aWRlcigpKS5nZXRTZXNzaW9uU3R1YigpLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihpbnQgcGxheWVyU3RhdGUpIHsKLSAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gbWVkaWFOb3RpZmljYXRpb24gPSBtSW5zdGFuY2Uub25VcGRhdGVOb3RpZmljYXRpb24oKTsKLSAgICAgICAgaWYgKG1lZGlhTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gocGxheWVyU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZ0ZvcmVncm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShtU3RhcnRTZWxmSW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZChtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9JRExFOgotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RvcEZvcmVncm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgcGxheWVyLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTm90aWZpY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGludCBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0KLSAgICAgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uSW1wbChNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLAotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdGlmaWNhdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbklkID0gbm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm90aWZpY2F0aW9uSWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbiBnZXROb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU4MTI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUmF0aW5nMi4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMi5TdHlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5SYXRpbmcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmF0aW5nMkltcGwgaW1wbGVtZW50cyBSYXRpbmcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmF0aW5nMiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUWUxFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi5zdHlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIudmFsdWUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSYXRpbmcyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtUmF0aW5nU3R5bGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7Ci0KLSAgICBwcml2YXRlIFJhdGluZzJJbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUsIGZsb2F0IHJhdGluZykgewotICAgICAgICBtUmF0aW5nU3R5bGUgPSByYXRpbmdTdHlsZTsKLSAgICAgICAgbVJhdGluZ1ZhbHVlID0gcmF0aW5nOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUmF0aW5nMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiUmF0aW5nMjpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgotICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJhdGluZzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUmF0aW5nMkltcGwgb3RoZXIgPSAoUmF0aW5nMkltcGwpICgoUmF0aW5nMikgb2JqKS5nZXRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlID09IG90aGVyLm1SYXRpbmdTdHlsZQotICAgICAgICAgICAgICAgICYmIG1SYXRpbmdWYWx1ZSA9PSBvdGhlci5tUmF0aW5nVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1SYXRpbmdTdHlsZSwgbVJhdGluZ1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBSYXRpbmcyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoYnVuZGxlLmdldEludChLRVlfU1RZTEUpLCBidW5kbGUuZ2V0RmxvYXQoS0VZX1ZBTFVFKSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1NUWUxFLCBtUmF0aW5nU3R5bGUpOwotICAgICAgICBidW5kbGUucHV0RmxvYXQoS0VZX1ZBTFVFLCBtUmF0aW5nVmFsdWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX2ltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSkgewotICAgICAgICBzd2l0Y2gocmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX0hFQVJUOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfVEhVTUJfVVBfRE9XTjoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX1BFUkNFTlRBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfaW1wbChib29sZWFuIGhhc0hlYXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19pbXBsKGJvb2xlYW4gdGh1bWJJc1VwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1RIVU1CX1VQX0RPV04sIHRodW1iSXNVcCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX2ltcGwoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICBmbG9hdCBtYXhSYXRpbmcgPSBSQVRJTkdfTk9UX1JBVEVEOwotICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXJSYXRpbmcgPCAwLjBmKSB8fCAoc3RhclJhdGluZyA+IG1heFJhdGluZykpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgb3V0IG9mIHJhbmdlIHN0YXItYmFzZWQgcmF0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZykuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1BFUkNFTlRBR0UsIHBlcmNlbnQpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWUgPj0gMC4wZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSGVhcnRfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgc3dpdGNoIChtUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgICAgICBpZiAobUluc3RhbmNlLmlzUmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgaWYgKChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1BFUkNFTlRBR0UpIHx8ICFtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUwZDM0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUl0ZW1TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhU2Vzc2lvblN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuSXRlbUFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU2Vzc2lvbkFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU3RhdHVzQ2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1AUmVxdWlyZXNBcGkoYXBpID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5MT0xMSVBPUCkKLXB1YmxpYyBjbGFzcyBSb3V0ZVBsYXllciBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVlCQUNLX0FDVElPTlMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRQotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTwotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQ7Ci0KLSAgICBwcml2YXRlIFJlbW90ZVBsYXliYWNrQ2xpZW50IG1DbGllbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBwcml2YXRlIFN0cmluZyBtSXRlbUlkOwotICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjayA9IG5ldyBTdGF0dXNDYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgUm91dGVQbGF5ZXIoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgbUNsaWVudCA9IG5ldyBSZW1vdGVQbGF5YmFja0NsaWVudChjb250ZXh0LCByb3V0ZSk7Ci0gICAgICAgIG1DbGllbnQuc2V0U3RhdHVzQ2FsbGJhY2sobVN0YXR1c0NhbGxiYWNrKTsKLSAgICAgICAgbUNsaWVudC5zdGFydFNlc3Npb24obnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgIG1DbGllbnQucmVzdW1lKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgbUNsaWVudC5wYXVzZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIG1DbGllbnQuc2VlayhtSXRlbUlkLCBwb3MsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIG1DbGllbnQuc3RvcChudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuVmlkZW8oRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1DbGllbnQucGxheShkc2QuZ2V0VXJpKCksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBwbGF5SW50ZXJuYWwoZHNkLmdldFVyaSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsaWVudC5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQ2xpZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheUludGVybmFsKFVyaSB1cmkpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KHVyaSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2Vzc2lvblN0YXR1cyhTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJdGVtU3RhdHVzKFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIG1JdGVtSWQgPSBpdGVtSWQ7Ci0gICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwgfHwgbUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKGl0ZW1TdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTcwYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudCBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudCI7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfUExBWUxJU1QgPSAtMTsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0lURU1TID0gLTI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBsYXlJdGVtIG1Fb3BQbGF5SXRlbSA9IG5ldyBQbGF5SXRlbShFTkRfT0ZfUExBWUxJU1QsIG51bGwpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNeVBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckNhbGxiYWNrOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotICAgIC8vIFRPRE86IENoZWNrIGlmIGhhdmluZyB0aGUgc2FtZSBpdGVtIGlzIG9rYXkgKGIvNzQwOTA3NDEpCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtU2h1ZmZsZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWFwPE1lZGlhSXRlbTIsIERhdGFTb3VyY2VEZXNjPiBtSXRlbURzZE1hcCA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVNodWZmbGVNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXlJdGVtIG1DdXJyZW50OwotCi0gICAgLy8gQ2FsbGVkIG9uIHNlc3Npb24gY2FsbGJhY2sgZXhlY3V0b3IuCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIG1wYiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXllciAhPSBtcGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsICYmIG1DdXJyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGxheUl0ZW0gewotICAgICAgICBpbnQgc2h1ZmZsZWRJZHg7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZDsKLSAgICAgICAgTWVkaWFJdGVtMiBtZWRpYUl0ZW07Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4KSB7Ci0gICAgICAgICAgICB0aGlzKHNodWZmbGVkSWR4LCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICB0aGlzLnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQodGhpcy5tZWRpYUl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSBkc2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtICE9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKS5lcXVhbHMoZHNkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25QbGF5bGlzdEFnZW50KEBOb25OdWxsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb25JbXBsLAotICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAoc2Vzc2lvbkltcGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vzc2lvbkltcGwgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uSW1wbCA9IHNlc3Npb25JbXBsOwotICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICBtUGxheWVyQ2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKCk7Ci0gICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG1QbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtUGxheWxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkQWxsKGxpc3QpOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG1NZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IGluZGV4OwotICAgICAgICAgICAgbVBsYXlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIGluIHJhbmRvbSBwb3NpdGlvbiBvZiBtU2h1ZmZsZWRMaXN0LgotICAgICAgICAgICAgICAgIHNodWZmbGVkSWR4ID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRJbnQobVNodWZmbGVkTGlzdC5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QucmVtb3ZlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlsaXN0LnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1QbGF5bGlzdC5nZXQoaW5kZXgpKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5zZXQoc2h1ZmZsZWRJZHgsIGl0ZW0pOwotICAgICAgICAgICAgbVBsYXlsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBpdGVtLmVxdWFscyhtQ3VycmVudC5tZWRpYUl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50ID0gbmV3IFBsYXlJdGVtKHNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gcHJldiA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAtMSk7Ci0gICAgICAgICAgICBpZiAocHJldiAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IHByZXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gbmV4dCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocmVwZWF0TW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgcmVwZWF0TW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgc3dpdGNoIChyZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgIT0gbnVsbCAmJiBtQ3VycmVudCAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgc2h1ZmZsZU1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgaW50IGdldEN1clNodWZmbGVkSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBoYXNWYWxpZEl0ZW0oKSA/IG1DdXJyZW50LnNodWZmbGVkSWR4IDogTk9fVkFMSURfSVRFTVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50ICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCk7Ci0gICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIGRzZCA9IG1JdGVtRHNkTWFwLmdldChpdGVtKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyID0gbURzbUhlbHBlcjsKLSAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBEbyBub3QgY2FsbCBvbkRhdGFTb3VyY2VNaXNzaW5nIHdpdGggdGhlIGxvY2sgKGIvNzQwOTA3NDEpLgotICAgICAgICAgICAgZHNkID0gaGVscGVyLm9uRGF0YVNvdXJjZU1pc3NpbmcobVNlc3Npb25JbXBsLmdldEluc3RhbmNlKCksIGl0ZW0pOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRzZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjb25zaWRlciB0byBjYWxsIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCBpbnNpZGUgKGIvNzQwOTA3NDEpCi0gICAgcHJpdmF0ZSBQbGF5SXRlbSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChpbnQgY3VyU2h1ZmZsZWRJZHgsIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgaW50IHNpemUgPSBtUGxheWxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPT0gRU5EX09GX1BMQVlMSVNUKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IChkaXJlY3Rpb24gPiAwKSA/IC0xIDogc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggKz0gZGlyZWN0aW9uOwotICAgICAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4IDwgMCB8fCBjdXJTaHVmZmxlZElkeCA+PSBtUGxheWxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09IHNpemUgLSAxKSA/IG51bGwgOiBtRW9wUGxheUl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSBjdXJTaHVmZmxlZElkeCA8IDAgPyBtUGxheWxpc3Quc2l6ZSgpIC0gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtU2h1ZmZsZWRMaXN0LmdldChjdXJTaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5SXRlbShjdXJTaHVmZmxlZElkeCwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCkgewotICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtQ3VycmVudC5tZWRpYUl0ZW0pOwotICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgLy8gQWRkZWQgYW4gaXRlbS4KLSAgICAgICAgICAgIG1DdXJyZW50LnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnQuc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobVNodWZmbGVkTGlzdC5zaXplKCkgLSAxLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50Lm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KG1DdXJyZW50LnNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIGlmIChyZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1DdXJyZW50Lm1lZGlhSXRlbSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCkgewotICAgICAgICBpZiAobUN1cnJlbnQgPT0gbnVsbCB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBsYXllci5nZXRDdXJyZW50RGF0YVNvdXJjZSgpICE9IG1DdXJyZW50LmRzZCkgewotICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG1DdXJyZW50LmRzZCk7Ci0gICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KG1SZXBlYXRNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IENhbGwgc2V0TmV4dERhdGFTb3VyY2UgKGIvNzQwOTA3NDEpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKSB7Ci0gICAgICAgIG1TaHVmZmxlZExpc3QuY2xlYXIoKTsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5hZGRBbGwobVBsYXlsaXN0KTsKLSAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTAotICAgICAgICAgICAgICAgIHx8IG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKG1TaHVmZmxlZExpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2xhbXBzIHZhbHVlIHRvIFswLCBzaXplXQotICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBzaXplKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodmFsdWUgPiBzaXplKSA/IHNpemUgOiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2Y4YzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Ub2tlbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi51aWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4ucGFja2FnZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlcnZpY2VfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fQklOREVSID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2Vzc2lvbl9iaW5kZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgIHByaXZhdGUgZmluYWwgQFRva2VuVHlwZSBpbnQgbVR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIGxlZ2FjeSBzdXBwb3J0IChpLmUuIGJyb3dzZXIgY2FuIHRyeSBjb25uZWN0aW5nIHRvIGFueSBicm93c2VyCi0gICAgICogc2VydmljZSBpZiBpdCBrbm93cyB0aGUgc2VydmljZSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4ySW1wbChDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHVpZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICh1aWQgPCAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVpZCA9IG1hbmFnZXIuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVWlkID0gdWlkOwotCi0gICAgICAgIC8vIEluZmVyIGlkIGFuZCB0eXBlIGZyb20gcGFja2FnZSBuYW1lIGFuZCBzZXJ2aWNlIG5hbWUKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgbXVsdGktdXNlci4KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggc2Vzc2lvbiBzZXJ2aWNlCi0gICAgICAgICAgICBtSWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIG1UeXBlID0gVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgZG9lc24ndCBpbXBsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2Ugbm9yIGxpYnJhcnkgc2VydmljZS4gVXNlIHNlcnZpY2UncyBmdWxsIG5hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgU2Vzc2lvblRva2VuMkltcGwoaW50IHVpZCwgaW50IHR5cGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIHNhbml0eSBjaGVjayAoYi83Mzg2Mzg2NSkKLSAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uVG9rZW4yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShQYWNrYWdlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc2VydmljZUludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlSW50ZXJmYWNlKTsKLSAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgLy8gVXNlIHF1ZXJ5SW50ZW50U2VydmljZXMgdG8gZmluZCBzZXJ2aWNlcyB3aXRoIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLgotICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHJlc29sdmVTZXJ2aWNlIHdpdGggaW50ZW50IHNwZWNpZmllZCBjbGFzcyBuYW1lLCBiZWNhdXNlIHJlc29sdmVTZXJ2aWNlCi0gICAgICAgIC8vIGlnbm9yZXMgYWN0aW9ucyBpZiBJbnRlbnQuc2V0Q2xhc3NOYW1lKCkgaXMgc3BlY2lmaWVkLgotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBsaXN0ID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKAotICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm5hbWUsIHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbklkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfTUVUQV9EQVRBLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1VaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZF9pbXAoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1aWQgPSBidW5kbGUuZ2V0SW50KEtFWV9VSUQpOwotICAgICAgICBmaW5hbCBAVG9rZW5UeXBlIGludCB0eXBlID0gYnVuZGxlLmdldEludChLRVlfVFlQRSwgLTEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgICAgIGZpbmFsIElCaW5kZXIgc2Vzc2lvbkJpbmRlciA9IGJ1bmRsZS5nZXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT046Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlc3Npb25CaW5kZXIgZm9yIHNlc3Npb24sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIHNlc3Npb25CaW5kZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OX1NFUlZJQ0U6Ci0gICAgICAgICAgICBjYXNlIFRZUEVfTElCUkFSWV9TRVJWSUNFOgotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBzZXJ2aWNlIG5lZWRzIHNlcnZpY2UgbmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSB8fCBpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgbm9yIElEIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwodWlkLCB0eXBlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIGlkLAotICAgICAgICAgICAgICAgIHNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2Vzc2lvbkJpbmRlcikgOiBudWxsKQotICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVUlELCBtVWlkKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FLCBtUGFja2FnZU5hbWUpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUsIG1TZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9UWVBFLCBtVHlwZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyICE9IG51bGwgPyBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpIDogbnVsbCk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgcmV0dXJuIG1UeXBlCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtVWlkCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtUGFja2FnZU5hbWUuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobUlkLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1TZXJ2aWNlTmFtZSAhPSBudWxsID8gbVNlcnZpY2VOYW1lLmhhc2hDb2RlKCkgOiAwKSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25Ub2tlbjIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgb3RoZXIgPSBmcm9tKChTZXNzaW9uVG9rZW4yKSBvYmopOwotICAgICAgICByZXR1cm4gbVVpZCA9PSBvdGhlci5tVWlkCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1TZXJ2aWNlTmFtZSwgb3RoZXIubVNlcnZpY2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUlkLCBvdGhlci5tSWQpCi0gICAgICAgICAgICAgICAgJiYgbVR5cGUgPT0gb3RoZXIubVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb25Ub2tlbiB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiIGlkPSIgKyBtSWQgKyAiIHR5cGU9IiArIG1UeXBlCi0gICAgICAgICAgICAgICAgKyAiIHNlcnZpY2U9IiArIG1TZXJ2aWNlTmFtZSArICIgYmluZGVyPSIgKyBtU2Vzc2lvbkJpbmRlciArICJ9IjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2Vzc2lvblRva2VuMkltcGwgZnJvbShTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiAoKFNlc3Npb25Ub2tlbjJJbXBsKSB0b2tlbi5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIyZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9SRUxBVElWRTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVm9sdW1lUHJvdmlkZXIySW1wbCBpbXBsZW1lbnRzIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZvbHVtZVByb3ZpZGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRyb2xUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0KLSAgICBwcml2YXRlIGludCBtQ3VycmVudFZvbHVtZTsKLSAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJJbXBsKFZvbHVtZVByb3ZpZGVyMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlcjIuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLCBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICBpZiAoY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfRklYRUQgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgY29udHJvbFR5cGUgIiArIGNvbnRyb2xUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4Vm9sdW1lIDwgMCB8fCBjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lID4gbWF4Vm9sdW1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gbWF4Vm9sdW1lIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1Db250cm9sVHlwZSA9IGNvbnRyb2xUeXBlOwotICAgICAgICBtTWF4Vm9sdW1lID0gbWF4Vm9sdW1lOwotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDb250cm9sVHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFZvbHVtZV9pbXBsKGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOwotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZUNoYW5nZWQobUluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHZvbHVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25Wb2x1bWVDaGFuZ2VkKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2VlYzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlQXBwZWFyYW5jZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIHNpbmNlIFAKLXB1YmxpYyBjbGFzcyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIgZXh0ZW5kcyBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIENlYTYwOENDV2lkZ2V0IG1DQ1dpZGdldDsKLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfTUlNRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgcmV0dXJuIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgIGlmIChNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgaWYgKG1DQ1dpZGdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNDV2lkZ2V0ID0gbmV3IENlYTYwOENDV2lkZ2V0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2VhNjA4Q2FwdGlvblRyYWNrKG1DQ1dpZGdldCwgZm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWF0Y2hpbmcgZm9ybWF0OiAiICsgZm9ybWF0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KLQotY2xhc3MgQ2VhNjA4Q2FwdGlvblRyYWNrIGV4dGVuZHMgU3VidGl0bGVUcmFjayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1BhcnNlciBtQ0NQYXJzZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1dpZGdldCBtUmVuZGVyaW5nV2lkZ2V0OwotCi0gICAgQ2VhNjA4Q2FwdGlvblRyYWNrKENlYTYwOENDV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCwgTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN1cGVyKGZvcm1hdCk7Ci0KLSAgICAgICAgbVJlbmRlcmluZ1dpZGdldCA9IHJlbmRlcmluZ1dpZGdldDsKLSAgICAgICAgbUNDUGFyc2VyID0gbmV3IENlYTYwOENDUGFyc2VyKG1SZW5kZXJpbmdXaWRnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpIHsKLSAgICAgICAgbUNDUGFyc2VyLnBhcnNlKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgewotICAgICAgICByZXR1cm4gbVJlbmRlcmluZ1dpZGdldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpIHsKLSAgICAgICAgLy8gT3ZlcnJpZGluZyB3aXRoIE5PLU9QLCBDQyByZW5kZXJpbmcgYnktcGFzc2VzIHRoaXMKLSAgICB9Ci19Ci0KLS8qKgotICogQWJzdHJhY3Qgd2lkZ2V0IGNsYXNzIHRvIHJlbmRlciBhIGNsb3NlZCBjYXB0aW9uIHRyYWNrLgotICovCi1hYnN0cmFjdCBjbGFzcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQgewotCi0gICAgaW50ZXJmYWNlIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKTsKLSAgICAgICAgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgc2NhbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhcHRpb25TdHlsZSBERUZBVUxUX0NBUFRJT05fU1RZTEUgPSBDYXB0aW9uU3R5bGUuREVGQVVMVDsKLQotICAgIC8qKiBDYXB0aW9uaW5nIG1hbmFnZXIsIHVzZWQgdG8gb2J0YWluIGFuZCB0cmFjayBjYXB0aW9uIHByb3BlcnRpZXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nTWFuYWdlciBtTWFuYWdlcjsKLQotICAgIC8qKiBDdXJyZW50IGNhcHRpb24gc3R5bGUuICovCi0gICAgcHJvdGVjdGVkIENhcHRpb25TdHlsZSBtQ2FwdGlvblN0eWxlOwotCi0gICAgLyoqIENhbGxiYWNrIGZvciByZW5kZXJpbmcgY2hhbmdlcy4gKi8KLSAgICBwcm90ZWN0ZWQgT25DaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgLyoqIENvbmNyZXRlIGxheW91dCBvZiBDQy4gKi8KLSAgICBwcm90ZWN0ZWQgQ2xvc2VkQ2FwdGlvbkxheW91dCBtQ2xvc2VkQ2FwdGlvbkxheW91dDsKLQotICAgIC8qKiBXaGV0aGVyIGEgY2FwdGlvbiBzdHlsZSBjaGFuZ2UgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotCi0gICAgICAgIC8vIENhbm5vdCByZW5kZXIgdGV4dCBvdmVyIHZpZGVvIHdoZW4gbGF5ZXIgdHlwZSBpcyBoYXJkd2FyZS4KLSAgICAgICAgc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9TT0ZUV0FSRSwgbnVsbCk7Ci0KLSAgICAgICAgbU1hbmFnZXIgPSAoQ2FwdGlvbmluZ01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7Ci0gICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZShtTWFuYWdlci5nZXRVc2VyU3R5bGUoKSk7Ci0KLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQgPSBjcmVhdGVDYXB0aW9uTGF5b3V0KGNvbnRleHQpOwotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShtTWFuYWdlci5nZXRGb250U2NhbGUoKSk7Ci0gICAgICAgIGFkZFZpZXcoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0KLSAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotCi0gICAgICAgIG1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgbGF5b3V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLmxheW91dChsLCB0LCByLCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW5hZ2VzIHdoZXRoZXIgdGhpcyByZW5kZXJlciBpcyBsaXN0ZW5pbmcgZm9yIGNhcHRpb24gc3R5bGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0xpc3RlbmVyID0gbmV3IENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlclN0eWxlQ2hhbmdlZChDYXB0aW9uU3R5bGUgdXNlclN0eWxlKSB7Ci0gICAgICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUodXNlclN0eWxlKTsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZvbnRTY2FsZUNoYW5nZWQoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUoZm9udFNjYWxlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNMaXN0ZW5lciA9IGlzQXR0YWNoZWRUb1dpbmRvdygpICYmIGdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgIGlmIChtSGFzQ2hhbmdlTGlzdGVuZXIgIT0gbmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgbUhhc0NoYW5nZUxpc3RlbmVyID0gbmVlZHNMaXN0ZW5lcjsKLQotICAgICAgICAgICAgaWYgKG5lZWRzTGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBDQ1BhcnNlciBwcm9jZXNzZXMgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbiBkYXRhLgotICoKLSAqIEl0IGNhbGxzIGJhY2sgaW50byBPbkRpc3BsYXlDaGFuZ2VkTGlzdGVuZXIgdXBvbgotICogZGlzcGxheSBjaGFuZ2Ugd2l0aCBzdHlsZWQgdGV4dCBmb3IgcmVuZGVyaW5nLgotICoKLSAqLwotY2xhc3MgQ2VhNjA4Q0NQYXJzZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTFMgPSAzMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2VhNjA4Q0NQYXJzZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOwotCi0gICAgLy8gRUlBLUNFQS02MDg6IFRhYmxlIDcwIC0gQ29udHJvbCBDb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQ0wgPSAweDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUyAgPSAweDIxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT0YgPSAweDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT04gPSAweDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVIgPSAweDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTIgPSAweDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTMgPSAweDI2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTQgPSAweDI3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT04gPSAweDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSREMgPSAweDI5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUiAgPSAweDJhOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVEQgPSAweDJiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRE0gPSAweDJjOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiAgPSAweDJkOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTk0gPSAweDJlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0MgPSAweDJmOwotCi0gICAgLy8gVHJhbnNwYXJlbnQgU3BhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRTID0gJ1x1MDBBMCc7Ci0KLSAgICAvLyBDYXB0aW9uaW5nIE1vZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5LTk9XTiA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFJTlRfT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1JPTExfVVAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BPUF9PTiA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVEVYVCA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGludCBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgcHJpdmF0ZSBpbnQgbVJvbGxVcFNpemUgPSA0OwotICAgIHByaXZhdGUgaW50IG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotCi0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbU5vbkRpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKLSAgICBwcml2YXRlIENDTWVtb3J5IG1UZXh0TWVtID0gbmV3IENDTWVtb3J5KCk7Ci0KLSAgICBDZWE2MDhDQ1BhcnNlcihEaXNwbGF5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gQ0NEYXRhLmZyb21CeXRlQXJyYXkoZGF0YSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2NEYXRhW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlQ3RybENvZGUoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVUYWJPZmZzZXRzKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlUEFDQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZU1pZFJvd0NvZGUoY2NEYXRhW2ldKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKGNjRGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgRGlzcGxheUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cyk7Ci0gICAgICAgIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IGdldE1lbW9yeSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBDQyBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBmb3IgY3VycmVudCBtb2RlCi0gICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgY2FzZSBNT0RFX1BPUF9PTjoKLSAgICAgICAgICAgIHJldHVybiBtTm9uRGlzcGxheTsKLSAgICAgICAgY2FzZSBNT0RFX1RFWFQ6Ci0gICAgICAgICAgICAvLyBUT0RPKGNoeik6IHN1cHBvcnQgb25seSBjYXB0aW9uIG1vZGUgZm9yIG5vdywKLSAgICAgICAgICAgIC8vIGluIHRleHQgbW9kZSwgZHVtcCBldmVyeXRoaW5nIHRvIHRleHQgbWVtLgotICAgICAgICAgICAgcmV0dXJuIG1UZXh0TWVtOwotICAgICAgICBjYXNlIE1PREVfUEFJTlRfT046Ci0gICAgICAgIGNhc2UgTU9ERV9ST0xMX1VQOgotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTG9nLncoVEFHLCAidW5yZWNvZ2luaXplZCBtb2RlOiAiICsgbU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRGlzcGxheWFibGVDaGFycyhDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGlmICghY2NEYXRhLmlzRGlzcGxheWFibGVDaGFyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4dGVuZGVkIGNoYXIgaW5jbHVkZXMgMSBhdXRvbWF0aWMgYmFja3NwYWNlCi0gICAgICAgIGlmIChjY0RhdGEuaXNFeHRlbmRlZENoYXIoKSkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldE1lbW9yeSgpLndyaXRlVGV4dChjY0RhdGEuZ2V0RGlzcGxheVRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUEFJTlRfT04gfHwgbU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlTWlkUm93Q29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFN0eWxlQ29kZSBtID0gY2NEYXRhLmdldE1pZFJvdygpOwotICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZU1pZFJvd0NvZGUobSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBBQ0NvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBQQUMgcGFjID0gY2NEYXRhLmdldFBBQygpOwotCi0gICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLm1vdmVCYXNlbGluZVRvKHBhYy5nZXRSb3coKSwgbVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVQQUMocGFjKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUYWJPZmZzZXRzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaW50IHRhYnMgPSBjY0RhdGEuZ2V0VGFiT2Zmc2V0KCk7Ci0KLSAgICAgICAgaWYgKHRhYnMgPiAwKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS50YWIodGFicyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ3RybENvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgY3RybENvZGUgPSBjY0RhdGEuZ2V0Q3RybENvZGUoKTsKLQotICAgICAgICBpZiAobVByZXZDdHJsQ29kZSAhPSBJTlZBTElEICYmIG1QcmV2Q3RybENvZGUgPT0gY3RybENvZGUpIHsKLSAgICAgICAgICAgIC8vIGRpc2NhcmQgZG91YmxlIGN0cmwgY29kZXMgKGJ1dCBpZiB0aGVyZSdzIGEgM3JkIG9uZSwgd2Ugc3RpbGwgdGFrZSB0aGF0KQotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChjdHJsQ29kZSkgewotICAgICAgICBjYXNlIFJDTDoKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUzoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERVI6Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5kZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJVMjoKLSAgICAgICAgY2FzZSBSVTM6Ci0gICAgICAgIGNhc2UgUlU0OgotICAgICAgICAgICAgbVJvbGxVcFNpemUgPSAoY3RybENvZGUgLSAweDIzKTsKLSAgICAgICAgICAgIC8vIGVyYXNlIG1lbW9yeSBpZiBjdXJyZW50bHkgaW4gb3RoZXIgc3R5bGUKLSAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWxlY3Qgcm9sbC11cCBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1JPTExfVVA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT046Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJGbGFzaCBPbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkRDOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBhaW50LW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUjoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgbVRleHRNZW0uZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJURDoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRURNOgotICAgICAgICAgICAgLy8gZXJhc2UgZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5yb2xsVXAobVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5jcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVOTToKLSAgICAgICAgICAgIC8vIGVyYXNlIG5vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVPQzoKLSAgICAgICAgICAgIC8vIHN3YXAgZGlzcGxheS9ub24tZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIHN3YXBNZW1vcnkoKTsKLSAgICAgICAgICAgIC8vIHN3aXRjaCB0byBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlZBTElEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJldkN0cmxDb2RlID0gY3RybENvZGU7Ci0KLSAgICAgICAgLy8gaGFuZGxlZAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlID0gbUxpc3RlbmVyLmdldENhcHRpb25TdHlsZSgpOwotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheUNoYW5nZWQobURpc3BsYXkuZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzd2FwTWVtb3J5KCkgewotICAgICAgICBDQ01lbW9yeSB0ZW1wID0gbURpc3BsYXk7Ci0gICAgICAgIG1EaXNwbGF5ID0gbU5vbkRpc3BsYXk7Ci0gICAgICAgIG1Ob25EaXNwbGF5ID0gdGVtcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZUNvZGUgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQkxVRSA9IDI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ1lBTiA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gNDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ZRUxMT1cgPSA1OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX01BR0VOVEEgPSA2OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0lOVkFMSUQgPSA3OwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSVRBTElDUyAgID0gMHgwMDAwMDAwMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9VTkRFUkxJTkUgPSAweDAwMDAwMDAyOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ29sb3JNYXAgPSB7Ci0gICAgICAgICAgICAiV0hJVEUiLCAiR1JFRU4iLCAiQkxVRSIsICJDWUFOIiwgIlJFRCIsICJZRUxMT1ciLCAiTUFHRU5UQSIsICJJTlZBTElEIgotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIGludCBtU3R5bGU7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sb3I7Ci0KLSAgICAgICAgc3RhdGljIFN0eWxlQ29kZSBmcm9tQnl0ZShieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKLSAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVDb2RlKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUoaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1TdHlsZSA9IHN0eWxlOwotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSXRhbGljcygpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNVbmRlcmxpbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQoInsiKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQobUNvbG9yTWFwW21Db2xvcl0pOwotICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBJVEFMSUNTIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgVU5ERVJMSU5FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCJ9Iik7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBBQyBleHRlbmRzIFN0eWxlQ29kZSB7Ci0gICAgICAgIGZpbmFsIGludCBtUm93OwotICAgICAgICBmaW5hbCBpbnQgbUNvbDsKLQotICAgICAgICBzdGF0aWMgUEFDIGZyb21CeXRlcyhieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnRbXSByb3dUYWJsZSA9IHsxMSwgMSwgMywgMTIsIDE0LCA1LCA3LCA5fTsKLSAgICAgICAgICAgIGludCByb3cgPSByb3dUYWJsZVtkYXRhMSAmIDB4MDddICsgKChkYXRhMiAmIDB4MjApID4+IDUpOwotICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MTApICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpbmRlbnQgY29kZQotICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCBpbmRlbnQgKiA0LCBzdHlsZSwgQ09MT1JfV0hJVEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzdHlsZSBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIC0xLCBzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUEFDKGludCByb3csIGludCBjb2wsIGludCBzdHlsZSwgaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgbVJvdyA9IHJvdzsKLSAgICAgICAgICAgIG1Db2wgPSBjb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSW5kZW50UEFDKCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ29sID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFJvdygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm93OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyVkLCAlZH0sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbVJvdywgbUNvbCwgc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXRhYmxlIHZlcnNpb24gb2YgQmFja2dyb3VuZFNwYW4gdG8gZmFjaWxpdGF0ZSB0ZXh0IHJlbmRlcmluZyB3aXRoIGVkZ2Ugc3R5bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBDaGFyYWN0ZXJTdHlsZQotICAgICAgICAgICAgaW1wbGVtZW50cyBVcGRhdGVBcHBlYXJhbmNlIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgICAgIHB1YmxpYyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKFRleHRQYWludCBkcykgewotICAgICAgICAgICAgZHMuYmdDb2xvciA9IG1Db2xvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENDTGluZUJ1aWxkZXIga2VlcHMgdHJhY2sgb2YgZGlzcGxheWFibGUgY2hhcnMsIGFzIHdlbGwgYXMKLSAgICAgKiBNaWRSb3cgc3R5bGVzIGFuZCBQQUNzLCBmb3IgYSBzaW5nbGUgbGluZSBvZiBDQyBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBJdCBnZW5lcmF0ZXMgc3R5bGVkIHRleHQgdmlhIGdldFN0eWxlZFRleHQoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtRGlzcGxheUNoYXJzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1NaWRSb3dTdHlsZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbVBBQ1N0eWxlczsKLQotICAgICAgICBDQ0xpbmVCdWlsZGVyKFN0cmluZyBzdHIpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07Ci0gICAgICAgICAgICBtUEFDU3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0TWlkUm93QXQoaW50IGluZGV4LCBTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsICcgJyk7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBBQ0F0KGludCBpbmRleCwgUEFDIHBhYykgewotICAgICAgICAgICAgbVBBQ1N0eWxlc1tpbmRleF0gPSBwYWM7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmNoYXJBdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGx5U3R5bGVTcGFuKAotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCwKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAocy5pc0l0YWxpY3MoKSkgewotICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHlsZVNwYW4oYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZS5JVEFMSUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy5pc1VuZGVybGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVuZGVybGluZVNwYW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG1EaXNwbGF5Q2hhcnMpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTEsIG5leHQgPSAwOwotICAgICAgICAgICAgaW50IHN0eWxlU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIFN0eWxlQ29kZSBjdXJTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAobmV4dCA8IG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgbmV3U3R5bGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtTWlkUm93U3R5bGVzW25leHRdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgbWlkLXJvdyBzdHlsZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtTWlkUm93U3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBBQ1N0eWxlc1tuZXh0XSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHlsZVN0YXJ0IDwgMCB8fCBzdGFydCA8IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFBBQyBzdHlsZSBjaGFuZ2UsIG9ubHkgaWY6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIG5vIHN0eWxlIHNldCwgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc3R5bGUgc2V0LCBidXQgcHJldiBjaGFyIGlzIG5vbmUtZGlzcGxheWFibGUKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtUEFDU3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJTdHlsZSA9IG5ld1N0eWxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwICYmIHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIG5ld1N0eWxlLCBzdHlsZVN0YXJ0LCBuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHlsZVN0YXJ0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCkgIT0gVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZFN0YXJ0ID0gbURpc3BsYXlDaGFycy5jaGFyQXQoc3RhcnQpID09ICcgJyA/IHN0YXJ0IDogc3RhcnQgLSAxOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRFbmQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0IC0gMSkgPT0gJyAnID8gbmV4dCA6IG5leHQgKyAxOwotICAgICAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkU3RhcnQsIGV4cGFuZGVkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBjdXJTdHlsZSwgc3R5bGVTdGFydCwgZXhwYW5kZWRFbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5leHQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0eWxlZFRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENDTWVtb3J5IG1vZGVscyBhIGNvbnNvbGUtc3R5bGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ01lbW9yeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CbGFua0xpbmU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQnVpbGRlcltdIG1MaW5lcyA9IG5ldyBDQ0xpbmVCdWlsZGVyW01BWF9ST1dTICsgMl07Ci0gICAgICAgIHByaXZhdGUgaW50IG1Sb3c7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db2w7Ci0KLSAgICAgICAgQ0NNZW1vcnkoKSB7Ci0gICAgICAgICAgICBjaGFyW10gYmxhbmsgPSBuZXcgY2hhcltNQVhfQ09MUyArIDJdOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxhbmssIFRTKTsKLSAgICAgICAgICAgIG1CbGFua0xpbmUgPSBuZXcgU3RyaW5nKGJsYW5rKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXJhc2UoKSB7Ci0gICAgICAgICAgICAvLyBlcmFzZSBhbGwgbGluZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3cgPSBNQVhfUk9XUzsKLSAgICAgICAgICAgIG1Db2wgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkZXIoKSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2w7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddLmNoYXJBdChpKSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1Db2w7IGogPCBtTGluZXNbbVJvd10ubGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tqXS5zZXRDaGFyQXQoaiwgVFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRhYihpbnQgdGFicykgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBicygpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgtMSk7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KG1Db2wsIFRTKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvbCA9PSBNQVhfQ09MUyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyByZWNvbW1lbmRhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3Vyc29yIHdhcyBhdCBjb2wgMzIsIG1vdmUgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gY29sIDMxIGFuZCBlcmFzZSBib3RoIGNvbCAzMSYzMgotICAgICAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KE1BWF9DT0xTLCBUUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcigpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhtUm93ICsgMSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJvbGxVcChpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1Sb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gbVJvdyAtIHdpbmRvd1NpemUgKyAxOwotICAgICAgICAgICAgaWYgKHN0YXJ0Um93IDwgMSkgewotICAgICAgICAgICAgICAgIHN0YXJ0Um93ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0Um93OyBpIDwgbVJvdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbUxpbmVzW2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IG1Sb3c7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhciBiYXNlIHJvdwotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvbCAxLCBpbiBjYXNlIFBBQyBpcyBub3Qgc2VudAotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldENoYXJBdChtQ29sLCB0ZXh0LmNoYXJBdChpKSk7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU1pZFJvd0NvZGUoU3R5bGVDb2RlIG0pIHsKLSAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0TWlkUm93QXQobUNvbCwgbSk7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUEFDKFBBQyBwYWMpIHsKLSAgICAgICAgICAgIGlmIChwYWMuaXNJbmRlbnRQQUMoKSkgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIHBhYy5nZXRDb2woKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRQQUNBdChtQ29sLCBwYWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFNwYW5uYWJsZVN0cmluZ0J1aWxkZXI+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX1JPV1MpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIHJvd3MuYWRkKG1MaW5lc1tpXSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tpXS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkgOiBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3dzLnRvQXJyYXkobmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbTUFYX1JPV1NdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgeCwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgcmV0dXJuIHggPCBtaW4gPyBtaW4gOiAoeCA+IG1heCA/IG1heCA6IHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUbyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAoY29sLCAxLCBNQVhfQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yQnlDb2woaW50IGNvbCkgewotICAgICAgICAgICAgbUNvbCA9IGNsYW1wKG1Db2wgKyBjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFzZWxpbmVUbyhpbnQgYmFzZVJvdywgaW50IHdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgIGlmIChtUm93ID09IGJhc2VSb3cpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2luZG93U2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgICAgICBpZiAoYmFzZVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gYmFzZVJvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBtUm93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgbVJvdykgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBib3R0b20gdG8gdG9wIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGFjdHVhbFdpbmRvd1NpemUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0b3AgdG8gYm90dG9tIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxXaW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xlYXIgcmVzdCBvZiB0aGUgcm93cwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBiYXNlUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IGJhc2VSb3cgKyAxOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ0NMaW5lQnVpbGRlciBnZXRMaW5lQnVmZmVyKGludCByb3cpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbcm93XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW3Jvd10gPSBuZXcgQ0NMaW5lQnVpbGRlcihtQmxhbmtMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtTGluZXNbcm93XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NEYXRhIHBhcnNlcyB0aGUgcmF3IENDIGJ5dGUgcGFpciBpbnRvIGRpc3BsYXlhYmxlIGNoYXJzLAotICAgICAqIG1pc2MgY29udHJvbCBjb2RlcywgTWlkLVJvdyBvciBQcmVhbWJsZSBBZGRyZXNzIENvZGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDRGF0YSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ3RybENvZGVNYXAgPSB7Ci0gICAgICAgICAgICAiUkNMIiwgIkJTIiAsICJBT0YiLCAiQU9OIiwKLSAgICAgICAgICAgICJERVIiLCAiUlUyIiwgIlJVMyIsICJSVTQiLAotICAgICAgICAgICAgIkZPTiIsICJSREMiLCAiVFIiICwgIlJURCIsCi0gICAgICAgICAgICAiRURNIiwgIkNSIiAsICJFTk0iLCAiRU9DIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BlY2lhbENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAiXHUwMEFFIiwKLSAgICAgICAgICAgICJcdTAwQjAiLAotICAgICAgICAgICAgIlx1MDBCRCIsCi0gICAgICAgICAgICAiXHUwMEJGIiwKLSAgICAgICAgICAgICJcdTIxMjIiLAotICAgICAgICAgICAgIlx1MDBBMiIsCi0gICAgICAgICAgICAiXHUwMEEzIiwKLSAgICAgICAgICAgICJcdTI2NkEiLCAvLyBFaWdodGggbm90ZQotICAgICAgICAgICAgIlx1MDBFMCIsCi0gICAgICAgICAgICAiXHUwMEEwIiwgLy8gVHJhbnNwYXJlbnQgc3BhY2UKLSAgICAgICAgICAgICJcdTAwRTgiLAotICAgICAgICAgICAgIlx1MDBFMiIsCi0gICAgICAgICAgICAiXHUwMEVBIiwKLSAgICAgICAgICAgICJcdTAwRUUiLAotICAgICAgICAgICAgIlx1MDBGNCIsCi0gICAgICAgICAgICAiXHUwMEZCIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BhbmlzaENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAvLyBTcGFuaXNoIGFuZCBtaXNjIGNoYXJzCi0gICAgICAgICAgICAiXHUwMEMxIiwgLy8gQQotICAgICAgICAgICAgIlx1MDBDOSIsIC8vIEUKLSAgICAgICAgICAgICJcdTAwRDMiLCAvLyBJCi0gICAgICAgICAgICAiXHUwMERBIiwgLy8gTwotICAgICAgICAgICAgIlx1MDBEQyIsIC8vIFUKLSAgICAgICAgICAgICJcdTAwRkMiLCAvLyB1Ci0gICAgICAgICAgICAiXHUyMDE4IiwgLy8gb3BlbmluZyBzaW5nbGUgcXVvdGUKLSAgICAgICAgICAgICJcdTAwQTEiLCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCi0gICAgICAgICAgICAiKiIsCi0gICAgICAgICAgICAiJyIsCi0gICAgICAgICAgICAiXHUyMDE0IiwgLy8gZW0gZGFzaAotICAgICAgICAgICAgIlx1MDBBOSIsIC8vIENvcHlyaWdodAotICAgICAgICAgICAgIlx1MjEyMCIsIC8vIFNlcnZpY2VtYXJrCi0gICAgICAgICAgICAiXHUyMDIyIiwgLy8gcm91bmQgYnVsbGV0Ci0gICAgICAgICAgICAiXHUyMDFDIiwgLy8gb3BlbmluZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgICJcdTIwMUQiLCAvLyBjbG9zaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgLy8gRnJlbmNoCi0gICAgICAgICAgICAiXHUwMEMwIiwKLSAgICAgICAgICAgICJcdTAwQzIiLAotICAgICAgICAgICAgIlx1MDBDNyIsCi0gICAgICAgICAgICAiXHUwMEM4IiwKLSAgICAgICAgICAgICJcdTAwQ0EiLAotICAgICAgICAgICAgIlx1MDBDQiIsCi0gICAgICAgICAgICAiXHUwMEVCIiwKLSAgICAgICAgICAgICJcdTAwQ0UiLAotICAgICAgICAgICAgIlx1MDBDRiIsCi0gICAgICAgICAgICAiXHUwMEVGIiwKLSAgICAgICAgICAgICJcdTAwRDQiLAotICAgICAgICAgICAgIlx1MDBEOSIsCi0gICAgICAgICAgICAiXHUwMEY5IiwKLSAgICAgICAgICAgICJcdTAwREIiLAotICAgICAgICAgICAgIlx1MDBBQiIsCi0gICAgICAgICAgICAiXHUwMEJCIgotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Qcm90dWd1ZXNlQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFBvcnR1Z3Vlc2UKLSAgICAgICAgICAgICJcdTAwQzMiLAotICAgICAgICAgICAgIlx1MDBFMyIsCi0gICAgICAgICAgICAiXHUwMENEIiwKLSAgICAgICAgICAgICJcdTAwQ0MiLAotICAgICAgICAgICAgIlx1MDBFQyIsCi0gICAgICAgICAgICAiXHUwMEQyIiwKLSAgICAgICAgICAgICJcdTAwRjIiLAotICAgICAgICAgICAgIlx1MDBENSIsCi0gICAgICAgICAgICAiXHUwMEY1IiwKLSAgICAgICAgICAgICJ7IiwKLSAgICAgICAgICAgICJ9IiwKLSAgICAgICAgICAgICJcXCIsCi0gICAgICAgICAgICAiXiIsCi0gICAgICAgICAgICAiXyIsCi0gICAgICAgICAgICAifCIsCi0gICAgICAgICAgICAifiIsCi0gICAgICAgICAgICAvLyBHZXJtYW4gYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzQiLAotICAgICAgICAgICAgIlx1MDBFNCIsCi0gICAgICAgICAgICAiXHUwMEQ2IiwKLSAgICAgICAgICAgICJcdTAwRjYiLAotICAgICAgICAgICAgIlx1MDBERiIsCi0gICAgICAgICAgICAiXHUwMEE1IiwKLSAgICAgICAgICAgICJcdTAwQTQiLAotICAgICAgICAgICAgIlx1MjUwMiIsIC8vIHZlcnRpY2FsIGJhcgotICAgICAgICAgICAgIlx1MDBDNSIsCi0gICAgICAgICAgICAiXHUwMEU1IiwKLSAgICAgICAgICAgICJcdTAwRDgiLAotICAgICAgICAgICAgIlx1MDBGOCIsCi0gICAgICAgICAgICAiXHUyNTBDIiwgLy8gdG9wLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTEwIiwgLy8gdG9wLXJpZ2h0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxNCIsIC8vIGxvd2VyLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE4IiwgLy8gbG93ZXItcmlnaHQgY29ybmVyCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIENDRGF0YVtdIGZyb21CeXRlQXJyYXkoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IG5ldyBDQ0RhdGFbZGF0YS5sZW5ndGggLyAzXTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjY0RhdGFbaV0gPSBuZXcgQ0NEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogM10sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMl0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2NEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0NEYXRhKGJ5dGUgdHlwZSwgYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgbURhdGExID0gZGF0YTE7Ci0gICAgICAgICAgICBtRGF0YTIgPSBkYXRhMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDdHJsQ29kZSgpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTQgfHwgbURhdGExID09IDB4MWMpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgU3R5bGVDb2RlIGdldE1pZFJvdygpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCBNaWQtcm93IGNvZGVzLCBpZ25vcmUKLSAgICAgICAgICAgIC8vIG9wdGlvbmFsIGJhY2tncm91bmQvZm9yZWdyb3VuZCBtaWQtcm93IGNvZGVzCi0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZUNvZGUuZnJvbUJ5dGUobURhdGEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUEFDIGdldFBBQygpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExICYgMHg3MCkgPT0gMHgxMAotICAgICAgICAgICAgICAgICAgICAmJiAobURhdGEyICYgMHg0MCkgPT0gMHg0MAotICAgICAgICAgICAgICAgICAgICAmJiAoKG1EYXRhMSAmIDB4MDcpICE9IDAgfHwgKG1EYXRhMiAmIDB4MjApID09IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBQy5mcm9tQnl0ZXMobURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VGFiT2Zmc2V0KCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNyB8fCBtRGF0YTEgPT0gMHgxZikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjEgJiYgbURhdGEyIDw9IDB4MjMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyICYgMHgzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRGlzcGxheWFibGVDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmFzaWNDaGFyKCkgfHwgaXNTcGVjaWFsQ2hhcigpIHx8IGlzRXh0ZW5kZWRDaGFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRleHQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0QmFzaWNDaGFycygpOwotCi0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSAgZ2V0U3BlY2lhbENoYXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdHIgPSBnZXRFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBjdHJsQ29kZVRvU3RyaW5nKGludCBjdHJsQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIG1DdHJsQ29kZU1hcFtjdHJsQ29kZSAtIDB4MjBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEKLSAgICAgICAgICAgICAgICAgICAgfHwgbURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhciBnZXRCYXNpY0NoYXIoYnl0ZSBkYXRhKSB7Ci0gICAgICAgICAgICBjaGFyIGM7Ci0gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBub24tQVNDSUkgb25lcwotICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDJBOiBjID0gJ1x1MDBFMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1QzogYyA9ICdcdTAwRTknOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUU6IGMgPSAnXHUwMEVEJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVGOiBjID0gJ1x1MDBGMyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg2MDogYyA9ICdcdTAwRkEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0I6IGMgPSAnXHUwMEU3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdDOiBjID0gJ1x1MDBGNyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RDogYyA9ICdcdTAwRDEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0U6IGMgPSAnXHUwMEYxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdGOiBjID0gJ1x1MjU4OCc7IGJyZWFrOyAvLyBGdWxsIGJsb2NrCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogYyA9IChjaGFyKSBkYXRhOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNDaGFycygpIHsKLSAgICAgICAgICAgIGlmIChtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDIpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTEpKTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWNpYWxDaGFyTWFwW21EYXRhMiAtIDB4MzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuZGVkQ2hhcigpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwYW5pc2hDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgobURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm90dWd1ZXNlQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHI7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YTEgPCAweDEwICYmIG1EYXRhMiA8IDB4MTApIHsKLSAgICAgICAgICAgICAgICAvLyBOdWxsIFBhZCwgaWdub3JlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1OdWxsOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3RybENvZGUgPSBnZXRDdHJsQ29kZSgpOwotICAgICAgICAgICAgaWYgKGN0cmxDb2RlICE9IElOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSVzIiwgbVR5cGUsIGN0cmxDb2RlVG9TdHJpbmcoY3RybENvZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRhYk9mZnNldCA9IGdldFRhYk9mZnNldCgpOwotICAgICAgICAgICAgaWYgKHRhYk9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVRhYiVkIiwgbVR5cGUsIHRhYk9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBBQyBwYWMgPSBnZXRQQUMoKTsKLSAgICAgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdUEFDOiAlcyIsIG1UeXBlLCBwYWMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0eWxlQ29kZSBtID0gZ2V0TWlkUm93KCk7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1NaWQtcm93OiAlcyIsIG1UeXBlLCBtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdRGlzcGxheWFibGU6ICVzICglMDJ4ICUwMngpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlLCBnZXREaXNwbGF5VGV4dCgpLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBXaWRnZXQgY2FwYWJsZSBvZiByZW5kZXJpbmcgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbnMuCi0gKi8KLWNsYXNzIENlYTYwOENDV2lkZ2V0IGV4dGVuZHMgQ2xvc2VkQ2FwdGlvbldpZGdldCBpbXBsZW1lbnRzIENlYTYwOENDUGFyc2VyLkRpc3BsYXlMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBtVGV4dEJvdW5kcyA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1EdW1teVRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCI7Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ0NMYXlvdXQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpIHsKLSAgICAgICAgKChDQ0xheW91dCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLnVwZGF0ZShzdHlsZWRUZXh0cyk7Ci0KLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25DaGFuZ2VkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FwdGlvblN0eWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJveCBleHRlbmRzIFRleHRWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRk9OVF9QQURESU5HX1JBVElPID0gMC43NWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfT1VUTElORV9SQVRJTyA9IDAuMWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfU0hBRE9XX1JBVElPID0gMC4wNWY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbU91dGxpbmVXaWR0aDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93UmFkaXVzOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dPZmZzZXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVRleHRDb2xvciA9IENvbG9yLldISVRFOwotICAgICAgICBwcml2YXRlIGludCBtQmdDb2xvciA9IENvbG9yLkJMQUNLOwotICAgICAgICBwcml2YXRlIGludCBtRWRnZVR5cGUgPSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlQ29sb3IgPSBDb2xvci5UUkFOU1BBUkVOVDsKLQotICAgICAgICBDQ0xpbmVCb3goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIHNldFRleHRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBzZXRUeXBlZmFjZShUeXBlZmFjZS5NT05PU1BBQ0UpOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCAod2lsbCBiZSB1cGRhdGVkIGxhdGVyIGR1cmluZyBtZWFzdXJlKQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfb3V0bGluZV93aWR0aCk7Ci0gICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfcmFkaXVzKTsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19vZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgbVRleHRDb2xvciA9IGNhcHRpb25TdHlsZS5mb3JlZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtQmdDb2xvciA9IGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtRWRnZVR5cGUgPSBjYXB0aW9uU3R5bGUuZWRnZVR5cGU7Ci0gICAgICAgICAgICBtRWRnZUNvbG9yID0gY2FwdGlvblN0eWxlLmVkZ2VDb2xvcjsKLQotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgbVNoYWRvd09mZnNldCwgbVNoYWRvd09mZnNldCwgbUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgICAgICBmbG9hdCBmb250U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpICogRk9OVF9QQURESU5HX1JBVElPOwotICAgICAgICAgICAgc2V0VGV4dFNpemUoVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfUFgsIGZvbnRTaXplKTsKLQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IEVER0VfT1VUTElORV9SQVRJTyAqIGZvbnRTaXplICsgMS4wZjsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSBFREdFX1NIQURPV19SQVRJTyAqIGZvbnRTaXplICsgMS4wZjs7Ci0gICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gbVNoYWRvd1JhZGl1czsKLQotICAgICAgICAgICAgLy8gc2V0IGZvbnQgc2NhbGUgaW4gdGhlIFggZGlyZWN0aW9uIHRvIG1hdGNoIHRoZSByZXF1aXJlZCB3aWR0aAotICAgICAgICAgICAgc2V0U2NhbGVYKDEuMGYpOwotICAgICAgICAgICAgZ2V0UGFpbnQoKS5nZXRUZXh0Qm91bmRzKG1EdW1teVRleHQsIDAsIG1EdW1teVRleHQubGVuZ3RoKCksIG1UZXh0Qm91bmRzKTsKLSAgICAgICAgICAgIGZsb2F0IGFjdHVhbFRleHRXaWR0aCA9IG1UZXh0Qm91bmRzLndpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCByZXF1aXJlZFRleHRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBzZXRTY2FsZVgocmVxdWlyZWRUZXh0V2lkdGggLyBhY3R1YWxUZXh0V2lkdGgpOwotCi0gICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgYykgewotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1VOU1BFQ0lGSUVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkUKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBlZGdlIHN0eWxlcyBkb24ndCByZXF1aXJlIGEgc2Vjb25kIHBhc3MKLSAgICAgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfT1VUTElORSkgewotICAgICAgICAgICAgICAgIGRyYXdFZGdlT3V0bGluZShjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmFpc2VkIG9yIGRlcHJlc3NlZAotICAgICAgICAgICAgICAgIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VPdXRsaW5lKENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKLQotICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgUGFpbnQuSm9pbiBwcmV2aW91c0pvaW4gPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlSm9pbigpOwotICAgICAgICAgICAgZmxvYXQgcHJldmlvdXNXaWR0aCA9IHRleHRQYWludC5nZXRTdHJva2VXaWR0aCgpOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKFBhaW50LkpvaW4uUk9VTkQpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKG1PdXRsaW5lV2lkdGgpOwotCi0gICAgICAgICAgICAvLyBEcmF3IG91dGxpbmUgYW5kIGJhY2tncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKHByZXZpb3VzSm9pbik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgocHJldmlvdXNXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0gICAgICAgICAgICAvLyBEcmF3IGZvcmVncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmFpc2VkID0gbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfUkFJU0VEOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yVXAgPSByYWlzZWQgPyBDb2xvci5XSElURSA6IG1FZGdlQ29sb3I7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JEb3duID0gcmFpc2VkID8gbUVkZ2VDb2xvciA6IENvbG9yLldISVRFOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0ID0gbVNoYWRvd1JhZGl1cyAvIDJmOwotCi0gICAgICAgICAgICAvLyBEcmF3IGJhY2tncm91bmQgYW5kIHRleHQgd2l0aCBzaGFkb3cgdXAKLSAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIC1vZmZzZXQsIC1vZmZzZXQsIGNvbG9yVXApOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOwotCi0gICAgICAgICAgICAvLyBEcmF3IHRleHQgd2l0aCBzaGFkb3cgZG93bgotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgK29mZnNldCwgK29mZnNldCwgY29sb3JEb3duKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBzZXR0aW5ncwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kU3BhbnMoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSA9IChTcGFubmFibGUpIHRleHQ7Ci0gICAgICAgICAgICAgICAgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW5bXSBiZ1NwYW5zID0gc3Bhbm5hYmxlLmdldFNwYW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3Bhbm5hYmxlLmxlbmd0aCgpLCBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZ1NwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnU3BhbnNbaV0uc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xheW91dCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSBDZWE2MDhDQ1BhcnNlci5NQVhfUk9XUzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0FGRV9BUkVBX1JBVElPID0gMC45ZjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJveFtdIG1MaW5lQm94ZXMgPSBuZXcgQ0NMaW5lQm94W01BWF9ST1dTXTsKLQotICAgICAgICBDQ0xheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LlNUQVJUKTsKLSAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldID0gbmV3IENDTGluZUJveChnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGFkZFZpZXcobUxpbmVCb3hlc1tpXSwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0Q2FwdGlvblN0eWxlKGNhcHRpb25TdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgewotICAgICAgICAgICAgLy8gSWdub3JlcyB0aGUgZm9udCBzY2FsZSBjaGFuZ2VzIG9mIHRoZSBzeXN0ZW0gd2lkZSBDQyBwcmVmZXJlbmNlLgotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGUoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHRleHRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZmVyW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRUZXh0KHRleHRCdWZmZXJbaV0sIFRleHRWaWV3LkJ1ZmZlclR5cGUuU1BBTk5BQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIGludCBzYWZlV2lkdGggPSBnZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgc2FmZUhlaWdodCA9IGdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmIChzYWZlV2lkdGggKiAzID49IHNhZmVIZWlnaHQgKiA0KSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gc2FmZUhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gc2FmZVdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0KLSAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0ID0gc2FmZUhlaWdodCAvIE1BWF9ST1dTOwotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICBpbnQgbGluZVdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgIHNhZmVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubWVhc3VyZShsaW5lV2lkdGhNZWFzdXJlU3BlYywgbGluZUhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICAgICAvLyBzYWZlIGNhcHRpb24gYXJlYQotICAgICAgICAgICAgaW50IHZpZXdQb3J0V2lkdGggPSByIC0gbDsKLSAgICAgICAgICAgIGludCB2aWV3UG9ydEhlaWdodCA9IGIgLSB0OwotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCwgc2FmZUhlaWdodDsKLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmICh2aWV3UG9ydFdpZHRoICogMyA+PSB2aWV3UG9ydEhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydEhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydEhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRXaWR0aDsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRXaWR0aCAqIDMgLyA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgaW50IGxlZnQgPSAodmlld1BvcnRXaWR0aCAtIHNhZmVXaWR0aCkgLyAyOwotICAgICAgICAgICAgaW50IHRvcCA9ICh2aWV3UG9ydEhlaWdodCAtIHNhZmVIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5sYXlvdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIGkgLyBNQVhfUk9XUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBzYWZlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogKGkgKyAxKSAvIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzNmQ3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi0vLyBOb3RlOiBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVQcm92aWRlci4KLXB1YmxpYyBpbnRlcmZhY2UgTWVkaWFUaW1lUHJvdmlkZXIgewotICAgIC8vIHdlIGRvIG5vdCBhbGxvdyBuZWdhdGl2ZSBtZWRpYSB0aW1lCi0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIHRpbWUgdmFsdWUgaWYgbm8gdGltZWQgZXZlbnQgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTk9fVElNRSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGltZVVzIGlzCi0gICAgICogbm90IG5lZ2F0aXZlLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgZm9yIGEgdGltZWQgZXZlbnQKLSAgICAgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgcmVhY2hlcyAoYmVjb21lcyBncmVhdGVyKSB0aGFuCi0gICAgICogdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoaXMgaGFwcGVucyBpbW1lZGlhdGVseSBpZiB0aGUgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICogaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGltZVVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVVcyBwcmVzZW50YXRpb24gdGltZSB0byBnZXQgdGltZWQgZXZlbnQgY2FsbGJhY2sgYXQgKG9yCi0gICAgICogICAgICAgICAgICAgICB7QGxpbmsgI05PX1RJTUV9KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUF0KGxvbmcgdGltZVVzLCBPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAotICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRoZSBtZWRpYQotICAgICAqIGlzIHN0b3BwZWQsIHRoZSBsaXN0ZW5lciB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBzdG9wIG5vdGlmaWNhdGlvbi4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjZWl2ZSBhIHRpbWVkIGV2ZW50IG5vdGlmaWNhdG9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxOb3RpZmljYXRpb25zKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWNpc2UgICBXaGV0aGVyIGdldHRpbmcgYSBwcmVjaXNlIHRpbWUgaXMgaW1wb3J0YW50LiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICAgICAgICBtb3JlIGNvc3RseS4KLSAgICAgKiBAcGFyYW0gbW9ub3RvbmljIFdoZXRoZXIgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgbW9ub3RvbmljOiB0aGF0IGlzLAotICAgICAqICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHJldHVybmVkIHRpbWUuICBEb24ndAotICAgICAqICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGlzIHRvIHRydWUuICBFLmcuIHRoaXMgaGFzIHVuZGVzaXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzIGlmIHRoZSBtZWRpYSBpcyBzZWVrZWQgYmV0d2VlbiBjYWxscy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbWVkaWEgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVVcyhib29sZWFuIHByZWNpc2UsIGJvb2xlYW4gbW9ub3RvbmljKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uTWVkaWFUaW1lTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdGltZSB3YXMgcmVhY2hlZCBuYXR1cmFsbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSB0aW1lIGNoYW5nZWQgZHVlIHRvIHNlZWtpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5YmFjayBzdG9wcGVkLiAgVGhpcyBpcyBub3QgY2FsbGVkIG9uIHBhdXNlLCBvbmx5Ci0gICAgICAgICAqIG9uIGZ1bGwgc3RvcCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUgaXMgbm8gZnVydGhlciBjdXJyZW50IG1lZGlhIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU3RvcCgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDU1ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVDb250cm9sbGVyIHNpbmNlIFAKLS8qKgotICogVGhlIHN1YnRpdGxlIGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGFyY2hpdGVjdHVyZSB0byBkaXNwbGF5IHN1YnRpdGxlcyBmb3IgYQotICogbWVkaWEgc291cmNlLiAgSXQgYWxsb3dzIHNwZWNpZnlpbmcgd2hpY2ggdHJhY2tzIHRvIGRpc3BsYXksIG9uIHdoaWNoIGFuY2hvcgotICogdG8gZGlzcGxheSB0aGVtLCBhbmQgYWxzbyBhbGxvd3MgYWRkaW5nIGV4dGVybmFsLCBvdXQtb2YtYmFuZCBzdWJ0aXRsZSB0cmFja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJ0aXRsZUNvbnRyb2xsZXIgewotICAgIHByaXZhdGUgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLSAgICBwcml2YXRlIFZlY3RvcjxSZW5kZXJlcj4gbVJlbmRlcmVyczsKLSAgICBwcml2YXRlIFZlY3RvcjxTdWJ0aXRsZVRyYWNrPiBtVHJhY2tzOwotICAgIHByaXZhdGUgU3VidGl0bGVUcmFjayBtU2VsZWN0ZWRUcmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmc7Ci0gICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlciBtQ2FwdGlvbmluZ01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0hPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfSElERSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX1RSQUNLID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSyA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIuQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IEhhbmRsZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0hPVzoKLSAgICAgICAgICAgICAgICBkb1Nob3coKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9ISURFOgotICAgICAgICAgICAgICAgIGRvSGlkZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9UUkFDSzoKLSAgICAgICAgICAgICAgICBkb1NlbGVjdFRyYWNrKChTdWJ0aXRsZVRyYWNrKW1zZy5vYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FbmFibGVkQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZUNoYW5nZWQoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3VidGl0bGUgY29udHJvbGxlciBmb3IgYSBtZWRpYSBwbGF5YmFjayBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0gICAgICogdGhlIE1lZGlhVGltZVByb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyLAotICAgICAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0KLSAgICAgICAgbVJlbmRlcmVycyA9IG5ldyBWZWN0b3I8UmVuZGVyZXI+KCk7Ci0gICAgICAgIG1TaG93aW5nID0gZmFsc2U7Ci0gICAgICAgIG1UcmFja3MgPSBuZXcgVmVjdG9yPFN1YnRpdGxlVHJhY2s+KCk7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlciA9Ci0gICAgICAgICAgICAoQ2FwdGlvbmluZ01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGF2YWlsYWJsZSBzdWJ0aXRsZSB0cmFja3MgZm9yIHRoaXMgbWVkaWEuIFRoZXNlIGluY2x1ZGUKLSAgICAgKiB0aGUgdHJhY2tzIGZvdW5kIGJ5IHtAbGluayBNZWRpYVBsYXllcn0gYXMgd2VsbCBhcyBhbnkgdHJhY2tzIGFkZGVkCi0gICAgICogbWFudWFsbHkgdmlhIHtAbGluayAjYWRkVHJhY2t9LgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrW10gZ2V0VHJhY2tzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgU3VidGl0bGVUcmFja1tdIHRyYWNrcyA9IG5ldyBTdWJ0aXRsZVRyYWNrW21UcmFja3Muc2l6ZSgpXTsKLSAgICAgICAgICAgIG1UcmFja3MudG9BcnJheSh0cmFja3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjawotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldFNlbGVjdGVkVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2suZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHN1YnRpdGxlIHRyYWNrLiAgQXMgYSByZXN1bHQsIHRoaXMgdHJhY2sgd2lsbCByZWNlaXZlCi0gICAgICogaW4tYmFuZCBkYXRhIGZyb20gdGhlIHtAbGluayBNZWRpYVBsYXllcn0uICBIb3dldmVyLCB0aGlzIGRvZXMKLSAgICAgKiBub3QgY2hhbmdlIHRoZSBzdWJ0aXRsZSB2aXNpYmlsaXR5LgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFjayBUaGUgc3VidGl0bGUgdHJhY2sgdG8gc2VsZWN0LiAgVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgdHJhY2tzIGluIHtAbGluayAjZ2V0VHJhY2tzfS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIHdhcyBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgewotICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCAmJiAhbVRyYWNrcy5jb250YWlucyh0cmFjaykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX1RSQUNLLCB0cmFjaykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gdHJhY2spIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IHRyYWNrOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobVRpbWVQcm92aWRlcik7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblN1YnRpdGxlVHJhY2tTZWxlY3RlZCh0cmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN1YnRpdGxlIHRyYWNrIGJhc2VkIG9uIHN5c3RlbSBwcmVmZXJlbmNlcywgb3IgbnVsbCwKLSAgICAgKiBpZiBubyBzdWNoIHRyYWNrIGV4aXN0cyBpbiB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBTdXBwb3J0cyBITFMtZmxhZ3M6IEFVVE9TRUxFQ1QsIEZPUkNFRCAmIERFRkFVTFQuCi0gICAgICoKLSAgICAgKiAxLiBJZiBjYXB0aW9uaW5nIGlzIGRpc2FibGVkLCBvbmx5IGNvbnNpZGVyIEZPUkNFRCB0cmFja3MuIE90aGVyd2lzZSwKLSAgICAgKiBjb25zaWRlciBhbGwgdHJhY2tzLCBidXQgcHJlZmVyIG5vbi1GT1JDRUQgb25lcy4KLSAgICAgKiAyLiBJZiB1c2VyIHNlbGVjdGVkICJEZWZhdWx0IiBjYXB0aW9uIGxhbmd1YWdlOgotICAgICAqICAgYS4gSWYgdGhlcmUgaXMgYSBjb25zaWRlcmVkIHRyYWNrIHdpdGggREVGQVVMVD15ZXMsIHJldHVybnMgdGhhdCB0cmFjawotICAgICAqICAgICAgKGZhdm9yIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgotICAgICAqICAgICAgb25lIGRlZmF1bHQgdHJhY2tzLCBvciB0aGUgZmlyc3QgaW4gZ2VuZXJhbCBpZiBub25lIG9mIHRoZW0gYXJlIGluCi0gICAgICogICAgICB0aGUgY3VycmVudCBsYW5ndWFnZSkuCi0gICAgICogICBiLiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCBBVVRPU0VMRUNUPXllcyBpbiB0aGUgY3VycmVudAotICAgICAqICAgICAgbGFuZ3VhZ2UsIHJldHVybiB0aGF0IG9uZS4KLSAgICAgKiAgIGMuIElmIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRyYWNrcywgYW5kIG5vIGF1dG9zZWxlY3RhYmxlIHRyYWNrcyBpbiB0aGUKLSAgICAgKiAgICAgIGN1cnJlbnQgbGFuZ3VhZ2UsIHJldHVybiBudWxsLgotICAgICAqIDMuIElmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCB0aGUgY2FwdGlvbiBsYW5ndWFnZSwgc2VsZWN0IHRoYXQgb25lLiAgUHJlZmVyCi0gICAgICogdGhlIG9uZSB3aXRoIEFVVE9TRUxFQ1Q9bm8uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGZsYWdzIGFyZSBERUZBVUxUPW5vLCBBVVRPU0VMRUNUPXllcwotICAgICAqIGFuZCBGT1JDRUQ9bm8uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBTdWJ0aXRsZVRyYWNrIGJlc3RUcmFjayA9IG51bGw7Ci0gICAgICAgIGludCBiZXN0U2NvcmUgPSAtMTsKLQotICAgICAgICBMb2NhbGUgc2VsZWN0ZWRMb2NhbGUgPSBtQ2FwdGlvbmluZ01hbmFnZXIuZ2V0TG9jYWxlKCk7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBzZWxlY3RlZExvY2FsZTsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0Rm9yY2VkID0gIW1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgZm9yIChTdWJ0aXRsZVRyYWNrIHRyYWNrOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gdHJhY2suZ2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTEFOR1VBR0UpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm9yY2VkID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9zZWxlY3QgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVCwgMSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzX2RlZmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVCwgMCkgIT0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFuZ3VhZ2VNYXRjaGVzID0KLSAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygiIikgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldElTTzNMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgLy8gaXNfZGVmYXVsdCBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgY2FwdGlvbiBsYW5ndWFnZSBpcyAnZGVmYXVsdCcKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAoZm9yY2VkID8gMCA6IDgpICsKLSAgICAgICAgICAgICAgICAgICAgKCgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCkgJiYgaXNfZGVmYXVsdCkgPyA0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCA/IDAgOiAyKSArIChsYW5ndWFnZU1hdGNoZXMgPyAxIDogMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0Rm9yY2VkICYmICFmb3JjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgdHJlYXQgbnVsbCBsb2NhbGUvbGFuZ3VhZ2UgYXMgbWF0Y2hpbmcgYW55IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgaWYgKChzZWxlY3RlZExvY2FsZSA9PSBudWxsICYmIGlzX2RlZmF1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChsYW5ndWFnZU1hdGNoZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0IHx8IGZvcmNlZCB8fCBzZWxlY3RlZExvY2FsZSAhPSBudWxsKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RUcmFjayA9IHRyYWNrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZXN0VHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0KLSAgICAvKiogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0spKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIGlmIChtVHJhY2tJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAvLyBJZiB0cmFjayBzZWxlY3Rpb24gaXMgZXhwbGljaXQsIGJ1dCB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBpcyBub3QsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNhcHRpb25pbmcgc2V0dGluZwotICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5nZXRGb3JtYXQoKS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TZWxlY3RlZFRyYWNrLmdldFRyYWNrVHlwZSgpID09IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4gaGF2ZSBhIGRlZmF1bHQgKGZvcmNlZCkgdHJhY2sgZXZlbiBpZiBjYXB0aW9uaW5nCi0gICAgICAgIC8vIGlzIG5vdCBlbmFibGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5IGdldERlZmF1bHRUcmFjaygpLgotICAgICAgICAvLyBTaG93IHRoaXMgdHJhY2sgdW5sZXNzIHN1YnRpdGxlcyB3ZXJlIGV4cGxpY2l0bHkgaGlkZGVuLgotICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gZ2V0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWxlY3RUcmFjayh0cmFjayk7Ci0gICAgICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBtdXN0IGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgaGlkZSgpOwotICAgICAgICBzZWxlY3RUcmFjayhudWxsKTsKLSAgICAgICAgbVRyYWNrcy5jbGVhcigpOwotICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcsIGV4dGVybmFsIHN1YnRpdGxlIHRyYWNrIHRvIHRoZSBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGFkZFRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgewotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSByZW5kZXJlci5jcmVhdGVUcmFjayhmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NIT1cpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TaG93KCkgewotICAgICAgICBtU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlIHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfSElERSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0hpZGUoKSB7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc3VidGl0bGUgdHlwZXMgaW4ge0BsaW5rCi0gICAgICogTWVkaWFQbGF5ZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSB3aGVuIGEgbmV3Ci0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIGlzIGRldGVjdGVkLCB0byBzZWUgaWYgaXQgc2hvdWxkIHVzZSB0aGlzIG9iamVjdCB0bwotICAgICAgICAgKiBwYXJzZSBhbmQgZGlzcGxheSB0aGlzIHN1YnRpdGxlIHRyYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYWNrIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICAgKiByZW5kZXJlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSBmb3IgZWFjaAotICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayB0aGF0IHdhcyBkZXRlY3RlZCBhbmQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIGNyZWF0ZSBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QuICBUaGlzIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZm9yIGVhY2ggdHJhY2sgdGhhdCB3YXMgZm91bmQuICBJZiB0aGUgdHJhY2sgaXMgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCi0gICAgICAgICAqIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSBhbmQgZGlzcGxheSB0aGUgdHJhY2sgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgICAgICogQHJldHVybiBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UKLSAgICAgICAgICogYW5kIHJlbmRlciB0aGUgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdCBpbiB7QGxpbmsgTWVkaWFQbGF5ZXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIGEge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlcn0gb2JqZWN0IHRoYXQgYWRkcwotICAgICAqICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBpZiAoIW1SZW5kZXJlcnMuY29udGFpbnMocmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgYWRkZWQgcmVuZGVyZXJzIG92ZXJyaWRlIGV4aXN0aW5nIG9uZXMgKHRvIGFsbG93IHJlcGxhY2luZz8pCi0gICAgICAgICAgICAgICAgbVJlbmRlcmVycy5hZGQocmVuZGVyZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyZXJGb3IoTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidGl0bGUgYW5jaG9yLCBhbiBvYmplY3QgdGhhdCBpcyBhYmxlIHRvIGRpc3BsYXkgYSBzdWJ0aXRsZSByZW5kZXJlciwKLSAgICAgKiBlLmcuIGEgVmlkZW9WaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQW5jaG9yIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvciBzaG91bGQgdXNlIHRoZSBzdXBwbGllZCBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0LCBvcgotICAgICAgICAgKiBub25lIGlmIGl0IGlzIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbmNob3JzIHByb3ZpZGUgdGhlIGxvb3BlciBvbiB3aGljaCBhbGwgdHJhY2sgdmlzaWJpbGl0eSBjaGFuZ2VzCi0gICAgICAgICAqICh0cmFjay5zaG93L2hpZGUsIHNldFN1YnRpdGxlV2lkZ2V0KSB3aWxsIHRha2UgcGxhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTG9vcGVyIGdldFN1YnRpdGxlTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmNob3IgbUFuY2hvcjsKLQotICAgIC8qKgotICAgICAqICBjYWxsZWQgZnJvbSBhbmNob3IncyBsb29wZXIgKGlmIGFueSwgYm90aCB3aGVuIHVuc2V0dGluZyBhbmQKLSAgICAgKiAgc2V0dGluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmNob3IoQW5jaG9yIGFuY2hvcikgewotICAgICAgICBpZiAobUFuY2hvciA9PSBhbmNob3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmNob3IgPSBhbmNob3I7Ci0gICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyKCksIG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmNob3JMb29wZXIoKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBhc3NlcnQgTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkKLSAgICAgICAgICAgICAgICA6ICJNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyBsb29wZXIiOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT25BbmNob3IoTWVzc2FnZSBtKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLmRpc3BhdGNoTWVzc2FnZShtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN1YnRpdGxlIHRyYWNrIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdHJhY2sgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sgb3IgbnVsbAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQoU3VidGl0bGVUcmFjayB0cmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBtTGlzdGVuZXI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkwNjRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlVHJhY2sgc2luY2UgUAotLyoqCi0gKiBBIHN1YnRpdGxlIHRyYWNrIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZwotICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygc3VidGl0bGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0aXRsZVRyYWNrIGltcGxlbWVudHMgTWVkaWFUaW1lUHJvdmlkZXIuT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVRyYWNrIjsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lTXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZU1zOwotCi0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGU7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlFbmRUaW1lID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7Ci0gICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5SUQgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLQotICAgIHByaXZhdGUgQ3VlTGlzdCBtQ3VlczsKLSAgICBmaW5hbCBwcml2YXRlIFZlY3RvcjxDdWU+IG1BY3RpdmVDdWVzID0gbmV3IFZlY3RvcjxDdWU+KCk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVZpc2libGU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBtRm9ybWF0OwotCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1DdWVzID0gbmV3IEN1ZUxpc3QoKTsKLSAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIE1lZGlhRm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGEoU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgbG9uZyBydW5JRCA9IGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIDE7Ci0gICAgICAgIG9uRGF0YShkYXRhLmdldERhdGEoKSwgdHJ1ZSAvKiBlb3MgKi8sIHJ1bklEKTsKLSAgICAgICAgc2V0UnVuRGlzY2FyZFRpbWVNcygKLSAgICAgICAgICAgICAgICBydW5JRCwKLSAgICAgICAgICAgICAgICAoZGF0YS5nZXRTdGFydFRpbWVVcygpICsgZGF0YS5nZXREdXJhdGlvblVzKCkpIC8gMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgaW5wdXQgZGF0YSBmb3IgdGhlIHN1YnRpdGxlIHRyYWNrLiAgVGhlCi0gICAgICogY29tcGxldGUgc3VidGl0bGUgZm9yIGEgdHJhY2sgY2FuIGluY2x1ZGUgbXVsdGlwbGUgd2hvbGUgdW5pdHMKLSAgICAgKiAocnVucykuICBFYWNoIG9mIHRoZXNlIHVuaXRzIGNhbiBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLiAgVGhlCi0gICAgICogY29udGVudHMgb2YgYSBydW4gYXJlIHN1Ym1pdHRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCB3aXRoIGVvcwotICAgICAqIGluZGljYXRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLiAgQ2FsbHMgZnJvbSBkaWZmZXJlbnQKLSAgICAgKiBydW5zIG11c3Qgbm90IGJlIGludGVybWl4ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBzdWJ0aXRsZSBkYXRhIGJ5dGUgYnVmZmVyCi0gICAgICogQHBhcmFtIGVvcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLgotICAgICAqIEBwYXJhbSBydW5JRCBtb3N0bHktdW5pcXVlIElEIGZvciB0aGlzIHJ1biBvZiBkYXRhLiAgU3VidGl0bGUgY3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIHJ1bklEIG9mIDAgYXJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqICAgICAgICAgICAgICBkaXNwbGF5LiAgQ3VlcyB3aXRoIHJ1bklEIG9mIH4wIGFyZSBkaXNjYXJkZWQKLSAgICAgKiAgICAgICAgICAgICAgb25seSBhdCB0aGUgZGVsZXRpb24gb2YgdGhlIHRyYWNrIG9iamVjdC4gIEN1ZXMKLSAgICAgKiAgICAgICAgICAgICAgd2l0aCBvdGhlciBydW5JRC1zIGFyZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgcnVuLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBvZgotICAgICAqICAgICAgICAgICAgICBhbnkgb2YgaXRzIGN1ZXMgKHdpdGggdGhpcyBydW5JRCkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgdGhlIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LAotICAgICAqIGFzIHdlbGwgYXMgd2hlbiBzaG93aW5nIG9yIGhpZGluZyB0aGUgc3VidGl0bGUgdHJhY2ssIG9yIHdoZW4gdGhlIHZpZGVvCi0gICAgICogc3VyZmFjZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0aGF0IHJlbmRlcnMgdGhpcyBzdWJ0aXRsZSB0cmFjay4gRm9yIG1vc3QgcmVuZGVyZXJzCi0gICAgICogICAgICAgICB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgc2hhcmVkIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBmb3IgYWxsCi0gICAgICogICAgICAgICB0cmFja3Mgc3VwcG9ydGVkIGJ5IHRoYXQgcmVuZGVyZXIsIGFzIGF0IG1vc3Qgb25lIHN1YnRpdGxlIHRyYWNrCi0gICAgICogICAgICAgICBpcyB2aXNpYmxlIGF0IG9uZSB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIGN1ZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdWJ0aXRsZQotICAgICAqIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKTsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVBY3RpdmVDdWVzKGJvb2xlYW4gcmVidWlsZCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgLy8gb3V0LW9mLW9yZGVyIHRpbWVzIG1lYW4gc2Vla2luZyBvciBuZXcgYWN0aXZlIGN1ZXMgYmVpbmcgYWRkZWQKLSAgICAgICAgLy8gKGR1cmluZyB0aGVpciBvd24gdGltZXNwYW4pCi0gICAgICAgIGlmIChyZWJ1aWxkIHx8IG1MYXN0VXBkYXRlVGltZU1zID4gdGltZU1zKSB7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdCA9Ci0gICAgICAgICAgICAgICAgbUN1ZXMuZW50cmllc0JldHdlZW4obUxhc3RVcGRhdGVUaW1lTXMsIHRpbWVNcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFBhaXI8TG9uZywgQ3VlPiBldmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBldmVudC5zZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChjdWUubUVuZFRpbWVNcyA9PSBldmVudC5maXJzdCkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwYXN0IGN1ZXMKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJlbW92aW5nICIgKyBjdWUpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubVJ1bklEID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubVN0YXJ0VGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBjdWVzCi0gICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIHdpbGwgaGFwcGVuIGluIHN0YXJ0IG9yZGVyCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5hZGQoY3VlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGN1ZSBpcyBtb2RpZmllZAotICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXBsZXRlIGFueSBydW5zICovCi0gICAgICAgIHdoaWxlIChtUnVuc0J5RW5kVGltZS5zaXplKCkgPiAwICYmCi0gICAgICAgICAgICAgICBtUnVuc0J5RW5kVGltZS5rZXlBdCgwKSA8PSB0aW1lTXMpIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleCgwKTsgLy8gcmVtb3ZlcyBlbGVtZW50Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpbnQgaXgpIHsKLSAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpOwotICAgICAgICB3aGlsZSAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgd2hpbGUgKGN1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgQ3VlIG5leHRDdWUgPSBjdWUubU5leHRJblJ1bjsKLSAgICAgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY3VlID0gbmV4dEN1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5zQnlJRC5yZW1vdmUocnVuLm1SdW5JRCk7Ci0gICAgICAgICAgICBSdW4gbmV4dFJ1biA9IHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgcnVuLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuID0gbmV4dFJ1bjsKLSAgICAgICAgfQotICAgICAgICBtUnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyogcmVtb3ZlIGFsbCBjdWVzICh1bnRhbmdsZSBhbGwgY3Jvc3MtbGlua3MpICovCi0gICAgICAgIGludCBzaXplID0gbVJ1bnNCeUVuZFRpbWUuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGl4ID0gc2l6ZSAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGFrZVRpbWUobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQWN0aXZlQ3VlcygpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDbGVhcmluZyAiICsgbUFjdGl2ZUN1ZXMuc2l6ZSgpICsgIiBhY3RpdmUgY3VlcyIpOwotICAgICAgICBtQWN0aXZlQ3Vlcy5jbGVhcigpOwotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IC0xOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjaGVkdWxlVGltZWRFdmVudHMoKSB7Ci0gICAgICAgIC8qIGdldCB0aW1lcyBmb3IgdGhlIG5leHQgZXZlbnQgKi8KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSBtQ3Vlcy5uZXh0VGltZUFmdGVyKG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2NoZWQgQCIgKyBtTmV4dFNjaGVkdWxlZFRpbWVNcyArICIgYWZ0ZXIgIiArIG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID49IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgKG1OZXh0U2NoZWR1bGVkVGltZU1zICogMTAwMCkgOiBNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLAotICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uVGltZWRFdmVudCAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKGZhbHNlLCB0aW1lTXMpOwotICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU2VlayAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TdG9wIik7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBpZiAobVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1WaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICBpZiAoIW1WaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDdWUoQ3VlIGN1ZSkgewotICAgICAgICBtQ3Vlcy5hZGQoY3VlKTsKLQotICAgICAgICBpZiAoY3VlLm1SdW5JRCAhPSAwKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChjdWUubVJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1biA9IG5ldyBSdW4oKTsKLSAgICAgICAgICAgICAgICBtUnVuc0J5SUQucHV0KGN1ZS5tUnVuSUQsIHJ1bik7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuLm1FbmRUaW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxpbmstdXAgY3VlcyBpbiB0aGUgc2FtZSBydW4KLSAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gcnVuLm1GaXJzdEN1ZTsKLSAgICAgICAgICAgIHJ1bi5tRmlyc3RDdWUgPSBjdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIGN1ZSBpcyBhZGRlZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCBuZWVkIHRvIHJlZnJlc2ggdmlldwotICAgICAgICBsb25nIG5vd01zID0gLTE7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm93TXMgPSBtVGltZVByb3ZpZGVyLmdldEN1cnJlbnRUaW1lVXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcmVjaXNlICovLCB0cnVlIC8qIG1vbm90b25pYyAqLykgLyAxMDAwOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXMgaXQgd2UgYXJlIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgKyAiIDw9ICIgKyBub3dNcyArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zICsgIiA+PSAiICsgbUxhc3RUaW1lTXMpOwotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgPD0gbm93TXMgJiYKLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB0cnVzdCBub3dNcywgc28gY2hlY2sgYW55IGN1ZSBzaW5jZSBsYXN0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMpIHsKLSAgICAgICAgICAgIGlmIChtUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3VidGl0bGVUcmFjayB0cmFjayA9IHRoaXM7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHRoZW5NcyA9IG5vd01zOwotICAgICAgICAgICAgbVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aXRoIHN5bmNocm9uaXplZCwgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gbXVsdGlwbGUgdXBkYXRlcyBhcyB0aGUgcnVubmFibGUgY291bGQgYmUgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUnVubmFibGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aGVuTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gZGVsYXkgdXBkYXRlIHNvIHdlIGRvbid0IHVwZGF0ZSB2aWV3IG9uIGV2ZXJ5IGN1ZS4gIFRPRE8gd2h5IDEwPwotICAgICAgICAgICAgaWYgKG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uYWJsZSwgMTAgLyogZGVsYXkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzY2hlZHVsaW5nIHVwZGF0ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy53KFRBRywgImZhaWxlZCB0byBzY2hlZHVsZSBzdWJ0aXRsZSB2aWV3IHVwZGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZpc2libGUgJiYKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcyAmJgotICAgICAgICAgICAgICAgIChjdWUubVN0YXJ0VGltZU1zIDwgbU5leHRTY2hlZHVsZWRUaW1lTXMgfHwKLSAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPCAwKSkgewotICAgICAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lUHJvdmlkZXIoTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyID09IHRpbWVQcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgY2xhc3MgQ3VlTGlzdCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VlTGlzdCI7Ci0gICAgICAgIC8vIHNpbXBsaXN0aWMsIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbUN1ZXM7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZEV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigyKTsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5wdXQodGltZU1zLCBjdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vlcy5jb250YWlucyhjdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGR1cGxpY2F0ZSBjdWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChDdWUgY3VlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbm9uLXBvc2l0aXZlLWR1cmF0aW9uIGN1ZXMKLSAgICAgICAgICAgIGlmIChjdWUubVN0YXJ0VGltZU1zID49IGN1ZS5tRW5kVGltZU1zKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKCFhZGRFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGxhc3RUaW1lTXMgPSBjdWUubVN0YXJ0VGltZU1zOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zID4gbGFzdFRpbWVNcyAmJiB0aW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoQ3VlIGN1ZSkgewotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPj4gZW50cmllc0JldHdlZW4oCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsYXN0VGltZU1zLCBmaW5hbCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4gPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2xpY2UgKCIgKyBsYXN0VGltZU1zICsgIiwgIiArIHRpbWVNcyArICJdPSIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5zdWJNYXAobGFzdFRpbWVNcyArIDEsIHRpbWVNcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIG5leHRUaW1lQWZ0ZXIobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPj4gdGFpbCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRhaWwgPSBtQ3Vlcy50YWlsTWFwKHRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgIGlmICh0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWwuZmlyc3RLZXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIW1Eb25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBQYWlyPExvbmcsIEN1ZT4gbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdEVudHJ5ID0gbmV3IFBhaXI8TG9uZywgQ3VlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zLCBtTGlzdEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIGlmICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEtleSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUxhc3RFbnRyeTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyByZW1vdmluZyBlbmQgdGFncwotICAgICAgICAgICAgICAgIGlmIChtTGFzdExpc3RJdGVyYXRvciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVudHJ5LnNlY29uZC5tRW5kVGltZU1zICE9IG1MYXN0RW50cnkuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVuZC1jdWUKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdWVzLmdldChtTGFzdEVudHJ5LmZpcnN0KS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUobUxhc3RFbnRyeS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlc3Qgb2YgdGhlIGN1ZXMKLSAgICAgICAgICAgICAgICBDdWUgY3VlID0gbUxhc3RFbnRyeS5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBjdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsIGN1ZXMgKyAiIik7Ci0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBjdWVzOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBuZXh0S2V5KCkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVtYWluaW5nQ3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMgPSBtUmVtYWluaW5nQ3Vlcy5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMuZ2V0KG1DdXJyZW50VGltZU1zKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLnRhaWxNYXAobUN1cnJlbnRUaW1lTXMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ3VycmVudFRpbWVNczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOwotICAgICAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtUmVtYWluaW5nQ3VlczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGFzdExpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgUGFpcjxMb25nLEN1ZT4gbUxhc3RFbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEN1ZUxpc3QoKSB7Ci0gICAgICAgICAgICBtQ3VlcyA9IG5ldyBUcmVlTWFwPExvbmcsIFZlY3RvcjxDdWU+PigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdWUgewotICAgICAgICBwdWJsaWMgbG9uZyBtU3RhcnRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nW10gbUlubmVyVGltZXNNczsKLSAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEOwotCi0gICAgICAgIHB1YmxpYyBDdWUgbU5leHRJblJ1bjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWUobG9uZyB0aW1lTXMpIHsgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgKHdpdGggZGVmYXVsdCBlbmQgdGltZSkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bihsb25nIHJ1bklEKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lIHdpdGggZ2l2ZW4gZW5kIHRpbWUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSdW5EaXNjYXJkVGltZU1zKGxvbmcgcnVuSUQsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogd2hldGhlciB0aGlzIGlzIGEgdGV4dCB0cmFjayB3aG8gZmlyZXMgZXZlbnRzIGluc3RlYWQgZ2V0dGluZyByZW5kZXJlZCAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUCi0gICAgICAgICAgICAgICAgOiBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1biB7Ci0gICAgICAgIHB1YmxpYyBDdWUgbUZpcnN0Q3VlOwotICAgICAgICBwdWJsaWMgUnVuIG1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBSdW4gbVByZXZSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNcyA9IC0xOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0b3JlZEVuZFRpbWVNcyA9IC0xOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQnlFbmRUaW1lTXMoTG9uZ1NwYXJzZUFycmF5PFJ1bj4gcnVuc0J5RW5kVGltZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCB2YWx1ZSBpZiBhbnkKLSAgICAgICAgICAgIGludCBpeCA9IHJ1bnNCeUVuZFRpbWUuaW5kZXhPZktleShtU3RvcmVkRW5kVGltZU1zKTsKLSAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGhpcyA9PSBydW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnNldFZhbHVlQXQoaXgsIG1OZXh0UnVuQXRFbmRUaW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZUF0RW5kVGltZU1zKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBuZXcgdmFsdWUKLSAgICAgICAgICAgIGlmIChtRW5kVGltZU1zID49IDApIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gcnVuc0J5RW5kVGltZS5nZXQobUVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnB1dChtRW5kVGltZU1zLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtU3RvcmVkRW5kVGltZU1zID0gbUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0RW5kVGltZU1zKCkgewotICAgICAgICAgICAgUnVuIHByZXYgPSBtUHJldlJ1bkF0RW5kVGltZU1zOwotCi0gICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcy5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBwcmV2OwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgc3VidGl0bGVzIG9udG8gYSBDYW52YXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJpbmdXaWRnZXQgewotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3MgY2FsbGJhY2ssIHdoaWNoIGlzIHVzZWQgdG8gc2VuZCB1cGRhdGVzIHdoZW4gdGhlCi0gICAgICAgICAqIHJlbmRlcmVkIGRhdGEgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB1cGRhdGUgY2FsbGJhY2sKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3Mgc2l6ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIGluIHBpeGVscwotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGRyYXcgc3VidGl0bGVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZSB0cnVlIGlmIHN1YnRpdGxlcyBzaG91bGQgYmUgZHJhd24sIGZhbHNlIG90aGVyd2lzZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW5kZXJzIHN1YnRpdGxlcyBvbnRvIGEge0BsaW5rIENhbnZhc30uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjIGNhbnZhcyBvbiB3aGljaCB0byByZW5kZXIgc3VidGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGRldGFjaGVkIGZyb20gYSB3aW5kb3cuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsYmFjayB1c2VkIHRvIHNlbmQgdXBkYXRlcyBhYm91dCBjaGFuZ2VzIHRvIHJlbmRlcmluZyBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkNoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJpbmcgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAcGFyYW0gcmVuZGVyaW5nV2lkZ2V0IHRoZSB3aWRnZXQgd2hvc2UgZGF0YSBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmU1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIuTGlicmFyeVJvb3RQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQnVpbGRlckJhc2VQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIuTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU3RhdGljUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkxpYnJhcnlSb290SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUmF0aW5nMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcySW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpRmFjdG9yeSBpbXBsZW1lbnRzIFN0YXRpY1Byb3ZpZGVyIHsKLSAgICBwcml2YXRlIEFwaUZhY3RvcnkoKSB7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RhdGljUHJvdmlkZXIgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBBcGlIZWxwZXIuaW5pdGlhbGl6ZSh1cGRhdGFibGVJbmZvKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBcGlGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xsZXIyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbGxlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQnJvd3NlcjIoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiwgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQnJvd3NlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmEpIHsKLSAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsICYmIGV4dHJhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBhY3Rpb24sIGV4dHJhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmQoQnVuZGxlIGNvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRHcm91cFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoCi0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsKGluc3RhbmNlLAotICAgICAgICAgICAgICAgIChvdGhlciA9PSBudWxsKSA/IG51bGwgOiBvdGhlci5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29udHJvbGxlckluZm9Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29udHJvbGxlckluZm8oCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLCBpbnQgcGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJSW50ZXJmYWNlIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UsIHVpZCwgcGlkLCBwYWNrYWdlTmFtZSwgKElNZWRpYUNvbnRyb2xsZXIyKSBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEJ1dHRvbkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IGNyZWF0ZU1lZGlhU2Vzc2lvbjJCdWlsZGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVNlc3Npb24yLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVySW1wbChjb250ZXh0LCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTIoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyTWVkaWFOb3RpZmljYXRpb24oCi0gICAgICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLk1lZGlhTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTIoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJCdWlsZGVyKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXIgaW5zdGFuY2UsIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuQnVpbGRlckltcGwoc2VydmljZSwgaW5zdGFuY2UsIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaWJyYXJ5Um9vdFByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyTGlicmFyeVJvb3QoCi0gICAgICAgICAgICBMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlSb290SW1wbChpbnN0YW5jZSwgcm9vdElkLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbFZpZXcyKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWRlb1ZpZXcyUHJvdmlkZXIgY3JlYXRlVmlkZW9WaWV3MigKLSAgICAgICAgICAgIFZpZGVvVmlldzIgaW5zdGFuY2UsIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICByZXR1cm4gbmV3IFZpZGVvVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgY3JlYXRlU2Vzc2lvblRva2VuMihDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIHVpZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9TZXNzaW9uVG9rZW4yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhSXRlbTJCdWlsZGVyKE1lZGlhSXRlbTIuQnVpbGRlciBpbnN0YW5jZSwKLSAgICAgICAgICAgIGludCBmbGFncykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBmbGFncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9NZWRpYUl0ZW0yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciBjcmVhdGVWb2x1bWVQcm92aWRlcjIoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZVByb3ZpZGVyMkltcGwoaW5zdGFuY2UsIGNvbnRyb2xUeXBlLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX01lZGlhTWV0YWRhdGEyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhTWV0YWRhdGEySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgc291cmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBmcm9tQnVuZGxlX1JhdGluZzIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19SYXRpbmcyKGludCByYXRpbmdTdHlsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VW5yYXRlZFJhdGluZ19pbXBsKHJhdGluZ1N0eWxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19SYXRpbmcyKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld0hlYXJ0UmF0aW5nX2ltcGwoaGFzSGVhcnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX1JhdGluZzIoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1RodW1iUmF0aW5nX2ltcGwodGh1bWJJc1VwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX1JhdGluZzIoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3U3RhclJhdGluZ19pbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19SYXRpbmcyKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChwZXJjZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgY3JlYXRlTWVkaWFQbGF5bGlzdEFnZW50KE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGxheWxpc3RBZ2VudEltcGwoaW5zdGFuY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJiNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwaUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25JbmZvIHNVcGRhdGFibGVJbmZvOwotCi0gICAgQEd1YXJkZWRCeSgidGhpcyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhlbWUgc0xpYlRoZW1lOwotCi0gICAgcHJpdmF0ZSBBcGlIZWxwZXIoKSB7IH0KLQotICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQXBwbGljYXRpb25JbmZvIHVwZGF0YWJsZUluZm8pIHsKLSAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNVcGRhdGFibGVJbmZvID0gdXBkYXRhYmxlSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlcyBnZXRMaWJSZXNvdXJjZXMoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaWJUaGVtZShjb250ZXh0KS5nZXRSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7Ci0KLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lU3luY2hyb25pemVkKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWVJZCkgewotICAgICAgICBUaGVtZSB0aGVtZSA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKHRoZW1lSWQsIHRydWUpOwotICAgICAgICByZXR1cm4gdGhlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSkgewotICAgICAgICBpZiAodGhlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRMaWJUaGVtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIExheW91dEluZmxhdGVyIGxheW91dEluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5jbG9uZUluQ29udGV4dCgKLSAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSkpOwotICAgICAgICBsYXlvdXRJbmZsYXRlci5zZXRGYWN0b3J5MihuZXcgTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldygKLSAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIGlmIChNZWRpYVJvdXRlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT3ZlcmxheUxpc3RWaWV3LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5TGlzdFZpZXcoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQnV0dG9uQmFyTGF5b3V0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25CYXJMYXlvdXQoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3BhY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNwYWNlKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobnVsbCwgbmFtZSwgY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGxheW91dEluZmxhdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIGdldExpYlRoZW1lKGNvbnRleHQpLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCkgewotICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCB0aGVtZSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQsCi0gICAgICAgICAgICBATnVsbGFibGUgVmlld0dyb3VwIHJvb3QsIGJvb2xlYW4gYXR0YWNoVG9Sb290KSB7Ci0gICAgICAgIHRyeSAoWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldExheW91dChsaWJSZXNJZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCB0aGVtZSkuaW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dGFjaFRvUm9vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGhlbWUgZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNMaWJUaGVtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oc1VwZGF0YWJsZUluZm8pLm5ld1RoZW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YWY2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMjQpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckFwaTI0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZVR5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZThkNDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciBkaXNwbGF5cyBhIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uIG1lZGlhIHJvdXRlIGJ1dHRvbn0KLSAqIGluIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBBY3Rpb25CYXJ9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kCi0gKiB0byBjb250cm9sIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnV0dG9uIHRoYXQgd2lsbAotICogYXBwZWFyIGluIHRoZSBhY3Rpb24gYmFyIG1lbnUuICBOb3RlIHRoYXQgaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGJ1dHRvbgotICogd2hlbiBubyByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIGluc3RlYWQgbWFrZSB0aGUKLSAqIG1lbnUgaXRlbSBpbnZpc2libGUuICBJbiB0aGlzIHdheSwgdGhlIGJ1dHRvbiB3aWxsIG9ubHkgYmUgdmlzaWJsZSB3aGVuIGl0Ci0gKiBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZGlzY292ZXIgYW5kIHNlbGVjdCBhIG1hdGNoaW5nIHJvdXRlLgotICogPC9wPgotICoKLSAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIsIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLSAqIHtAbGluayBBcHBDb21wYXRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwPgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWZpbmUgYSBtZW51IHJlc291cmNlIHRvIGluY2x1ZGUgdGhlIHByb3ZpZGVyIGluIHRoZQotICogYWN0aW9uIGJhciBvcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgdGhlIHN1cHBvcnQgbGlicmFyeSBhY3Rpb24gYmFyIHVzZXMgYXR0cmlidXRlcwotICogdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyByZXNvdXJjZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZyYW1ld29yaydzCi0gKiByZXNvdXJjZSBuYW1lc3BhY2UgdG8gY29uZmlndXJlIGVhY2ggaXRlbS4KLSAqIDwvcD48cHJlPgotICogJmx0O21lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICogICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byI+Ci0gKiAgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZWRpYV9yb3V0ZV9tZW51X2l0ZW0iCi0gKiAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVkaWFfcm91dGVfbWVudV90aXRsZSIKLSAqICAgICAgICAgYXBwOnNob3dBc0FjdGlvbj0iYWx3YXlzIgotICogICAgICAgICBhcHA6YWN0aW9uUHJvdmlkZXJDbGFzcz0iYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiLz4KLSAqICZsdDsvbWVudT4KLSAqIDwvcHJlPjxwPgotICogVGhlbiBjb25maWd1cmUgdGhlIG1lbnUgYW5kIHNldCB0aGUgcm91dGUgc2VsZWN0b3IgZm9yIHRoZSBjaG9vc2VyLgotICogPC9wPjxwcmU+Ci0gKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFwcENvbXBhdEFjdGl2aXR5IHsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICoKLSAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gKgotICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gKiAgICAgfQotICoKLSAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcwotICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAqCi0gKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICoKLSAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KLSAqICAgICB9Ci0gKgotICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKLSAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAqICAgICB9Ci0gKgotICogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7Ci0gKgotICogICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5zYW1wbGVfbWVkaWFfcm91dGVyX21lbnUsIG1lbnUpOwotICoKLSAqICAgICAgICAgTWVudUl0ZW0gbWVkaWFSb3V0ZU1lbnVJdGVtID0gbWVudS5maW5kSXRlbShSLmlkLm1lZGlhX3JvdXRlX21lbnVfaXRlbSk7Ci0gKiAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgPQotICogICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIpTWVudUl0ZW1Db21wYXQuZ2V0QWN0aW9uUHJvdmlkZXIobWVkaWFSb3V0ZU1lbnVJdGVtKTsKLSAqICAgICAgICAgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAqICAgICAgICAgcmV0dXJuIHRydWU7Ci0gKiAgICAgfQotICoKLSAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAqICAgICB9Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpb25Qcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYWN0aW9uIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBpcyBzdGlsbCBuZWVkZWQgYnkgdGhlIFVJLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIG1heSBsZWFrIGNhbGxiYWNrcyB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLiAgVGhpcyBtYXkgcmVzdWx0IGluCi0gICAgICAgICAgICAvLyBtZWRpYSByb3V0ZSBwcm92aWRlcnMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBzaG9ydCB0ZXJtCi0gICAgICAgICAgICAvLyB3aGlsZSB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZiBpbnRlcmVzdCB0byB0aGUKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbmVlZCBzb21lCi0gICAgICAgICAgICAvLyBpbmRpY2F0aW9uIGZyb20gdGhlIGZyYW1ld29yayB0aGF0IGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpYWxvZ0ZhY3RvcnkgIT0gZmFjdG9yeSkgewotICAgICAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OwotCi0gICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBtZWRpYSByb3V0ZSBidXR0b24sIG9yIG51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIGdldE1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBtQnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oZ2V0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlQWN0aW9uVmlldygpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DcmVhdGVBY3Rpb25WaWV3OiB0aGlzIEFjdGlvblByb3ZpZGVyIGlzIGFscmVhZHkgYXNzb2NpYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIndpdGggYSBtZW51IGl0ZW0uIERvbid0IHJldXNlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBpbnN0YW5jZXMhICIgKwotICAgICAgICAgICAgICAgICAgICAiQWJhbmRvbmluZyB0aGUgb2xkIG1lbnUgaXRlbS4uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1dHRvbiA9IG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpOwotICAgICAgICBtQnV0dG9uLnNldENoZWF0U2hlZXRFbmFibGVkKHRydWUpOwotICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KG1EaWFsb2dGYWN0b3J5KTsKLSAgICAgICAgbUJ1dHRvbi5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25QZXJmb3JtRGVmYXVsdEFjdGlvbigpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1CdXR0b24uc2hvd0RpYWxvZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXNJdGVtVmlzaWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoUm91dGUoKSB7Ci0gICAgICAgIHJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4gbVByb3ZpZGVyV2VhazsKLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXJDYWxsYmFjayhNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlcldlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+KHByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSb3V0ZShNZWRpYVJvdXRlciByb3V0ZXIpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcldlYWsuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlZnJlc2hSb3V0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIucmVtb3ZlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU4YTYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5Ub29sdGlwQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBidXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kIHRvIGNvbnRyb2wgdGhlCi0gKiBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3Igd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMgbm90Ci0gKiBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yKCkgc2VsZWN0b3J9LCB0aGUgYnV0dG9uIHdpbGwgYXBwZWFyIGluCi0gKiBhbiBpbmFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25uZWN0ZWQgdG8gYQotICogcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBDbGlja2luZyBvbiB0aGUgYnV0dG9uIG9wZW5zCi0gKiBhIHtAbGluayBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcm91dGUuCi0gKiBJZiBubyBub24tZGVmYXVsdCByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGFuIGFjdGl2ZQotICogc2NhbiB0byBkaXNjb3ZlciBhbnkgbWF0Y2hpbmcgcm91dGVzLCB0aGVuIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIGNhbm5vdAotICogYmUgY2xpY2tlZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBub24tZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCB0aGUgYnV0dG9uIHdpbGwKLSAqIGFwcGVhciBpbiBhbiBhY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBjb25uZWN0ZWQKLSAqIHRvIGEgcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBUaGUgYnV0dG9uIG1heSBhbHNvIGFwcGVhcgotICogaW4gYW4gaW50ZXJtZWRpYXJ5IGNvbm5lY3Rpbmcgc3RhdGUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcKLSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGRvaW5nIHNvLiAgSW4gZWl0aGVyIGNhc2UsIGNsaWNraW5nCi0gKiBvbiB0aGUgYnV0dG9uIG9wZW5zIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlcgotICogdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9IGZyb20gdGhlIDxjb2RlPmFuZHJvaWQuc3VwcG9ydC52NDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQnV0dG9uIGV4dGVuZHMgVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQnV0dG9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0VSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBpbnQgbVJvdXRlQ2FsbGJhY2tGbGFnczsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gc1JlbW90ZUluZGljYXRvckNhY2hlID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KDIpOwotICAgIHByaXZhdGUgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVtb3RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDb25uZWN0aW5nOwotCi0gICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtQnV0dG9uVGludDsKLSAgICBwcml2YXRlIGludCBtTWluV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbU1pbkhlaWdodDsKLQotICAgIC8vIFRoZSBjaGVja2VkIHN0YXRlIGlzIHVzZWQgd2hlbiBjb25uZWN0ZWQgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tFRF9TVEFURV9TRVQgPSB7Ci0gICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrZWQKLSAgICB9OwotCi0gICAgLy8gVGhlIGNoZWNrYWJsZSBzdGF0ZSBpcyB1c2VkIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tBQkxFX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2thYmxlCi0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIFIuYXR0ci5tZWRpYVJvdXRlQnV0dG9uU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChjb250ZXh0KSwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIFJlc291cmNlcy5UaGVtZSB0aGVtZSA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKLSAgICAgICAgdGhlbWUuYXBwbHlTdHlsZShNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCksIHRydWUpOwotICAgICAgICBUeXBlZEFycmF5IGEgPSB0aGVtZS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b24sIGRlZlN0eWxlQXR0ciwgMCk7Ci0KLSAgICAgICAgbUJ1dHRvblRpbnQgPSBhLmdldENvbG9yU3RhdGVMaXN0KFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fbWVkaWFSb3V0ZUJ1dHRvblRpbnQpOwotICAgICAgICBtTWluV2lkdGggPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluV2lkdGgsIDApOwotICAgICAgICBtTWluSGVpZ2h0ID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbkhlaWdodCwgMCk7Ci0gICAgICAgIGludCByZW1vdGVJbmRpY2F0b3JSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2V4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUsIDApOwotICAgICAgICBhLnJlY3ljbGUoKTsKLQotICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSByZW1vdGVJbmRpY2F0b3JTdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5nZXQocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3JTdGF0ZS5uZXdEcmF3YWJsZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG5ldyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuZXhlY3V0ZU9uRXhlY3V0b3IoQXN5bmNUYXNrLlRIUkVBRF9QT09MX0VYRUNVVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIHNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKG1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpICYmIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtUm91dGVDYWxsYmFja0ZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgcm91dGUgY2hvb3NlciBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMKLSAgICAgKiBub3QgbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvciBzZWxlY3Rvcn0sIHRoZW4gc2hvd3MgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqIE90aGVyd2lzZSwgc2hvd3MgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIHRvIG9mZmVyIHRoZSB1c2VyCi0gICAgICogYSBjaG9pY2UgdG8gZGlzY29ubmVjdCBmcm9tIHRoZSByb3V0ZSBvciBwZXJmb3JtIG90aGVyIGNvbnRyb2wgYWN0aW9ucwotICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgcm91dGUncyB2b2x1bWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaWFsb2dGYWN0b3J5fQotICAgICAqIHRvIHByb3ZpZGUgYSBjdXN0b21pemVkIGRpYWxvZyBmYWN0b3J5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGlhbG9nIHdhcyBhY3R1YWxseSBzaG93bi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBhY3Rpdml0eSBpcyBub3QgYSBzdWJjbGFzcyBvZgotICAgICAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRBY3Rpdml0eSgpLmdldEZyYWdtZW50TWFuYWdlcigpOwotICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBGcmFnbWVudEFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgaWYgKHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgfHwgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ0hPT1NFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNob29zZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGYgPQotICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgICAgICAgICAgZi5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENIT09TRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY29udHJvbGxlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENPTlRST0xMRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0gICAgICAgIC8vIEdyb3NzIHdheSBvZiB1bndyYXBwaW5nIHRoZSBBY3Rpdml0eSBzbyB3ZSBjYW4gZ2V0IHRoZSBGcmFnbWVudE1hbmFnZXIKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICB3aGlsZSAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHRXcmFwcGVyKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBY3Rpdml0eSljb250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dCA9ICgoQ29udGV4dFdyYXBwZXIpY29udGV4dCkuZ2V0QmFzZUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHNob3dpbmcgYSB0b2FzdCB3aXRoIHRoZSBjb250ZW50IGRlc2NyaXB0b3Igb2YgdGhlCi0gICAgICogYnV0dG9uIHdoZW4gdGhlIGJ1dHRvbiBpcyBsb25nIHByZXNzZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGVhdFNoZWV0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBUb29sdGlwQ29tcGF0LnNldFRvb2x0aXBUZXh0KHRoaXMsIGVuYWJsZQotICAgICAgICAgICAgICAgID8gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcubXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgOiBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIGFwcHJvcHJpYXRlIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFuZCBjYWxsIGxpc3RlbmVycwotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5wZXJmb3JtQ2xpY2soKTsKLSAgICAgICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG93RGlhbG9nKCkgfHwgaGFuZGxlZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgIGZpbmFsIGludFtdIGRyYXdhYmxlU3RhdGUgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSArIDEpOwotCi0gICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBiZSBoYW5kbGluZyB0aGlzIG1vcmUgY29tcGxldGVseSwgYnV0IHRoZXNlCi0gICAgICAgIC8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGhlcmUuIENoZWNrYWJsZSBpcyB1c2VkIHRvIGV4cHJlc3MgdGhlIGNvbm5lY3RpbmcKLSAgICAgICAgLy8gZHJhd2FibGUgc3RhdGUgYW5kIGl0J3MgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hlY2sgZm9yIHRoZSBwdXJwb3NlcwotICAgICAgICAvLyBvZiBzdGF0ZSBzZWxlY3Rpb24gaGVyZS4KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tBQkxFX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0VEX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRyYXdhYmxlU3RhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50W10gbXlEcmF3YWJsZVN0YXRlID0gZ2V0RHJhd2FibGVTdGF0ZSgpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRTdGF0ZShteURyYXdhYmxlU3RhdGUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIHVzZSBhcyB0aGUgcmVtb3RlIHJvdXRlIGluZGljYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShEcmF3YWJsZSBkKSB7Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuY2FuY2VsKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB1bnNjaGVkdWxlRHJhd2FibGUobVJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1CdXR0b25UaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkID0gRHJhd2FibGVDb21wYXQud3JhcChkLm11dGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5zZXRUaW50TGlzdChkLCBtQnV0dG9uVGludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkLnNldENhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgZC5zZXRTdGF0ZShnZXREcmF3YWJsZVN0YXRlKCkpOwotICAgICAgICAgICAgZC5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbW90ZUluZGljYXRvciA9IGQ7Ci0KLSAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93ICYmIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKERyYXdhYmxlIHdobykgewotICAgICAgICByZXR1cm4gc3VwZXIudmVyaWZ5RHJhd2FibGUod2hvKSB8fCB3aG8gPT0gbVJlbW90ZUluZGljYXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBqdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgc3VwZXIgdG8gaGFuZGxlIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KLSAgICAgICAgLy9zdXBlci5qdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKTsKLSAgICAgICAgaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBvdXIgb3duIHJlbW90ZSBpbmRpY2F0b3IuCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KG1NaW5XaWR0aCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCkgKyBnZXRQYWRkaW5nTGVmdCgpICsgZ2V0UGFkZGluZ1JpZ2h0KCkgOiAwKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KG1NaW5IZWlnaHQsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKSArIGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKSA6IDApOwotCi0gICAgICAgIGludCBtZWFzdXJlZFdpZHRoOwotICAgICAgICBzd2l0Y2ggKHdpZHRoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IE1hdGgubWluKHdpZHRoU2l6ZSwgd2lkdGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0OwotICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHRTaXplLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBnZXRQYWRkaW5nTGVmdCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IGdldFBhZGRpbmdUb3AoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdXaWR0aCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3SGVpZ2h0ID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3TGVmdCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0IC0gZHJhd1dpZHRoKSAvIDI7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1RvcCA9IHRvcCArIChib3R0b20gLSB0b3AgLSBkcmF3SGVpZ2h0KSAvIDI7Ci0KLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Qm91bmRzKGRyYXdMZWZ0LCBkcmF3VG9wLAotICAgICAgICAgICAgICAgICAgICBkcmF3TGVmdCArIGRyYXdXaWR0aCwgZHJhd1RvcCArIGRyYXdIZWlnaHQpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZW1vdGUgPSAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RpbmcgPSBpc1JlbW90ZSAmJiByb3V0ZS5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1JlZnJlc2ggPSBmYWxzZTsKLSAgICAgICAgaWYgKG1SZW1vdGVBY3RpdmUgIT0gaXNSZW1vdGUpIHsKLSAgICAgICAgICAgIG1SZW1vdGVBY3RpdmUgPSBpc1JlbW90ZTsKLSAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcgIT0gaXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtSXNDb25uZWN0aW5nID0gaXNDb25uZWN0aW5nOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkc1JlZnJlc2gpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHNldEVuYWJsZWQobVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZWVkc1JlZnJlc2ggfHwgaXNDb25uZWN0aW5nKSAmJiAhY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVtb3RlICYmICFpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByb3V0ZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBiZWZvcmUgdGhlIHZpZXcgaXMgYXR0YWNoZWQsIHNob3cgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBmcmFtZSBvZiB0aGUgY29ubmVjdGVkIGFuaW1hdGlvbiBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBpbnQgcmVzSWQ7Ci0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3Rpbmc7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24oQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldFN0cmluZyhyZXNJZCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIERyYXdhYmxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNJZDsKLQotICAgICAgICBSZW1vdGVJbmRpY2F0b3JMb2FkZXIoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICBtUmVzSWQgPSByZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgRHJhd2FibGUgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0RHJhd2FibGUobVJlc0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjYWNoZUFuZFJlc2V0KERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLnB1dChtUmVzSWQsIHJlbW90ZUluZGljYXRvci5nZXRDb25zdGFudFN0YXRlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzY0ZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQXBwQ29tcGF0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCi0gKiA8cD4KLSAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByb3V0ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3Rvci4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUNob29zZXJEaWFsb2ciOwotCi0gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcm91dGUgbGlzdCBpbW1lZGlhdGVseSB0byBhdm9pZCB1bm5hdHVyYWwgZGlhbG9nIGNoYW5nZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ST1VURVNfREVMQVlfTVMgPSAzMDBMOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9ST1VURVMgPSAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbVJvdXRlczsKLSAgICBwcml2YXRlIFJvdXRlQWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0VmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZTsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9ST1VURVM6Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcygoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KSBtZXNzYWdlLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBhbGwgcm91dGVzIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZAotICAgICAqIHJlbW92ZXMgdGhvc2UgZm9yIHdoaWNoIHtAbGluayAjb25GaWx0ZXJSb3V0ZX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVzIFRoZSBsaXN0IG9mIHJvdXRlcyB0byBmaWx0ZXIgaW4tcGxhY2UsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaWx0ZXJSb3V0ZXMoQE5vbk51bGwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBmb3IgKGludCBpID0gcm91dGVzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpZiAoIW9uRmlsdGVyUm91dGUocm91dGVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGZvciBlbmFibGVkIG5vbi1kZWZhdWx0IHJvdXRlcyB0aGF0Ci0gICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHJvdXRlcwotICAgICAqIGRpZmZlcmVudGx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gY29uc2lkZXIsIG5ldmVyIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewotICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCB0aXRsZUlkKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2RpYWxvZykpOwotCi0gICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBuZXcgUm91dGVBZGFwdGVyKGdldENvbnRleHQoKSwgbVJvdXRlcyk7Ci0gICAgICAgIG1MaXN0VmlldyA9IChMaXN0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX2xpc3QpOwotICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlcik7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldEVtcHR5VmlldyhmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KSk7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3RpdGxlKTsKLQotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgoZ2V0Q29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm91dGVzIHRoYXQgYXJlIHNob3duIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoUm91dGVzKCkgewotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUm91dGVyLmdldFJvdXRlcygpKTsKLSAgICAgICAgICAgIG9uRmlsdGVyUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJvdXRlcywgUm91dGVDb21wYXJhdG9yLnNJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtTGFzdFVwZGF0ZVRpbWUgPj0gVVBEQVRFX1JPVVRFU19ERUxBWV9NUykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcyhyb3V0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX1JPVVRFUywgcm91dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VXBkYXRlVGltZSArIFVQREFURV9ST1VURVNfREVMQVlfTVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVSb3V0ZXMoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVJvdXRlcy5jbGVhcigpOwotICAgICAgICBtUm91dGVzLmFkZEFsbChyb3V0ZXMpOwotICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUm91dGVBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdFZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHRJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1Udkljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VyR3JvdXBJY29uOwotCi0gICAgICAgIHB1YmxpYyBSb3V0ZUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCByb3V0ZXMpOwotCi0gICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVUdkljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtRGVmYXVsdEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDApOwotICAgICAgICAgICAgbVR2SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMSk7Ci0gICAgICAgICAgICBtU3BlYWtlckljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDIpOwotICAgICAgICAgICAgbVNwZWFrZXJHcm91cEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDMpOwotICAgICAgICAgICAgc3R5bGVkQXR0cmlidXRlcy5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlldyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfbGlzdF9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX25hbWUpOwotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDIgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9kZXNjKTsKLSAgICAgICAgICAgIHRleHQxLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHJvdXRlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0KLSAgICAgICAgICAgICAgICAgICAgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgJiYgIVRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5CT1RUT00pOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5zZXRFbmFibGVkKHJvdXRlLmlzRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2ljb24pOwotICAgICAgICAgICAgaWYgKGljb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGdldEljb25EcmF3YWJsZShyb3V0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIFVyaSBpY29uVXJpID0gcm91dGUuZ2V0SWNvblVyaSgpOwotICAgICAgICAgICAgaWYgKGljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShpY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKGlzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvYWQgIiArIGljb25VcmksIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBGYWxscyBiYWNrLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgaXMgc3BlY2lmaWVkLCB1c2UgaXQuCi0gICAgICAgICAgICBzd2l0Y2ggKHJvdXRlLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9UVjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Udkljb247Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfU1BFQUtFUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VySWNvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBiZXN0IGd1ZXNzIGJhc2VkIG9uIG90aGVyIHJvdXRlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgc3BlYWtlcnMgY2FuIGJlIGdyb3VwZWQgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJHcm91cEljb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRJY29uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJvdXRlQ29tcGFyYXRvciBzSW5zdGFuY2UgPSBuZXcgUm91dGVDb21wYXJhdG9yKCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbGhzLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcmhzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGhzLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJocy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNmIyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSAoTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cpZ2V0RGlhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG9uQ3JlYXRlQ2hvb3NlckRpYWxvZygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDaG9vc2VyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbURpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKGdldFJvdXRlU2VsZWN0b3IoKSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjZmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWV9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fU1RPUDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhRGVzY3JpcHRpb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhTWV0YWRhdGFDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmdyYXBoaWNzLlBhbGV0dGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcuT3ZlcmxheU9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgZXh0ZW5kcyBBbGVydERpYWxvZyB7Ci0gICAgLy8gVGFncyBzaG91bGQgYmUgbGVzcyB0aGFuIDI0IGNoYXJhY3RlcnMgbG9uZyAoc2VlIGRvY3MgZm9yIGFuZHJvaWQudXRpbC5Mb2cuaXNMb2dnYWJsZSgpKQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDdHJsRGlhbG9nIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8vIFRpbWUgdG8gd2FpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHZvbHVtZSB3aGVuIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNlZWsgYmFyCi0gICAgLy8gdG8gYWxsb3cgdGhlIHJvdXRlIHByb3ZpZGVyIHRpbWUgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgYW5kIHB1Ymxpc2ggYSBuZXcKLSAgICAvLyByb3V0ZSBkZXNjcmlwdG9yLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMgPSA1MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTID0gKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMEwpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ORVVUUkFMX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24zOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fU1RPUF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMTsKLQotICAgIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNyZWF0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBpbnQgbURpYWxvZ0NvbnRlbnRXaWR0aDsKLQotICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tQ29udHJvbFZpZXc7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGlzY29ubmVjdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcENhc3RpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheWJhY2tDb250cm9sQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtRXhwYW5kYWJsZUFyZWFMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbURpYWxvZ0FyZWFMYXlvdXQ7Ci0gICAgRnJhbWVMYXlvdXQgbURlZmF1bHRDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUN1c3RvbUNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUFydFZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1Sb3V0ZU5hbWVUZXh0VmlldzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSB0cnVlOwotICAgIC8vIExheW91dCBmb3IgbWVkaWEgY29udHJvbGxlcnMgaW5jbHVkaW5nIHBsYXkvcGF1c2UgYnV0dG9uIGFuZCB0aGUgbWFpbiB2b2x1bWUgc2xpZGVyLgotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NZWRpYU1haW5Db250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgUmVsYXRpdmVMYXlvdXQgbVBsYXliYWNrQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtVm9sdW1lQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIFZpZXcgbURpdmlkZXJWaWV3OwotCi0gICAgT3ZlcmxheUxpc3RWaWV3IG1Wb2x1bWVHcm91cExpc3Q7Ci0gICAgVm9sdW1lR3JvdXBBZGFwdGVyIG1Wb2x1bWVHcm91cEFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkOwotICAgIHByaXZhdGUgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZDsKLSAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwOwotICAgIFNlZWtCYXIgbVZvbHVtZVNsaWRlcjsKLSAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBtVm9sdW1lQ2hhbmdlTGlzdGVuZXI7Ci0gICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7Ci0gICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgU2Vla0Jhcj4gbVZvbHVtZVNsaWRlck1hcDsKLQotICAgIE1lZGlhQ29udHJvbGxlckNvbXBhdCBtTWVkaWFDb250cm9sbGVyOwotICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIG1Db250cm9sbGVyQ2FsbGJhY2s7Ci0gICAgUGxheWJhY2tTdGF0ZUNvbXBhdCBtU3RhdGU7Ci0gICAgTWVkaWFEZXNjcmlwdGlvbkNvbXBhdCBtRGVzY3JpcHRpb247Ci0KLSAgICBGZXRjaEFydFRhc2sgbUZldGNoQXJ0VGFzazsKLSAgICBCaXRtYXAgbUFydEljb25CaXRtYXA7Ci0gICAgVXJpIG1BcnRJY29uVXJpOwotICAgIGJvb2xlYW4gbUFydEljb25Jc0xvYWRlZDsKLSAgICBCaXRtYXAgbUFydEljb25Mb2FkZWRCaXRtYXA7Ci0gICAgaW50IG1BcnRJY29uQmFja2dyb3VuZENvbG9yOwotCi0gICAgYm9vbGVhbiBtSGFzUGVuZGluZ1VwZGF0ZTsKLSAgICBib29sZWFuIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkOwotCi0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW5nOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZzsKLSAgICBpbnQgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zOwotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLQotICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotICAgIFJ1bm5hYmxlIG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbUNvbnRyb2xsZXJDYWxsYmFjayA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wKTsKLSAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5saW5lYXJfb3V0X3Nsb3dfaW4pOwotICAgICAgICBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IuZmFzdF9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHRoYXQgdGhpcyBkaWFsb2cgaXMgY29udHJvbGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBnZXRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ2V0R3JvdXAoKSB7Ci0gICAgICAgIGlmIChtUm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIG1Sb3V0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyB0aGUgc3ViY2xhc3MgYW4gb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGEgdmlldyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBtZWRpYQotICAgICAqIGNvbnRyb2xzIGZvciB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgVGhlIGRpYWxvZydzIHNhdmVkIGluc3RhbmNlIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIGNvbnRyb2wgdmlldyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgZ2V0TWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKLSAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVDb250cm9sRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xFbmFibGVkICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gZW5hYmxlOwotICAgICAgICAgICAgaWYgKG1DcmVhdGVkKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4gVGhlIGRpYWxvZwotICAgICAqIHdpbGwgbGlzdGVuIHRvIGNoYW5nZXMgb24gdGhpcyBzZXNzaW9uIGFuZCB1cGRhdGUgdGhlIFVJIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAgKiByZXNwb25zZSB0byBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25Ub2tlbiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBzZXNzaW9uVG9rZW4pIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvblRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyQ29tcGF0KG1Db250ZXh0LCBzZXNzaW9uVG9rZW4pOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY3JlYXRpbmcgbWVkaWEgY29udHJvbGxlciBpbiBzZXRNZWRpYVNlc3Npb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgOiBtTWVkaWFDb250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgbVN0YXRlID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIGdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZVJlc291cmNlKGFuZHJvaWQuUi5jb2xvci50cmFuc3BhcmVudCk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKG1Db250ZXh0LCBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQobUNvbnRleHQpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXV0cmFsIGJ1dHRvbi4KLSAgICAgICAgZmluZFZpZXdCeUlkKEJVVFRPTl9ORVVUUkFMX1JFU19JRCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIENsaWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2xpY2tMaXN0ZW5lcigpOwotCi0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2V4cGFuZGFibGVfYXJlYSk7Ci0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGlhbG9nX2FyZWEpOwotICAgICAgICBtRGlhbG9nQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIEVhdCB1bmhhbmRsZWQgdG91Y2ggZXZlbnRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW50IGNvbG9yID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRCdXR0b25UZXh0Q29sb3IobUNvbnRleHQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX1NUT1BfUkVTX0lEKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nKSk7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKLSAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2xvc2UpOwotICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jdXN0b21fY29udHJvbCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RlZmF1bHRfY29udHJvbCk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIHNlc3Npb24gYWN0aXZpdHkgd2hlbiBhIGNvbnRlbnQgaXRlbSAoYWxidW0gYXJ0LCB0aXRsZSBvciBzdWJ0aXRsZSkgaXMgY2xpY2tlZC4KLSAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgb25DbGlja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnNlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHBpICsgIiB3YXMgbm90IHNlbnQsIGl0IGhhZCBiZWVuIGNhbmNlbGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQXJ0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2FydCk7Ci0gICAgICAgIG1BcnRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOwotICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lcikuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9tZWRpYV9tYWluX2NvbnRyb2wpOwotICAgICAgICBtRGl2aWRlclZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX2RpdmlkZXIpOwotCi0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9wbGF5YmFja19jb250cm9sKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGUpOwotICAgICAgICBtU3VidGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9zdWJ0aXRsZSk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpOwotICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfY29udHJvbCk7Ci0gICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlciA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFRhZyhtUm91dGUpOwotICAgICAgICBtVm9sdW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfZ3JvdXBfbGlzdCk7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPigpOwotICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyID0gbmV3IFZvbHVtZUdyb3VwQWRhcHRlcihtVm9sdW1lR3JvdXBMaXN0LmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEFkYXB0ZXIobVZvbHVtZUdyb3VwQWRhcHRlcik7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtVm9sdW1lR3JvdXBMaXN0LCBnZXRHcm91cCgpICE9IG51bGwpOwotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSBtVm9sdW1lU2xpZGVyLCBtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KG1Sb3V0ZSwgbVZvbHVtZVNsaWRlcik7Ci0KLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24gPQotICAgICAgICAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSk7Ci0gICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbG9hZEludGVycG9sYXRvcigpOwotICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zKTsKLSAgICAgICAgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zKTsKLQotICAgICAgICBtQ3VzdG9tQ29udHJvbFZpZXcgPSBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5hZGRWaWV3KG1DdXN0b21Db250cm9sVmlldyk7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaW50IHdpZHRoID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChtQ29udGV4dCk7Ci0gICAgICAgIGdldFdpbmRvdygpLnNldExheW91dCh3aWR0aCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotCi0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIG1EaWFsb2dDb250ZW50V2lkdGggPSB3aWR0aCAtIGRlY29yVmlldy5nZXRQYWRkaW5nTGVmdCgpIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdSaWdodCgpOwotCi0gICAgICAgIFJlc291cmNlcyByZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0KTsKLQotICAgICAgICAvLyBGZXRjaCBhcnQgaWNvbnMgYWdhaW4gZm9yIGxheW91dCBjaGFuZ2VzIHRvIHJlc2l6ZSBpdCBhY2NvcmRpbmdseQotICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uVXJpID0gbnVsbDsKLSAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotCi0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZLCBtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihudWxsKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7Ci0gICAgICAgICAgICBtUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04gPyAtMSA6IDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gRGVmZXIgZGlhbG9nIHVwZGF0ZXMgaWYgYSB1c2VyIGlzIGFkanVzdGluZyBhIHZvbHVtZSBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkIHw9IGFuaW1hdGU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtUm91dGUuaXNTZWxlY3RlZCgpIHx8IG1Sb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7Ci0gICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtQ3JlYXRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3LnNldFRleHQobVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFZpc2liaWxpdHkobVJvdXRlLmNhbkRpc2Nvbm5lY3QoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0SWNvbklzTG9hZGVkKSB7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChtQXJ0SWNvbkxvYWRlZEJpdG1hcCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBzZXQgYXJ0d29yayBpbWFnZSB3aXRoIHJlY3ljbGVkIGJpdG1hcDogIiArIG1BcnRJY29uTG9hZGVkQml0bWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0SW1hZ2VCaXRtYXAobUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEJhY2tncm91bmRDb2xvcihtQXJ0SWNvbkJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCk7Ci0gICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaXRtYXBSZWN5Y2xlZChCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBiaXRtYXAgIT0gbnVsbCAmJiBiaXRtYXAuaXNSZWN5Y2xlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgKG1EZXNjcmlwdGlvbiAhPSBudWxsIHx8IG1TdGF0ZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgbWFpbiBtZWRpYSBjb250cm9sbGVyIHdoaWNoIGluY2x1ZGVzIHBsYXliYWNrIGNvbnRyb2wgYW5kIG1hc3RlcgotICAgICAqIHZvbHVtZSBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGJvb2xlYW4gc2hvd1BsYXliYWNrQ29udHJvbCkgewotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgfHwgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgaGVpZ2h0ICs9IG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdUb3AoKQotICAgICAgICAgICAgICAgICAgICArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdCb3R0b20oKTsKLSAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9ICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtVm9sdW1lQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgJiYgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtRGl2aWRlclZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgewotICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcgb2YgdGhlIGNvbnRyb2wgbGF5b3V0IGFjY29yZGluZyB0byB0aGUgZGlzcGxheQotICAgICAgICAvLyBoZWlnaHQuCi0gICAgICAgIG1EaXZpZGVyVmlldy5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFCi0gICAgICAgICAgICAgICAgJiYgY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgJiYgIWNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5HT05FIDogVmlldy5WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodChmaW5hbCBib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB0aGUgdXBkYXRlIHVudGlsIHRoZSBmaXJzdCBsYXlvdXQgaGFzIG9jY3VycmVkLCBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUKLSAgICAgICAgLy8gb3ZlcmFsbCB2aXNpYmxlIGRpc3BsYXkgc2l6ZSBpbiB3aGljaCB0aGUgd2luZG93IHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0byBoYXMgYmVlbgotICAgICAgICAvLyBwb3NpdGlvbmVkIGluLgotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQucmVxdWVzdExheW91dCgpOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGluZykgewotICAgICAgICAgICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChhbmltYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGhlaWdodCBvZiB2aWV3cyBhbmQgaGlkZSBhcnR3b3JrIG9yIG1ldGFkYXRhIGlmIHNwYWNlIGlzIGxpbWl0ZWQuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gTWVhc3VyZSB0aGUgc2l6ZSBvZiB3aWRnZXRzIGFuZCBnZXQgdGhlIGhlaWdodCBvZiBtYWluIGNvbXBvbmVudHMuCi0gICAgICAgIGludCBvbGRIZWlnaHQgPSBnZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOwotICAgICAgICBkZWNvclZpZXcubWVhc3VyZSgKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgb2xkSGVpZ2h0KTsKLSAgICAgICAgaW50IGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSBpbnN0YW5jZW9mIEJpdG1hcERyYXdhYmxlKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYXJ0ID0gKChCaXRtYXBEcmF3YWJsZSkgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSkuZ2V0Qml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChhcnQuZ2V0V2lkdGgoKSwgYXJ0LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRTY2FsZVR5cGUoYXJ0LmdldFdpZHRoKCkgPj0gYXJ0LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZIDogSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfQ0VOVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBpbnQgdm9sdW1lR3JvdXBMaXN0Q291bnQgPSBtR3JvdXBNZW1iZXJSb3V0ZXMuc2l6ZSgpOwotICAgICAgICAvLyBTY2FsZSBkb3duIHZvbHVtZSBncm91cCBsaXN0IGl0ZW1zIGluIGxhbmRzY2FwZSBtb2RlLgotICAgICAgICBpbnQgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBnZXRHcm91cCgpID09IG51bGwgPyAwIDoKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdldEdyb3VwKCkuZ2V0Um91dGVzKCkuc2l6ZSgpOwotICAgICAgICBpZiAodm9sdW1lR3JvdXBMaXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCArPSBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICAgICAgfQotICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IE1hdGgubWluKGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0LCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0KTsKLSAgICAgICAgaW50IHZpc2libGVHcm91cExpc3RIZWlnaHQgPSBtSXNHcm91cEV4cGFuZGVkID8gZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgOiAwOwotCi0gICAgICAgIGludCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLSAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGRlY29yVmlldy5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKHZpc2libGVSZWN0KTsKLSAgICAgICAgLy8gSGVpZ2h0IG9mIG5vbi1jb250cm9sIHZpZXdzIGluIGRlY29yIHZpZXcuCi0gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGl0bGUgYmFyLCBidXR0b24gYmFyLCBhbmQgZGlhbG9nJ3MgdmVydGljYWwgcGFkZGluZyB3aGljaCBzaG91bGQgYmUKLSAgICAgICAgLy8gYWx3YXlzIHNob3duLgotICAgICAgICBpbnQgbm9uQ29udHJvbFZpZXdIZWlnaHQgPSBtRGlhbG9nQXJlYUxheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgLSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgLy8gTWF4aW11bSBhbGxvd2VkIGhlaWdodCBmb3IgY29udHJvbHMgdG8gZml0IHNjcmVlbi4KLSAgICAgICAgaW50IG1heGltdW1Db250cm9sVmlld0hlaWdodCA9IHZpc2libGVSZWN0LmhlaWdodCgpIC0gbm9uQ29udHJvbFZpZXdIZWlnaHQ7Ci0KLSAgICAgICAgLy8gU2hvdyBhcnR3b3JrIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIGFydFZpZXdIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUFydFZpZXcsIGFydFZpZXdIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0KSArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgPj0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gdmlzaWJsZUdyb3VwTGlzdEhlaWdodCArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFNob3cgdGhlIHBsYXliYWNrIGNvbnRyb2wgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkobVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKLSAgICAgICAgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodCgKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLQotICAgICAgICAvLyBMaW1pdCB0aGUgdm9sdW1lIGdyb3VwIGxpc3QgaGVpZ2h0IHRvIGZpdCB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPiBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIHZpc2libGVHcm91cExpc3RIZWlnaHQgLT0gKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IC0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KTsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0cyB3aXRoIHRoZSBjb21wdXRlZCBoZWlnaHRzLgotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBpZiAoYW5pbWF0ZSkgewotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyBNYXhpbWl6ZSB0aGUgd2luZG93IHNpemUgd2l0aCBhIHRyYW5zcGFyZW50IGxheW91dCBpbiBhZHZhbmNlIGZvciBzbW9vdGggYW5pbWF0aW9uLgotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUV4cGFuZGFibGVBcmVhTGF5b3V0LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYW5pbWF0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQoVmlldyBpdGVtKSB7Ci0gICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgIHNldExheW91dEhlaWdodChjb250YWluZXIsIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0KTsKLSAgICAgICAgVmlldyBpY29uID0gaXRlbS5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IGljb24uZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLndpZHRoID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgaWNvbi5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbmltYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIFZpZXcgdmlldywgaW50IHRhcmdldEhlaWdodCkgewotICAgICAgICBmaW5hbCBpbnQgc3RhcnRWYWx1ZSA9IGdldExheW91dEhlaWdodCh2aWV3KTsKLSAgICAgICAgZmluYWwgaW50IGVuZFZhbHVlID0gdGFyZ2V0SGVpZ2h0OwotICAgICAgICBBbmltYXRpb24gYW5pbSA9IG5ldyBBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQgaW50ZXJwb2xhdGVkVGltZSwgVHJhbnNmb3JtYXRpb24gdCkgewotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBzdGFydFZhbHVlIC0gKGludCkgKChzdGFydFZhbHVlIC0gZW5kVmFsdWUpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KHZpZXcsIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgfQotCi0gICAgdm9pZCBsb2FkSW50ZXJwb2xhdG9yKCkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID8gbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA6IG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKG1Sb3V0ZSkpIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0TWF4KG1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhtUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldFZpc2liaWxpdHkoZ2V0R3JvdXAoKSA9PSBudWxsID8gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgICAgICAgICA6IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRHcm91cCgpLmdldFJvdXRlcygpOwotICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5jbGVhcigpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVEaWFsb2dIZWxwZXIubGlzdFVub3JkZXJlZEVxdWFscyhtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcykpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQm91bmRNYXAobVZvbHVtZUdyb3VwTGlzdCwgbVZvbHVtZUdyb3VwQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwID0gYW5pbWF0ZQotICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJpdG1hcE1hcChtQ29udGV4dCwgbVZvbHVtZUdyb3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyKSA6IG51bGw7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNBZGRlZChtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc1JlbW92ZWQobUdyb3VwTWVtYmVyUm91dGVzLAotICAgICAgICAgICAgICAgICAgICByb3V0ZXMpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmFkZEFsbCgwLCBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMucmVtb3ZlQWxsKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUlzR3JvdXBFeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgKyBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXMocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtcyhmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCi0gICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgewotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbCgKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9PSBudWxsIHx8IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBncm91cFNpemVEZWx0YSA9IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAtIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpOwotICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0YXJ0QW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5wb3N0RGVsYXllZChtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEFuaW1hdGUgdmlzaWJsZSBpdGVtcyBmcm9tIHByZXZpb3VzIHBvc2l0aW9ucyB0byBjdXJyZW50IHBvc2l0aW9ucyBleGNlcHQgcm91dGVzIGFkZGVkCi0gICAgICAgIC8vIGp1c3QgYmVmb3JlLiBBZGRlZCByb3V0ZXMgd2lsbCByZW1haW4gaGlkZGVuIHVudGlsIHRyYW5zbGF0ZSBhbmltYXRpb24gZmluaXNoZXMuCi0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgUmVjdCBwcmV2aW91c0JvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRUb3AgPSB2aWV3LmdldFRvcCgpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzVG9wID0gcHJldmlvdXNCb3VuZHMgIT0gbnVsbCA/IHByZXZpb3VzQm91bmRzLnRvcAotICAgICAgICAgICAgICAgICAgICA6IChjdXJyZW50VG9wICsgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBncm91cFNpemVEZWx0YSk7Ci0gICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RvcCA9IGN1cnJlbnRUb3A7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCBwcmV2aW91c1RvcCAtIGN1cnJlbnRUb3AsIDApOwotICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKHRyYW5zbGF0aW9uQW5pbSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhbmltU2V0LnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgICAgICBwcmV2aW91c1JvdXRlQm91bmRNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCaXRtYXBNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGEgbWVtYmVyIHJvdXRlIGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlciwgaXQgY2FuIGJlIGVpdGhlciByZW1vdmVkIG9yIG1vdmVkIG91dCBvZiB0aGUKLSAgICAgICAgLy8gTGlzdFZpZXcgbGF5b3V0IGJvdW5kYXJ5LiBJbiB0aGlzIGNhc2UsIHVzZSB0aGUgcHJldmlvdXNseSBjYXB0dXJlZCBiaXRtYXBzIGZvcgotICAgICAgICAvLyBhbmltYXRpb24uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IGl0ZW0KLSAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm91dGVCaXRtYXBNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gaXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IGl0ZW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0QWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gZ3JvdXBTaXplRGVsdGEgKiBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihkZWx0YVkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIobmV3IE92ZXJsYXlPYmplY3QuT25BbmltYXRpb25FbmRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5hZGQocm91dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5hZGRPdmVybGF5T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCkgewotICAgICAgICBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCkgewotICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZmFkZUluQWRkZWRSb3V0ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZmluaXNoQW5pbWF0aW9uKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcpIHsKLSAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhZGVJbkFkZGVkUm91dGVzKCkgewotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbihib29sZWFuIGV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKGV4Y2VwdEFkZGVkUm91dGVzICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdmlldy5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMS4wZik7Ci0gICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RvcEFuaW1hdGlvbkFsbCgpOwotICAgICAgICBpZiAoIWV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSkgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1RpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YnRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFN1YnRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1N1YnRpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHN1YnRpdGxlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1N1YnRpdGxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVJvdXRlLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpCi0gICAgICAgICAgICAgICAgICAgICE9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IG51bGwgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdyAiTm8gbWVkaWEgc2VsZWN0ZWQiIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZSBwbGF5YmFjayBzdGF0ZS4KLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNUaXRsZSAmJiAhaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChoYXNUaXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1N1YnRpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1RpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3VidGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfQlVGRkVSSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0ID0gbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRyYXdhYmxlQXR0ciA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGljb25EZXNjUmVzSWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBhdXNlRHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVN0b3BEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGxheURyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFRoZW1lUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LCBpY29uRHJhd2FibGVBdHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQuZ2V0UmVzb3VyY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KGljb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BMQVkgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUEFVU0UgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgQUNUSU9OX1NUT1ApICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgJiYgcm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKQotICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExheW91dEhlaWdodChWaWV3IHZpZXcpIHsKLSAgICAgICAgcmV0dXJuIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0OwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldExheW91dEhlaWdodChWaWV3IHZpZXcsIGludCBoZWlnaHQpIHsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXJpRXF1YWxzKFVyaSB1cmkxLCBVcmkgdXJpMikgewotICAgICAgICBpZiAodXJpMSAhPSBudWxsICYmIHVyaTEuZXF1YWxzKHVyaTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmkxID09IG51bGwgJiYgdXJpMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkZXNpcmVkIGFydCBoZWlnaHQgdG8gZml0IGludG8gY29udHJvbGxlciBkaWFsb2cuCi0gICAgICovCi0gICAgaW50IGdldERlc2lyZWRBcnRIZWlnaHQoaW50IG9yaWdpbmFsV2lkdGgsIGludCBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICAgICAgLy8gRm9yIGxhbmRzY2FwZSBhcnQsIGZpdCB3aWR0aCB0byBkaWFsb2cgd2lkdGguCi0gICAgICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0IC8gb3JpZ2luYWxXaWR0aCArIDAuNWYpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBwb3J0cmFpdCBhcnQsIGZpdCBoZWlnaHQgdG8gMTY6OSByYXRpbyBjYXNlJ3MgaGVpZ2h0LgotICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIDkgLyAxNiArIDAuNWYpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCkgewotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwgfHwgIWlzSWNvbkNoYW5nZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmV0Y2hBcnRUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2suY2FuY2VsKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIG1GZXRjaEFydFRhc2sgPSBuZXcgRmV0Y2hBcnRUYXNrKCk7Ci0gICAgICAgIG1GZXRjaEFydFRhc2suZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBiaXRtYXAgbG9hZGVkIGJ5IEZldGNoQXJ0VGFzay4gV2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxvYWRlZCBiaXRtYXBzIGFyZSBhcHBsaWVkCi0gICAgICogdG8gYXJ0d29yaywgb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJMb2FkZWRCaXRtYXAoKSB7Ci0gICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSBmYWxzZTsKLSAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBudWxsOwotICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGEgbmV3IGFydCBpbWFnZSBpcyBkaWZmZXJlbnQgZnJvbSBhbiBvcmlnaW5hbCBhcnQgaW1hZ2UuIENvbXBhcmVzCi0gICAgICogQml0bWFwIG9iamVjdHMgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVzIFVSSXMgb25seSBpZiBiaXRtYXAgaXMgdW5jaGFuZ2VkIHdpdGgKLSAgICAgKiBhIG51bGwgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSWNvbkNoYW5nZWQoKSB7Ci0gICAgICAgIEJpdG1hcCBuZXdCaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICBVcmkgbmV3VXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgQml0bWFwIG9sZEJpdG1hcCA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uQml0bWFwIDogbUZldGNoQXJ0VGFzay5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBvbGRVcmkgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvblVyaSA6IG1GZXRjaEFydFRhc2suZ2V0SWNvblVyaSgpOwotICAgICAgICBpZiAob2xkQml0bWFwICE9IG5ld0JpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQml0bWFwID09IG51bGwgJiYgIXVyaUVxdWFscyhvbGRVcmksIG5ld1VyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgU2Vla0JhciB2b2x1bWVTbGlkZXIgPSBtVm9sdW1lU2xpZGVyTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgdm9sdW1lID0gcm91dGUuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblJvdXRlVm9sdW1lQ2hhbmdlZCgpLCByb3V0ZS5nZXRWb2x1bWU6IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9sdW1lU2xpZGVyICE9IG51bGwgJiYgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyQ29tcGF0LkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZUNvbXBhdCBzdGF0ZSkgewotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IGlkID0gdi5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCB8fCBpZCA9PSBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVyLnVuc2VsZWN0KGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCAmJiBtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgYWN0aW9uIGZvciBhY2Nlc3NpYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlNYW5hZ2VyICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aW9uRGVzY1Jlc0lkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudENvbXBhdC5UWVBFX0FOTk9VTkNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoYWN0aW9uRGVzY1Jlc0lkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVN0b3BUcmFja2luZ1RvdWNoID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGFzUGVuZGluZ1VwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucmVtb3ZlQ2FsbGJhY2tzKG1TdG9wVHJhY2tpbmdUb3VjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICAvLyBEZWZlciByZXNldHRpbmcgbVZvbHVtZVNsaWRlclRvdWNoZWQgdG8gYWxsb3cgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBhIGxpdHRsZSB0aW1lIHRvIHNldHRsZSBpbnRvIGl0cyBuZXcgc3RhdGUgYW5kIHB1Ymxpc2ggdGhlIGZpbmFsCi0gICAgICAgICAgICAvLyB2b2x1bWUgdXBkYXRlLgotICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5wb3N0RGVsYXllZChtU3RvcFRyYWNraW5nVG91Y2gsIFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Qcm9ncmVzc0NoYW5nZWQoKTogY2FsbGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUoIiArIHByb2dyZXNzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm91dGUucmVxdWVzdFNldFZvbHVtZShwcm9ncmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUdyb3VwQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKLSAgICAgICAgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUdyb3VwQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBvYmplY3RzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCBvYmplY3RzKTsKLSAgICAgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGZpbmFsIGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdiA9IExheW91dEluZmxhdGVyLmZyb20ocGFyZW50LmdldENvbnRleHQoKSkuaW5mbGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQodik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IHJvdXRlLmlzRW5hYmxlZCgpOwotCi0gICAgICAgICAgICAgICAgVGV4dFZpZXcgcm91dGVOYW1lID0gKFRleHRWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q29udGV4dCgpLCB2b2x1bWVTbGlkZXIsIG1Wb2x1bWVHcm91cExpc3QpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRUYWcocm91dGUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KHJvdXRlLCB2b2x1bWVTbGlkZXIpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRIaWRlVGh1bWIoIWlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KHJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhyb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcygxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHZvbHVtZUl0ZW1JY29uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJbWFnZVZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lSXRlbUljb24uc2V0QWxwaGEoaXNFbmFibGVkID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG92ZXJsYXkgYml0bWFwIGV4aXN0cywgcmVhbCB2aWV3IHNob3VsZCByZW1haW4gaGlkZGVuIHVudGlsCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkobUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5jb250YWlucyhyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUm91dGVzIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB3aWxsIGJlIGludmlzaWJsZSB1bnRpbCBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdi5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGZXRjaEFydFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQml0bWFwPiB7Ci0gICAgICAgIC8vIFNob3cgYW5pbWF0aW9uIG9ubHkgd2hlbiBmZXRjaGluZyB0YWtlcyBhIGxvbmcgdGltZS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTID0gMTIwTDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtSWNvbkJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTWlsbGlzOwotCi0gICAgICAgIEZldGNoQXJ0VGFzaygpIHsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZldGNoIHRoZSBnaXZlbiBhcnQgYml0bWFwIGJlY2F1c2UgaXQncyBhbHJlYWR5IHJlY3ljbGVkLiIpOwotICAgICAgICAgICAgICAgIGJpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSWNvbkJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1JY29uVXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvbkJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBhcmcpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1JY29uQml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnQgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUXVlcnkgYXJ0IHNpemUuCi0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm91dFdpZHRoID09IDAgfHwgb3B0aW9ucy5vdXRIZWlnaHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gcmVzdGFydCBhcnQgZGVjb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHRvIHJld2luZCB0aGUgc3RyZWFtLCB0cnkgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzaXplIHRvIGRlY29kZSB0aGUgYXJ0IGFuZCBwb3NzaWJseSByZXNpemUgaXQuCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXFIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KG9wdGlvbnMub3V0V2lkdGgsIG9wdGlvbnMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJhdGlvID0gb3B0aW9ucy5vdXRIZWlnaHQgLyByZXFIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5TYW1wbGVTaXplID0gTWF0aC5tYXgoMSwgSW50ZWdlci5oaWdoZXN0T25lQml0KHJhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcnQgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChhcnQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgdXNlIHJlY3ljbGVkIGJpdG1hcDogIiArIGFydCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwgJiYgYXJ0LmdldFdpZHRoKCkgPCBhcnQuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBhcnQgcmVxdWlyZXMgZG9taW5hbnQgY29sb3IgYXMgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgICAgICAgICAgICBQYWxldHRlIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZS5CdWlsZGVyKGFydCkubWF4aW11bUNvbG9yQ291bnQoMSkuZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmdldCgwKS5nZXRSZ2IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCaXRtYXAgYXJ0KSB7Ci0gICAgICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25CaXRtYXAsIG1JY29uQml0bWFwKQotICAgICAgICAgICAgICAgICAgICB8fCAhT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25VcmksIG1JY29uVXJpKSkgewotICAgICAgICAgICAgICAgIG1BcnRJY29uQml0bWFwID0gbUljb25CaXRtYXA7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBhcnQ7Ci0gICAgICAgICAgICAgICAgbUFydEljb25VcmkgPSBtSWNvblVyaTsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZU1pbGxpczsKLSAgICAgICAgICAgICAgICAvLyBMb2FkZWQgYml0bWFwIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgbmV4dCB1cGRhdGUKLSAgICAgICAgICAgICAgICB1cGRhdGUoZWxhcHNlZFRpbWVNaWxsaXMgPiBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUoVXJpIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHMoc2NoZW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0ZJTEUuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbm4uc2V0Q29ubmVjdFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRSZWFkVGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZDc0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgbURpYWxvZzsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICByZXR1cm4gbURpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLmNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVhZjM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lZGlhIHJvdXRlCi0gKiBjaG9vc2VyIGFuZCBjb250cm9sbGVyIGRpYWxvZ3MgYXMgbmVlZGVkLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBwcm92aWRpbmcgYSBzdWJjbGFzcyBvZiB0aGUKLSAqIGRpYWxvZyBmYWN0b3J5IHRvIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiNzZXREaWFsb2dGYWN0b3J5IHNldERpYWxvZ0ZhY3Rvcnl9IG1ldGhvZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBzRGVmYXVsdCA9IG5ldyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBzRGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZjdiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIGZyYW1ld29yayBzaG91bGQgc2V0IHRoZSBkaWFsb2cgd2lkdGggcHJvcGVybHksIGJ1dCBzb21laG93IGl0IGRvZXNuJ3Qgd29yaywgaGVuY2UKLSAgICAgKiBkdXBsaWNhdGluZyBhIHNpbWlsYXIgbG9naWMgaGVyZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB3aWR0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaWFsb2dXaWR0aChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgYm9vbGVhbiBpc1BvcnRyYWl0ID0gbWV0cmljcy53aWR0aFBpeGVscyA8IG1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFZhbHVlKGlzUG9ydHJhaXQKLSAgICAgICAgICAgICAgICA/IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yCi0gICAgICAgICAgICAgICAgOiBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRElNRU5TSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RGltZW5zaW9uKG1ldHJpY3MpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0ZSQUNUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RnJhY3Rpb24obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy53aWR0aFBpeGVscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyByZWdhcmRsZXNzIG9mIG9yZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QxIEEgbGlzdAotICAgICAqIEBwYXJhbSBsaXN0MiBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgbGlzdDF9Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHR3byBsaXN0cyBoYXZlIGV4YWN0bHkgc2FtZSBpdGVtcyByZWdhcmRsZXNzIG9mIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBsaXN0VW5vcmRlcmVkRXF1YWxzKExpc3Q8RT4gbGlzdDEsIExpc3Q8RT4gbGlzdDIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQxID0gbmV3IEhhc2hTZXQ8PihsaXN0MSk7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0MiA9IG5ldyBIYXNoU2V0PD4obGlzdDIpOwotICAgICAgICByZXR1cm4gc2V0MS5lcXVhbHMoc2V0Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYWZ0ZXItbGlzdCBidXQgYmVmb3JlLWxpc3QsIHdoaWNoIG1lYW5zIG5ld2x5IGFkZGVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIG5ld2x5IGFkZGVkIGl0ZW1zIHdoaWxlCi0gICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zQWRkZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGFmdGVyKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChiZWZvcmUpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAotICAgICAqIGJlZm9yZS1saXN0IGJ1dCBhZnRlci1saXN0LCB3aGljaCBtZWFucyByZW1vdmVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIHJlbW92ZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNSZW1vdmVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihiZWZvcmUpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGFmdGVyKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1SZWN0IG1hcCB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgbWVtYmVyCi0gICAgICogaXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBib3VuZHMgb2YgdGhlaXIgdmlld3MgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgUmVjdD4gZ2V0SXRlbUJvdW5kTWFwKExpc3RWaWV3IGxpc3RWaWV3LAotICAgICAgICAgICAgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBSZWN0PiBpdGVtQm91bmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJvdW5kTWFwLnB1dChpdGVtLAotICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdCh2aWV3LmdldExlZnQoKSwgdmlldy5nZXRUb3AoKSwgdmlldy5nZXRSaWdodCgpLCB2aWV3LmdldEJvdHRvbSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1Cb3VuZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1CaXRtYXBEcmF3YWJsZSBtYXAgd2hpY2ggc3RvcmVzIHNuYXBzaG90cwotICAgICAqIG9mIG1lbWJlciBpdGVtcyBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIHNuYXBzaG90cyBvZiB0aGVpciB2aWV3cyBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGdldEl0ZW1CaXRtYXBNYXAoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcsIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0gICAgICAgIEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGl0ZW1CaXRtYXBNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJpdG1hcE1hcC5wdXQoaXRlbSwgZ2V0Vmlld0JpdG1hcChjb250ZXh0LCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1CaXRtYXBNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRHJhd2FibGUgZ2V0Vmlld0JpdG1hcChDb250ZXh0IGNvbnRleHQsIFZpZXcgdmlldykgewotICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOwotICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBEcmF3YWJsZShjb250ZXh0LmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVlMTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGRpc2NvdmVyeSBmcmFnbWVudC4KLSAqIDxwPgotICogVGhpcyBmcmFnbWVudCB0YWtlcyBjYXJlIG9mIHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgZm9yIG1lZGlhIHJvdXRlIGRpc2NvdmVyeQotICogZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdGFydCBvblN0YXJ0KCl9IHBoYXNlCi0gKiBhbmQgcmVtb3ZpbmcgaXQgZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdG9wIG9uU3RvcCgpfSBwaGFzZS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIHJvdXRlIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcwotICogdG8gZGlzY292ZXIuICBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rICNvbkNyZWF0ZUNhbGxiYWNrfSB0bwotICogcHJvdmlkZSB0aGUge0BsaW5rIE1lZGlhUm91dGVyfSBjYWxsYmFjayB0byByZWdpc3Rlci4KLSAqIDwvcD48cD4KLSAqIE5vdGUgdGhhdCB0aGUgZGlzY292ZXJ5IGNhbGxiYWNrIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlCi0gKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXN9Ci0gKiB3aGlsZSBpdCBpcyByZWdpc3RlcmVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0TWVkaWFSb3V0ZXIoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICByZXR1cm4gbVJvdXRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVyKCkgewotICAgICAgICBpZiAobVJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30KLSAgICAgKiB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBjYWxsYmFjayBkb2VzIG5vdGhpbmcuICBUaGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogc3VwcGx5IGl0cyBvd24gY2FsbGJhY2suCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNhbGxiYWNrLCBvciBudWxsIGlmIG5vIGNhbGxiYWNrIHNob3VsZCBiZSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlci5DYWxsYmFjayBvbkNyZWF0ZUNhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeyB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBwcmVwYXJlIHRoZSBjYWxsYmFjayBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9IGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVzaXJlZCBjYWxsYmFjayBmbGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICBtQ2FsbGJhY2sgPSBvbkNyZWF0ZUNhbGxiYWNrKCk7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE5NWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkNvbnRleHRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLS8qKgotICogQ2hldnJvbi9DYXJldCBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIGdyb3VwIHZvbHVtZSBsaXN0IHdpdGggYW5pbWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24gewotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBTdHJpbmcgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb247Ci0gICAgZmluYWwgU3RyaW5nIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb247Ci0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIE9uQ2xpY2tMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9leHBhbmQpOwotICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfY29sbGFwc2UpOwotCi0gICAgICAgIENvbG9yRmlsdGVyIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgZGVmU3R5bGVBdHRyKSwKLSAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwKTsKLSAgICAgICAgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCk7Ci0KLSAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuZ2V0RnJhbWUoMCkpOwotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOwotCi0gICAgICAgIHN1cGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DbGljayh2aWV3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZDIwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLQotLyoqCi0gKiBWb2x1bWUgc2xpZGVyIHdpdGggc2hvd2luZywgaGlkaW5nLCBhbmQgYXBwbHlpbmcgYWxwaGEgc3VwcG9ydHMgdG8gdGhlIHRodW1iLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciBleHRlbmRzIFNlZWtCYXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IaWRlVGh1bWI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtVGh1bWI7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0gICAgICAgIGludCBhbHBoYSA9IGlzRW5hYmxlZCgpID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpOwotCi0gICAgICAgIC8vIFRoZSB0aHVtYiBkcmF3YWJsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZHJhd2FibGVzIGFuZCBpdHMgY3VycmVudCBkcmF3YWJsZXMgYXJlIGNoYW5nZWQgcGVyCi0gICAgICAgIC8vIHN0YXRlLiBBcHBseSB0aGUgY29sb3IgZmlsdGVyIGFuZCBhbHBoYSBvbiBldmVyeSBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIGlmIChtVGh1bWIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRodW1iLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0QWxwaGEoYWxwaGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRBbHBoYShhbHBoYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGh1bWIoRHJhd2FibGUgdGh1bWIpIHsKLSAgICAgICAgbVRodW1iID0gdGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIHRodW1iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpZGVUaHVtYihib29sZWFuIGhpZGVUaHVtYikgewotICAgICAgICBpZiAobUhpZGVUaHVtYiA9PSBoaWRlVGh1bWIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGlkZVRodW1iID0gaGlkZVRodW1iOwotICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdm9sdW1lIHNsaWRlciBjb2xvci4gVGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QgbmV4dCB0aW1lIGRyYXdhYmxlIHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudCwgb3RoZXJ3aXNlIHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhciB3aWxsIGJlIHNlZW4gdGhyb3VnaAotICAgICAqIHRoZSB0aHVtYi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIGlmIChtQ29sb3IgPT0gY29sb3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlZvbHVtZSBzbGlkZXIgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50OiAjIiArIEludGVnZXIudG9IZXhTdHJpbmcoY29sb3IpKTsKLSAgICAgICAgfQotICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2YwNDJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLkNvbG9yVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9DT05UUkFTVCA9IDMuMGY7Ci0KLSAgICBASW50RGVmKHtDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQsIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORH0pCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDb250cm9sbGVyQ29sb3JUeXBlIHt9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCA9IDB4REUwMDAwMDA7IC8qIE9wYWNpdHkgb2YgODclICovCi0gICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQgPSBDb2xvci5XSElURTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBBcHBseSBiYXNlIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOwotCi0gICAgICAgIC8vIEFwcGx5IGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUuCi0gICAgICAgIGludCBzdHlsZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGFyZSB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIHByZXBhcmUKLSAgICAgKiB0aGUgY29udGV4dCBhbmQgdGhlbWUgZm9yIGEgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgKHRoZSBsYXR0ZXIgbWV0aG9kIHJlbGllcyBvbiB0aGUKLSAgICAgKiBmb3JtZXIgbWV0aG9kIHRvIHByb3Blcmx5IHByZXBhcmUgdGhlIGNvbnRleHQpOgotICAgICAqICAgc3VwZXIoY29udGV4dCA9IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoY29udGV4dCwgdGhlbWUpLAotICAgICAqICAgICAgICAgICBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShjb250ZXh0KSk7Ci0gICAgICoKLSAgICAgKiBJdCB3aWxsIGFwcGx5IHRoZW1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHN0eWxlIGxvb2t1cHMgd2lsbCBiZSBkb25lIGluIHJldmVyc2UpOgotICAgICAqICAgMSkgQ3VycmVudCB0aGVtZQotICAgICAqICAgMikgU3VwcGxpZWQgdGhlbWUKLSAgICAgKiAgIDMpIEJhc2UgTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICogICA0KSBDdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLCBpZiBwcm92aWRlZAotICAgICAqLwotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUsIGJvb2xlYW4gYWxlcnREaWFsb2cpIHsKLSAgICAgICAgLy8gMSkgQ3VycmVudCB0aGVtZSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGNvbnRleHQKLQotICAgICAgICAvLyAyKSBJZiBubyB0aGVtZSBpcyBzdXBwbGllZCwgbG9vayBpdCB1cCBmcm9tIHRoZSBjb250ZXh0IChkaWFsb2dUaGVtZS9hbGVydERpYWxvZ1RoZW1lKQotICAgICAgICBpZiAodGhlbWUgPT0gMCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICFhbGVydERpYWxvZyA/IGFuZHJvaWQuUi5hdHRyLmRpYWxvZ1RoZW1lIDogYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dUaGVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICAgQXBwbHkgaXQKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKTsKLQotICAgICAgICAvLyAzKSBJZiBhIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBhcHBseSB0aGUgYmFzZSB0aGVtZQotICAgICAgICBpZiAoZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLgotICAgIHN0YXRpYyBpbnQgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDQpIEFwcGx5IHRoZSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICAgIGludCB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyAzKSBObyBjdXN0b20gTWVkaWFSb3V0ZXIgdGhlbWUgd2FzIHByb3ZpZGVkIHNvIGFwcGx5IHRoZSBiYXNlIHRoZW1lIGluc3RlYWQKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0gICAgLy8gRU5ELiBQcmV2aW91cyB0d28gbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4KLQotICAgIHN0YXRpYyBpbnQgZ2V0VGhlbWVSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCBhdHRyKSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpID8gdmFsdWUucmVzb3VyY2VJZCA6IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZsb2F0IGdldERpc2FibGVkQWxwaGEoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuZGlzYWJsZWRBbHBoYSwgdmFsdWUsIHRydWUpCi0gICAgICAgICAgICAgICAgPyB2YWx1ZS5nZXRGbG9hdCgpIDogMC41ZjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQENvbnRyb2xsZXJDb2xvclR5cGUgaW50IGdldENvbnRyb2xsZXJDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gMHhGRjAwMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQsIHByaW1hcnlDb2xvcikKLSAgICAgICAgICAgICAgICA+PSBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIHJldHVybiBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldEJ1dHRvblRleHRDb2xvcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JCYWNrZ3JvdW5kKTsKLQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChwcmltYXJ5Q29sb3IsIGJhY2tncm91bmRDb2xvcikgPCBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY29sb3JBY2NlbnQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy4KLSAgICAgICAgICAgIHJldHVybiBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQWNjZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbG9yOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFZpZXcgbWFpbkNvbnRyb2xzLCBWaWV3IGdyb3VwQ29udHJvbHMsIGJvb2xlYW4gaGFzR3JvdXApIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IHByaW1hcnlEYXJrQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeURhcmspOwotICAgICAgICBpZiAoaGFzR3JvdXAgJiYgZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaG93aW5nIGRhcmsgY29udHJvbHMgaW4gYSBwb3NzaWJseSBkYXJrIChpLmUuIHRoZSBwcmltYXJ5IGRhcmspLCBtb2RlbAotICAgICAgICAgICAgLy8gdGhlIHdoaXRlIGRpYWxvZyBhbmQgdXNlIHRoZSBwcmltYXJ5IGNvbG9yIGZvciB0aGUgZ3JvdXAgY29udHJvbHMuCi0gICAgICAgICAgICBwcmltYXJ5RGFya0NvbG9yID0gcHJpbWFyeUNvbG9yOwotICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIH0KLSAgICAgICAgbWFpbkNvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5Q29sb3IpOwotICAgICAgICBncm91cENvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5RGFya0NvbG9yKTsKLSAgICAgICAgLy8gQWxzbyBzdG9yZSB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGhlIHZpZXcgdGFncy4gVGhleSBhcmUgdXNlZCBpbgotICAgICAgICAvLyBzZXRWb2x1bWVTbGlkZXJDb2xvcigpIGJlbG93LgotICAgICAgICBtYWluQ29udHJvbHMuc2V0VGFnKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0VGFnKHByaW1hcnlEYXJrQ29sb3IpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldFZvbHVtZVNsaWRlckNvbG9yKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciwgVmlldyBiYWNrZ3JvdW5kVmlldykgewotICAgICAgICBpbnQgY29udHJvbGxlckNvbG9yID0gZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApOwotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29udHJvbGxlckNvbG9yKSAhPSAweEZGKSB7Ci0gICAgICAgICAgICAvLyBDb21wb3NpdGUgd2l0aCB0aGUgYmFja2dyb3VuZCBpbiBvcmRlciBub3QgdG8gc2hvdyB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHRodW1iLgotICAgICAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IChpbnQpIGJhY2tncm91bmRWaWV3LmdldFRhZygpOwotICAgICAgICAgICAgY29udHJvbGxlckNvbG9yID0gQ29sb3JVdGlscy5jb21wb3NpdGVDb2xvcnMoY29udHJvbGxlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHZvbHVtZVNsaWRlci5zZXRDb2xvcihjb250cm9sbGVyQ29sb3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWdodFRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgLy8gVE9ETyhzdW5nc29vKTogU3dpdGNoIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5pc0xpZ2h0VGhlbWUKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQuUi5hdHRyLmlzTGlnaHRUaGVtZSwKLSAgICAgICAgICAgICAgICB2YWx1ZSwgdHJ1ZSkgJiYgdmFsdWUuZGF0YSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRUaGVtZUNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlLCBpbnQgYXR0cikgewotICAgICAgICBpZiAoc3R5bGUgIT0gMCkgewotICAgICAgICAgICAgaW50W10gYXR0cnMgPSB7IGF0dHIgfTsKLSAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoc3R5bGUsIGF0dHJzKTsKLSAgICAgICAgICAgIGludCBjb2xvciA9IHRhLmdldENvbG9yKDAsIDApOwotICAgICAgICAgICAgdGEucmVjeWNsZSgpOwotICAgICAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKHZhbHVlLnJlc291cmNlSWQgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IodmFsdWUucmVzb3VyY2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmRhdGE7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRSb3V0ZXJUaGVtZUlkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgdGhlbWVJZDsKLSAgICAgICAgaWYgKGlzTGlnaHRUaGVtZShjb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRfRGFya0NvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRDb250cm9sUGFuZWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGVtZUlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkZWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIExpc3RWaWV3IHdoaWNoIGhhcyBhbiBhZGRpdGlvbmFsIG92ZXJsYXkgbGF5ZXIuIHtAbGluayBCaXRtYXBEcmF3YWJsZX0KLSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgbGF5ZXIgYW5kIGNhbiBiZSBhbmltYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE92ZXJsYXlMaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheU9iamVjdD4gbU92ZXJsYXlPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3ZlcmxheU9iamVjdChPdmVybGF5T2JqZWN0IG9iamVjdCkgewotICAgICAgICBtT3ZlcmxheU9iamVjdHMuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0LmlzQW5pbWF0aW9uU3RhcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnN0YXJ0QW5pbWF0aW9uKGdldERyYXdpbmdUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uQWxsKCkgewotICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7Ci0gICAgICAgICAgICBvYmplY3Quc3RvcEFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtT3ZlcmxheU9iamVjdHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8T3ZlcmxheU9iamVjdD4gaXQgPSBtT3ZlcmxheU9iamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBvYmplY3QuZ2V0Qml0bWFwRHJhd2FibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0bWFwLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QudXBkYXRlKGdldERyYXdpbmdUaW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzaG93biBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlPYmplY3QgewotICAgICAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1CaXRtYXA7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUN1cnJlbnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgUmVjdCBtQ3VycmVudEJvdW5kczsKLSAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZWx0YVk7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVN0YXJ0QWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1FbmRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvbkVuZGVkOwotICAgICAgICBwcml2YXRlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0KEJpdG1hcERyYXdhYmxlIGJpdG1hcCwgUmVjdCBzdGFydFJlY3QpIHsKLSAgICAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0OwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMgPSBuZXcgUmVjdChzdGFydFJlY3QpOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBiaXRtYXAgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEJpdG1hcERyYXdhYmxlIHRoYXQgdGhpcyBvYmplY3QgaGFzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJpdG1hcERyYXdhYmxlIGdldEJpdG1hcERyYXdhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaGFzIHN0YXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW5pbWF0aW9uU3RhcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciB2YXJ5aW5nIGFscGhhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRBbHBoYSBTdGFydGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiwgd2hlcmUgMS4wIG1lYW5zCi0gICAgICAgICAqIGZ1bGx5IG9wYXF1ZSBhbmQgMC4wIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LgotICAgICAgICAgKiBAcGFyYW0gZW5kQWxwaGEgRW5kaW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbHBoYUFuaW1hdGlvbihmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgbVN0YXJ0QWxwaGEgPSBzdGFydEFscGhhOwotICAgICAgICAgICAgbUVuZEFscGhhID0gZW5kQWxwaGE7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgbW92aW5nIG9iamVjdHMgdmVydGljYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhWSBEaXN0YW5jZSB0byBtb3ZlIGluIHBpeGVscy4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihpbnQgZGVsdGFZKSB7Ci0gICAgICAgICAgICBtRGVsdGFZID0gZGVsdGFZOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgbGFzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgdGhpcyBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRvciB3aGljaCBkZWZpbmVzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUKLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKLSAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCaW5kcyBhbiBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZC4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIoT25BbmltYXRpb25FbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgc2V0cyB0aGUgc3RhcnQgdGltZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIHRvIGJlIHNldCBpbiBNaWxsaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RvcHMgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3VycmVudCBib3VuZHMgYW5kIGFscGhhIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lLmluIG1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGxvbmcgY3VycmVudFRpbWUpIHsKLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25FbmRlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRUaW1lID0gKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyAoZmxvYXQpIG1EdXJhdGlvbjsKLSAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgbm9ybWFsaXplZFRpbWUpKTsKLSAgICAgICAgICAgIGlmICghbUlzQW5pbWF0aW9uU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gMC4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGludGVycG9sYXRlZFRpbWUgPSAobUludGVycG9sYXRvciA9PSBudWxsKSA/IG5vcm1hbGl6ZWRUaW1lCi0gICAgICAgICAgICAgICAgICAgIDogbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKG5vcm1hbGl6ZWRUaW1lKTsKLSAgICAgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobURlbHRhWSAqIGludGVycG9sYXRlZFRpbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMudG9wID0gbVN0YXJ0UmVjdC50b3AgKyBkZWx0YVk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy5ib3R0b20gPSBtU3RhcnRSZWN0LmJvdHRvbSArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50QWxwaGEgPSBtU3RhcnRBbHBoYSArIChtRW5kQWxwaGEgLSBtU3RhcnRBbHBoYSkgKiBpbnRlcnBvbGF0ZWRUaW1lOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25TdGFydGVkICYmIG5vcm1hbGl6ZWRUaW1lID49IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAhbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYW5pbWF0aW9uIGxpc3RlbmVyIHRoYXQgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BbmltYXRpb25FbmRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzOWJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNykKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuTXIxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHdhcwotICAgICAgICAgICAgLy8gYWRkZWQgaW4gQVBJIDE3LiBIb3dldmVyLCBzb21lIGZhY3RvcnkgcmVsZWFzZXMgb2YgSkIgTVIxIG1pc3NlZCBpdC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGdldCBwcmVzZW50YXRpb24gZGlzcGxheSBmb3IgdGhlIHJvdXRlLiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgdmVyc2lvbiBvZiBNZWRpYVJvdXRlci5hZGRDYWxsYmFjaygpIHRoYXQgYWNjZXB0cyBhCi0gICAgICogZmxhZyB0byBwZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMSBzbyB3ZSBuZWVkIHRvIGZvcmNlCi0gICAgICogd2lmaSBkaXNwbGF5IHNjYW5zIGRpcmVjdGx5IHRocm91Z2ggdGhlIERpc3BsYXlNYW5hZ2VyLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICAvLyBUaW1lIGJldHdlZW4gd2lmaSBkaXNwbGF5IHNjYW5zIHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcgaW4gbWlsbGlzZWNvbmRzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwgPSAxNTAwMDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyIG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2NhbldpZmlEaXNwbGF5c01ldGhvZDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXM7Ci0KLSAgICAgICAgcHVibGljIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IChEaXNwbGF5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRElTUExBWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QgPSBEaXNwbGF5TWFuYWdlci5jbGFzcy5nZXRNZXRob2QoInNjYW5XaWZpRGlzcGxheXMiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMoaW50IHJvdXRlVHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE9uIEpCIE1SMSwgdGhlcmUgaXMgbm8gQVBJIHRvIHNjYW4gd2lmaSBkaXNwbGF5IHJvdXRlcy4KLSAgICAgICAgICAgIC8vIEluc3RlYWQgd2UgbXVzdCBtYWtlIGEgZGlyZWN0IGNhbGwgaW50byB0aGUgRGlzcGxheU1hbmFnZXIgdG8gc2NhbgotICAgICAgICAgICAgLy8gd2lmaSBkaXNwbGF5cyBvbiB0aGlzIHZlcnNpb24gYnV0IG9ubHkgd2hlbiBsaXZlIHZpZGVvIHJvdXRlcyBhcmUgcmVxdWVzdGVkLgotICAgICAgICAgICAgLy8gU2VlIGFsc28gdGhlIEplbGx5YmVhbk1yMkltcGwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAvLyBUaGlzIHdhcyBmaXhlZCBpbiBKQiBNUjIgYnkgYWRkaW5nIGEgbmV3IG92ZXJsb2FkIG9mIGFkZENhbGxiYWNrKCkgdG8KLSAgICAgICAgICAgIC8vIGVuYWJsZSBhY3RpdmUgc2Nhbm5pbmcgb24gcmVxdWVzdC4KLSAgICAgICAgICAgIGlmICgocm91dGVUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cyBiZWNhdXNlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkRpc3BsYXlNYW5hZ2VyLnNjYW5XaWZpRGlzcGxheXMoKSBtZXRob2QgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZC5pbnZva2UobURpc3BsYXlNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBpc0Nvbm5lY3RpbmcoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIElzQ29ubmVjdGluZ1dvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3RhdHVzQ29kZU1ldGhvZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0KLSAgICAgICAgcHVibGljIElzQ29ubmVjdGluZ1dvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgc3RhdHVzQ29ubmVjdGluZ0ZpZWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldEZpZWxkKCJTVEFUVVNfQ09OTkVDVElORyIpOwotICAgICAgICAgICAgICAgIG1TdGF0dXNDb25uZWN0aW5nID0gc3RhdHVzQ29ubmVjdGluZ0ZpZWxkLmdldEludChudWxsKTsKLSAgICAgICAgICAgICAgICBtR2V0U3RhdHVzQ29kZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRNZXRob2QoImdldFN0YXR1c0NvZGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpZiAobUdldFN0YXR1c0NvZGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gKEludGVnZXIpbUdldFN0YXR1c0NvZGVNZXRob2QuaW52b2tlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSBub3QgY29ubmVjdGluZy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2tQcm94eTxUPiB7Ci0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDM1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgxOCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIyIHsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmosIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzQ29ubmVjdGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI1OWI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTYpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbiI7Ci0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwOwotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTID0gMHgxMDA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfT1VUX0JMVUVUT09USCA9IDB4ODAgfCAweDEwMCB8IDB4MjAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX0FVRElPID0gMHgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9WSURFTyA9IDB4MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX1VTRVIgPSAweDAwODAwMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1JPVVRFX1RZUEVTID0KLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8KLSAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9ST1VURVJfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRSb3V0ZUF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcmllcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Q2F0ZWdvcnlDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldENhdGVnb3J5QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0ZWRSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZSkgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0U2VsZWN0ZWRSb3V0ZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuc2VsZWN0Um91dGUodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJvdXRlQ2F0ZWdvcnkoT2JqZWN0IHJvdXRlck9iaiwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGlzR3JvdXBhYmxlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVSb3V0ZUNhdGVnb3J5KG5hbWUsIGlzR3JvdXBhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZUNhbGxiYWNrUHJveHk8Vm9sdW1lQ2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjaGVja1JvdXRlZFRvQmx1ZXRvb3RoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBhdWRpb01hbmFnZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgImdldERldmljZXNGb3JTdHJlYW0iLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgaW50IGRldmljZSA9IChJbnRlZ2VyKSBtZXRob2QuaW52b2tlKGF1ZGlvTWFuYWdlciwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICByZXR1cm4gKGRldmljZSAmIERFVklDRV9PVVRfQkxVRVRPT1RIKSAhPSAwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFN0YXR1cyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDYXRlZ29yeShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRDYXRlZ29yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0SWNvbkRyYXdhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZU1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRhZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWcoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgdGFnKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRUYWcodGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRHcm91cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVPYmogaW5zdGFuY2VvZiBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlR3JvdXAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHcm91cGVkUm91dGVzKE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cClncm91cE9iajsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdyb3VwLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGdyb3VwLmdldFJvdXRlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIG5hbWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBzdGF0dXMpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqLCBEcmF3YWJsZSBpY29uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0SWNvbkRyYXdhYmxlKGljb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmosIGludCB0eXBlKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tUeXBlKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaiwgaW50IHN0cmVhbSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVNYXgodm9sdW1lTWF4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUhhbmRsaW5nKHZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB2b2x1bWVDYWxsYmFja09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayl2b2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVtb3RlQ29udHJvbENsaWVudChPYmplY3Qgcm91dGVPYmosIE9iamVjdCByY2NPYmopIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRSZW1vdGVDb250cm9sQ2xpZW50KAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50KXJjY09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ2F0ZWdvcnkgewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCBjYXRlZ29yeU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldE5hbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFJvdXRlcyhvdXQpOwotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXBhYmxlKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5pc0dyb3VwYWJsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgZm9yIGxpbWl0YXRpb25zIG9mIHNlbGVjdFJvdXRlKCkgb24gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2VsZWN0Um91dGVJbnRNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QgPSBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RSb3V0ZUludCIsIGludC5jbGFzcywgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKLQotICAgICAgICAgICAgaW50IHJvdXRlVHlwZXMgPSByb3V0ZS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgUk9VVEVfVFlQRV9VU0VSKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi11c2VyIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAvLyBPbiBKQiBhbmQgSkIgTVIxLCB0aGUgc2VsZWN0Um91dGUoKSBBUEkgb25seSBzdXBwb3J0cyBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHVzZXIgcm91dGVzLiAgU28gaW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBoaWRkZW4gc2VsZWN0Um91dGVJbnQoKQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBvbiB0aGVzZSB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBsaW1pdGF0aW9uIHdhcyByZW1vdmVkIGluIEpCIE1SMi4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlSW50TWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZC5pbnZva2Uocm91dGVyLCB0eXBlcywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZXNzIQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIHBsYXRmb3JtIGlzIG1pc3NpbmcgdGhlIHNlbGVjdFJvdXRlSW50KCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1ldGhvZC4gIE1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRGVmYXVsdCBoYW5kbGluZy4KLSAgICAgICAgICAgIHJvdXRlci5zZWxlY3RSb3V0ZSh0eXBlcywgcm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBnZXREZWZhdWx0Um91dGUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoImdldFN5c3RlbUF1ZGlvUm91dGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kLmludm9rZShyb3V0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCB0aGUgbWV0aG9kIG9yIGl0IGRvZXMgbm90IHdvcmsuCi0gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHJvdXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLSAgICAgICAgICAgIHJldHVybiByb3V0ZXIuZ2V0Um91dGVBdCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZCh0eXBlLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAsIGludCBpbmRleCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVHcm91cGVkKHJvdXRlLCBncm91cCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuZ3JvdXBlZChyb3V0ZSwgZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFZvbHVtZUNhbGxiYWNrUHJveHk8VCBleHRlbmRzIFZvbHVtZUNhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHJvdXRlLCB2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KHJvdXRlLCBkaXJlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDllNzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIG1lZGlhIGNvbnRyb2wgaW50ZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBkZWNsYXJlcyBhIHNldCBvZiBzdGFuZGFyZCBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIGFuZCBhY3Rpb25zIHRoYXQKLSAqIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgbWVkaWEgcm91dGVzIGFuZCBjb250cm9sIHRoZW0uCi0gKiA8L3A+Ci0gKgotICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXM8L2gzPgotICogPHA+Ci0gKiBNZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIHNwZWNpZnkgbWVhbnMgYnkgd2hpY2ggYXBwbGljYXRpb25zIGNhbgotICogc2VuZCBtZWRpYSB0byB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZS4gIENhdGVnb3JpZXMgYXJlIHNvbWV0aW1lcyByZWZlcnJlZAotICogdG8gYXMgZGVzY3JpYmluZyAidHlwZXMiIG9yICJraW5kcyIgb2Ygcm91dGVzLgotICogPC9wPjxwPgotICogRm9yIGV4YW1wbGUsIGlmIGEgcm91dGUgc3VwcG9ydHMgdGhlIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFjayBjYXRlZ29yeX0sCi0gKiB0aGVuIGFuIGFwcGxpY2F0aW9uIGNhbiBhc2sgaXQgdG8gcGxheSBtZWRpYSByZW1vdGVseSBieSBzZW5kaW5nIGEKLSAqIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBpbnRlbnQgd2l0aCB0aGUgVXJpIG9mIHRoZQotICogbWVkaWEgY29udGVudCB0byBwbGF5LiAgU3VjaCBhIHJvdXRlIG1heSB0aGVuIGJlIHJlZmVycmVkIHRvIGFzCi0gKiBhICJyZW1vdGUgcGxheWJhY2sgcm91dGUiIGJlY2F1c2UgaXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLiAgSXQgaXMgY29tbW9uCi0gKiBmb3IgYSByb3V0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNhdGVnb3JpZXMgb2YgcmVxdWVzdHMgYXQgdGhlIHNhbWUgdGltZSwgc3VjaCBhcwotICogbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlby4KLSAqIDwvcD48cD4KLSAqIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgcm91dGUgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZC4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgYXVkaW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIGF1ZGlvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIHNwZWFrZXJzCi0gKiBhbmQgQmx1ZXRvb3RoIGhlYWRzZXRzLgotICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBMaXZlIHZpZGVvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIHZpZGVvCi0gKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSB2aWRlbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBkaXNwbGF5cwotICogYW5kIHdpcmVsZXNzIGRpc3BsYXlzIHRoYXQgc3VwcG9ydCBtaXJyb3JpbmcgYW5kCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9LiAgTGl2ZSB2aWRlbyByb3V0ZXMgdHlwaWNhbGx5IGFsc28KLSAqIHN1cHBvcnQgbGl2ZSBhdWRpbyBjYXBhYmlsaXRpZXMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfTogVGhlIHJvdXRlIHN1cHBvcnRzIHNlbmRpbmcKLSAqIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyBmb3IgbWVkaWEgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24uICBUaGUgY29udGVudCB0byBiZQotICogcGxheWVkIGlzIGlkZW50aWZpZWQgYnkgYSBVcmkgYW5kIG1pbWUtdHlwZS4KLSAqIDwvdWw+PHA+Ci0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGRlZmluZSBjdXN0b20gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBvZiB0aGVpciBvd24gaW4KLSAqIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBvbmVzLiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHZhcmlldHkKLSAqIG9mIGZlYXR1cmVzIHRvIGFwcGxpY2F0aW9ucyB0aGF0IHJlY29nbml6ZSBhbmQga25vdyBob3cgdG8gdXNlIHRoZW0uICBGb3IgZXhhbXBsZSwKLSAqIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWlnaHQgZGVmaW5lIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGluZGljYXRlIHRoYXQgaXRzIHJvdXRlcwotICogc3VwcG9ydCBhIHNwZWNpYWwgZGV2aWNlLXNwZWNpZmljIGNvbnRyb2wgaW50ZXJmYWNlIGluIGFkZGl0aW9uIHRvIG90aGVyCi0gKiBzdGFuZGFyZCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHdoaWNoIGNhdGVnb3JpZXMgYSByb3V0ZSBzdXBwb3J0cyBieSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5fQotICogb3Ige0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0Q29udHJvbEZpbHRlcnN9Ci0gKiBtZXRob2RzLiAgQXBwbGljYXRpb25zIGNhbiBhbHNvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHJvdXRlcyB0aGF0IHRoZXkgd2FudCB0byB1c2UgYnkKLSAqIGNyZWF0aW5nIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfSB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQKLSAqIGNhdGVnb3JpZXMgYW5kIGFyZSB1c2VkIHRvIGZpbHRlciByb3V0ZXMgaW4gc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgbWVkaWEgcm91dGVyIEFQSS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9uczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgc3BlY2lmeSBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyB0aGF0IGFwcGxpY2F0aW9ucwotICogY2FuIGFzayB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZSB0byBwZXJmb3JtLiAgTWVkaWEgcm91dGUgY29udHJvbCByZXF1ZXN0cwotICogdGFrZSB0aGUgZm9ybSBvZiBpbnRlbnRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gb3RoZXIgaW50ZW50cyB1c2VkIHRvIHN0YXJ0IGFjdGl2aXRpZXMKLSAqIG9yIHNlbmQgYnJvYWRjYXN0cy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWVkaWEgY29udHJvbCBpbnRlbnRzIGFyZSBkaXJlY3RlZCB0bwotICogcm91dGVzIHJhdGhlciB0aGFuIGFjdGl2aXR5IG9yIGJyb2FkY2FzdCByZWNlaXZlciBjb21wb25lbnRzLgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSByb3V0ZSBjb250cm9sIGludGVudCBzcGVjaWZpZXMgYW4gYWN0aW9uLCBhIGNhdGVnb3J5IGFuZCBzb21lIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gKiB0aGF0IGFyZSBzdXBwbGllZCBhcyBleHRyYXMuICBBcHBsaWNhdGlvbnMgc2VuZCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIHJvdXRlcyB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zZW5kQ29udHJvbFJlcXVlc3R9Ci0gKiBtZXRob2QgYW5kIHJlY2VpdmUgcmVzdWx0cyB2aWEgYSBjYWxsYmFjay4KLSAqIDwvcD48cD4KLSAqIEFsbCBtZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMKLSAqIHRoYXQgc3VwcG9ydCB0aGVtLiAgVGh1cyBvbmx5IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMgbWF5IHBlcmZvcm0gcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGFjdGlvbiBzcGVjaWZpZXMgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoZSBhY3Rpb24gYmVsb25ncywKLSAqIHRoZSBwYXJhbWV0ZXJzIGl0IHJlcXVpcmVzLCBhbmQgdGhlIHJlc3VsdHMgaXQgcmV0dXJucy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXM8L2gzPgotICogPHA+Ci0gKiB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb30gYW5kIHtAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfQotICogcm91dGVzIHByZXNlbnQgbWVkaWEgdXNpbmcgc3RhbmRhcmQgc3lzdGVtIGludGVyZmFjZXMgc3VjaCBhcyBhdWRpbyBzdHJlYW1zLAotICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfSBvciBkaXNwbGF5IG1pcnJvcmluZy4gIFRoZXNlIHJvdXRlcyBhcmUKLSAqIHRoZSBlYXNpZXN0IHRvIHVzZSBiZWNhdXNlIGFwcGxpY2F0aW9ucyBzaW1wbHkgcmVuZGVyIGNvbnRlbnQgbG9jYWxseSBvbiB0aGUgZGV2aWNlCi0gKiBhbmQgdGhlIHN5c3RlbSBzdHJlYW1zIGl0IHRvIHRoZSByb3V0ZSBkZXN0aW5hdGlvbiBhdXRvbWF0aWNhbGx5LgotICogPC9wPjxwPgotICogSW4gbW9zdCBjYXNlcywgYXBwbGljYXRpb25zIGNhbiBzdHJlYW0gY29udGVudCB0byBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlcyBpbgotICogdGhlIHNhbWUgd2F5IHRoZXkgd291bGQgcGxheSB0aGUgY29udGVudCBsb2NhbGx5IHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4gIEhvd2V2ZXIsCi0gKiBhcHBsaWNhdGlvbnMgbWF5IGFsc28gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiBtb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgc3VjaAotICogYXMgc2Vjb25kLXNjcmVlbiBwcmVzZW50YXRpb24gQVBJcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIHRoZXNlIHJvdXRlcy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UmVtb3RlIHBsYXliYWNrIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja30gcm91dGVzIHByZXNlbnQgbWVkaWEgcmVtb3RlbHkKLSAqIGJ5IHBsYXlpbmcgY29udGVudCBmcm9tIGEgVXJpLgotICogVGhlc2Ugcm91dGVzIGRlc3RpbmF0aW9ucyB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBmZXRjaGluZyBhbmQgcmVuZGVyaW5nIGNvbnRlbnQKLSAqIG9uIHRoZWlyIG93bi4gIEFwcGxpY2F0aW9ucyBkbyBub3QgcmVuZGVyIHRoZSBjb250ZW50IHRoZW1zZWx2ZXM7IGluc3RlYWQsIGFwcGxpY2F0aW9ucwotICogc2VuZCBjb250cm9sIHJlcXVlc3RzIHRvIGluaXRpYXRlIHBsYXksIHBhdXNlLCByZXN1bWUsIG9yIHN0b3AgbWVkaWEgaXRlbXMgYW5kIHJlY2VpdmUKLSAqIHN0YXR1cyB1cGRhdGVzIGFzIHRoZXkgY2hhbmdlIHN0YXRlLgotICogPC9wPgotICoKLSAqIDxoND5TZXNzaW9uczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggcmVtb3RlIG1lZGlhIHBsYXliYWNrIGFjdGlvbiBpcyBjb25kdWN0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNlc3Npb24uCi0gKiBTZXNzaW9ucyBhcmUgdXNlZCB0byBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIGFjY2lkZW50YWxseSBpbnRlcmZlcmluZyB3aXRoIG9uZQotICogYW5vdGhlciBiZWNhdXNlIGF0IG1vc3Qgb25lIHNlc3Npb24gY2FuIGJlIHZhbGlkIGF0IGEgdGltZS4KLSAqIDwvcD48cD4KLSAqIEEgc2Vzc2lvbiBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9uIGFjdGlvbn0KLSAqIGFuZCB0ZXJtaW5hdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbiBhY3Rpb259IHdoZW4gdGhlCi0gKiByb3V0ZSBwcm92aWRlcyBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCi0gKiA8L3A+PHA+Ci0gKiBFeHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgd2FzIGFkZGVkIGluIGEgbGF0ZXIgcmV2aXNpb24gb2YgdGhlIHByb3RvY29sIHNvIG5vdAotICogYWxsIHJvdXRlcyBzdXBwb3J0IGl0LiAgSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiB0aGVuIGltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBtYXkgc3RpbGwgYmUgdXNlZC4gIEltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAotICogcmVsaWVzIG9uIHRoZSB1c2Ugb2YgdGhlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gYW5kIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0KLSAqIGFjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiBpZiBub25lIGlzIHByb3ZpZGVkCi0gKiBhcyBhcmd1bWVudC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCB0aGUgcHJldmlvdXMgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBhbmQgYW55IG9uZ29pbmcKLSAqIG1lZGlhIHBsYXliYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gIEFueSBhdHRlbXB0Ci0gKiB0byB1c2UgYW4gaW52YWxpZGF0ZWQgc2Vzc2lvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIChQcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKLSAqIGFyZSBlbmNvdXJhZ2VkIHRvIGFnZ3Jlc3NpdmVseSBkaXNjYXJkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnZhbGlkYXRlZCBzZXNzaW9ucwotICogc2luY2UgaXQgaXMgbm8gbG9uZ2VyIG9mIHVzZS4pCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIHNlc3Npb24gaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBzZXNzaW9uIGlkIHRoYXQgbWF5IGJlIHVzZWQgdG8gY29udHJvbAotICogdGhlIHNlc3Npb24gdXNpbmcgYWN0aW9ucyBzdWNoIGFzIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIGVuZCBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5NZWRpYSBpdGVtczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc3VjY2Vzc2Z1bCB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uCi0gKiByZXR1cm5zIGEgdW5pcXVlIG1lZGlhIGl0ZW0gaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIG1vbml0b3IgYW5kIGNvbnRyb2wKLSAqIHBsYXliYWNrLiAgVGhlIG1lZGlhIGl0ZW0gaWQgbWF5IGJlIHBhc3NlZCB0byBvdGhlciBhY3Rpb25zIHN1Y2ggYXMKLSAqIHtAbGluayAjQUNUSU9OX1NFRUsgc2Vla30gb3Ige0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfS4gIEl0IHdpbGwgYWxzbyBhcHBlYXIKLSAqIGFzIGEgcGFyYW1ldGVyIGluIHN0YXR1cyB1cGRhdGUgYnJvYWRjYXN0cyB0byBpZGVudGlmeSB0aGUgYXNzb2NpYXRlZCBwbGF5YmFjayByZXF1ZXN0LgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSBpdGVtIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC4gIFRoZXJlZm9yZSBtZWRpYSBpdGVtCi0gKiBpZHMgYXJlIG9ubHkgZXZlciB1c2VkIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbiBpZHMuICBNZWRpYSBpdGVtIGlkcyBhcmUgbWVhbmluZ2xlc3MKLSAqIG9uIHRoZWlyIG93bi4gIFdoZW4gdGhlIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQsIGFsbCBvZiBpdHMgbWVkaWEgaXRlbXMgYXJlIGFsc28KLSAqIGludmFsaWRhdGVkLgotICogPC9wPgotICoKLSAqIDxoND5UaGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBFYWNoIHNlc3Npb24gaGFzIGl0cyBvd24gcGxheWJhY2sgcXVldWUgdGhhdCBjb25zaXN0cyBvZiB0aGUgbWVkaWEgaXRlbXMgdGhhdAotICogYXJlIHBlbmRpbmcsIHBsYXlpbmcsIGJ1ZmZlcmluZyBvciBwYXVzZWQuICBJdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXVlIHdoZW4KLSAqIGEgcGxheWJhY2sgcmVxdWVzdCBpcyBpc3N1ZWQuICBJdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB3aGVuIHRoZXkgYXJlIG5vCi0gKiBsb25nZXIgZWxpZ2libGUgZm9yIHBsYXliYWNrIChlbnRlciB0ZXJtaW5hbCBzdGF0ZXMpLgotICogPC9wPjxwPgotICogQXMgZGVzY3JpYmVkIGluIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBjbGFzcywgbWVkaWEgaXRlbXMgaW5pdGlhbGx5Ci0gKiBzdGFydCBpbiBhIHBlbmRpbmcgc3RhdGUsIHRyYW5zaXRpb24gdG8gdGhlIHBsYXlpbmcgKG9yIGJ1ZmZlcmluZyBvciBwYXVzZWQpIHN0YXRlCi0gKiBkdXJpbmcgcGxheWJhY2ssIGFuZCBlbmQgaW4gYSBmaW5pc2hlZCwgY2FuY2VsZWQsIGludmFsaWRhdGVkIG9yIGVycm9yIHN0YXRlLgotICogT25jZSB0aGUgY3VycmVudCBpdGVtIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlLCBwbGF5YmFjayBwcm9jZWVkcyBvbiB0byB0aGUKLSAqIG5leHQgaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgYnkgY2hlY2tpbmcKLSAqIHdoZXRoZXIgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgcm91dGUncyBjb250cm9sIGZpbHRlcgotICogdXNpbmcge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0IFJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcm91dGUgcHJvbWlzZXMKLSAqIHRvIGFsbG93IGF0IGxlYXN0IHR3byBpdGVtcyAocG9zc2libHkgbW9yZSkgdG8gYmUgZW5xdWV1ZWQgYXQgYSB0aW1lLiAgRW5xdWV1ZWQgaXRlbXMgcGxheQotICogYmFjayB0byBiYWNrIG9uZSBhZnRlciB0aGUgb3RoZXIgYXMgdGhlIHByZXZpb3VzIGl0ZW0gY29tcGxldGVzLiAgSWRlYWxseSB0aGVyZSBzaG91bGQKLSAqIGJlIG5vIGF1ZGlibGUgcGF1c2UgYmV0d2VlbiBpdGVtcyBmb3Igc3RhbmRhcmQgYXVkaW8gY29udGVudCB0eXBlcy4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHF1ZXVlCi0gKiBlZmZlY3RpdmVseSBjb250YWlucyBhdCBtb3N0IG9uZSBpdGVtIGF0IGEgdGltZS4gIEVhY2ggcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YKLSAqIGNsZWFyaW5nIHRoZSBxdWV1ZSBhbmQgcmVzZXR0aW5nIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIG5leHQgaXRlbSBpcyBwbGF5ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PkltcGFjdCBvZiBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBwbGF5IGFjdGlvbnMgb24gdGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KLSAqIDxwPgotICogVGhlIHBhdXNlLCByZXN1bWUgYW5kIHN0b3AgYWN0aW9ucyBhZmZlY3QgdGhlIHNlc3Npb24ncyB3aG9sZSBxdWV1ZS4gIFBhdXNlIGNhdXNlcwotICogdGhlIHBsYXliYWNrIHF1ZXVlIHRvIGJlIHN1c3BlbmRlZCBubyBtYXR0ZXIgd2hpY2ggaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAqIFJlc3VtZSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBwYXVzZS4gIFN0b3AgY2xlYXJzIHRoZSBxdWV1ZSBhbmQgYWxzbyByZXNldHMKLSAqIHRoZSBwYXVzZSBmbGFnIGp1c3QgbGlrZSByZXN1bWUuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgZWFybGllciwgdGhlIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZQotICogYW5kIGNvbXBsZXRlbHkgcmVzZXR0aW5nIGl0cyBzdGF0ZSAobGlrZSB0aGUgc3RvcCBhY3Rpb24pIHRoZW4gZW5xdWV1aW5nIGEKLSAqIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4gIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQKLSAqIHRvIHN0b3AgZm9sbG93ZWQgYnkgYW4gYWN0aW9uIHRvIGVucXVldWUgYW4gaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBwbGF5IGFjdGlvbiBpcyBhbHNvIHNwZWNpYWwgaW4gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zLgotICogQW4gYXBwbGljYXRpb24gd2l0aCBzaW1wbGUgbmVlZHMgbWF5IGZpbmQgdGhhdCBpdCBvbmx5IG5lZWRzIHRvIHVzZSBwbGF5Ci0gKiAoYW5kIG9jY2FzaW9uYWxseSBzdG9wKSB0byBjb250cm9sIHBsYXliYWNrLgotICogPC9wPgotICoKLSAqIDxoND5SZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gYXBwbGljYXRpb25zPC9oND4KLSAqIDxwPgotICogV2hlbiBhbiBhcHBsaWNhdGlvbiBoYXMgYSB2YWxpZCBzZXNzaW9uLCBpdCBpcyBlc3NlbnRpYWxseSBpbiBjb250cm9sIG9mIHJlbW90ZSBwbGF5YmFjawotICogb24gdGhlIHJvdXRlLiAgTm8gb3RoZXIgYXBwbGljYXRpb24gY2FuIHZpZXcgb3IgbW9kaWZ5IHRoZSByZW1vdGUgcGxheWJhY2sgc3RhdGUKLSAqIG9mIHRoYXQgYXBwbGljYXRpb24ncyBzZXNzaW9uIHdpdGhvdXQga25vd2luZyBpdHMgaWQuCi0gKiA8L3A+PHA+Ci0gKiBIb3dldmVyLCBvdGhlciBhcHBsaWNhdGlvbnMgY2FuIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGhhdmUgdGhlIGVmZmVjdCBvZiBzdG9wcGluZwotICogcGxheWJhY2sgYW5kIGludmFsaWRhdGluZyB0aGUgY3VycmVudCBzZXNzaW9uLiAgV2hlbiB0aGlzIG9jY3VycywgdGhlIGZvcm1lciBhcHBsaWNhdGlvbgotICogd2lsbCBiZSBpbmZvcm1lZCB0aGF0IGl0IGhhcyBsb3N0IGNvbnRyb2wgYnkgd2F5IG9mIGluZGl2aWR1YWwgbWVkaWEgaXRlbSBzdGF0dXMKLSAqIHVwZGF0ZSBicm9hZGNhc3RzIHRoYXQgaW5kaWNhdGUgdGhhdCBpdHMgcXVldWVkIG1lZGlhIGl0ZW1zIGhhdmUgYmVjb21lCi0gKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfS4gIFRoaXMgYnJvYWRjYXN0Ci0gKiBpbXBsaWVzIHRoYXQgcGxheWJhY2sgd2FzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSBieSBhbiBleHRlcm5hbCBjYXVzZS4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBzaG91bGQgaGFuZGxlIGNvbmZsaWN0cyBjb25zZXJ2YXRpdmVseSB0byBhbGxvdyBvdGhlciBhcHBsaWNhdGlvbnMgdG8KLSAqIHNtb290aGx5IGFzc3VtZSBjb250cm9sIG92ZXIgdGhlIHJvdXRlLiAgV2hlbiBhIGNvbmZsaWN0IG9jY3VycywgdGhlIGN1cnJlbnRseSBwbGF5aW5nCi0gKiBhcHBsaWNhdGlvbiBzaG91bGQgcmVsZWFzZSBpdHMgc2Vzc2lvbiBhbmQgYWxsb3cgdGhlIG5ldyBhcHBsaWNhdGlvbiB0byB1c2UgdGhlCi0gKiByb3V0ZSB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIHVzZXIgaW50ZXJ2ZW5lcyB0byB0YWtlIG92ZXIgdGhlIHJvdXRlIGFnYWluIGFuZCBiZWdpbgotICogYSBuZXcgcGxheWJhY2sgc2Vzc2lvbi4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+QmFzaWMgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYmFzaWMgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IGFsbCByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcy4gIFRoZXNlIGFjdGlvbnMgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAotICogYW5kIGFyZSByZXF1aXJlZCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QTEFZIFBsYXl9OiBTdGFydHMgcGxheWluZyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQotICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldwotICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU0VFSyBTZWVrfTogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBvZiBhIHNwZWNpZmljIG1lZGlhIGl0ZW0uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBHZXQgc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbQotICogaW5jbHVkaW5nIHRoZSBpdGVtJ3MgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBhbmQgcHJvZ3Jlc3MuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUEFVU0UgUGF1c2V9OiBQYXVzZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFU1VNRSBSZXN1bWV9OiBSZXN1bWVzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TVE9QIFN0b3B9OiBTdG9wcyBwbGF5YmFjaywgY2xlYXJzIHRoZSBxdWV1ZSwgYW5kIHJlc2V0cyB0aGUKLSAqIHBhdXNlIHN0YXRlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+UXVldWUgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcXVldWUgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgcXVldWluZyBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX0VOUVVFVUUgRW5xdWV1ZX06IEVucXVldWVzIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9SRU1PVkUgUmVtb3ZlfTogUmVtb3ZlcyBhIHNwZWNpZmllZCBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+U2Vzc2lvbiBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzZXNzaW9uIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHNlc3Npb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gU3RhcnQgc2Vzc2lvbn06IFN0YXJ0cyBhIG5ldyBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIEdldCBzZXNzaW9uIHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIHNlc3Npb24uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gRW5kIHNlc3Npb259OiBFbmRzIGEgc2Vzc2lvbiBleHBsaWNpdGx5LgotICogPC91bD4KLSAqCi0gKiA8aDQ+SW1wbGVtZW50YXRpb24gbm90ZTwvaDQ+Ci0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIG11c3QgaW1wbGVtZW50IDxlbT5hbGw8L2VtPiBvZiB0aGUKLSAqIGRvY3VtZW50ZWQgYWN0aW9ucywgcGFyYW1ldGVycyBhbmQgcmVzdWx0cy4gIE5vdGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZyb20KLSAqIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIGNsaWVudCBvZiB0aGUgcHJvdG9jb2wuICBJbiBwYXJ0aWN1bGFyLCB3aGVuZXZlciBhIHBhcmFtZXRlcgotICogaXMgZGVzY3JpYmVkIGFzIGJlaW5nICJvcHRpb25hbCIsIGl0IGlzIG9ubHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGNsaWVudC4KLSAqIENvbXBsaWFudCBtZWRpYSByb3V0ZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBtdXN0IHN1cHBvcnQgYWxsCi0gKiBvZiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGhlcmVpbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbEludGVudCB7Ci0gICAgLyogUm91dGUgY2F0ZWdvcmllcy4gKi8KLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgYXVkaW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgYXVkaW8gcm91dGluZyB3aWxsIGFsbG93IHRoZSBtZWRpYSBhdWRpbyBzdHJlYW0KLSAgICAgKiB0byBiZSBzZW50IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuICBUaGlzIGNhbiBpbmNsdWRlIGludGVybmFsIHNwZWFrZXJzIG9yCi0gICAgICogYXVkaW8gamFja3Mgb24gdGhlIGRldmljZSBpdHNlbGYsIEEyRFAgZGV2aWNlcywgYW5kIG1vcmUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIGF1ZGlvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBBbGwgYXVkaW8gcGxheWVkIG9uIHRoZSBtZWRpYSBzdHJlYW0gd2lsbCBiZSByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIGF1ZGlvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9BVURJTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX0FVRElPIjsKLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgdmlkZW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgdmlkZW8gcm91dGluZyB3aWxsIGFsbG93IGEgbWlycm9yZWQgdmVyc2lvbgotICAgICAqIG9mIHRoZSBkZXZpY2UncyBwcmltYXJ5IGRpc3BsYXkgb3IgYSBjdXN0b21pemVkCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkCi0gICAgICogZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGEgbGl2ZSB2aWRlbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQKLSAgICAgKiB0byB0aGUgYXBwbGljYXRpb24uICBCeSBkZWZhdWx0LCBhdWRpbyBhbmQgdmlkZW8gaXMgcm91dGVkIHRvIHRoZSBzZWxlY3RlZAotICAgICAqIGRlc3RpbmF0aW9uLiAgRm9yIGNlcnRhaW4gbGl2ZSB2aWRlbyByb3V0ZXMsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyB1c2UgYQotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byByZXBsYWNlIHRoZSBtaXJyb3JlZCB2aWV3Ci0gICAgICogb24gdGhlIGV4dGVybmFsIGRpc3BsYXkgd2l0aCBkaWZmZXJlbnQgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSB2aWRlbyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX1ZJREVPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfVklERU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogUmVtb3RlIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcm91dGluZyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHNlbmQKLSAgICAgKiByZXF1ZXN0cyB0byBwbGF5IGNvbnRlbnQgcmVtb3RlbHkgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVtb3RlIHBsYXliYWNrIHJvdXRlcyBkZXN0aW5hdGlvbnMgb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBsb2NhbCBkZXZpY2UuCi0gICAgICogV2hlbiBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjb250cm9sIHRoZSBjb250ZW50Ci0gICAgICogcGxheWluZyBvbiB0aGUgZGVzdGluYXRpb24gYnkgc2VuZGluZyBtZWRpYSBjb250cm9sIGFjdGlvbnMgdG8gdGhlIHJvdXRlLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIHJvdXRlIHJlZ2FyZGluZwotICAgICAqIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgcmVtb3RlIHBsYXliYWNrIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LlJFTU9URV9QTEFZQkFDSyI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCBpbmRpdmlkdWFsIGl0ZW1zLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQbGF5IG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdGFydCBwbGF5aW5nIGNvbnRlbnQgd2l0aAotICAgICAqIHRoZSB7QGxpbmsgVXJpfSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBJbnRlbnR9J3Mge0BsaW5rIEludGVudCNnZXREYXRhKCkgZGF0YSB1cml9LgotICAgICAqIFRoZSBhY3Rpb24gcmV0dXJucyBhIG1lZGlhIHNlc3Npb24gaWQgYW5kIG1lZGlhIGl0ZW0gaWQgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgKiB0byBjb250cm9sIHBsYXliYWNrIHVzaW5nIG90aGVyIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBPbmNlIGluaXRpYXRlZCwgcGxheWJhY2sgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHdpbGwgYmUgbWFuYWdlZCBpbmRlcGVuZGVudGx5Ci0gICAgICogYnkgdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhcyB0aGUgc3RhdGUKLSAgICAgKiBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgZGF0YSB1cmkgc3BlY2lmaWVzIGFuIEhUVFAgb3IgSFRUUFMgc2NoZW1lLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBpcwotICAgICAqIHJlc3BvbnNpYmxlIGZvciBmb2xsb3dpbmcgSFRUUCByZWRpcmVjdHMgdG8gYSByZWFzb25hYmxlIGRlcHRoIG9mIGF0IGxlYXN0IDMKLSAgICAgKiBsZXZlbHMgYXMgbWlnaHQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgYSB3ZWIgYnJvd3Nlci4gIElmIGFuIEhUVFAgZXJyb3IKLSAgICAgKiBvY2N1cnMsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIHNob3VsZCBzZW5kIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgdXBkYXRlfQotICAgICAqIGJhY2sgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfQotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZ2V0UGxheWJhY2tTdGF0ZSgpIHBsYXliYWNrIHN0YXRlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+T25lIGl0ZW0gYXQgYSB0aW1lPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIHN1Y2Nlc3NmdWwgcGxheSBhY3Rpb24gPGVtPnJlcGxhY2VzPC9lbT4gdGhlIHByZXZpb3VzIHBsYXkgYWN0aW9uLgotICAgICAqIElmIGFuIGl0ZW0gaXMgYWxyZWFkeSBwbGF5aW5nLCB0aGVuIGl0IGlzIGNhbmNlbGVkLCB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlCi0gICAgICogaXMgY2xlYXJlZCBhbmQgdGhlIG5ldyBpdGVtIGJlZ2lucyBwbGF5aW5nIGltbWVkaWF0ZWx5IChyZWdhcmRsZXNzIG9mCi0gICAgICogd2hldGhlciB0aGUgcHJldmlvdXNseSBwbGF5aW5nIGl0ZW0gaGFkIGJlZW4gcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byB7QGxpbmsgI0FDVElPTl9TVE9QIHN0b3B9IGZvbGxvd2VkIGJ5IGFuIGFjdGlvbgotICAgICAqIHRvIGVucXVldWUgYSBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlNlc3Npb25zPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlcXVlc3QgaGFzIHRoZSBlZmZlY3Qgb2YgaW1wbGljaXRseSBjcmVhdGluZyBhIG1lZGlhIHNlc3Npb24gd2hlbmV2ZXIgdGhlCi0gICAgICogYXBwbGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSB0aGUge0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEIHNlc3Npb24gaWR9IHBhcmFtZXRlci4KLSAgICAgKiBCZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGJlIGF0IG1vc3Qgb25lIHZhbGlkIHNlc3Npb24gYXQgYSB0aW1lLCBjcmVhdGluZyBhIG5ldyBzZXNzaW9uCi0gICAgICogaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBpbnZhbGlkYXRpbmcgYW55IGV4aXN0aW5nIHNlc3Npb25zIGFuZCB0aGVpciBtZWRpYSBpdGVtcywKLSAgICAgKiB0aGVuIGhhbmRsaW5nIHRoZSBwbGF5YmFjayByZXF1ZXN0IHdpdGggYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllcyBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYXNzdW1lIHRoYXQgaXRzIHNlc3Npb24KLSAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQuICBUbyBvYnRhaW4gYSBuZXcgc2Vzc2lvbiwgdGhlIGFwcGxpY2F0aW9uIG1heSB0cnkgYWdhaW4KLSAgICAgKiBhbmQgb21pdCB0aGUgc2Vzc2lvbiBpZCBwYXJhbWV0ZXIuICBIb3dldmVyLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkCi0gICAgICogb25seSByZXRyeSByZXF1ZXN0cyBkdWUgdG8gYW4gZXhwbGljaXQgYWN0aW9uIHBlcmZvcm1lZCBieSB0aGUgdXNlciwKLSAgICAgKiBzdWNoIGFzIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgInBsYXkiIGJ1dHRvbiBpbiB0aGUgVUksIHNpbmNlIGFub3RoZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBtYXkgYmUgdHJ5aW5nIHRvIHRha2UgY29udHJvbCBvZiB0aGUgcm91dGUgYW5kIHRoZSBmb3JtZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IHRvIHN0YXkgb3V0IG9mIGl0cyB3YXkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb25zLCBxdWV1ZXMgYW5kIG1lZGlhIGl0ZW1zLCBwbGVhc2UgcmVmZXIgdG8gdGhlCi0gICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdG8gd2hpY2ggdGhlIHBsYXliYWNrIHJlcXVlc3QgYmVsb25ncy4gIElmIG9taXR0ZWQsIGEgbmV3IHNlc3Npb24KLSAgICAgKiBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwKLSAgICAgKiBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9NRVRBREFUQX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIG1ldGFkYXRhIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoZSBjb250ZW50IHN1Y2ggYXMgdGhlIHRpdGxlIG9mIGEgc29uZy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdGhhdCB3YXMgYWZmZWN0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYmUgYSBuZXcgc2Vzc2lvbiBpbgotICAgICAqIHRoZSBjYXNlIHdoZXJlIG5vIHNlc3Npb24gaWQgd2FzIHN1cHBsaWVkIGFzIGEgcGFyYW1ldGVyLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgYW4gb3BhcXVlIHN0cmluZyBpZGVudGlmaWVyCi0gICAgICogdG8gdXNlIHRvIHJlZmVyIHRvIHRoZSBtZWRpYSBpdGVtIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0YXR1cyBvZgotICAgICAqIHRoZSBuZXcgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGFuCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgaXRlbSBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiBwbGF5YmFjayBzdGFydHMgb3IKLSAgICAgKiBzdG9wcy4gIFRoZSByZWNlaXZlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGNoYW5nZXMuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSByZXRyaWV2ZSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIG5lY2Vzc2FyeQotICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfSByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIGEgc2Vzc2lvbiBpZCB3YXMgcHJvdmlkZWQgYnV0IGlzIHVua25vd24gb3IKLSAgICAgKiBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBpdGVtIFVyaSBvciBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYKLSAgICAgKiBhbnkgb3RoZXIgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICogTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgICogaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgewotICAgICAqICAgICBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAqICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHN1Y2NlZWRlZC4KLSAgICAgKiAgICAgICAgICAgICAvLyBQbGF5YmFjayBtYXkgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcmV0dXJuZWQgc2Vzc2lvbiBhbmQgaXRlbSBpZC4KLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAqICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICogICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKGRhdGEuZ2V0QnVuZGxlKAotICAgICAqICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICogICAgICAgICAgICAgLy8gLi4uCi0gICAgICogICAgICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQhCi0gICAgICogICAgICAgICB9Ci0gICAgICogICAgIH07Ci0gICAgICogICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BMQVkgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBMQVkiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbnF1ZXVlIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIHdvcmtzIGp1c3QgbGlrZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGV4Y2VwdCB0aGF0IGl0IGRvZXMKLSAgICAgKiBub3QgY2xlYXIgdGhlIHF1ZXVlIG9yIHJlc2V0IHRoZSBwYXVzZSBzdGF0ZSB3aGVuIGl0IGVucXVldWVzIHRoZQotICAgICAqIG5ldyBtZWRpYSBpdGVtIGludG8gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIFRoaXMgYWN0aW9uIG9ubHkKLSAgICAgKiBlbnF1ZXVlcyBhIG1lZGlhIGl0ZW0gd2l0aCBubyBvdGhlciBzaWRlLWVmZmVjdHMgb24gdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5IGFuZCB0aGVuIHRoZSBpdGVtIHdpbGwgcGxheSBpbW1lZGlhdGVseQotICAgICAqIChhc3N1bWluZyB0aGUgcXVldWUgaXMgbm90IHBhdXNlZCkuICBPdGhlcndpc2UsIHRoZSBpdGVtIHdpbGwgcGxheQotICAgICAqIGFmdGVyIGFsbCBlYXJsaWVyIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGZpbmlzaGVkIG9yIGJlZW4gcmVtb3ZlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGVucXVldWUgYWN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMganVzdCBsaWtlIHBsYXkuCi0gICAgICogSXRzIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMgYXJlIGFsc28gdGhlIHNhbWUuICBPbmx5IHRoZSBxdWV1aW5nIGJlaGF2aW9yCi0gICAgICogaXMgZGlmZmVyZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VOUVVFVUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVOUVVFVUUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZWVrIG1lZGlhIGl0ZW0gdG8gYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBtb2RpZnkgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24KLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIG9ubHkgYWZmZWN0cyB0aGUgcGxheWJhY2sgcG9zaXRpb24gb2YgdGhlIG1lZGlhIGl0ZW07IG5vdCBpdHMgcGxheWJhY2sgc3RhdGUuCi0gICAgICogSWYgdGhlIHBsYXliYWNrIHF1ZXVlIGlzIHBhdXNlZCwgdGhlbiBzZWVraW5nIHNldHMgdGhlIHBvc2l0aW9uIGJ1dCB0aGUgaXRlbQotICAgICAqIHJlbWFpbnMgcGF1c2VkLiAgTGlrZXdpc2UgaWYgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlbiBzZWVraW5nIHdpbGwgY2F1c2UgcGxheWJhY2sKLSAgICAgKiB0byBqdW1wIHRvIHRoZSBuZXcgcG9zaXRpb24gYW5kIGNvbnRpbnVlIHBsYXlpbmcgZnJvbSB0aGF0IHBvaW50LiAgSWYgdGhlIGl0ZW0gaGFzCi0gICAgICogbm90IHlldCBzdGFydGVkIHBsYXlpbmcsIHRoZW4gdGhlIG5ldyBwbGF5YmFjayBwb3NpdGlvbiBpcyByZW1lbWJlcmVkIGJ5IHRoZQotICAgICAqIHF1ZXVlIGFuZCB1c2VkIGFzIHRoZSBpdGVtJ3MgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIHdoZW4gcGxheWJhY2sgZXZlbnR1YWxseSBiZWdpbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBtZWRpYSBpdGVtJ3MgcGxheWJhY2sgcG9zaXRpb24gaXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBzZWVrLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcKLSAgICAgKiBjb250ZW50IHBvc2l0aW9uIGZvciBwbGF5YmFjayBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KLSAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBjb250ZW50IHBvc2l0aW9uIGlzIGludmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtCi0gICAgICogaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VFSyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VFSyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBpdGVtIHBsYXliYWNrIHN0YXR1cwotICAgICAqIGFuZCBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgcGxheWJhY2sgc3RhdHVzIGFuZCBwcm9ncmVzcwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBxdWVyeS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NUQVRVUyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlbW92ZSBtZWRpYSBpdGVtIGZyb20gc2Vzc2lvbidzIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KLSAgICAgKiBmcm9tIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBJZiB0aGUgY3VycmVudCBpdGVtIGlzIHJlbW92ZWQsIHRoZW4KLSAgICAgKiBwbGF5YmFjayB3aWxsIHByb2NlZWQgdG8gdGhlIG5leHQgbWVkaWEgaXRlbSAoYXNzdW1pbmcgdGhlIHF1ZXVlIGhhcyBub3QgYmVlbgotICAgICAqIHBhdXNlZCkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcGF1c2Ugc3RhdGUgb2YgdGhlIHF1ZXVlLiAgSWYgdGhlIHF1ZXVlIHdhcyBwYXVzZWQKLSAgICAgKiB0aGVuIGl0IHJlbWFpbnMgcGF1c2VkIChldmVuIGlmIGl0IGlzIG5vdyBlbXB0eSkgdW50aWwgYSByZXN1bWUsIHN0b3Agb3IgcGxheQotICAgICAqIGFjdGlvbiBpcyBpc3N1ZWQgdGhhdCBjYXVzZXMgdGhlIHBhdXNlIHN0YXRlIHRvIGJlIGNsZWFyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcmVtb3ZlLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtIGlzIGluIGEgdGVybWluYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUKLSAgICAgKiBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVNT1ZFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRU1PVkUiOwotCi0gICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHdob2xlIHBsYXliYWNrIHF1ZXVlLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQYXVzZSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcGF1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBwYXVzZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFVU0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBBVVNFIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVzdW1lIG1lZGlhIHBsYXliYWNrICh1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcmVzdW1lZC4KLSAgICAgKiBSZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB7QGxpbmsgI0FDVElPTl9QQVVTRX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHJlc3VtZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVNVTUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFU1VNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0b3AgbWVkaWEgcGxheWJhY2sgKGNsZWFyIHF1ZXVlIGFuZCB1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0b3AgcGxheWJhY2ssIGNhbmNlbCBhbmQgcmVtb3ZlCi0gICAgICogYWxsIG1lZGlhIGl0ZW1zIGZyb20gdGhlIHNlc3Npb24ncyBtZWRpYSBpdGVtIHF1ZXVlIGFuZCwgcmVzZXQgdGhlIHF1ZXVlJ3MKLSAgICAgKiBwYXVzZSBzdGF0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAotICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgc3RvcHBlZCAoY2xlYXJlZCBhbmQgdW5wYXVzZWQpLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RPUCA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RPUCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0YXJ0IHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IHNlc3Npb24KLSAgICAgKiBhbmQgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gIFRoZSBuZXcgc2Vzc2lvbiBpbml0aWFsbHkgaGFzIGFuIGVtcHR5IHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUKLSAgICAgKiBpcyBzZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzCi0gICAgICogb2YgZWFjaCBpdGVtLiAgVGhlIHByZXZpb3VzIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSBuZXcgc2Vzc2lvbgotICAgICAqIHRha2VzIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tCi0gICAgICogdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBzdGFydGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIGJyYW5kIG5ldyBzZXNzaW9uCi0gICAgICogZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgcHJldmlvdXNseSBjcmVhdGVkIHNlc3Npb25zLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEKLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgc2Vzc2lvbiBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiB0aGUgc2Vzc2lvbidzCi0gICAgICogcXVldWUgaXMgcGF1c2VkIG9yIHJlc3VtZWQgb3Igd2hlbiB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIG9yIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+Q3VzdG9tIG1lc3NhZ2VzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYW55IG1lc3NhZ2VzIHRvIHNlbmQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayAjRVhUUkFfTUVTU0FHRX0gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RBUlRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBzZXNzaW9uIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB3aG9zZSBzdGF0dXMgaXMgdG8gYmUgcmV0cmlldmVkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NFU1NJT05fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5kIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBlbmQgdGhlIHNwZWNpZmllZCBzZXNzaW9uLgotICAgICAqIFRoZSBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgcm91dGUgY2Vhc2VzIHRvIGJlIHVuZGVyIGNvbnRyb2wKLSAgICAgKiBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiB0aGUgc2Vzc2lvbiBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI1NFU1NJT05fU1RBVEVfRU5ERUR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudCB0bwotICAgICAqIHRoZSBzZXNzaW9uJ3Mgc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWRkaXRpb25hbGx5LCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byBlbmQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byBlbmQgYSBzZXNzaW9uIG90aGVyIHRoYW4gdGhlCi0gICAgICogY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5EX1NFU1NJT04iOwotCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZW5kIHtAbGluayAjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJvdXRlIHRvIGhhbmRsZSBhIG1lc3NhZ2UgZGVzY3JpYmVkIGJ5IEVYVFJBX01FU1NBR0UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHdpbGwgaGFuZGxlIHRoaXMgbWVzc2FnZS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgdG8gc2VuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiBBbnkgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogQW55IGVycm9yIG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRU5EX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFTkRfTUVTU0FHRSI7Ci0KLSAgICAvKiBFeHRyYXMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAqLwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlkZW50aWZpZXMgdGhlIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGJlIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX0lEID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX0lEIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBzZXNzaW9uIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSwKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9QQVVTRX0sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyB1cGRhdGVkIHN0YXR1cy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIHNlc3Npb24gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgbWVzc2FnZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGhhcyBhIG1lc3NhZ2UgdG8gc2VuZCwgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyBtZXNzYWdlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgZnJvbQotICAgICAqIHRoZSBzZXNzaW9uIGFzIGEgYnVuZGxlIG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSB7QGxpbmsgI0FDVElPTl9QTEFZfSBvcgotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRoYXQgcmVwcmVzZW50cyB0aGUgbWVkaWEgaXRlbSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZQotICAgICAqIHBsYXliYWNrIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBpdGVtIGluIHF1ZXN0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIGl0ZW0gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1BMQVl9LAotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9LCB7QGxpbmsgI0FDVElPTl9TRUVLfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBMb25nIGV4dHJhOiBNZWRpYSBpdGVtIGNvbnRlbnQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgdGhlCi0gICAgICogc3RhcnRpbmcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRUVLfSB0byBzZXQgYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9QT1NJVElPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gbWV0YWRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgbWV0YWRhdGEKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnQgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIG1ldGFkYXRhIGtleS12YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gICAgICogaW4ge0BsaW5rIE1lZGlhSXRlbU1ldGFkYXRhfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9NRVRBREFUQSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9NRVRBREFUQSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IEhUVFAgcmVxdWVzdAotICAgICAqIGhlYWRlcnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBmZXRjaGluZyB0byB0aGUgY29udGVudCBpbmRpY2F0ZWQgYnkgdGhlIG1lZGlhCi0gICAgICogaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciBzZXBhcmF0ZWx5IGZyb20gdGhlIG1lZGlhIGl0ZW0ncyBkYXRhIFVyaS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSFRUUF9IRUFERVJTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5IVFRQX0hFQURFUlMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkKLSAgICAgKiBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCBhIHBhcnRpY3VsYXIKLSAgICAgKiBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBpdGVtIGJlbG9uZ3MsIHRoZSBzZXNzaW9uIHN0YXR1cywgdGhlIGl0ZW0ncyBpZAotICAgICAqIGFuZCB0aGUgaXRlbSdzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgc2FtZSBwZW5kaW5nIGludGVudCBhbmQgYnJvYWRjYXN0IHJlY2VpdmVyIG1heSBiZSBzaGFyZWQgYnkgYW55IG51bWJlciBvZgotICAgICAqIG1lZGlhIGl0ZW1zIHNpbmNlIHRoZSBicm9hZGNhc3QgaW50ZW50IGluY2x1ZGVzIHRoZSBtZWRpYSBzZXNzaW9uIGlkCi0gICAgICogYW5kIG1lZGlhIGl0ZW0gaWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mIHRoZQotICAgICAqIG1lZGlhIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIGl0ZW0gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRU5EX01FU1NBR0V9LCBhbmQgaW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyc30gdG8gZGVzY3JpYmUgYSBtZXNzYWdlIGJldHdlZW4gYQotICAgICAqIHNlc3Npb24gYW5kIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhOiBFcnJvciBjb2RlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCBhbGwgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byBkZXNjcmliZSB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuCi0gICAgICogVGhpcyBleHRyYSBtYXkgYmUgb21pdHRlZCB3aGVuIHRoZSBlcnJvciBpcyB1bmtub3duLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgb25lIG9mOiB7QGxpbmsgI0VSUk9SX1VOS05PV059LCB7QGxpbmsgI0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTn0sCi0gICAgICoge0BsaW5rICNFUlJPUl9JTlZBTElEX1NFU1NJT05fSUR9LCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfSVRFTV9JRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX0NPREUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuRVJST1JfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgc2Vzc2lvbiBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEID0gMjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBpdGVtIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lURU1fSUQgPSAzOwotCi0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xJbnRlbnQoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZGRiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgbWV0YWRhdGEgYWJvdXQgYSBtZWRpYSBpdGVtIGFzIGEge0BsaW5rIEJ1bmRsZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIE1lZGlhIGl0ZW0gbWV0YWRhdGEgaXMgZGVzY3JpYmVkIGFzIGEgYnVuZGxlIG9mIGtleS92YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gKiBpbiB0aGlzIGNsYXNzLiAgVGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggZWFjaCBrZXkuCi0gKiA8L3A+PHA+Ci0gKiBBbiBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIGN1c3RvbSBtZXRhZGF0YSBrZXlzIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUKLSAqIHRoYXQgdGhleSB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtTWV0YWRhdGEgewotICAgIC8qCi0gICAgICogTm90ZTogTWVkaWFNZXRhZGF0YVJldHJpZXZlciBhbHNvIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgdGhhdCBjYW4gYmUKLSAgICAgKiByZXRyaWV2ZWQgZnJvbSBhIGNvbnRlbnQgc3RyZWFtIGFsdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZQotICAgICAqIHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoZSBkYXRhIHRvIGEgcmVtb3RlIGVuZHBvaW50LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW1NZXRhZGF0YSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSBhcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQWxidW0gdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnR3b3JrIFVyaS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgVVJJIGZvciBhbiBpbWFnZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSwKLSAgICAgKiBzdWNoIGFzIGFsYnVtIG9yIGNvdmVyIGFydC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVFdPUktfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUV09SS19VUkkiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXJ0aXN0IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEF1dGhvciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBDb21wb3NlciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogVHJhY2sgdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogWWVhciBvZiBwdWJsaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciB5ZWFyIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBUcmFjayBudW1iZXIgKHN1Y2ggYXMgYSB0cmFjayBvbiBhIENEKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciB0cmFjayBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IERpc2MgbnVtYmVyIHdpdGhpbiBhIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgZGlzYyBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU0NfTlVNQkVSIjsKLQotICAgIC8qKgotICAgICAqIExvbmcga2V5OiBJdGVtIHBsYXliYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5sb25nPC9jb2RlPiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZHVyYXRpb24gbWV0YWRhdGEgaXMgb25seSBhIGhpbnQgdG8gZW5hYmxlIGEgcmVtb3RlIG1lZGlhIHBsYXllciB0bwotICAgICAqIGd1ZXNzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudCBiZWZvcmUgaXQgYWN0dWFsbHkgb3BlbnMgdGhlIG1lZGlhIHN0cmVhbS4KLSAgICAgKiBUaGUgcmVtb3RlIG1lZGlhIHBsYXllciBzaG91bGQgc3RpbGwgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29udGVudCBkdXJhdGlvbiBmcm9tCi0gICAgICogdGhlIG1lZGlhIHN0cmVhbSBpdHNlbGYgaW5kZXBlbmRlbnQgb2YgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBieSB0aGlzIGtleS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMmQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogQXMgYSBtZWRpYSBpdGVtIGlzIHBsYXllZCwgaXQgdHJhbnNpdGlvbnMgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIHN0YXRlcyBpbmNsdWRpbmc6Ci0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkcgcGVuZGluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HIGJ1ZmZlcmluZ30sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkcgcGxheWluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEIHBhdXNlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEIGZpbmlzaGVkfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSwgYW5kCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfS4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUKLSAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFdoaWxlIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZSBwbGF5YmFjayBzdGF0dXMgbWF5IGFsc28gaW5jbHVkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIHtAbGluayAjZ2V0Q29udGVudFBvc2l0aW9uIGNvbnRlbnQgcG9zaXRpb259IGFuZAotICoge0BsaW5rICNnZXRDb250ZW50RHVyYXRpb24gY29udGVudCBkdXJhdGlvbn0gYWx0aG91Z2ggbm90IGFsbCByb3V0ZSBkZXN0aW5hdGlvbnMKLSAqIHdpbGwgcmVwb3J0IGl0LgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBwbGF5YmFjayBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheWJhY2sgcmVxdWVzdH0uICBOb3RlIHRoYXQKLSAqIHRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBtYWpvciBzdGF0dXMgY2hhbmdlcyBzdWNoIGFzIGEKLSAqIHRyYW5zaXRpb24gZnJvbSBwbGF5aW5nIHRvIGZpbmlzaGVkLgotICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAqIFRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIG1pbm9yIHByb2dyZXNzIHVwZGF0ZXMgc3VjaCBhcwotICogY2hhbmdlcyB0byBwbGF5YmFjayBwb3NpdGlvbiBvciBkdXJhdGlvbi4gIElmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBtb25pdG9yCi0gKiBwbGF5YmFjayBwcm9ncmVzcywgdGhlbiBpdCBtdXN0IHVzZSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1cyByZXF1ZXN0fSB0byBwb2xsIGZvciBjaGFuZ2VzCi0gKiBwZXJpb2RpY2FsbHkgYW5kIGVzdGltYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBwbGF5aW5nLiAgTm90ZSB0aGF0IHRoZXJlIG1heQotICogYmUgYSBzaWduaWZpY2FudCBwb3dlciBpbXBhY3QgdG8gcG9sbGluZyBzbyB0aGUgYXBwbGljYXRpb24gaXMgYWR2aXNlZCBvbmx5Ci0gKiB0byBwb2xsIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgbmV2ZXIgbW9yZSB0aGFuIGFib3V0IG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9yIHNvLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbVN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RBVEUgPSAicGxheWJhY2tTdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9QT1NJVElPTiA9ICJjb250ZW50UG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfRFVSQVRJT04gPSAiY29udGVudER1cmF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBlbmRpbmcuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIG5vdCB5ZXQgc3RhcnRlZCBwbGF5YmFjayBidXQgd2lsbCBiZSBwbGF5ZWQgZXZlbnR1YWxseS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEVORElORyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUExBWUlORyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGF1c2VkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHBsYXliYWNrIG9mIHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHBhdXNlZC4gIFBsYXliYWNrIGNhbiBiZQotICAgICAqIHJlc3VtZWQgdXNpbmcgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEFVU0VEID0gMjsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBCdWZmZXJpbmcgb3Igc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiB0ZW1wb3JhcmlseSBpbnRlcnJ1cHRlZAotICAgICAqIHRvIGZldGNoIG1vcmUgY29udGVudC4gIFBsYXliYWNrIHdpbGwgY29udGludWUgYXV0b21hdGljYWxseQotICAgICAqIHdoZW4gZW5vdWdoIGNvbnRlbnQgaGFzIGJlZW4gYnVmZmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORyA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogRmluaXNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gcGxheWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGZpbmlzaGVkIG5vcm1hbGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGZpbmlzaGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9GSU5JU0hFRCA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogQ2FuY2VsZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBieSB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4gIEl0ZW1zIG1heSBiZSBjYW5jZWxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB1c2luZwotICAgICAqIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0gYWN0aW9uIG9yIGJ5IGlzc3VpbmcKLSAgICAgKiBhbm90aGVyIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gYWN0aW9uIHRoYXQgaGFzIHRoZQotICAgICAqIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBjYW5jZWxlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgPSA1OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBwZXJtYW5lbnRseSBhbmQgaW52b2x1bnRhcmlseS4KLSAgICAgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgYW5kIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHRoZSBzZXNzaW9uIHRvIHdoaWNoIGl0IGJlbG9uZ3Mgd2FzIGludmFsaWRhdGVkCi0gICAgICogKHR5cGljYWxseSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZSkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBnZW5lcmFsbHkgd2FpdCBmb3IgdGhlIHVzZXIKLSAgICAgKiB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IGFjdGlvbiwgc3VjaCBhcyBjbGlja2luZyBvbiBhIHBsYXkgYnV0dG9uIGluIHRoZSBVSSwKLSAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbWVkaWEgc2Vzc2lvbiB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGludGVycnVwdGluZwotICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBtYXkgaGF2ZSBqdXN0IHN0YXJ0ZWQgdXNpbmcgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgPSA2OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXliYWNrIGhhbHRlZCBvciBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlcyBvZiBlcnJvcnMgYXJlIG5vIG5ldHdvcmsgY29ubmVjdGl2aXR5IHdoZW4gYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBjb250ZW50Ci0gICAgICogZnJvbSBhIHNlcnZlciwgb3IgZXhwaXJlZCB1c2VyIGNyZWRlbnRpYWxzIHdoZW4gdHJ5aW5nIHRvIHBsYXkgc3Vic2NyaXB0aW9uLWJhc2VkCi0gICAgICogY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBtZWRpYSBpdGVtIGluIHRoZSBlcnJvciBzdGF0ZSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sCi0gICAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0VSUk9SID0gNzsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIGVuY291bnRlcmVkIHdoZW4gdGhlIGNvbnRlbnQKLSAgICAgKiB3YXMgcmVxdWVzdGVkIGFmdGVyIGFsbCByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gIFRoaXMga2V5IG9ubHkgbmVlZHMgdG8KLSAgICAgKiBzcGVjaWZpZWQgd2hlbiB0aGUgY29udGVudCB1cmkgdXNlcyB0aGUgSFRUUCBvciBIVFRQUyBzY2hlbWUgYW5kIGFuIGVycm9yCi0gICAgICogb2NjdXJyZWQuICBUaGlzIGtleSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29udGVudCB3YXMgYWJsZSB0byBiZSBwbGF5ZWQKLSAgICAgKiBzdWNjZXNzZnVsbHk7IHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwb3J0IGEgMjAwIChPSykgc3RhdHVzIGNvZGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGUsIHN1Y2ggYXMgNDAxIChVbmF1dGhvcml6ZWQpLAotICAgICAqIDQwNCAoTm90IEZvdW5kKSwgb3IgNTAwIChTZXJ2ZXIgRXJyb3IpLCBvciAwIGlmIG5vbmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfU1RBVFVTX0NPREUgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfU1RBVFVTX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdoZW4gdGhlIGNvbnRlbnQgd2FzCi0gICAgICogcmVxdWVzdGVkIGZyb20gdGhlIG5ldHdvcmsuICBUaGUgaGVhZGVycyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIGNvbnRlbnQgb3IgYW55IGVycm9ycyBjb25kaXRpb25zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZQotICAgICAqIHRyeWluZyB0byBmZXRjaCB0aGUgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1JFU1BPTlNFX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfUkVTUE9OU0VfSEVBREVSUyI7Ci0KLSAgICBNZWRpYUl0ZW1TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwbGF5YmFjayBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkd9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEfSwKLSAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RBVEUsIFBMQVlCQUNLX1NUQVRFX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mCi0gICAgICogbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYUl0ZW1TdGF0dXN7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7Ci0gICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdGF0ZT0iKS5hcHBlbmQocGxheWJhY2tTdGF0ZVRvU3RyaW5nKGdldFBsYXliYWNrU3RhdGUoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnRQb3NpdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudFBvc2l0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnREdXJhdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXliYWNrU3RhdGVUb1N0cmluZyhpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBlbmRpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJidWZmZXJpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBhdXNlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmluaXNoZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9DQU5DRUxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHBsYXliYWNrU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbVN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhSXRlbVN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1N0YXRlIFRoZSBpdGVtIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0YXRlKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RBVEUsIHBsYXliYWNrU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uTWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzZWNvbmRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIKLSAgICAgICAgICogb2YgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudER1cmF0aW9uKGxvbmcgZHVyYXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgZHVyYXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhSXRlbVN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjODRmYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSByb3V0ZS4KLSAqIDxwPgotICogRWFjaCByb3V0ZSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGFuIG9wYXF1ZSBpZCBzdHJpbmcuICBUaGlzIHRva2VuCi0gKiBtYXkgdGFrZSBhbnkgZm9ybSBhcyBsb25nIGFzIGl0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEZXNjcmlwdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJpZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR1JPVVBfTUVNQkVSX0lEUyA9ICJncm91cE1lbWJlcklkcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJuYW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJzdGF0dXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lDT05fVVJJID0gImljb25VcmkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU9OX1NUQVRFID0gImNvbm5lY3Rpb25TdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9GSUxURVJTID0gImNvbnRyb2xGaWx0ZXJzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0gInBsYXliYWNrVHlwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RSRUFNID0gInBsYXliYWNrU3RyZWFtIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfVFlQRSA9ICJkZXZpY2VUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfTUFYID0gInZvbHVtZU1heCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX0hBTkRMSU5HID0gInZvbHVtZUhhbmRsaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCA9ICJwcmVzZW50YXRpb25EaXNwbGF5SWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9ESVNDT05ORUNUID0gImNhbkRpc2Nvbm5lY3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFVFRJTkdTX0lOVEVOVCA9ICJzZXR0aW5nc0ludGVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlOX0NMSUVOVF9WRVJTSU9OID0gIm1pbkNsaWVudFZlcnNpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DTElFTlRfVkVSU0lPTiA9ICJtYXhDbGllbnRWZXJzaW9uIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICBNZWRpYVJvdXRlRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PEludGVudEZpbHRlcj4gY29udHJvbEZpbHRlcnMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gY29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAqIGJ5IHRoZSBwcm92aWRlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBNZW1iZXJJZHMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX05BTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9ERVNDUklQVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgU3RyaW5nIGljb25VcmkgPSBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUNPTl9VUkkpOwotICAgICAgICByZXR1cm4gaWNvblVyaSA9PSBudWxsID8gbnVsbCA6IFVyaS5wYXJzZShpY29uVXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9FTkFCTEVELCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGNvbm5lY3RpbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfQ09OTkVDVElPTl9TVEFURSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBjYW4gbm9ybWFsbHkgYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2sgd2hlbgotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugb24gdGhlIHJvdXRlIGlzIGNvbm5lY3RlZCB0byB0d28gb3IgbW9yZSBzb3VyY2UKLSAgICAgKiBkZXZpY2VzLiBUaGUgcm91dGUgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSB0aGUgcm91dGUgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLSAgICAgKiBudW1iZXIgb2YgY29ubmVjdGVkIGRldmljZXMgY2hhbmdlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVG8gc3BlY2lmeSB0aGF0IHRoZSByb3V0ZSBzaG91bGQgZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHVzZQotICAgICAqIHtAbGluayBNZWRpYVJvdXRlciN1bnNlbGVjdChpbnQpfSB3aXRoCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB7QGxpbmsgSW50ZW50U2VuZGVyfSBmb3Igc3RhcnRpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAqIHJvdXRlLiBUaGUgYWN0aXZpdHkgbWF5IGhhdmUgc3BlY2lmaWMgcm91dGUgc2V0dGluZ3Mgb3IgZ2VuZXJhbCBzZXR0aW5ncwotICAgICAqIGZvciB0aGUgY29ubmVjdGVkIGRldmljZSBvciByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudFNlbmRlcn0gdG8gc3RhcnQgYSBzZXR0aW5ncyBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBlbnN1cmVDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBtQnVuZGxlLjxJbnRlbnRGaWx0ZXI+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IENvbGxlY3Rpb25zLjxJbnRlbnRGaWx0ZXI+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0RFVklDRV9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX01BWCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNaW5DbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9TVEFSVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNYXhDbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgZGVzY3JpcHRvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdldElkKCkpCi0gICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIHx8IG1Db250cm9sRmlsdGVycy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZURlc2NyaXB0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJpZD0iKS5hcHBlbmQoZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ3JvdXBNZW1iZXJJZHM9IikuYXBwZW5kKGdldEdyb3VwTWVtYmVySWRzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWU9IikuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb249IikuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGljb25Vcmk9IikuYXBwZW5kKGdldEljb25VcmkoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNFbmFibGVkPSIpLmFwcGVuZChpc0VuYWJsZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNDb25uZWN0aW5nPSIpLmFwcGVuZChpc0Nvbm5lY3RpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvblN0YXRlPSIpLmFwcGVuZChnZXRDb25uZWN0aW9uU3RhdGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udHJvbEZpbHRlcnM9IikuYXBwZW5kKEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sRmlsdGVycygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrVHlwZT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrU3RyZWFtPSIpLmFwcGVuZChnZXRQbGF5YmFja1N0cmVhbSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXZpY2VUeXBlPSIpLmFwcGVuZChnZXREZXZpY2VUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZT0iKS5hcHBlbmQoZ2V0Vm9sdW1lKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZU1heD0iKS5hcHBlbmQoZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZUhhbmRsaW5nPSIpLmFwcGVuZChnZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IikuYXBwZW5kKGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1pbkNsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1pbkNsaWVudFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWF4Q2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWF4Q2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Hcm91cE1lbWJlcklkczsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKLQotICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKLSAgICAgICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgaWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGdyb3VwIG1lbWJlciBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZChTdHJpbmcgZ3JvdXBNZW1iZXJJZCkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZCBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUdyb3VwTWVtYmVySWRzLmNvbnRhaW5zKGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzLmFkZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWRzKENvbGxlY3Rpb248U3RyaW5nPiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEdyb3VwTWVtYmVySWQoZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX05BTUUsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgVVJJIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+Y29udGVudCAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0NPTlRFTlR9KTwvbGk+Ci0gICAgICAgICAqIDxsaT5hbmRyb2lkLnJlc291cmNlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRX0pCi0gICAgICAgICAqIDwvbGk+Ci0gICAgICAgICAqIDxsaT5maWxlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfRklMRX0pPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShVcmkgaWNvblVyaSkgewotICAgICAgICAgICAgaWYgKGljb25VcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImljb25VcmkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lDT05fVVJJLCBpY29uVXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogRGlzYWJsZWQgcm91dGVzIHJlcHJlc2VudCByb3V0ZXMgdGhhdCBhIHJvdXRlIHByb3ZpZGVyIGtub3dzIGFib3V0LCBzdWNoIGFzIHBhaXJlZAotICAgICAgICAgKiBXaWZpIERpc3BsYXkgcmVjZWl2ZXJzLCBidXQgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKLSAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGluZyhib29sZWFuIGNvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgY29ubmVjdGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGNvbm5lY3Rpb24gc3RhdGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RhdGUgVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3Rpb25TdGF0ZShpbnQgY29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfQ09OTkVDVElPTl9TVEFURSwgY29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q2FuRGlzY29ubmVjdChib29sZWFuIGNhbkRpc2Nvbm5lY3QpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGNhbkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgdGhlIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2V0dGluZ3NBY3Rpdml0eShJbnRlbnRTZW5kZXIgaXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5ULCBpcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVyIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVyKEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuY29udGFpbnMoZmlsdGVyKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXJzKENvbGxlY3Rpb248SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVycyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1R5cGUgVGhlIHBsYXliYWNrIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tUeXBlKGludCBwbGF5YmFja1R5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBwbGF5YmFja1R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0cmVhbShpbnQgcGxheWJhY2tTdHJlYW0pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIHBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcmVjZWl2ZXIgZGV2aWNlIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2VUeXBlIFRoZSByZWNlaXZlIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERldmljZVR5cGUoaW50IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9ERVZJQ0VfVFlQRSwgZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZU1heChpbnQgdm9sdW1lTWF4KSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX01BWCwgdm9sdW1lTWF4KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3Mgdm9sdW1lIGhhbmRsaW5nLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lSGFuZGxpbmcgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZUhhbmRsaW5nKGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywgdm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChpbnQgcHJlc2VudGF0aW9uRGlzcGxheUlkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIHByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1pbkNsaWVudFZlcnNpb24oaW50IG1pblZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sIG1pblZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNYXhDbGllbnRWZXJzaW9uKGludCBtYXhWZXJzaW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBtYXhWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMsIG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUywgbUdyb3VwTWVtYmVySWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IobUJ1bmRsZSwgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTYyN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIG1lZGlhIHJvdXRlciB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyCi0gKiBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElWRV9TQ0FOID0gImFjdGl2ZVNjYW4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGFjdGl2ZVNjYW4gVHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOLCBhY3RpdmVTY2FuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9TRUxFQ1RPUikpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVNjYW4oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qgb3RoZXIgPSAoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmVxdWFscyhvdGhlci5nZXRTZWxlY3RvcigpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc0FjdGl2ZVNjYW4oKSA9PSBvdGhlci5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaGFzaENvZGUoKSBeIChpc0FjdGl2ZVNjYW4oKSA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkRpc2NvdmVyeVJlcXVlc3R7IHNlbGVjdG9yPSIpLmFwcGVuZChnZXRTZWxlY3RvcigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVTY2FuPSIpLmFwcGVuZChpc0FjdGl2ZVNjYW4oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSB1c2VkIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgZm9yCi0gKiB1c2Ugd2l0aGluIGFuIGFwcGxpY2F0aW9uLiAgTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBhbHNvIGJlIGRlY2xhcmVkCi0gKiBhcyBhIHNlcnZpY2UgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyB0byBhbGwgYXBwbGljYXRpb25zCi0gKiBpbiB0aGUgc3lzdGVtLgotICogPHA+Ci0gKiBUaGUgcHVycG9zZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHRvIGRpc2NvdmVyIG1lZGlhIHJvdXRlcyB0aGF0IHNhdGlzZnkKLSAqIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgcHVibGlzaCBhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcn0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJvdXRlIGJ5IGNhbGxpbmcKLSAqIHtAbGluayAjc2V0RGVzY3JpcHRvcn0gdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ2FsbGJhY2t9LgotICogPC9wPjxwPgotICogVGhlIHByb3ZpZGVyIHNob3VsZCB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgYnkgaW1wbGVtZW50aW5nCi0gKiB7QGxpbmsgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWR9IGFuZCB1cGRhdGluZyB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IGl0IGlzCi0gKiBhdHRlbXB0aW5nIHRvIGRpc2NvdmVyLiAgSXQgc2hvdWxkIGFsc28gaGFuZGxlIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMgc3VjaAotICogYXMgdm9sdW1lIGNoYW5nZXMgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudHN9Ci0gKiBieSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcn0gdG8gcmV0dXJuIGEge0BsaW5rIFJvdXRlQ29udHJvbGxlcn0KLSAqIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gKiA8L3A+PHA+Ci0gKiBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBiZSB1c2VkIHByaXZhdGVseSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2luZ2xlCi0gKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGJ5IGNhbGxpbmcge0BsaW5rIE1lZGlhUm91dGVyI2FkZFByb3ZpZGVyIE1lZGlhUm91dGVyLmFkZFByb3ZpZGVyfQotICogdG8gYWRkIGl0IHRvIHRoZSBsb2NhbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9LiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYWxzbyBiZSBtYWRlCi0gKiBhdmFpbGFibGUgZ2xvYmFsbHkgdG8gYWxsIGFwcGxpY2F0aW9ucyBieSByZWdpc3RlcmluZyBhIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlfQotICogaW4gdGhlIHByb3ZpZGVyJ3MgbWFuaWZlc3QuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZWdpc3RlcmVkCi0gKiBhcyBhIHNlcnZpY2UsIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIG1lZGlhIHJvdXRlciBBUEkgd2lsbCBiZSBhYmxlIHRvCi0gKiBkaXNjb3ZlciBhbmQgdXNlZCB0aGUgcHJvdmlkZXIncyByb3V0ZXMgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBlbHNlLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySGFuZGxlciBtSGFuZGxlciA9IG5ldyBQcm92aWRlckhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVyTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBnZXRDbGFzcygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGhhbmRsZXIgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gbUhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBzb21lIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlck1ldGFkYXRhIGdldE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHVzZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKEBOdWxsYWJsZSBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCB3aGljaCBpbmZvcm1zIHRoZSBwcm92aWRlciBhYm91dCB0aGUKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRpc2NvdmVyeSByZXF1ZXN0IHRvIGluZm9ybSB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlIGtpbmRzIG9mCi0gICAgICogcm91dGVzIHRoYXQgaXRzIGNsaWVudHMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKE9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICBpZiAoIW1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSkgewotICAgICAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpIHsKLSAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQobURpc2NvdmVyeVJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gdGhlIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBkaXNjb3ZlcnkgcmVxdWVzdH0KLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuZXZlciBhbiBhcHBsaWNhdGlvbnMgY2FsbHMge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrfSB0byByZWdpc3RlcgotICAgICAqIGEgY2FsbGJhY2ssIGl0IGFsc28gcHJvdmlkZXMgYSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdAotICAgICAqIGl0IGlzIGludGVyZXN0ZWQgaW4uICBUaGUgbWVkaWEgcm91dGVyIGNvbWJpbmVzIGFsbCBvZiB0aGVzZSBzZWxlY3RvcnMgdG9nZXRoZXIKLSAgICAgKiB0byBnZW5lcmF0ZSBhIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIG5vdGlmaWVzIGVhY2ggcHJvdmlkZXIgd2hlbiBhIGNoYW5nZQotICAgICAqIG9jY3VycyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlzY292ZXJ5UmVxdWVzdH0gd2hpY2ggcG9zdHMgYSBtZXNzYWdlIHRvIGludm9rZQotICAgICAqIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGV4YW1pbmUgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfQotICAgICAqIGluIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCdzIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHRvIGRldGVybWluZSB3aGF0Ci0gICAgICoga2luZHMgb2Ygcm91dGVzIGl0IHNob3VsZCB0cnkgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIHBlcmZvcm0gYWN0aXZlCi0gICAgICogb3IgcGFzc2l2ZSBzY2Fucy4gIEluIG1hbnkgY2FzZXMsIHRoZSBwcm92aWRlciBtYXkgYmUgYWJsZSB0byBzYXZlIHBvd2VyIGJ5Ci0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0aGUgc2VsZWN0b3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcyB0aGF0IGl0IHN1cHBvcnRzCi0gICAgICogYW5kIGl0IGNhbiB0aGVyZWZvcmUgYXZvaWQgcGVyZm9ybWluZyBhbnkgc2NhbnMgYXQgYWxsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChATnVsbGFibGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQKLSAgICAgKiB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLiAgV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBieSByZWdpc3RlcmluZyBhIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAotICAgICAqIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gYWJvdXQgdGhlIGNoYW5nZSB0byB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSB1cGRhdGVkIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlc2NyaXB0b3IoQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSBmYWxzZTsKLQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsIG1EZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZSB3aGljaCBpcyBhCi0gICAgICogbWVtYmVyIG9mIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSBtZW1iZXIgcm91dGUuCi0gICAgICogQHBhcmFtIHJvdXRlR3JvdXBJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSBncm91cC4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlck1ldGFkYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotCi0gICAgICAgIFByb3ZpZGVyTWV0YWRhdGEoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tcG9uZW50TmFtZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBjb21wb25lbnQgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXJNZXRhZGF0YXsgY29tcG9uZW50TmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBjb250cm9sIG92ZXIgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgb2J0YWlucyBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUgd2hlbmV2ZXIgaXQgbmVlZHMKLSAgICAgKiB0byBjb250cm9sIGEgcm91dGUuICBXaGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcwotICAgICAqIHRoZSB7QGxpbmsgI29uU2VsZWN0fSBtZXRob2Qgb2YgaXRzIHJvdXRlIGNvbnRyb2xsZXIuICBXaGlsZSBzZWxlY3RlZCwKLSAgICAgKiB0aGUgbWVkaWEgcm91dGVyIG1heSBjYWxsIG90aGVyIG1ldGhvZHMgb2YgdGhlIHJvdXRlIGNvbnRyb2xsZXIgdG8KLSAgICAgKiByZXF1ZXN0IHRoYXQgaXQgcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgdG8gdGhlIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzCi0gICAgICogdW5zZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzIHRoZSB7QGxpbmsgI29uVW5zZWxlY3R9IG1ldGhvZCBvZiBpdHMKLSAgICAgKiByb3V0ZSBjb250cm9sbGVyLiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSByb3V0ZSBjb250cm9sbGVyCi0gICAgICogaXQgd2lsbCBpbnZva2UgdGhlIHtAbGluayAjb25SZWxlYXNlfSBtZXRob2QgdG8gYWxsb3cgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb3V0ZSBjb250cm9sbGVycyBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoZQotICAgICAqIHNhbWUgcm91dGUuICBFYWNoIHJvdXRlIGNvbnRyb2xsZXIgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcm91dGUgY29udHJvbGxlciBhcmUgYXN5bmNocm9ub3VzIGFuZAotICAgICAqIHJlc3VsdHMgYXJlIGNvbW11bmljYXRlZCB2aWEgY2FsbGJhY2tzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWxlYXNlcyB0aGUgcm91dGUgY29udHJvbGxlciwgYWxsb3dpbmcgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZSBhbmQgcHJvdmlkZXMgYSByZWFzb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIGNhbGxzIHtAbGluayAjb25VbnNlbGVjdCgpfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm1zIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0Ci0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IG9uIGJlaGFsZiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaW50ZW5kcyB0byBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwKLSAgICAgICAgICogaW52b2tlIHRoZSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkLiAgRmFsc2UgaWYgdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QKLSAgICAgICAgICogaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aGVuIHJvdXRlIGluZm9ybWF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9yIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHByb3ZpZGVyIGFuZCBpdHMgcm91dGVzIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgdGhhdCBjaGFuZ2VkLCBuZXZlciBudWxsLgotICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV3IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByb3ZpZGVySGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgYW5kIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPVVRFUyA9ICJyb3V0ZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgcm91dGVzIHRoYXQgdGhpcyBwcm92aWRlciBoYXMgcHVibGlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVzKCkgewotICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBtQnVuZGxlLjxCdW5kbGU+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZUJ1bmRsZXMgPT0gbnVsbCB8fCByb3V0ZUJ1bmRsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IENvbGxlY3Rpb25zLjxNZWRpYVJvdXRlRGVzY3JpcHRvcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVCdW5kbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oY291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChNZWRpYVJvdXRlRGVzY3JpcHRvci5mcm9tQnVuZGxlKHJvdXRlQnVuZGxlcy5nZXQoaSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYW5kIGFsbCBvZiB0aGUgcm91dGVzIHRoYXQKLSAgICAgKiBpdCBjb250YWlucyBoYXZlIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgdmVyaWZpY2F0aW9uIGlzIGRlZXAuICBJZiB0aGUgcHJvdmlkZXIgZGVzY3JpcHRvciBpcyBrbm93biB0byBiZQotICAgICAqIHZhbGlkIHRoZW4gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjaXNWYWxpZH0gb24gZWFjaCBvZiBpdHMgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCB8fCAhcm91dGUuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInJvdXRlcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldFJvdXRlcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZVJvdXRlcygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGRlc2NyaXB0b3IubVJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGUoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgZGVzY3JpcHRvciBhbHJlYWR5IGFkZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiByb3V0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIEJ1aWxkZXIgc2V0Um91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsIHx8IHJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnJlbW92ZShLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8Pihyb3V0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlQnVuZGxlcy5hZGQobVJvdXRlcy5nZXQoaSkuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTLCByb3V0ZUJ1bmRsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKG1CdW5kbGUsIG1Sb3V0ZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTkzNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wgewotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmljZS4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBjbGllbnQgdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVHSVNURVIgPSAxOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVW5yZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOUkVHSVNURVIgPSAyOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogQ3JlYXRlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9ST1VURV9JRCA6IHJvdXRlIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIgPSAzOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUmVsZWFzZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSID0gNDsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFTEVDVF9ST1VURSA9IDU7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFID0gNjsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNldCByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSA9IDc7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVcGRhdGUgcm91dGUgdm9sdW1lLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGRlbHRhIGludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUgPSA4OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gb2JqICAgICA6IG1lZGlhIGNvbnRyb2wgaW50ZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QgPSA5OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0cyB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiBkaXNjb3ZlcnkgcmVxdWVzdCBidW5kbGUsIG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUID0gMTA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9JRCA9ICJyb3V0ZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQID0gInJvdXRlR3JvdXBJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVk9MVU1FID0gInZvbHVtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OID0gInVuc2VsZWN0UmVhc29uIjsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQuCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGFueSB1bnJlY29nbml6ZWQgb3IgbWFsZm9ybWVkIHJlcXVlc3QuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSA9IDA7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNjZXNzZnVsIG1lc3NhZ2UuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUyA9IDE7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogc2VydmVyIHZlcnNpb24KLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQgPSAyOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZXNzIHJlc3VsdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCA9IDM7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWx1cmUgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKiAtIFNFUlZJQ0VfREFUQV9FUlJPUjogZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQgPSA0OwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgY2hhbmdlZC4gICh1bnNvbGljaXRlZCBldmVudCkKLSAgICAgKiAtIGFyZzEgICAgOiByZXNlcnZlZCAoMCkKLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RBVEFfRVJST1IgPSAiZXJyb3IiOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIGNsaWVudCB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHYyNC4xLjAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBjbGllbnQgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9DVVJSRU5UID0gQ0xJRU5UX1ZFUlNJT05fMjsKLQotICAgIC8qCi0gICAgICogUmVjb2duaXplZCBzZXJ2ZXIgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IHNlcnZpY2UgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCA9IFNFUlZJQ0VfVkVSU0lPTl8xOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9TVEFSVCA9IENMSUVOVF9WRVJTSU9OXzE7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NlbmdlciBvYmplY3QgaXMgdmFsaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lc3NlbmdlciBjb25zdHJ1Y3RvciBhbmQgdW5wYXJjZWxpbmcgY29kZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHRoZQotICAgICAqIHByb3ZpZGVkIElCaW5kZXIgaXMgYSB2YWxpZCBJTWVzc2VuZ2VyIG9iamVjdC4gIEFzIGEgcmVzdWx0LCBpdCdzIHBvc3NpYmxlCi0gICAgICogZm9yIGEgcGVlciB0byBzZW5kIGFuIGludmFsaWQgSUJpbmRlciB0aGF0IHdpbGwgcmVzdWx0IGluIGNyYXNoZXMgZG93bnN0cmVhbS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgbWVzc2VuZ2VyIGlzIGluIGEgdmFsaWQgc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXNzZW5nZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIuZ2V0QmluZGVyKCkgIT0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzZW5nZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBiaW5kZXIgaW50ZXJmYWNlIG90aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIElNZXNzZW5nZXIgdGhlbiB0aGUgY2FsbCB0byBnZXRCaW5kZXIoKSB3aWxsIGNyYXNoIHdpdGggYW4gTlBFLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2RlMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICogPHA+Ci0gKiBBIG1lZGlhIHJvdXRlciB3aWxsIGJpbmQgdG8gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgd2hlbiBhIGNhbGxiYWNrIGlzIGFkZGVkIHZpYQotICoge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2ssIGludCl9IHdpdGggYSBkaXNjb3ZlcnkKLSAqIGZsYWc6IHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSwKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0sIG9yCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSwgYW5kIHdpbGwgdW5iaW5kIHdoZW4gdGhlIGNhbGxiYWNrCi0gKiBpcyByZW1vdmVkIHZpYSB7QGxpbmsgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soTWVkaWFSb3V0ZXIuQ2FsbGJhY2spfS4KLSAqIDwvcD48cD4KLSAqIFRvIGltcGxlbWVudCB5b3VyIG93biBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLCBleHRlbmQgdGhpcyBjbGFzcyBhbmQKLSAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyfSBtZXRob2QgdG8gcmV0dXJuIGFuCi0gKiBpbnN0YW5jZSBvZiB5b3VyIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9LgotICogPC9wPjxwPgotICogRGVjbGFyZSB5b3VyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgaW4geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdAotICogbGlrZSB0aGlzOgotICogPC9wPgotICogPHByZT4KLSAqICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIgotICogICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbXlfbWVkaWFfcm91dGVfcHJvdmlkZXJfc2VydmljZSI+Ci0gKiAgICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KLSAqICAgICAgICAgICAmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICogICAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgotICogICAmbHQ7L3NlcnZpY2U+Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJTcnYiOyAvLyBtYXguIDIzIGNoYXJzCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+IG1DbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7Ci0gICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjazsKLQotICAgIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0U7Ci0KLSAgICAvKgotICAgICAqIFByaXZhdGUgbWVzc2FnZXMgdXNlZCBpbnRlcm5hbGx5LiAgKFllcywgeW91IGNhbiByZW51bWJlciB0aGVzZS4pCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlKCkgewotICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICAgICAgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc3lzdGVtIHdoZW4gaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKLSAgICAgKiB0aGlzIHNlcnZpY2UgaGFzIGRlY2lkZWQgbm90IHRvIG9mZmVyIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE1lZGlhUm91dGVQcm92aWRlciBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldE1lZGlhUm91dGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhTRVJWSUNFX0lOVEVSRkFDRSkpIHsKLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBwcm92aWRlciB3aG9zZSBwYWNrYWdlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9mIHRoZSBzZXJ2aWNlLiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGNhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9ubHkgZXhwb3J0IGl0cyBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXJzLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm92aWRlciBwYWNrYWdlIG5hbWU6ICIgKyBwcm92aWRlclBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgU2VydmljZSBwYWNrYWdlIG5hbWU6ICIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVNZXNzZW5nZXIuZ2V0QmluZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24gPj0gQ0xJRU5UX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBuZXcgQ2xpZW50UmVjb3JkKG1lc3NlbmdlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUmVnaXN0ZXJlZCwgdmVyc2lvbj0iICsgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtUHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfUkVHSVNURVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFVucmVnaXN0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBvbkJpbmRlckRpZWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogQmluZGVyIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkLCBjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciBjcmVhdGVkLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcm91dGVJZD0iICsgcm91dGVJZCArICIsIHJvdXRlR3JvdXBJZD0iICsgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQucmVsZWFzZVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciByZWxlYXNlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHNlbGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVW5zZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdChyZWFzb24pOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHVuc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXRSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgY2hhbmdlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgdm9sdW1lPSIgKyB2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVXBkYXRlUm91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSB1cGRhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBkZWx0YT0iICsgZGVsdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUm91dGVDb250cm9sUmVxdWVzdChmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBmaW5hbCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRyb2xsZXJJZCwgZmluYWwgSW50ZW50IGludGVudCkgewotICAgICAgICBmaW5hbCBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBlcnJvcj0iICsgZXJyb3IgKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IsIGVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBkZWxpdmVyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2V0RGlzY292ZXJ5UmVxdWVzdChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxseUNoYW5nZWQgPSBjbGllbnQuc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2V0IGRpc2NvdmVyeSByZXF1ZXN0LCByZXF1ZXN0PSIgKyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjdHVhbGx5Q2hhbmdlZD0iICsgYWN0dWFsbHlDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q9IiArIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZW5kRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgc2VuZFJlcGx5KGNsaWVudC5tTWVzc2VuZ2VyLCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZW50IGRlc2NyaXB0b3IgY2hhbmdlIGV2ZW50LCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBCdW5kbGUgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoZGVzY3JpcHRvcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Um91dGVzKG51bGwpOwotICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogZGVzY3JpcHRvci5nZXRSb3V0ZXMoKSkgewotICAgICAgICAgICAgaWYgKGNsaWVudFZlcnNpb24gPj0gcm91dGUuZ2V0TWluQ2xpZW50VmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICYmIGNsaWVudFZlcnNpb24gPD0gcm91dGUuZ2V0TWF4Q2xpZW50VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5hc0J1bmRsZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgY29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgc2VsZWN0b3JCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gbUNsaWVudHMuZ2V0KGkpLm1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoIXJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5pc0VtcHR5KCkgfHwgcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTY2FuIHw9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoY29tcG9zaXRlLmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlci5hZGRTZWxlY3RvcihyZXF1ZXN0LmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvckJ1aWxkZXIuYnVpbGQoKSwgYWN0aXZlU2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCwgY29tcG9zaXRlKSkgewotICAgICAgICAgICAgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICBtUHJvdmlkZXIuc2V0RGlzY292ZXJ5UmVxdWVzdChjb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xpZW50UmVjb3JkIGdldENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtQ2xpZW50cy5nZXQoaW5kZXgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZmluZENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNsaWVudC5oYXNNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY0ZhaWx1cmUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSwgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNTdWNjZXNzKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kUmVwbHkoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHdoYXQsCi0gICAgICAgICAgICBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7Ci0gICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgZGllZC4KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBnZXRDbGllbnRJZChtZXNzZW5nZXIpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldENsaWVudElkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgcmV0dXJuICJDbGllbnQgY29ubmVjdGlvbiAiICsgbWVzc2VuZ2VyLmdldEJpbmRlcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQUklWQVRFX01TR19DTElFTlRfRElFRDoKLSAgICAgICAgICAgICAgICAgICAgb25CaW5kZXJEaWVkKChNZXNzZW5nZXIpbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpZW50UmVjb3JkIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwdWJsaWMgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+KCk7Ci0KLSAgICAgICAgcHVibGljIENsaWVudFJlY29yZChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgdmVyc2lvbikgewotICAgICAgICAgICAgbU1lc3NlbmdlciA9IG1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMudmFsdWVBdChpKS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotCi0gICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7Ci0KLSAgICAgICAgICAgIHNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzZW5nZXIoTWVzc2VuZ2VyIG90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKSA9PSBvdGhlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCwKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmluZGV4T2ZLZXkoY29udHJvbGxlcklkKSA8IDApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZUdyb3VwSWQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgZ2V0Um91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW5zIG9uIGEgYmluZGVyIHRocmVhZC4KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShQUklWQVRFX01TR19DTElFTlRfRElFRCwgbU1lc3Nlbmdlcikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGllbnRJZChtTWVzc2VuZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogdG8gcHJldmVudCB0aGUgc2VydmljZSBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIG9uZSBvZiB0aGUgY2xpZW50cyBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgc2VydmVyJ3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBjbGllbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPiBtU2VydmljZVJlZjsKLQotICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBtU2VydmljZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+KHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtc2cucmVwbHlUbzsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKHdoYXQsIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGdldENsaWVudElkKG1lc3NlbmdlcikgKyAiOiBNZXNzYWdlIGZhaWxlZCwgd2hhdD0iICsgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgYXJnPSIgKyBhcmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvYmo9IiArIG9iaiArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljRmFpbHVyZShtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWdub3JpbmcgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHJlcGx5IG1lc3Nlbmdlci4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlJFR0lTVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUlkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlR3JvdXBJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uID0gZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmdldEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJlYXNvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0Um91dGVWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCB2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VcGRhdGVSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJvdXRlQ29udHJvbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCAoSW50ZW50KW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5mcm9tQnVuZGxlKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldERpc2NvdmVyeVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmlzVmFsaWQoKSA/IHJlcXVlc3QgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2OWIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2Ygcm91dGVzIHRoYXQgYXBwbGljYXRpb25zIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIgYW5kIHVzZS4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+RXhhbXBsZTwvaDM+Ci0gKiA8cHJlPgotICogTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgLmJ1aWxkKCk7Ci0gKgotICogTWVkaWFSb3V0ZXIgcm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gKiByb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVNlbGVjdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0NBVEVHT1JJRVMgPSAiY29udHJvbENhdGVnb3JpZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOwotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgcm91dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIEVNUFRZID0gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihuZXcgQnVuZGxlKCksIG51bGwpOwotCi0gICAgTWVkaWFSb3V0ZVNlbGVjdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8U3RyaW5nPiBjb250cm9sQ2F0ZWdvcmllcykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBjb250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSBpbiB0aGUgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNhdGVnb3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250cm9sQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsIHx8IG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhdGVnb3J5IGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udHJvbENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaSkuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgbGlzdCBvZiBjb250cm9sIGZpbHRlcnMgdG8gY29uc2lkZXIuCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKExpc3Q8SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnlDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbHRlckNvdW50ID0gZmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3J5Q291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkobUNvbnRyb2xDYXRlZ29yaWVzLmdldChqKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBiZSBleGFtaW5lZC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zQWxsKHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgZG9lcyBub3Qgc3BlY2lmeSBhbnkgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMobnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBvdGhlciA9IChNZWRpYVJvdXRlU2VsZWN0b3IpbzsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBvdGhlci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5lcXVhbHMob3RoZXIubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVNlbGVjdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiY29udHJvbENhdGVnb3JpZXM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sQ2F0ZWdvcmllcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGZyb21CdW5kbGUoQE51bGxhYmxlIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBzZWxlY3RvciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yeX0gdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3JpZXMgVGhlIGxpc3QgY2F0ZWdvcmllcyB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yaWVzKEBOb25OdWxsIENvbGxlY3Rpb248U3RyaW5nPiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcmllcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBtZWRpYSByb3V0ZSBzZWxlY3RvciB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgYWRkZWQuCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3JpZXMoc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMDUyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkFjdGl2aXR5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuVm9sdW1lUHJvdmlkZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUHJvdmlkZXJNZXRhZGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWVkaWFSb3V0ZXIgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzCi0gKiBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZSB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy4KLSAqIDxwPgotICogQSBNZWRpYVJvdXRlciBpbnN0YW5jZSBpcyByZXRyaWV2ZWQgdGhyb3VnaCB7QGxpbmsgI2dldEluc3RhbmNlfS4gIEFwcGxpY2F0aW9ucwotICogY2FuIHF1ZXJ5IHRoZSBtZWRpYSByb3V0ZXIgYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBhbmQgaXRzIGNhcGFiaWxpdGllcwotICogdG8gZGV0ZXJtaW5lIGhvdyB0byBzZW5kIGNvbnRlbnQgdG8gdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uICBBcHBsaWNhdGlvbnMgY2FuCi0gKiBhbHNvIHtAbGluayBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IHNlbmQgY29udHJvbCByZXF1ZXN0c30gdG8gdGhlIHJvdXRlCi0gKiB0byBhc2sgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9ucwotICogc3VjaCBhcyBwbGF5aW5nIG1lZGlhLgotICogPC9wPjxwPgotICogU2VlIGFsc28ge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBhbiBhcHBsaWNhdGlvbgotICogY2FuIHB1Ymxpc2ggbmV3IG1lZGlhIHJvdXRlcyB0byB0aGUgbWVkaWEgcm91dGVyLgotICogPC9wPjxwPgotICogVGhlIG1lZGlhIHJvdXRlciBBUEkgaXMgbm90IHRocmVhZC1zYWZlOyBhbGwgaW50ZXJhY3Rpb25zIHdpdGggaXQgbXVzdCBiZQotICogZG9uZSBmcm9tIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2Vzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlciI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHJlYXNvbiB0aGUgcm91dGUKLSAgICAgKiB3YXMgdW5zZWxlY3RlZCBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9VTktOT1dOID0gMDsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBkaXNjb25uZWN0IGJ1dHRvbiB0byBkaXNjb25uZWN0IGFuZCBrZWVwIHBsYXlpbmcuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVEZXNjcmlwdG9yI2NhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKLSAgICAgKiB0aGUgc3RvcCBjYXN0aW5nIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA9IDI7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgICogYSBkaWZmZXJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQgPSAzOwotCi0gICAgLy8gTWFpbnRhaW5zIGdsb2JhbCBtZWRpYSByb3V0ZXIgc3RhdGUgZm9yIHRoZSBwcm9jZXNzLgotICAgIC8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoKSBiZWZvcmUgYW55Ci0gICAgLy8gTWVkaWFSb3V0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIHNvIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAvLyB2YWxpZCB3aGVuZXZlciBhbnkgaW5zdGFuY2UgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgc3RhdGljIEdsb2JhbE1lZGlhUm91dGVyIHNHbG9iYWw7Ci0KLSAgICAvLyBDb250ZXh0LWJvdW5kIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1DYWxsYmFja1JlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgQEludERlZihmbGFnID0gdHJ1ZSwKLSAgICAgICAgICAgIHZhbHVlID0gewotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4sCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlksCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgIH0KLSAgICApCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDYWxsYmFja0ZsYWdzIHt9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogQWN0aXZlbHkgc2NhbiBmb3Igcm91dGVzIHdoaWxlIHRoaXMgY2FsbGJhY2sKLSAgICAgKiBpcyByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIGFjdGl2ZWx5IHNjYW4gZm9yIG5ldwotICAgICAqIHJvdXRlcy4gIENlcnRhaW4gcm91dGVzLCBzdWNoIGFzIHdpZmkgZGlzcGxheSByb3V0ZXMsIG1heSBub3QgYmUgZGlzY292ZXJhYmxlCi0gICAgICogZXhjZXB0IHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcuICBUaGlzIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcm91dGUgcGlja2VyCi0gICAgICogZGlhbG9nIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcm91dGUgaW5mb3JtYXRpb24gaXMKLSAgICAgKiB1cCB0byBkYXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBY3RpdmUgc2Nhbm5pbmcgbWF5IGNvbnN1bWUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgcG93ZXIgYW5kIG1heSBoYXZlIGludHJ1c2l2ZQotICAgICAqIGVmZmVjdHMgb24gd2lyZWxlc3MgY29ubmVjdGl2aXR5LiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0IGFjdGl2ZSBzY2FubmluZwotICAgICAqIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gaXQgaXMgYWN0dWFsbHkgbmVlZGVkIHRvIHNhdGlzZnkgYSB1c2VyIHJlcXVlc3QgdG8KLSAgICAgKiBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbmV3IHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGZsYWcgaW1wbGllcyB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGJ1dCBwZXJmb3JtaW5nCi0gICAgICogYWN0aXZlIHNjYW5zIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBhIG5vcm1hbCBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOID0gMSA8PCAwOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IERvIG5vdCBmaWx0ZXIgcm91dGUgZXZlbnRzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IGFueQotICAgICAqIHJvdXRlIGV2ZW4gaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIGNhbGxiYWNrJ3MgZmlsdGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTID0gMSA8PCAxOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV4Y2VwdCBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgdHJ5IHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiBBbHRob3VnaCByb3V0ZSBkaXNjb3ZlcnkgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50LCBjaGVja2luZyBmb3IgbmV3IHJvdXRlcyBtYXkKLSAgICAgKiByZXN1bHQgaW4gc29tZSBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjb3VsZCBzbG93bHkgZHJhaW4gdGhlIGJhdHRlcnkuICBUaGVyZWZvcmUKLSAgICAgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgc3BlY2lmeSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IHdoZW4KLSAgICAgKiB0aGV5IGFyZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIGFuZCB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCB0aGUKLSAgICAgKiBvcHRpb24gb2YgY29ubmVjdGluZyB0byBuZXcgcm91dGVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHR5cGljYWxseSBhZGQgYSBjYWxsYmFjayB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5J3N9IHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnR9Ci0gICAgICogbWV0aG9kIGFuZCByZW1vdmUgaXQgaW4gdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wfSBtZXRob2QuCi0gICAgICogVGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudH0gZnJhZ21lbnQgbWF5Ci0gICAgICogYWxzbyBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnCi0gICAgICogd2lsbCBiZSBpZ25vcmVkLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZID0gMSA8PCAyOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV2ZW4gb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcwotICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgotICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKLSAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4gIFJlZmVyIHRvCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkgPSAxIDw8IDM7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBJZ25vcmUgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtYXRjaGluZyBub24tZGVmYXVsdCByb3V0ZSBpcyBhdmFpbGFibGUuCi0gICAgICogVGhpcyBjb25zdHJhaW50IG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIG9mZmVyIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZwotICAgICAqIHRvIHRoZSB1c2VyLiAgVGhlcmUgaXMgbm8gcG9pbnQgb2ZmZXJpbmcgdGhlIGNob29zZXIgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogbm9uLWRlZmF1bHQgY2hvaWNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUgPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBSZXF1aXJlIGFuIGFjdHVhbCByb3V0ZSB0byBiZSBtYXRjaGVkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCByZXR1cm4gdHJ1ZQotICAgICAqIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZiBkaXNjb3ZlcnkgaXMgbm90IGluCi0gICAgICogcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8KLSAgICAgKiBzYXZlIHJlc291cmNlcyBieSByZW1vdmluZyB0aGUgbmVlZCB0byBwZXJmb3JtIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uCi0gICAgICoge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmCi0gICAgICogYSBtYXRjaGluZyByb3V0ZSBoYXMgYWN0dWFsbHkgYmVlbiBkaXNjb3ZlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIID0gMSA8PCAxOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlcn0gaW5zdGFuY2UsIHN1Y2ggYXMgYnkgc3RvcmluZyB0aGUgaW5zdGFuY2UgaW4gYSBmaWVsZCBvZgotICAgICAqIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0byBlbnN1cmUgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHJlbWFpbnMgYWxpdmUKLSAgICAgKiBhcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBpdHMgZmVhdHVyZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc3VwcG9ydCBsaWJyYXJ5IG9ubHkgaG9sZHMgYSB7QGxpbmsgV2Vha1JlZmVyZW5jZSB3ZWFrIHJlZmVyZW5jZX0KLSAgICAgKiB0byBlYWNoIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZXIgaW5zdGFuY2UsIGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcm91dGUgZGlzY292ZXJ5Ci0gICAgICogd2lsbCBubyBsb25nZXIgYmUgcGVyZm9ybWVkIG9uIGl0cyBiZWhhbGYuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGVyIGluc3RhbmNlIGZvciB0aGUgY29udGV4dC4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGhvbGQKLSAgICAgKiBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgYXMgbG9uZyBhcyBpdCBpcyBpbiB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlciBnZXRJbnN0YW5jZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgc0dsb2JhbCA9IG5ldyBHbG9iYWxNZWRpYVJvdXRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXIoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IGN1cnJlbnRseSBrbm93biB0bwotICAgICAqIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyByb3V0ZSBwcm92aWRlcnN9Ci0gICAgICogY3VycmVudGx5IGtub3duIHRvIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0UHJvdmlkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN5c3RlbSBhbHdheXMgcHJvdmlkZXMgYSBkZWZhdWx0IHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJsdWV0b290aCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgYmx1ZXRvb3RoIHJvdXRlLCBpZiBleGlzdCwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgcm91dGUncwotICAgICAqIHtAbGluayBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgbWVkaWEgY29udHJvbCBpbnRlbnQgZmlsdGVyc30gdG8gYXNzZXNzIHRoZQotICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgcm91dGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIHB1YmxpYyBib29sZWFuIHBsYXlNb3ZpZSgpIHsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqCi0gICAgICogICAgIC8vIEZpcnN0IHRyeSB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIGludGVyZmFjZSwgaWYgc3VwcG9ydGVkLgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogICAgICAgICAvLyBUcnkgdG8gc2VuZCBpdCB0aGUgVXJpIG9mIHRoZSBtb3ZpZSB0byBwbGF5LgotICAgICAqICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgKiAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgICAgICAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbnVsbCk7Ci0gICAgICogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNlbnQgdGhlIHJlcXVlc3QgdG8gcGxheSB0aGUgbW92aWUKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIElmIHJlbW90ZSBwbGF5YmFjayB3YXMgbm90IHBvc3NpYmxlLCB0aGVuIHBsYXkgbG9jYWxseS4KLSAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIGxpdmUgdmlkZW8gc3RyZWFtaW5nLgotICAgICAqICAgICAgICAgLy8gUHJlcGFyZSB0byBwbGF5IGNvbnRlbnQgbG9jYWxseSBpbiBhIHdpbmRvdyBvciBpbiBhIHByZXNlbnRhdGlvbi4KLSAgICAgKiAgICAgICAgIHJldHVybiBwbGF5TW92aWVJbldpbmRvdygpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gTmVpdGhlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLCBzbyB3ZSBjYW4ndCBwbGF5IHRoZSBtb3ZpZSB0byB0aGlzIHJvdXRlLgotICAgICAqICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLCBvdGhlcndpc2UKLSAgICAgKiBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCByZXR1cm5zIGl0LiBJZiB0aGVyZSBpcyBvbmUgbGl2ZSBhdWRpbyByb3V0ZQotICAgICAqICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKSwgaXQgd2lsbCBiZSBzZWxlY3RlZCBpbnN0ZWFkIG9mIGRlZmF1bHQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUKLSAgICAgKiBuZXdseSBzZWxlY3RlZCBkZWZhdWx0IHJvdXRlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVNlbGVjdG9yCi0gICAgICogQHNlZSBSb3V0ZUluZm8jbWF0Y2hlc1NlbGVjdG9yCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIHVwZGF0ZVNlbGVjdGVkUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTZWxlY3RlZFJvdXRlOiAiICsgc2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAoIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBzZWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZWxlY3RSb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnNlbGVjdHMgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgaW5zdGVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhc29uIGdpdmVuIG11c3QgYmUgb25lIG9mOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiA8IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOIHx8Ci0gICAgICAgICAgICAgICAgcmVhc29uID4gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlYXNvbiB0byB1bnNlbGVjdCByb3V0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIC8vIENob29zZSB0aGUgZmFsbGJhY2sgcm91dGUgaWYgaXQncyBub3QgYWxyZWFkeSBzZWxlY3RlZC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgIFJvdXRlSW5mbyBmYWxsYmFja1JvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgIGlmIChzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSAhPSBmYWxsYmFja1JvdXRlKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKGZhbGxiYWNrUm91dGUsIHJlYXNvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCksIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSByb3V0ZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcm91dGVzIHRoYXQgbWF0Y2ggdGhlCi0gICAgICogc2VsZWN0b3IgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZQotICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuCi0gICAgICogdGhlIG1ldGhvZCB3aWxsIG9ubHkgY29uc2lkZXIgbm9uLWRlZmF1bHQgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYKLSAgICAgKiBkaXNjb3ZlcnkgaXMgbm90IGluIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4KLSAgICAgKiBVc2Uge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfSB0byByZXF1aXJlIGFuIGFjdHVhbCBtYXRjaC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgYSByb3V0ZSBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZS4gTWF5IGJlIHplcm8gb3Igc29tZSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gYW5kCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9LgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoaW5nIHJvdXRlIG1heSBiZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIHJldHVybiBzR2xvYmFsLmlzUm91dGVBdmFpbGFibGUoc2VsZWN0b3IsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKLSAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfSB3aXRob3V0IGZsYWdzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBhZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZWxlY3RvciBkZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bwotICAgICAqIGRpc2NvdmVyLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UKLSAgICAgKiBsaXZlIGF1ZGlvIHJvdXRlcyB0aGVuIGl0IHNob3VsZCBpbmNsdWRlIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJTyBsaXZlIGF1ZGlvIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3J5fQotICAgICAqIGluIGl0cyBzZWxlY3RvciB3aGVuIGl0IGFkZHMgYSBjYWxsYmFjayB0byB0aGUgbWVkaWEgcm91dGVyLgotICAgICAqIFRoZSBzZWxlY3RvciBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGNhdGVnb3JpZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHNldCBvZiBzZWxlY3RvcnMgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBjYWxsYmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQnkgZGVmYXVsdCwgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3Qgcm91dGVzCi0gICAgICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLiAgRXZlbnQgZmlsdGVyaW5nIG1heSBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nCi0gICAgICogdGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30gZmxhZyB3aGVuIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSBtZXRob2QgdG8gZGV0ZXJtaW5lCi0gICAgICogd2hldGhlciBpcyBpdCBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIHJvdXRlIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzCi0gICAgICogYW5kIHRoZXJlZm9yZSB3aGV0aGVyIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoaWxlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGlzIGluIHRoZSBmb3JlZ3JvdW5kIHRvIHJlcXVlc3QgdGhhdCBwYXNzaXZlIGRpc2NvdmVyeSBiZSBwZXJmb3JtZWQgaWYgdGhlcmUgYXJlCi0gICAgICogc3VmZmljaWVudCByZXNvdXJjZXMgdG8gYWxsb3cgY29udGludW91cyBwYXNzaXZlIGRpc2NvdmVyeS4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnIHdpbGwgYmUKLSAgICAgKiBpZ25vcmVkIHRvIGNvbnNlcnZlIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbgotICAgICAqIHBhc3NpdmUgZGlzY292ZXJ5IGFic29sdXRlbHkgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gb24gbG93LVJBTSBkZXZpY2VzLgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBpcyBzaG93aW5nIHRvIGNvbmZpcm0gdGhlIHByZXNlbmNlIG9mIGF2YWlsYWJsZQotICAgICAqIHJvdXRlcyB0aGF0IHRoZSB1c2VyIG1heSBjb25uZWN0IHRvLiAgVGhpcyBmbGFnIG1heSB1c2Ugc3Vic3RhbnRpYWxseSBtb3JlCi0gICAgICogcG93ZXIuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgKgotICAgICAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAqCi0gICAgICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gICAgICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOwotICAgICAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICAgICAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gICAgICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICAgICAqCi0gICAgICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKLSAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICAgICAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCi0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCi0gICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLgotICAgICAqIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQENhbGxiYWNrRmxhZ3MgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZENhbGxiYWNrOiBzZWxlY3Rvcj0iICsgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYWxsYmFjaz0iICsgY2FsbGJhY2sgKyAiLCBmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2FsbGJhY2tSZWNvcmQgcmVjb3JkOwotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBuZXcgQ2FsbGJhY2tSZWNvcmQodGhpcywgY2FsbGJhY2spOwotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG1DYWxsYmFja1JlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoKGZsYWdzICYgfnJlY29yZC5tRmxhZ3MpICE9IDApIHsKLSAgICAgICAgICAgIHJlY29yZC5tRmxhZ3MgfD0gZmxhZ3M7Ci0gICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVjb3JkLm1TZWxlY3Rvci5jb250YWlucyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJlY29yZC5tU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIocmVjb3JkLm1TZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdG9yKHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgewotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suICBJdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBhYm91dAotICAgICAqIGNoYW5nZXMgdG8gbWVkaWEgcm91dGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlQ2FsbGJhY2s6IGNhbGxiYWNrPSIgKyBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kQ2FsbGJhY2tSZWNvcmQoQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlY29yZHMuZ2V0KGkpLm1DYWxsYmFjayA9PSBjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIGFkZC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5hZGRQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIHJlbW92ZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50IHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lCi0gICAgICogb2YgdGhlIHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjbGllbnQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB0aGUgYXVkaW8gbWFuYWdlciB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3JlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudAotICAgICAqIEF1ZGlvTWFuYWdlci5yZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnR9IG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0gdG8gcmVnaXN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgewotICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fQotICAgICAqICAgICAgICAgICAgdG8gdW5yZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCi0gICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyBtZWRpYSBzZXNzaW9ucy4gU2V0IHRoZQotICAgICAqIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24gVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9ufSB0bwotICAgICAqICAgICAgICAgICAgdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3QgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uOiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbihtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb21wYXQgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIHtAbGluayBNZWRpYVNlc3Npb25Db21wYXR9LgotICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uQ29tcGF0OiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbkNvbXBhdChtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldE1lZGlhU2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IGNhbGxzIGludG8gdGhlIG1lZGlhIHJvdXRlciBhcmUgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICAgICAqIEl0IHBheXMgdG8gYmUgYSBsaXR0bGUgcGFyYW5vaWQgd2hlbiBnbG9iYWwgc3RhdGUgaW52YXJpYW50cyBhcmUgYXQgcmlzay4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBjaGVja0NhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSAhPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgbXVzdCBvbmx5IGJlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYWNjZXNzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWwoVCBhLCBUIGIpIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gYiB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG1lZGlhIHJvdXRlIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfQotICAgICAqIHtAbGluayAjZ2V0Q29udHJvbEZpbHRlcnMgaW50ZW50IGZpbHRlcnN9IHRoYXQgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKLSAgICAgKiByb3V0ZSBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCBpdCBpcyB1c2VkIGFuZCBjb250cm9sbGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJJbmZvIG1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0b3JJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgICAgICBwcml2YXRlIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrU3RyZWFtOwotICAgICAgICBwcml2YXRlIGludCBtRGV2aWNlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lTWF4OwotICAgICAgICBwcml2YXRlIERpc3BsYXkgbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotCi0gICAgICAgIEBJbnREZWYoe0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBDb25uZWN0aW9uU3RhdGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1RZUEVfTE9DQUwsUExBWUJBQ0tfVFlQRV9SRU1PVEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1R5cGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcGxheWJhY2sgdHlwZSwgImxvY2FsIiwgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYQotICAgICAgICAgKiBpcyBoYXBwZW5pbmcgb24gdGhlIHNhbWUgZGV2aWNlIChlLmcuIGEgcGhvbmUsIGEgdGFibGV0KSBhcyB3aGVyZSBpdCBpcwotICAgICAgICAgKiBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcGxheWJhY2sgdHlwZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZyBvbgotICAgICAgICAgKiBhIGRpZmZlcmVudCBkZXZpY2UgKGkuZS4gdGhlIHJlbW90ZSBkZXZpY2UpIHRoYW4gd2hlcmUgaXQgaXMgY29udHJvbGxlZCBmcm9tLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMTsKLQotICAgICAgICBASW50RGVmKHtERVZJQ0VfVFlQRV9VTktOT1dOLCBERVZJQ0VfVFlQRV9UViwgREVWSUNFX1RZUEVfU1BFQUtFUiwgREVWSUNFX1RZUEVfQkxVRVRPT1RIfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgRGV2aWNlVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgdHlwZSBpcyB1bmtub3duLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9VTktOT1dOID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBUVi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVFYgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1NQRUFLRVIgPSAyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIGJsdWV0b290aCBkZXZpY2Ugc3VjaCBhcyBhIGJsdWV0b290aCBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9CTFVFVE9PVEggPSAzOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1ZPTFVNRV9GSVhFRCxQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1ZvbHVtZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgZml4ZWQsIGkuZS4gaXQgY2Fubm90IGJlCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbSB0aGlzIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBmaXhlZCBwbGF5YmFjayB2b2x1bWUgaXMgYSByZW1vdGUgcGxheWVyLAotICAgICAgICAgKiBwbGF5aW5nIG92ZXIgSERNSSB3aGVyZSB0aGUgdXNlciBwcmVmZXJzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvbiB0aGUgSERNSSBzaW5rLCByYXRoZXIKLSAgICAgICAgICogdGhhbiBhdHRlbnVhdGUgYXQgdGhlIHNvdXJjZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9GSVhFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyB2YXJpYWJsZSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKLSAgICAgICAgICogZnJvbSB0aGlzIG9iamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkIGluZGljYXRpbmcgbm8gcHJlc2VudGF0aW9uIGRpc3BsYXkgaXMgYXNzb2NpYXRlZAotICAgICAgICAgKiB3aXRoIHRoZSByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUgPSAtMTsKLQotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9HRU5FUkFMID0gMSA8PCAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9WT0xVTUUgPSAxIDw8IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZID0gMSA8PCAyOwotCi0gICAgICAgIC8vIFNob3VsZCBtYXRjaCB0byBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FLgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7Ci0KLSAgICAgICAgUm91dGVJbmZvKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm92aWRlciBvZiB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb3ZpZGVySW5mbyBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSB1bmlxdWUgaWQgZnVuY3Rpb25zIGFzIGEgc3RhYmxlIGlkZW50aWZpZXIgYnkgd2hpY2ggdGhlIHJvdXRlIGlzIGtub3duLgotICAgICAgICAgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGlkIGFzIGEgdG9rZW4gdG8gcmVtZW1iZXIgdGhlCi0gICAgICAgICAqIHNlbGVjdGVkIHJvdXRlIGFjcm9zcyByZXN0YXJ0cyBvciB0byBjb21tdW5pY2F0ZSBpdHMgaWRlbnRpdHkgdG8gYSBzZXJ2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUsIG5ldmVyIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIGEgbWVkaWEgcm91dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgcHJlc2VudGVkCi0gICAgICAgICAqIHRvIHVzZXJzIHdobyBtYXkgc2VsZWN0IHRoaXMgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkIGFuZCBtYXkgYmUgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QKLSAgICAgICAgICogeWV0IHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3Ige0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICAgICAqLwotICAgICAgICBAQ29ubmVjdGlvblN0YXRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0U2VsZWN0ZWRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldERlZmF1bHRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRCbHVldG9vdGhSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZXZpY2VTcGVha2VyKCkgewotICAgICAgICAgICAgaW50IGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfYXVkaW9fcm91dGVfbmFtZSIsICJzdHJpbmciLCAiYW5kcm9pZCIpOwotICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICYmIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRUZXh0KGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQpLmVxdWFscyhtTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyB0aGF0Ci0gICAgICAgICAqIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZSBhbmQgdGhlIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0aGF0Ci0gICAgICAgICAqIGl0IHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnRlbnQgZmlsdGVycyB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRoYXQKLSAgICAgICAgICogdGhpcyByb3V0ZSBzdXBwb3J0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sUmVxdWVzdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKiBkZXNjcmliZWQgYnkgYSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgY2FwYWJpbGl0aWVzIHRvIGNoZWNrLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoZXNDb250cm9sRmlsdGVycyhtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yaWVzIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZQotICAgICAgICAgKiBzdWNoIGFzIHdoZXRoZXIgaXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyBzdHJlYW1pbmcgb3IgcmVtb3RlIHBsYXliYWNrLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAotICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGNhdGVnb3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeSBhbmQgYWN0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBhY3Rpb25zIGRlc2NyaWJlIHNwZWNpZmljIHJlcXVlc3RzIHRoYXQgYW4gYXBwbGljYXRpb24KLSAgICAgICAgICogY2FuIGFzayBhIHJvdXRlIHRvIHBlcmZvcm0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGFjdGlvbgotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGFjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbEFjdGlvbihATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnksIEBOb25OdWxsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG1Db250cm9sRmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShjYXRlZ29yeSkgJiYgZmlsdGVyLmhhc0FjdGlvbihhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBzR2xvYmFsLmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLm1hdGNoKGNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCB0cnVlLCBUQUcpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbmRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0IHRvIGJlIHBlcmZvcm1lZAotICAgICAgICAgKiBhc3luY2hyb25vdXNseSBieSB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQotICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgQ29udHJvbCByZXF1ZXN0cwotICAgICAgICAgKiBzZW50IHRvIHVuc2VsZWN0ZWQgcm91dGVzIHdpbGwgZmFpbC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0Ci0gICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIHNHbG9iYWwuc2VuZENvbnRyb2xSZXF1ZXN0KHRoaXMsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tUeXBlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYXVkaW8gc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9UWVBFX1RWfSBvciB7QGxpbmsgI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUeXBlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgewotICAgICAgICAgICAgaWYgKGlzRGVmYXVsdCgpIHx8IG1EZXZpY2VUeXBlID09IERFVklDRV9UWVBFX0JMVUVUT09USCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtIHZlcnNpb24gMjMgb3IgYmVsb3cgd2hlcmUgdGhlIHN5c3RlbSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgZG9lc24ndCBzcGVjaWZ5IGRldmljZSB0eXBlIGZvciBibHVldG9vdGggbWVkaWEgcm91dGVzLgotICAgICAgICAgICAgcmV0dXJuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByb3V0ZSBpcyBzZWxlY3RhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIHN0aWxsIHZhbGlkIGFuZCBlbmFibGVkLgotICAgICAgICAgICAgLy8gVGhlIHJvdXRlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgcm91dGUgaXMgcmVtb3ZlZC4KLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvciAhPSBudWxsICYmIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcihNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgQFBsYXliYWNrVm9sdW1lCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHJvdXRlLiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5Ci0gICAgICAgICAqIGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAqIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1heDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyByb3V0ZSBzdXBwb3J0cyBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaW50ZXJydXB0aW5nCi0gICAgICAgICAqIHBsYXliYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBjYW4gZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLAotICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbkRpc2Nvbm5lY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYSB2b2x1bWUgY2hhbmdlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldFZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0U2V0Vm9sdW1lKHRoaXMsIE1hdGgubWluKG1Wb2x1bWVNYXgsIE1hdGgubWF4KDAsIHZvbHVtZSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0VXBkYXRlVm9sdW1lKHRoaXMsIGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRGlzcGxheX0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gc2hvdwotICAgICAgICAgKiBhIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbiB0aGlzIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5IGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICogc2VsZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseSBvZiB0aGUgcm91dGUKLSAgICAgICAgICogYmVpbmcgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC4gIEZvciBleGFtcGxlLCB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogb2YgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIG1heSBjaGFuZ2Ugd2hlbiBhbiBleHRlcm5hbCBIRE1JIGRpc3BsYXkgaXMgY29ubmVjdGVkCi0gICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBldmVuIHRob3VnaCB0aGUgcm91dGUgaXRzZWxmIGhhcyBub3QgY2hhbmdlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhlIHJvdXRlIG9yIGlmIHRoZSBkaXNwbGF5IGlzIG5vdCByZWFkeSB0byBzaG93IFVJIHlldC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogdXNpbmcgdGhlIHtAbGluayBDYWxsYmFjayNvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWR9IGNhbGxiYWNrIGFuZAotICAgICAgICAgKiBzaG93IG9yIGRpc21pc3MgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IGFjY29yZGluZ2x5IHdoZW4gdGhlIGRpc3BsYXkKLSAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgb3IgaXMgcmVtb3ZlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGZvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30gcm91dGVzLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSB0byB1c2Ugd2hlbiB0aGlzIHJvdXRlIGlzCi0gICAgICAgICAqIHNlbGVjdGVkIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTwotICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkID49IDAgJiYgbVByZXNlbnRhdGlvbkRpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gc0dsb2JhbC5nZXREaXNwbGF5KG1QcmVzZW50YXRpb25EaXNwbGF5SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGV4dHJhIHByb3BlcnRpZXMgYWJvdXQgdGhpcyByb3V0ZSB0aGF0IHdlcmUgc3VwcGxpZWQKLSAgICAgICAgICogYnkgaXRzIG1lZGlhIHJvdXRlIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NJbnRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzSW50ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhpcyBtZWRpYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZSh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZUluZm97IHVuaXF1ZUlkPSIgKyBtVW5pcXVlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBtTmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0aW9uPSIgKyBtRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBpY29uVXJpPSIgKyBtSWNvblVyaQotICAgICAgICAgICAgICAgICAgICArICIsIGVuYWJsZWQ9IiArIG1FbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGluZz0iICsgbUNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uU3RhdGU9IiArIG1Db25uZWN0aW9uU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYW5EaXNjb25uZWN0PSIgKyBtQ2FuRGlzY29ubmVjdAotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrVHlwZT0iICsgbVBsYXliYWNrVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrU3RyZWFtPSIgKyBtUGxheWJhY2tTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VUeXBlPSIgKyBtRGV2aWNlVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZUhhbmRsaW5nPSIgKyBtVm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWU9IiArIG1Wb2x1bWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVNYXg9IiArIG1Wb2x1bWVNYXgKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IiArIG1QcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXM9IiArIG1FeHRyYXMKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXR0aW5nc0ludGVudD0iICsgbVNldHRpbmdzSW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcHJvdmlkZXJQYWNrYWdlTmFtZT0iICsgbVByb3ZpZGVyLmdldFBhY2thZ2VOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIH0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB1cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtTmFtZSwgZGVzY3JpcHRvci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobURlc2NyaXB0aW9uLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtSWNvblVyaSwgZGVzY3JpcHRvci5nZXRJY29uVXJpKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JY29uVXJpID0gZGVzY3JpcHRvci5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAhPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW5nICE9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmcgPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25TdGF0ZSAhPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5lcXVhbHMoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZEFsbChkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVHlwZSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RyZWFtICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTdHJlYW0gPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlVHlwZSAhPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSA9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZUhhbmRsaW5nICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxpbmcgPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZSAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUgPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYXggIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWF4ID0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkICE9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRXh0cmFzLCBkZXNjcmlwdG9yLmdldEV4dHJhcygpKSkgewotICAgICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZGVzY3JpcHRvci5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtU2V0dGluZ3NJbnRlbnQsIGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NJbnRlbnQgPSBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1DYW5EaXNjb25uZWN0ICE9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbkRpc2Nvbm5lY3QgPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEBoaWRlICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG90aGVyIHJvdXRlcyBpbiBhIGdyb3VwLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlR3JvdXAgZXh0ZW5kcyBSb3V0ZUluZm8gewotICAgICAgICBwcml2YXRlIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgUm91dGVHcm91cChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgc3VwZXIocHJvdmlkZXIsIGRlc2NyaXB0b3JJZCwgdW5pcXVlSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRSb3V0ZUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlIGluIHRoaXMgZ3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggdG8gZmV0Y2gKLSAgICAgICAgICogQHJldHVybiBUaGUgcm91dGUgYXQgaW5kZXgKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGVBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVJvdXRlcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMgPSBkZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGdyb3VwTWVtYmVySWRzLnNpemUoKSAhPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBzR2xvYmFsLmdldFVuaXF1ZUlkKGdldFByb3ZpZGVyKCksIGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIGdyb3VwTWVtYmVyID0gc0dsb2JhbC5nZXRSb3V0ZSh1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlcy5hZGQoZ3JvdXBNZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhbVJvdXRlcy5jb250YWlucyhncm91cE1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzID0gcm91dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VkID8gQ0hBTkdFX0dFTkVSQUwgOiAwKSB8IHN1cGVyLnVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgb2JqZWN0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMKLSAgICAgKiBwdWJsaXNoZWQgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVySW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc291cmNlc05vdEF2YWlsYWJsZTsKLQotICAgICAgICBQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZSA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJJbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLSAgICAgICAgICAgIGlmIChtUmVzb3VyY2VzID09IG51bGwgJiYgIW1SZXNvdXJjZXNOb3RBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHNHbG9iYWwuZ2V0UHJvdmlkZXJDb250ZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2VzIGZvciByb3V0ZSBwcm92aWRlciBwYWNrYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXNOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlUHJvdmlkZXJJbmZveyBwYWNrYWdlTmFtZT0iICsgZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBldmVudHMgYWJvdXQgbWVkaWEgcm91dGluZyBjaGFuZ2VzLgotICAgICAqIEFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuCi0gICAgICogPHA+Ci0gICAgICogQSBDYWxsYmFjayB3aWxsIG9ubHkgcmVjZWl2ZSBldmVudHMgcmVsZXZhbnQgdG8gcm91dGVzIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgICogd2FzIHJlZ2lzdGVyZWQgZm9yIHVubGVzcyB0aGUge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9Ci0gICAgICogZmxhZyB3YXMgc3BlY2lmaWVkIGluIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKENhbGxiYWNrKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogRm9yIGRldGFpbGVkIHJlYXNvbiwgb3ZlcnJpZGUge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfQotICAgICAgICAgKiBpbnN0ZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZH0uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHZvbHVtZSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSB2b2x1bWUgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZXMuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgYmVjb21lcwotICAgICAgICAgKiBhdmFpbGFibGUsIGlzIHJlbW92ZWQgb3IgaGFzIGNoYW5nZXMgdG8gc29tZSBvZiBpdHMgcHJvcGVydGllcyAoc3VjaCBhcyBpdHMgc2l6ZSkuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2UgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sUmVxdWVzdENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXN1bHQgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgRXJyb3IgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxsYmFja1JlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAgICBwdWJsaWMgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgICAgcHVibGljIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIENhbGxiYWNrUmVjb3JkKE1lZGlhUm91dGVyIHJvdXRlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSByb3V0ZXI7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclJvdXRlRXZlbnQoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHbG9iYWwgc3RhdGUgZm9yIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogPHA+Ci0gICAgICogTWVkaWEgcm91dGVzIGFuZCBtZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIGdsb2JhbCB0byB0aGUgcHJvY2VzczsgdGhlaXIKLSAgICAgKiBzdGF0ZSBhbmQgdGhlIGJ1bGsgb2YgdGhlIG1lZGlhIHJvdXRlciBpbXBsZW1lbnRhdGlvbiBsaXZlcyBoZXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHbG9iYWxNZWRpYVJvdXRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuU3luY0NhbGxiYWNrLAotICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuQ2FsbGJhY2sgewotICAgICAgICBmaW5hbCBDb250ZXh0IG1BcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPj4gbVJvdXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBTdHJpbmc+IG1VbmlxdWVJZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UHJvdmlkZXJJbmZvPiBtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQ+IG1SZW1vdGVDb250cm9sQ2xpZW50cyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm8gPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbygpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgbUNhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlckNvbXBhdCBtRGlzcGxheU1hbmFnZXI7Ci0gICAgICAgIGZpbmFsIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBtU3lzdGVtUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG93UmFtOwotCi0gICAgICAgIHByaXZhdGUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgUm91dGVJbmZvIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXI7Ci0gICAgICAgIC8vIEEgbWFwIGZyb20gcm91dGUgZGVzY3JpcHRvciBJRCB0byBSb3V0ZUNvbnRyb2xsZXIgZm9yIHRoZSBtZW1iZXIgcm91dGVzIGluIHRoZSBjdXJyZW50bHkKLSAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgZ3JvdXAuCi0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUm91dGVDb250cm9sbGVyPiBtUm91dGVDb250cm9sbGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvblJlY29yZCBtTWVkaWFTZXNzaW9uOwotICAgICAgICBNZWRpYVNlc3Npb25Db21wYXQgbVJjY01lZGlhU2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQgbUNvbXBhdFNlc3Npb247Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIgbVNlc3Npb25BY3RpdmVMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2ZUNoYW5nZWQoKSB7Ci0gICAgICAgICAgICAgICAgaWYobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgR2xvYmFsTWVkaWFSb3V0ZXIoQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBEaXNwbGF5TWFuYWdlckNvbXBhdC5nZXRJbnN0YW5jZShhcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgbUxvd1JhbSA9IEFjdGl2aXR5TWFuYWdlckNvbXBhdC5pc0xvd1JhbURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TWFuYWdlcilhcHBsaWNhdGlvbkNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGUgcHJvdmlkZXIgZm9yIGludGVyb3BlcmF0aW5nIHdpdGgKLSAgICAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLiAgVGhpcyBvbmUgaXMgc3BlY2lhbCBhbmQgcmVjZWl2ZXMKLSAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIgPSBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIub2J0YWluKGFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgICAgIGFkZFByb3ZpZGVyKG1TeXN0ZW1Qcm92aWRlcik7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciByb3V0ZXMgcHVibGlzaGVkIGJ5IHJlZ2lzdGVyZWQgbWVkaWEgcm91dGUKLSAgICAgICAgICAgIC8vIHByb3ZpZGVyIHNlcnZpY2VzLgotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIgPSBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXIubUNvbnRleHQgPT0gY29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdXRlciA9IG5ldyBNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1Sb3V0ZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4ocm91dGVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb250ZXh0IGdldFByb3ZpZGVyQ29udGV4dChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgQ29udGV4dC5DT05URVhUX1JFU1RSSUNURUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheShkaXNwbGF5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtUm91dGVDb250cm9sbGVyTWFwLmdldChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZShTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIGluZm8gOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8ubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gZGVmYXVsdCByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJvdXRlLCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAoIW1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgcmVtb3ZlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLm1FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgZGlzYWJsZWQgcm91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKHJvdXRlLCB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbiBsb3ctUkFNIGRldmljZXMsIGRvIG5vdCByZWx5IG9uIGFjdHVhbCBkaXNjb3ZlcnkgcmVzdWx0cyB1bmxlc3MgYXNrZWQgdG8uCi0gICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCkgPT0gMCAmJiBtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IGV4aXN0aW5nIHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBsb29rIGxpa2Ugd2UgY2FuIGZpbmQgYSBtYXRjaGluZyByb3V0ZSByaWdodCBub3cuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrIHNlbGVjdG9ycyBhbmQgYWN0aXZlIHNjYW4gZmxhZ3MuCi0gICAgICAgICAgICBib29sZWFuIGRpc2NvdmVyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tSZWNvcmQgY2FsbGJhY2sgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFNlbGVjdG9yKGNhbGxiYWNrLm1TZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsgLy8gcGVyZm9ybSBhY3RpdmUgc2NhbiBpbXBsaWVzIHJlcXVlc3QgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSBkaXNjb3ZlciA/IGJ1aWxkZXIuYnVpbGQoKSA6IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5lcXVhbHMoc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmlzQWN0aXZlU2NhbigpID09IGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSAmJiAhYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvciwgYWN0aXZlU2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGVkIGRpc2NvdmVyeSByZXF1ZXN0OiAiICsgbURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpc2NvdmVyICYmICFhY3RpdmVTY2FuICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3JjaW5nIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uIGEgbG93LVJBTSBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN5c3RlbSBwZXJmb3JtYW5jZSBtYXkgYmUgYWZmZWN0ZWQuICBQbGVhc2UgY29uc2lkZXIgdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSBpbnN0ZWFkIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXJzLgotICAgICAgICAgICAgZmluYWwgaW50IHByb3ZpZGVyQ291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgYWRkZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0FEREVELCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBSZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgLy8gNC4gU2V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBVbnJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDIuIENsZWFyIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMy4gRGVsZXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgdGhlIHByb3ZpZGVyIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIHJlbW92ZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX1JFTU9WRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm92aWRlckNvbnRlbnRzKFByb3ZpZGVySW5mbyBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnVwZGF0ZURlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3Rpbmcgcm91dGVzIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlaXIgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gcm91dGVEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyByb3V0ZSBncm91cCdzIGNvbnRlbnRzIHJlcXVpcmVzIGFsbCBtZW1iZXIgcm91dGVzJyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIHRvIHRoZSBsaXN0cyBhbmQgdXBkYXRlIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IGFkZGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IHVwZGF0ZWRHcm91cHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yID0gcm91dGVEZXNjcmlwdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gcm91dGVEZXNjcmlwdG9yLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSByb3V0ZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gYXNzaWduUm91dGVVbmlxdWVJZChwcm92aWRlciwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXAgPSByb3V0ZURlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBpc0dyb3VwID8gbmV3IFJvdXRlR3JvdXAocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3V0ZUluZm8ocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuYWRkKHRhcmdldEluZGV4KyssIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGFkZGl0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3Jpbmcgcm91dGUgZGVzY3JpcHRvciB3aXRoIGR1cGxpY2F0ZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBSZW9yZGVyIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChwcm92aWRlci5tUm91dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVXBkYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGNoYW5nZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5ldyBhbmQvb3IgZXhpc3RpbmcgZ3JvdXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiBhZGRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHBhaXIuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IHVwZGF0ZWRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHBhaXIuc2Vjb25kKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGludmFsaWQgcHJvdmlkZXIgZGVzY3JpcHRvcjogIiArIHByb3ZpZGVyRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIGFsbCByZW1haW5pbmcgcm91dGVzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIERlbGV0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVtb3ZlIHRoZSByb3V0ZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbm90aWZ5IGNsaWVudHMgYWJvdXQgcm91dGVzIHRoYXQgd2VyZSByZW1vdmVkLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHJvdXRlIHRvIGVuc3VyZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgb2JzZXJ2ZXMgdGhlIG5ldyByb3V0ZQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHJlbW92YWwgc2luY2UgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcmVtb3ZlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9SRU1PVkVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGNoYW5nZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0NIQU5HRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShSb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfR0VORVJBTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1ZPTFVNRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHZvbHVtZSBjaGFuZ2VkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlVW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIC8vIEFsdGhvdWdoIHJvdXRlIGRlc2NyaXB0b3IgaWRzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJvdmlkZXIsIGl0J3MKLSAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSB0d28gcHJvdmlkZXJzIHdpdGggdGhlIHNhbWUgcGFja2FnZSBuYW1lLgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG11c3QgZGVkdXBlIHRoZSBjb21wb3NpdGUgaWQuCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50TmFtZSArICI6IiArIHJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQodW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJFaXRoZXIgIiArIHJvdXRlRGVzY3JpcHRvcklkICsgIiBpc24ndCB1bmlxdWUgaW4gIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9yIHdlJ3JlIHRyeWluZyB0byBhc3NpZ24gYSB1bmlxdWUgSUQgZm9yIGFuIGFscmVhZHkgYWRkZWQgcm91dGUiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVbmlxdWVJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCB1bmlxdWVJZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQobmV3VW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCBuZXdVbmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdVbmlxdWVJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUm91dGVCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkTWFwLmdldChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlICE9IG51bGwgJiYgIW1EZWZhdWx0Um91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgZGVmYXVsdCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1EZWZhdWx0Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBkZWZhdWx0IHJvdXRlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiAhbUJsdWV0b290aFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGJsdWV0b290aCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGJsdWV0b290aCByb3V0ZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwgfHwgIW1TZWxlY3RlZFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVW5zZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoY2hvb3NlRmFsbGJhY2tSb3V0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzZWxlY3RlZCByb3V0ZSBpcyBhIHJvdXRlIGdyb3VwLCBzZWxlY3QvdW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGFkZGVkL3JlbW92ZWQgcm91dGUgbWVtYmVycy4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgZGVzY3JpcHRvciBJRHMgZm9yIHRoZSBuZXcgcm91dGUgZ3JvdXAuCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWRTZXQuYWRkKHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgcmVtb3ZlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4+IGl0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWRTZXQuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSBhZGRlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuY29udGFpbnNLZXkocm91dGUubURlc2NyaXB0b3JJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQocm91dGUubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayBpbmZvIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGNob29zZUZhbGxiYWNrUm91dGUoKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHJvdXRlIGlzIHJlbW92ZWQgb3Igbm8gbG9uZ2VyIHNlbGVjdGFibGUsCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldmVydCB0byBhIGxpdmUgYXVkaW8gcm91dGUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgIC8vIG9uZSAodXN1YWxseSBCbHVldG9vdGggQTJEUCkuICBGYWlsaW5nIHRoYXQsIHVzZQotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUgIT0gbURlZmF1bHRSb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgJiYgIXJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbURlZmF1bHRSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLm1EZXNjcmlwdG9ySWQuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5ERUZBVUxUX1JPVVRFX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGxvZ2dpbmcgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCB8fCAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgcm91dGUuaXNEZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBjYWxsU3RhY2sgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsU3RhY2tbM10gaXMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IGNhbGxTdGFjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXIgPSBjYWxsU3RhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYWxsZXIuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TWV0aG9kTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldExpbmVOdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFNlbGVjdGVkUm91dGVJbnRlcm5hbCBpcyBjYWxsZWQgd2hpbGUgc0dsb2JhbCBpcyBudWxsOiBwa2dOYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgd2hpbGUgYSBCVCByb3V0ZSBpcyBhdmFpbGFibGU6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHVuc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSArICIgcmVhc29uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1VOU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBtUm91dGVDb250cm9sbGVyTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBzZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHIgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHIubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgLy8gU3lzdGVtIHJvdXRlIGlzIHNlbGVjdGVkLCBkbyBub3Qgc3luYyB0aGUgcm91dGUgd2Ugc2VsZWN0ZWQgYmVmb3JlLgotICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGludCBwcm92aWRlckluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhtU3lzdGVtUHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHByb3ZpZGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGludCByb3V0ZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5nZXQocm91dGVJbmRleCkuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQ29udHJvbENsaWVudHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3Qgc2Vzc2lvbikgewotICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgc2Vzc2lvbikgewotICAgICAgICAgICAgbUNvbXBhdFNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uLnJlbW92ZU9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5hZGRPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KHNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uUmVjb3JkIG1lZGlhU2Vzc2lvblJlY29yZCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG1lZGlhU2Vzc2lvblJlY29yZDsKLSAgICAgICAgICAgIGlmIChtZWRpYVNlc3Npb25SZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uLmdldFRva2VuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db21wYXRTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBhdFNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgPT0gcmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0gPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tUeXBlID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gZ2V0RGVmYXVsdFJvdXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU2VsZWN0ZWRSb3V0ZSA9PSBnZXRCbHVldG9vdGhSb3V0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbCByb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGUgPSBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY29uZmlndXJlVm9sdW1lKGNvbnRyb2xUeXBlLCBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7Ci0gICAgICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXIsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25SZWNvcmQgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgbU1zQ29tcGF0OwotCi0gICAgICAgICAgICBwcml2YXRlIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgbUNvbnRyb2xUeXBlOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXJDb21wYXQgbVZwQ29tcGF0OwotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBNZWRpYVNlc3Npb25Db21wYXQuZnJvbU1lZGlhU2Vzc2lvbihtQXBwbGljYXRpb25Db250ZXh0LCBtZWRpYVNlc3Npb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb25Db21wYXQpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBtZWRpYVNlc3Npb25Db21wYXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZVZvbHVtZShAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgICAgIGlmIChtVnBDb21wYXQgIT0gbnVsbCAmJiBjb250cm9sVHlwZSA9PSBtQ29udHJvbFR5cGUgJiYgbWF4ID09IG1NYXhWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBjaGFuZ2VkIGNvbnRyb2wgdHlwZSBvciBtYXgganVzdCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBjdXJyZW50IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQuc2V0Q3VycmVudFZvbHVtZShjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHByb3ZpZGVyIGFuZCB1cGRhdGUKLSAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbmV3IFZvbHVtZVByb3ZpZGVyQ29tcGF0KGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhmaW5hbCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoZmluYWwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb1JlbW90ZShtVnBDb21wYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb0xvY2FsKG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Nc0NvbXBhdC5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZAotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgbVJjY0NvbXBhdDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdCA9IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQub2J0YWluKG1BcHBsaWNhdGlvbkNvbnRleHQsIHJjYyk7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmNjQ29tcGF0LmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRQbGF5YmFja0luZm8obVBsYXliYWNrSW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbVRlbXBDYWxsYmFja1JlY29yZHMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfTUFTSyA9IDB4ZmYwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9ST1VURSA9IDB4MDEwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9QUk9WSURFUiA9IDB4MDIwMDsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0FEREVEID0gTVNHX1RZUEVfUk9VVEUgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1JFTU9WRUQgPSBNU0dfVFlQRV9ST1VURSB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgMzsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNDsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA1OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1NFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA2OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1VOU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDc7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9BRERFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9SRU1PVkVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAyOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0NIQU5HRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDM7Ci0KLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShtc2csIG9iaikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaiwgaW50IGFyZykgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UobXNnLCBvYmopOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSA9IGFyZzsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMTsKLQotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1TR19ST1VURV9DSEFOR0VECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZFJvdXRlKCkuZ2V0SWQoKS5lcXVhbHMoKChSb3V0ZUluZm8pIG9iaikuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIHN5c3RlbSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcih3aGF0LCBvYmopOwotCi0gICAgICAgICAgICAgICAgLy8gSW52b2tlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgY2FsbGJhY2tzIGJlZm9yZSBpbnZva2luZyB0aGVtIGluIGNhc2UgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIG9yIHJlbW92ZWQgZHVyaW5nIGRpc3BhdGNoLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuYWRkQWxsKHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWxsYmFja0NvdW50ID0gbVRlbXBDYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobVRlbXBDYWxsYmFja1JlY29yZHMuZ2V0KGkpLCB3aGF0LCBvYmosIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIoaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVBZGRlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVSZW1vdmVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUNoYW5nZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVNlbGVjdGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VDYWxsYmFjayhDYWxsYmFja1JlY29yZCByZWNvcmQsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIgcm91dGVyID0gcmVjb3JkLm1Sb3V0ZXI7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2sgPSByZWNvcmQubUNhbGxiYWNrOwotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCAmIE1TR19UWVBFX01BU0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9ST1VURTogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUm91dGVJbmZvIHJvdXRlID0gKFJvdXRlSW5mbylvYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZC5maWx0ZXJSb3V0ZUV2ZW50KHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVU5TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1BST1ZJREVSOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlckluZm8gcHJvdmlkZXIgPSAoUHJvdmlkZXJJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQWRkZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJSZW1vdmVkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQ2hhbmdlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDY1OTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbWVkaWEgc2Vzc2lvbiBpcyBjcmVhdGVkLCBpdCBpcyBpbml0aWFsbHkgaW4gdGhlCi0gKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFIGFjdGl2ZX0gc3RhdGUuICBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGVuZHMKLSAqIG5vcm1hbGx5LCBpdCB0cmFuc2l0aW9ucyB0byB0aGUge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEIGVuZGVkfSBzdGF0ZS4KLSAqIElmIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGR1ZSB0byBhbm90aGVyIHNlc3Npb24gZm9yY2libHkgdGFraW5nCi0gKiBjb250cm9sIG9mIHRoZSByb3V0ZSwgdGhlbiBpdCB0cmFuc2l0aW9ucyB0byB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gc3RhdGUuCi0gKiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFRvIG1vbml0b3Igc2Vzc2lvbiBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc2Vzc2lvbiBzdGFydCByZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25TdGF0dXMgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fU1RBVEUgPSAic2Vzc2lvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9QQVVTRUQgPSAicXVldWVQYXVzZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBBY3RpdmUuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gaXMgYWN0aXZlIGFuZCBpbiBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9BQ1RJVkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogRW5kZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGVuZGVkIG5vcm1hbGx5IHVzaW5nIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufSBhY3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgdGVybWluYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9FTkRFRCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBJbnZhbGlkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgaW52YWxpZGF0ZWQgaW52b2x1bnRhcmlseSBkdWUgdG8KLSAgICAgKiBhbm90aGVyIHNlc3Npb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCA9IDI7Ci0KLSAgICBNZWRpYVNlc3Npb25TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gc3RhdGUuICBPbmUgb2Yge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRX0sCi0gICAgICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEfSwgb3Ige0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlc3Npb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZVBhdXNlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhU2Vzc2lvblN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uU3RhdGU9IikuYXBwZW5kKHNlc3Npb25TdGF0ZVRvU3RyaW5nKGdldFNlc3Npb25TdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcXVldWVQYXVzZWQ9IikuYXBwZW5kKGlzUXVldWVQYXVzZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2Vzc2lvblN0YXRlVG9TdHJpbmcoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFjdGl2ZSI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfRU5ERUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmRlZCI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvblN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVNlc3Npb25TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25TdGF0dXMoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3RzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQotICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXRlIFRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVNlc3Npb25TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlc3Npb25TdGF0ZShpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfU0VTU0lPTl9TVEFURSwgc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcXVldWUgaXMgcGF1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UXVldWVQYXVzZWQoYm9vbGVhbiBxdWV1ZVBhdXNlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQsIHF1ZXVlUGF1c2VkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TdGF0dXMgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhtQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU0ZTI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfUk9VVEVfSUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfVU5SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX0NVUlJFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9EQVRBX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9WRVJTSU9OXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuaXNWYWxpZFJlbW90ZU1lc3NlbmdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBjb25uZWN0aW9uIHRvIGEgcGFydGljdWxhciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclByb3h5IjsgIC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDxDb250cm9sbGVyPigpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQm91bmQ7Ci0gICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1BY3RpdmVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGlvblJlYWR5OwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEoY29tcG9uZW50TmFtZSkpOwotCi0gICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgbVByaXZhdGVIYW5kbGVyID0gbmV3IFByaXZhdGVIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsIEBOb25OdWxsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZUdyb3VwSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVHcm91cElkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQ29ubmVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSAoc2VydmljZSAhPSBudWxsID8gbmV3IE1lc3NlbmdlcihzZXJ2aWNlKSA6IG51bGwpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVnaXN0ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGhpcyArICI6IFNlcnZpY2UgcmV0dXJuZWQgaW52YWxpZCBtZXNzZW5nZXIgYmluZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIGNvbm5lY3Rpb24gIiArIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50TmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdGFydGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0b3BwaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWJpbmRJZkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IG51bGwgJiYgc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCaW5kaW5nKCkgewotICAgICAgICBpZiAoc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICBiaW5kKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCaW5kKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgYW4gYWN0aXZlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoaXMgcHJvdmlkZXIncyByb3V0ZXMgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIW1Db250cm9sbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmQoKSB7Ci0gICAgICAgIGlmICghbUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVudCBzZXJ2aWNlID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLnNldENvbXBvbmVudChtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Cb3VuZCA9IGdldENvbnRleHQoKS5iaW5kU2VydmljZShzZXJ2aWNlLCB0aGlzLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICAgICAgICAgIGlmICghbUJvdW5kICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVuYmluZCgpIHsKLSAgICAgICAgaWYgKG1Cb3VuZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogVW5iaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Cb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnVuYmluZFNlcnZpY2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMgPSBkZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gcm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUuZ2V0SWQoKS5lcXVhbHMocm91dGVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmFkZChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25SZWFkeShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9IGdldERpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgZXJyb3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBlcnJvciAtICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBEZXNjcmlwdG9yIGNoYW5nZWQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db250cm9sbGVyUmVsZWFzZWQoQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgIGNvbnRyb2xsZXIuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmRldGFjaENvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVHcm91cElkOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1Db25uZWN0aW9uOwotICAgICAgICBwcml2YXRlIGludCBtQ29udHJvbGxlcklkOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgICAgICBtUm91dGVJZCA9IHJvdXRlSWQ7Ci0gICAgICAgICAgICBtUm91dGVHcm91cElkID0gcm91dGVHcm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSBjb25uZWN0aW9uLmNyZWF0ZVJvdXRlQ29udHJvbGxlcihtUm91dGVJZCwgbVJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZXRWb2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1NldFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaENvbm5lY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgICAgIG9uQ29udHJvbGxlclJlbGVhc2VkKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0KCkgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVuc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCwgcmVhc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCB2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IHZvbHVtZTsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIGRlbHRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSArPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uLnNlbmRDb250cm9sUmVxdWVzdChtQ29udHJvbGxlcklkLCBpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbiBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjZWl2ZUhhbmRsZXIgbVJlY2VpdmVIYW5kbGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLQotICAgICAgICBwcml2YXRlIGludCBtTmV4dFJlcXVlc3RJZCA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0Q29udHJvbGxlcklkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVNlcnZpY2VWZXJzaW9uOyAvLyBub24temVybyB3aGVuIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZQotCi0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4gbVBlbmRpbmdDYWxsYmFja3MgPQotICAgICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPigpOwotCi0gICAgICAgIHB1YmxpYyBDb25uZWN0aW9uKE1lc3NlbmdlciBzZXJ2aWNlTWVzc2VuZ2VyKSB7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3NlbmdlciA9IHNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgICAgICBtUmVjZWl2ZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobVJlY2VpdmVIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBpZiAoIXNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVHSVNURVIsCi0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgIENMSUVOVF9WRVJTSU9OX0NVUlJFTlQsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5SRUdJU1RFUiwgMCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbFBlbmRpbmdDYWxsYmFja3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmFpbFBlbmRpbmdDYWxsYmFja3MoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGVuZGluZ0NhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnZhbHVlQXQoaSkub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNGYWlsdXJlKGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkVycm9yKHRoaXMsICJSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY1N1Y2Nlc3MoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblJlZ2lzdGVyZWQoaW50IHJlcXVlc3RJZCwgaW50IHNlcnZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgIEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQKLSAgICAgICAgICAgICAgICAgICAgJiYgc2VydmljZVZlcnNpb24gPj0gU0VSVklDRV9WRVJTSU9OXzEpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKLSAgICAgICAgICAgICAgICBtU2VydmljZVZlcnNpb24gPSBzZXJ2aWNlVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25SZWFkeSh0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRGVzY3JpcHRvckNoYW5nZWQoQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gIT0gMCkgewotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZChpbnQgcmVxdWVzdElkLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RGYWlsZWQoaW50IHJlcXVlc3RJZCwgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQgPSBtTmV4dENvbnRyb2xsZXJJZCsrOwotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCwgcm91dGVJZCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUm91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBleHRyYXMucHV0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwgcmVhc29uKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCBkZWx0YSk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZW5kQ29udHJvbFJlcXVlc3QoaW50IGNvbnRyb2xsZXJJZCwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpbnQgcmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmIChzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBjb250cm9sbGVySWQsIGludGVudCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5wdXQocmVxdWVzdElkLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgMCwgcmVxdWVzdCAhPSBudWxsID8gcmVxdWVzdC5hc0J1bmRsZSgpIDogbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFJlcXVlc3QoaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgICAgICBtc2cud2hhdCA9IHdoYXQ7Ci0gICAgICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICAgICAgbXNnLm9iaiA9IG9iajsKLSAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuc2VuZChtc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGRpZWQuCi0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAod2hhdCAhPSBDTElFTlRfTVNHX1VOUkVHSVNURVIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byBzZXJ2aWNlLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uCi0gICAgICogdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2UgdGhlIHNlcnZpY2UgaXMgaG9sZGluZyBhbgotICAgICAqIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCdzIG1lc3Nlbmdlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBoYW5kbGVyIHNob3VsZCBub3QgYmUgdXNlZCB0byBoYW5kbGUgYW55IG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhvc2UKLSAgICAgKiB0aGF0IGNvbWUgZnJvbSB0aGUgc2VydmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+IG1Db25uZWN0aW9uUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4oY29ubmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvblJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKGNvbm5lY3Rpb24sIHdoYXQsIHJlcXVlc3RJZCwgYXJnLCBvYmosIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVW5oYW5kbGVkIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY0ZhaWx1cmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNTdWNjZXNzKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19SRUdJU1RFUkVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vblJlZ2lzdGVyZWQocmVxdWVzdElkLCBhcmcsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkRlc2NyaXB0b3JDaGFuZ2VkKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IChkYXRhID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoU0VSVklDRV9EQVRBX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGVycm9yLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFmNjQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogV2F0Y2hlcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgdG8gYmUgaW5zdGFsbGVkLgotICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSBtZWRpYSByb3V0ZXIgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzZXJ2aWNlLgotICoKLSAqIEBzZWUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+IG1Qcm92aWRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZzsKLQotICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0NIQU5HRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVQTEFDRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVTVEFSVEVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7Ci0gICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIC8vIFNjYW4gcGFja2FnZXMuCi0gICAgICAgICAgICAvLyBBbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzdGFydGluZyBwcm92aWRlcnMgaWYgbmVlZGVkLgotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtU2NhblBhY2thZ2VzUnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtU2NhblBhY2thZ2VzUnVubmFibGUpOwotCi0gICAgICAgICAgICAvLyBTdG9wIGFsbCBwcm92aWRlcnMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2NhblBhY2thZ2VzKCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGZvciBhbGwgbmV3IHNlcnZpY2VzLgotICAgICAgICAvLyBSZW9yZGVyIHRoZSBsaXN0IHNvIHRoYXQgcHJvdmlkZXJzIGxlZnQgYXQgdGhlIGVuZCB3aWxsIGJlIHRoZSBvbmVzIHRvIHJlbW92ZS4KLSAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gOiBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIDApKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc291cmNlSW5kZXggPSBmaW5kUHJvdmlkZXIoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQodGFyZ2V0SW5kZXgrKywgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suYWRkUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPj0gdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsgLy8gcmVzdGFydCB0aGUgcHJvdmlkZXIgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlYmluZElmRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAobVByb3ZpZGVycywgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBwcm92aWRlcnMgZm9yIG1pc3Npbmcgc2VydmljZXMuCi0gICAgICAgIGlmICh0YXJnZXRJbmRleCA8IG1Qcm92aWRlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIuaGFzQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1TY2FuUGFja2FnZXNSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVNjYW5QYWNrYWdlc1J1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKLSAgICAgICAgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY0NDliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGZlYXR1cmVzIG9mIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gKgotICogSGlkZGVuIGZvciBub3cgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gbWFrZSB0aGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBmdXR1cmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJjYzsKLSAgICBwcm90ZWN0ZWQgVm9sdW1lQ2FsbGJhY2sgbVZvbHVtZUNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJjYyA9IHJjYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgb2J0YWluKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgcmNjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCwgcmNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUmNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mb3JtYXRpb24uCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBhdHRhY2ggdG8gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmZvIFRoZSBwbGF5YmFjayBpbmZvcm1hdGlvbi4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHZvbHVtZSBjYWxsYmFjayB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Wb2x1bWVDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWJhY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8gewotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZTsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVNYXg7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lSGFuZGxpbmcgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrU3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgcHVibGljIGludCBwbGF5YmFja1R5cGUgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdm9sdW1lIHVwZGF0ZXMgYXJlIHJlcXVlc3RlZCBieSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBzaG91bGQgYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiBBbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgdm9sdW1lIGlzIHRvIGJlIGluY3JlYXNlZAotICAgICAgICAgKiAocG9zaXRpdmUgdmFsdWUpIG9yIGRlY3JlYXNlZCAobmVnYXRpdmUgdmFsdWUpLgotICAgICAgICAgKiBGb3IgYnVuZGxlZCBjaGFuZ2VzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbmdlcwotICAgICAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIGUuZy4gKzMgY29ycmVzcG9uZHMgdG8gdGhyZWUgInZvbHVtZSB1cCIgY2hhbmdlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBmb3IgdGhlIHJvdXRlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbmV3IHZvbHVtZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkLAotICAgICAgICAgKiBhbHdheXMgYmV0d2VlbiAwIGFuZCB0aGUgdmFsdWUgc2V0IGJ5IHtAbGluayBQbGF5YmFja0luZm8jdm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KLSAgICAgKiBEb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gZm9yIEplbGx5YmVhbi4KLSAgICAgKgotICAgICAqIFRoZSBiYXNpYyBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBSQ0MgdG8gYSBVc2VyUm91dGVJbmZvCi0gICAgICogaW4gb3JkZXIgdG8gaG9vayB1cCBzdHJlYW0gbWV0YWRhdGEgYW5kIHZvbHVtZSBjYWxsYmFja3MgYmVjYXVzZSB0aGVyZSBpcyBubwotICAgICAqIG90aGVyIEFQSSBhdmFpbGFibGUgdG8gZG8gc28gaW4gdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uLiAgVGhlIFVzZXJSb3V0ZUluZm8gaXRzZWxmCi0gICAgICogaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBNZWRpYVJvdXRlciBzbyBpdCBpcyB0cmFuc3BhcmVudCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZU9iajsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKLQotICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgIiIsIGZhbHNlKTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWUpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lTWF4KTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1R5cGUpOwotCi0gICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2sobVVzZXJSb3V0ZU9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKHRoaXMpKSk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRSZW1vdGVDb250cm9sQ2xpZW50KG1Vc2VyUm91dGVPYmosIG1SY2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgZnJhbWV3b3JrIG5ldmVyIHVucmVnaXN0ZXJzIGl0cyB2b2x1bWUgb2JzZXJ2ZXIgZnJvbQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNlcnZpY2Ugc28gdGhlIFVzZXJSb3V0ZUluZm8gb2JqZWN0IG1heSBsZWFrIGFsb25nIHdpdGgKLSAgICAgICAgICAgIC8vIGFueSBjYWxsYmFja3MgdGhhdCB3ZSBhdHRhY2ggdG8gaXQuICBVc2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBwcmV2ZW50Ci0gICAgICAgICAgICAvLyB0aGUgdm9sdW1lIGNhbGxiYWNrIGZyb20gaG9sZGluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byBhbnl0aGluZyBpbXBvcnRhbnQuCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4gbUltcGxXZWFrOwotCi0gICAgICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKEplbGx5YmVhbkltcGwgaW1wbCkgewotICAgICAgICAgICAgICAgIG1JbXBsV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+KGltcGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUxNDk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHBsYXlpbmcgbWVkaWEgb24gcmVtb3RlIHJvdXRlcyB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBkZWZpbmVkIGJ5IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnR9LgotICogPHA+Ci0gKiBUaGUgY2xpZW50IG1haW50YWlucyBzZXNzaW9uIHN0YXRlIGFuZCBvZmZlcnMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSBmb3IgaXNzdWluZwotICogcmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0byBhIHNpbmdsZSByb3V0ZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVBsYXliYWNrQ2xpZW50IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVQbGF5YmFja0NsaWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgZmluYWwgQWN0aW9uUmVjZWl2ZXIgbUFjdGlvblJlY2VpdmVyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbU1lc3NhZ2VQZW5kaW5nSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7Ci0KLSAgICBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2s7Ci0gICAgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGZvciBhIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSBtZWRpYSByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3RlUGxheWJhY2tDbGllbnQoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKLSAgICAgICAgbUFjdGlvblJlY2VpdmVyID0gbmV3IEFjdGlvblJlY2VpdmVyKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIsIGFjdGlvbkZpbHRlcik7Ci0KLSAgICAgICAgSW50ZW50IGl0ZW1TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgaXRlbVN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIGl0ZW1TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBzZXNzaW9uU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIHNlc3Npb25TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBzZXNzaW9uU3RhdHVzSW50ZW50LCAwKTsKLQotICAgICAgICBJbnRlbnQgbWVzc2FnZUludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtZXNzYWdlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbU1lc3NhZ2VQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgbWVzc2FnZUludGVudCwgMCk7Ci0gICAgICAgIGRldGVjdEZlYXR1cmVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLCB0aGVuIG5vbmUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBvZmZlcmVkIGJ5IHRoZSBjbGllbnQgd2lsbCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBhY3Rpb25zOiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgc2Vla30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBwYXVzZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVtb3RlIHBsYXliYWNrIGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgZmVhdHVyZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZywgdGhlbiBhdCBtb3N0IG9uZSBtZWRpYSBpdGVtIGNhbiBiZSBwbGF5ZWQKLSAgICAgKiBhdCBhIHRpbWUgYW5kIHRoZSB7QGxpbmsgI2VucXVldWV9IG1ldGhvZCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIHJlbW92ZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHF1ZXVpbmcgaXMgc3VwcG9ydGVkLiAgSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9Ci0gICAgICogaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWluZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQsIHRoZW4gdGhlIHNlc3Npb24gd2lsbAotICAgICAqIG5vdCBiZSBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGlzIHBsYXllZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgZ2V0IHNlc3Npb24gc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIG1lc3NhZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFIHNlbmQgbWVzc2FnZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgotICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyB1c3VhbGx5IG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzZXNzaW9uIGlkIGV4cGxpY2l0bHkgc2luY2UKLSAgICAgKiBpdCBpcyBjcmVhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygb3RoZXIgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjcGxheX0sIHtAbGluayAjZW5xdWV1ZX0sIGFuZCB7QGxpbmsgI3N0YXJ0U2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1TZXNzaW9uSWQsIHNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaWQgaXMgbm93OiAiICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uQ2hhbmdlZChzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgY3VycmVudGx5IGhhcyBhIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogRXF1aXZhbGVudCB0byBjaGVja2luZyB3aGV0aGVyIHtAbGluayAjZ2V0U2Vzc2lvbklkfSByZXR1cm5zIGEgbm9uLW51bGwgcmVzdWx0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25JZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIHdoZW4gdGhlIHN0YXRlIG9mCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgb3IgbWVkaWEgaXRlbXMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUKLSAgICAgKiBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZCBvciBhbnkgcGxheQotICAgICAqIGNvbW1hbmRzIGFyZSBpc3N1ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NhbGxiYWNrKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1TdGF0dXNDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIG1lc3NhZ2VzIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgZnJvbQotICAgICAqIG1lZGlhIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyKE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGxheSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogQ2xlYXJzIHRoZSBxdWV1ZSBhbmQgc3RhcnRzIHBsYXlpbmcgdGhlIG5ldyBpdGVtIGltbWVkaWF0ZWx5LiAgSWYgdGhlIHF1ZXVlCi0gICAgICogd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIGl0IGlzIHJlc3VtZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBBQ1RJT05fUExBWX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gcGxheS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGxheShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVucXVldWUgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIEVucXVldWVzIGEgbmV3IGl0ZW0gdG8gcGxheS4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gd2lsbAotICAgICAqIHJlbWFpbiBwYXVzZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBBQ1RJT05fRU5RVUVVRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gZW5xdWV1ZS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5T3JFbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGVudFVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkpIHsKLSAgICAgICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoY29udGVudFVyaSwgbWltZVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX01FVEFEQVRBLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTWlsbGlzICE9IDApIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc2VlayB0byBhIG5ldyBwb3NpdGlvbiBpbiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogU2Vla3MgdG8gYSBuZXcgcG9zaXRpb24uICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkIHRoZW4gaXQKLSAgICAgKiByZW1haW5zIHBhdXNlZCBidXQgdGhlIGl0ZW0ncyBuZXcgcG9zaXRpb24gaXMgc3RpbGwgcmVtZW1iZXJlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIEFDVElPTl9TRUVLfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBuZXcgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFS30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlZWsoU3RyaW5nIGl0ZW1JZCwgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgQUNUSU9OX0dFVF9TVEFUVVN9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdHVzKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlbW92ZSBhIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgQUNUSU9OX1JFTU9WRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgYWxyZWFkeSBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBBQ1RJT05fUEFVU0V9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0V9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGF1c2UoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlc3VtZSAodW5wYXVzZSkgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBub3QgcGF1c2VkCi0gICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIEFDVElPTl9SRVNVTUV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN1bWUoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdG9wIG1lZGlhIHBsYXliYWNrIGFuZCBjbGVhciB0aGUgbWVkaWEgcGxheWJhY2sgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeQotICAgICAqIGVtcHR5IHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AgQUNUSU9OX1NUT1B9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUH0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RhcnQgYSBuZXcgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbXVzdCB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHJlcXVlc3QKLSAgICAgKiBpcyBjb21wbGV0ZSBiZWZvcmUgaXNzdWluZyBvdGhlciByZXF1ZXN0cyB0aGF0IGFmZmVjdCB0aGUgc2Vzc2lvbi4gIElmIHRoaXMKLSAgICAgKiByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBBQ1RJT05fU1RBUlRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiwgbU1lc3NhZ2VQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0UKLSAgICAgKiBAc2VlICNpc01lc3NhZ2luZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKEJ1bmRsZSBtZXNzYWdlLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbWVzc2FnZSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFNlc3Npb25TdGF0dXMoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5kIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhpcyByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIHtAbGluayAjZ2V0U2Vzc2lvbklkIHNlc3Npb24gaWQgcHJvcGVydHl9IHdpbGwgYmUgc2V0IHRvIG51bGwgYWZ0ZXIKLSAgICAgKiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIEFDVElPTl9FTkRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kU2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1JdGVtQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgaXRlbUlkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQsIGl0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KGl0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1TdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWRSZXN1bHQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVNlc3Npb25BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKLSAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlc3Npb25JZFJlc3VsdC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbklkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZG9wdFNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlc3Npb25JZChzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVJbnZhbGlkUmVzdWx0KEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgaW52YWxpZCByZXN1bHQgZGF0YSBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTiwgZGF0YSk7Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVFcnJvcihJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgZmluYWwgaW50IGNvZGU7Ci0gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvZGUgPSBkYXRhLmdldEludChNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfRVJST1JfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSA9IE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgZXJyb3IgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICsgIjogZXJyb3I9IiArIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29kZT0iICsgY29kZQotICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBjb2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0ZWN0RmVhdHVyZXMoKSB7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sgPSByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUXVldWluZyA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nID0gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiByb3V0ZVN1cHBvcnRzQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZS5zdXBwb3J0c0NvbnRyb2xBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSywgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpIHsKLSAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogbVJvdXRlLmdldENvbnRyb2xGaWx0ZXJzKCkpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2spIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUXVldWluZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgKyAic2Vzc2lvbiBtYW5hZ2VtZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgaW5mZXJNaXNzaW5nUmVzdWx0KFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG1pc3NpbmcuCi0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QuZXF1YWxzKHJlc3VsdCkpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3QgZGlkbid0IHNwZWNpZnkgYSB2YWx1ZSBvciByZXN1bHQgbWF0Y2hlcyByZXF1ZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAvLyBSZXN1bHQgY29uZmxpY3RzIHdpdGggcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXF1ZXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZW5kaW5nIHJlcXVlc3Q6ICIgKyBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBidW5kbGVUb1N0cmluZyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnNpemUoKTsgLy8gZm9yY2UgYnVuZGxlIHRvIGJlIHVucGFyY2VsbGVkCi0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFjdGlvblJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQiOwotCi0gICAgICAgIEFjdGlvblJlY2VpdmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBudWxsIHx8ICFzZXNzaW9uSWQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBtaXNzaW5nIG9yIGludmFsaWQgc2Vzc2lvbiBpZDogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBpZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgaXRlbSBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vbkl0ZW1TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMsIGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBtZWRpYSBzdGF0dXMgY2FsbGJhY2sgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtaXNzaW5nIHNlc3Npb24gc3RhdHVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHNlc3Npb24gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgbWVzc2FnZSBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyLm9uTWVzc2FnZVJlY2VpdmVkKHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lZGlhIHN0YXR1cyB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0gY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzZSBjYWxsYmFjayB0eXBlIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGNvZGUgVGhlIGVycm9yIGNvZGUsIG9yIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVJST1JfVU5LTk9XTn0gaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGVycm9yIGRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgaW50IGNvZGUsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEl0ZW1BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBzZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNlc3Npb25BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1lZGlhIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoU3RyaW5nIHNlc3Npb25JZCwgQnVuZGxlIG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDkxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByb3V0ZXMgZm9yIGJ1aWx0LWluIHN5c3RlbSBkZXN0aW5hdGlvbnMgc3VjaCBhcyB0aGUgbG9jYWwgZGlzcGxheQotICogYW5kIHNwZWFrZXIuICBPbiBKZWxseWJlYW4gYW5kIG5ld2VyIHBsYXRmb3JtIHJlbGVhc2VzLCBxdWVyaWVzIHRoZSBmcmFtZXdvcmsKLSAqIE1lZGlhUm91dGVyIGZvciBmcmFtZXdvcmstcHJvdmlkZWQgcm91dGVzIGFuZCByZWdpc3RlcnMgbm9uLWZyYW1ld29yay1wcm92aWRlZAotICogcm91dGVzIGFzIHVzZXIgcm91dGVzLgotICovCi1hYnN0cmFjdCBjbGFzcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFX0lEID0gIkRFRkFVTFRfUk9VVEUiOwotCi0gICAgcHJvdGVjdGVkIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgb2J0YWluKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFwaTI0SW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIySW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTcpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIxSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgYWRkZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHJlbW92ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgY2hhbmdlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFja3MgaW50byB0aGUgbWVkaWEgcm91dGVyIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTeW5jQ2FsbGJhY2sgewotICAgICAgICB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVFJFQU0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IENPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgbVZvbHVtZUNoYW5nZVJlY2VpdmVyOwotICAgICAgICBpbnQgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IC0xOwotCi0gICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciA9IG5ldyBWb2x1bWVDaGFuZ2VSZWNlaXZlcigpOwotCi0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVZvbHVtZUNoYW5nZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFZvbHVtZUNoYW5nZVJlY2VpdmVyLlZPTFVNRV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgIG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVmYXVsdFJvdXRlID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfSUQsIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3N5c3RlbV9yb3V0ZV9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xGaWx0ZXJzKENPTlRST0xfRklMVEVSUykKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrU3RyZWFtKFBMQVlCQUNLX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrVHlwZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZUhhbmRsaW5nKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVNYXgobWF4Vm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG1MYXN0UmVwb3J0ZWRWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuYWRkUm91dGUoZGVmYXVsdFJvdXRlKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVJZC5lcXVhbHMoREVGQVVMVF9ST1VURV9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgY2xhc3MgRGVmYXVsdFJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNYXRoLm1pbihtYXhWb2x1bWUsIE1hdGgubWF4KDAsIHZvbHVtZSArIGRlbHRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBWb2x1bWVDaGFuZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgICAgIC8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gQXVkaW9NYW5hZ2VyLgotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9MVU1FX0NIQU5HRURfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVk9MVU1FX0NIQU5HRURfQUNUSU9OIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSI7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFZPTFVNRV9DSEFOR0VEX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1UeXBlID09IFBMQVlCQUNLX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDAgJiYgdm9sdW1lICE9IG1MYXN0UmVwb3J0ZWRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKLSAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjaywgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0KLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0KLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN5bmNDYWxsYmFjayBtU3luY0NhbGxiYWNrOwotCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVZvbHVtZUNhbGxiYWNrT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUm91dGVUeXBlczsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUFjdGl2ZVNjYW47Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1DYWxsYmFja1JlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gZnJhbWV3b3JrIHJvdXRlcyB0byBzdXBwb3J0IGxpYnJhcnkgcm91dGVzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgdGFnIGZpZWxkIGZvciB0aGlzIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgcHVibGlzaGVkIGl0cyBvd24gdXNlciByb3V0ZXMgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgYW5kIGFscmVhZHkKLSAgICAgICAgLy8gdXNlZCB0aGUgdGFnIGZvciBpdHMgb3duIHB1cnBvc2VzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPiBtU3lzdGVtUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMgdG8gZnJhbWV3b3JrIHJvdXRlcy4KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+IG1Vc2VyUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4oKTsKLQotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCBtU2VsZWN0Um91dGVXb3JrYXJvdW5kOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sgPSBzeW5jQ2FsbGJhY2s7Ci0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tPYmogPSBjcmVhdGVDYWxsYmFja09iaigpOwotICAgICAgICAgICAgbVZvbHVtZUNhbGxiYWNrT2JqID0gY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lKSwgZmFsc2UpOwotCi0gICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZUlkKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUm91dGVDb250cm9sbGVyKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpbnQgbmV3Um91dGVUeXBlcyA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG5ld0FjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSByZXF1ZXN0LmdldFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3QWN0aXZlU2NhbiA9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSBuZXdSb3V0ZVR5cGVzIHx8IG1BY3RpdmVTY2FuICE9IG5ld0FjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICBtUm91dGVUeXBlcyA9IG5ld1JvdXRlVHlwZXM7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW4gPSBuZXdBY3RpdmVTY2FuOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaikpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVzKCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgcm91dGVPYmogOiBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRSb3V0ZXMobVJvdXRlck9iaikpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopIDwgMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGFzc2lnblJvdXRlSWQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaiwgaWQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZUlkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgc2hvdWxkIHN1cHBseSBhIHVuaXF1ZSByb3V0ZSBpZCB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIGhlcmUuICBGb3Igbm93IHdlIHVzZSBhIGhhc2ggb2YgdGhlIHJvdXRlIG5hbWUgYW5kIHRha2UgY2FyZQotICAgICAgICAgICAgLy8gdG8gZGVkdXBlIGl0LgotICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHQgPSAoZ2V0RGVmYXVsdFJvdXRlKCkgPT0gcm91dGVPYmopOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gaXNEZWZhdWx0ID8gREVGQVVMVF9ST1VURV9JRCA6Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiUk9VVEVfJTA4eCIsIGdldFJvdXRlTmFtZShyb3V0ZU9iaikuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoaWQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCBpZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKG5ld0lkKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShuZXdWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVPYmogIT0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCB1c2VyUm91dGVSZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHVzZXJSb3V0ZVJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlclJvdXRlUmVjb3JkLm1Sb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb3V0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHdlIHdpbGwgc2VsZWN0IGl0IGluc3RlYWQgd2hlbiB0aGUgcm91dGUgaXMgYWRkZWQuCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sub25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiBhIHJvdXRlIGlzIHVuc2VsZWN0ZWQuCi0gICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOwotICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgVXNlclJvdXRlUmVjb3JkKHJvdXRlLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyb3V0ZU9iaiwgcmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJvdXRlT2JqLCBtVm9sdW1lQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBtVXNlclJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRVc2VyUm91dGUobVJvdXRlck9iaiwgcm91dGVPYmopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3bHkgYWRkZWQgcm91dGUgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAvLyByb3V0ZSBpbiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciB0aGVuIGVuc3VyZSBpdCBpcyBzZWxlY3RlZCBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKCFyb3V0ZS5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZU9iaiA9PSByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVzZXJSb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VyUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGUgPT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVzZXJSb3V0ZVJlY29yZCBnZXRVc2VyUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBPYmplY3QgdGFnID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFRhZyhyb3V0ZU9iaik7Ci0gICAgICAgICAgICByZXR1cm4gdGFnIGluc3RhbmNlb2YgVXNlclJvdXRlUmVjb3JkID8gKFVzZXJSb3V0ZVJlY29yZCl0YWcgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVjcmVhdGUgdGhlIHJvdXRlIGRlc2NyaXB0b3Igd2hlbiBtYWtpbmcgYW55IGNoYW5nZXMKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLgotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQsIGdldFJvdXRlTmFtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0gICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Um91dGVOYW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gUm91dGVzIHNob3VsZCBub3QgaGF2ZSBudWxsIG5hbWVzIGJ1dCBpdCBtYXkgaGFwcGVuIGZvciBiYWRseSBjb25maWd1cmVkCi0gICAgICAgICAgICAvLyB1c2VyIHJvdXRlcy4gIFdlIHRvbGVyYXRlIHRoaXMgYnkgdXNpbmcgYW4gZW1wdHkgbmFtZSBzdHJpbmcgaGVyZSBidXQKLSAgICAgICAgICAgIC8vIHN1Y2ggdW5uYW1lZCByb3V0ZXMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB1cHN0cmVhbQotICAgICAgICAgICAgLy8gKHdpdGggYSBsb2cgbWVzc2FnZSBzbyB3ZSBjYW4gdHJhY2sgZG93biB0aGUgcHJvYmxlbSkuCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmFtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXROYW1lKHJvdXRlT2JqLCBnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBpbnQgc3VwcG9ydGVkVHlwZXMgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tTdHJlYW0ocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVNYXgocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZUhhbmRsaW5nKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQuc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZC5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCkubVJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZVJlY29yZCB7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1Sb3V0ZURlc2NyaXB0b3I7IC8vIGFzc2lnbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uCi0KLSAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmosIFN0cmluZyBpZCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgICAgIG1Sb3V0ZURlc2NyaXB0b3JJZCA9IGlkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyCi0gICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlQ29udHJvbGxlcihPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUobVJvdXRlT2JqLCB2b2x1bWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0VXBkYXRlVm9sdW1lKG1Sb3V0ZU9iaiwgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIE1SMSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE3KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMUltcGwgZXh0ZW5kcyBKZWxseWJlYW5JbXBsCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCBtQWN0aXZlU2Nhbldvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIxSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkgbmV3UHJlc2VudGF0aW9uRGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IChuZXdQcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3UHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSA6IC0xKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGlmICghTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmlzRW5hYmxlZChyZWNvcmQubVJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RpbmcocmVjb3JkKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29ubmVjdGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlzcGxheSBwcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQocHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVDYWxsYmFjaygpOwotCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIGdldEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQuc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMobUFjdGl2ZVNjYW4gPyBtUm91dGVUeXBlcyA6IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZC5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIySW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMUltcGwgewotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIySW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5nZXREZXNjcmlwdGlvbihyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuVXNlclJvdXRlSW5mby5zZXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCi0gICAgICAgICAgICAgICAgICAgIHwgKG1BY3RpdmVTY2FuID8gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOIDogMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBpMjQgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgyNCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcGkyNEltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjJJbXBsIHsKLSAgICAgICAgcHVibGljIEFwaTI0SW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGV2aWNlVHlwZShNZWRpYVJvdXRlckFwaTI0LlJvdXRlSW5mby5nZXREZXZpY2VUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJhYWYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotCi08Ym9keT4KLQotPHA+Q29udGFpbnMgQVBJcyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMgYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UKLSAgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjQ3MWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUxheW91dCBleHRlbmRzIFZpZXdHcm91cEltcGwgewotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVByaXZhdGVQcm92aWRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1NYXRjaFBhcmVudENoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KDEpOwotCi0gICAgcHVibGljIEJhc2VMYXlvdXQoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOwotICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyID0gcHJpdmF0ZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBscCkgewotICAgICAgICBpZiAobHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBscDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4gPQotICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZOwotICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5jbGVhcigpOwotCi0gICAgICAgIGludCBtYXhIZWlnaHQgPSAwOwotICAgICAgICBpbnQgbWF4V2lkdGggPSAwOwotICAgICAgICBpbnQgY2hpbGRTdGF0ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLCB3aWR0aE1lYXN1cmVTcGVjLCAwLCBoZWlnaHRNZWFzdXJlU3BlYywgMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSArIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbik7Ci0gICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA9IGNoaWxkU3RhdGUgfCBjaGlsZC5nZXRNZWFzdXJlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbwotICAgICAgICBtYXhXaWR0aCArPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBtYXhIZWlnaHQgKz0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpKTsKLSAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBmb3JlZ3JvdW5kJ3MgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlID0gbUluc3RhbmNlLmdldEZvcmVncm91bmQoKTsKLSAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpKTsKLSAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGRyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbCgKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhXaWR0aCwgd2lkdGhNZWFzdXJlU3BlYywgY2hpbGRTdGF0ZSksCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4SGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPDwgVmlldy5NRUFTVVJFRF9IRUlHSFRfU1RBVEVfU0hJRlQpKTsKLQotICAgICAgICBjb3VudCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMod2lkdGhNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC53aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMoaGVpZ2h0TWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKGNoaWxkV2lkdGhNZWFzdXJlU3BlYywgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRMZWZ0ID0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50UmlnaHQgPSByaWdodCAtIGxlZnQgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRUb3AgPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgZmluYWwgaW50IHBhcmVudEJvdHRvbSA9IGJvdHRvbSAtIHRvcCAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGludCBjaGlsZExlZnQ7Ci0gICAgICAgICAgICAgICAgaW50IGNoaWxkVG9wOwotCi0gICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFyZW50TGVmdCArIChwYXJlbnRSaWdodCAtIHBhcmVudExlZnQgLSB3aWR0aCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkVG9wID0gcGFyZW50VG9wICsgKHBhcmVudEJvdHRvbSAtIHBhcmVudFRvcCAtIGhlaWdodCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dChjaGlsZExlZnQsIGNoaWxkVG9wLCBjaGlsZExlZnQgKyB3aWR0aCwgY2hpbGRUb3AgKyBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpICsgMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmMTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbFZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbFZpZXcyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sVmlldzIgbUluc3RhbmNlOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiA9ICJmdWxsU2NyZWVuIjsKLQotICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIHB1YmxpYyBhcGkgdG8gc3VwcG9ydCBjdXN0b20gdmlkZW8gdmlldy4KLSAgICAvLyBUT0RPOiBDb21iaW5lIHRoZXNlIGNvbnN0YW50cyBpbnRvIG9uZSByZWdhcmRpbmcgVHJhY2tJbmZvLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZJREVPX1RSQUNLX0NPVU5UID0gIlZpZGVvVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fVFJBQ0tfQ09VTlQgPSAiQXVkaW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCA9ICJTdWJ0aXRsZVRyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NQRUVEID0gIlBsYXliYWNrU3BlZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYID0gIlNlbGVjdGVkQXVkaW9JbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVggPSAiU2VsZWN0ZWRTdWJ0aXRsZUluZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMgPSAiVXBkYXRlVHJhY2tTdGF0dXMiOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBpbnRlZ3JhdGluZyB3aXRoIE1lZGlhU2Vzc2lvbjIgJiBNZWRpYU1ldGFkYXRhMgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQgPSAiTWVkaWFUeXBlQWR2ZXJ0aXNlbWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMgPSAiVXBkYXRlTWVkaWFUeXBlU3RhdHVzIjsKLQotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNob3cgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TSE9XX1NVQlRJVExFID0gInNob3dTdWJ0aXRsZSI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gaGlkZSBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0hJREVfU1VCVElUTEUgPSAiaGlkZVN1YnRpdGxlIjsKLSAgICAvLyBUT0RPOiByZW1vdmUgb25jZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgcmV2aXNlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4gPSAic2V0RnVsbHNjcmVlbiI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2VsZWN0IGF1ZGlvIHRyYWNrIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLID0gIlNlbGVjdFRyYWNrIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZXQgcGxheWJhY2sgc3BlZWQgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQgPSAiU2V0UGxheWJhY2tTcGVlZCI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gbXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01VVEU9ICJNdXRlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byB1bm11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTk1VVEUgPSAiVW5tdXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfSEVMUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFkgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX01BSU4gPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWCA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9ERUZBVUxUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9NVVNJQyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfQURWRVJUSVNFTUVOVCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUk9HUkVTUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVdJTkRfVElNRV9NUyA9IDEwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX1RJTUVfTVMgPSAzMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURfU0tJUF9XQUlUX1RJTUVfTVMgPSA1MDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT05fRVhJU1RFTlQgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU1QVFkgPSAiIjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMgbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKLSAgICBwcml2YXRlIGludCBtUHJldlN0YXRlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb1RyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtU3VidGl0bGVUcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc01vZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTcGVlZEluZGV4OwotICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc1dpbmRvd01hcmdpbjsKLSAgICBwcml2YXRlIGludCBtTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKLSAgICBwcml2YXRlIGxvbmcgbVBsYXliYWNrQWN0aW9uczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURyYWdnaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNGdWxsU2NyZWVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dFeHBhbmRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RvcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlSXNFbmFibGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2Vla0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWR2ZXJ0aXNlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXV0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVWFVwZGF0ZTsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVJvb3Q7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZEV4dGVybmFsTGluazsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CYWNrQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtUm91dGVCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DZW50ZXJWaWV3OwotICAgIHByaXZhdGUgVmlldyBtVHJhbnNwb3J0Q29udHJvbHM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheVBhdXNlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZmd2RCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUmV3QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU5leHRCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUHJldkJ1dHRvbjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NaW5pbWFsRXh0cmFWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKLSAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzczsKLSAgICBwcml2YXRlIFZpZXcgbVByb2dyZXNzQnVmZmVyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhckxlZnRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1UaW1lVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1FbmRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUN1cnJlbnRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkU2tpcFZpZXc7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1Gb3JtYXRCdWlsZGVyOwotICAgIHByaXZhdGUgRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyUmlnaHRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1CYXNpY0NvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1FeHRyYUNvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DdXN0b21CdXR0b25zOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVN1YnRpdGxlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZ1bGxTY3JlZW5CdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25SaWdodDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvbkxlZnQ7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTXV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1WaWRlb1F1YWxpdHlCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU2V0dGluZ3NCdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRSZW1haW5pbmdWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3Ci0gICAgcHJpdmF0ZSBMaXN0VmlldyBtU2V0dGluZ3NMaXN0VmlldzsKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1TZXR0aW5nc1dpbmRvdzsKLSAgICBwcml2YXRlIFNldHRpbmdzQWRhcHRlciBtU2V0dGluZ3NBZGFwdGVyOwotICAgIHByaXZhdGUgU3ViU2V0dGluZ3NBZGFwdGVyIG1TdWJTZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzTWFpblRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NTdWJUZXh0c0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1TZXR0aW5nc0ljb25JZHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUF1ZGlvVHJhY2tMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1WaWRlb1F1YWxpdHlMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QbGF5YmFja1NwZWVkVGV4dExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEZsb2F0PiBtUGxheWJhY2tTcGVlZExpc3Q7Ci0KLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJJbXBsKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgLy8gSW5mbGF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBmcm9tIFhNTAotICAgICAgICBtUm9vdCA9IG1ha2VDb250cm9sbGVyVmlldygpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtUm9vdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbChTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25GdWxsU2NyZWVuTGlzdGVuZXJfaW1wbChNZWRpYUNvbnRyb2xWaWV3Mi5PbkZ1bGxTY3JlZW5MaXN0ZW5lciBsKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcl9pbXBsKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xzID0gY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpOwotICAgICAgICAgICAgLy8gU2V0IG1NZXRhZGF0YSBhbmQgbVBsYXliYWNrU3RhdGUgdG8gZXhpc3RpbmcgTWVkaWFTZXNzaW9uIHZhcmlhYmxlcyBzaW5jZSB0aGV5IG1heQotICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1Db250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLQotICAgICAgICAgICAgbUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdXR0b25WaXNpYmlsaXR5X2ltcGwoaW50IGJ1dHRvbiwgaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIG1lbWJlciB2YXJpYWJsZXMgZm9yIEZhc3QtRm9yd2FyZC9QcnZpb3VzL1Jld2luZCBidXR0b25zIHRvIHNhdmUgdmlzaWJpbGl0eSBpbgotICAgICAgICAvLyBvcmRlciB0byBwcmV2ZW50IGJlaW5nIG92ZXJyaWRlbiBpbnNpZGUgdXBkYXRlTGF5b3V0KCkuCi0gICAgICAgIHN3aXRjaCAoYnV0dG9uKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QTEFZX1BBVVNFOgotICAgICAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgY2FuUGF1c2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRkZXRDoKLSAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUkVXOgotICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX05FWFQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QUkVWOgotICAgICAgICAgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsICYmIG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZVTExfU0NSRUVOOgotICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fT1ZFUkZMT1c6Ci0gICAgICAgICAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9NVVRFOgotICAgICAgICAgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU0VUVElOR1M6Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGxheUJ1dHRvbkZvY3VzX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhQ29udHJvbFZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgcmVtb3ZlZD8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2hlbiB0aGlzIHZpZXcncyB3aWR0aCBjaGFuZ2VzIGluIG9yZGVyIHRvIGF2b2lkIGFueSBVSSBvdmVybGFwIGJldHdlZW4KLSAgICAgICAgLy8gdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkgfHwgbU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgLy8gRGlzbWlzcyBTZXR0aW5nc1dpbmRvdyBpZiBpdCBpcyBzaG93aW5nLgotICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLQotICAgICAgICAgICAgLy8gVGhlc2Ugdmlld3MgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICAgICAgICAgICAgaWYgKG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpID09IDAgfHwgbVRpbWVWaWV3LmdldFdpZHRoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgV2luZG93TWFuYWdlciBtYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7Ci0gICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKLSAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0gICAgICAgICAgICBpbnQgZnVsbEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfaWNvbl9zaXplKTsKLSAgICAgICAgICAgIGludCBlbWJlZGRlZEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQWR2ZXJ0aXNlbWVudCBNb2RlLgotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDQuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDQ7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVVhVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25lLXRpbWUgb3BlcmF0aW9uIGZvciBNdXNpYyBtZWRpYSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnJlbW92ZVZpZXcobU11dGVCdXR0b24pOwotICAgICAgICAgICAgICAgICAgICBtRXh0cmFDb250cm9scy5hZGRWaWV3KG1NdXRlQnV0dG9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDMuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDM7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgotICAgICAgICAvLyBVcGRhdGUgdGl0bGUgYmFyIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmxhcCBiZXR3ZWVuIHRpdGxlIHZpZXcgYW5kIHRoZSByaWdodAotICAgICAgICAvLyBzaWRlIG9mIHRoZSB0aXRsZSBiYXIuCi0gICAgICAgIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gVE9ETzogTWVyZ2UgdGhlIGJlbG93IGNvZGUgd2l0aCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkuCi0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotCi0gICAgICAgIGlmIChpc1Zpc2libGUpIHsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBtUm91dGVTZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBpZiAobVJvdXRlU2VsZWN0b3IgIT0gbnVsbCAmJiAhbVJvdXRlU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFkpOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlpbmcoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgbVBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkgewotICAgICAgICBpZiAobUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvcyA9IG1QbGF5YmFja1N0YXRlLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiAoYnVmZmVyZWRQb3MgPT0gLTEpID8gLTEgOiAoaW50KSAoYnVmZmVyZWRQb3MgKiAxMDAgLyBtRHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXVzZSgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtCYWNrd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrRm9yd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmlldyB0aGF0IGhvbGRzIHRoZSB3aWRnZXRzIHRoYXQgY29udHJvbCBwbGF5YmFjay4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY3JlYXRlIHRoZWlyIG93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgdmlldy4KLSAgICAgKiBAaGlkZSBUaGlzIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdHcm91cCBtYWtlQ29udHJvbGxlclZpZXcoKSB7Ci0gICAgICAgIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tZWRpYV9jb250cm9sbGVyKTsKLSAgICAgICAgaW5pdENvbnRyb2xsZXJWaWV3KHJvb3QpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KFZpZXdHcm91cCB2KSB7Ci0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgICAgIG1UaXRsZUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGV4dCk7Ci0gICAgICAgIG1BZEV4dGVybmFsTGluayA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfZXh0ZXJuYWxfbGluayk7Ci0gICAgICAgIG1CYWNrQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYWNrKTsKLSAgICAgICAgaWYgKG1CYWNrQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQmFja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICBtUm91dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNhc3QpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgIG1DZW50ZXJWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5jZW50ZXJfdmlldyk7Ci0gICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3ID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC5taW5pbWFsX2V4dHJhX3ZpZXcpOwotICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIG1NaW5pbWFsRXh0cmFWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBpbnQgaWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKLSAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotICAgICAgICBwYXJhbXMuc2V0TWFyZ2lucygwLCAoaWNvblNpemUgKyBtYXJnaW5TaXplICogMikgKiAoLTEpLCAwLCAwKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgICAgICBtUHJvZ3Jlc3MgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzKTsKLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb2dyZXNzIGluc3RhbmNlb2YgU2Vla0JhcikgewotICAgICAgICAgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVNlZWtMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFByb2dyZXNzRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzcykpOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0TWF4KE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2dyZXNzQnVmZmVyID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzc19idWZmZXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldwotICAgICAgICBtQm90dG9tQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldwotICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgIG1UaW1lVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZSk7Ci0gICAgICAgIG1FbmRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2VuZCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9jdXJyZW50KTsKLSAgICAgICAgbUFkU2tpcFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3NraXBfdGltZSk7Ci0gICAgICAgIG1Gb3JtYXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobUZvcm1hdEJ1aWxkZXIsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgICAgICBtQm90dG9tQmFyUmlnaHRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgbUJhc2ljQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhc2ljX2NvbnRyb2xzKTsKLSAgICAgICAgbUV4dHJhQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmV4dHJhX2NvbnRyb2xzKTsKLSAgICAgICAgbUN1c3RvbUJ1dHRvbnMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbV9idXR0b25zKTsKLSAgICAgICAgbVN1YnRpdGxlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBGdWxsc2NyZWVuIGJ1dHRvbiB3aGVuIG9ubHkgaXQgaXMgcG9zc2libGUuCi0gICAgICAgIH0KLSAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X3JpZ2h0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dSaWdodExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19sZWZ0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbkxlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93TGVmdExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtTXV0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXV0ZSk7Ci0gICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU11dGVCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNldHRpbmdzQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zZXR0aW5ncyk7Ci0gICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQudmlkZW9fcXVhbGl0eSk7Ci0gICAgICAgIGlmIChtVmlkZW9RdWFsaXR5QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1WaWRlb1F1YWxpdHlMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUFkUmVtYWluaW5nVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfcmVtYWluaW5nKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICAgICAgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQuc2V0dGluZ3NfbGlzdCk7Ci0gICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU2V0dGluZ3NBZGFwdGVyKG1TZXR0aW5nc01haW5UZXh0c0xpc3QsIG1TZXR0aW5nc1N1YlRleHRzTGlzdCwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCk7Ci0gICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU3ViU2V0dGluZ3NBZGFwdGVyKG51bGwsIDApOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKG1TZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIpOwotCi0gICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCk7Ci0gICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luID0gKC0xKSAqIG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9zZXR0aW5nc19vZmZzZXQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cgPSBuZXcgUG9wdXBXaW5kb3cobVNldHRpbmdzTGlzdFZpZXcsIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIHBhdXNlIG9yIHNlZWsgYnV0dG9ucyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBwYXVzZWQgb3Igc2Vla2VkLgotICAgICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIHRvIGJlIGEgTWVkaWFQbGF5ZXJDb250cm9sRXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmICFjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbyBpcyBhZGQgYSBjYW5TZWVrIHRvIHRoZSBNZWRpYVBsYXllckNvbnRyb2wgaW50ZXJmYWNlOwotICAgICAgICAgICAgLy8gdGhpcyBzY2hlbWUgY2FuIGJyZWFrIHRoZSBjYXNlIHdoZW4gYXBwbGljYXRpb25zIHdhbnQgdG8gYWxsb3cgc2VlayB0aHJvdWdoIHRoZQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgYmFyIGJ1dCBkaXNhYmxlIGZvcndhcmQvYmFja3dhcmQgYnV0dG9ucy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhlIGZsYWdzIFNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFLCBTRUVLX0ZPUldBUkRfQVZBSUxBQkxFLAotICAgICAgICAgICAgLy8gYW5kIFNFRUtfQVZBSUxBQkxFIGFyZSBhbGwgKHVuKXNldCB0b2dldGhlcjsgYXMgc3VjaCB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhcmlzZSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4KSB7Ci0gICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UsIHRoYXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAvLyB0aGUgY2FuUGF1c2UvY2FuU2Vla1hZWiBtZXRob2RzLiBUaGlzIGlzIE9LLCBpdCBqdXN0IG1lYW5zIHdlCi0gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG1lZGlhIGNhbiBiZSBwYXVzZWQgYW5kIHNlZWtlZCwgYW5kIHNvIHdlIGRvbid0IGRpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBidXR0b25zLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVXBkYXRlUHJvZ3Jlc3MgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTaG93aW5nID0gbUluc3RhbmNlLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgICAgICBpZiAoIW1EcmFnZ2luZyAmJiBpc1Nob3dpbmcgJiYgaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdERlbGF5ZWQobVVwZGF0ZVByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyAtIChwb3MgJSBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRm9yVGltZShpbnQgdGltZU1zKSB7Ci0gICAgICAgIGludCB0b3RhbFNlY29uZHMgPSB0aW1lTXMgLyAxMDAwOwotCi0gICAgICAgIGludCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7Ci0gICAgICAgIGludCBtaW51dGVzID0gKHRvdGFsU2Vjb25kcyAvIDYwKSAlIDYwOwotICAgICAgICBpbnQgaG91cnMgPSB0b3RhbFNlY29uZHMgLyAzNjAwOwotCi0gICAgICAgIG1Gb3JtYXRCdWlsZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgaWYgKGhvdXJzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJTAyZDolMDJkIiwgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNldFByb2dyZXNzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xsZXIgPT0gbnVsbCB8fCBtRHJhZ2dpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAwOwotICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAoaW50KSAoTUFYX1BST0dSRVNTICogKGxvbmcpIGN1cnJlbnRQb3NpdGlvbiAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmIGN1cnJlbnRQb3NpdGlvbiAhPSBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRQcm9ncmVzcyhwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG1lZGlhIGlzIGEgbG9jYWwgZmlsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSBidWZmZXIsIHNvIHNldCBzZWNvbmRhcnkKLSAgICAgICAgICAgIC8vIHByb2dyZXNzIHRvIG1heGltdW0uCi0gICAgICAgICAgICBpZiAoZ2V0QnVmZmVyUGVyY2VudGFnZSgpIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhNQVhfUFJPR1JFU1MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoZ2V0QnVmZmVyUGVyY2VudGFnZSgpICogMTApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbmRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FbmRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShtRHVyYXRpb24pKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgZmlyc3QgNSBzZWNvbmRzIG9mIHRoZQotICAgICAgICAgICAgLy8gYWR2ZXJ0aXNlbWVudC4KLSAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8PSBBRF9TS0lQX1dBSVRfVElNRV9NUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBza2lwVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEX1NLSVBfV0FJVF9USU1FX01TIC0gY3VycmVudFBvc2l0aW9uKSAvIDEwMDAgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFRleHQoc2tpcFRpbWVUZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFJlbWFpbmluZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24gPCAwKSA/IDAgOiAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVtYWluaW5nVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRm9yVGltZShyZW1haW5pbmdUaW1lKSk7Ci0gICAgICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRUZXh0KHJlbWFpbmluZ1RpbWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpIHsKLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGF1c2UoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbnRyb2xzLnBsYXkoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvcyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBzZWVrYmFyIGxpc3RlbmVyIHRvIHRyaWdnZXI6Ci0gICAgLy8KLSAgICAvLyBUaGUgZmlyc3QgaXMgdGhlIHVzZXIgdXNpbmcgdGhlIHRvdWNocGFkIHRvIGFkanVzdCB0aGUgcG9zaXRpdG9uIG9mIHRoZQotICAgIC8vIHNlZWtiYXIncyB0aHVtYi4gSW4gdGhpcyBjYXNlIG9uU3RhcnRUcmFja2luZ1RvdWNoIGlzIGNhbGxlZCBmb2xsb3dlZCBieQotICAgIC8vIGEgbnVtYmVyIG9mIG9uUHJvZ3Jlc3NDaGFuZ2VkIG5vdGlmaWNhdGlvbnMsIGNvbmNsdWRlZCBieSBvblN0b3BUcmFja2luZ1RvdWNoLgotICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGZpZWxkICJtRHJhZ2dpbmciIHRvIHRydWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZ2dpbmcKLSAgICAvLyBzZXNzaW9uIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBwb3NpdGlvbiBpbiBjYXNlIG9mIG9uZ29pbmcgcGxheWJhY2suCi0gICAgLy8KLSAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGludm9sdmVzIHRoZSB1c2VyIG9wZXJhdGluZyB0aGUgc2Nyb2xsIGJhbGwsIGluIHRoaXMKLSAgICAvLyBjYXNlIHRoZXJlIFdPTidUIEJFIG9uU3RhcnRUcmFja2luZ1RvdWNoL29uU3RvcFRyYWNraW5nVG91Y2ggbm90aWZpY2F0aW9ucywKLSAgICAvLyB3ZSB3aWxsIHNpbXBseSBhcHBseSB0aGUgdXBkYXRlZCBwb3NpdGlvbiB3aXRob3V0IHN1c3BlbmRpbmcgcmVndWxhciB1cGRhdGVzLgotICAgIHByaXZhdGUgZmluYWwgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgbVNlZWtMaXN0ZW5lciA9IG5ldyBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJhZ2dpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBCeSByZW1vdmluZyB0aGVzZSBwZW5kaW5nIHByb2dyZXNzIG1lc3NhZ2VzIHdlIG1ha2Ugc3VyZQotICAgICAgICAgICAgLy8gdGhhdCBhKSB3ZSB3b24ndCB1cGRhdGUgdGhlIHByb2dyZXNzIHdoaWxlIHRoZSB1c2VyIGFkanVzdHMKLSAgICAgICAgICAgIC8vIHRoZSBzZWVrYmFyIGFuZCBiKSBvbmNlIHRoZSB1c2VyIGlzIGRvbmUgZHJhZ2dpbmcgdGhlIHRodW1iCi0gICAgICAgICAgICAvLyB3ZSB3aWxsIHBvc3Qgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBxdWV1ZSBhZ2FpbiBhbmQKLSAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgbWVzc2FnZSBxdWV1ZWQgdXAuCi0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdG9wcGVkLiBJbiB0aGlzIGNhc2UsIHVwZGF0ZSB0aGUgcGF1c2UgYnV0dG9uIHRvCi0gICAgICAgICAgICAvLyBzaG93IHRoZSBwbGF5IGltYWdlIGluc3RlYWQgb2YgdGhlIHJlcGxheSBpbWFnZS4KLSAgICAgICAgICAgIGlmIChtSXNTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgYmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gcHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgY2hhbmdlcyB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyBiYXIncyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IChpbnQpICgoKGxvbmcpIG1EdXJhdGlvbiAqIHByb2dyZXNzKSAvIE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgICAgIC8vIHRoZSBjYWxsIHRvIHNob3coKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhpcyBiZWNhdXNlIGl0IGlzIGEKLSAgICAgICAgICAgIC8vIG5vLW9wIGlmIHdlIGFyZSBhbHJlYWR5IHNob3dpbmcuCi0gICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVBsYXlQYXVzZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUmV3TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpIC0gUkVXSU5EX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgKyBGT1JXQVJEX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU5leHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvTmV4dCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1CYWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1WaWRlb1F1YWxpdHlMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtVmlkZW9RdWFsaXR5TGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZ1bGxTY3JlZW5MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW50ZXJpbmdGdWxsU2NyZWVuID0gIW1Jc0Z1bGxTY3JlZW47Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZS1hcnJhbmdlIHRoZSBidXR0b24gbGF5b3V0cyBhY2NvcmRpbmcgdG8gdGhlIFVYLgotICAgICAgICAgICAgaWYgKGlzRW50ZXJpbmdGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGFyZ3MucHV0Qm9vbGVhbihBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiwgaXNFbnRlcmluZ0Z1bGxTY3JlZW4pOwotICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfRlVMTFNDUkVFTiwgYXJncywgbnVsbCk7Ci0KLSAgICAgICAgICAgIG1Jc0Z1bGxTY3JlZW4gPSBpc0VudGVyaW5nRnVsbFNjcmVlbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93TGVmdExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1NdXRlQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaWYgKCFtSXNNdXRlKSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXRlZF9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc011dGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfTVVURSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfdW5tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfVU5NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX01BSU47Ci0gICAgICAgICAgICBtU2V0dGluZ3NBZGFwdGVyLnNldFN1YlRleHRzKG1TZXR0aW5nc1N1YlRleHRzTGlzdCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyCi0gICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgc3dpdGNoIChtU2V0dGluZ3NNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX01BSU46Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1BdWRpb1RyYWNrTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVBsYXliYWNrU3BlZWRUZXh0TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3BlZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0hFTFApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwgcG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTcGVlZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRGbG9hdChLRVlfUExBWUJBQ0tfU1BFRUQsIG1QbGF5YmFja1NwZWVkTGlzdC5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVELCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfSEVMUDoKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsIHBvc2l0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb24sIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb2ZmLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb2ZmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWToKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUR1cmF0aW9uKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gKGludCkgbU1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB0aXRsZSBiYXIgaXMgbWFkZSB1cCBvZiB0d28gc2VwYXJhdGUgTGluZWFyTGF5b3V0cy4gSWYgdGhlIHN1bSBvZiB0aGUgdHdvIGJhcnMgYXJlCi0gICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlIGJhciwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IGJhciAod2hpY2ggbWFrZXMgdGhlCi0gICAgLy8gVGV4dFZpZXcgdGhhdCBjb250YWlucyB0aGUgdGl0bGUgb2YgdGhlIG1lZGlhIGZpbGUgc2hyaW5rKS4KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHRpdGxlQmFyV2lkdGggPSBtVGl0bGVCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgVmlldyBsZWZ0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9sZWZ0KTsKLSAgICAgICAgICAgIFZpZXcgcmlnaHRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgIGludCBsZWZ0QmFyV2lkdGggPSBsZWZ0QmFyLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgcmlnaHRCYXJXaWR0aCA9IHJpZ2h0QmFyLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBsZWZ0QmFyLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPiB0aXRsZUJhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gdGl0bGVCYXJXaWR0aCAtIHJpZ2h0QmFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gbGVmdEJhcldpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoIDwgdGl0bGVCYXJXaWR0aCAmJiBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggIT0gMCkgewotICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmdEJhci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAobU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZVRleHQgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBhcnRpc3RUZXh0ID0gIiI7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKSkgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGl0bGUgZm9yIEVtYmVkZGVkIHNpemUgdHlwZQotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlVGV4dCArICIgLSAiICsgYXJ0aXN0VGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHVwZGF0ZSBsYXlvdXQgaW5zaWRlIG9uTWVhc3VyZSgpCi0gICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRDb2xvckZpbHRlcihSLmNvbG9yLmdyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoaW50IG1heEljb25Db3VudCwgaW50IGZ1bGxJY29uU2l6ZSwgaW50IGVtYmVkZGVkSWNvblNpemUsCi0gICAgICAgICAgICAgaW50IG1hcmdpblNpemUsIGludCBjdXJyV2lkdGgsIGludCBjdXJySGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgaW50IGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZnVsbEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZW1iZWRkZWRJY29uU2l6ZSAqIG1heEljb25Db3VudAotICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKLSAgICAgICAgaW50IGZ1bGxXaWR0aCA9IG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpICsgbVRpbWVWaWV3LmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICArIGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgZW1iZWRkZWRXaWR0aCA9IG1UaW1lVmlldy5nZXRXaWR0aCgpICsgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgc2NyZWVuTWF4TGVuZ3RoID0gTWF0aC5tYXgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGZ1bGxXaWR0aCA+IHNjcmVlbk1heExlbmd0aCkgewotICAgICAgICAgICAgLy8gVE9ETzogc2NyZWVuIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBuZWVkZWQgZm9yIEZ1bGwgc2l6ZS4KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGdWxsU2l6ZSA9IChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgPyAoY3VycldpZHRoID09IHNjcmVlbk1heExlbmd0aCkgOgotICAgICAgICAgICAgICAgIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpOwotCi0gICAgICAgIGlmIChpc0Z1bGxTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZW1iZWRkZWRXaWR0aCA8PSBjdXJyV2lkdGgpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRU1CRURERUQpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfTUlOSU1BTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX01JTklNQUwpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoaW50IHNpemVUeXBlKSB7Ci0gICAgICAgIG1TaXplVHlwZSA9IHNpemVUeXBlOwotICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgdGltZVZpZXdQYXJhbXMgPQotICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIG1UaW1lVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICBzd2l0Y2ggKG1TaXplVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRU1CRURERUQ6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRiwgUi5pZC5ib3R0b21fYmFyX2xlZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0ZVTEw6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5mdWxsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzLCAwKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YsIFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfTUlOSU1BTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1NaW5pbWFsRXh0cmFWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG51bGwpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVWaWV3LnNldExheW91dFBhcmFtcyh0aW1lVmlld1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzRnVsbFNjcmVlbikgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoaW50IGxheW91dElkKSB7Ci0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucGF1c2UpOwotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVBsYXlQYXVzZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRmZ3ZEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZmZ3ZCk7Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZmd2RMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1SZXdCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnJldyk7Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1SZXdMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKLSAgICAgICAgbU5leHRCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm5leHQpOwotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1OZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmV2QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcmV2KTsKLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUHJldkxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKSB7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCkpOwotCi0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcylbUExBWUJBQ0tfU1BFRURfMXhfSU5ERVhdKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZChSRVNPVVJDRV9FTVBUWSk7Ci0KLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2F1ZGlvdHJhY2spOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQpOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19oZWxwKTsKLQotICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLQotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQpKTsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZFRleHRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcykpKTsKLSAgICAgICAgLy8gU2VsZWN0IHRoZSAiMXgiIHNwZWVkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gUExBWUJBQ0tfU1BFRURfMXhfSU5ERVg7Ci0KLSAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLSAgICAgICAgaW50W10gc3BlZWRzID0gbVJlc291cmNlcy5nZXRJbnRBcnJheShSLmFycmF5LnNwZWVkX211bHRpcGxpZWRfYnlfMTAwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gKGZsb2F0KSBzcGVlZHNbaV0gLyAxMDAuMGY7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QuYWRkKHNwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2V0dGluZ3NXaW5kb3coQmFzZUFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICAvLyBTZXQgQWRhcHRlcgotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotCi0gICAgICAgIC8vIFNldCB3aWR0aCBvZiB3aW5kb3cKLSAgICAgICAgaW50IGl0ZW1XaWR0aCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggOiBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2V0V2lkdGgoaXRlbVdpZHRoKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IG9mIHdpbmRvdyBhbmQgc2hvdwotICAgICAgICBpbnQgaXRlbUhlaWdodCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0IDogbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgICAgIGludCB0b3RhbEhlaWdodCA9IGFkYXB0ZXIuZ2V0Q291bnQoKSAqIGl0ZW1IZWlnaHQ7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zaG93QXNEcm9wRG93bihtSW5zdGFuY2UsIG1TZXR0aW5nc1dpbmRvd01hcmdpbiwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gLSB0b3RhbEhlaWdodCwgR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBzdGF0ZTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHBhdXNlIGJ1dHRvbiBkZXBlbmRpbmcgb24gcGxheWJhY2sgc3RhdGUgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHJlYXNvbnM6Ci0gICAgICAgICAgICAvLyAgIDEpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgYXBwIGN1c3RvbWl6ZXMgcGxheWJhY2sgc3RhdGUgYmVoYXZpb3Igd2hlbiBhcHAKLSAgICAgICAgICAgIC8vICAgICAgYWN0aXZpdHkgaXMgcmVzdW1lZC4KLSAgICAgICAgICAgIC8vICAgMikgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSB0aGUgbWVkaWEgZmlsZSByZWFjaGVzIGVuZCBvZiBkdXJhdGlvbi4KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpICE9IG1QcmV2U3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBsYXliYWNrQWN0aW9ucyAhPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIG5ld0FjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQWN0aW9ucyA9IG5ld0FjdGlvbnM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBidXR0b25zIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50LgotICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEN1c3RvbUFjdGlvbnMoKTsKLSAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBjdXN0b21BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQnV0dG9uIGJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogQXR0cmlidXRlU2V0ICovLCAwIC8qIFN0eWxlICovKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQXBwbHkgUi5zdHlsZS5Cb3R0b21CYXJCdXR0b24gdG8gdGhpcyBidXR0b24gdXNpbmcgbGlicmFyeSBjb250ZXh0LgotICAgICAgICAgICAgICAgICAgICAvLyBSZWZlciBDb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50IChpbnQgZGVmU3R5bGVSZXMpIG9mIFZpZXcuamF2YQotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0SW1hZ2VSZXNvdXJjZShhY3Rpb24uZ2V0SWNvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2x0aXBUZXh0KGFjdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uU3RyaW5nID0gYWN0aW9uLmdldEFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgd2UgYXJlIGp1c3Qgc2VuZGluZyBleHRyYXMgdGhhdCBjYW1lIGZyb20gc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCB0aGUgcmlnaHQgYmVoYXZpb3I/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlbmRDdXN0b21BY3Rpb24oYWN0aW9uU3RyaW5nLCBhY3Rpb24uZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5hZGRWaWV3KGJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB1cGRhdGVBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfVklERU9fVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MsIGFuZCB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbgotICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWQgaW50byB0aGUgU2V0dGluZ3Mgd2luZG93IHlldCwgYXV0b21hdGljYWxseSBjaGVjayB0aGUgZmlyc3QgdHJhY2suCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIEF1ZGlvIFRyYWNrIHNlbGVjdGlvbiB3aWxsIGJlIGRlZmF1bHRlZCB0byAiTm9uZSIuCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9BVURJT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRleHQgYWJvdXQgdHJhY2sgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHN1YiB0ZXh0IGluc2lkZSB0aGUgU2V0dGluZ3Mgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0NvdW50ID09IDAgJiYgbUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGUgPSBNRURJQV9UWVBFX01VU0lDOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3VidGl0bGVUcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWR2ZXJ0aXNlbWVudCA9IG5ld1N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtSWNvbklkczsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU1haW5UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YlRleHRzOwotCi0gICAgICAgIHB1YmxpYyBTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IG1haW5UZXh0cywgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzdWJUZXh0cywKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxJbnRlZ2VyPiBpY29uSWRzKSB7Ci0gICAgICAgICAgICBtTWFpblRleHRzID0gbWFpblRleHRzOwotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBtSWNvbklkcyA9IGljb25JZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobU1haW5UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbU1haW5UZXh0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobU1haW5UZXh0cyA9PSBudWxsKSA/IDAgOiBtTWFpblRleHRzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKLSAgICAgICAgICAgIFZpZXcgcm93OwotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgbWFpblRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubWFpbl90ZXh0KTsKLSAgICAgICAgICAgIFRleHRWaWV3IHN1YlRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuc3ViX3RleHQpOwotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOwotCi0gICAgICAgICAgICAvLyBTZXQgbWFpbiB0ZXh0Ci0gICAgICAgICAgICBtYWluVGV4dFZpZXcuc2V0VGV4dChtTWFpblRleHRzLmdldChwb3NpdGlvbikpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgc3ViIHRleHQgYW5kIGNlbnRlciB0aGUgbWFpbiB0ZXh0IGlmIHN1YiB0ZXh0cyBkbyBub3QgZXhpc3QgYXQgYWxsIG9yIHRoZSBzdWIKLSAgICAgICAgICAgIC8vIHRleHQgYXQgdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIGVtcHR5LgotICAgICAgICAgICAgaWYgKG1TdWJUZXh0cyA9PSBudWxsIHx8IG1TdWJUZXh0cy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBzdWIgdGV4dC4KLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRUZXh0KG1TdWJUZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIG1haW4gaWNvbiBhbmQgc2V0IHZpc2liaWxpdHkgdG8gZ29uZSBpZiBpY29ucyBhcmUgc2V0IHRvIG51bGwgb3IgdGhlIGljb24gYXQKLSAgICAgICAgICAgIC8vIHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBzZXQgdG8gUkVTT1VSQ0VfTk9OX0VYSVNURU5ULgotICAgICAgICAgICAgaWYgKG1JY29uSWRzID09IG51bGwgfHwgbUljb25JZHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9OT05fRVhJU1RFTlQpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IG1haW4gaWNvbi4KLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobUljb25JZHMuZ2V0KHBvc2l0aW9uKSwgbnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBleHRlbmQgdGhpcyBjbGFzcyBmcm9tIFNldHRpbmdzQWRhcHRlcgotICAgIHByaXZhdGUgY2xhc3MgU3ViU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGV4dHM7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DaGVja1Bvc2l0aW9uOwotCi0gICAgICAgIHB1YmxpYyBTdWJTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IHRleHRzLCBpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7Ci0gICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKG1UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRleHRzLmdldChwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1UZXh0cyA9PSBudWxsKSA/IDAgOiBtVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgY2hlY2tWaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmNoZWNrKTsKLQotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbUNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHMoTGlzdDxTdHJpbmc+IHRleHRzKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUG9zaXRpb24oaW50IGNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjJjZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKLQotY2xhc3MgU3VidGl0bGVWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBBbmNob3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVWaWV3IjsKLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IG1TdWJ0aXRsZVdpZGdldDsKLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lciBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyOwotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KSB7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgPT0gc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXR0YWNoZWRUb1dpbmRvdyA9IGlzQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVXaWRnZXQgPSBzdWJ0aXRsZVdpZGdldDsKLQotICAgICAgICBpZiAoc3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKSB7Ci0gICAgICAgIHJldHVybiBMb29wZXIuZ2V0TWFpbkxvb3BlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZ2V0UGFkZGluZ0xlZnQoKSwgZ2V0UGFkZGluZ1RvcCgpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFN1YnRpdGxlVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzkyZTg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0KLWNsYXNzIFZpZGVvU3VyZmFjZVZpZXcgZXh0ZW5kcyBTdXJmYWNlVmlldyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1N1cmZhY2VWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLSAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXIgPSBudWxsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIpOwotICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0RGlzcGxheShtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1NVUkZBQ0VWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCAmJiBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjawotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInN1cmZhY2VDcmVhdGVkOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyICsgIiwgbmV3IGhvbGRlcjogIiArIGhvbGRlcik7Ci0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gaG9sZGVyOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWN0IHJlY3QgPSBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIC8vIEFmdGVyIHdlIHJldHVybiBmcm9tIHRoaXMgd2UgY2FuJ3QgdXNlIHRoZSBzdXJmYWNlIGFueSBtb3JlCi0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB0aGUgd2F5IHRvIG1vdmUgb25NZWFzdXJlKCkgY29kZSBpbnRvIEZyYW1lTGF5b3V0LgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFN1cmZhY2VWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGEzYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVc7Ci0KLUBSZXF1aXJlc0FwaSgyNikKLWNsYXNzIFZpZGVvVGV4dHVyZVZpZXcgZXh0ZW5kcyBUZXh0dXJlVmlldwotICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1RleHR1cmVWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOwotICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsKLSAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgICAgIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgbm90IHJlYWR5LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1wLnNldFN1cmZhY2UobVN1cmZhY2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKLSAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9URVhUVVJFVklFVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKLSAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKLSAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKG1TdXJmYWNlVGV4dHVyZSAhPSBudWxsICYmICFtU3VyZmFjZVRleHR1cmUuaXNSZWxlYXNlZCgpICYmIG1TdXJmYWNlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlCi0gICAgICAgICAgICAgICAgKyAiLCBuZXcgc3VyZmFjZTogIiArIHN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gc3VyZmFjZVRleHR1cmU7Ci0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCk7ICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIGl0IHNob3VsZCBiZSBjYWxsZWQgaGVyZT8KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlVXBkYXRlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgIC8vIG5vLW9wCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgICAgICBtU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFRleHR1cmVWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mjc5ZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMkltcGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLnBhbGV0dGUuUGFsZXR0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Sb3V0ZVBsYXllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5DbG9zZWRDYXB0aW9uUmVuZGVyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhQ29udHJvbEludGVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgVmlkZW9WaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3MlByb3ZpZGVyLCBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVmlldzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVMgPSAyMDAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWRlb1ZpZXcyIG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FUlJPUiA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSRUQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFVU0VEID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQUNLX0lOREVYID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WQUxJRF9TUEVFRCA9IDBmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKLSAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKLQotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKLSAgICBwcml2YXRlIGludCBtQXVkaW9Gb2N1c1R5cGUgPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOOyAvLyBsZWdhY3kgZm9jdXMgZ2FpbgotCi0gICAgcHJpdmF0ZSBQYWlyPEV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXI+IG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZDsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1DdXJyZW50VmlldzsKLSAgICBwcml2YXRlIFZpZGVvVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OwotICAgIHByaXZhdGUgVmlkZW9TdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7Ci0KLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRHNkOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sVmlldzIgbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbU1lZGlhU2Vzc2lvbjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtTWVkaWFDb250cm9sbGVyOwotICAgIHByaXZhdGUgTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1lZGlhTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVXBkYXRlTWVkaWFUeXBlOwotICAgIHByaXZhdGUgQnVuZGxlIG1NZWRpYVR5cGVEYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKLQotICAgIC8vIFRPRE86IG1vdmUgbXVzaWMgdmlldyBpbnNpZGUgU3VyZmFjZVZpZXcvVGV4dHVyZVZpZXcgb3IgaW1wbGVtZW50IFZpZGVvVmlld0ludGVyZmFjZS4KLSAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIFZpZXcgbU11c2ljVmlldzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1NdXNpY0FsYnVtRHJhd2FibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljVGl0bGVUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY0FydGlzdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc011c2ljTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbURvbWluYW50Q29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotCi0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgbVN0YXRlQnVpbGRlcjsKLSAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25MaXN0OwotICAgIHByaXZhdGUgaW50IG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlOwotICAgIHByaXZhdGUgbG9uZyBtU2Vla1doZW5QcmVwYXJlZDsgIC8vIHJlY29yZGluZyB0aGUgc2VlayBwb3NpdGlvbiB3aGlsZSBwcmVwYXJpbmcKLQotICAgIHByaXZhdGUgaW50IG1WaWRlb1dpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb0hlaWdodDsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1WaWRlb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXVkaW9UcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPj4gbVN1YnRpdGxlVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgU3VidGl0bGVDb250cm9sbGVyIG1TdWJ0aXRsZUNvbnRyb2xsZXI7Ci0KLSAgICAvLyBzZWxlY3RlZCB2aWRlby9hdWRpby9zdWJ0aXRsZSB0cmFjayBpbmRleCBhcyBNZWRpYVBsYXllcjIgcmV0dXJucwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotCi0gICAgcHJpdmF0ZSBTdWJ0aXRsZVZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlRW5hYmxlZDsKLQotICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOwotICAgIC8vIFRPRE86IFJlbW92ZSBtRmFsbGJhY2tTcGVlZCB3aGVuIGludGVncmF0aW9uIHdpdGggTWVkaWFQbGF5ZXIyJ3MgbmV3IHNldFBsYXliYWNrUGFyYW1zKCkuCi0gICAgLy8gUmVmZXI6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMW56QWZuczZpMmhKM1JrYVVyZTNRTVQ2d3NEZWRKNU9OTGlBX09PQkZGWDgvZWRpdAotICAgIHByaXZhdGUgZmxvYXQgbUZhbGxiYWNrU3BlZWQ7ICAvLyBrZWVwIHRoZSBvcmlnaW5hbCBzcGVlZCBiZWZvcmUgJ3BhdXNlJyBpcyBjYWxsZWQuCi0gICAgcHJpdmF0ZSBmbG9hdCBtVm9sdW1lTGV2ZWxGbG9hdDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lTGV2ZWw7Ci0KLSAgICBwcml2YXRlIGxvbmcgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbU1lZGlhUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICBwcml2YXRlIFJvdXRlUGxheWVyIG1Sb3V0ZVBsYXllcjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbVJvdXRlckNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGxvY2FsIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBuZXcgUm91dGVQbGF5ZXIobUluc3RhbmNlLmdldENvbnRleHQoKSwgcm91dGUpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5zZXRQbGF5ZXJFdmVudENhbGxiYWNrKG5ldyBSb3V0ZVBsYXllci5QbGF5ZXJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQnVpbGRlciBwc0J1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0QWN0aW9ucyhSb3V0ZVBsYXllci5QTEFZQkFDS19BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpdGVtU3RhdHVzLmdldENvbnRlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtU3RhdHVzLmdldFBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX05PTkUsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIHBvc2l0aW9uLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHBiU3RhdGUgPSBwc0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShwYlN0YXRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIG1tQnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1tQnVpbGRlci5wdXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU3RhdHVzLmdldENvbnRlbnREdXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEobW1CdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVtb3RlIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZSAhPSBudWxsICYmIG1Sb3V0ZVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhc29uICE9IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVzdW1lIGxvY2FsIHBsYXliYWNrICAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIG9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgVmlkZW9WaWV3MkltcGwoVmlkZW9WaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgbVZpZGVvV2lkdGggPSAwOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOwotICAgICAgICBtU3BlZWQgPSAxLjBmOwotICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKLSAgICAgICAgLy8gVE9ETzogYWRkIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoaXMgdmFsdWUuCi0gICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUzsKLQotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLQotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTU9WSUUpLmJ1aWxkKCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RGb2N1cygpOwotCi0gICAgICAgIC8vIFRPRE86IHRyeSB0byBrZWVwIGEgc2luZ2xlIGNoaWxkIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbHdheXMgaGF2aW5nIGJvdGguCi0gICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBWaWRlb1RleHR1cmVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtU3VyZmFjZVZpZXcgPSBuZXcgVmlkZW9TdXJmYWNlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdXJmYWNlVmlldyk7Ci0KLSAgICAgICAgbVN1YnRpdGxlVmlldyA9IG5ldyBTdWJ0aXRsZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0QmFja2dyb3VuZENvbG9yKDApOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VidGl0bGVWaWV3KTsKLQotICAgICAgICBib29sZWFuIGVuYWJsZUNvbnRyb2xWaWV3ID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiZW5hYmxlQ29udHJvbFZpZXciLCB0cnVlKTsKLSAgICAgICAgaWYgKGVuYWJsZUNvbnRyb2xWaWV3KSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG5ldyBNZWRpYUNvbnRyb2xWaWV3MihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVTdWJ0aXRsZSIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUT0RPOiBDaG9vc2UgVGV4dHVyZVZpZXcgd2hlbiBTdXJmYWNlVmlldyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gQ2hvb3NlIHN1cmZhY2UgdmlldyBieSBkZWZhdWx0Ci0gICAgICAgIGludCB2aWV3VHlwZSA9IChhdHRycyA9PSBudWxsKSA/IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXCi0gICAgICAgICAgICAgICAgOiBhdHRycy5nZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAidmlld1R5cGUiLCBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVyk7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHN1cmZhY2VWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyB0ZXh0dXJlVmlldy4iKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoTWVkaWFDb250cm9sVmlldzIgbWVkaWFDb250cm9sVmlldywgbG9uZyBpbnRlcnZhbE1zKSB7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbWVkaWFDb250cm9sVmlldzsKLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IGludGVydmFsTXM7Ci0gICAgICAgIC8vIFRPRE86IENhbGwgTWVkaWFDb250cm9sVmlldzIuc2V0Um91dGVTZWxlY3RvciBvbmx5IHdoZW4gY2FzdCBhdmFpbGFsYmUuCi0gICAgICAgICgoTWVkaWFDb250cm9sVmlldzJJbXBsKSBtTWVkaWFDb250cm9sVmlldy5nZXRQcm92aWRlcigpKS5zZXRSb3V0ZVNlbGVjdG9yKG1Sb3V0ZVNlbGVjdG9yKTsKLQotICAgICAgICBpZiAobUluc3RhbmNlLmlzQXR0YWNoZWRUb1dpbmRvdygpKSB7Ci0gICAgICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyIGdldE1lZGlhQ29udHJvbGxlcl9pbXBsKCkgewotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZWRpYVNlc3Npb24gaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzIgZ2V0TWVkaWFDb250cm9sVmlldzJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRNZWRpYU1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFNZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYU1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIHRoaXMgd2l0aCBNZWRpYVNlc3Npb24yI01lZGlhSXRlbTIKLSAgICAgICAgbU1lZGlhTWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgd2Vic2l0ZSBsaW5rCi0gICAgICAgIG1NZWRpYVR5cGVEYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBib29sZWFuIGlzQWQgPSBtZXRhZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBmYWxzZSA6IG1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQpICE9IDA7Ci0gICAgICAgIG1NZWRpYVR5cGVEYXRhLnB1dEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5ULCBpc0FkKTsKLQotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXRlciBpbnNpZGUgT25QcmVwYXJlZExpc3RlbmVyIGFmdGVyIE1lZGlhU2Vzc2lvbiBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlRW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChlbmFibGUgIT0gbVN1YnRpdGxlRW5hYmxlZCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IGVuYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnRpdGxlRW5hYmxlZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1YnRpdGxlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiByZW1vdmUgc2V0U3BlZWRfaW1wbCBvbmNlIE1lZGlhQ29udHJvbGxlcjIgaXMgcmVhZHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3BlZWRfaW1wbChmbG9hdCBzcGVlZCkgewotICAgICAgICBpZiAoc3BlZWQgPD0gMC4wZikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgc3BlZWQgKCIgKyBzcGVlZCArICIpIGlzIGlnbm9yZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVNwZWVkID0gc3BlZWQ7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChpbnQgZm9jdXNHYWluKSB7Ci0gICAgICAgIGlmIChmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORQotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdWRpbyBmb2N1cyB0eXBlICIgKyBmb2N1c0dhaW4pOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0ZvY3VzVHlwZSA9IGZvY3VzR2FpbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG51bGwgQXVkaW9BdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9QYXRoX2ltcGwoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKFVyaS5wYXJzZShwYXRoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmksIGhlYWRlcnMsIG51bGwpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0RGF0YVNvdXJjZShidWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhSXRlbV9pbXBsKE1lZGlhSXRlbTIgbWVkaWFJdGVtKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZV9pbXBsKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBtRHNkID0gZHNkOwotICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7Ci0gICAgICAgIG9wZW5WaWRlbyhkc2QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdUeXBlX2ltcGwoaW50IHZpZXdUeXBlKSB7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFZpZGVvVmlld0ludGVyZmFjZSB0YXJnZXRWaWV3OwotICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBUZXh0dXJlVmlldyIpOwotICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1UZXh0dXJlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFN1cmZhY2VWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVN1cmZhY2VWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB2aWV3VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgKChWaWV3KSB0YXJnZXRWaWV3KS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIHRhcmdldFZpZXcudGFrZU92ZXIobUN1cnJlbnRWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21BY3Rpb25zX2ltcGwoCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBhY3Rpb25MaXN0LAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZCA9IG5ldyBQYWlyPD4oZXhlY3V0b3IsIGxpc3RlbmVyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWJhY2sgYnVpbGRlciBpbiBvcmRlciB0byBjbGVhciBleGlzdGluZyB0aGUgY3VzdG9tIGFjdGlvbnMuCi0gICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBudWxsOwotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIGwpIHsKLSAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBNZWRpYVNlc3Npb24KLSAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24obUluc3RhbmNlLmdldENvbnRleHQoKSwgIlZpZGVvVmlldzJNZWRpYVNlc3Npb24iKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRDYWxsYmFjayhuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soKSk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0QWN0aXZlKHRydWUpOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIG1NZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtTWVkaWFSb3V0ZXIuc2V0TWVkaWFTZXNzaW9uKG1NZWRpYVNlc3Npb24pOwotICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVJvdXRlU2VsZWN0b3IsIG1Sb3V0ZXJDYWxsYmFjayk7Ci0gICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYWZ0ZXIgbW92aW5nIE1lZGlhU2Vzc2lvbiBjcmVhdGluZyBjb2RlIGluc2lkZSBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgewotICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOwotICAgICAgICAgICAgaWYgKG1OZWVkVXBkYXRlTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIG1NZWRpYVNlc3Npb24ucmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBWaWRlb1ZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVG91Y2hFdmVudCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICAvLyBUT0RPOiBUZXN0IHRvdWNoIGV2ZW50IGhhbmRsaW5nIGxvZ2ljIHRob3JvdWdobHkgYW5kIHNpbXBsaWZ5IHRoZSBsb2dpYy4KLSAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAobUlzTXVzaWNNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiA9IHJldHJpZXZlT3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfbGFuZHNjYXBlX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9wb3J0cmFpdF9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRU1CRURERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgbUZhZGVPdXQgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOwotICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNyZWF0ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VEZXN0cm95ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gY2FsbCByZXF1ZXN0TGF5b3V0IGhlcmU/Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ2hhbmdlZCgpLiB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGFrZU92ZXJEb25lKCkuIE5vdyBjdXJyZW50IHZpZXcgaXM6ICIgKyB2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZpZXcgPSB2aWV3OwotICAgICAgICBpZiAobVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lci5vblZpZXdUeXBlQ2hhbmdlZChtSW5zdGFuY2UsIHZpZXcuZ2V0Vmlld1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgLy8gR2V0IE1lZGlhQ29udHJvbGxlciBmcm9tIE1lZGlhU2Vzc2lvbiBhbmQgc2V0IGl0IGluc2lkZSBNZWRpYUNvbnRyb2xWaWV3Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldENvbnRyb2xsZXIobU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NZWRpYUNvbnRyb2xWaWV3LCBwYXJhbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRUb1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUExBWUlORwotICAgICAgICAgICAgICAgICYmIG1UYXJnZXRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HOwotICAgIH0KLQotICAgIC8vIENyZWF0ZXMgYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgYW5kIHByZXBhcmUgcGxheWJhY2suCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgVXJpIHVyaSA9IGRzZC5nZXRVcmkoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZHNkLmdldFVyaUhlYWRlcnMoKTsKLSAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhkc2QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBoYXZlIGEgZm9jdXMgbGlzdGVuZXIKLSAgICAgICAgICAgIEF1ZGlvRm9jdXNSZXF1ZXN0IGZvY3VzUmVxdWVzdDsKLSAgICAgICAgICAgIGZvY3VzUmVxdWVzdCA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKG1BdWRpb0ZvY3VzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIucmVxdWVzdEF1ZGlvRm9jdXMoZm9jdXNSZXF1ZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKTogY3JlYXRpbmcgbmV3IE1lZGlhUGxheWVyMiBpbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcjJJbXBsKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3LmFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1JbnN0YW5jZS5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZWx5IGZpcmluZyBsb2dpYyBmb3IgbW9yZSBhY2N1cmF0ZSBzeW5jIGJldHdlZW4gQ0MgYW5kIHZpZGVvIGZyYW1lCi0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyID0gbmV3IFN1YnRpdGxlQ29udHJvbGxlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVnaXN0ZXJSZW5kZXJlcihuZXcgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKGNvbnRleHQpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2V0QW5jaG9yKChTdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yKSBtU3VidGl0bGVWaWV3KTsKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKGV4ZWN1dG9yLCBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2spOwotCi0gICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKGRzZCk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU3VidGl0bGVEYXRhTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHRoZSB0YXJnZXQgc3RhdGUgaGVyZSBlaXRoZXIsIGJ1dCBwcmVzZXJ2ZSB0aGUKLSAgICAgICAgICAgIC8vIHRhcmdldCBzdGF0ZSB0aGF0IHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgLy8gU2F2ZSBmaWxlIG5hbWUgYXMgdGl0bGUgc2luY2UgdGhlIGZpbGUgbWF5IG5vdCBoYXZlIGEgdGl0bGUgTWV0YWRhdGEuCi0gICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKLSAgICAgICAgICAgIG1SZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmkpOwotCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW4gY29udGVudDogIiArIHVyaSwgZXgpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sub25FcnJvcihtTWVkaWFQbGF5ZXIsIGRzZCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX1VOS05PV04sIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9JTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBtZWRpYSBwbGF5ZXIgaW4gYW55IHN0YXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0UGxheWVyKCkgewotICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBwbGF5ZXIgPSBtTWVkaWFQbGF5ZXI7Ci0gICAgICAgICAgICBuZXcgQXN5bmNUYXNrPE1lZGlhUGxheWVyMiwgVm9pZCwgVm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoTWVkaWFQbGF5ZXIyLi4uIHBsYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IE5QRSB3aGlsZSBNZWRpYVBsYXllcjIuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAvL3BsYXllcnNbMF0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suU0VSSUFMX0VYRUNVVE9SLCBwbGF5ZXIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIC8vbVBlbmRpbmdTdWJ0aXRsZVRyYWNrcy5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIGlmIChtU3RhdGVCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIgZm9yIHRoaXMgc3RyZWFtCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtTWVkaWFQbGF5ZXIuZ2V0TWV0YWRhdGEoTWVkaWFQbGF5ZXIyLk1FVEFEQVRBX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLkJZUEFTU19NRVRBREFUQV9GSUxURVIpOwotCi0gICAgICAgICAgICAvLyBBZGQgUGxheSBhY3Rpb24gYXMgZGVmYXVsdAotICAgICAgICAgICAgbG9uZyBwbGF5YmFja0FjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZOwotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEFjdGlvbnMocGxheWJhY2tBY3Rpb25zKTsKLQotICAgICAgICAgICAgaWYgKG1DdXN0b21BY3Rpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IG1DdXN0b21BY3Rpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuYWRkQ3VzdG9tQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0U3RhdGUoZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSwKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1TcGVlZCk7Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIE1lZGlhUGxheWVyMi5nZXRCdWZmZXJlZFBvc2l0aW9uKCkgb25jZSBpdCBpcwotICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQuCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgLyAxMDAuMCAqIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgUGxheWJhY2tTdGF0ZSBmb3IgTWVkaWFTZXNzaW9uCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU3RhdGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1GYWRlT3V0ID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIC8vIFRPRE86IERlY2lkZSB3aGF0IHRvIHNob3cgd2hlbiB0aGUgc3RhdGUgaXMgbm90IGluIHBsYXliYWNrIHN0YXRlCi0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyA9PSBudWxsIHx8ICFpc0luUGxheWJhY2tTdGF0ZSgpCi0gICAgICAgICAgICAgICAgfHwgKG1Jc011c2ljTWVkaWFUeXBlICYmIG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGlmIChtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zICE9IDAKLSAgICAgICAgICAgICYmICFtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVNwZWVkKCkgewotICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCk7Ci0gICAgICAgIGlmIChtU3BlZWQgIT0gcGFyYW1zLmdldFNwZWVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLnNldFNwZWVkKG1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrUGFyYW1zIGhhcyB1bnN1cHBvcnRlZCB2YWx1ZTogIiArIGUpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXZpc2UgdGhpcyBwYXJ0IGFmdGVyIGludGVncmF0aW5nIHdpdGggTVAyLgotICAgICAgICAgICAgICAgIC8vIElmIG1TcGVlZCBoYWQgYW4gaWxsZWdhbCB2YWx1ZSBmb3Igc3BlZWQgcmF0ZSwgc3lzdGVtIHdpbGwgZGV0ZXJtaW5lIGJlc3QKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGluZyAoc2VlIFBsYXliYWNrUGFyYW1zLkFVRElPX0ZBTExCQUNLX01PREVfREVGQVVMVCkuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIHByZS1NUDIgcmV0dXJucyAwLjBmIHdoZW4gaXQgaXMgcGF1c2VkLiBJbiB0aGlzIGNhc2UsIFZpZGVvVmlldzIgd2lsbAotICAgICAgICAgICAgICAgIC8vIHVzZSBtRmFsbGJhY2tTcGVlZCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIGZsb2F0IGZhbGxiYWNrU3BlZWQgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCkuZ2V0U3BlZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tTcGVlZCA+IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBmYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3BlZWQgPSBtRmFsbGJhY2tTcGVlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrKCkgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbyA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHJldHVybiBwbGF5YmFja0luZm8gIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHBsYXliYWNrSW5mby5nZXRQbGF5YmFja1R5cGUoKSA9PSBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShib29sZWFuIHNlbGVjdCkgewotICAgICAgICBpZiAoIWlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc2VsZWN0aW9uIGR5bmFtaWMKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLmZpcnN0OwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2VsZWN0VHJhY2sobVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5zZWNvbmQpOwotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmRlc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmFja3MoKSB7Ci0gICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1NZWRpYVBsYXllci5nZXRUcmFja0luZm8oKTsKLSAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCB0cmFja1R5cGUgPSB0cmFja0luZm9zLmdldChpKS5nZXRUcmFja1R5cGUoKTsKLSAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcy5hZGQoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUKLSAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKLSAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gbVN1YnRpdGxlQ29udHJvbGxlci5hZGRUcmFjayh0cmFja0luZm9zLmdldChpKS5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmFkZChuZXcgUGFpcjw+KGksIHRyYWNrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFNlbGVjdCBmaXJzdCB0cmFja3MgYXMgZGVmYXVsdAotICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID09IDAgJiYgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1Jc011c2ljTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1ZJREVPX1RSQUNLX0NPVU5ULCBtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9BVURJT19UUkFDS19DT1VOVCwgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQsIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShtU3VidGl0bGVFbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIC8vIEdldCBhbmQgc2V0IGR1cmF0aW9uIGFuZCB0aXRsZSB2YWx1ZXMgYXMgTWVkaWFNZXRhZGF0YSBmb3IgTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCAmJiBtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlRJVExFKSkgewotICAgICAgICAgICAgbVRpdGxlID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZXRhZGF0YS5USVRMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1UaXRsZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0TG9uZygKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QXVkaW9NZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLQotICAgICAgICBieXRlW10gYWxidW0gPSBtUmV0cmlldmVyLmdldEVtYmVkZGVkUGljdHVyZSgpOwotICAgICAgICBpZiAoYWxidW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGFsYnVtLCAwLCBhbGJ1bS5sZW5ndGgpOwotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShiaXRtYXApOwotCi0gICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggdmlzdWFsaXplcgotICAgICAgICAgICAgUGFsZXR0ZS5nZW5lcmF0ZUFzeW5jKGJpdG1hcCwgbmV3IFBhbGV0dGUuUGFsZXR0ZUFzeW5jTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW5lcmF0ZWQoUGFsZXR0ZSBwYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBkb21pbmFudCBjb2xvciBmb3IgZGVmYXVsdCBhbGJ1bSBpbWFnZS4KLSAgICAgICAgICAgICAgICAgICAgbURvbWluYW50Q29sb3IgPSBwYWxldHRlLmdldERvbWluYW50Q29sb3IoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXVzaWNWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXNpY1ZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19kZWZhdWx0X2FsYnVtX2ltYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IHRpdGxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFydGlzdCA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgIGlmIChhcnRpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IGFydGlzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VuZCB0aXRsZSBhbmQgYXJ0aXN0IHN0cmluZyB0byBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCwgbU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IEVtYmVkZGVkIG1vZGUgYXMgZGVmYXVsdAotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtU3VyZmFjZVZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOwotICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXRyaWV2ZU9yaWVudGF0aW9uKCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBpbnQgd2lkdGggPSBkbS53aWR0aFBpeGVsczsKLSAgICAgICAgaW50IGhlaWdodCA9IGRtLmhlaWdodFBpeGVsczsKLQotICAgICAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCA6Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVNdXNpY1ZpZXcoaW50IGxheW91dElkKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1NdXNpY1ZpZXcpOwotCi0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgdi5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotCi0gICAgICAgIEltYWdlVmlldyBhbGJ1bVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFsYnVtKTsKLSAgICAgICAgaWYgKGFsYnVtVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbGJ1bVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTXVzaWNBbGJ1bURyYXdhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IHRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOwotICAgICAgICBpZiAodGl0bGVWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlVmlldy5zZXRUZXh0KG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXh0VmlldyBhcnRpc3RWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hcnRpc3QpOwotICAgICAgICBpZiAoYXJ0aXN0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcnRpc3RWaWV3LnNldFRleHQobU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXVzaWNWaWV3ID0gdjsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU11c2ljVmlldywgMCk7Ci0gICAgfQotCi0gICAgT25TdWJ0aXRsZURhdGFMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlRGF0YShNZWRpYVBsYXllcjIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0Q3VycmVudFBvc2l0aW9uOiAiICsgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRTdGFydFRpbWVVcygpOiAiICsgZGF0YS5nZXRTdGFydFRpbWVVcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGlmZjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhLmdldFN0YXJ0VGltZVVzKCkvMTAwMCAtIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcywgZ2V0RHVyYXRpb25VcygpOiAiICsgZGF0YS5nZXREdXJhdGlvblVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGRhdGEuZ2V0VHJhY2tJbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZWxlY3RlZCB0cmFjayBpbmRleDogIiArIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+IHAgOiBtU3VidGl0bGVUcmFja0luZGljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmZpcnN0ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHAuc2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLm9uRGF0YShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIG1NZWRpYVBsYXllcjJDYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IHNpemU6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IG1WaWRlb1NpemU6IiArIG1WaWRlb1dpZHRoICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvV2lkdGggIT0gMCAmJiBtVmlkZW9IZWlnaHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lZCB0ZXh0IHJlbGF0ZWQgY29kZSBsYXRlciBvbmNlIHJlbGV2YW50IFJlbmRlcmVyIGlzIGRlZmluZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGltZWRUZXh0OiAiICsgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QcmVwYXJlZChtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29tcGxldGlvbihtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25CdWZmZXJpbmdVcGRhdGUobXAsIGRzZCwgZXh0cmEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgZnJhbWV3b3JrRXJyLCBpbnQgaW1wbEVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiAiICsgZnJhbWV3b3JrRXJyICsgIiwiICsgaW1wbEVycik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTyAmJiBzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgc2V0IHBsYXliYWNrIHN0YXRlIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc2VuZCBUcmFja0luZm9zIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBNZWRpYVNlc3Npb24gd2hlbiBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBtU2Vla1doZW5QcmVwYXJlZCBtYXkgYmUgY2hhbmdlZCBhZnRlciBzZWVrVG8oKSBjYWxsCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vla1RvUG9zaXRpb24gPSBtU2Vla1doZW5QcmVwYXJlZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtUb1Bvc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zZWVrVG8oc2Vla1RvUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gMCAmJiB2aWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCB8fCB2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkgOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZGVvIHNpemU6ICIgKyB2aWRlb1dpZHRoICsgIi8iICsgdmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBtSW5zdGFuY2UuZ2V0V2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHZpZGVvIHNpemUgeWV0LCBidXQgc2hvdWxkIHN0YXJ0IGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2aWRlbyBzaXplIG1pZ2h0IGJlIHJlcG9ydGVkIHRvIHVzIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgcGVyY2VudCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50OwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZUluZGV4ID0gYXJncy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KHN1YnRpdGxlSW5kZXgpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZVRyYWNrSW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHN1YnRpdGxlVHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfRlVMTFNDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIub25GdWxsU2NyZWVuUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0Qm9vbGVhbihNZWRpYUNvbnRyb2xWaWV3MkltcGwuQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0luZGV4ID0gYXJncy5nZXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9JbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvVHJhY2tJbmRleCA9IG1BdWRpb1RyYWNrSW5kaWNlcy5nZXQoYXVkaW9JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gYXVkaW9UcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGFyZ3MuZ2V0RmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfUExBWUJBQ0tfU1BFRUQsIElOVkFMSURfU1BFRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IElOVkFMSURfU1BFRUQgJiYgc3BlZWQgIT0gbVNwZWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFNwZWVkKHNwZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX01VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTGV2ZWwgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfVU5NVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbVZvbHVtZUxldmVsLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLmZpcnN0LmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLnNlY29uZC5vbkN1c3RvbUFjdGlvbihhY3Rpb24sIGV4dHJhcykpOwotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSAmJiAobUN1cnJlbnRWaWV3Lmhhc0F2YWlsYWJsZVN1cmZhY2UoKSB8fCBtSXNNdXNpY01lZGlhVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBsYXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBseVNwZWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TZWVrVG8ocG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKHBvcywgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gcG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU3RvcCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGQ0N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbnRlcmZhY2UgVmlkZW9WaWV3SW50ZXJmYWNlIHsKLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIHRoZSB2aWV3J3Mgc3VyZmFjZSB0byB0aGUgZ2l2ZW4gTWVkaWFQbGF5ZXIyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1wIE1lZGlhUGxheWVyMgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBzdWNjZXNzZnVsbHkgYXNzaWduZWQsIGZhbHNlIGlmIG5vdC4gSXQgd2lsbCBmYWlsIHRvIGFzc2lnbgotICAgICAqICAgICAgICAgaWYgYW55IG9mIE1lZGlhUGxheWVyMiBvciBzdXJmYWNlIGlzIHVuYXZhaWxhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKLSAgICB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCk7Ci0gICAgaW50IGdldFZpZXdUeXBlKCk7Ci0gICAgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotCi0gICAgLyoqCi0gICAgICogVGFrZXMgb3ZlciBvbGRWaWV3LiBJdCBtZWFucyB0aGF0IHRoZSBNZWRpYVBsYXllcjIgd2lsbCBzdGFydCByZW5kZXJpbmcgb24gdGhpcyB2aWV3LgotICAgICAqIFRoZSB2aXNpYmlsaXR5IG9mIG9sZFZpZXcgd2lsbCBiZSBzZXQgYXMge0BsaW5rIFZpZXcuR09ORX0uIElmIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogTWVkaWFQbGF5ZXIyIGluc3RhbmNlIG9yIGl0cyBzdXJmYWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzIGRlZmVycmVkIHVudGlsCi0gICAgICogYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgaXMgc2V0IGJ5IHtAbGluayAjc2V0TWVkaWFQbGF5ZXJ9IG9yIGl0cyBzdXJmYWNlIGJlY29tZXMgYXZhaWxhYmxlLgotICAgICAqIHtAbGluayBTdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzCi0gICAgICogZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGRWaWV3IFRoZSB2aWV3IHRoYXQgTWVkaWFQbGF5ZXIyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcgb24uCi0gICAgICovCi0gICAgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHZpZXcncyBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpbnN0YW5jZSBvZiBWaWRlb1ZpZXdJbnRlcmZhY2UgY2FsbHMgdGhlc2Ugc3VyZmFjZSBub3RpZmljYXRpb24gbWV0aG9kcyBhY2NvcmRpbmdseSBpZgotICAgICAqIGEgbGlzdGVuZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB2aWEge0BsaW5rICNzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyKX0uCi0gICAgICovCi0gICAgaW50ZXJmYWNlIFN1cmZhY2VMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldyk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDY4MjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cEltcGwgaW1wbGVtZW50cyBWaWV3R3JvdXBQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKLQotICAgIHB1YmxpYyBWaWV3R3JvdXBJbXBsKFZpZXdHcm91cCBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlX2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRmluaXNoSW5mbGF0ZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTGF5b3V0X2ltcGwoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoaW50IG1lYXN1cmVkV2lkdGgsIGludCBtZWFzdXJlZEhlaWdodCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5jaGVja0xheW91dFBhcmFtc19pbXBsKHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5zaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKFZpZXcgY2hpbGQsCi0gICAgICAgIGludCBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCBpbnQgd2lkdGhVc2VkLCBpbnQgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGludCBoZWlnaHRVc2VkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoY2hpbGQsCi0gICAgICAgICAgICAgICAgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgd2lkdGhVc2VkLCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaGVpZ2h0VXNlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkZmQyYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKLSAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCi0gICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBqdW5pdAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHNUZXN0Ci0KLUxPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0gTWVkaWFDb21wb25lbnRzCi0KLUxPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0KLUxPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudGVzdHMiPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSBUZXN0Ij4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDwhLS0KLSAgICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKLSAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQubWVkaWEudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIHRlc3QiIC8+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMDg0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRlc3RzIHtAbGluayBTZXNzaW9uUGxheWxpc3RBZ2VudH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX01TID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRVBFQVRfTU9ERSA9IC0xMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0hVRkZMRV9NT0RFID0gLTEwMDsKLQotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIEV4ZWN1dG9yIG1IYW5kbGVyRXhlY3V0b3I7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbUFnZW50OwotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRGF0YVNvdXJjZUhlbHBlcjsKLSAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOwotCi0gICAgcHVibGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdENoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkOwotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jazsKLQotICAgICAgICBwdWJsaWMgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soT2JqZWN0IHdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtV2FpdExvY2sgPSB3YWl0TG9jazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeURhdGFTb3VyY2VIZWxwZXIgaW1wbGVtZW50cyBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBvbkRhdGFTb3VyY2VNaXNzaW5nKE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRNZWRpYUlkKCkuY29udGFpbnMoIldJVEhPVVRfRFNEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGdldENvbnRleHQoKSwgVXJpLnBhcnNlKCJkc2Q6Ly90ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKGl0ZW0uZ2V0TWVkaWFJZCgpKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEJ1ZmZlcmluZ1N0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlcyhMaXN0PERhdGFTb3VyY2VEZXNjPiBkc2RzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIGdldEN1cnJlbnREYXRhU291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbG9vcEN1cnJlbnQoYm9vbGVhbiBsb29wKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tTcGVlZChmbG9hdCBzcGVlZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWVyVm9sdW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKEV4ZWN1dG9yIGUsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgotICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBtQ29udGV4dC5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlc3Npb25QbGF5bGlzdEFnZW50Iik7Ci0gICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IChydW5uYWJsZSkgLT4gewotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVBsYXllciA9IG1vY2soTW9ja1BsYXllci5jbGFzcyk7Ci0gICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4gewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IChQbGF5ZXJFdmVudENhbGxiYWNrKSBhcmdzWzFdOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0pLndoZW4obVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gbW9jayhNZWRpYVNlc3Npb24ySW1wbC5jbGFzcyk7Ci0gICAgICAgIG1EYXRhU291cmNlSGVscGVyID0gbmV3IE15RGF0YVNvdXJjZUhlbHBlcigpOwotICAgICAgICBtQWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQobVNlc3Npb25JbXBsLCBtUGxheWVyKTsKLSAgICAgICAgbUFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURhdGFTb3VyY2VIZWxwZXIpOwotICAgICAgICBtRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhtV2FpdExvY2spOwotICAgICAgICBtQWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUhhbmRsZXJFeGVjdXRvciwgbUV2ZW50Q2FsbGJhY2spOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRTaHVmbGxlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc2h1ZmZsZU1vZGUgPSBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShJTlZBTElEX1NIVUZGTEVfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0UmVwZWF0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcmVwZWF0TW9kZSA9IG1BZ2VudC5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKElOVkFMSURfUkVQRUFUX01PREUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDEwOwotICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdCgxMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSwgbUFnZW50LmdldFBsYXlsaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNraXBJdGVtcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QbGF5bGlzdEl0ZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0ocGxheWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dEl0ZW0KLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IDA7IGN1clBsYXlQb3MgPCBsaXN0U2l6ZSAtIDE7ICsrY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyArIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMTsgY3VyUGxheVBvcyA+IDA7IC0tY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cyB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dCB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxLCBuZXh0UGxheVBvcyA9IDAKLSAgICAgICAgLy8gVGVzdCBuZXh0IHBsYXkgcG9zIGFmdGVyIHNldHRpbmcgcmVwZWF0IG1vZGUgbm9uZS4KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gNTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBUZXN0IGFkZCBpdGVtOiBbMCAoY3VyKSwgMSwgMiwgMywgNF0gLT4gWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbV81ID0gZ2VuZXJhdGVNZWRpYUl0ZW0oNSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIC8vIE1vdmUgY3VycmVudDogWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdIC0+IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XQotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XSAtPiBbMCwgMSwgMiAoY3VyKSwgMywgNF0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgaXRlbTogWzAsIDEsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIHByZXZpb3VzSXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgbmV4dCBpdGVtOiBbMCwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgbmV4dEl0ZW0gPSBwbGF5bGlzdC5nZXQoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobmV4dEl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgaXRlbTogWzAsIDIgKGN1ciksIDRdIC0+IFswLCAyIChjdXIpLCA1XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBNb3ZlIGxhc3QgYW5kIHJlbW92ZSB0aGUgbGFzdCBpdGVtOiBbMCwgMiAoY3VyKSwgNV0gLT4gWzAsIDIsIDUgKGN1cildIC0+IFswLCAyIChjdXIpXQotICAgICAgICBNZWRpYUl0ZW0yIGxhc3RJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShsYXN0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcwotICAgICAgICBmb3IgKGludCBpID0gcGxheWxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RXaXRoSW52YWxpZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBBZGQgaXRlbTogWzAgKGN1ciksIDFdIC0+IFswIChjdXIpLCAzIChub19kc2QpLCAxXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMiA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcCB0byBuZXh0IGl0ZW06ICBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzAsIDIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIHByZXZpb3VzIGl0ZW06IFswLCAyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFsyIChub19kc2QpLCAxIChjdXIpXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzIgKG5vX2RzZCldCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gQWRkIGludmFsaWQgaXRlbTogWzIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMCA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDApOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgdmFsaWQgaXRlbTogWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAxLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMSA9IGdlbmVyYXRlTWVkaWFJdGVtKDEpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIHZhbGlkIGl0ZW0gd2l0aCBhbiBpbnZhbGlkIGl0ZW06Ci0gICAgICAgIC8vIFswIChub19kc2QpLCAxIChjdXIpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMyAobm9fZHNkKSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTMgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygzKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnNldCgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0zKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdEFmdGVyT25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgdmVyaWZ5KG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOwotCi0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGludCBsaXN0U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQoZ2VuZXJhdGVNZWRpYUl0ZW0oaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UGxheWxpc3QoaXRlbXMsIG51bGwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGxheWxpc3RFcXVhbHMoTGlzdDxNZWRpYUl0ZW0yPiBleHBlY3RlZCwgTGlzdDxNZWRpYUl0ZW0yPiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldChpKS5lcXVhbHMoYWN0dWFsLmdldChpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF9XSVRIT1VUX0RTRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbShpbnQga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfIiArIGtleSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9PV05FUlMgYi9wYWNrYWdlcy9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzRjZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1ha2Vyc3RlbkBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQotamFld2FuQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQotc3VuZ3Nvb0Bnb29nbGUuY29tCi13amlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNzQxOWU2NC4uOTFiNzU4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTIsMjQgKzIsNiBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBTZXJ2aWNlVXRpbGl0aWVzLmNwcAotCi0jIEZJWE1FIE1vdmUgdGhpcyBsaWJyYXJ5IHRvIGZyYW1ld29ya3MvbmF0aXZlCi1MT0NBTF9NT0RVTEUgOj0gbGlic2VydmljZXV0aWxpdHkKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJiaW5kZXIKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCiAgICAgQXVkaW9GbGluZ2VyLmNwcCAgICAgICAgICAgIFwKICAgICBUaHJlYWRzLmNwcCAgICAgICAgICAgICAgICAgXApAQCAtMzEsNyArMTMsOCBAQAogICAgIFBhdGNoUGFuZWwuY3BwICAgICAgICAgICAgICBcCiAgICAgU3RhdGVRdWV1ZS5jcHAgICAgICAgICAgICAgIFwKICAgICBCdWZMb2cuY3BwICAgICAgICAgICAgICAgICAgXAotICAgIFR5cGVkTG9nZ2VyLmNwcAorICAgIFR5cGVkTG9nZ2VyLmNwcCAgICAgICAgICAgICBcCisgICAgTkJBSU9fVGVlLmNwcCAgICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCkBAIC01MywxMyArMzYsMTQgQEAKICAgICBsaWJuYmFpbyBcCiAgICAgbGlibmJsb2cgXAogICAgIGxpYnBvd2VybWFuYWdlciBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYm1lbXVucmVhY2hhYmxlIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnZpYnJhdG9yCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmNwdXN0YXRzIFwKKyAgICBsaWJzbmRmaWxlIFwKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtODIsNiArNjYsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXJfb3ZlcmZsb3cKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDY4N2I1YTYuLjQwMzMyNDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMywxMiArMjMsMTMgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC00Nyw3ICs0OCw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogCkBAIC01Niw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCkBAIC02NCw4ICs2NCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAvLyNkZWZpbmUgQlVGTE9HX05ERUJVRyAwCkBAIC0xMDAsMTcgKzEwMCw2IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwogCi0KLSNpZmRlZiBURUVfU0lOSwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0VuYWJsZWQgPSBmYWxzZTsKLQotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEZyYW1lcyA9IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRGcmFtZXMgPSBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRnJhbWVzID0ga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQ7Ci0jZW5kaWYKLQogLy8gSW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIG9mZmxvYWRlZCB0cmFja3MgZWFjaCB0aW1lIGEgVmlzdWFsaXplciBpcyB0dXJuZWQgb24gYW5kIG9mZgogLy8gd2UgZGVmaW5lIGEgbWluaW11bSB0aW1lIGR1cmluZyB3aGljaCBhIGdsb2JhbCBlZmZlY3QgaXMgY29uc2lkZXJlZCBlbmFibGVkLgogc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pbkdsb2JhbEVmZmVjdEVuYWJsZXRpbWVOcyA9IHNlY29uZHMoNzIwMCk7CkBAIC0xMzQsNiArMTIzLDIxIEBACiAgICAgfQogfQogCisvLyBLZWVwIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBleHRlcm5hbCB2aWJyYXRvciBzZXJ2aWNlCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKSB7CisgICAgaWYgKHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9PSAwKSB7CisgICAgICAgIHNwIDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZSgKKyAgICAgICAgICAgIFN0cmluZzE2KCJleHRlcm5hbF92aWJyYXRvcl9zZXJ2aWNlIikpOworICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0ZDo6c3RyaW5nIGZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTYwLDYgKzE2NCw3IEBACiAgICAgICBtVG90YWxNZW1vcnkoMCksCiAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVBhdGNoUGFuZWwodGhpcyksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CiAgICAgLy8gdW5zaWduZWQgaW5zdGVhZCBvZiBhdWRpb191bmlxdWVfaWRfdXNlX3QsIGJlY2F1c2UgKysgb3BlcmF0b3IgaXMgdW5hdmFpbGFibGUgZm9yIGVudW0KQEAgLTE2OCw3ICsxNzMsNiBAQAogICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CiAgICAgfQogCi0gICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgZmFsc2UpOwogICAgIGlmIChkb0xvZykgewogICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLApAQCAtMTg1LDI3ICsxODksNiBAQAogICAgIG1FZmZlY3RzRmFjdG9yeUhhbCA9IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKTsKIAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwotICAgIGludCB0ZWVFbmFibGVkID0gMDsKLSAgICBpZiAoZGVidWdnYWJsZSkgewotICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwotICAgIH0KLSAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewotICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMikgewotICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKLSAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOwotICAgIH0KLSNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6b25GaXJzdFJlZigpCkBAIC0yMjYsOCArMjA5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7Ci0KICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogCiAgICAgZ0F1ZGlvRmxpbmdlciA9IHRoaXM7CkBAIC0zMTEsMTMgKzI5MiwxNiBAQAogICAgICAgICBmdWxsQ29uZmlnLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgZnVsbENvbmZpZy5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKICAgICAgICAgZnVsbENvbmZpZy5mb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HV19JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIsIF9fZnVuY19fKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCkBAIC0zNDEsNyArMzI1LDcgQEAKICAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgfQpAQCAtMzUzLDYgKzMzNywyNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qIHN0YXRpYyAqLworaW50IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKSB7CisgICAgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZXZzID0gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKTsKKyAgICBpZiAoZXZzICE9IDApIHsKKyAgICAgICAgaW50MzJfdCByZXQ7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KCpleHRlcm5hbFZpYnJhdGlvbiwgJnJldCk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKK30KKworLyogc3RhdGljICovCit2b2lkIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBldnMtPm9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKCpleHRlcm5hbFZpYnJhdGlvbik7CisgICAgfQorfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwKQEAgLTQ3OCw3ICs0ODMsNyBAQAogICAgICAgICAgICAgbUhhcmR3YXJlTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOworICAgICAgICBjb25zdCBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCiAgICAgICAgIGlmICghbG9ja2VkKSB7CkBAIC01MzQsMTIgKzUzOSwyMiBAQAogICAgICAgICAgICAgZGV2LT5kdW1wKGZkKTsKICAgICAgICAgfQogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgLy8gZHVtcCB0aGUgc2VyaWFsbHkgc2hhcmVkIHJlY29yZCB0ZWUgc2luawotICAgICAgICBpZiAobVJlY29yZFRlZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBkdW1wVGVlKGZkLCBtUmVjb3JkVGVlU291cmNlLCBBVURJT19JT19IQU5ETEVfTk9ORSwgJ0MnKTsKLSAgICAgICAgfQotI2VuZGlmCisgICAgICAgIG1QYXRjaFBhbmVsLmR1bXAoZmQpOworCisgICAgICAgIC8vIGR1bXAgZXh0ZXJuYWwgc2V0UGFyYW1ldGVycworICAgICAgICBhdXRvIGR1bXBMb2dnZXIgPSBbZmRdKFNpbXBsZUxvZyYgbG9nZ2VyLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lcyBzZXRQYXJhbWV0ZXJzOlxuIiwgbmFtZSk7CisgICAgICAgICAgICBsb2dnZXIuZHVtcChmZCwgIiAgICAiIC8qIHByZWZpeCAqLyk7CisgICAgICAgIH07CisgICAgICAgIGR1bXBMb2dnZXIobVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLCAiUmVqZWN0ZWQiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtQXBwU2V0UGFyYW1ldGVyTG9nLCAiQXBwIik7CisgICAgICAgIGR1bXBMb2dnZXIobVN5c3RlbVNldFBhcmFtZXRlckxvZywgIlN5c3RlbSIpOworCisgICAgICAgIC8vIGR1bXAgaGlzdG9yaWNhbCB0aHJlYWRzIGluIHRoZSBsYXN0IDEwIHNlY29uZHMKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWFkTG9nID0gbVRocmVhZExvZy5kdW1wVG9TdHJpbmcoCisgICAgICAgICAgICAgICAgIkhpc3RvcmljYWwgVGhyZWFkIExvZyAiLCAwIC8qIGxpbmVzICovLAorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSAtIDEwICogNjAgKiBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgd3JpdGUoZmQsIHRocmVhZExvZy5jX3N0cigpLCB0aHJlYWRMb2cuc2l6ZSgpKTsKIAogICAgICAgICBCVUZMT0dfUkVTRVQ7CiAKQEAgLTU0Nyw2ICs1NjIsMTAgQEAKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBOQkFJT19UZWUgZHVtcCBpcyBzYWZlIHRvIGNhbGwgb3V0c2lkZSBvZiBBRiBsb2NrLgorICAgICAgICBOQkFJT19UZWU6OmR1bXBBbGwoZmQsICJfRFVNUCIpOworI2VuZGlmCiAgICAgICAgIC8vIGFwcGVuZCBhIGNvcHkgb2YgbWVkaWEubG9nIGhlcmUgYnkgZm9yd2FyZGluZyBmZCB0byBpdCwgYnV0IGRvbid0IGF0dGVtcHQKICAgICAgICAgLy8gdG8gbG9va3VwIHRoZSBzZXJ2aWNlIGlmIGl0J3Mgbm90IHJ1bm5pbmcsIGFzIGl0IHdpbGwgYmxvY2sgZm9yIGEgc2Vjb25kCiAgICAgICAgIGlmIChzTWVkaWFMb2dTZXJ2aWNlQXNCaW5kZXIgIT0gMCkgewpAQCAtNjYyLDExICs2ODEsMTIgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC02OTYsNyArNzE2LDcgQEAKIAogICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmaW5wdXQuYXR0ciwgJm91dHB1dC5vdXRwdXRJZCwgc2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsICZpbnB1dC5jb25maWcsIGlucHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJuIGVycm9yICVkIG9yIGludmFsaWQgb3V0cHV0IGhhbmRsZSIsIGxTdGF0dXMpOwpAQCAtNzY3LDYgKzc4Nyw2MCBAQAogICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKICAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CisKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIENvbm5lY3Qgc2Vjb25kYXJ5IG91dHB1dHMuIEZhaWx1cmUgb24gYSBzZWNvbmRhcnkgb3V0cHV0IG11c3Qgbm90IGltcGVkIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAvLyBBbnkgc2Vjb25kYXJ5IG91dHB1dCBzZXR1cCBmYWlsdXJlIHdpbGwgbGVhZCB0byBhIGRlc3luYyBiZXR3ZWVuIHRoZSBBUCBhbmQgQUYgdW50aWwKKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICBUZWVQYXRjaGVzIHRlZVBhdGNoZXM7CisgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNlY29uZGFyeU91dHB1dCA6IHNlY29uZGFyeU91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqc2Vjb25kYXJ5VGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHNlY29uZGFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHNlY29uZGFyeVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIHNlY29uZGFyeSBvdXRwdXQgJWQiLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHN0ZDo6bGNtKHRocmVhZC0+ZnJhbWVDb3VudCgpLCBzZWNvbmRhcnlUaHJlYWQtPmZyYW1lQ291bnQoKSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgICAgICAgICAgICAgYXV0byBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBzcCBwYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKG51bGxwdHIgLyogdGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hSZWNvcmQgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwIHBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soc2Vjb25kYXJ5VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoVHJhY2sgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlZVBhdGNoZXMucHVzaF9iYWNrKHtwYXRjaFJlY29yZCwgcGF0Y2hUcmFja30pOworICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaFRyYWNrKTsKKyAgICAgICAgICAgICAgICBwYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2hSZWNvcmQuZ2V0KCkpOworICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2hUcmFjay5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjay0+c2V0VGVlUGF0Y2hlcyhzdGQ6Om1vdmUodGVlUGF0Y2hlcykpOworICAgICAgICB9CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtODEzLDcgKzg4Nyw3IEBACiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwpAQCAtOTE3LDYgKzk5MSw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdENoZWNrKCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICAvLyBjaGVjayByYW5nZQorICAgIGlmIChpc25hbihiYWxhbmNlKSB8fCBmYWJzKGJhbGFuY2UpID4gMS5mKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIHNob3J0IGN1dC4KKyAgICBpZiAobU1hc3RlckJhbGFuY2UgPT0gYmFsYW5jZSkgcmV0dXJuIE5PX0VSUk9SOworCisgICAgbU1hc3RlckJhbGFuY2UgPSBiYWxhbmNlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRpbmcoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKQogewogICAgIHN0YXR1c190IHJldCA9IGluaXRDaGVjaygpOwpAQCAtMTA1Niw2ICsxMTY0LDEzIEBACiAgICAgcmV0dXJuIG1hc3RlclZvbHVtZV9sKCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICpiYWxhbmNlID0gZ2V0TWFzdGVyQmFsYW5jZV9sKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyBpZiBjYWxsZWQgdGhyb3VnaCBiaW5kZXIsIG1heSByZXR1cm4gYSB0cmFuc2FjdGlvbmFsIGVycm9yCit9CisKIGJvb2wgQXVkaW9GbGluZ2VyOjptYXN0ZXJNdXRlKCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTA2Nyw2ICsxMTgyLDExIEBACiAgICAgcmV0dXJuIG1NYXN0ZXJWb2x1bWU7CiB9CiAKK2Zsb2F0IEF1ZGlvRmxpbmdlcjo6Z2V0TWFzdGVyQmFsYW5jZV9sKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbU1hc3RlckJhbGFuY2U7Cit9CisKIGJvb2wgQXVkaW9GbGluZ2VyOjptYXN0ZXJNdXRlX2woKSBjb25zdAogewogICAgIHJldHVybiBtTWFzdGVyTXV0ZTsKQEAgLTEwNzgsOSArMTE5OCw5IEBACiAgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBpbnZhbGlkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiBjYWxsZXIgIT0gZ2V0cGlkX2NhY2hlZCkgewotICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgcGlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXIsIHN0cmVhbSk7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsKKyAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHVpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyVWlkLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMTgwLDYgKzEzMDAsMjMgQEAKICAgICB9CiB9CiAKKy8vIGZvcndhcmRBdWRpb0h3U3luY1RvRG93bnN0cmVhbVBhdGNoZXNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6Zm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgaWYgKG1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXModXBTdHJlYW0sICZzd1BhdGNoZXMpICE9IE9LKSByZXR1cm47CisgICAgQUxPR1ZfSUYoIXN3UGF0Y2hlcy5lbXB0eSgpLCAiJXMgZm91bmQgJXp1IGRvd25zdHJlYW0gcGF0Y2hlcyBmb3Igc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzd1BhdGNoZXMuc2l6ZSgpLCB1cFN0cmVhbSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzd1BhdGNoIDogc3dQYXRjaGVzKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBkb3duU3RyZWFtID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHN3UGF0Y2guZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSk7CisgICAgICAgIGlmIChkb3duU3RyZWFtICE9IE5VTEwgJiYgKHVzZVRocmVhZCA9PSBudWxscHRyIHx8IHVzZVRocmVhZChkb3duU3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGRvd25TdHJlYW0tPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTIwMCwyMyArMTMzNywzOSBAQAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwKICAgICB9OwogCi0gICAgLy8gbXVsdGl1c2VyIGZyaWVuZGx5IGFwcCBJRCBjaGVjayBmb3IgcmVxdWVzdHMgY29taW5nIGZyb20gYXVkaW9zZXJ2ZXIKLSAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoY2FsbGluZ1VpZCkgPT0gQUlEX0FVRElPU0VSVkVSKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gZmlsdGVyIGlmIGF1ZGlvc2VydmVyLgogICAgIH0KIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7CiAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICBBdWRpb1BhcmFtZXRlciByZWplY3RlZFBhcmFtOwogICAgIGZvciAoYXV0byYga2V5IDoga1Jlc2VydmVkUGFyYW1ldGVycykgewogICAgICAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IGZpbHRlcmluZyBrZXkgJXMgdmFsdWUgJXMgZnJvbSB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCksIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKICAgICAgICAgfQogICAgIH0KKyAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMocGFyYW0uc2l6ZSgpICsgcmVqZWN0ZWRQYXJhbS5zaXplKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCByZWplY3RlZFBhcmFtLnRvU3RyaW5nKCksIGNhbGxpbmdVaWQpOwogICAgIGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6bG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKSB7CisgICAgYXV0byBwcmVmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIlVJRCAlNWQiLCBjYWxsaW5nVWlkKTsKKyAgICBhdXRvIHN1ZmZpeCA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWNlaXZlZDogJXMiLCBvcmlnaW5hbEtWUFNpemUsIG9yaWdpbmFsS1ZQcy5jX3N0cigpKTsKKyAgICBpZiAocmVqZWN0ZWRLVlBTaXplICE9IDApIHsKKyAgICAgICAgYXV0byBlcnJvciA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWplY3RlZDogJXMiLCByZWplY3RlZEtWUFNpemUsIHJlamVjdGVkS1ZQcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1coIiVzOiAlcywgJXMsICVzIiwgX19mdW5jX18sIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgICAgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZy5sb2coIiVzLCAlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8mIGxvZ2dlciA9IChpc1NlcnZpY2VVaWQoY2FsbGluZ1VpZCkgPyBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nIDogbUFwcFNldFBhcmFtZXRlckxvZyk7CisgICAgICAgIGxvZ2dlci5sb2coIiVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCBjYWxsaW5nIHVpZCAlZCIsCkBAIC0xMjk2LDcgKzE0NDksOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CkBAIC0xNjM2LDcgKzE3OTEsNyBAQAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTE3NTEsNiArMTkwNiw3IEBACiAKICAgICBvdXRwdXQuY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CiAgICAgb3V0cHV0LmJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKICAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwpAQCAtMTg1NCw2ICsyMDEwLDEwIEBACiAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIE1TRCBtb2R1bGUgaXMgaW5zZXJ0ZWQgYmVmb3JlIGhhcmR3YXJlIG1vZHVsZXMgaW4gb3JkZXIgdG8gbWl4IGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxBdWRpb0h3RGV2aWNlOjpGbGFncz4oZmxhZ3MgfCBBdWRpb0h3RGV2aWNlOjpBSFdEX0lTX0lOU0VSVCk7CisgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpIG5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX01PRFVMRSk7CiAgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwpAQCAtMTg4NSw3ICsyMDQ1LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTkzMCw2ICsyMDkwLDI4IEBACiAgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoX19mdW5jX18pOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKIGF1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTc1LDcgKzIxNTcsMTAgQEAKICAgICAgICAgaWYgKHNlc3Npb25zICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgdmFsdWUpOwotICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDIxLDcgKzIyMDYsMTAgQEAKICAgICAgICAgQUxPR1YoInNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sIGZvdW5kIElEICVkIGZvciBzZXNzaW9uICVkIiwgc3luY0lkLCBzZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHN5bmNJZCk7Ci0gICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgIH0KIH0KIApAQCAtMjExMSw2ICsyMjk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9CiAgICAgfQpAQCAtMjIwOSw2ICsyMzk4LDggQEAKICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkICE9IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocGxheWJhY2tUaHJlYWQpOworCiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUikgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIyNDAsMTIgKzI0MzEsMTQgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShvdXRwdXQpOwogICAgICAgICAgICAgQUxPR0QoImNsb3NpbmcgbW1hcFRocmVhZCAlcCIsIG1tYXBUaHJlYWQuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CiAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOworICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1DbG9zZWQob3V0cHV0KTsKICAgICB9CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KQEAgLTIyNzQsNyArMjQ2Nyw3IEBACiAgICAgZGVsZXRlIG91dDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICB0aHJlYWQtPmV4aXQoKTsKQEAgLTIzMjYsNyArMjUxOSw4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2woCisgICAgICAgICAgICBtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzLCBBVURJT19ERVZJQ0VfTk9ORSwgU3RyaW5nOHt9KTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCkBAIC0yMzQyLDcgKzI1MzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcykKIHsKICAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOwogICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKQEAgLTIzNTAsNiArMjU0Niw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIFNvbWUgZmxhZ3MgYXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRlJBTUVXT1JLX0ZMQUdTKTsKKwogICAgIC8vIEF1ZGlvIFBvbGljeSBjYW4gcmVxdWVzdCBhIHNwZWNpZmljIGhhbmRsZSBmb3IgaGFyZHdhcmUgaG90d29yZC4KICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIG5vdCB0byByZS1vcGVuIGFuIGFscmVhZHkgb3BlbmVkIGlucHV0LgogICAgIC8vIEl0IGlzIHRvIHVzZSBhIHByZS1hc3NpZ25lZCBJL08gaGFuZGxlLgpAQCAtMjM2OCw3ICsyNTY3LDggQEAKICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiBpblN0cmVhbTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgogICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLAogICAgICAgICAgICAgaW5TdHJlYW0uZ2V0KCksCkBAIC0yMzkxLDcgKzI1OTEsOCBAQAogICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0uY2xlYXIoKTsKICAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwgJmluU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKQEAgLTI0MDcsNTUgKzI2MDgsNiBAQAogICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfSBlbHNlIHsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlLXVzZSBtb3N0IHJlY2VudGx5IHVzZWQgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBpbnB1dCBmb3IgZHVtcHN5cywKLSAgICAgICAgICAgIC8vIG9yIChyZS0pY3JlYXRlIGlmIGN1cnJlbnQgUGlwZSBpcyBpZGxlIGFuZCBkb2VzIG5vdCBtYXRjaCB0aGUgbmV3IGZvcm1hdAotICAgICAgICAgICAgc3A8TkJBSU9fU2luaz4gdGVlU2luazsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05PLCAgICAvLyBkb24ndCBjb3B5IGlucHV0Ci0gICAgICAgICAgICAgICAgVEVFX1NJTktfTkVXLCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYSBuZXcgcGlwZQotICAgICAgICAgICAgICAgIFRFRV9TSU5LX09MRCwgICAvLyBjb3B5IGlucHV0IHVzaW5nIGFuIGV4aXN0aW5nIHBpcGUKLSAgICAgICAgICAgIH0ga2luZDsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzayksIGhhbGNvbmZpZy5mb3JtYXQpOwotICAgICAgICAgICAgaWYgKCFtVGVlU2lua0lucHV0RW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luay0+Z2V0U3Ryb25nQ291bnQoKSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfT0xEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX05FVzogewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua0lucHV0RnJhbWVzLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtUmVjb3JkVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICAgICAgdGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19PTEQ6Ci0gICAgICAgICAgICAgICAgdGVlU2luayA9IG1SZWNvcmRUZWVTaW5rOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19OTzoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICAgICAgLy8gUmVjb3JkVGhyZWFkIHJlcXVpcmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBkZXZpY2UgaW5kaWNhdGlvbiB0byBmb3J3YXJkIHRvIGF1ZGlvCiAgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCkBAIC0yNDY1LDkgKzI2MTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0RGV2aWNlX2woKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZCgqaW5wdXQsIHRocmVhZCk7CiAgICAgICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwgdGhyZWFkLmdldCgpKTsKQEAgLTI0OTYsNiArMjY0NSw4IEBACiAgICAgICAgIGlmIChyZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSAlZCIsIGlucHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocmVjb3JkVGhyZWFkKTsKKwogICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBlZmZlY3QgY2hhaW5zLCBpdCBtZWFucyB0aGF0IGEgY2xpZW50IHN0aWxsIGhvbGRzIGEgaGFuZGxlCiAgICAgICAgICAgICAvLyBvbiBhdCBsZWFzdCBvbmUgZWZmZWN0LiBXZSBtdXN0IGVpdGhlciBtb3ZlIHRoZSBjaGFpbiB0byBhbiBleGlzdGluZyB0aHJlYWQgd2l0aCB0aGUKICAgICAgICAgICAgIC8vIHNhbWUgc2Vzc2lvbiBJRCBvciBwdXQgaXQgYXNpZGUgaW4gY2FzZSBhIG5ldyByZWNvcmQgdGhyZWFkIGlzIG9wZW5lZCBmb3IgYQpAQCAtMjUzOCw2ICsyNjg5LDcgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwpAQCAtMjU2Nyw3ICsyNzE5LDcgQEAKICAgICBkZWxldGUgaW47CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZUlucHV0SW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCkKIHsKICAgICBtUmVjb3JkVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7CkBAIC0yNjA1LDcgKzI3NTcsOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7Ci0gICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChwaWQgIT0gLTEgJiYgaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7IC8vIGNoZWNrIG11c3QgbWF0Y2ggcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkKICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgIH0KIApAQCAtMjYzOSw3ICsyNzkyLDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7Ci0gICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChwaWQgIT0gLTEgJiYgaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7IC8vIGNoZWNrIG11c3QgbWF0Y2ggYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkKICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgIH0KICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwpAQCAtMjY1Niw5ICsyODEwLDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gSWYgdGhlIGNhbGxlciBpcyBtZWRpYXNlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKKyAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIGF1ZGlvc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAogICAgIC8vIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3Mgbm90IGluIG5vdGlmaWNhdGlvbiBjbGllbnRzIGFuZCB3ZSBpZ25vcmUgdGhlIHdhcm5pbmcuCi0gICAgQUxPR1dfSUYoY2FsbGVyICE9IGdldHBpZF9jYWNoZWQsICJzZXNzaW9uIGlkICVkIG5vdCBmb3VuZCBmb3IgcGlkICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dXX0lGKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCksCisgICAgICAgICAgICAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OmlzU2Vzc2lvbkFjcXVpcmVkX2woYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbikKQEAgLTI3MzMsNiArMjg4OCwxNyBAQAogICAgIHJldHVybjsKIH0KIAorLy8gZHVtcFRvVGhyZWFkTG9nX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpCit7CisgICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZzsKKyAgICBjb25zdCBpbnQgZmQgPSBmZFRvU3RyaW5nLmZkKCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgdGhyZWFkLT5kdW1wKGZkLCB7fSAvKiBhcmdzICovKTsKKyAgICAgICAgbVRocmVhZExvZy5sb2dzKC0xIC8qIHRpbWUgKi8sIGZkVG9TdHJpbmcuZ2V0U3RyaW5nQW5kQ2xvc2UoKSk7CisgICAgfQorfQorCiAvLyBjaGVja1RocmVhZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZSAqQXVkaW9GbGluZ2VyOjpjaGVja1RocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAogewpAQCAtMjkzOCwxNiArMzEwNCw3NCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0CiB7CisgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcFR5cGVVdWlkID09IE5VTEwgfHwgZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOwotICAgIH0gZWxzZSB7CisKKyAgICBpZiAoIW1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9Ci19CiAKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBVdWlkKSkgeworICAgICAgICAvLyBJZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvciBmcm9tIHRoYXQuCisgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQocFR5cGVVdWlkKSkgeworICAgICAgICAvLyBJZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbnN0ZWFkLgorCisgICAgICAgIC8vIFVzZSBhIHRlbXBvcmFyeSBkZXNjcmlwdG9yIHRvIGF2b2lkIG1vZGlmeWluZyB8ZGVzY3JpcHRvcnwgaW4gdGhlIGZhaWx1cmUgY2FzZS4KKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgICAgICBkZXNjLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCisKKyAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7CisgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+cXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCkgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIHF1ZXJ5TnVtYmVyRWZmZWN0cyIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoaSwgJmRlc2MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBnZXREZXNjcmlwdG9yIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MudHlwZSwgcFR5cGVVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICpkZXNjcmlwdG9yID0gZGVzYzsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gcHJlZmVycmVkIGZsYWcgb3IgdGhpcyBkZXNjcmlwdG9yIG1hdGNoZXMgdGhlIHByZWZlcnJlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcsIHN1Y2Nlc3MhIElmIHRoaXMgZGVzY3JpcHRvciBkb2Vzbid0IG1hdGNoIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlIGEgYmV0dGVyIG1hdGNoaW5nIHZlcnNpb24gb2YgdGhpcworICAgICAgICAgICAgICAgIC8vIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZS4gTm90ZSB0aGF0IHRoaXMgbWVhbnMgaWYgbm8gZWZmZWN0IHdpdGggYQorICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgZmxhZyBpcyBmb3VuZCwgdGhlIGRlc2NyaXB0b3IgcmV0dXJuZWQgd2lsbCBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIGxhc3QgZWZmZWN0IHRoYXQgYXQgbGVhc3QgaGFkIGEgbWF0Y2hpbmcgdHlwZSB1dWlkIChpZiBhbnkpLgorICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRUeXBlRmxhZyA9PSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IHByZWZlcnJlZFR5cGVGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWZmZWN0IG5vdCBmb3VuZCBieSB0eXBlLiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiZ2V0RWZmZWN0RGVzY3JpcHRvcigpOiBFaXRoZXIgdXVpZCBvciB0eXBlIHV1aWQgbXVzdCBiZSBub24tbnVsbCBVVUlEcy4iKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KIAogc3A8SUVmZmVjdD4gQXVkaW9GbGluZ2VyOjpjcmVhdGVFZmZlY3QoCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLApAQCAtMjk2Niw3ICszMTkwLDcgQEAKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CiAKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAocGlkID09IC0xIHx8ICFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBBTE9HV19JRihwaWQgIT0gLTEgJiYgcGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLApAQCAtMjk4OSw4ICszMjEzLDggQEAKICAgICB9CiAKICAgICAvLyBTZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIHJlc2VydmVkIGZvciBvdXRwdXQgc3RhZ2UgZWZmZWN0cwotICAgIC8vIHRoYXQgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciAocnVubmluZyBpbiBzYW1lIHByb2Nlc3MpCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSAmJiBnZXRwaWRfY2FjaGVkICE9IHBpZCkgeworICAgIC8vIHRoYXQgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgorICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpAQCAtMzAwMSw2NSArMzIyNSwxNiBAQAogICAgIH0KIAogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgICAgICBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dXVpZCkpIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJmRlc2MpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0R2V0RGVzY3JpcHRvciIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbiBlZmZlY3QgZmFjdG9yeQotICAgICAgICAgICAgaWYgKEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dHlwZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgbm8gZWZmZWN0IHR5cGUiKTsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkOwotICAgICAgICAgICAgZC5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoaSwgJmRlc2MpOwotICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeUVmZmVjdCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCAmcERlc2MtPnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuIElmIHRoZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIDAgYW5kIHRoZSBlZmZlY3QgaXMgbm90IGF1eGlsaWFyeSwgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAvLyBhbiBhdXhpbGlhcnkgdmVyc2lvbiBvZiB0aGlzIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciBzYW1lIGVmZmVjdCB0eXBlLCBjaG9zZSBhdXhpbGlhcnkgdmVyc2lvbiBvdmVyIGluc2VydCB2ZXJzaW9uIGlmCi0gICAgICAgICAgICAvLyBjb25uZWN0IHRvIG91dHB1dCBtaXggKENvbXBsaWFuY2UgdG8gT3BlblNMIEVTKQotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAgICAgICAgKGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IGQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIEdldCB0aGUgZnVsbCBlZmZlY3QgZGVzY3JpcHRvciBmcm9tIHRoZSB1dWlkL3R5cGUuCisgICAgICAgIC8vIElmIHRoZSBzZXNzaW9uIGlzIHRoZSBvdXRwdXQgbWl4LCBwcmVmZXIgYW4gYXV4aWxpYXJ5IGVmZmVjdCwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIG5vIHByZWZlcmVuY2UuCisgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGUgPSAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgOiBFRkZFQ1RfRkxBR19UWVBFX01BU0spOworICAgICAgICBsU3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZwRGVzYy0+dHlwZSwgcHJlZmVycmVkVHlwZSwgJmRlc2MpOworICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIGdldEVmZmVjdERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgIH0KLSAgICB7CiAKICAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgpAQCAtMzEwMiw5ICszMjc3LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvblR5cGUgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uVHlwZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB3aXRoIHNhbWUgZWZmZWN0IHNlc3Npb24gaXMgcHJlZmVyYWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25UeXBlICYgVGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0zMzc0LDEzNiArMzU1Myw2IEBACiB9CiAKIAotc3RydWN0IEVudHJ5IHsKLSNkZWZpbmUgVEVFX01BWF9GSUxFTkFNRSAzMiAvLyAlWSVtJWQlSCVNJVNfJWQud2F2ID0gNCsyKzIrMisyKzIrMSsxKzQrMSA9IDIxCi0gICAgY2hhciBtRmlsZU5hbWVbVEVFX01BWF9GSUxFTkFNRV07Ci19OwotCi1pbnQgY29tcGFyRW50cnkoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICAgIHJldHVybiBzdHJjbXAoKChjb25zdCBFbnRyeSAqKSBwMSktPm1GaWxlTmFtZSwgKChjb25zdCBFbnRyeSAqKSBwMiktPm1GaWxlTmFtZSk7Ci19Ci0KLSNpZmRlZiBURUVfU0lOSwotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCkKLXsKLSAgICBOQkFJT19Tb3VyY2UgKnRlZVNvdXJjZSA9IHNvdXJjZS5nZXQoKTsKLSAgICBpZiAodGVlU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gLndhdiByb3RhdGlvbgotICAgICAgICAvLyBUaGVyZSBpcyBhIGJlbmlnbiByYWNlIGNvbmRpdGlvbiBpZiAyIHRocmVhZHMgY2FsbCB0aGlzIHNpbXVsdGFuZW91c2x5LgotICAgICAgICAvLyBUaGV5IHdvdWxkIGJvdGggdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgYnV0IHRoZSByZXN1bHQgd291bGQgc2ltcGx5IGJlCi0gICAgICAgIC8vIGZhaWx1cmVzIGF0IHVubGluaygpIHdoaWNoIGFyZSBpZ25vcmVkLiAgSXQncyBhbHNvIHVubGlrZWx5IHNpbmNlCi0gICAgICAgIC8vIG5vcm1hbGx5IGR1bXBzeXMgaXMgb25seSBkb25lIGJ5IGJ1Z3JlcG9ydCBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGNoYXIgdGVlUGF0aFtQQVRIX01BWF0gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7Ci0gICAgICAgIHNpemVfdCB0ZWVQYXRoTGVuID0gc3RybGVuKHRlZVBhdGgpOwotICAgICAgICBESVIgKmRpciA9IG9wZW5kaXIodGVlUGF0aCk7Ci0gICAgICAgIHRlZVBhdGhbdGVlUGF0aExlbisrXSA9ICcvJzsKLSAgICAgICAgaWYgKGRpciAhPSBOVUxMKSB7Ci0jZGVmaW5lIFRFRV9NQVhfU09SVCAyMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBzb3J0Ci0jZGVmaW5lIFRFRV9NQVhfS0VFUCAxMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwCi0gICAgICAgICAgICBzdHJ1Y3QgRW50cnkgZW50cmllc1tURUVfTUFYX1NPUlRdOwotICAgICAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGVudHJ5Q291bnQgPCBURUVfTUFYX1NPUlQpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IDA7IC8vIGNsZWFyIGVycm5vIGJlZm9yZSByZWFkZGlyKCkgdG8gdHJhY2sgcG90ZW50aWFsIGVycm9ycy4KLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICJ0ZWUgcmVhZGRpcigpIGZhaWx1cmUgJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbiAud2F2IGZpbGUgZW50cmllcwotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZyZXN1bHQtPmRfbmFtZVtuYW1lTGVuIC0gNF0sICIud2F2IikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHkoZW50cmllc1tlbnRyeUNvdW50KytdLm1GaWxlTmFtZSwgcmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKHZvaWQpIGNsb3NlZGlyKGRpcik7Ci0gICAgICAgICAgICBpZiAoZW50cnlDb3VudCA+IFRFRV9NQVhfS0VFUCkgewotICAgICAgICAgICAgICAgIHFzb3J0KGVudHJpZXMsIGVudHJ5Q291bnQsIHNpemVvZihFbnRyeSksIGNvbXBhckVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q291bnQgLSBURUVfTUFYX0tFRVA7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnRlZVBhdGhbdGVlUGF0aExlbl0sIGVudHJpZXNbaV0ubUZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gcm90YXRlIHRlZXMgaW4gJS4qczogJXNcbiIsIChpbnQpIHRlZVBhdGhMZW4sIHRlZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNoYXIgdGVlVGltZVsxNl07Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgICAgICAgc3RydWN0IHRtIHRtOwotICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOwotICAgICAgICBzdHJmdGltZSh0ZWVUaW1lLCBzaXplb2YodGVlVGltZSksICIlWSVtJWQlSCVNJVMiLCAmdG0pOwotICAgICAgICBzbnByaW50ZigmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgc2l6ZW9mKHRlZVBhdGgpIC0gdGVlUGF0aExlbiwgIiVzXyVkXyVjLndhdiIsIHRlZVRpbWUsIGlkLAotICAgICAgICAgICAgICAgIHN1ZmZpeCk7Ci0gICAgICAgIC8vIGlmIDIgZHVtcHN5cyBhcmUgZG9uZSB3aXRoaW4gMSBzZWNvbmQsIGFuZCByb3RhdGlvbiBkaWRuJ3Qgd29yaywgdGhlbiBkaXNjYXJkIDJuZAotICAgICAgICBpbnQgdGVlRmQgPSBvcGVuKHRlZVBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTk9GT0xMT1csIFNfSVJVU1IgfCBTX0lXVVNSKTsKLSAgICAgICAgaWYgKHRlZUZkID49IDApIHsKLSAgICAgICAgICAgIC8vIEZJWE1FIHVzZSBsaWJzbmRmaWxlCi0gICAgICAgICAgICBjaGFyIHdhdkhlYWRlcls0NF07Ci0gICAgICAgICAgICBtZW1jcHkod2F2SGVhZGVyLAotICAgICAgICAgICAgICAgICJSSUZGXDBcMFwwXDBXQVZFZm10IFwyMFwwXDBcMFwxXDBcMlwwXDEwNFwyNTRcMFwwXDBcMFwwXDBcNFwwXDIwXDBkYXRhXDBcMFwwXDAiLAotICAgICAgICAgICAgICAgIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSB0ZWVTb3VyY2UtPmZvcm1hdCgpOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOwotICAgICAgICAgICAgd2F2SGVhZGVyWzIyXSA9IGNoYW5uZWxDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjRdID0gc2FtcGxlUmF0ZTsgICAgICAgICAvLyBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgd2F2SGVhZGVyWzI1XSA9IHNhbXBsZVJhdGUgPj4gODsKLSAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBmcmFtZVNpemU7ICAgICAgICAgIC8vIGJsb2NrIGFsaWdubWVudAotICAgICAgICAgICAgd2F2SGVhZGVyWzMzXSA9IGZyYW1lU2l6ZSA+PiA4OwotICAgICAgICAgICAgd3JpdGUodGVlRmQsIHdhdkhlYWRlciwgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKLSNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0ICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBwZXIgSS9PIG9wZXJhdGlvbgotICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKFRFRV9TSU5LX1JFQUQgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IFRFRV9TSU5LX1JFQUQ7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSB0ZWVTb3VyY2UtPnJlYWQoYnVmZmVyLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgYm9vbCB3YXNGaXJzdFJlYWQgPSBmaXJzdFJlYWQ7Ci0gICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPT0gKHNzaXplX3QpIE9WRVJSVU4gJiYgd2FzRmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYWN0dWFsIDw9IChzc2l6ZV90KWNvdW50KTsKLSAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgIHRvdGFsICs9IGFjdHVhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogZnJhbWVTaXplIC0gODsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQwLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogZnJhbWVTaXplOwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgY2xvc2UodGVlRmQpOwotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgY3JlYXRlIGZpbGUgd2l0aCB0ZW1wb3JhcnkgbmFtZSBhbmQgdGhlbiByZW5hbWUgdG8gZmluYWwgaWYgbm9uLWVtcHR5LgotICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA5NjNhODdkLi4xNDQxZTE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0yMSwxMyArMjEsMTkgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvb3MvQm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CkBAIC02Miw3ICs2OCwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0xpbmVhck1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9GZFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU2ltcGxlTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KIAogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCkBAIC03MSw2ICs4MCw3IEBACiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKICNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgogI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTc4LDYgKzg4LDggQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvbi5oPgorCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvUmVjb3JkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEzMSw2ICsxNDMsMTAgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3Q7CiAKKyAgICAvLyBCYWxhbmNlIHZhbHVlIG11c3QgYmUgd2l0aGluIC0xLmYgKGxlZnQgb25seSkgdG8gMS5mIChyaWdodCBvbmx5KSBpbmNsdXNpdmUuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CkBAIC0yMDIsNiArMjE4LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKQEAgLTI3Niw2ICsyOTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIHN0YXRpYyBpbnQgb25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKTsKKyAgICBzdGF0aWMgdm9pZCBvbkV4dGVybmFsVmlicmF0aW9uU3RvcChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbik7CiBwcml2YXRlOgogICAgIC8vIEZJWE1FIFRoZSA0MDAgaXMgdGVtcG9yYXJpbHkgdG9vIGhpZ2ggdW50aWwgYSBsZWFrIG9mIHdyaXRlcnMgaW4gbWVkaWEubG9nIGlzIGZpeGVkLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MDAgKiAxMDI0OwpAQCAtMzU3LDE2ICszNzgsMTcgQEAKICAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewogICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBIYXB0aWMgY2hhbm5lbCBtYXNrIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CisgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBtYXhDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgotICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfcG9zaXRpb25fbWFza19pc19vdXRfY2Fub25pY2FsKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgogICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CkBAIC00MTYsNiArNDM4LDExIEBACiAgICAgdm9pZCBkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgU2ltcGxlTG9nIG1UaHJlYWRMb2d7MTZ9OyAvLyAxNiBUaHJlYWQgaGlzdG9yeSBsaW1pdAorCisgICAgY2xhc3MgVGhyZWFkQmFzZTsKKyAgICB2b2lkIGR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpOworCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtNTAyLDYgKzUyOSw5IEBACiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47CiAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbjsKKyAgICBzdHJ1Y3QgVGVlUGF0Y2g7CisgICAgdXNpbmcgVGVlUGF0Y2hlcyA9IHN0ZDo6dmVjdG9yPFRlZVBhdGNoPjsKKwogCiAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgc3RyZWFtX3R5cGVfdCgpCkBAIC01NDAsNiArNTcwLDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CkBAIC01NjQsNiArNTk1LDEwIEBACiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gbVJlY29yZFRyYWNrOwogCkBAIC02MDUsNyArNjQwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBvdXRwdXREZXZpY2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gb3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLApAQCAtNjc1LDYgKzcxMiw5IEBACiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogCiAgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLApAQCAtNjkxLDYgKzczMSwxMSBAQAogICAgICAgICAgICAgYXVkaW9Id0RldihkZXYpLCBzdHJlYW0oaW4pLCBmbGFncyhmbGFncykge30KICAgICB9OwogCisgICAgc3RydWN0IFRlZVBhdGNoIHsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gcGF0Y2hSZWNvcmQ7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBwYXRjaFRyYWNrOworICAgIH07CisKICAgICAvLyBmb3IgbUF1ZGlvU2Vzc2lvblJlZnMgb25seQogICAgIHN0cnVjdCBBdWRpb1Nlc3Npb25SZWYgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25pZCwgcGlkX3QgcGlkKSA6CkBAIC03NTIsNiArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGJlbG93IGFyZSBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlID0gMC5mOwogICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB2YXJpYWJsZXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CkBAIC03NjksNiArODE1LDcgQEAKICAgICAgICAgICAgICAgICBWZWN0b3I8QXVkaW9TZXNzaW9uUmVmKj4gbUF1ZGlvU2Vzc2lvblJlZnM7CiAKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWVfbCgpIGNvbnN0OworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgIGdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGVfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGVfbChjb25zdCBjaGFyICpuYW1lKTsKIApAQCAtNzkxLDQ0ICs4MzgsMTkgQEAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgdm9pZCAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQotICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiBtUmVjb3JkVGVlU291cmNlOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKTsKIAogcHVibGljOgotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyB0ZWUgc2luaywgaWYgZW5hYmxlZCBieSBwcm9wZXJ0eSwgYWxsb3dzIGR1bXBzeXMgdG8gd3JpdGUgbW9zdCByZWNlbnQgYXVkaW8gdG8gLndhdiBmaWxlCi0gICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KTsKLQotICAgIC8vIHdoZXRoZXIgdGVlIHNpbmsgaXMgZW5hYmxlZCBieSBwcm9wZXJ0eQotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rSW5wdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rT3V0cHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua1RyYWNrRW5hYmxlZDsKLQotICAgIC8vIHJ1bnRpbWUgY29uZmlndXJlZCBzaXplIG9mIGVhY2ggdGVlIHNpbmsgcGlwZSwgaW4gZnJhbWVzCi0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua0lucHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtPdXRwdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua1RyYWNrRnJhbWVzOwotCi0gICAgLy8gY29tcGlsZS10aW1lIGRlZmF1bHQgc2l6ZSBvZiB0ZWUgc2luayBwaXBlcywgaW4gZnJhbWVzCi0gICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSNlbmRpZgotCiAgICAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIHZhcmlhYmxlcyBhdG9taWNhbGx5IHdpdGhvdXQgbUxvY2ssCiAgICAgLy8gdGhvdWdoIHRoZSB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCBtTG9jay4KICAgICBib29sICAgIGlzTG93UmFtRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTG93UmFtRGV2aWNlOyB9CkBAIC04NDMsMTAgKzg2NSwxNSBAQAogCiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKIAotICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFBhdGNoUGFuZWwgbVBhdGNoUGFuZWw7CiAgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1FZmZlY3RzRmFjdG9yeUhhbDsKIAotICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCmluZGV4IGViODI2YzYuLmQ0Mjk5YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMzUsNiArMzUsOSBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGlzIGlzbid0IGEgdGVybWluYWwgbW9kdWxlLCBhbmQgc29mdHdhcmUgcGF0Y2hlcworICAgICAgICAvLyBhcmUgdXNlZCB0byB0cmFuc3BvcnQgYXVkaW8gZGF0YSBmdXJ0aGVyLgorICAgICAgICBBSFdEX0lTX0lOU0VSVCAgICAgICAgICAgICAgPSAweDQsCiAgICAgfTsKIAogICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKQEAgLTU1LDYgKzU4LDEwIEBACiAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgfQogCisgICAgYm9vbCBpc0luc2VydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0lTX0lOU0VSVCkpOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggMWQ0YjNmZS4uYTYwYTVmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC02Niw4ICs2Niw5IEBACiAgICAgLy8gTWFpbnRhaW4gYSA2NC1iaXQgcmVuZGVyIHBvc2l0aW9uIHVzaW5nIHRoZSAzMi1iaXQgcmVzdWx0IGZyb20gdGhlIEhBTC4KICAgICAvLyBUaGlzIGRlbHRhIGNhbGN1bGF0aW9uIHJlbGllcyBvbiB0aGUgYXJpdGhtZXRpYyBvdmVyZmxvdyBiZWhhdmlvcgogICAgIC8vIG9mIGludGVnZXJzLiBGb3IgZXhhbXBsZSAoMTAwIC0gMHhGRkZGRkZGMCkgPSAxMTYuCi0gICAgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOwotICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbiA9IChpbnQzMl90KShoYWxQb3NpdGlvbiAtIHRydW5jYXRlZFBvc2l0aW9uKTsKKyAgICBjb25zdCB1aW50MzJfdCB0cnVuY2F0ZWRQb3NpdGlvbiA9ICh1aW50MzJfdCltUmVuZGVyUG9zaXRpb247CisgICAgaW50MzJfdCBkZWx0YUhhbFBvc2l0aW9uOyAvLyBpbml0aWFsaXphdGlvbiBub3QgbmVlZGVkLCBvdmVyd2l0dGVuIGJ5IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coKQorICAgICh2b2lkKSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KGhhbFBvc2l0aW9uLCB0cnVuY2F0ZWRQb3NpdGlvbiwgJmRlbHRhSGFsUG9zaXRpb24pOwogICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgewogICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggYjNmNWVmZC4uODQ1NWU1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMzEsOSArMzEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDksOCArMzA5LDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgogICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCiAgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KLSAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKLSAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID8gMAorICAgICAgICAgICAgICAgICAgICA6IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBzdGQ6Om1pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKQEAgLTQ4MCw3ICs0ODAsMTIgQEAKICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbnB1dCBvbnRvIG91dHB1dAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwogICAgICAgICBpZiAoY2hhaW4uZ2V0KCkgIT0gbnVsbHB0ciAmJiBjaGFpbi0+YWN0aXZlVHJhY2tDbnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgLy8gc2ltaWxhciBoYW5kbGluZyB3aXRoIGRhdGFfYnlwYXNzIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMTMxLDcgKzExMzYsOCBAQAogICAgIC8vIGlmIGNvbnRyb2xsZXIgZmxhZyBpcyBzZXQgKE5vdGUgdGhhdCBjb250cm9sbGVyID09IFRSVUUgPT4gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgc2V0KQogICAgIGlmIChpc1Byb2Nlc3NFbmFibGVkKCkgJiYKICAgICAgICAgICAgICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgfHwKLSAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EKSkgeworICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIHx8CisgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9NT05JVE9SKSkgewogICAgICAgICB1aW50MzJfdCB2b2x1bWVbMl07CiAgICAgICAgIHVpbnQzMl90ICpwVm9sdW1lID0gTlVMTDsKICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZih2b2x1bWUpOwpAQCAtMTMyNiw2ICsxMzMyLDcgQEAKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FOiBzLmFwcGVuZCgibm9uZSIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOiBzLmFwcGVuZCgiaW1wbGVtZW50cyBjb250cm9sIik7IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIGluZGljYXRpb24iKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjogcy5hcHBlbmQoIm1vbml0b3JzIHZvbHVtZSIpOyBicmVhazsKICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKICAgICB9CiAgICAgcy5hcHBlbmQoIiwgIik7CkBAIC0xODU5LDcgKzE4NjYsNyBAQAogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCiAgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKQEAgLTIyNzIsNyArMjI3OSw3IEBACiAgICAgfQogICAgIC8vIHRoZW4gaW5kaWNhdGUgdm9sdW1lIHRvIGFsbCBvdGhlciBlZmZlY3RzIGluIGNoYWluLgogICAgIC8vIFBhc3MgYWx0ZXJlZCB2b2x1bWUgdG8gZWZmZWN0cyBiZWZvcmUgdm9sdW1lIGNvbnRyb2xsZXIKLSAgICAvLyBhbmQgcmVxdWVzdGVkIHZvbHVtZSB0byBlZmZlY3RzIGFmdGVyIGNvbnRyb2xsZXIKKyAgICAvLyBhbmQgcmVxdWVzdGVkIHZvbHVtZSB0byBlZmZlY3RzIGFmdGVyIGNvbnRyb2xsZXIgb3Igd2l0aCB2b2x1bWUgbW9uaXRvciBmbGFnCiAgICAgdWludDMyX3QgbFZvbCA9IG5ld0xlZnQ7CiAgICAgdWludDMyX3QgclZvbCA9IG5ld1JpZ2h0OwogCkBAIC0yMjg1LDcgKzIyOTIsMTIgQEAKICAgICAgICAgICAgIGxWb2wgPSAqbGVmdDsKICAgICAgICAgICAgIHJWb2wgPSAqcmlnaHQ7CiAgICAgICAgIH0KLSAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZSgmbFZvbCwgJnJWb2wsIGZhbHNlKTsKKyAgICAgICAgLy8gUGFzcyByZXF1ZXN0ZWQgdm9sdW1lIGRpcmVjdGx5IGlmIHRoaXMgaXMgdm9sdW1lIG1vbml0b3IgbW9kdWxlCisgICAgICAgIGlmIChtRWZmZWN0c1tpXS0+aXNWb2x1bWVNb25pdG9yKCkpIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAgICAgKmxlZnQgPSBuZXdMZWZ0OwogICAgICpyaWdodCA9IG5ld1JpZ2h0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggMTVhMjZlYS4uNThjZTM1MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xMzQsNiArMTM0LDkgQEAKICAgICBib29sICAgICAgICAgICAgIGlzVm9sdW1lQ29udHJvbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDsgfQorICAgIGJvb2wgICAgICAgICAgICAgaXNWb2x1bWVNb25pdG9yKCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9NT05JVE9SOyB9CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKICAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CiAgICAgdm9pZCAgICAgICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAppbmRleCBkMDYzNzcyLi5kZDg0YmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KQEAgLTE2MSw3ICsxNjIsMjEgQEAKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7Ci0gICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gY3VycmVudC0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKworICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgY2F1c2UgYW55IGlzc3VlcyBpZiB3ZSBqdXN0IGdldCBhIHNtYWxsIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgewogICAgICAgICBBTE9HX0FTU0VSVChtSW5wdXRTb3VyY2UgIT0gTlVMTCk7CkBAIC0xNzYsNiArMTkxLDcgQEAKICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQgPSBtVG90YWxOYXRpdmVGcmFtZXNSZWFkOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzUmVhZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRFcnJvcnMrKzsKICAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSAwOwpAQCAtMTkzLDExICsyMDksMTggQEAKICAgICAgICAgfQogICAgICAgICBpZiAobVJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKICAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1QaXBlU2luay0+d3JpdGUobVJlYWRCdWZmZXIsIG1SZWFkQnVmZmVyU3RhdGUpOwotICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgotICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCi0gICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCiAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBjdXJyZW50LT5tQ2JsazsKLSAgICAgICAgICAgIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIGZhc3QgdHJhY2sgaXMgYSBwYXRjaCByZWNvcmQsIHVwZGF0ZSB0aGUgY2JsayBieQorICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVsZWFzZUJ1ZmZlcigpLgorICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQocGF0Y2hCdWZmZXIucmF3LCBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlYWRCdWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgZnJhbWVzV3JpdHRlbiAqIG1Gb3JtYXQubUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgorICAgICAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAorICAgICAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShmcmFtZXNXcml0dGVuICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgICAgICAgICAgICAgY2Jsay0+bVNlcnZlciArPSBmcmFtZXNXcml0dGVuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKaW5kZXggOWJjYTJkNC4uZDI4NzIzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCkBAIC0zNyw2ICszOCwxMCBAQAogICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgY2FwdHVyZSBidWZmZXIKICAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOyAgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCiAKKyAgICBhdWRpb19mb3JtYXRfdCAgbUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IG51bGxwdHI7ICAgLy8gYSByZWZlcmVuY2UgdG8gYSBwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIGluIGZhc3QgbW9kZQorCiAgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKICAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFsc28gcHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFuZCBjYW4gYmUgIm9yImVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCA3OWJiOWZlLi5jNWI5OTUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMzIsMTMgKzMyLDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAjZW5kaWYKLSNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIlR5cGVkTG9nZ2VyLmgiCkBAIC00Nyw3ICs0OCw4IEBACiAKIC8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjpzSW5pdGlhbDsKIAotRmFzdE1peGVyOjpGYXN0TWl4ZXIoKSA6IEZhc3RUaHJlYWQoImN5Y2xlX21zIiwgImxvYWRfdXMiKSwKK0Zhc3RNaXhlcjo6RmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHBhcmVudElvSGFuZGxlKQorICAgIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAogICAgIC8vIG1GYXN0VHJhY2tOYW1lcwogICAgIC8vIG1HZW5lcmF0aW9ucwogICAgIG1PdXRwdXRTaW5rKE5VTEwpLApAQCAtNTgsNyArNjAsNiBAQAogICAgIG1TaW5rQ2hhbm5lbENvdW50KEZDQ18yKSwKICAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCiAgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKLSAgICBtTWl4ZXJCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAogICAgIG1NaXhlckJ1ZmZlclN0YXRlKFVOREVGSU5FRCksCiAgICAgbUZvcm1hdChGb3JtYXRfSW52YWxpZCksCiAgICAgbVNhbXBsZVJhdGUoMCksCkBAIC02Niw4ICs2NywxMSBAQAogICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4oMCksCiAgICAgLy8gdGltZXN0YW1wCiAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCksICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgotICAgIG1NYXN0ZXJNb25vKGZhbHNlKQorICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKKyAgICBtVGhyZWFkSW9IYW5kbGUocGFyZW50SW9IYW5kbGUpCiB7CisgICAgKHZvaWQpbVRocmVhZElvSGFuZGxlOyAvLyBwcmV2ZW50IHVudXNlZCB3YXJuaW5nLCBzZWUgQysrMTcgW1ttYXliZV91bnVzZWRdXQorCiAgICAgLy8gRklYTUUgcGFzcyBzSW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCiAgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOwogICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwpAQCAtMTM1LDYgKzEzOSw3NSBAQAogICAgIH0KIH0KIAordm9pZCBGYXN0TWl4ZXI6OnVwZGF0ZU1peGVyVHJhY2soaW50IGluZGV4LCBSZWFzb24gcmVhc29uKSB7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OworICAgIGNvbnN0IEZhc3RUcmFjayAqIGNvbnN0IGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpbmRleF07CisKKyAgICAvLyBjaGVjayBhbmQgdXBkYXRlIGdlbmVyYXRpb24KKyAgICBpZiAocmVhc29uID09IFJFQVNPTl9NT0RJRlkgJiYgbUdlbmVyYXRpb25zW2luZGV4XSA9PSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlIG9uIGFuIGFscmVhZHkgY29uZmlndXJlZCB0cmFjay4KKyAgICB9CisgICAgbUdlbmVyYXRpb25zW2luZGV4XSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisKKyAgICAvLyBtTWl4ZXIgPT0gbnVsbHB0ciBvbiBjb25maWd1cmF0aW9uIGZhaWx1cmUgKGNoZWNrIGRvbmUgYWZ0ZXIgZ2VuZXJhdGlvbiB1cGRhdGUpLgorICAgIGlmIChtTWl4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChyZWFzb24pIHsKKyAgICBjYXNlIFJFQVNPTl9SRU1PVkU6CisgICAgICAgIG1NaXhlci0+ZGVzdHJveShpbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkVBU09OX0FERDogeworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBtTWl4ZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBpbmRleCwgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIGZhc3QgdHJhY2sgaW5kZXgiCisgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3ggaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGluZGV4LCBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICB9CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsgIC8vIG5vdyBmYWxsdGhyb3VnaCB0byB1cGRhdGUgdGhlIG5ld2x5IGNyZWF0ZWQgdHJhY2suCisgICAgY2FzZSBSRUFTT05fTU9ESUZZOgorICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKGluZGV4LCBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcik7CisKKyAgICAgICAgZmxvYXQgdmxmLCB2cmY7CisgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKKyAgICAgICAgICAgIHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgICAgIHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2bGYgPSB2cmYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IHZvbHVtZSB0byBhdm9pZCByYW1wIHdoZW5ldmVyIHRoZSB0cmFjayBpcyB1cGRhdGVkIChvciBjcmVhdGVkKS4KKyAgICAgICAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBkaXN0aW5ndWlzaCBmcm9tIHN0YXJ0aW5nIGZyZXNoIG9yCisgICAgICAgIC8vIHJlc3VtaW5nIGZyb20gYSBwYXVzZWQgc3RhdGUuCisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgbnVsbHB0cik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfSU5URU5TSVRZLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkpOworCisgICAgICAgIG1NaXhlci0+ZW5hYmxlKGluZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IGludmFsaWQgdXBkYXRlIHJlYXNvbiAlZCIsIF9fZnVuY19fLCByZWFzb24pOworICAgIH0KK30KKwogdm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQogewogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKQEAgLTE1NSwyMCArMjI4LDI1IEBACiAgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG1PdXRwdXRTaW5rR2VuKSB7CiAgICAgICAgIG1PdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7CiAgICAgICAgIG1PdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47CisgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBjdXJyZW50LT5tU2lua0NoYW5uZWxNYXNrOworICAgICAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtU2lua0NoYW5uZWxNYXNrKTsKICAgICAgICAgaWYgKG1PdXRwdXRTaW5rID09IE5VTEwpIHsKICAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gMDsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gMDsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgICAgICBtQXVkaW9DaGFubmVsQ291bnQgPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUobUZvcm1hdCk7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCk7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TaW5rQ2hhbm5lbENvdW50ID4gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUyk7CiAKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0Ci0gICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgaWYgKG1TaW5rQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQXVkaW9DaGFubmVsQ291bnQgPSBtU2lua0NoYW5uZWxDb3VudCAtIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CiAgICAgICAgIH0KICAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KQEAgLTE4MiwxNSArMjYwLDE1IEBACiAgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOwogICAgICAgICBtU2lua0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBtU2FtcGxlUmF0ZSA+IDApIHsKLSAgICAgICAgICAgIC8vIFRoZSBtaXhlciBwcm9kdWNlcyBlaXRoZXIgMTYgYml0IFBDTSBvciBmbG9hdCBvdXRwdXQsIHNlbGVjdAotICAgICAgICAgICAgLy8gZmxvYXQgb3V0cHV0IGlmIHRoZSBIQUwgc3VwcG9ydHMgaGlnaGVyIHRoYW4gMTYgYml0IHByZWNpc2lvbi4KLSAgICAgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IG1Gb3JtYXQubUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA/Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cwogICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KICAgICAgICAgICAgIG1NaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIC8vIEZJWE1FIFNlZSB0aGUgb3RoZXIgRklYTUUgYXQgRmFzdE1peGVyOjpzZXROQkxvZ1dyaXRlcigpCisgICAgICAgICAgICBOQkxvZzo6dGhyZWFkX3BhcmFtc190IHBhcmFtczsKKyAgICAgICAgICAgIHBhcmFtcy5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OwpAQCAtMjIwLDYgKzI5OCwxMCBAQAogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7CiAgICAgICAgIG1GYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwogICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLnNldChtRm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX09VVFBVVF9USFJFQUQpOworICAgICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpICsgIl9GIik7CisjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwogICAgIH0KQEAgLTIyNywyMSArMzA5LDE2IEBACiAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0CiAgICAgY29uc3QgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CiAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKKyAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gbUZhc3RUcmFja3NHZW4pIHsKLSAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOwogCiAgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKICAgICAgICAgdW5zaWduZWQgcmVtb3ZlZFRyYWNrcyA9IHByZXZpb3VzVHJhY2tNYXNrICYgfmN1cnJlbnRUcmFja01hc2s7CiAgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihyZW1vdmVkVHJhY2tzKTsKICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1NaXhlci0+ZGVzdHJveShpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZU1peGVyVHJhY2soaSwgUkVBU09OX1JFTU9WRSk7CiAgICAgICAgICAgICAvLyBkb24ndCByZXNldCB0cmFjayBkdW1wIHN0YXRlLCBzaW5jZSBvdGhlciBzaWRlIGlzIGlnbm9yaW5nIGl0Ci0gICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCkBAIC0yNDksMzYgKzMyNiw3IEBACiAgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHooYWRkZWRUcmFja3MpOwogICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOyAvLyBmb3IgY2xhcml0eSwgY2hvb3NlIG5hbWUgYXMgZmFzdCB0cmFjayBpbmRleC4KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1NaXhlci0+ZW5hYmxlKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHVwZGF0ZU1peGVyVHJhY2soaSwgUkVBU09OX0FERCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmaW5hbGx5IHByb2Nlc3MgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmFja3M7IHRoZXNlIHVzZSB0aGUgc2FtZSBzbG90CkBAIC0yODcsNDAgKzMzNSwxMCBAQAogICAgICAgICB3aGlsZSAobW9kaWZpZWRUcmFja3MgIT0gMCkgewogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKICAgICAgICAgICAgIG1vZGlmaWVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gbUdlbmVyYXRpb25zW2ldKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fTU9ESUZZKTsKICAgICAgICAgfQogCiAgICAgICAgIG1GYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47Ci0KLSAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CiAgICAgfQogfQogCkBAIC0zMjgsMTMgKzM0NiwyNCBAQAogewogICAgIC8vIFRPRE86IHBhc3MgYW4gSUQgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoaWNoIHRpbWUgc2VyaWVzIHdlIHdhbnQgdG8gd3JpdGUgdG8gaW4gTkJMb2cuY3BwCiAgICAgLy8gT3I6IHBhc3MgYm90aCBvZiB0aGVzZSBpbnRvIGEgc2luZ2xlIGNhbGwgd2l0aCBhIGJvb2xlYW4KLSAgICBpZiAobUlzV2FybSkgewotICAgICAgICBMT0dfSElTVF9UUygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BVURJT19TVEFURSgpOwotICAgIH0KICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOworCisgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgLy8gTG9nZ2luZyB0aW1lc3RhbXBzIGZvciBGYXN0TWl4ZXIgaXMgY3VycmVudGx5IGRpc2FibGVkIHRvIG1ha2UgbWVtb3J5IHJvb20gZm9yIGxvZ2dpbmcKKyAgICAgICAgLy8gb3RoZXIgc3RhdGlzdGljcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgIC8vIFRvIHJlLWVuYWJsZSwgZGVsZXRlIHRoZSAjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTIGxpbmVzIChhbmQgdGhlICNlbmRpZiBsaW5lcykuCisjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTCisgICAgICAgIExPR19ISVNUX1RTKCk7CisjZW5kaWYKKyAgICAgICAgLy9BTE9HRCgiRXJpYyBGYXN0TWl4ZXI6Om9uV29yaygpIG1Jc1dhcm0iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgIC8vIFNlZSBjb21tZW50IGluIGlmIGJsb2NrLgorI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUworICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKKyNlbmRpZgorICAgIH0KICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKIApAQCAtMzc2LDggKzQwNSw4IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwogICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawpAQCAtNDM5LDE3ICs0NjgsMjkgQEAKICAgICAgICAgICAgIG1vbm9fYmxlbmQobU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCksIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLypsaW1pdCovKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIEJhbGFuY2UgbXVzdCB0YWtlIGVmZmVjdCBhZnRlciBtb25vIGNvbnZlcnNpb24uCisgICAgICAgIC8vIG1CYWxhbmNlIGRldGVjdHMgemVybyBiYWxhbmNlIHdpdGhpbiB0aGUgY2xhc3MgZm9yIHNwZWVkIChub3QgbmVlZGVkIGhlcmUpLgorICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgIG1CYWxhbmNlLnByb2Nlc3MoKGZsb2F0ICopbU1peGVyQnVmZmVyLCBmcmFtZUNvdW50KTsKKwogICAgICAgICAvLyBwcmVwYXJlIHRoZSBidWZmZXIgdXNlZCB0byB3cml0ZSB0byBzaW5rCiAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1TaW5rQnVmZmVyICE9IE5VTEwgPyBtU2lua0J1ZmZlciA6IG1NaXhlckJ1ZmZlcjsKICAgICAgICAgaWYgKG1Gb3JtYXQubUZvcm1hdCAhPSBtTWl4ZXJCdWZmZXJGb3JtYXQpIHsgLy8gc2luayBmb3JtYXQgbm90IHRoZSBzYW1lIGFzIG1peGVyIGZvcm1hdAogICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpKTsKICAgICAgICAgfQotICAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgICAgIE5CQUlPX1NpbmsqIHRlZVNpbms7Ci0gICAgICAgIGlmICgodGVlU2luayA9IGN1cnJlbnQtPm1UZWVTaW5rKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAodm9pZCkgdGVlU2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgaWYgKG1TaW5rQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgYXJlIGhhcHRpYyBjaGFubmVscywgdGhlIHNhbXBsZSBkYXRhIGlzIHBhcnRpYWxseSBpbnRlcmxlYXZlZC4KKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHNhbXBsZSBkYXRhIGZ1bGx5IGludGVybGVhdmVkIGhlcmUuCisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKGJ1ZmZlciwgbUF1ZGlvQ2hhbm5lbENvdW50LCBidWZmZXIsIG1TaW5rQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQubUZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUobUF1ZGlvQ2hhbm5lbENvdW50LCBtRm9ybWF0Lm1Gb3JtYXQpKTsKICAgICAgICAgfQorICAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgbVRlZS53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworI2VuZGlmCiAgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKICAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcwogICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CkBAIC00NzAsMzUgKzUxMSw0OSBAQAogICAgICAgICBtQXR0ZW1wdGVkV3JpdGUgPSB0cnVlOwogICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIGxvY2FsCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgeworICAgICAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb21wZW5zYXRlIGZvciBzZXJ2ZXIgLSBrZXJuZWwgdGltZSBkaWZmZXJlbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVwZGF0ZSBsYXRlbmN5IGlmIHdlIGhhdmUgdmFsaWQgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSltTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCAqIDEwMDAgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTGF0ZW5jeU1zID0gbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICBMT0dfTEFURU5DWShsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgotICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCi0gICAgICAgICAgICAvLyBpZiB3ZSBuZXZlciBnZXQgYSBuZXcgdmFsaWQgdGltZXN0YW1wCi0gICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IDA7Ci0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBmZXRjaCBzZXJ2ZXIgdGltZSBpZiB3ZSBjYW4ndCBnZXQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQga2VybmVsIGNhY2hlZCBwb3NpdGlvbiBhcyB0aGlzIG1heSBnZXQgcmFwaWRseSBzdGFsZQorICAgICAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IDA7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gLTE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKaW5kZXggMjM1ZDIzZi4uOTdhYjYzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaApAQCAtMTgsMTAgKzE4LDEyIEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmFsYW5jZS5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiwxMiArMzQsMTYgQEAKIGNsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCk7CisgICAgLyoqIEZhc3RNaXhlciBjb25zdHJ1Y3RvciB0YWtlcyBhcyBwYXJhbSB0aGUgcGFyZW50IE1peGVyVGhyZWFkJ3MgaW8gaGFuZGxlIChpZCkKKyAgICAgICAgZm9yIHB1cnBvc2VzIG9mIGlkZW50aWZpY2F0aW9uLiAqLworICAgIGV4cGxpY2l0IEZhc3RNaXhlcihhdWRpb19pb19oYW5kbGVfdCB0aHJlYWRJb0hhbmRsZSk7CiAgICAgdmlydHVhbCB+RmFzdE1peGVyKCk7CiAKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pIHsgbU1hc3Rlck1vbm8uc3RvcmUobW9ubyk7IC8qIG1lbW9yeV9vcmRlcl9zZXFfY3N0ICovIH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSB7IG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOyB9CisgICAgdmlydHVhbCBmbG9hdCBnZXRNYXN0ZXJCYWxhbmNlKCkgY29uc3QgeyByZXR1cm4gbU1hc3RlckJhbGFuY2UubG9hZCgpOyB9CiAgICAgdmlydHVhbCB2b2lkIHNldEJvb3R0aW1lT2Zmc2V0KGludDY0X3QgYm9vdHRpbWVPZmZzZXQpIHsKICAgICAgICAgbUJvb3R0aW1lT2Zmc2V0LnN0b3JlKGJvb3R0aW1lT2Zmc2V0KTsgLyogbWVtb3J5X29yZGVyX3NlcV9jc3QgKi8KICAgICB9CkBAIC01Myw2ICs1OSwxNCBAQAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uV29yaygpOwogCisgICAgZW51bSBSZWFzb24geworICAgICAgICBSRUFTT05fUkVNT1ZFLAorICAgICAgICBSRUFTT05fQURELAorICAgICAgICBSRUFTT05fTU9ESUZZLAorICAgIH07CisgICAgLy8gY2FsbGVkIHdoZW4gYSBmYXN0IHRyYWNrIG9mIGluZGV4IGhhcyBiZWVuIHJlbW92ZWQsIGFkZGVkLCBvciBtb2RpZmllZAorICAgIHZvaWQgdXBkYXRlTWl4ZXJUcmFjayhpbnQgaW5kZXgsIFJlYXNvbiByZWFzb24pOworCiAgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzCiAgICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIHNJbml0aWFsOwogCkBAIC03MSw3ICs4NSw5IEBACiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNpbmtDaGFubmVsTWFzazsKICAgICB2b2lkKiAgICAgICAgICAgbU1peGVyQnVmZmVyOyAgICAgICAvLyBtaXhlciBvdXRwdXQgYnVmZmVyLgogICAgIHNpemVfdCAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOwotICAgIGF1ZGlvX2Zvcm1hdF90ICBtTWl4ZXJCdWZmZXJGb3JtYXQ7IC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCisgICAgc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisgICAgdWludDMyX3QgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudDsgLy8gYXVkaW8gY2hhbm5lbCBjb3VudCwgZXhjbHVkZXMgaGFwdGljIGNoYW5uZWxzLgogCiAgICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtTWl4ZXJCdWZmZXJTdGF0ZTsKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsKQEAgLTg0LDkgKzEwMCwxNyBAQAogICAgIEV4dGVuZGVkVGltZXN0YW1wIG1UaW1lc3RhbXA7CiAgICAgaW50NjRfdCAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwogCisgICAgYXVkaW9fdXRpbHM6OkJhbGFuY2UgbUJhbGFuY2U7CisKICAgICAvLyBhY2Nlc3NlZCB3aXRob3V0IGxvY2sgYmV0d2VlbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgIHN0ZDo6YXRvbWljX2Jvb2wgbU1hc3Rlck1vbm87CisgICAgc3RkOjphdG9taWM8ZmxvYXQ+IG1NYXN0ZXJCYWxhbmNle307CiAgICAgc3RkOjphdG9taWNfaW50X2Zhc3Q2NF90IG1Cb290dGltZU9mZnNldDsKKworICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1UaHJlYWRJb0hhbmRsZTsgLy8gcGFyZW50IHRocmVhZCBpZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgbVRlZTsKKyNlbmRpZgogfTsgIC8vIGNsYXNzIEZhc3RNaXhlcgogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKaW5kZXggMmU0ZmI4Yy4uYTQyZTA5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCkBAIC02OCwyMSArNjgsMjIgQEAKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXMgbGF0ZW5jeT0lLjJmIG1zXG4iLAogICAgICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjpjb21tYW5kVG9TdHJpbmcobUNvbW1hbmQpLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgbU51bVRyYWNrcywgbVdyaXRlRXJyb3JzLCBtVW5kZXJydW5zLCBtT3ZlcnJ1bnMsCiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLAotICAgICAgICAgICAgICAgIG1peFBlcmlvZFNlYyAqIDFlMyk7CisgICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzLCBtTGF0ZW5jeU1zKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgVGltZXN0YW1wIHN0YXRzOiAlc1xuIiwgbVRpbWVzdGFtcFZlcmlmaWVyLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwogICAgIC8vIGZpbmQgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMKLSAgICB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOwotICAgIHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CisgICAgY29uc3QgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKKyAgICBjb25zdCB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG9sZGVzdENsb3NlZCA9IGJvdW5kcyA+PiAxNjsKIAogICAgIC8vdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKICAgICB1aW50MzJfdCBuOwogICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cobmV3ZXN0T3Blbiwgb2xkZXN0Q2xvc2VkLCAmbik7Ci0gICAgbiA9IG4gJiAweEZGRkY7CisgICAgbiAmPSAweEZGRkY7CiAKICAgICBpZiAobiA+IG1TYW1wbGluZ04pIHsKICAgICAgICAgQUxPR0UoInRvbyBtYW55IHNhbXBsZXMgJXUiLCBuKTsKQEAgLTkwLDkgKzkxLDkgQEAKICAgICB9CiAgICAgLy8gc3RhdGlzdGljcyBmb3IgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lLCB0aHJlYWQgcmF3IENQVSBsb2FkIGluIHRpbWUsIENQVSBjbG9jayBmcmVxdWVuY3ksCiAgICAgLy8gYW5kIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5Ci0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyB3YWxsLCBsb2FkTnM7CisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiB3YWxsLCBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBrSHosIGxvYWRNSHo7CisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBrSHosIGxvYWRNSHo7CiAgICAgdWludDMyX3QgcHJldmlvdXNDcHVrSHogPSAwOwogI2VuZGlmCiAgICAgLy8gQXNzdW1pbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBjeWNsZSB0aW1lcywgdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvbiBlaXRoZXIgc2lkZSBvZgpAQCAtMTA3LDE4ICsxMDgsMTggQEAKICAgICAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICAgICAgdGFpbFtqXSA9IHdhbGxOczsKICAgICAgICAgfQotICAgICAgICB3YWxsLnNhbXBsZSh3YWxsTnMpOworICAgICAgICB3YWxsLmFkZCh3YWxsTnMpOwogICAgICAgICB1aW50MzJfdCBzYW1wbGVMb2FkTnMgPSBtTG9hZE5zW2ldOwotICAgICAgICBsb2FkTnMuc2FtcGxlKHNhbXBsZUxvYWROcyk7CisgICAgICAgIGxvYWROcy5hZGQoc2FtcGxlTG9hZE5zKTsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICAgICAgdWludDMyX3Qgc2FtcGxlQ3B1a0h6ID0gbUNwdWtIeltpXTsKICAgICAgICAgLy8gc2tpcCBiYWQga0h6IHNhbXBsZXMKICAgICAgICAgaWYgKChzYW1wbGVDcHVrSHogJiB+MHhGKSAhPSAwKSB7Ci0gICAgICAgICAgICBrSHouc2FtcGxlKHNhbXBsZUNwdWtIeiA+PiA0KTsKKyAgICAgICAgICAgIGtIei5hZGQoc2FtcGxlQ3B1a0h6ID4+IDQpOwogICAgICAgICAgICAgaWYgKHNhbXBsZUNwdWtIeiA9PSBwcmV2aW91c0NwdWtIeikgewogICAgICAgICAgICAgICAgIGRvdWJsZSBtZWdhY3ljbGVzID0gKGRvdWJsZSkgc2FtcGxlTG9hZE5zICogKGRvdWJsZSkgKHNhbXBsZUNwdWtIeiA+PiA0KSAqIDFlLTEyOwogICAgICAgICAgICAgICAgIGRvdWJsZSBhZGpNSHogPSBtZWdhY3ljbGVzIC8gbWl4UGVyaW9kU2VjOyAgLy8gX25vdF8gd2FsbE5zICogMWU5Ci0gICAgICAgICAgICAgICAgbG9hZE1Iei5zYW1wbGUoYWRqTUh6KTsKKyAgICAgICAgICAgICAgICBsb2FkTUh6LmFkZChhZGpNSHopOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHByZXZpb3VzQ3B1a0h6ID0gc2FtcGxlQ3B1a0h6OwpAQCAtMTI2LDQyICsxMjcsNDIgQEAKICAgICB9CiAgICAgaWYgKG4pIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgU2ltcGxlIG1vdmluZyBzdGF0aXN0aWNzIG92ZXIgbGFzdCAlLjFmIHNlY29uZHM6XG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7CisgICAgICAgICAgICAgICAgICAgIHdhbGwuZ2V0TigpICogbWl4UGVyaW9kU2VjKTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRNZWFuKCkqMWUtNiwgd2FsbC5nZXRNaW4oKSoxZS02LCB3YWxsLmdldE1heCgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHdhbGwuZ2V0U3RkRGV2KCkqMWUtNik7CiAgICAgICAgIGRwcmludGYoZmQsICIgICAgcmF3IENQVSBsb2FkIGluIHVzIHBlciBtaXggY3ljbGU6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCi0gICAgICAgICAgICAgICAgICAgIGxvYWROcy5zdGRkZXYoKSoxZS0zKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldE1lYW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWluKCkqMWUtMywgbG9hZE5zLmdldE1heCgpKjFlLTMsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5nZXRTdGREZXYoKSoxZS0zKTsKICAgICB9IGVsc2UgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXIgc3RhdGlzdGljcyBhdmFpbGFibGUgY3VycmVudGx5XG4iKTsKICAgICB9CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCi0gICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgIGtIei5nZXRNZWFuKCkqMWUtMywga0h6LmdldE1pbigpKjFlLTMsIGtIei5nZXRNYXgoKSoxZS0zLCBrSHouZ2V0U3RkRGV2KCkqMWUtMyk7CiAgICAgZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgogICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAotICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOworICAgICAgICAgICAgICAgIGxvYWRNSHouZ2V0TWVhbigpLCBsb2FkTUh6LmdldE1pbigpLCBsb2FkTUh6LmdldE1heCgpLCBsb2FkTUh6LmdldFN0ZERldigpKTsKICNlbmRpZgogICAgIGlmICh0YWlsICE9IE5VTEwpIHsKICAgICAgICAgcXNvcnQodGFpbCwgbiwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV91aW50MzJfdCk7CiAgICAgICAgIC8vIGFzc3VtZSBzYW1lIG51bWJlciBvZiB0YWlsIHNhbXBsZXMgb24gZWFjaCBzaWRlLCBsZWZ0IGFuZCByaWdodAogICAgICAgICB1aW50MzJfdCBjb3VudCA9IG4gLyBrVGFpbERlbm9taW5hdG9yOwotICAgICAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGxlZnQsIHJpZ2h0OworICAgICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGxlZnQsIHJpZ2h0OwogICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7Ci0gICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOworICAgICAgICAgICAgbGVmdC5hZGQodGFpbFtpXSk7CisgICAgICAgICAgICByaWdodC5hZGQodGFpbFtuIC0gKGkgKyAxKV0pOwogICAgICAgICB9CiAgICAgICAgIGRwcmludGYoZmQsICIgIERpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAiCiAgICAgICAgICAgICAgICAgICAgICIoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICBsZWZ0LmdldE1lYW4oKSoxZS02LCBsZWZ0LmdldE1pbigpKjFlLTYsIGxlZnQuZ2V0TWF4KCkqMWUtNiwgbGVmdC5nZXRTdGREZXYoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRNZWFuKCkqMWUtNiwgcmlnaHQuZ2V0TWluKCkqMWUtNiwgcmlnaHQuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQuZ2V0U3RkRGV2KCkqMWUtNik7CiAgICAgICAgIGRlbGV0ZVtdIHRhaWw7CiAgICAgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKaW5kZXggOGVmMzFkMS4uOWI5MWNiYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJGYXN0VGhyZWFkRHVtcFN0YXRlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKQEAgLTY2LDYgKzY3LDcgQEAKIAogICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OyAgICAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzdGFibGUgY29weSwgbm90IHRoZSBvcmlnaW5hbAogCisgICAgZG91YmxlICAgbUxhdGVuY3lNcyA9IDAuOyAgIC8vIG1lYXN1cmVkIGxhdGVuY3ksIGRlZmF1bHQgb2YgMCBpZiBubyB2YWxpZCB0aW1lc3RhbXAgcmVhZC4KICAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKICAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQogICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCkBAIC03NCw2ICs3Niw5IEBACiAgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7CiAgICAgdWludDMyX3QgbVRyYWNrTWFzazsgICAgICAgIC8vIG1hc2sgb2YgYWN0aXZlIHRyYWNrcwogICAgIEZhc3RUcmFja0R1bXAgICBtVHJhY2tzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisKKyAgICAvLyBGb3IgdGltZXN0YW1wIHN0YXRpc3RpY3MuCisgICAgVGltZXN0YW1wVmVyaWZpZXI8aW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CiB9OwogCiB9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKaW5kZXggMzZkOGVlZi4uYjk4ODQyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCkBAIC0zNSw3ICszNSw3IEBACiBGYXN0TWl4ZXJTdGF0ZTo6RmFzdE1peGVyU3RhdGUoKSA6IEZhc3RUaHJlYWRTdGF0ZSgpLAogICAgIC8vIG1GYXN0VHJhY2tzCiAgICAgbUZhc3RUcmFja3NHZW4oMCksIG1UcmFja01hc2soMCksIG1PdXRwdXRTaW5rKE5VTEwpLCBtT3V0cHV0U2lua0dlbigwKSwKLSAgICBtRnJhbWVDb3VudCgwKSwgbVRlZVNpbmsoTlVMTCkKKyAgICBtRnJhbWVDb3VudCgwKQogewogICAgIGludCBvayA9IHB0aHJlYWRfb25jZSgmc01heEZhc3RUcmFja3NPbmNlLCBzTWF4RmFzdFRyYWNrc0luaXQpOwogICAgIGlmIChvayAhPSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDJiZTFlOTEuLjM5NmM3OTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgpAQCAtNDcsNiArNDgsOSBAQAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBvciBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgIC8vIHRyYWNrIGZvcm1hdAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uOyAgICAgLy8gaW5jcmVtZW50IHdoZW4gYW55IGZpZWxkIGlzIGFzc2lnbmVkCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBoYXB0aWMgcGxheWJhY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgICBBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgbUhhcHRpY0ludGVuc2l0eSA9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFOyAvLyBpbnRlbnNpdHkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXB0aWMgZGF0YQogfTsKIAogLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBzdGF0ZSBvZiB0aGUgZmFzdCBtaXhlcgpAQCAtNjksNiArNzMsOSBAQAogICAgIE5CQUlPX1NpbmsqIG1PdXRwdXRTaW5rOyAgICAvLyBIQUwgb3V0cHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKICAgICBpbnQgICAgICAgICBtT3V0cHV0U2lua0dlbjsgLy8gaW5jcmVtZW50IHdoZW4gbU91dHB1dFNpbmsgaXMgYXNzaWduZWQKICAgICBzaXplX3QgICAgICBtRnJhbWVDb3VudDsgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBtaXggYnVmZmVyCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNpbmtDaGFubmVsTWFzazsgLy8gSWYgbm90IEFVRElPX0NIQU5ORUxfTk9ORSwgc3BlY2lmaWVzIHNpbmsgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc2sgd2hlbiBpdCBjYW5ub3QgYmUgZGlyZWN0bHkgY2FsY3VsYXRlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbm5lbCBjb3VudAogCiAgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKICAgICBzdGF0aWMgY29uc3QgQ29tbWFuZApAQCAtNzcsOSArODQsNiBAQAogICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBvdXRwdXQgc2luawogICAgICAgICBNSVhfV1JJVEUgPSAweDE4OyAgICAgICAvLyBtaXggdHJhY2tzIGFuZCB3cml0ZSB0byBvdXRwdXQgc2luawogCi0gICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCi0gICAgTkJBSU9fU2luayogbVRlZVNpbms7ICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpcyB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0KICAgICAvLyBuZXZlciByZXR1cm5zIE5VTEw7IGFzc2VydHMgaWYgY29tbWFuZCBpcyBpbnZhbGlkCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbW1hbmRUb1N0cmluZyhDb21tYW5kIGNvbW1hbmQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKaW5kZXggZGMxNTQ4Ny4uMDRiMzJjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KQEAgLTY1LDggKzY2LDYgQEAKICAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLwogICAgIG1XYXJtdXBDeWNsZXMoMCksCiAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcygwKSwKLSAgICAvLyBtRHVtbXlOQkxvZ1dyaXRlcgotICAgIG1OQkxvZ1dyaXRlcigmbUR1bW15TkJMb2dXcml0ZXIpLAogICAgIG1UaW1lc3RhbXBTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pLAogCiAgICAgbUNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwKQEAgLTkzLDcgKzkyLDcgQEAKIHsKICAgICAvLyBMT0dUIG5vdyB3b3JrcyBldmVuIGlmIHRsTkJMb2dXcml0ZXIgaXMgbnVsbHB0ciwgYnV0IHdlJ3JlIGNvbnNpZGVyaW5nIGNoYW5naW5nIHRoYXQsCiAgICAgLy8gc28gdGhpcyBpbml0aWFsaXphdGlvbiBwZXJtaXRzIGEgZnV0dXJlIGNoYW5nZSB0byByZW1vdmUgdGhlIGNoZWNrIGZvciBudWxscHRyLgotICAgIHRsTkJMb2dXcml0ZXIgPSAmbUR1bW15TkJMb2dXcml0ZXI7CisgICAgdGxOQkxvZ1dyaXRlciA9IG1EdW1teU5CTG9nV3JpdGVyLmdldCgpOwogICAgIGZvciAoOzspIHsKIAogICAgICAgICAvLyBlaXRoZXIgbmFub3NsZWVwLCBzY2hlZF95aWVsZCwgb3IgYnVzeSB3YWl0CkBAIC0xMjMsOSArMTIyLDkgQEAKIAogICAgICAgICAgICAgLy8gQXMgc29vbiBhcyBwb3NzaWJsZSBvZiBsZWFybmluZyBvZiBhIG5ldyBkdW1wIGFyZWEsIHN0YXJ0IHVzaW5nIGl0CiAgICAgICAgICAgICBtRHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKLSAgICAgICAgICAgIG1OQkxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJm1EdW1teU5CTG9nV3JpdGVyOwotICAgICAgICAgICAgc2V0TkJMb2dXcml0ZXIobU5CTG9nV3JpdGVyKTsgICAvLyBGYXN0TWl4ZXIgaW5mb3JtcyBpdHMgQXVkaW9NaXhlciwgRmFzdENhcHR1cmUgaWdub3JlcwotICAgICAgICAgICAgdGxOQkxvZ1dyaXRlciA9IG1OQkxvZ1dyaXRlcjsKKyAgICAgICAgICAgIHRsTkJMb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgIG5leHQtPm1OQkxvZ1dyaXRlciA6IG1EdW1teU5CTG9nV3JpdGVyLmdldCgpOworICAgICAgICAgICAgc2V0TkJMb2dXcml0ZXIodGxOQkxvZ1dyaXRlcik7IC8vIEZhc3RNaXhlciBpbmZvcm1zIGl0cyBBdWRpb01peGVyLCBGYXN0Q2FwdHVyZSBpZ25vcmVzCiAKICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCiAgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCkBAIC0yNjAsNiArMjU5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dhcm0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtTWVhc3VyZWRXYXJtdXBUczsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSBtV2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMWUzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjICogMWUtNik7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0FSTVVQX1RJTUUobWVhc3VyZWRXYXJtdXBNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSAtMTsKQEAgLTI3MCw2ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bVVuZGVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1VOREVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zZWMgPCBtT3ZlcnJ1bk5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlnbm9yZU5leHRPdmVycnVuKSB7CkBAIC0yNzksNiArMjgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX09WRVJSVU4oYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbmV3VHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KQEAgLTMzOSw2ICszNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Nb25vdG9uaWNOc1tpXSA9IG1vbm90b25pY05zOworICAgICAgICAgICAgICAgICAgICBMT0dfV09SS19USU1FKG1vbm90b25pY05zKTsKICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCmluZGV4IDJhNzE0MTQuLjNmNmIyMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaApAQCAtNzgsMTIgKzc4LDExIEBACiAgICAgdW5zaWduZWQgICAgICAgIG1Db2xkR2VuOyAgICAgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCiAgICAgYm9vbCAgICAgICAgICAgIG1Jc1dhcm07ICAgICAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCi0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gaG93IGxvbmcgZGlkIGl0IHRha2UgZm9yIHdhcm11cCB0byBjb21wbGV0ZQotICAgIHVpbnQzMl90ICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQotICAgIHVpbnQzMl90ICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzOyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgY3ljbGVzIGluIHJhbmdlCi0gICAgTkJMb2c6OldyaXRlciAgIG1EdW1teU5CTG9nV3JpdGVyOwotICAgIE5CTG9nOjpXcml0ZXIqICBtTkJMb2dXcml0ZXI7ICAgLy8gYWx3YXlzIG5vbi1udWxscHRyOiByZWFsIE5CTG9nOjpXcml0ZXIqIG9yICZtRHVtbXlOQkxvZ1dyaXRlcgotICAgIHN0YXR1c190ICAgICAgICBtVGltZXN0YW1wU3RhdHVzOworICAgIHN0cnVjdCB0aW1lc3BlYyAgIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gaG93IGxvbmcgZGlkIGl0IHRha2UgZm9yIHdhcm11cCB0byBjb21wbGV0ZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyBkdXJpbmcgd2FybXVwIHBoYXNlCisgICAgdWludDMyX3QgICAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQorICAgIGNvbnN0IHNwPE5CTG9nOjpXcml0ZXI+IG1EdW1teU5CTG9nV3JpdGVye25ldyBOQkxvZzo6V3JpdGVyKCl9OworICAgIHN0YXR1c190ICAgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CiAKICAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7CiAgICAgYm9vbCAgICAgICAgICAgIG1BdHRlbXB0ZWRXcml0ZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCmluZGV4IDZmNTQ2YzMuLjk2OGQ1YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaApAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwpAQCAtMzksOCArNDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgTU1hcFRocmVhZDo6bUxvY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwODNkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkFJT19UZWUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZmRlZiBURUVfU0lOSworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgVGVlIGZpbGVuYW1lcyBnZW5lcmF0ZWQgYXMgZm9sbG93czoKKworICJhZnRlZV9EYXRlX1RocmVhZElkX0NfcmVhc29uLndhdiIgUmVjb3JkVGhyZWFkCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfTV9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoTm9ybWFsKQorICJhZnRlZV9EYXRlX1RocmVhZElkX0ZfcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKEZhc3QpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9SX3JlYXNvbi53YXYiIFJlY29yZFRyYWNrCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9UcmFja05hbWVfVF9yZWFzb24ud2F2IiBQbGF5YmFja1RyYWNrCisKKyB3aGVyZSBEYXRlID0gWVlZWW1tZGRfSEhNTVNTX01TRUMKKworIHdoZXJlIFJlYXNvbiA9IFsgRFRPUiB8IERVTVAgfCBSRU1PVkUgXQorCisgRXhhbXBsZXM6CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8wMzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzIxOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMzc4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDdfNjJfQ19EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ4XzYyXzU5X1JfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OV8xM19GX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xMjVfNjJfNTlfUl9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xNjhfNjJfQ19EVE9SLndhdgorKi8KKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfUFJFRklYW10gPSAiYWZ0ZWVfIjsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX0RJUkVDVE9SWVtdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9USFJFQURQT09MX1NJWkUgPSA4OworCisvKiogQXVkaW9GaWxlSGFuZGxlciBtYW5hZ2VzIHRlbXBvcmFyeSBhdWRpbyB3YXYgZmlsZXMgd2l0aCBhIGxlYXN0IHJlY2VudGx5IGNyZWF0ZWQKKyAgICByZXRlbnRpb24gcG9saWN5LgorCisgICAgVGhlIHRlbXBvcmFyeSBmaWxlbmFtZXMgYXJlIHN5c3RlbWF0aWNhbGx5IGdlbmVyYXRlZC4gQSBjb21tb24gZmlsZW5hbWUgcHJlZml4LAorICAgIHN0b3JhZ2UgZGlyZWN0b3J5LCBhbmQgY29uY3VycmVuY3kgcG9vbCBhcmUgcGFzc2VkIGluIG9uIGNyZWF0aW5nIHRoZSBvYmplY3QuCisKKyAgICBUZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgImNyZWF0ZSIsIHdoaWNoIHJldHVybnMgYSBmaWxlbmFtZSBnZW5lcmF0ZWQgYnkKKworICAgIHByZWZpeCArIDE0IGNoYXIgZGF0ZSArIHN1ZmZpeAorCisgICAgVE9ETyBNb3ZlIHRvIGF1ZGlvX3V0aWxzLgorICAgIFRPRE8gQXZvaWQgcG9pbnRpbmcgdHdvIEF1ZGlvRmlsZUhhbmRsZXJzIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgcHJlZml4CisgICAgYXMgd2UgZG9uJ3QgaGF2ZSBhIHByZWZpeCBzcGVjaWZpYyBsb2NrIGZpbGUuICovCisKK2NsYXNzIEF1ZGlvRmlsZUhhbmRsZXIgeworcHVibGljOgorCisgICAgQXVkaW9GaWxlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5LCBzaXplX3QgcG9vbCkKKyAgICAgICAgOiBtVGhyZWFkUG9vbChwb29sKQorICAgICAgICAsIG1QcmVmaXgocHJlZml4KQorICAgIHsKKyAgICAgICAgKHZvaWQpc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSk7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgZmlsZW5hbWUgb2YgY3JlYXRlZCBhdWRpbyBmaWxlLCBlbHNlIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLiAqLworICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZSgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KTsKKworcHJpdmF0ZToKKyAgICAvKiogc2V0cyB0aGUgY3VycmVudCBkaXJlY3RvcnkuIHRoaXMgaXMgY3VycmVudGx5IHByaXZhdGUgdG8gYXZvaWQgY29uZnVzaW9uCisgICAgICAgIHdoZW4gY2hhbmdpbmcgd2hpbGUgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBvY2N1cnJpbmcgKGl0J3Mgb2theSwgYnV0CisgICAgICAgIHdlYWtseSBzeW5jaHJvbml6ZWQpLiAqLworICAgIHN0YXR1c190IHNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KTsKKworICAgIC8qKiBjbGVhbnMgY3VycmVudCBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIGRvbmUuICovCisgICAgc3RhdHVzX3QgY2xlYW4oc3RkOjpzdHJpbmcgKmRpciA9IG51bGxwdHIpOworCisgICAgLyoqIGNyZWF0ZXMgYW4gYXVkaW8gZmlsZSBmcm9tIGEgcmVhZGVyIGZ1bmN0b3IgcGFzc2VkIGluLiAqLworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSk7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdG9yeVZhbGlkKGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeS5zaXplKCkgPiAwICYmIGRpcmVjdG9yeVswXSA9PSAnLyc7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KSBjb25zdCB7CisgICAgICAgIGNoYXIgZmlsZVRpbWVbc2l6ZW9mKCJZWVlZbW1kZF9ISE1NU1NfXDAiKV07CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICAgICAgc3RydWN0IHRtIHRtOworICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmZ0aW1lKGZpbGVUaW1lLCBzaXplb2YoZmlsZVRpbWUpLCAiJVklbSVkXyVIJU0lU18iLCAmdG0pID09IDAsCisgICAgICAgICAgICAiaW5jb3JyZWN0IGZpbGVUaW1lIGJ1ZmZlciIpOworICAgICAgICBjaGFyIG1zZWNbNF07CisgICAgICAgICh2b2lkKXNucHJpbnRmKG1zZWMsIHNpemVvZihtc2VjKSwgIiUwM2QiLCAoaW50KSh0di50dl91c2VjIC8gMTAwMCkpOworICAgICAgICByZXR1cm4gbVByZWZpeCArIGZpbGVUaW1lICsgbXNlYyArIHN1ZmZpeCArICIud2F2IjsKKyAgICB9CisKKyAgICBib29sIGlzTWFuYWdlZEZpbGVuYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgY29uc3RleHByIHNpemVfdCBGSUxFTkFNRV9MRU5fREFURSA9IDQgKyAyICsgMiAvLyAlWSVtJWQlCisgICAgICAgICAgICArIDEgKyAyICsgMiArIDIgLy8gX0glTSVTCisgICAgICAgICAgICArIDEgKyAzOyAvL19NU0VDCisgICAgICAgIGNvbnN0IHNpemVfdCBwcmVmaXhMZW4gPSBtUHJlZml4LnNpemUoKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4obmFtZSk7CisKKyAgICAgICAgLy8gcmVqZWN0IG9uIHNpemUsIHByZWZpeCwgYW5kIC53YXYKKyAgICAgICAgaWYgKG5hbWVMZW4gPCBwcmVmaXhMZW4gKyBGSUxFTkFNRV9MRU5fREFURSArIDQgLyogLndhdiAqLworICAgICAgICAgICAgIHx8IHN0cm5jbXAobmFtZSwgbVByZWZpeC5jX3N0cigpLCBwcmVmaXhMZW4pICE9IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAobmFtZSArIG5hbWVMZW4gLSA0LCAiLndhdiIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIGRhdGUgcG9ydGlvbgorICAgICAgICBjb25zdCBjaGFyICpkYXRlID0gbmFtZSArIHByZWZpeExlbjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6YWxsX29mKGRhdGUsIGRhdGUgKyA4LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVs4XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyA5LCBkYXRlICsgMTUsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzE1XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyAxNiwgZGF0ZSArIDE5LCBpc2RpZ2l0KTsKKyAgICB9CisKKyAgICAvLyB5ZXQgYW5vdGhlciBUaHJlYWRQb29sIGltcGxlbWVudGF0aW9uLgorICAgIGNsYXNzIFRocmVhZFBvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGhyZWFkUG9vbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgICAgIDogbVRocmVhZFBvb2xTaXplKHNpemUpCisgICAgICAgIHsgfQorCisgICAgICAgIC8qKiBsYXVuY2hlcyB0YXNrICJuYW1lIiB3aXRoIGFzc29jaWF0ZWQgZnVuY3Rpb24gImZ1bmMiLgorICAgICAgICAgICAgaWYgdGhlIHRocmVhZHBvb2wgaXMgZXhoYXVzdGVkLCBpdCB3aWxsIGxhdW5jaCBvbiBjYWxsaW5nIGZ1bmN0aW9uICovCisgICAgICAgIHN0YXR1c190IGxhdW5jaChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHN0ZDo6ZnV0dXJlPHN0YXR1c190Pj4+IG1GdXR1cmVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorCisgICAgICAgIGNvbnN0IHNpemVfdCBtVGhyZWFkUG9vbFNpemU7CisgICAgfSBtVGhyZWFkUG9vbDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1QcmVmaXg7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OnN0cmluZyBtRGlyZWN0b3J5OyAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnN0cmluZz4gbUZpbGVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKSAgc29ydGVkIGxpc3Qgb2YgZmlsZXMgYnkgY3JlYXRpb24gdGltZQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgRlJBTUVTX1BFUl9SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX0tFRVAgPSAzMjsKK307CisKKy8qIHN0YXRpYyAqLwordm9pZCBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6OmR1bXBUZWUoCisgICAgICAgIGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSAmc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICAvLyBTaW5nbGV0b24uIENvbnN0cnVjdGVkIHRocmVhZC1zYWZlIG9uIGZpcnN0IGNhbGwsIG5ldmVyIGRlc3Ryb3llZC4KKyAgICBzdGF0aWMgQXVkaW9GaWxlSGFuZGxlciBhdWRpb0ZpbGVIYW5kbGVyKAorICAgICAgICAgICAgREVGQVVMVF9QUkVGSVgsIERFRkFVTFRfRElSRUNUT1JZLCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSk7CisKKyAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICBpZiAoc291cmNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBzb3VyY2UtPmZvcm1hdCgpOworICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGF1ZGlvRmlsZUhhbmRsZXIuY3JlYXRlKAorICAgICAgICAgICAgLy8gdGhpcyBmdW5jdG9yIG11c3Qgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBzdGFjaworICAgICAgICAgICAgW2ZpcnN0UmVhZCwgc2lua1NvdXJjZV0gKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lcykgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsUmVhZCA9PSAoc3NpemVfdClPVkVSUlVOICYmIGZpcnN0UmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjaGVjayBvbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFJlYWQ7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCksCisgICAgICAgICAgICBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCksCisgICAgICAgICAgICBmb3JtYXQubUZvcm1hdCwKKyAgICAgICAgICAgIHN1ZmZpeCk7CisKKyAgICBpZiAoZmQgPj0gMCAmJiBmaWxlbmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgd3JvdGUgdG8gJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgIH0KK30KKworLyogc3RhdGljICovCitOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Ok5CQUlPX1NpbmtTb3VyY2UgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjptYWtlU2lua1NvdXJjZSgKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpCit7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQubUZvcm1hdCkpIHsKKyAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKGZyYW1lcywgZm9ybWF0KTsKKyAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKKyAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZVJlYWRlciBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHtwaXBlLCBwaXBlUmVhZGVyfTsKKyAgICB9CitleGl0OgorICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gZmFsc2U7CisgICAgcmV0dXJuIHtudWxscHRyLCBudWxscHRyfTsKK30KKworc3RkOjpzdHJpbmcgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBnZW5lcmF0ZUZpbGVuYW1lKHN1ZmZpeCk7CisKKyAgICBpZiAobVRocmVhZFBvb2wubGF1bmNoKHN0ZDo6c3RyaW5nKCJjcmVhdGUgIikgKyBmaWxlbmFtZSwKKyAgICAgICAgICAgIFs9XSgpIHsgcmV0dXJuIGNyZWF0ZUludGVybmFsKHJlYWRlciwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGZpbGVuYW1lKTsgfSkKKyAgICAgICAgICAgID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkKK3sKKyAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQoZGlyZWN0b3J5KSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHN0ZDo6ZmlsZXN5c3RlbSBpbiBDKysxNworICAgIERJUiAqZGlyID0gb3BlbmRpcihkaXJlY3RvcnkuY19zdHIoKSk7CisKKyAgICBpZiAoZGlyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJXMiLCBfX2Z1bmNfXywgZGlyZWN0b3J5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCB0b1JlbW92ZSA9IDA7CisgICAgZGVjbHR5cGUobUZpbGVzKSBmaWxlczsKKworICAgIHdoaWxlIChmaWxlcy5zaXplKCkgPCBNQVhfRklMRVNfUkVBRCkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAiJXM6IHJlYWRkaXIgZmFpbHVyZSAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgaXQgYSBtYW5hZ2VkIGZpbGVuYW1lPworICAgICAgICBpZiAoIWlzTWFuYWdlZEZpbGVuYW1lKHJlc3VsdC0+ZF9uYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsZXMuZW1wbGFjZV9iYWNrKHJlc3VsdC0+ZF9uYW1lKTsKKyAgICB9CisgICAgKHZvaWQpY2xvc2VkaXIoZGlyKTsKKworICAgIC8vIE9QVElNSVpBVElPTjogd2UgZG9uJ3QgbmVlZCB0byBzdGF0IGVhY2ggZmlsZSwgdGhlIGZpbGVuYW1lcyBuYW1lcyBhcmUKKyAgICAvLyBhbHJlYWR5IChyb3VnaGx5KSBvcmRlcmVkIGJ5IGNyZWF0aW9uIGRhdGUuICB3ZSB1c2Ugc3RkOjpkZXF1ZSBpbnN0ZWFkCisgICAgLy8gb2Ygc3RkOjpzZXQgZm9yIGZhc3RlciBpbnNlcnRpb24gYW5kIHNvcnRpbmcgdGltZXMuCisKKyAgICBpZiAoZmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgLy8gcmVtb3ZlZCBmaWxlcyBjYW4gdXNlIGEgcGFydGl0aW9uIChubyBuZWVkIHRvIGRvIGEgZnVsbCBzb3J0KS4KKyAgICAgICAgdG9SZW1vdmUgPSBmaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKyAgICAgICAgc3RkOjpudGhfZWxlbWVudChmaWxlcy5iZWdpbigpLCBmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUgLSAxLCBmaWxlcy5lbmQoKSk7CisgICAgfQorCisgICAgLy8ga2VwdCBmaWxlcyBtdXN0IGJlIHNvcnRlZC4KKyAgICBzdGQ6OnNvcnQoZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLCBmaWxlcy5lbmQoKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgbURpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICAgICAgbUZpbGVzID0gc3RkOjptb3ZlKGZpbGVzKTsKKyAgICB9CisKKyAgICBpZiAodG9SZW1vdmUgPiAwKSB7IC8vIGxhdW5jaCBhIGNsZWFuIGluIGJhY2tncm91bmQuCisgICAgICAgICh2b2lkKW1UaHJlYWRQb29sLmxhdW5jaCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiY2xlYW5pbmcgIikgKyBkaXJlY3RvcnksIFt0aGlzXSgpIHsgcmV0dXJuIGNsZWFuKCk7IH0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNsZWFuKHN0ZDo6c3RyaW5nICpkaXJlY3RvcnkpCit7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzVG9SZW1vdmU7CisgICAgc3RkOjpzdHJpbmcgZGlyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQobURpcmVjdG9yeSkpIHJldHVybiBOT19JTklUOworCisgICAgICAgIGRpciA9IG1EaXJlY3Rvcnk7CisgICAgICAgIGlmIChtRmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgICAgIHNpemVfdCB0b1JlbW92ZSA9IG1GaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKworICAgICAgICAgICAgLy8gdXNlIG1vdmUgYW5kIGVyYXNlIHRvIGVmZmljaWVudGx5IHRyYW5zZmVyIHN0ZDo6c3RyaW5nCisgICAgICAgICAgICBzdGQ6Om1vdmUobUZpbGVzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihmaWxlc1RvUmVtb3ZlKSk7CisgICAgICAgICAgICBtRmlsZXMuZXJhc2UobUZpbGVzLmJlZ2luKCksIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlycCA9IGRpciArICIvIjsKKyAgICAvLyByZW1vdmUgZmlsZXMgb3V0c2lkZSBvZiBsb2NrIGZvciBiZXR0ZXIgY29uY3VycmVuY3kuCisgICAgZm9yIChjb25zdCBhdXRvICZmaWxlIDogZmlsZXNUb1JlbW92ZSkgeworICAgICAgICAodm9pZCl1bmxpbmsoKGRpcnAgKyBmaWxlKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gdGhlIGRpcmVjdG9yeSBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICpkaXJlY3RvcnkgPSBkaXI7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6VGhyZWFkUG9vbDo6bGF1bmNoKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKQoreworICAgIGlmIChtVGhyZWFkUG9vbFNpemUgPiAxKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPj0gbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlcy5iZWdpbigpOyBpdCAhPSBtRnV0dXJlcy5lbmQoKTspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+ICZmdXR1cmUgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmICghZnV0dXJlLnZhbGlkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtRnV0dXJlcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgbm90IHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpIDwgbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmVycmVkIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1GdXR1cmVzLmVtcGxhY2VfYmFjayhuYW1lLCBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgZnVuYykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogaW1tZWRpYXRlIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gZnVuYygpOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgLy8gQXR0ZW1wdCB0byBjaG9vc2UgdGhlIGJlc3QgbWF0Y2hpbmcgZmlsZSBmb3JtYXQuCisgICAgLy8gV2UgY2FuIGNob29zZSBhbnkgc2ZfZm9ybWF0CisgICAgLy8gYnV0IHdyaXRlRm9ybWF0IG11c3QgYmUgb25lIG9mIDE2LCAzMiwgZmxvYXQKKyAgICAvLyBkdWUgdG8gc2Zfd3JpdGVmIGNvbXBhdGliaWxpdHkuCisgICAgaW50IHNmX2Zvcm1hdDsKKyAgICBhdWRpb19mb3JtYXRfdCB3cml0ZUZvcm1hdDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzE2OworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8xNiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8zMjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMzIgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfRkxPQVQ7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fRkxPQVQgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gaGFuZGxlIGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKCkgZm9ybWF0cy4KKyAgICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQgZm9ybWF0cyBhcyBzaW5nbGUgYnl0ZSBmaWxlcy4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJlY3Rvcnk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xlYW4oJmRpcmVjdG9yeSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGQ6OnN0cmluZyBkaXJQcmVmaXggPSBkaXJlY3RvcnkgKyAiLyI7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gZGlyUHJlZml4ICsgZmlsZW5hbWU7CisKKyAgICAvKiBjb25zdCAqLyBTRl9JTkZPIGluZm8gPSB7CisgICAgICAgIC5mcmFtZXMgPSAwLAorICAgICAgICAuc2FtcGxlcmF0ZSA9IChpbnQpc2FtcGxlUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxzID0gKGludCljaGFubmVsQ291bnQsCisgICAgICAgIC5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgc2ZfZm9ybWF0LAorICAgIH07CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKHBhdGguY19zdHIoKSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbCA9IDA7CisgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKEZSQU1FU19QRVJfUkVBRCAqIHN0ZDo6bWF4KAorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh3cml0ZUZvcm1hdCksIC8vb3V0cHV0IGZyYW1lc2l6ZQorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSk7IC8vIGlucHV0IGZyYW1lc2l6ZQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFJlYWQgPSByZWFkZXIoYnVmZmVyLCBGUkFNRVNfUEVSX1JFQUQpOworICAgICAgICBpZiAoYWN0dWFsUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgaW5wdXQgZm9ybWF0IHRvIHdyaXRlRm9ybWF0IGFzIG5lZWRlZC4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSB3cml0ZUZvcm1hdCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB3cml0ZUZvcm1hdCwgYnVmZmVyLCBmb3JtYXQsIGFjdHVhbFJlYWQgKiBpbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgc3dpdGNoICh3cml0ZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9zaG9ydChzZiwgKGNvbnN0IGludDE2X3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2ludChzZiwgKGNvbnN0IGludDMyX3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfZmxvYXQoc2YsIChjb25zdCBmbG9hdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiAlcyB3cml0ZUZvcm1hdDogJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHdyaXRlRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIGVycm9yOiAlemQiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0b3RhbCArPSByZWFsbHlXcml0dGVuOworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IGFjdHVhbFJlYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgc2hvcnQgY291bnQ6ICV6ZCA8ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbiwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZl9jbG9zZShzZik7CisgICAgZnJlZShidWZmZXIpOworICAgIGlmICh0b3RhbCA9PSAwKSB7CisgICAgICAgICh2b2lkKXVubGluayhwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIC8vIFN1Y2Nlc3M6IGFkZCBvdXIgbmFtZSB0byBtYW5hZ2VkIGZpbGVzLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gd2VhayBzeW5jaHJvbml6YXRpb24gLSBvbmx5IHVwZGF0ZSBtRmlsZXMgaWYgdGhlIGRpcmVjdG9yeSBoYXNuJ3QgY2hhbmdlZC4KKyAgICAgICAgaWYgKG1EaXJlY3RvcnkgPT0gZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtRmlsZXMuZW1wbGFjZV9iYWNrKGZpbGVuYW1lKTsgIC8vIGFkZCB0byB0aGUgZW5kIHRvIHByZXNlcnZlIHNvcnQuCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyByZXR1cm4gZnVsbCBwYXRoCit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZm5kZWYgQU5EUk9JRF9OQkFJT19URUVfSAorI2RlZmluZSBBTkRST0lEX05CQUlPX1RFRV9ICisKKyNpZmRlZiBURUVfU0lOSworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoZSBOQkFJT19UZWUgdXNlcyB0aGUgTkJBSU8gUGlwZSBhbmQgUGlwZVJlYWRlciBmb3Igbm9uYmxvY2tpbmcKKyAqIGRhdGEgY29sbGVjdGlvbiwgZm9yIGV2ZW50dWFsIGR1bXAgdG8gbG9nIGZpbGVzLgorICogU2VlIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nIGZvciBob3cgdG8KKyAqIGVuYWJsZSBieSByby5kZWJ1Z2dhYmxlIGFuZCBhZi50ZWUgcHJvcGVydGllcy4KKyAqCisgKiBUaGUgd3JpdGUoKSBpbnRvIHRoZSBOQkFJT19UZWUgaXMgdGhlcmVmb3JlIG5vbmJsb2NraW5nLAorICogYnV0IGNoYW5naW5nIE5CQUlPX1RlZSBmb3JtYXRzIHdpdGggc2V0KCkgY2Fubm90IGJlIGRvbmUgZHVyaW5nIGEgd3JpdGUoKTsKKyAqIHVzdWFsbHkgdGhlIGNhbGxlciBhbHJlYWR5IGltcGxlbWVudHMgdGhpcyBtdXR1YWwgZXhjbHVzaW9uLgorICoKKyAqIEFsbCBvdGhlciBjYWxscyBleGNlcHQgc2V0KCkgdnMgd3JpdGUoKSBtYXkgb2NjdXIgYXQgYW55IHRpbWUuCisgKgorICogZHVtcCgpIGRpc3J1cHRpb24gaXMgbWluaW1pemVkIHRvIHRoZSBjYWxsZXIgc2luY2Ugc3lzdGVtIGNhbGxzIGFyZSBleGVjdXRlZAorICogaW4gYW4gYXN5bmNocm9ub3VzIHRocmVhZCAod2hlbiBwb3NzaWJsZSkuCisgKgorICogQ3VycmVudGx5IHRoZSBOQkFJT19UZWUgaXMgImhhcmR3aXJlZCIgZm9yIEF1ZGlvRmxpbmdlciBzdXBwb3J0LgorICoKKyAqIFNvbWUgQXVkaW9GbGluZ2VyIHNwZWNpZmljIG5vdGVzOgorICoKKyAqIDEpIFRlZXMgY2FwdHVyZSBvbmx5IGxpbmVhciBQQ00gZGF0YS4KKyAqIDIpIFRlZXMgd2l0aG91dCBhbnkgZGF0YSB3cml0dGVuIGFyZSBjb25zaWRlcmVkIGVtcHR5IGFuZCBkbyBub3QgZ2VuZXJhdGUKKyAqICAgIGFueSBvdXRwdXQgZmlsZXMuCisgKiAyKSBPbmNlIGEgVGVlIGR1bXBzIGRhdGEsIGl0IGlzIGNvbnNpZGVyZWQgImVtcHRpZWQiIGFuZCBuZXcgZGF0YQorICogICAgbmVlZHMgdG8gYmUgd3JpdHRlbiBiZWZvcmUgYW5vdGhlciBUZWUgZmlsZSBpcyBnZW5lcmF0ZWQuCisgKiAzKSBUZWUgZmlsZSBmb3JtYXQgaXMKKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAxNiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICogICAgV0FWIGludGVnZXIgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVC4KKyAqICAgIFdBViBmbG9hdCBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICoKKyAqIElucHV0X1RocmVhZDoKKyAqIDEpIENhcHR1cmUgYnVmZmVyIGlzIHRlZWQgd2hlbiByZWFkIGZyb20gdGhlIEhBTCwgYmVmb3JlIHJlc2FtcGxpbmcgZm9yIHRoZSBBdWRpb1JlY29yZAorICogICAgY2xpZW50LgorICoKKyAqIE91dHB1dF9UaHJlYWQ6CisgKiAxKSBNaXhlclRocmVhZHMgd2lsbCB0ZWUgYXQgdGhlIEZhc3RNaXhlciBvdXRwdXQgKGlmIGl0IGhhcyBvbmUpIG9yIGF0IHRoZQorICogICAgTm9ybWFsTWl4ZXIgb3V0cHV0IChpZiBubyBGYXN0TWl4ZXIpLgorICogMikgRHVwbGljYXRpbmdUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IG1peGVkIGRhdGEuIEFwcGx5IGEgdGVlIG9uIHRoZSBkb3duc3RyZWFtIE91dHB1dFRyYWNrCisgKiAgICBvciBvbiB0aGUgdXBzdHJlYW0gcGxheWJhY2sgVHJhY2tzLgorICogMykgRGlyZWN0VGhyZWFkcyBhbmQgT2ZmbG9hZFRocmVhZHMgZG8gbm90IHRlZSBhbnkgZGF0YS4gVGhlIHVwc3RyZWFtIHRyYWNrCisgKiAgICAoaWYgbGluZWFyIFBDTSBmb3JtYXQpIG1heSBiZSB0ZWVkIHRvIGRpc2NvdmVyIGRhdGEuCisgKiA0KSBNbWFwVGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBUcmFja3M6CisgKiAxKSBSZWNvcmRUcmFja3MgYW5kIHBsYXliYWNrIFRyYWNrcyB0ZWUgYXMgZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIG9yCisgKiAgICByZWFkIGZyb20gdGhlIHNoYXJlZCBjbGllbnQtc2VydmVyIHRyYWNrIGJ1ZmZlciBieSB0aGUgYXNzb2NpYXRlZCBUaHJlYWRzLgorICogMikgVGhlIG1lY2hhbmlzbSBpcyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlciByZWxlYXNlKCkgc28gbGFyZ2Ugc3RhdGljIFRyYWNrCisgKiAgICBwbGF5YmFjayBtYXkgbm90IHNob3cgYW55IFRlZSBkYXRhIGRlcGVuZGluZyBvbiB3aGVuIGl0IGlzIHJlbGVhc2VkLgorICogMykgV2hlbiBhIHRyYWNrIGJlY29tZXMgaW5hY3RpdmUsIHRoZSBUaHJlYWQgd2lsbCB0cmlnZ2VyIGEgZHVtcC4KKyAqLworCitjbGFzcyBOQkFJT19UZWUgeworcHVibGljOgorICAgIC8qIFRFRV9GTEFHIGlzIHVzZWQgaW4gc2V0KCkgYW5kIG11c3QgbWF0Y2ggdGhlIGZsYWdzIGZvciB0aGUgYWYudGVlIHByb3BlcnR5CisgICAgICAgZ2l2ZW4gaW4gaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcKKyAgICAqLworICAgIGVudW0gVEVFX0ZMQUcgeworICAgICAgICBURUVfRkxBR19OT05FID0gMCwKKyAgICAgICAgVEVFX0ZMQUdfSU5QVVRfVEhSRUFEID0gKDEgPDwgMCksICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgaW5wdXQgKENhcHR1cmUpIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCA9ICgxIDw8IDEpLCAvLyB0cmVhdCBhcyBhIFRlZSBmb3Igb3V0cHV0IChQbGF5YmFjaykgVGhyZWFkcworICAgICAgICBURUVfRkxBR19UUkFDSyA9ICgxIDw8IDIpLCAgICAgICAgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciB0cmFja3MgKFJlY29yZCBhbmQgUGxheWJhY2spCisgICAgfTsKKworICAgIE5CQUlPX1RlZSgpCisgICAgICAgIDogbVRlZShzdGQ6Om1ha2Vfc2hhcmVkPE5CQUlPX1RlZUltcGw+KCkpCisgICAgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmFkZChtVGVlKTsKKyAgICB9CisKKyAgICB+TkJBSU9fVGVlKCkgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLnJlbW92ZShtVGVlKTsKKyAgICAgICAgZHVtcCgtMSwgIl9EVE9SIik7IC8vIGxvZyBhbnkgZGF0YSByZW1haW5pbmcgaW4gVGVlLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBzZXQgaXMgdXNlZCBmb3IgZGVmZXJyZWQgY29uZmlndXJhdGlvbiBvZiBUZWUuCisgICAgICoKKyAgICAgKiAgTWF5IGJlIGNhbGxlZCBhbnl0aW1lIGV4Y2VwdCBjb25jdXJyZW50bHkgd2l0aCB3cml0ZSgpLgorICAgICAqCisgICAgICogXHBhcmFtIGZvcm1hdCBOQkFJT19Gb3JtYXQgdXNlZCB0byBvcGVuIE5CQUlPIHBpcGVzCisgICAgICogXHBhcmFtIGZsYWdzIChodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZykKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19OT05FIHRvIGJ5cGFzcyBhZi50ZWUgcHJvcGVydHkgY2hlY2tzIChkZWZhdWx0KTsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19JTlBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIGlucHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBvdXRwdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX1RSQUNLIHRvIGNoZWNrIGFmLnRlZSBpZiB0cmFjayBsb2dnaW5nIHNldC4KKyAgICAgKiBccGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgdG8gb3BlbiB0aGUgTkJBSU8gcGlwZSAoc2V0IHRvIDAgdG8gdXNlIGRlZmF1bHQpLgorICAgICAqCisgICAgICogXHJldHVybgorICAgICAqICAgICAgICAgLSBOT19FUlJPUiBvbiBzdWNjZXNzIChvciBmb3JtYXQgdW5jaGFuZ2VkKQorICAgICAqICAgICAgICAgLSBCQURfVkFMVUUgaWYgZm9ybWF0IG9yIGZsYWdzIGludmFsaWQuCisgICAgICogICAgICAgICAtIFBFUk1JU1NJT05fREVOSUVEIGlmIGZsYWdzIG5vdCBhbGxvd2VkIGJ5IGFmLnRlZQorICAgICAqLworCisgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KGZvcm1hdCwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0KHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQpLCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgd3JpdGUgZGF0YSB0byB0aGUgdGVlLgorICAgICAqCisgICAgICogVGhpcyBjYWxsIGlzIGxvY2sgZnJlZSAoYXMgc2hhcmVkIHBvaW50ZXIgYW5kIE5CQUlPIGlzIGxvY2sgZnJlZSk7CisgICAgICogbWF5IGJlIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gYWxsIG1ldGhvZHMgZXhjZXB0IHNldCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciB0byB3cml0ZSB0byBwaXBlLgorICAgICAqIFxwYXJhbSBmcmFtZUNvdW50IGluIGZyYW1lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBwYXNzZWQgdG8gc2V0KCkKKyAgICAgKi8KKworICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgY29uc3QgeworICAgICAgICBtVGVlLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgIH0KKworICAgIC8qKiBzZXRzIFRlZSBpZCBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgZ2VuZXJhdGVkIGZpbGUgKHNob3VsZCBiZSB1bmlxdWUpLiAqLworICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CisgICAgICAgIG1UZWUtPnNldElkKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCB0aGUgYXVkaW8gY29udGVudCB3cml0dGVuIHRvIHRoZSBUZWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCBhbGwgVGVlcyBjdXJyZW50bHkgYWxpdmUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvKiogVGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlZSAtIHRoZSBsaWZldGltZSBpcyB0aHJvdWdoCisgICAgICAgIGEgc2hhcmVkIHBvaW50ZXIgc28gZGVzdHJ1Y3Rpb24gb2YgdGhlIE5CQUlPX1RlZSBjb250YWluZXIgbWF5IHByb2NlZWQKKyAgICAgICAgZXZlbiB0aG91Z2ggZHVtcGluZyBpcyBvY2N1cnJpbmcuICovCisgICAgY2xhc3MgTkJBSU9fVGVlSW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIFRFRV9GTEFHIGZsYWdzLCBzaXplX3QgZnJhbWVzKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHRlZUNvbmZpZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby5kZWJ1Z2dhYmxlIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eV9nZXRfaW50MzIoImFmLnRlZSIsIDApIDogMDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgb2YgVGVlCisgICAgICAgICAgICBjb25zdCBURUVfRkxBRyB0eXBlID0gVEVFX0ZMQUcoCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgKFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB8IFRFRV9GTEFHX09VVFBVVF9USFJFQUQgfCBURUVfRkxBR19UUkFDSykpOworCisgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgZmxhZ3MgY2FuJ3Qgc2VsZWN0IG11bHRpcGxlIHR5cGVzLgorICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9wb3Bjb3VudCh0eXBlKSA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0eXBlIGlzIHNldCwgd2UgY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHBlcm1pdHRlZCBieSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgaWYgKHR5cGUgIT0gMCAmJiAodHlwZSAmIHRlZUNvbmZpZykgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBmcmFtZXMgZm9yIFRlZQorICAgICAgICAgICAgaWYgKGZyYW1lcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgdmFyeWluZyBmcmFtZSBjb3VudCBiYXNlZCBvbiB0eXBlLgorICAgICAgICAgICAgICAgIGZyYW1lcyA9IERFRkFVTFRfVEVFX0ZSQU1FUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lcz8KKworICAgICAgICAgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgZm9ybWF0IGFuZCBmcmFtZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbUZvcm1hdCkgJiYgZnJhbWVzID09IG1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgYXV0byBzaW5rc291cmNlID0gbWFrZVNpbmtTb3VyY2UoZm9ybWF0LCBmcmFtZXMsICZlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gZW5hYmxlZCBpcyBzZXQgaWYgbWFrZVNpbmtTb3VyY2UgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIC8vIE5vdGU6IGFzIG1lbnRpb25lZCBpbiBOQkFJT19UZWU6OnNldCgpLCBkb24ndCBjYWxsIHNldCgpIHdoaWxlIHdyaXRlKCkgaXMKKyAgICAgICAgICAgIC8vIG9uZ29pbmcuCisgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsgLy8gY291bGQgZ2V0IHRoaXMgZnJvbSB0aGUgU2luay4KKyAgICAgICAgICAgICAgICBtRnJhbWVzID0gZnJhbWVzOworICAgICAgICAgICAgICAgIG1TaW5rU291cmNlID0gc3RkOjptb3ZlKHNpbmtzb3VyY2UpOworICAgICAgICAgICAgICAgIG1FbmFibGVkLnN0b3JlKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgaWYgKCFtRGF0YVJlYWR5LmV4Y2hhbmdlKGZhbHNlKSkgcmV0dXJuOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBzaW5rU291cmNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gbUlkICsgcmVhc29uOworICAgICAgICAgICAgICAgIHNpbmtTb3VyY2UgPSBtU2lua1NvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUZWUoZmQsIHNpbmtTb3VyY2UsIHN1ZmZpeCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmICghbUVuYWJsZWQubG9hZCgpIHx8IGZyYW1lQ291bnQgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgKHZvaWQpbVNpbmtTb3VyY2UuZmlyc3QtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRGF0YVJlYWR5LnN0b3JlKHRydWUpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBUUklDS1k6IFdlIG5lZWQgdG8ga2VlcCB0aGUgTkJBSU9fU2luayBhbmQgTkJBSU9fU291cmNlIGJvdGggYWxpdmUgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICAvLyBiZWNhdXNlIFBpcGVSZWFkZXIgaG9sZHMgYSBuYWtlZCByZWZlcmVuY2UgKG5vdCBhIHN0cm9uZyBvciB3ZWFrIHBvaW50ZXIpIHRvIFBpcGUuCisgICAgICAgIHVzaW5nIE5CQUlPX1NpbmtTb3VyY2UgPSBzdGQ6OnBhaXI8c3A8TkJBSU9fU2luaz4sIHNwPE5CQUlPX1NvdXJjZT4+OworCisgICAgICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlJiBzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKworICAgICAgICBzdGF0aWMgTkJBSU9fU2lua1NvdXJjZSBtYWtlU2lua1NvdXJjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCk7CisKKyAgICAgICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcworICAgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RFRV9GUkFNRVMgPSAweDIwMDAwMDsKKworICAgICAgICAvLyBhdG9taWMgc3RhdHVzIGNoZWNraW5nCisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1FbmFibGVke2ZhbHNlfTsKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbURhdGFSZWFkeXtmYWxzZX07CisKKyAgICAgICAgLy8gbG9ja2VkIGR1bXAgaW5mb3JtYXRpb24KKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnN0cmluZyBtSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBURUVfRkxBRyBtRmxhZ3MgPSBURUVfRkxBR19OT05FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19Gb3JtYXQgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOyAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBzaXplX3QgbUZyYW1lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19TaW5rU291cmNlIG1TaW5rU291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvKiogUnVubmluZ1RlZXMgdHJhY2tzIGN1cnJlbnQgcnVubmluZyB0ZWVzIGZvciBkdW1wIHB1cnBvc2VzLgorICAgICAgICBJdCBpcyBpbXBsZW1lbnRlZCB0byBoYXZlIG1pbmltYWwgbG9ja2VkIHJlZ2lvbnMsIHRvIGJlIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXIuICovCisgICAgY2xhc3MgUnVubmluZ1RlZXMgeworICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRighbVRlZXMuZW1wbGFjZSh0ZWUpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBhbHJlYWR5IGV4aXN0cyBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRihtVGVlcy5lcmFzZSh0ZWUpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgZG9lc24ndCBleGlzdCBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiB0ZWVzOyAvLyBzYWZlIHNuYXBzaG90IG9mIHRlZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHRlZXMuaW5zZXJ0KHRlZXMuZW5kKCksIG1UZWVzLmJlZ2luKCksIG1UZWVzLmVuZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGVlIDogdGVlcykgeworICAgICAgICAgICAgICAgIHRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiBtVGVlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLy8gc2luZ2xldG9uCisgICAgc3RhdGljIFJ1bm5pbmdUZWVzICZnZXRSdW5uaW5nVGVlcygpIHsKKyAgICAgICAgc3RhdGljIFJ1bm5pbmdUZWVzIHJ1bm5pbmdUZWVzOworICAgICAgICByZXR1cm4gcnVubmluZ1RlZXM7CisgICAgfQorCisgICAgLy8gVGhlIE5CQUlPIFRlZUltcGwgbWF5IGhhdmUgbGlmZXRpbWUgbG9uZ2VyIHRoYW4gTkJBSU9fVGVlIGlmCisgICAgLy8gUnVubmluZ1RlZXM6OmR1bXAoKSBpcyBiZWluZyBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIH5OQkFJT19UZWUoKS4KKyAgICAvLyBUaGlzIGlzIGFsbG93ZWQgZm9yIG1heGltdW0gY29uY3VycmVuY3kuCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+IG1UZWU7Cit9OyAvLyBOQkFJT19UZWUKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKKyNlbmRpZiAvLyAhQU5EUk9JRF9OQkFJT19URUVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGU1Y2I4YTIuLjY3NmE1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTI0LDggKzI0LDkgQEAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00OSwxMTEgKzUwLDc3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5nZXRBdWRpb1BvcnQocG9ydCk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5nZXRBdWRpb1BvcnQocG9ydCk7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuY3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaDo6Z2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byYgaXRlciA9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmZpbmQobVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaXRlciAhPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdldExhdGVuY3lNcyhsYXRlbmN5TXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6flBhdGNoUGFuZWwoKQotewogfQogCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigiZ2V0QXVkaW9Qb3J0Iik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKICAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogCi0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAotICAgICAgICAgICAgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikgfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICBpZiAoIWF1ZGlvX3BhdGNoX2lzX3ZhbGlkKHBhdGNoKSB8fCAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBsaW1pdCBudW1iZXIgb2Ygc291cmNlcyB0byAxIGZvciBub3cgb3IgMiBzb3VyY2VzIGZvciBzcGVjaWFsIGNyb3NzIGh3IG1vZHVsZSBjYXNlLgpAQCAtMTYzLDgxICsxMzAsNzMgQEAKICAgICB9CiAKICAgICBpZiAoKmhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7ICpoYW5kbGUgIT0gMCAmJiBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKCpoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCAqaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSBtUGF0Y2hlc1tpbmRleF0tPm1IYWxIYW5kbGU7Ci0gICAgICAgICAgICAgICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCi0gICAgICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCi0gICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAotICAgICAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCi0gICAgICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKLSAgICAgICAgICAgICAgICBpZiAoaGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXRjaC0+bnVtX3NpbmtzID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChod01vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZCgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsIF9fZnVuY19fLCAqaGFuZGxlKTsKKyAgICAgICAgICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCisgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCisgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKKyAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZvbGRQYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAob2xkUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKGh3TW9kdWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaHdEZXZpY2UgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoKmhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQYXRjaCAqbmV3UGF0Y2ggPSBuZXcgUGF0Y2gocGF0Y2gpOworICAgIFBhdGNoIG5ld1BhdGNoeypwYXRjaH07CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGluc2VydGVkTW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogCiAgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoIWF1ZGlvSHdEZXZpY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgaWYgY29ubmVjdGlvbiB0byBhIG1peCBvciBhY3Jvc3MgSFcgbW9kdWxlcwogICAgICAgICAgICAgICAgIGlmICgocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIG11bHRpcGxlIHNpbmtzIGZvciBtaXggb3IgYWNyb3NzIG1vZHVsZXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gcmVqZWN0IGNvbm5lY3Rpb24gdG8gZGlmZmVyZW50IHNpbmsgdHlwZXMKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gcGF0Y2gtPnNpbmtzWzBdLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTIsNDIgKzIxMSw1NiBAQAogICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB8fAogICAgICAgICAgICAgICAgICAgIWF1ZGlvSHdEZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpKSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIFN0cmluZzggb3V0cHV0RGV2aWNlQWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyAhPSAwICYmIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5od19tb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGlzIHJldXNlZCwgc28gaXQgaXMgbm90IGNsb3NlZCB3aGVuIHBhdGNoIGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSwgZmFsc2UgLypjbG9zZVRocmVhZCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zaW5rc1swXS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHBhdGNoLT5zaW5rc1swXS5mbGFncy5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgpIHJldHVybmVkICVwIiwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwpAQCAtMjk3LDUyICsyNzAsNjcgQEAKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmZvcm1hdCgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKCkgcmV0dXJuZWQgJXAgaW5DaGFubmVsTWFzayAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVJlY29yZC5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxSZWNvcmRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXdQYXRjaC5jcmVhdGVDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRNb2R1bGUgPSBhdWRpb0h3RGV2aWNlLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIGlucHV0IGFzIHNpbmsgaWYgYW55CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQubUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtMzU2LDkgKzM0NCw5IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyY01vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2Niw4ICszNTQsOCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbaV0udHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTM3OSwzMTkgKzM2Nyw0NDcgQEAKICAgICAgICAgICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZWFkID09IGF1ZGlvZmxpbmdlci0+cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgeworICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBtQXVkaW9GbGluZ2VyLnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KXR5cGUpOwogCi0gICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworCisgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIG91dHB1dCBhcyBzb3VyY2UgaWYgYW55CisgICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlID09IHRocmVhZC0+aWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgIH0KIGV4aXQ6Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIEFMT0dWKCIlcygpIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgYXVkaW9mbGluZ2VyLT5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7Ci0gICAgICAgIG5ld1BhdGNoLT5tSGFuZGxlID0gKmhhbmRsZTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7Ci0gICAgICAgIG1QYXRjaGVzLmFkZChuZXdQYXRjaCk7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCAqaGFuZGxlLCBoYWxIYW5kbGUpOworICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBtQXVkaW9GbGluZ2VyLm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKKyAgICAgICAgbmV3UGF0Y2gubUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKKyAgICAgICAgbVBhdGNoZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpoYW5kbGUsIHN0ZDo6bW92ZShuZXdQYXRjaCkpKTsKKyAgICAgICAgaWYgKGluc2VydGVkTW9kdWxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKGluc2VydGVkTW9kdWxlLCAqaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXMoKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsIF9fZnVuY19fLCAqaGFuZGxlLCBoYWxIYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCk7Ci0gICAgICAgIGRlbGV0ZSBuZXdQYXRjaDsKKyAgICAgICAgbmV3UGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpCitBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjp+UGF0Y2goKQoreworICAgIEFMT0dFX0lGKGlzU29mdHdhcmUoKSwgIlNvZnR3YXJlIHBhdGNoIGNvbm5lY3Rpb25zIGxlYWtlZCAlZCAlZCIsCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZSgpLCBtUGxheWJhY2suaGFuZGxlKCkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpjcmVhdGVDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkKIHsKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggc3ViUGF0Y2g7Ci0gICAgc3ViUGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHN1YlBhdGNoLnNvdXJjZXNbMF0gPSBhdWRpb1BhdGNoLT5zb3VyY2VzWzBdOwotICAgIHN1YlBhdGNoLm51bV9zaW5rcyA9IDE7Ci0KLSAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zaW5rc1swXSk7Ci0gICAgc3ViUGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0pLgorICAgICAgICAgICAgICAgIGFkZFNpbmsobVJlY29yZC50aHJlYWQoKSwgeyAuc291cmNlID0gQVVESU9fU09VUkNFX01JQyB9KS5wYXRjaCgpLAorICAgICAgICAgICAgbVJlY29yZC5oYW5kbGVQdHIoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICptUmVjb3JkLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgIGlmIChhdWRpb1BhdGNoLT5udW1fc2lua3MgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBzdWJQYXRjaC5zaW5rc1swXSA9IGF1ZGlvUGF0Y2gtPnNpbmtzWzBdOwotICAgICAgICBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zaW5rcyAhPSAwKSB7CisgICAgICAgIHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtUGxheWJhY2sudGhyZWFkKCkpLmFkZFNpbmsobUF1ZGlvUGF0Y2guc2lua3NbMF0pLnBhdGNoKCksCisgICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZVB0cigpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKICAgICAvLyB1c2UgYSBwc2V1ZG8gTENNIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CiAgICAgaW50IHBsYXliYWNrU2hpZnQgPSBfX2J1aWx0aW5fY3R6KHBsYXliYWNrRnJhbWVDb3VudCk7Ci0gICAgc2l6ZV90IHJlY29yZEZyYW1lY291bnQgPSBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpOwotICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVjb3VudCk7CisgICAgc2l6ZV90IHJlY29yZEZyYW1lQ291bnQgPSBtUmVjb3JkLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CisgICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZUNvdW50KTsKICAgICBpZiAocGxheWJhY2tTaGlmdCA8IHNoaWZ0KSB7CiAgICAgICAgIHNoaWZ0ID0gcGxheWJhY2tTaGlmdDsKICAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSAocGxheWJhY2tGcmFtZUNvdW50ICogcmVjb3JkRnJhbWVjb3VudCkgPj4gc2hpZnQ7Ci0gICAgQUxPR1YoImNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBwbGF5ZnJhbWVDb3VudCAlenUgcmVjb3JkRnJhbWVjb3VudCAlenUgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVjb3VudCwgZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAocGxheWJhY2tGcmFtZUNvdW50ICogcmVjb3JkRnJhbWVDb3VudCkgPj4gc2hpZnQ7CisgICAgQUxPR1YoIiVzKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lQ291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lQ291bnQsIGZyYW1lQ291bnQpOwogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCByZWNvcmQgdHJhY2sgdG8gY2FwdHVyZSBmcm9tIHJlY29yZCB0aHJlYWQKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxDb3VudCgpOwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbE1hc2soKTsKLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsTWFzaygpOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtUGxheWJhY2sudGhyZWFkKCktPnNhbXBsZVJhdGUoKTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBtUGxheWJhY2sudGhyZWFkKCktPmZvcm1hdCgpOwogCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksCisgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgPSBtUmVjb3JkLnRocmVhZCgpLT5mb3JtYXQoKTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oaW5wdXRGb3JtYXQpKSB7CisgICAgICAgIC8vIFRoZSBwbGF5YmFja1RocmVhZCBmb3JtYXQgd2lsbCBzYXkgUENNIGZvciBJRUM2MTkzNyBwYWNrZXRpemVkIHN0cmVhbS4KKyAgICAgICAgLy8gVXNlIHJlY29yZFRocmVhZCBmb3JtYXQuCisgICAgICAgIGZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIH0KKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGlucHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSBtUmVjb3JkLnRocmVhZCgpLT5zYW1wbGVSYXRlKCkgJiYKKyAgICAgICAgICAgIGluQ2hhbm5lbE1hc2sgPT0gbVJlY29yZC50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+ZmFzdFRyYWNrQXZhaWxhYmxlKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmhhc0Zhc3RDYXB0dXJlKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcmVjb3JkIHRocmVhZCBoYXMgZmFzdCBjYXB0dXJlIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGZhc3QgbW9kZSB3aGVuIHRoZXJlIGlzIG5vIHJlc2FtcGxlIG5lZWRlZC4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmFzdCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjYXNlLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHRlbXBSZWNvcmRUcmFjayA9IG5ldyAoc3RkOjpub3Rocm93KSBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmxhZ3MpOworICAgIHN0YXR1cyA9IG1SZWNvcmQuY2hlY2tUcmFjayh0ZW1wUmVjb3JkVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmFkZFBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNpbmtzWzBdLmZsYWdzLm91dHB1dCA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1BBVENIOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc291cmNlcyA9PSAyICYmIG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIC8vICJyZXVzZSBvbmUgZXhpc3Rpbmcgb3V0cHV0IG1peCIgY2FzZQorICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvUGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtOworICAgIH0KKyAgICBpZiAobVBsYXliYWNrLnRocmVhZCgpLT5oYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgb3V0cHV0RmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChvdXRwdXRGbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgIH0KIAogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcGxheWJhY2sgdHJhY2sgdG8gcmVuZGVyIHRvIHBsYXliYWNrIHRocmVhZC4KICAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCi0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9QYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtLAorICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiB0ZW1wUGF0Y2hUcmFjayA9IG5ldyAoc3RkOjpub3Rocm93KSBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2sudGhyZWFkKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoVHJhY2stPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXJTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MpOworICAgIHN0YXR1cyA9IG1QbGF5YmFjay5jaGVja1RyYWNrKHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKIAogICAgIC8vIHRpZSBwbGF5YmFjayBhbmQgcmVjb3JkIHRyYWNrcyB0b2dldGhlcgotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoVHJhY2suZ2V0KCkpOwotICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hSZWNvcmQuZ2V0KCkpOworICAgIG1SZWNvcmQuc2V0VHJhY2tBbmRQZWVyKHRlbXBSZWNvcmRUcmFjaywgdGVtcFBhdGNoVHJhY2suZ2V0KCkpOworICAgIG1QbGF5YmFjay5zZXRUcmFja0FuZFBlZXIodGVtcFBhdGNoVHJhY2ssIHRlbXBSZWNvcmRUcmFjay5nZXQoKSk7CiAKICAgICAvLyBzdGFydCBjYXB0dXJlIGFuZCBwbGF5YmFjawotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIEFVRElPX1NFU1NJT05fTk9ORSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdGFydCgpOworICAgIG1SZWNvcmQudHJhY2soKS0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKKyAgICBtUGxheWJhY2sudHJhY2soKS0+c3RhcnQoKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpjbGVhckNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBBTE9HVigiJXMoKSBtUmVjb3JkLmhhbmRsZSAlZCBtUGxheWJhY2suaGFuZGxlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUmVjb3JkLmhhbmRsZSgpLCBtUGxheWJhY2suaGFuZGxlKCkpOworICAgIG1SZWNvcmQuc3RvcFRyYWNrKCk7CisgICAgbVBsYXliYWNrLnN0b3BUcmFjaygpOworICAgIG1SZWNvcmQuY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7CisgICAgbVBsYXliYWNrLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgaWYgKCFpc1NvZnR3YXJlKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcmVjb3JkVHJhY2sgPSBtUmVjb3JkLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHJlY29yZFRyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcGxheWJhY2tUcmFjayA9IG1QbGF5YmFjay5jb25zdF90cmFjaygpOworICAgIGlmIChwbGF5YmFja1RyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIC8vIExhdGVuY3kgaW5mb3JtYXRpb24gZm9yIHRyYWNrcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgb2J0YWluaW5nCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdGhyZWFkIGxvY2suCisgICAgLy8KKyAgICAvLyBXZSB1c2UgcmVjb3JkIHNlcnZlciBsYXRlbmN5ICsgcGxheWJhY2sgdHJhY2sgbGF0ZW5jeSAoZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbiB0aGUKKyAgICAvLyByZXZlcnNlIGR1ZSB0byBpbnRlcm5hbCBiaWFzZXMpLgorICAgIC8vCisgICAgLy8gVE9ETzogaXMgdGhpcyBzdGFibGUgZW5vdWdoPyBDb25zaWRlciBhIFBhdGNoVHJhY2sgc3luY2hyb25pemVkIHZlcnNpb24gb2YgdGhpcy4KKworICAgIC8vIEZvciBQQ00gdHJhY2tzIGdldCBzZXJ2ZXIgbGF0ZW5jeS4KKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShyZWNvcmRUcmFjay0+Zm9ybWF0KCkpKSB7CisgICAgICAgIGRvdWJsZSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMsIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0U2VydmVyTGF0ZW5jeU1zKCZyZWNvcmRTZXJ2ZXJMYXRlbmN5TXMpID09IE9LCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tUcmFjay0+Z2V0VHJhY2tMYXRlbmN5TXMoJnBsYXliYWNrVHJhY2tMYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gcmVjb3JkU2VydmVyTGF0ZW5jeU1zICsgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICVkIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICAvLyBTZWUgaWYga2VybmVsIGxhdGVuY2llcyBhcmUgYXZhaWxhYmxlLgorICAgIC8vIElmIHNvLCBkbyBhIGZyYW1lIGRpZmYgYW5kIHRpbWUgZGlmZmVyZW5jZSBjb21wdXRhdGlvbiB0byBlc3RpbWF0ZQorICAgIC8vIHRoZSB0b3RhbCBwYXRjaCBsYXRlbmN5LiBUaGlzIHJlcXVpcmVzIHRoYXQgZnJhbWUgY291bnRzIGFyZSByZXBvcnRlZCBieSB0aGUKKyAgICAvLyBIQUwgYXJlIG1hdGNoZWQgcHJvcGVybHkgaW4gdGhlIGNhc2Ugb2YgcmVjb3JkIG92ZXJydW5zIGFuZCBwbGF5YmFjayB1bmRlcnJ1bnMuCisgICAgVGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpGcmFtZVRpbWUgcmVjb3JkRlR7fSwgcGxheUZUe307CisgICAgcmVjb3JkVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcmVjb3JkRlQpOworICAgIHBsYXliYWNrVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcGxheUZUKTsKKyAgICBpZiAocmVjb3JkRlQudGltZU5zID4gMCAmJiBwbGF5RlQudGltZU5zID4gMCkgeworICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lRGlmZiA9IHJlY29yZEZULmZyYW1lcyAtIHBsYXlGVC5mcmFtZXM7CisgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZOcyA9IHJlY29yZEZULnRpbWVOcyAtIHBsYXlGVC50aW1lTnM7CiAKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHRyYWNrIGFuZCBwYXRjaCByZWNvcmQgaGF2ZSBhIGxhcmdlIHRpbWUgZGlzcGFyaXR5IGJlY2F1c2UKKyAgICAgICAgLy8gb25lIHRocmVhZCBydW5zIGJ1dCBhbm90aGVyIGlzIHN0b3BwZWQuICBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIG1heGltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIHRpbWUgZGlmZmVyZW5jZSBiYXNlZCBvbiBob3cgb2Z0ZW4gd2UgZXhwZWN0IHRoZSB0aW1lc3RhbXBzIHRvIHVwZGF0ZSBpbiBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIC8vICh0eXBpY2FsIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gNTAgbXMpLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgdGltZXN0YW1wcyBhcmVuJ3Qgc2FtcGxlZCBjbG9zZSBlbm91Z2gsIHRoZSBwYXRjaCBsYXRlbmN5IGlzIG5vdAorICAgICAgICAvLyBjb25zaWRlcmVkIHZhbGlkLgorICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBiYXNlZCBvbiBtb3JlIGV4cGVyaW1lbnRzLgorICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBtYXhWYWxpZFRpbWVEaWZmTnMgPSAyMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgIGlmIChzdGQ6OmFicyh0aW1lRGlmZk5zKSA8IG1heFZhbGlkVGltZURpZmZOcykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IGZyYW1lRGlmZiAqIDFlMyAvIHJlY29yZFRyYWNrLT5zYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAtIHRpbWVEaWZmTnMgKiAxZS02OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VJbnB1dEludGVybmFsX2wocGF0Y2gtPm1SZWNvcmRUaHJlYWQpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG51bSBzb3VyY2VzID09IDIgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIHNvIHdlIGRvIG5vdCBjbG9zZSBpdAotICAgICAgICBpZiAocGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zb3VyY2VzICE9IDIpIHsKLSAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KIAorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpkdW1wKGF1ZGlvX3BhdGNoX2hhbmRsZV90IG15SGFuZGxlKSBjb25zdAoreworICAgIC8vIFRPRE86IENvbnNpZGVyIHRhYmxlIGR1bXAgZm9ybSBmb3IgcGF0Y2hlcywganVzdCBsaWtlIHRyYWNrcy4KKyAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiUGF0Y2ggJWQ6IHRocmVhZCAlcCA9PiB0aHJlYWQgJXAiLAorICAgICAgICAgICAgbXlIYW5kbGUsIG1SZWNvcmQuY29uc3RfdGhyZWFkKCkuZ2V0KCksIG1QbGF5YmFjay5jb25zdF90aHJlYWQoKS5nZXQoKSk7CisKKyAgICAvLyBhZGQgbGF0ZW5jeSBpZiBpdCBleGlzdHMKKyAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgIGlmIChnZXRMYXRlbmN5TXMoJmxhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5OiAlLjJsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHNpemVfdCBpbmRleDsKIAotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAoaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IG1QYXRjaGVzLnNpemUoKSkgeworICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXRlciA9PSBtUGF0Y2hlcy5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2g7Ci0KLSAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgJnNyYyA9IHBhdGNoLnNvdXJjZXNbMF07CisgICAgc3dpdGNoIChzcmMudHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CisgICAgICAgICAgICBpZiAoaHdEZXZpY2UgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHBhdGNoLnNpbmtzWzBdLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tSZWNvcmRUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0Lm1peC5od19tb2R1bGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0Lm1peC5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBzcmMuZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOworICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIpOworICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGhhbmRsZSk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcygKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdAogewotICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWciKTsKLQotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAobW9kdWxlLnNlY29uZC5zdHJlYW1zLmNvdW50KHN0cmVhbSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2hIYW5kbGUgOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBwYXRjaF9pdGVyID0gbVBhdGNoZXMuZmluZChwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoX2l0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0Y2ggJnBhdGNoID0gcGF0Y2hfaXRlci0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLT5lbXBsYWNlX2JhY2soKnRoaXMsIHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1QbGF5YmFjay5jb25zdF90aHJlYWQoKS0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUmVjb3JkLmNvbnN0X3RocmVhZCgpLT5pZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU3RhbGUgcGF0Y2ggaGFuZGxlIGluIHRoZSBjYWNoZTogJWQiLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQorICAgIC8vIFRoZSBzdHJlYW0gaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgaW5zZXJ0ZWQgbW9kdWxlcy4KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQogCi0gICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbU9wZW5lZCgKKyAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGlmIChhdWRpb0h3RGV2aWNlLT5pc0luc2VydCgpKSB7CisgICAgICAgIG1JbnNlcnRlZE1vZHVsZXNbYXVkaW9Id0RldmljZS0+aGFuZGxlKCldLnN0cmVhbXMuaW5zZXJ0KHN0cmVhbSk7CiAgICAgfQorfQogCi0gICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZXJhc2Uoc3RyZWFtKTsKKyAgICB9Cit9CisKK0F1ZGlvSHdEZXZpY2UqIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIGlmIChtb2R1bGUgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSByZXR1cm4gbnVsbHB0cjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInNldEF1ZGlvUG9ydENvbmZpZygpIGJhZCBodyBtb2R1bGUgJWQiLCBtb2R1bGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Cit9CisKK3NwPERldmljZUhhbEludGVyZmFjZT4gQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKG1vZHVsZSk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UgPyBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpIDogbnVsbHB0cjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1JbnNlcnRlZE1vZHVsZXNbbW9kdWxlXS5zd19wYXRjaGVzLmluc2VydChoYW5kbGUpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVyYXNlKGhhbmRsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBwYXRjaFBhbmVsRHVtcDsKKyAgICBjb25zdCBjaGFyICppbmRlbnQgPSAiICAiOworCisgICAgLy8gT25seSBkdW1wIHNvZnR3YXJlIHBhdGNoZXMuCisgICAgYm9vbCBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAgKz0gIlxuU29mdHdhcmUgcGF0Y2hlczpcbiI7CisgICAgICAgICAgICAgICAgaGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcC5hcHBlbmRGb3JtYXQoIiVzJXNcbiIsIGluZGVudCwgaXRlci5zZWNvbmQuZHVtcChpdGVyLmZpcnN0KS5zdHJpbmcoKSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKCFtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZW1wdHkoKSB8fCAhbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblRyYWNrZWQgaW5zZXJ0ZWQgbW9kdWxlczpcbiI7CisgICAgICAgICAgICAgICAgaGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmc4IG1vZHVsZUR1bXAgPSBTdHJpbmc4Ojpmb3JtYXQoIk1vZHVsZSAlZDogSS9PIGhhbmRsZXM6ICIsIG1vZHVsZS5maXJzdCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1vZHVsZS5zZWNvbmQuc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmQoIjsgU1cgUGF0Y2hlczogIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHBhdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBtb2R1bGVEdW1wLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcGF0Y2hQYW5lbER1bXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCBwYXRjaFBhbmVsRHVtcC5zdHJpbmcoKSwgcGF0Y2hQYW5lbER1bXAuc2l6ZSgpKTsKKyAgICB9CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCmluZGV4IGQzN2MwZDMuLjYxMjg1NWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtMTksMTMgKzE5LDMzIEBACiAgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAogI2VuZGlmCiAKLWNsYXNzIFBhdGNoUGFuZWwgOiBwdWJsaWMgUmVmQmFzZSB7CisKKy8vIFBhdGNoUGFuZWwgaXMgY29uY2VhbGVkIHdpdGhpbiBBdWRpb0ZsaW5nZXIsIHRoZWlyIGxpZmV0aW1lcyBhcmUgdGhlIHNhbWUuCitjbGFzcyBQYXRjaFBhbmVsIHsKIHB1YmxpYzoKKyAgICBjbGFzcyBTb2Z0d2FyZVBhdGNoIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBQYXRjaFBhbmVsICZwYXRjaFBhbmVsLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBwbGF5YmFja1RocmVhZEhhbmRsZSwgYXVkaW9faW9faGFuZGxlX3QgcmVjb3JkVGhyZWFkSGFuZGxlKQorICAgICAgICAgICAgICAgIDogbVBhdGNoUGFuZWwocGF0Y2hQYW5lbCksIG1QYXRjaEhhbmRsZShwYXRjaEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRIYW5kbGUocGxheWJhY2tUaHJlYWRIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZEhhbmRsZShyZWNvcmRUaHJlYWRIYW5kbGUpIHt9CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKKyAgICAgICAgU29mdHdhcmVQYXRjaCYgb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CiAKLSAgICBjbGFzcyBQYXRjaDsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgdW5kZXIgQXVkaW9GbGluZ2VyOjptTG9jaworICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3Q7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QbGF5YmFja1RocmVhZEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UmVjb3JkVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZFRocmVhZEhhbmRsZTsgfTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFBhdGNoUGFuZWwgJm1QYXRjaFBhbmVsOworICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1QbGF5YmFja1RocmVhZEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVJlY29yZFRocmVhZEhhbmRsZTsKKyAgICB9OwogCi0gICAgZXhwbGljaXQgUGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpOwotICAgIHZpcnR1YWwgflBhdGNoUGFuZWwoKTsKKyAgICBleHBsaWNpdCBQYXRjaFBhbmVsKEF1ZGlvRmxpbmdlciogYXVkaW9GbGluZ2VyKSA6IG1BdWRpb0ZsaW5nZXIoKmF1ZGlvRmxpbmdlcikge30KIAogICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC00NSw0NiArNjUsMTU2IEBACiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOwogCi0gICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgLy8gUmV0cmlldmVzIGFsbCBjdXJyZW50bHkgZXN0cmFibGlzaGVkIHNvZnR3YXJlIHBhdGNoZXMgZm9yIGEgc3RyZWFtCisgICAgLy8gb3BlbmVkIG9uIGFuIGludGVybWVkaWF0ZSBtb2R1bGUuCisgICAgc3RhdHVzX3QgZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCk7Ci0gICAgdm9pZCBjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKTsKKyAgICAvLyBOb3RpZmllcyBwYXRjaCBwYW5lbCBhYm91dCBhbGwgb3BlbmVkIGFuZCBjbG9zZWQgc3RyZWFtcy4KKyAgICB2b2lkIG5vdGlmeVN0cmVhbU9wZW5lZChBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworICAgIHZvaWQgbm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaHJlYWRUeXBlLCB0eXBlbmFtZSBUcmFja1R5cGU+CisgICAgY2xhc3MgRW5kcG9pbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CisgICAgICAgIEVuZHBvaW50KGNvbnN0IEVuZHBvaW50JikgPSBkZWxldGU7CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oY29uc3QgRW5kcG9pbnQmKSA9IGRlbGV0ZTsKKyAgICAgICAgRW5kcG9pbnQoRW5kcG9pbnQmJiBvdGhlcikgbm9leGNlcHQgeyBzd2FwKG90aGVyKTsgfQorICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KEVuZHBvaW50JiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIHN3YXAob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIH5FbmRwb2ludCgpIHsKKyAgICAgICAgICAgIEFMT0dFX0lGKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICJBIG5vbiBlbXB0eSBQYXRjaCBFbmRwb2ludCBsZWFrZWQsIGhhbmRsZSAlZCIsIG1IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tUcmFjayhUcmFja1R5cGUgKnRyYWNrT3JOdWxsKSBjb25zdCB7CisgICAgICAgICAgICBpZiAodHJhY2tPck51bGwgPT0gbnVsbHB0cikgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybiB0cmFja09yTnVsbC0+aW5pdENoZWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQorICAgICAgICBzcDxUaHJlYWRUeXBlPiB0aHJlYWQoKSB7IHJldHVybiBtVGhyZWFkOyB9CisgICAgICAgIHNwPFRyYWNrVHlwZT4gdHJhY2soKSB7IHJldHVybiBtVHJhY2s7IH0KKyAgICAgICAgc3A8Y29uc3QgVGhyZWFkVHlwZT4gY29uc3RfdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxjb25zdCBUcmFja1R5cGU+IGNvbnN0X3RyYWNrKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrOyB9CisKKyAgICAgICAgdm9pZCBjbG9zZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKSB7CisgICAgICAgICAgICBpZiAobUhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIHBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChtSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2sobVRyYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DbG9zZVRocmVhZCkgeworICAgICAgICAgICAgICAgICAgICBwYW5lbC0+bUF1ZGlvRmxpbmdlci5jbG9zZVRocmVhZEludGVybmFsX2wobVRocmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGVQdHIoKSB7IHJldHVybiAmbUhhbmRsZTsgfQorICAgICAgICB2b2lkIHNldFRocmVhZChjb25zdCBzcDxUaHJlYWRUeXBlPiYgdGhyZWFkLCBib29sIGNsb3NlVGhyZWFkID0gdHJ1ZSkgeworICAgICAgICAgICAgbVRocmVhZCA9IHRocmVhZDsKKyAgICAgICAgICAgIG1DbG9zZVRocmVhZCA9IGNsb3NlVGhyZWFkOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0VHJhY2tBbmRQZWVyKGNvbnN0IHNwPFRyYWNrVHlwZT4mIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRCYXNlOjpQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnBlZXIpIHsKKyAgICAgICAgICAgIG1UcmFjayA9IHRyYWNrOworICAgICAgICAgICAgbVRocmVhZC0+YWRkUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgbVRyYWNrLT5zZXRQZWVyUHJveHkocGVlcik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzdG9wVHJhY2soKSB7IGlmIChtVHJhY2spIG1UcmFjay0+c3RvcCgpOyB9CisKKyAgICAgICAgdm9pZCBzd2FwKEVuZHBvaW50ICZvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgICAgICAgc3dhcChtVGhyZWFkLCBvdGhlci5tVGhyZWFkKTsKKyAgICAgICAgICAgIHN3YXAobUNsb3NlVGhyZWFkLCBvdGhlci5tQ2xvc2VUaHJlYWQpOworICAgICAgICAgICAgc3dhcChtSGFuZGxlLCBvdGhlci5tSGFuZGxlKTsKKyAgICAgICAgICAgIHN3YXAobVRyYWNrLCBvdGhlci5tVHJhY2spOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc3dhcChFbmRwb2ludCAmYSwgRW5kcG9pbnQgJmIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIGEuc3dhcChiKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gbVRocmVhZDsKKyAgICAgICAgYm9vbCBtQ2xvc2VUaHJlYWQgPSB0cnVlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHNwPFRyYWNrVHlwZT4gbVRyYWNrOworICAgIH07CiAKICAgICBjbGFzcyBQYXRjaCB7CiAgICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6Ci0gICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9Ci0gICAgICAgIH5QYXRjaCgpIHt9CisgICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gpIDogbUF1ZGlvUGF0Y2gocGF0Y2gpIHt9CisgICAgICAgIH5QYXRjaCgpOworICAgICAgICBQYXRjaChjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaChQYXRjaCYmKSA9IGRlZmF1bHQ7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShQYXRjaCYmKSA9IGRlZmF1bHQ7CiAKKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICB2b2lkIGNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICBib29sIGlzU29mdHdhcmUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVJlY29yZC5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KKworICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXRlbmN5IG9mIHRoZSBwYXRjaCAoZnJvbSByZWNvcmQgdG8gcGxheWJhY2spLgorICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworCisgICAgICAgIFN0cmluZzggZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3Q7CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IGF1ZGlvX3BhdGNoOjppZCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBIQUwgbW9kdWxlCiAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2g7Ci0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbmRsZTsKICAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBIQUwgcGF0Y2ggaGFuZGxlIHByZXNlbnQgb25seSB3aGVuIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgLy8gYmVsb3cgbWVtYmVycyBhcmUgdXNlZCBieSBhIHNvZnR3YXJlIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgYSBzb3VyY2UgZGV2aWNlIGZyb20gYQogICAgICAgICAvLyBnaXZlbiBhdWRpbyBIVyBtb2R1bGUgdG8gYSBzaW5rIGRldmljZSBvbiBhbiBvdGhlciBhdWRpbyBIVyBtb2R1bGUuCi0gICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgaWYKLSAgICAgICAgLy8gbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSBwYXRjaAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gdHJhY2sgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiAgbVBhdGNoVHJhY2s7Ci0gICAgICAgIC8vIHJlY29yZCB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZD4gICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gcmVjb3JkIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiAgIG1QYXRjaFJlY29yZDsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dC4KLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVJlY29yZFBhdGNoSGFuZGxlOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKLQorICAgICAgICAvLyB0aGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBjcmVhdGVDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhckNvbm5lY3Rpb25zKCkKKyAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGlzIGNyZWF0ZWQgaWYgbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkCisgICAgICAgIC8vIGNvbm5lY3RzIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKKyAgICAgICAgRW5kcG9pbnQ8UGxheWJhY2tUaHJlYWQsIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBtUGxheWJhY2s7CisgICAgICAgIC8vIGNvbm5lY3RzIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAorICAgICAgICBFbmRwb2ludDxSZWNvcmRUaHJlYWQsIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IG1SZWNvcmQ7CiAgICAgfTsKIAotcHJpdmF0ZToKLSAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI+ICAgICAgbUF1ZGlvRmxpbmdlcjsKLSAgICBTb3J0ZWRWZWN0b3IgPFBhdGNoICo+ICAgICAgbVBhdGNoZXM7CisgICAgQXVkaW9Id0RldmljZSogZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHZvaWQgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBBdWRpb0ZsaW5nZXIgJm1BdWRpb0ZsaW5nZXI7CisgICAgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIFBhdGNoPiBtUGF0Y2hlczsKKworICAgIC8vIFRoaXMgbWFwIGFsbG93cyBnb2luZyBmcm9tIGEgdGhyZWFkIHRvICJkb3duc3RyZWFtIiBzb2Z0d2FyZSBwYXRjaGVzCisgICAgLy8gd2hlbiBhIHByb2Nlc3NpbmcgbW9kdWxlIGluc2VydGVkIGluIGJldHdlZW4uIEV4YW1wbGU6CisgICAgLy8KKyAgICAvLyAgZnJvbSBtYXAgdmFsdWUuc3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5CisgICAgLy8gIFtNaXhlciB0aHJlYWRdIC0tPiBbVmlydHVhbCBvdXRwdXQgZGV2aWNlXSAtLT4gW1Byb2Nlc3NpbmcgbW9kdWxlXSAtLS1cCisgICAgLy8gICAgICAgW0hhcndhcmUgbW9kdWxlXSA8LS0gW1BoeXNpY2FsIG91dHB1dCBkZXZpY2VdIDwtLSBbUy9XIFBhdGNoXSA8LS0vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXAgdmFsdWUuc3dfcGF0Y2hlcworICAgIC8vCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIG1peGVyIHRocmVhZCB0byBsb29rIHVwIHRoZSB0aHJlYWRzIG9mIHRoZSBzb2Z0d2FyZSBwYXRjaAorICAgIC8vIGZvciBwcm9wYWdhdGluZyB0aW1pbmcgaW5mbywgcGFyYW1ldGVycywgZXRjLgorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgYXNzdW1wdGlvbnMgYXJlOgorICAgIC8vICAgMSkgVGhlIHByb2Nlc3NpbmcgbW9kdWxlIGFjdHMgYXMgYSBtaXhlciB3aXRoIHNldmVyYWwgb3V0cHV0cyB3aGljaAorICAgIC8vICAgICAgcmVwcmVzZW50IGRpZmZlcmVudGx5IGRvd25taXhlZCBhbmQgLyBvciBlbmNvZGVkIHZlcnNpb25zIG9mIHRoZSBzYW1lCisgICAgLy8gICAgICBtaXhlZCBzdHJlYW0uIFRoZXJlIGlzIG5vIDE6MSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZSBpbnB1dCBzdHJlYW1zCisgICAgLy8gICAgICBhbmQgdGhlIHNvZnR3YXJlIHBhdGNoZXMsIGJ1dCByYXRoZXIgYSBOOk4gY29ycmVzcG9uZGVuY2UgYmV0d2VlbgorICAgIC8vICAgICAgYSBncm91cCBvZiBzdHJlYW1zIGFuZCBhIGdyb3VwIG9mIHBhdGNoZXMuCisgICAgLy8gICAyKSBUaGVyZSBhcmUgb25seSBhIGNvdXBsZSBvZiBpbnNlcnRlZCBwcm9jZXNzaW5nIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSwKKyAgICAvLyAgICAgIHNvIHdoZW4gbG9va2luZyBmb3IgYSBzdHJlYW0gb3IgcGF0Y2ggaGFuZGxlIHdlIGNhbiBpdGVyYXRlIG92ZXIKKyAgICAvLyAgICAgIGFsbCBtb2R1bGVzLgorICAgIHN0cnVjdCBNb2R1bGVDb25uZWN0aW9ucyB7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zOworICAgICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gc3dfcGF0Y2hlczsKKyAgICB9OworICAgIHN0ZDo6bWFwPGF1ZGlvX21vZHVsZV9oYW5kbGVfdCwgTW9kdWxlQ29ubmVjdGlvbnM+IG1JbnNlcnRlZE1vZHVsZXM7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBhNzhiZTk5Li4zNTczNzBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtNDEsMjIgKzQxLDE1IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgcGF1c2UoKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgICAgIGludCAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TmFtZShpbnQgbmFtZSkgewotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobU5hbWUgPj0gMCAmJiBuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMgYm90aCBvbGQgbmFtZSAlZCBhbmQgbmV3IG5hbWUgJWQgYXJlIHZhbGlkIiwgX19mdW5jX18sIG1OYW1lLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKIApAQCAtNjUsMTIgKzU4LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwOyB9Ci0gICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gIG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cjsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF1eEJ1ZmZlcihpbnQgRWZmZWN0SWQsIGludDMyX3QgKmJ1ZmZlcik7CiAgICAgICAgICAgICBpbnQzMl90ICAgICAqYXV4QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUF1eEJ1ZmZlcjsgfQpAQCAtODcsNiArODMsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCisgICAgICAgICAgICBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RhdGljKCkgPyAwLiA6IFRyYWNrQmFzZTo6YnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIC8vIGltcGxlbWVudCB2b2x1bWUgaGFuZGxpbmcuCiAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKQEAgLTExMSw2ICsxMTEsMjYgQEAKICAgICAvKiogQ29weSB0aGUgdHJhY2sgbWV0YWRhdGEgaW4gdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLiBUaHJlYWQgc2FmZS4gKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdDsKIAorICAgICAgICAgICAgLyoqIFJldHVybiBoYXB0aWMgcGxheWJhY2sgb2YgdGhlIHRyYWNrIGlzIGVuYWJsZWQgb3Igbm90LCB1c2VkIGluIG1peGVyLiAqLworICAgICAgICAgICAgYm9vbCAgICBnZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtSGFwdGljUGxheWJhY2tFbmFibGVkOyB9CisgICAgICAgICAgICAvKiogU2V0IGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHNob3VsZCBiZQorICAgICAgICAgICAgICogIHNldCBhZnRlciBxdWVyeSBvciBnZXQgY2FsbGJhY2sgZnJvbSB2aWJyYXRvciBzZXJ2aWNlICovCisgICAgICAgICAgICB2b2lkICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogUmV0dXJuIGF0IHdoYXQgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljcywgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBnZXRIYXB0aWNJbnRlbnNpdHkoKSBjb25zdCB7IHJldHVybiBtSGFwdGljSW50ZW5zaXR5OyB9CisgICAgICAgICAgICAvKiogU2V0IGludGVuc2l0eSBvZiBoYXB0aWMgcGxheWJhY2ssIHNob3VsZCBiZSBzZXQgYWZ0ZXIgcXVlcnlpbmcgdmlicmF0b3Igc2VydmljZS4gKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljSW50ZW5zaXR5KEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXVkaW9NaXhlcjo6aXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNJbnRlbnNpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChtSGFwdGljSW50ZW5zaXR5ICE9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+IGdldEV4dGVybmFsVmlicmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUV4dGVybmFsVmlicmF0aW9uOyB9CisKKyAgICAgICAgICAgIHZvaWQgICAgc2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMTIxLDggKzE0MSw4IEBACiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrKTsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKLSAgICAvLyByZWxlYXNlQnVmZmVyKCkgbm90IG92ZXJyaWRkZW4KKyAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOwogCiAgICAgLy8gRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lc1JlYWR5KCkgY29uc3Q7CkBAIC0xNDAsNyArMTYwLDcgQEAKICAgICBib29sIGlzUmVzdW1lUGVuZGluZygpOwogICAgIHZvaWQgcmVzdW1lQWNrKCk7CiAgICAgdm9pZCB1cGRhdGVUcmFja0ZyYW1lSW5mbyhpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOwogCiAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQogCkBAIC0xNzEsNyArMTkxLDYgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc2V0RG9uZTsKICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CiAgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAqbU1haW5CdWZmZXI7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICptQXV4QnVmZmVyOwpAQCAtMTg4LDcgKzIwNywyOSBAQAogCiAgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICBtVm9sdW1lSGFuZGxlcjsgLy8gaGFuZGxlcyBtdWx0aXBsZSBWb2x1bWVTaGFwZXIgY29uZmlncyBhbmQgb3BlcmF0aW9ucwogCisgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGluZGljYXRlcyBoYXB0aWMgcGxheWJhY2sgZW5hYmxlZCBvciBub3QKKyAgICAvLyBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YQorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7CisgICAgY2xhc3MgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyIDogcHVibGljIG9zOjpCbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIoVHJhY2sqIHRyYWNrKSA6IG1UcmFjayh0cmFjaykge30KKyAgICAgICAgYmluZGVyOjpTdGF0dXMgbXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHVubXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgcHJpdmF0ZToKKyAgICAgICAgVHJhY2sqIGNvbnN0IG1UcmFjazsKKyAgICB9OworICAgIHNwPEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcj4gbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjsKKyAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+ICAgIG1FeHRlcm5hbFZpYnJhdGlvbjsKKwogcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGludGVyY2VwdEJ1ZmZlcihjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcik7CisgICAgLyoqIFdyaXRlIHRoZSBzb3VyY2UgZGF0YSBpbiB0aGUgYnVmZmVyIHByb3ZpZGVyLiBAcmV0dXJuIHdyaXR0ZW4gZnJhbWUgY291bnQuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICB3cml0ZUZyYW1lcyhBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRj4KKyAgICB2b2lkICAgICAgICAgICAgICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKEYgZikgeworICAgICAgICBmb3IgKGF1dG8mIHRwIDogbVRlZVBhdGNoZXMpIHsgZih0cC5wYXRjaFRyYWNrKTsgfQorICAgIH07CisKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIG1GYXN0SW5kZXggPT0gLTEgaWYgbm90IGlzRmFzdFRyYWNrKCkKQEAgLTIwOCw2ICsyNDksNyBAQAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKICAgICAvLyBJZiB0aGUgbGFzdCB0cmFjayBjaGFuZ2Ugd2FzIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQgd2l0aCByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkCiAgICAgc3RkOjphdG9taWNfZmxhZyAgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKKyAgICBUZWVQYXRjaGVzICBtVGVlUGF0Y2hlczsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC0yMzMsNyArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOworICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGJ1ZmZlclF1ZXVlRW1wdHkoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CkBAIC0yNDEsNiArMjgzLDE4IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0IG92ZXJyaWRlOwogICAgIC8qKiBTZXQgdGhlIG1ldGFkYXRhcyBvZiB0aGUgdXBzdHJlYW0gdHJhY2tzLiBUaHJlYWQgc2FmZS4gKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1ldGFkYXRhcyhjb25zdCBTb3VyY2VNZXRhZGF0YXMmIG1ldGFkYXRhcyk7CisgICAgLyoqIHJldHVybnMgY2xpZW50IHRpbWVzdGFtcCB0byB0aGUgdXBzdHJlYW0gZHVwbGljYXRpbmcgdGhyZWFkLiAqLworICAgIEV4dGVuZGVkVGltZXN0YW1wICAgZ2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIC0ga2VybmVsIGRpZmZlcmVuY2UgaXMgbm90IHRydWUgbGF0ZW5jeSB3aGVuIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG1TZXJ2ZXJQcm94eS0+aXNEcmFpbmVkKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtQ2xpZW50UHJveHktPmdldFRpbWVzdGFtcCgmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzLCB0aGUgdGltZXN0YW1wIExPQ0FUSU9OX1NFUlZFUiBhbmQgTE9DQVRJT05fS0VSTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyB3aWxsIGJlIHByb3Blcmx5IGZpbGxlZC4gSWYgZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gYSBkZWZhdWx0IGluaXRpYWxpemVkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRoIG1UaW1lTnNbXSBmaWxsZWQgd2l0aCAtMSdzKSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLApAQCAtMjU3LDYgKzMxMSw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisKICAgICAvKiogQXR0cmlidXRlcyBvZiB0aGUgc291cmNlIHRyYWNrcy4KICAgICAgKgogICAgICAqIFRoaXMgbWVtYmVyIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBtVHJhY2tNZXRhZGF0YXNNdXRleCB0YWtlbi4KQEAgLTI3NCw3ICszMjksNyBAQAogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjawogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMjg1LDcgKzM0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CkBAIC0zMDEsMTIgKzM1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHJlc3RhcnRJZkRpc2FibGVkKCk7CiAKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCBmYzJkYmJiLi5hYjRhZjMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICBib29sICAgICAgICBzZXRPdmVyZmxvdygpIHsgYm9vbCB0bXAgPSBtT3ZlcmZsb3c7IG1PdmVyZmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKQEAgLTYzLDEyICs2MywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KIAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBpZiAoIWlzUGF0Y2hUcmFjaygpKSBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdGljICBib29sICAgICAgICBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQogCkBAIC0xMDIsNyArMTEzLDcgQEAKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKLWNsYXNzIFBhdGNoUmVjb3JkIDogdmlydHVhbCBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworY2xhc3MgUGF0Y2hSZWNvcmQgOiBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICBQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKQEAgLTExMiw3ICsxMjMsOCBAQAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQgPSB7fSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hSZWNvcmQoKTsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCkBAIC0xMjMsMTEgKzEzNSw0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IE5VTEwpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIpOwotCi0gICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KLQotcHJpdmF0ZToKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoUmVjb3JkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3ZWEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLQotLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKLSAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKLSAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKLSAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCi0gKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0KLS8vIE5vdCB2YWxpZCB1bnRpbCBpbml0aWFsaXplZCBieSBBdWRpb0ZsaW5nZXIgY29uc3RydWN0b3IuICBJdCB3b3VsZCBoYXZlIHRvIGJlCi0vLyByZS1pbml0aWFsaXplZCBpZiB0aGUgcHJvY2VzcyBjb250YWluaW5nIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGZvcmtzICh3aGljaCBpdCBkb2Vzbid0KS4KLS8vIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byB2YWxpZGF0ZSBiaW5kZXIgaW50ZXJmYWNlIGNhbGxzIHdpdGhpbiBhdWRpb3NlcnZlcgotLy8gKGUuZy4gQXVkaW9Qb2xpY3lNYW5hZ2VyIHRvIEF1ZGlvRmxpbmdlcikuCi1waWRfdCBnZXRwaWRfY2FjaGVkOwotCi0vLyBBIHRydXN0ZWQgY2FsbGluZyBVSUQgbWF5IHNwZWNpZnkgdGhlIGNsaWVudCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbC4KLS8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpIHsKLSAgICBzd2l0Y2ggKHVpZCkgewotICAgIGNhc2UgQUlEX01FRElBOgotICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7Ci0gICAgfQotICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCi0gICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKLSAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAvLyBmb3IgYXR0cmlidXRpbmcgdGhlIGFwcCBvcC4gVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBydW50aW1lIHBlcm1pc3Npb25zCi0gICAgLy8gYXMgZm9yIGxlZ2FjeSBhcHBzIHdlIHdpbGwgdG9nZ2xlIHRoZSBhcHAgb3AgZm9yIGFsbCBwYWNrYWdlcyBpbiB0aGUgVUlELgotICAgIC8vIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB3cm9uZyBwYWNrYWdlIGFuZAotICAgIC8vIHN0YXRzIGJhc2VkIG9uIGFwcCBvcHMgbWF5IGJlIHNsaWdodGx5IG9mZi4KLSAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOwotICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOwotICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOwotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCi0gICAgfQotICAgIHJldHVybiBwYWNrYWdlc1swXTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkX3QgdWlkKSB7Ci0gICAgLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSB1bmZvcmtlZCBhdWRpb3NlcnZlciBhbHdheXMgT0suCi0gICAgcmV0dXJuIHVpZCA9PSBBSURfUk9PVCB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIDsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgc3RhcnQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKLSAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KLSAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBjb25zdCBib29sIG9rID0gcGVybWlzc2lvbkNvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIFN0cmluZzgoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGlmIChzdGFydCkgewotICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKLSAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFwcE9wcy5ub3RlT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKLX0KLQotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKLX0KLQotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm47Ci0KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Ci19Ci0KLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKTsKLQotICAgIGlmIChvaykgewotICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKLSAgICB9Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOwotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgZHVtcEFsbG93ZWQoKSB7Ci0gICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKLSAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCi0gICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhZGExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7Ci1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwotYm9vbCBkdW1wQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggYzIzMjBiYy4uZmYzMzk1NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpAQCAtMzYsNiArMzgsOCBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmFsYW5jZS5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KQEAgLTYyLDggKzY2LDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTcxLDcgKzc1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAKQEAgLTIwMCw3ICsyMDQsNyBAQAogLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCiAvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKIC8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgotc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweEQwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzMzLDkgKzMzNyw5IEBACiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgogICAgIFRocmVhZENwdVVzYWdlIG1DcHVVc2FnZTsgICAgICAgICAgIC8vIGluc3RhbnRhbmVvdXMgdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwogCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKIAogICAgIGludCBtQ3B1TnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCdzIGN1cnJlbnQgQ1BVIG51bWJlcgogICAgIGludCBtQ3B1a0h6OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBvZiB0aHJlYWQncyBjdXJyZW50IENQVSBpbiBrSHoKQEAgLTM2MSw3ICszNjUsNyBAQAogCiAgICAgLy8gcmVjb3JkIHNhbXBsZSBmb3Igd2FsbCBjbG9jayBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgIG1XY1N0YXRzLnNhbXBsZSh3Y05zKTsKKyAgICAgICAgbVdjU3RhdHMuYWRkKHdjTnMpOwogICAgIH0KIAogICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCkBAIC0zODAsMjYgKzM4NCwyNiBAQAogCiAgICAgLy8gaWYgbm8gY2hhbmdlIGluIENQVSBudW1iZXIgb3IgZnJlcXVlbmN5LCB0aGVuIHJlY29yZCBzYW1wbGUgZm9yIGN5Y2xlIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQgJiYgbUNwdWtIeiA+IDApIHsKLSAgICAgICAgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKLSAgICAgICAgbUh6U3RhdHMuc2FtcGxlKGN5Y2xlcyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLmFkZChjeWNsZXMpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgY29uc3QgdW5zaWduZWQgbiA9IG1XY1N0YXRzLmdldE4oKTsKICAgICAvLyBtQ3B1VXNhZ2UuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCiAgICAgaWYgKChuICYgMTI3KSA9PSAxKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBERUJVR19DUFVfVVNBR0UgKiAxMDAwMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLmdldE1heCgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMuZ2V0TWF4KCk7CiAgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CiAgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOwogICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKQEAgLTQ5MSw2ICs0OTUsOCBAQAogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046ICByZXR1cm4gInZvaWNlIGNvbW11bmljYXRpb24iOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6ICAgICAgICByZXR1cm4gInJlbW90ZSBzdWJtaXgiOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOiAgICAgICAgICByZXR1cm4gInVucHJvY2Vzc2VkIjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRTogICAgcmV0dXJuICJ2b2ljZSBwZXJmb3JtYW5jZSI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6ICAgICAgIHJldHVybiAiZWNobyByZWZlcmVuY2UiOwogICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKQEAgLTc0OSw2ICs3NTUsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihtYXNrKTsKIAogICAgIHN3aXRjaCAocmVwcmVzZW50YXRpb24pIHsKKyAgICAvLyBUcmF2ZWwgYWxsIHNpbmdsZSBiaXQgY2hhbm5lbCBtYXNrIHRvIGNvbnZlcnQgY2hhbm5lbCBtYXNrIHRvIHN0cmluZy4KICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CkBAIC03NjksNiArNzc2LDEwIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQikgcy5hcHBlbmQoImhhcHRpYy1CLCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CkBAIC03ODMsNiArNzk0LDEyIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQ0VOVEVSKSBzLmFwcGVuZCgiY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKQEAgLTg0NSw2ICs4NjIsMzIgQEAKICAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIGRldmljZXNUb1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCBzb3VyY2VUb1N0cmluZyhtQXVkaW9Tb3VyY2UpKTsKIAorICAgIC8vIER1bXAgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgIGlmIChtVHlwZSA9PSBSRUNPUkQKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBzdGF0czogJXNcbiIsIG1UaW1lc3RhbXBWZXJpZmllci50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgY29ycmVjdGVkOiAlc1xuIiwgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpID8gInllcyIgOiAibm8iKTsKKyAgICB9CisKKyAgICBpZiAobUxhc3RJb0JlZ2luTnMgPiAwKSB7IC8vIE1NQVAgbWF5IG5vdCBzZXQgdGhpcworICAgICAgICBkcHJpbnRmKGZkLCAiICBMYXN0ICVzIG9jY3VycmVkIChtc2Vjcyk6ICVsbGRcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKHN5c3RlbVRpbWUoKSAtIG1MYXN0SW9CZWdpbk5zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzVGltZU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgUHJvY2VzcyB0aW1lIG1zIHN0YXRzOiAlc1xuIiwgbVByb2Nlc3NUaW1lTXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAobUlvSml0dGVyTXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYWwgJXMgaml0dGVyIG1zIHN0YXRzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgICAgICBtSW9KaXR0ZXJNcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKwogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMTUxOSw3ICsxNTYyLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7CiAgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOwpAQCAtMTU3MSw2ICsxNjE0LDkgQEAKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KICAgICBtSGFzQ2hhbmdlZCA9IHRydWU7CisjaWZkZWYgVEVFX1NJTksKKyAgICB0cmFjay0+ZHVtcFRlZSgtMSAvKiBmZCAqLywgIl9SRU1PVkUiKTsKKyNlbmRpZgogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTY3NCw3ICsxNzIwLDcgQEAKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtVHJhY2tzKHR5cGUgPT0gTUlYRVIpLAogICAgICAgICBtT3V0cHV0KG91dHB1dCksCi0gICAgICAgIG1MYXN0V3JpdGVUaW1lKC0xKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKKyAgICAgICAgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKICAgICAgICAgbU1peGVyU3RhdHVzKE1JWEVSX0lETEUpLAogICAgICAgICBtTWl4ZXJTdGF0dXNJZ25vcmluZ0Zhc3RUcmFja3MoTUlYRVJfSURMRSksCiAgICAgICAgIG1TdGFuZGJ5RGVsYXlOcyhBdWRpb0ZsaW5nZXI6Om1TdGFuZGJ5VGltZUluTnNlY3MpLApAQCAtMTcwOSwxMCArMTc1NSwyMSBAQAogICAgICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+Y2FuU2V0TWFzdGVyTXV0ZSgpKSB7CiAgICAgICAgICAgICBtTWFzdGVyTXV0ZSA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKKyAgICAgICAgICAgICAgICBtT3V0cHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQogCiAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9PVVRfQlVTLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICBpZiAodHlwZSA9PSBNSVhFUiB8fCB0eXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX291dHB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX09VVF9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICB9CisKICAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCiAgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKQEAgLTE3NzMsNyArMTgzMCw3IEBACiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1UcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC0xNzkzLDcgKzE4NTAsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKQEAgLTE4MTAsOSArMTg2NywxMiBAQAogewogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIAorICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtdXRlOiAlc1xuIiwgbU1hc3Rlck11dGUgPyAib24iIDogIm9mZiIpOworICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhcHRpYyBjaGFubmVsIG1hc2s6ICUjeCAoJXMpXG4iLCBtSGFwdGljQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtSGFwdGljQ2hhbm5lbE1hc2ssIHRydWUgLyogb3V0cHV0ICovKS5jX3N0cigpKTsKKyAgICB9CiAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKLSAgICBkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwogICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOwogICAgIGRwcmludGYoZmQsICIgIERlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOwogICAgIGRwcmludGYoZmQsICIgIEJsb2NrZWQgaW4gd3JpdGU6ICVzXG4iLCBtSW5Xcml0ZSA/ICJ5ZXMiIDogIm5vIik7CkBAIC0xODgwLDExICsxOTQwLDE3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgY2hlY2tJTWVtb3J5KHNoYXJlZEJ1ZmZlcikgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTE5MDUsNyArMTk3MSw3IEBACiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQogICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKLSAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSAobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSB8fAogICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIHx8CiAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJiYgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAqLykpICYmCkBAIC0yMTc0LDQ4ICsyMjQwLDE3IEBACiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6YWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykKLXsKLSAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIHNldCBuYW1lIGZvciB0cmFjayB3aGVuIGFkZGluZy4KLSAgICAgICAgaW50IG5hbWU7Ci0gICAgICAgIGlmIChtVW51c2VkVHJhY2tOYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBuYW1lID0gbVRyYWNrcy5zaXplKCkgLSAxOyAvLyBuZXcgbmFtZSB7MCAuLi4gc2l6ZS0xfS4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldXNlIHNtYWxsZXN0IG5hbWUgZm9yIGRlbGV0ZWQgdHJhY2suCi0gICAgICAgICAgICBhdXRvIGl0ID0gbVVudXNlZFRyYWNrTmFtZXMuYmVnaW4oKTsKLSAgICAgICAgICAgIG5hbWUgPSAqaXQ7Ci0gICAgICAgICAgICAodm9pZCltVW51c2VkVHJhY2tOYW1lcy5lcmFzZShpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhY2stPnNldE5hbWUobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiY2Fubm90IGFkZCB0cmFjayIpOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6cmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjaykKIHsKLSAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIGludmFsaWRhdGUgbmFtZSB3aGVuIHJlbW92aW5nIGZyb20gbVRyYWNrcy4KLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lIDwgMCwgImludmFsaWQgbmFtZSAlZCBmb3IgdHJhY2sgb24gbVRyYWNrcyIsIG5hbWUpOwotCi0gICAgICAgIGlmIChtU2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7CisgICAgICAgIGlmIChtU2F2ZURlbGV0ZWRUcmFja0lkcykgewogICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIG1BdWRpb01peGVyIHNpbmNlIHRoZSBjYWxsZXIgbWF5IGJlIG91dHNpZGUgb2YgdGhyZWFkTG9vcC4KLSAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGFkZCB0byBtRGVsZXRlZFRyYWNrTmFtZXMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGFkZCB0byBtRGVsZXRlZFRyYWNrSWRzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCiAgICAgICAgICAgICAvLyB0byBiZSBoYW5kbGVkIHdoZW4gTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpIG5leHQgY2hhbmdlcyBtQXVkaW9NaXhlci4KLSAgICAgICAgICAgIG1EZWxldGVkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOworICAgICAgICAgICAgbURlbGV0ZWRUcmFja0lkcy5lbXBsYWNlKHRyYWNrSWQpOwogICAgICAgICB9Ci0KLSAgICAgICAgbVVudXNlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKLSAgICAgICAgdHJhY2stPnNldE5hbWUoVDo6VFJBQ0tfTkFNRV9QRU5ESU5HKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAidmFsaWQgbmFtZSAlZCBmb3IgdHJhY2sgbm90IGluIG1UcmFja3MgKHJldHVybmVkICV6ZCkiLCBuYW1lLCBpbmRleCk7CiAgICAgfQogICAgIHJldHVybiBpbmRleDsKIH0KQEAgLTIyNTEsNiArMjI4NiwxMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKQogewogICAgIGlmIChpc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIzMDMsMTUgKzIzNDMsMTMgQEAKICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBzdGF0ZSA9IHRyYWNrLT5tU3RhdGU7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgLy8gYWJvcnQgdHJhY2sgd2FzIHN0b3BwZWQvcGF1c2VkIHdoaWxlIHdlIHJlbGVhc2VkIHRoZSBsb2NrCiAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gdHJhY2stPm1TdGF0ZSkgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMzQwLDYgKzIzNzgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDAgPyBUcmFjazo6RlNfRklMTEVEIDogVHJhY2s6OkZTX0ZJTExJTkc7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAorICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbnRlbnNpdHkgPSBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydCgKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3Q+KGludGVuc2l0eSkpOworICAgICAgICAgICAgLy8gSGFwdGljIHBsYXliYWNrIHNob3VsZCBiZSBlbmFibGVkIGJ5IHZpYnJhdG9yIHNlcnZpY2UuCisgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBoYXB0aWMgcGxheWJhY2sgb2YgYWxsIGFjdGl2ZSB0cmFjayB0byBlbnN1cmUgb25seQorICAgICAgICAgICAgICAgIC8vIG9uZSB0cmFjayBwbGF5aW5nIGhhcHRpYyBpZiBjdXJyZW50IHRyYWNrIHNob3VsZCBwbGF5IGhhcHRpYy4KKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIHQtPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgdHJhY2stPm1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IDA7CiAgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKQEAgLTI0MDUsNiArMjQ2MiwxNCBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbU91dHB1dC0+c3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKQEAgLTI0NjIsNiArMjUyNywxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gcmVqZWN0IG91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cwogICAgIGlmICgobURyYWluU2VxdWVuY2UgJiAxKSAmJiAoc2VxdWVuY2UgPT0gbURyYWluU2VxdWVuY2UpKSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgd2hlbiBIVyBkcmFpbiBpcyBjb21wbGV0ZWQgYmVjYXVzZSB0aGF0IGNhbiBjYXVzZQorICAgICAgICAvLyB0aGUgdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIHRvIHJlc2V0IHRvIDAgZm9yIGRpcmVjdCBhbmQgb2ZmbG9hZCB0aHJlYWRzLgorICAgICAgICAvLyAoT3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGUgZGlzY29udGludWl0eSB3b3VsZCBiZSBoYW5kbGVkCisgICAgICAgIC8vIGVsc2V3aGVyZSwgZS5nLiBpbiBmbHVzaCkuCisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1EcmFpblNlcXVlbmNlICY9IH4xOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CkBAIC0yNDgxLDYgKzI1NTEsNyBAQAogICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spOwogCiAgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgogICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0Rm9ybWF0KCZtSEFMRm9ybWF0KTsKQEAgLTI2MDAsNyArMjY3MSw3IEBACiAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOwogICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKLSAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gYWxzbyB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIG5vIGxvbmdlciB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCiAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOwpAQCAtMjYxNCw2ICsyNjg1LDExIEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAorICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCAtPSBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKICAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCkBAIC0yNzgxLDI0ICsyODU3LDE4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAvLyBNaXNjZWxsYW5lb3VzIHRyYWNrIGNsZWFudXAgd2hlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LAorICAgIC8vIGNhbGxlZCB3aXRob3V0IFRocmVhZCBsb2NrIGJ1dCBzeW5jaHJvbml6ZWQgd2l0aCB0aHJlYWRMb29wIHByb2Nlc3NpbmcuCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCi0gICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKICAgICAgICAgfQogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpdHJhY2tzVG9SZW1vdmU7IC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1NpbGVudE1vZGVfbCgpCkBAIC0yODUwLDYgKzI5MjAsOSBAQAogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgIG1UZWUud3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgZnJhbWVzV3JpdHRlbik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTI5ODksNyArMzA2Miw3IEBACiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwogICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSwKICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKQEAgLTMxMzAsOCArMzIwMyw4IEBACiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiB0cmFja3NUb1JlbW92ZTsKIAogICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpOwotICAgIG5zZWNzX3QgbGFzdFdyaXRlRmluaXNoZWQgPSAtMTsgLy8gdGltZSBsYXN0IHNlcnZlciB3cml0ZSBjb21wbGV0ZWQKLSAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7IC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgorICAgIGludDY0X3QgbGFzdExvb3BDb3VudFdyaXR0ZW4gPSAtMjsgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKyAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7ICAgIC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgogCiAgICAgLy8gTUlYRVIKICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKQEAgLTMxNjcsNyArMzI0MCwxOCBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcyBzaG91bGQgcmVzZXQgZnJhbWUgY291bnQgdG8gemVybyBvbiBzdG9wL2ZsdXNoCisgICAgLy8gVE9ETzogYWRkIGNvbmZpcm1hdGlvbiBjaGVja3M6CisgICAgLy8gMSkgRElSRUNUIHRocmVhZHMgYW5kIGxpbmVhciBQQ00gZm9ybWF0IHJlYWxseSByZXNldHMgdG8gMD8KKyAgICAvLyAyKSBJcyBmcmFtZSBjb3VudCByZWFsbHkgdmFsaWQgaWYgbm90IGxpbmVhciBwY20/CisgICAgLy8gMykgQXJlIGFsbCA2NCBiaXRzIG9mIHBvc2l0aW9uIHJldHVybmVkLCBub3QganVzdCBsb3dlc3QgMzIgYml0cz8KKyAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLnNldERpc2NvbnRpbnVpdHlNb2RlKG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CisgICAgfQorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKworICAgIC8vIGxvb3BDb3VudCBpcyB1c2VkIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDsgIWV4aXRQZW5kaW5nKCk7ICsrbG9vcENvdW50KQogICAgIHsKICAgICAgICAgLy8gTG9nIG1lcmdlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIEF1ZGlvRmxpbmdlciBiaW5kZXIgdHJhbnNhY3Rpb25zLCBidXQKICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBjb3ZlciBhdWRpbyBwbGF5YmFjay4gSXQncyByZXF1ZXN0ZWQgaGVyZSBmb3IgdGhhdCByZWFzb24uCkBAIC0zMTc3LDYgKzMyNjEsNDkgQEAKIAogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOiB3ZSBhY2Nlc3Mgb3V0RGV2aWNlKCkgb3V0c2lkZSBvZiBtTG9jay4KKyAgICAgICAgaWYgKGlzTXNkRGV2aWNlKCkgJiYgKG91dERldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApIHsKKyAgICAgICAgICAgIC8vIEhlcmUsIHdlIHRyeSBmb3IgdGhlIEFGIGxvY2ssIGJ1dCBkbyBub3QgYmxvY2sgb24gaXQgYXMgdGhlIGxhdGVuY3kKKyAgICAgICAgICAgIC8vIGlzIG1vcmUgaW5mb3JtYXRpb25hbC4KKyAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhpZCgpLCAmc3dQYXRjaGVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3dQYXRjaGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN3UGF0Y2hlc1swXS5nZXRMYXRlbmN5TXNfbCgmbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IHN3UGF0Y2hlc1swXS5nZXRQYXRjaEhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBkb3duc3RyZWFtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGRvd25zdHJlYW0gbGF0ZW5jeSAod2UgYXNzdW1lIGEgbWF4IHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvdXQgb2YgcmFuZ2UgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgbWluTGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWluTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhdGVuY3lNcyA+IG1heExhdGVuY3kpIGxhdGVuY3lNcyA9IG1heExhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgLy8gb3VyIGRldmljZSBpcyBubyBsb25nZXIgQVVESU9fREVWSUNFX09VVF9CVVMsIHJlc2V0IHBhdGNoIGhhbmRsZSBhbmQgc3RhdHMuCisgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTMxOTAsMTYgKzMzMTcsNTEgQEAKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeyAvLyBubyBpbmRlbnRhdGlvbgogICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCiAgICAgICAgICAgICAvLyBhbmQgYXNzb2NpYXRlIHdpdGggdGhlIHNpbmsgZnJhbWVzIHdyaXR0ZW4gb3V0LiAgV2UgbmVlZAogICAgICAgICAgICAgLy8gdGhpcyB0byBjb252ZXJ0IHRoZSBzaW5rIHRpbWVzdGFtcCB0byB0aGUgdHJhY2sgdGltZXN0YW1wLgogICAgICAgICAgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgRHVwbGljYXRpbmdUaHJlYWQgbWF5IG5vdCBoYXZlIGEgbU5vcm1hbFNpbmsuCisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woJnRpbWVzdGFtcCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb3duc3RyZWFtIGxhdGVuY3kgb25seSBhZGRlZCBpZiB0aW1lc3RhbXAgY29ycmVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsgLy8gd2UgaGF2ZSBsYXRlbmN5IGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGludDY0X3QobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBtYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TdXNwZW5kZWRGcmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBmZXRjaCB0aGUgdGltZXN0YW1wIGhlcmUgYmVjYXVzZSBvZnRlbiB0aGUgZG93bnN0cmVhbQogICAgICAgICAgICAgICAgIC8vIHNpbmsgd2lsbCBibG9jayB3aGlsZSB3cml0aW5nLgotICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAotICAgICAgICAgICAgICAgICh2b2lkKSBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHZhbGlkIGtlcm5lbCBwb3NpdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiB1bmRlcnJ1bgogICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbm9ybWFsIG1peGVyIHBlcmlvZCBpcyB0aGUgc2FtZSBhcyB0aGUgZmFzdCBtaXhlciBwZXJpb2QsIG9yIHRoZXJlCkBAIC0zMjI4LDcgKzMzOTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKICAgICAgICAgICAgIC8vIGV2ZW4gYWZ0ZXIgc3RhbmRieSgpIGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB0cmFjayBmcmFtZQogICAgICAgICAgICAgLy8gdG8gc2luayBmcmFtZSBtYXBwaW5nLgpAQCAtMzI0NCwxMSArMzQwOSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHRpbWUgYmVmb3JlIHdlIGNhbGxlZCB0aGUgSEFMIHdyaXRlIC0gaXQgaXMgYSBiaXQgbW9yZSBhY2N1cmF0ZQogICAgICAgICAgICAgICAgICAgICAvLyB0byB3aGVuIHRoZSBzZXJ2ZXIgbGFzdCByZWFkIGRhdGEgdGhhbiB0aGUgY3VycmVudCB0aW1lIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RXcml0ZVRpbWUgd2lsbCBiZSAtMQorICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0SW9CZWdpbk5zIHdpbGwgYmUgLTEKICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIHVzZSBzeXN0ZW1UaW1lKCkuCiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0V3JpdGVUaW1lID09IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzeXN0ZW1UaW1lKCkgOiBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RJb0JlZ2luTnMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0SW9CZWdpbk5zOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewpAQCAtMzI1NiwxMCArMzQyMSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdC0+dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmIChtVHlwZSAuLi4gKSB7IC8vIG5vIGluZGVudGF0aW9uCiAjaWYgMAogICAgICAgICAgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKICAgICAgICAgICAgIGlmICh6ICUgMTAwID09IDApIHsKQEAgLTMzMDAsNyArMzQ2Nyw3IEBACiAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAorICAgICAgICAgICAgaWYgKChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIHB1dCBhdWRpbyBoYXJkd2FyZSBpbnRvIHN0YW5kYnkgYWZ0ZXIgc2hvcnQgZGVsYXkKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU3RhbmRieV9sKCkpIHsKQEAgLTMzMTQsNyArMzQ4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGFib3V0IHRvIHdhaXQsIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0zMzk0LDggKzM1NjEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKCFoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIGlmICghbUVmZmVjdEJ1ZmZlclZhbGlkICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQ2hhbm5lbENvdW50LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBmb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKQEAgLTM0MzgsOCArMzYyMywyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltRWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUobVNpbmtCdWZmZXIsIG1DaGFubmVsQ291bnQsIG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCkBAIC0zNDQ5LDQzICszNjUwLDY4IEBACiAgICAgICAgICAgICAvLyBtU2xlZXBUaW1lVXMgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2F2ZSBsYXN0V3JpdGVGaW5pc2hlZCBoZXJlLCBhcyBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLAotICAgICAgICAgICAgICAgIC8vIGZvciB0aHJvdHRsaW5nLiBPbiB0aHJlYWQgc3RhcnQsIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIHNldCB0byAtMSwgd2hpY2ggcHJvcGVybHkgcmVzdWx0cyBpbiBubyB0aHJvdHRsaW5nIGFmdGVyIHRoZSBmaXJzdCB3cml0ZS4KLSAgICAgICAgICAgICAgICBuc2Vjc190IHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZVBlcmlvZE5zIGlzIHVwZGF0ZWQgPj0gMCB3aGVuIHJldCA+IDAuCisgICAgICAgICAgICAgICAgaW50NjRfdCB3cml0ZVBlcmlvZE5zID0gLTE7CiAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlbWFpbmluZykgewogICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZXdyaXRlIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOyAgLy8gYWxzbyB1c2VkIGZvciBkdW1wc3lzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyAtPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZXMgPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzOworCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHdyaXRlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjb250aW51b3VzIG1peGluZyBjeWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFdyaXR0ZW4gKyAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyYW1lcywgd3JpdGVQZXJpb2ROc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhV3JpdGVOcyA9IGxhc3RJb0VuZE5zIC0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdElvRW5kTnMgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbGQgbXNlY3MsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhV3JpdGVOcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMsIG1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IGxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TG9vcENvdW50V3JpdHRlbiA9IGxvb3BDb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9UUkFDSykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAhbVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0V3JpdGVGaW5pc2hlZCAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3JpdGVQZXJpb2ROcyA+IDApIHsgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHdyaXRlIHBlcmlvZCBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8KQEAgLTM1MDQsMTIgKzM3MzAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhyZWFkTG9vcF9taXggKHNpZ25pZmljYW50IGZvciBoZWF2eSBtaXhpbmcsIGVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBvbiBsb3cgdGllciBwcm9jZXNzb3JzKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgKGFuZCBkZWx0YU5zKSBpcyBhbiBvdmVyZXN0aW1hdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhTnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YU5zID0gbGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCxwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLCAmZGVsdGFOcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YU5zIC8gMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyBpcyBhbiBvdmVyZXN0aW1hdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IHdyaXRlUGVyaW9kTnMgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IChpbnQzMl90KW1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaWduZWQpbUhhbGZCdWZmZXJNcyA+PSB0aHJvdHRsZU1zICYmIHRocm90dGxlTXMgPiAwKSB7CkBAIC0zNTIyLDcgKzM3NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRocm90dGxlIG11c3QgYmUgYXR0cmlidXRlZCB0byB0aGUgcHJldmlvdXMgbWl4ZXIgbG9vcCdzIHdyaXRlIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBiYWNrLXRvLWJhY2sgdGhyb3R0bGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCArPSB0aHJvdHRsZU1zICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBwcm9wZXIgdGltaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAgLy8gd2UgZmV0Y2ggdGhlIHdyaXRlIGVuZCB0aW1lIGFnYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CkBAIC0zNjA1LDI0ICszODI5LDM2IEBACiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgQUxPR1YoInJlbW92ZVRyYWNrc19sIHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgdHJhY2stPmlkKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhbiBleHRlcm5hbCBjbGllbnQgdHJhY2ssIGluZm9ybSBBUE0gd2UncmUgbm8gbG9uZ2VyIGFjdGl2ZSwgYW5kIHJlbW92ZSBpZiBuZWVkZWQuCisgICAgICAgIC8vIFdlIGRvIHRoaXMgdW5kZXIgbG9jayBzbyB0aGF0IHRoZSBzdGF0ZSBpcyBjb25zaXN0ZW50IGlmIHRoZSBUcmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvdXIgdHJhY2tzIHZlY3RvcgorICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcCh0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KICAgICB9Ci0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKQEAgLTM2MzksNiArMzg3NSwxNSBAQAogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpID09IE9LKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbk9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uT2Zmc2V0ID4gdGltZXN0YW1wLm1Qb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uIC09IHBvc2l0aW9uT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NzEsNiArMzkxNiw3IEBACiAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICB9CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNpbmtQb3J0SWQgPSBwYXRjaC0+c2lua3NbMF0uaWQ7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CiAgICAgLy8gdGhlIGNoYW5nZQpAQCAtMzcwMCw3ICszOTQ2LDcgQEAKIAogICAgIC8vIG1QcmV2T3V0RGV2aWNlIGlzIHRoZSBsYXRlc3QgZGV2aWNlIHNldCBieSBjcmVhdGVBdWRpb1BhdGNoX2woKS4gSXQgaXMgbm90IHNldCB3aGVuCiAgICAgLy8gdGhlIHRocmVhZCBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIGZpcnN0IHBhdGNoIGNyZWF0aW9uIHRyaWdnZXJzIGFuIGlvQ29uZmlnQ2hhbmdlZCBjYWxsYmFjawotICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IG1QcmV2T3V0RGV2aWNlICE9IHR5cGU7CisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gKG1QcmV2T3V0RGV2aWNlICE9IHR5cGUpIHx8IChtRGV2aWNlSWQgIT0gc2lua1BvcnRJZCk7CiAgICAgbU91dERldmljZSA9IHR5cGU7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogCkBAIC0zNzI5LDYgKzM5NzUsNyBAQAogICAgIH0KICAgICBpZiAoY29uZmlnQ2hhbmdlZCkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIG1EZXZpY2VJZCA9IHNpbmtQb3J0SWQ7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3NzcsMTIgKzQwMjQsMTYgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3OTgsNiArNDA0OSw3IEBACiAgICAgICAgIC8vIG1QaXBlU2luayBiZWxvdwogICAgICAgICAvLyBtTm9ybWFsU2luayBiZWxvdwogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiAgICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7CiAgICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSUjeCwgbUZyYW1lU2l6ZT0lenUsICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUsIG1Ob3JtYWxGcmFtZUNvdW50PSV6dSIsCkBAIC0zODE0LDcgKzQwNjYsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4NTYsMTYgKzQxMDksMTQgQEAKICAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCiAgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKLSNlbmRpZgorCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgogICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwpAQCAtMzg3Nyw3ICs0MTI4LDcgQEAKICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gbmV3IE1vbm9QaXBlKG1Ob3JtYWxGcmFtZUNvdW50ICogNCwgZm9ybWF0LCB0cnVlIC8qd3JpdGVDYW5CbG9jayovKTsKICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwogICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0jaWYgIUxPR19OREVCVUcgfHwgZGVmaW5lZChURUVfU0lOSykKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICBzc2l6ZV90IGluZGV4ID0KICNlbHNlCiAgICAgICAgICh2b2lkKQpAQCAtMzg4OCwyNSArNDEzOSw4IEBACiAgICAgICAgICAgICAgICAgKG1vbm9QaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgIG1QaXBlU2luayA9IG1vbm9QaXBlOwogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7Ci0gICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKLSAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgLy8gY3JlYXRlIGZhc3QgbWl4ZXIgYW5kIGNvbmZpZ3VyZSBpdCBpbml0aWFsbHkgd2l0aCBqdXN0IG9uZSBmYXN0IHRyYWNrIGZvciBvdXIgc3VibWl4Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKCk7CisgICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKG1JZCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIHNxLT5zZXRPYnNlcnZlckR1bXAoJm1TdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wKTsKQEAgLTM5MTcsOCArNDE1MSwxMCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMzkyNiwyNCArNDE2MiwzMCBAQAogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmsgPSBtT3V0cHV0U2luay5nZXQoKTsKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKKyAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKKyAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0TWl4ZXJGdXRleDsKICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0TWl4ZXJEdW1wU3RhdGU7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgc3RhdGUtPm1UZWVTaW5rID0gbVRlZVNpbmsuZ2V0KCk7Ci0jZW5kaWYKICAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdE1peGVyTG9nU2l6ZSwgIkZhc3RNaXhlciIpOwogICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RNaXhlck5CTG9nV3JpdGVyLmdldCgpOwogICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAKKyAgICAgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgaW5mbzsKKyAgICAgICAgaW5mby5pZCA9IG1JZDsKKyAgICAgICAgaW5mby50eXBlID0gTkJMb2c6OkZBU1RNSVhFUjsKKyAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsKKwogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdE1peGVyKTsKIAogI2lmZGVmIEFVRElPX1dBVENIRE9HCkBAIC0zOTUyLDkgKzQxOTQsMTQgQEAKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnNldER1bXAoJm1BdWRpb1dhdGNoZG9nRHVtcCk7CiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5ydW4oIkF1ZGlvV2F0Y2hkb2ciLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICB0aWQgPSBtQXVkaW9XYXRjaGRvZy0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAjZW5kaWYKLQorICAgIH0gZWxzZSB7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gT25seSB1c2UgdGhlIE1peGVyVGhyZWFkIHRlZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgIG1UZWUuc2V0KG1PdXRwdXRTaW5rLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfTSIpOworI2VuZGlmCiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC00MDE4LDEyICs0MjY1LDYgQEAKICAgICByZXR1cm4gbGF0ZW5jeTsKIH0KIAotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQotewotICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyh0cmFja3NUb1JlbW92ZSk7Ci19Ci0KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQpAQCAtNDIyMiwxNCArNDQ2MywxNCBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKAogICAgICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSkKIHsKLSAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIG5hbWVzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcwotICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKFt0aGlzXShpbnQgbmFtZSkgewotICAgICAgICAvLyBmb3IgZWFjaCBuYW1lLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCi0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveShuYW1lKTsKKyAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIGlkcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tJZHMoW3RoaXNdKGludCB0cmFja0lkKSB7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrSWQsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KHRyYWNrSWQpOwogICAgICAgICB9CiAgICAgfSk7Ci0gICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja0lkcygpOwogCiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZApAQCAtNDI3MCw2ICs0NTExLDM4IEBACiAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCiAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgogCisgICAgLy8gRGVmZXJyZWRPcGVyYXRpb25zIGhhbmRsZXMgc3RhdGlzdGljcyBhZnRlciBzZXR0aW5nIG1peGVyU3RhdHVzLgorICAgIGNsYXNzIERlZmVycmVkT3BlcmF0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBEZWZlcnJlZE9wZXJhdGlvbnMobWl4ZXJfc3RhdGUgKm1peGVyU3RhdHVzKQorICAgICAgICAgICAgOiBtTWl4ZXJTdGF0dXMobWl4ZXJTdGF0dXMpIHsgfQorCisgICAgICAgIC8vIHdoZW4gbGVhdmluZyBzY29wZSwgdGFsbHkgZnJhbWVzIHByb3Blcmx5LgorICAgICAgICB+RGVmZXJyZWRPcGVyYXRpb25zKCkgeworICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IG1peGluZyAoTUlYRVJfVFJBQ0tTX1JFQURZKQorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIHVuZGVycnVuIG9jY3Vycy4KKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZhc3RUcmFja3MgYW5kIE5vcm1hbFRyYWNrcyBoZXJlLgorICAgICAgICAgICAgaWYgKCptTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1bmRlcnJ1biA6IG1VbmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5maXJzdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRhbGx5VW5kZXJydW5GcmFtZXMoKSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSB0cmFjayBjb3VudGVycworICAgICAgICAvLyB3aXRoIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gZnJhbWVzIGZvciBhIHBhcnRpY3VsYXIgbWl4ZXIgcGVyaW9kLgorICAgICAgICAvLyBXZSBkZWZlciB0YWxseWluZyB1bnRpbCB3ZSBrbm93IHRoZSBmaW5hbCBtaXhlciBzdGF0dXMuCisgICAgICAgIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzcDxUcmFjaz4gdHJhY2ssIHNpemVfdCB1bmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgbVVuZGVycnVuRnJhbWVzLmVtcGxhY2VfYmFjayh0cmFjaywgdW5kZXJydW5GcmFtZXMpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBtaXhlcl9zdGF0ZSAqIGNvbnN0IG1NaXhlclN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNwPFRyYWNrPiwgc2l6ZV90Pj4gbVVuZGVycnVuRnJhbWVzOworICAgIH0gZGVmZXJyZWRPcGVyYXRpb25zKCZtaXhlclN0YXR1cyk7IC8vIGltcGxpY2l0IG5lc3RlZCBzY29wZSBmb3IgdmFyaWFibGUgY2FwdHVyZQorCisgICAgYm9vbCBub0Zhc3RIYXB0aWNUcmFjayA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV07CiAKQEAgLTQyNzgsNiArNDU1MSw5IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBmYXN0IHRyYWNrcwogICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBub0Zhc3RIYXB0aWNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgKHRob3VnaCB1bmxpa2VseSkgZm9yIGEgZmFzdCB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgICAvLyBhbmQgdGhlbiByZW1vdmVkIHdpdGhpbiB0aGUgc2FtZSBub3JtYWwgbWl4IGN5Y2xlLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBhcwpAQCAtNDMwNCwxMyArNDU4MCwxNCBAQAogICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIC8vIGRvbid0IGNvdW50IHVuZGVycnVucyB0aGF0IG9jY3VyIHdoaWxlIHN0b3BwaW5nIG9yIHBhdXNpbmcKICAgICAgICAgICAgIC8vIG9yIHN0b3BwZWQgd2hpY2ggY2FuIG9jY3VyIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQgd2hpbGUgYWN0aXZlCisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKCEodHJhY2stPmlzU3RvcHBpbmcoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICByZWNlbnRVbmRlcnJ1bnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgZmFzdCBtaXhlciB3aWxsIHB1bGwgJiBtaXggcGFydGlhbCBidWZmZXJzLCBidXQgd2UgY291bnQgYXMgYSBmdWxsIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMocmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWNjb3VudCBmb3IgRmFzdFRyYWNrIHVuZGVycnVucy4KKyAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBub3JtYWwgdHJhY2tzLAogICAgICAgICAgICAgLy8gd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGZvciBmYXN0IHRyYWNrcy4KQEAgLTQ0MDIsNiArNDY3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTQ0NDcsNiArNDcyNiwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDU2LDE5ICs0NzM5LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODksNyArNDc3NCw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NTAxLDEzICs0Nzg2LDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTI0LDkgKzQ4MDksOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzNyw5ICs0ODIyLDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyB0cmFjayBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsIGRvIG5vdCByYW1wIG9uIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ2MzUsMjQgKzQ5MjMsMjUgQEAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUodHJhY2tJZCk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCAodm9pZCAqKXRyYWNrLT5mb3JtYXQoKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykpOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKQEAgLTQ2NjIsMTQgKzQ5NTEsMTQgQEAKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAogICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClyZXFTYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKICAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKQEAgLTQ2OTAsMjkgKzQ5NzksMzcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPwogICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCkpOwogCiAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllczsKQEAgLTQ3MjUsMTMgKzUwMjIsMTMgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVkKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gZGVzaXJlZEZyYW1lczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmVycmVkT3BlcmF0aW9ucy50YWxseVVuZGVycnVuRnJhbWVzKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CiAKICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCiAgICAgICAgICAgICAvLyBwcmV2aW91cyBhdWRpbyBidWZmZXIgYWdhaW4gdG8gZWZmZWN0cwpAQCAtNDc0MCw3ICs1MDM3LDcgQEAKICAgICAgICAgICAgICAgICBjaGFpbi0+Y2xlYXJJbnB1dEJ1ZmZlcigpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKICAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgpAQCAtNDc1OSw3ICs1MDU2LDggQEAKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwgbmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTQ3NzIsMTMgKzUwNzAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKHRyYWNrSWQpOwogICAgICAgICB9CiAKICAgICAgICAgfSAgIC8vIGxvY2FsIHZhcmlhYmxlIHNjb3BlIHRvIGF2b2lkIGdvdG8gd2FybmluZwogCiAgICAgfQogCisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUgJiYgc3EgIT0gTlVMTCkgeworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGZhc3QgdHJhY2sgcGxheWluZyBoYXB0aWMgYW5kIEZhc3RNaXhlciBleGlzdHMsCisgICAgICAgIC8vIGVuYWJsaW5nIHRoZSBmaXJzdCBGYXN0VHJhY2ssIHdoaWNoIHByb3ZpZGVzIG1peGVkIGRhdGEgZnJvbSBub3JtYWwKKyAgICAgICAgLy8gdHJhY2tzLCB0byBwbGF5IGhhcHRpYyBkYXRhLgorICAgICAgICBGYXN0VHJhY2sgKmZhc3RUcmFjayA9ICZzdGF0ZS0+bUZhc3RUcmFja3NbMF07CisgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gbm9GYXN0SGFwdGljVHJhY2spIHsKKyAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG5vRmFzdEhhcHRpY1RyYWNrOworICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFB1c2ggdGhlIG5ldyBGYXN0TWl4ZXIgc3RhdGUgaWYgbmVjZXNzYXJ5CiAgICAgYm9vbCBwYXVzZUF1ZGlvV2F0Y2hkb2cgPSBmYWxzZTsKICAgICBpZiAoZGlkTW9kaWZ5KSB7CkBAIC00ODMzLDkgKzUxNDIsOSBAQAogICAgIC8vIG9mIHByZXBhcmVUcmFja3NfbCgpOyB0aGlzIHJlbGVhc2VzIGFueSBvdXRzdGFuZGluZyBidWZmZXIgYmFjayB0byB0aGUgdHJhY2suCiAgICAgLy8gU2VlIGFsc28gdGhlIGltcGxlbWVudGF0aW9uIG9mIGRlc3Ryb3lUcmFja19sKCkuCiAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6ICp0cmFja3NUb1JlbW92ZSkgewotICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7Ci0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOworICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTAwNCwxNyArNTMxMywxNyBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQpAQCAtNTAzMCw2ICs1MzM5LDE1IEBACiAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6ICVzXG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBiYWxhbmNlOiAlZiAoJXMpXG4iLCBtTWFzdGVyQmFsYW5jZS5sb2FkKCksCisgICAgICAgICAgICAoaGFzRmFzdE1peGVyKCkgPyBzdGQ6OnRvX3N0cmluZyhtRmFzdE1peGVyLT5nZXRNYXN0ZXJCYWxhbmNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQmFsYW5jZS50b1N0cmluZygpKS5jX3N0cigpKTsKKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogJS4ybGZcbiIsIGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogdW5hdmFpbFxuIik7CisgICAgfQogCiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwpAQCAtNTAzOCw5ICs1MzU2LDkgQEAKICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdE1peGVyRHVtcFN0YXRlKG1GYXN0TWl4ZXJEdW1wU3RhdGUpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdE1peGVyRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RNaXhlckR1bXBTdGF0ZT4obUZhc3RNaXhlckR1bXBTdGF0ZSk7CiAgICAgICAgIGNvcHktPmR1bXAoZmQpOwotICAgICAgICBkZWxldGUgY29weTsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgLy8gU2ltaWxhciBmb3Igc3RhdGUgcXVldWUKQEAgLTUwNjEsMTIgKzUzNzksNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlclxuIik7CiAgICAgfQotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBXcml0ZSB0aGUgdGVlIG91dHB1dCB0byBhIC53YXYgZmlsZQotICAgIGR1bXBUZWUoZmQsIG1UZWVTb3VyY2UsIG1JZCwgJ00nKTsKLSNlbmRpZgotCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC01MDkzLDIzICs1NDA1LDM0IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLAorICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSkKLSAgICAgICAgLCBtVm9sdW1lU2hhcGVyQWN0aXZlKGZhbHNlKQogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp+RGlyZWN0T3V0cHV0VGhyZWFkKCkKIHsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOworICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBiYWxhbmNlOiAlZiAgTGVmdDogJWYgIFJpZ2h0OiAlZlxuIiwKKyAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSwgbU1hc3RlckJhbGFuY2VMZWZ0LCBtTWFzdGVyQmFsYW5jZVJpZ2h0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1NYXN0ZXJCYWxhbmNlICE9IGJhbGFuY2UpIHsKKyAgICAgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7CisgICAgICAgIG1CYWxhbmNlLmNvbXB1dGVTdGVyZW9CYWxhbmNlKGJhbGFuY2UsICZtTWFzdGVyQmFsYW5jZUxlZnQsICZtTWFzdGVyQmFsYW5jZVJpZ2h0KTsKKyAgICAgICAgYnJvYWRjYXN0X2woKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKQogewogICAgIGZsb2F0IGxlZnQsIHJpZ2h0OwpAQCAtNTEzMywxMiArNTQ1NiwxMiBAQAogICAgICAgICBpZiAobGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgICAgIGxlZnQgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICB9Ci0gICAgICAgIGxlZnQgKj0gdjsKKyAgICAgICAgbGVmdCAqPSB2ICogbU1hc3RlckJhbGFuY2VMZWZ0OyAvLyBEaXJlY3RPdXRwdXRUaHJlYWQgYmFsYW5jZSBhcHBsaWVkIGFzIHRyYWNrIHZvbHVtZQogICAgICAgICByaWdodCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAgICAgICAgIGlmIChyaWdodCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgICAgIHJpZ2h0ID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgfQotICAgICAgICByaWdodCAqPSB2OworICAgICAgICByaWdodCAqPSB2ICogbU1hc3RlckJhbGFuY2VSaWdodDsKICAgICB9CiAKICAgICBpZiAobGFzdFRyYWNrKSB7CkBAIC01MTgwLDYgKzU1MDMsMTEgQEAKICAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocHJldmlvdXNUcmFjayA9PSAwKSB7CisgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGFuIG9sZCB0cmFjayBhZGRlZCBiYWNrIGR1cmluZyB0cmFjayB0cmFuc2l0aW9uIGZvciBkaXJlY3QKKyAgICAgICAgLy8gb3V0cHV0LCBzbyBhbHdheXMgaXNzdWVzIGZsdXNoIHRvIGZsdXNoIGRhdGEgb2YgdGhlIHByZXZpb3VzIHRyYWNrIGlmIGl0CisgICAgICAgIC8vIHdhcyBhbHJlYWR5IGRlc3Ryb3llZCB3aXRoIEhBTCBwYXVzZWQsIHRoZW4gZmx1c2ggY2FuIHJlc3VtZSB0aGUgcGxheWJhY2sKKyAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgfQogICAgIFBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKTsKIH0KQEAgLTUyMTgsNyArNTU0Niw2IEBACiAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmx1c2hQZW5kaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5mbHVzaEFjaygpOwogICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTUyNTMsNyArNTU4MCw3IEBACiAgICAgICAgIGlmICgodHJhY2stPmZyYW1lc1JlYWR5KCkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmICF0cmFjay0+aXNQYXVzZWQoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNTdG9wcGluZ18yKCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtPS10iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwpAQCAtNTMxNSw3ICs1NjQyLDggQEAKIAogICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IG1CeXRlc1dyaXR0ZW4gLyBtRnJhbWVTaXplOwogICAgICAgICAgICAgICAgIGlmIChtU3RhbmRieSB8fCAhbGFzdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTMyOSw3ICs1NjU3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgbGFzdCB0cmFjayBzdGFydGVkIGZvciBtaXhlciBzdGF0ZSBjb250cm9sCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNTU2OCw2ICs1ODk2LDcgQEAKICAgICBtT3V0cHV0LT5mbHVzaCgpOwogICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgIG1GbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOyAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBmbHVzaCByZXNldHMgZnJhbWUgY291bnQuCiB9CiAKIGludDY0X3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7CkBAIC01ODExLDcgKzYxNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9ICBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewotICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtPS10iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKICAgICAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNTg1NSw3ICs2MTg0LDcgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrKCVkKSBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBIYXJkd2FyZSBidWZmZXIgY2FuIGhvbGQgYSBsYXJnZSBhbW91bnQgb2YgYXVkaW8gc28gd2UgbXVzdApAQCAtNTkwMiw2ICs2MjMxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgc3RvcCByZXNldHMgZnJhbWUgY291bnRzLgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1Vc2VBc3luY1dyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBnZXQgZXhwbGljaXQgZHJhaW4gbm90aWZpY2F0aW9uIHdlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoIWxhc3QpIG9yIHRoZSB1cGNvbWluZyAobGFzdCkgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNraXBwaW5nIHRoZSBkaXNjb250aW51aXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCkBAIC01OTIzLDggKzYyNjAsOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZykgeyAvLyBzdGlsbCBydW5uaW5nLCBnaXZlIHVzIG1vcmUgdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNPZmZsb2FkOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWRUaHJlYWQ6IEJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxsIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTYwNjcsNyArNjQwNCwyMiBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsV3JpdHRlbiA9IG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKworICAgICAgICAvLyBDb25zaWRlciB0aGUgZmlyc3QgT3V0cHV0VHJhY2sgZm9yIHRpbWVzdGFtcCBhbmQgZnJhbWUgY291bnRpbmcuCisKKyAgICAgICAgLy8gVGhlIHRocmVhZExvb3AoKSBnZW5lcmFsbHkgYXNzdW1lcyB3cml0aW5nIGEgZnVsbCBzaW5rIGJ1ZmZlciBzaXplIGF0IGEgdGltZS4KKyAgICAgICAgLy8gSGVyZSwgd2UgY29ycmVjdCBmb3Igd3JpdGVGcmFtZXMgb2YgMCAoYSBzdG9wKSBvciB1bmRlcnJ1bnMgYmVjYXVzZQorICAgICAgICAvLyB3ZSBhbHdheXMgY2xhaW0gc3VjY2Vzcy4KKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBjb3JyZWN0aW9uID0gbVNpbmtCdWZmZXJTaXplIC8gbUZyYW1lU2l6ZSAtIGFjdHVhbFdyaXR0ZW47CisgICAgICAgICAgICBBTE9HRF9JRihjb3JyZWN0aW9uICE9IDAgJiYgd3JpdGVGcmFtZXMgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiB3cml0ZUZyYW1lczoldSAgYWN0dWFsV3JpdHRlbjolemQgIGNvcnJlY3Rpb246JXpkICBtRnJhbWVzV3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHdyaXRlRnJhbWVzLCBhY3R1YWxXcml0dGVuLCBjb3JyZWN0aW9uLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKKyAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuIC09IGNvcnJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBSZXBvcnQgY29ycmVjdGlvbiBmb3IgdGhlIG90aGVyIG91dHB1dCB0cmFja3MgYW5kIHNob3cgaW4gdGhlIGR1bXAuCiAgICAgfQogICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKQEAgLTYwOTIsNyArNjQ0NCw3IEBACiAgICAgICAgIHNzIDw8ICI6IjsKICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1PdXRwdXRUcmFja3MpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IHRyYWNrLT50aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5uYW1lKCkgPDwgIiA6ICI7CisgICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5pZCgpIDw8ICIgOiAiOwogICAgICAgICAgICAgaWYgKHRocmVhZC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgc3MgPDwgdGhyZWFkLmdldCgpIDw8ICIsICIgPDwgdGhyZWFkLT5pZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYyMzIsOSArNjU4NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAogICAgIG1JbnB1dChpbnB1dCksCkBAIC02MjQyLDkgKzY1OTEsNiBAQAogICAgIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcywgbVJzbXBJbkZyYW1lc1AyLCBhbmQgbVJzbXBJbkZyYW1lc09BIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLCBtVGVlU2luayh0ZWVTaW5rKQotI2VuZGlmCiAgICAgLCBtUmVhZE9ubHlIZWFwKG5ldyBNZW1vcnlEZWFsZXIoa1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUsCiAgICAgICAgICAgICAiUmVjb3JkVGhyZWFkUk8iLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKSkKICAgICAvLyBtRmFzdENhcHR1cmUgYmVsb3cKQEAgLTYyNjEsOCArNjYwNywyMCBAQAogICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CiAgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwogCisgICAgaWYgKG1JbnB1dCAhPSBudWxscHRyICYmIG1JbnB1dC0+YXVkaW9Id0RldiAhPSBudWxscHRyKSB7CisgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKKyAgICAgICAgICAgICAgICBtSW5wdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKKyAgICB9CisKICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKKyAgICAvLyBBVURJT19ERVZJQ0VfSU5fQlVTLCBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFAsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXByb3BlcnR5X2dldF9pbnQ2NCgKKyAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX2lucHV0X2RldmljZXMiLAorICAgICAgICAgICAgKGludDY0X3QpKG1Jc01zZERldmljZSA/IEFVRElPX0RFVklDRV9JTl9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworCiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNvdXJjZSBmb3IgdGhlIEhBTCBpbnB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtSW5wdXRTb3VyY2UgPSBuZXcgQXVkaW9TdHJlYW1JblNvdXJjZShpbnB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CkBAIC02MzU5LDcgKzY3MTcsNyBAQAogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCiAgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0Q2FwdHVyZSk7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gRklYTUUKQEAgLTYzNjcsNiArNjcyNSwxMCBAQAogCiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CiAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXQobUlucHV0U291cmNlLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19JTlBVVF9USFJFQUQpOworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX0MiKTsKKyNlbmRpZgogZmFpbGVkOiA7CiAKICAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCkBAIC02NDI3LDggKzY3ODksMTAgQEAKICAgICAvLyB1c2VkIHRvIHJlcXVlc3QgYSBkZWZlcnJlZCBzbGVlcCwgdG8gYmUgZXhlY3V0ZWQgbGF0ZXIgd2hpbGUgbXV0ZXggaXMgdW5sb2NrZWQKICAgICB1aW50MzJfdCBzbGVlcFVzID0gMDsKIAorICAgIGludDY0X3QgbGFzdExvb3BDb3VudFJlYWQgPSAtMjsgIC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCisKICAgICAvLyBsb29wIHdoaWxlIHRoZXJlIGlzIHdvcmsgdG8gZG8KLSAgICBmb3IgKDs7KSB7CisgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7OyArK2xvb3BDb3VudCkgeyAgLy8gbG9vcENvdW50IHVzZWQgZm9yIHN0YXRpc3RpY3MgdHJhY2tpbmcKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKICAgICAgICAgLy8gYWN0aXZlVHJhY2tzIGFjY3VtdWxhdGVzIGEgY29weSBvZiBhIHN1YnNldCBvZiBtQWN0aXZlVHJhY2tzCkBAIC02NDk0LDYgKzY4NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNJTkc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0VEOwogICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NTE1LDEyICs2ODgwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGFsbFN0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOiAgICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGlkbGUKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0VEOiAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBFRDogLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBkZXN0cm95ZWQvdGVybWluYXRlZAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVW5leHBlY3RlZCBhY3RpdmUgdHJhY2sgc3RhdGU6JWQsIGlkOiVkLCB0cmFja3M6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWN0aXZlVHJhY2tTdGF0ZSwgYWN0aXZlVHJhY2stPmlkKCksIHNpemUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQoYWN0aXZlVHJhY2spOwpAQCAtNjU0NSw3ICs2OTEwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcwotICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2xlZXBVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKICAgICAgICAgICAgICAgICB9CkBAIC02NTk2LDYgKzY5NjEsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGFicCA9IChmYXN0VHJhY2sgIT0gMCAmJiBmYXN0VHJhY2stPmlzUGF0Y2hUcmFjaygpKSA/CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9CdWZmZXJQcm92aWRlcio+KGZhc3RUcmFjay5nZXQoKSkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gYWJwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IGFicDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IGZhc3RUcmFjayA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEIDogZmFzdFRyYWNrLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOwogICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgewogICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKQEAgLTY2MTgsMTEgKzY5OTEsMTEgQEAKIAogICAgICAgICBpbnQzMl90IHJlYXIgPSBtUnNtcEluUmVhciAmIChtUnNtcEluRnJhbWVzUDIgLSAxKTsKICAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkOworICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0JlZ2luTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIHN0YXJ0IElPIHRpbWluZwogCiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKIAogICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCkBAIC02Njc2LDE2ICs3MDQ5LDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAvLyBlbmQgSU8gdGltaW5nCisKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBzZXJ2ZXIgc3RhdHMKICAgICAgICAgLy8gc3lzdGVtVGltZSgpIGlzIG9wdGlvbmFsIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyB0aW1lc3RhbXBzLgogICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSArPSBmcmFtZXNSZWFkOwotICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IGxhc3RJb0VuZE5zOwogCiAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2ZXIgdGltZXN0YW1wIHdpdGgga2VybmVsIHN0YXRzCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZS5nZXQoKSA9PSBudWxscHRyIC8qIGRvbid0IG9idGFpbiBmb3IgRmFzdENhcHR1cmUsIGNvdWxkIGJsb2NrICovKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uLCB0aW1lOwotICAgICAgICAgICAgaW50IHJldCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5wdXQtPnN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpID09IE5PX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIHRpbWUgPiBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pIHsKKworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQocG9zaXRpb24sIHRpbWUsIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgdGltZXN0YW1wcworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSB0aW1lOwogICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGdlbmVyYWwgcmVjb3JkIGJ1ZmZlcnMgc2hvdWxkIHRlbmQgdG8gYmUgZW1wdHkgaW4KQEAgLTY2OTMsNiArNzA4NCw4IEBACiAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAvLyBBbHNvLCBpdCBpcyBub3QgYWR2YW50YWdlb3VzIHRvIGNhbGwgZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiBkdXJpbmcgdGhlIHJlYWQKICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgcmVhZCBvYnRhaW5zIGEgbG9jaywgcHJldmVudGluZyB0aGUgdGltZXN0YW1wIGNhbGwgZnJvbSBleGVjdXRpbmcuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIFVzZSB0aGlzIHRvIHRyYWNrIHRpbWVzdGFtcCBpbmZvcm1hdGlvbgpAQCAtNjcwOCwxMCArNzEwMSwyOSBAQAogICAgICAgICAgICAgZ290byB1bmxvY2s7CiAgICAgICAgIH0KICAgICAgICAgQUxPR19BU1NFUlQoZnJhbWVzUmVhZCA+IDApOworICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogCi0gICAgICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOworICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkKKyAgICAgICAgICAgICAgICAmJiBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFJlYWQgKyAxKSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHJlYWRQZXJpb2ROcyA9IGxhc3RJb0VuZE5zIC0gbUxhc3RJb0VuZE5zOworICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8aW50NjRfdCwgaW50NjRfdD46OmNvbXB1dGVKaXR0ZXJNcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJhbWVzUmVhZCwgcmVhZFBlcmlvZE5zfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHByb2Nlc3NNcyA9IChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOworICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICBtTGFzdElvQmVnaW5OcyA9IGxhc3RJb0JlZ2luTnM7CisgICAgICAgIG1MYXN0SW9FbmROcyA9IGxhc3RJb0VuZE5zOworICAgICAgICBsYXN0TG9vcENvdW50UmVhZCA9IGxvb3BDb3VudDsKKworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICh2b2lkKW1UZWUud3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CisjZW5kaWYKICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KICAgICAgICAgewogICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKQEAgLTY3NjksOSArNzE4MSwzMyBAQAogICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG1pbihmcmFtZXNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkZyYW1lc1Bvc3NpYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgbVNhbXBsZVJhdGUsIGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZSkpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgZnJhbWVzIGZyb20gdGhlIFJlY29yZFRocmVhZCBidWZmZXIgcHJvdmlkZXIgdG8gdGhlIFJlY29yZFRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwgZnJhbWVzT3V0KTsKKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNEaXJlY3QoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgdXNlZCBmb3IgZGlyZWN0IHN0cmVhbXMuIFBhc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgZnJvbSBSZWNvcmRUaHJlYWQgYnVmZmVyIHRvIFJlY29yZFRyYWNrIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgYnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoYnVmZmVyLmZyYW1lQ291bnQgIT0gZnJhbWVzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSByZWFkIGxlc3MgdGhhbiBleHBlY3RlZCAoJXp1IHZzICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnVmZmVyLmZyYW1lQ291bnQsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBidWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBidWZmZXIucmF3LCBidWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSBjYW5ub3QgZmlsbCByZXF1ZXN0LCBzdGF0dXM6ICVkLCBmcmFtZUNvdW50OiAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIGJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgZnJhbWVzIGZyb20gdGhlIFJlY29yZFRocmVhZCBidWZmZXIgcHJvdmlkZXIgdG8gdGhlIFJlY29yZFRyYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCAmJiAob3ZlcnJ1biA9PSBPVkVSUlVOX1VOS05PV04pKSB7CiAgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX0ZBTFNFOwpAQCAtNjk0Miw2ICs3Mzc4LDEyIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkgJiYgKCpmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgb24gYW4gZW5jb2RlZCBzdHJlYW0gcmVxdWlyZXMgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QiKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC03MTA3LDggKzc1NDksMTQgQEAKICAgICB7CiAgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIHJlbmRlenZvdXMgYmV0d2VlbiBiaW5kZXIgdGhyZWFkIGV4ZWN1dGluZyBzdGFydCgpIGFuZCBSZWNvcmRUaHJlYWQKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKICAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc3RvcHBlZCB5ZXQgKG1vdmVkIHRvIFBBVVNFRCBhbmQgbm90IGluIG1BY3RpdmVUcmFja3MpCisgICAgICAgICAgICAgICAgLy8gc28gbm8gbmVlZCB0byBzdGFydElucHV0KCkuCiAgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgUEFVU0lORyAtPiBBQ1RJVkUiKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNzEyNSwxNyArNzU3MywzNCBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpLCAmc2lsZW5jZWQpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CisgICAgICAgICAgICAgICAgICAgIC8vIFNUQVJUSU5HXzIgZm9yY2VzIGRlc3Ryb3kgdG8gY2FsbCBzdG9wSW5wdXQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHVuc3luY2hyb25pemVkIG1TdGF0ZTolZCBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIC8vIFNvbWVvbmUgZWxzZSBoYXMgY2hhbmdlZCBzdGF0ZSwgbGV0IHRoZW0gdGFrZSBvdmVyLAorICAgICAgICAgICAgICAgIC8vIGxlYXZlIG1TdGF0ZSBpbiB0aGUgbmV3IHN0YXRlLgorICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2UncmUgb2ssIGJ1dCBwZXJoYXBzIHN0YXJ0SW5wdXQgaGFzIGZhaWxlZAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHN0YXJ0SW5wdXQgZmFpbGVkLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIEFjdGl2ZVRyYWNrcyBpZiBTVEFSVElOR18xIGFuZCB2YWxpZCwgc28gcmVtb3ZlIGZyb20gQWN0aXZlVHJhY2tzLAorICAgICAgICAgICAgICAgIC8vIGxlYXZlIGluIFNUQVJUSU5HXzEsIHNvIGRlc3Ryb3koKSB3aWxsIG5vdCBjYWxsIHN0b3BJbnB1dC4KICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShyZWNvcmRUcmFjayk7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udApAQCAtNzE0MywyNiArNzYwOCwxNSBAQAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKLSAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIGlmICghcmVjb3JkVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLXN0YXJ0RXJyb3I6Ci0gICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7Ci0gICAgfQotICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KLSAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNzE4MSwyNCArNzYzNSwyNiBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIC8vIGlmIHdlJ3JlIGludmFsaWQsIHdlIGNhbid0IGJlIG9uIHRoZSBBY3RpdmVUcmFja3MuCiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwotICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAotICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB3aGlsZSAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcgJiYgIXJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCisgICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwogICAgIH0KLSAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKLSAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgeworCisgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTRUQpIHsgLy8gc3VjY2Vzc2Z1bCBzdG9wCiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvLyBkb24ndCBoYW5kbGUgYW55dGhpbmcgLSB3ZSd2ZSBiZWVuIGludmFsaWRhdGVkIG9yIHJlc3RhcnRlZCBhbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUKKyAgICBBTE9HV19JRigiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBzdG9wLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTcyNDEsNiArNzY5NywyMCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKQoreworICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24iKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pCit7CisgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uIik7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUlucHV0LT5zdHJlYW0tPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCiB7CiAgICAgaWYgKG1JbnB1dCA9PSBudWxscHRyIHx8IG1JbnB1dC0+c3RyZWFtID09IG51bGxwdHIgfHwKQEAgLTczMDAsNyArNzc3MCw4IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGlucHV0ICE9IE5VTEwgPyBpbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1JbjogJXAgZmxhZ3MgJSN4ICglcylcbiIsCiAgICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIGlucHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZXMgcmVhZDogJWxsZFxuIiwgKGxvbmcgbG9uZyltRnJhbWVzUmVhZCk7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogCkBAIC03MzA5LDYgKzc3ODAsMTQgQEAKICAgICAgICAgKHZvaWQpaW5wdXQtPnN0cmVhbS0+ZHVtcChmZCk7CiAgICAgfQogCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IFJlY29yZFRyYWNrOjpjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQobUZvcm1hdCwgZmxhZ3MpCisgICAgICAgICAgICA/IC0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpIDogMC47CisgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWxSZWNvcmQgbGF0ZW5jeSBtczogJS4ybGZcbiIsIGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsUmVjb3JkIGxhdGVuY3kgbXM6IHVuYXZhaWxcbiIpOworICAgIH0KKwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKQEAgLTczMTYsOSArNzc5NSw5IEBACiAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgLy8gRklYTUUgMjU5NzI5NTg6IE5lZWQgYW4gaW50ZWxsaWdlbnQgY29weSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IHRvdWNoIHVudXNlZCBwYWdlcy4KLSAgICBjb25zdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0Q2FwdHVyZUR1bXBTdGF0ZShtRmFzdENhcHR1cmVEdW1wU3RhdGUpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0Q2FwdHVyZUR1bXBTdGF0ZT4gY29weSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RDYXB0dXJlRHVtcFN0YXRlPihtRmFzdENhcHR1cmVEdW1wU3RhdGUpOwogICAgIGNvcHktPmR1bXAoZmQpOwotICAgIGRlbGV0ZSBjb3B5OwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKQEAgLTczMzIsNyArNzgxMSw3IEBACiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1UcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtNzM1Miw3ICs3ODMxLDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC03NjQ3LDEwICs4MTI2LDE1IEBACiB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmbVNhbXBsZVJhdGUsICZtQ2hhbm5lbE1hc2ssICZtSEFMRm9ybWF0KTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgYXVkaW8gcHJvcGVydGllcyBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwotICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsIG1DaGFubmVsQ291bnQsIEZDQ184KTsKICAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpLCAiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfOCwgIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLAorICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIEZDQ184KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDYW4gaGF2ZSBtb3JlIHRoYXQgRkNDXzggY2hhbm5lbHMgaW4gZW5jb2RlZCBzdHJlYW1zLgorICAgICAgICBBTE9HSSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICB9CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEZyYW1lU2l6ZSgmbUZyYW1lU2l6ZSk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciByZXRyaWV2aW5nIGZyYW1lIHNpemUgZnJvbSBIQUw6ICVkIiwgcmVzdWx0KTsKICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgmbUJ1ZmZlclNpemUpOwpAQCAtNzc1NSw3ICs4MjM5LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCiB7CiAgICAgLy8gb25seSBvbmUgY2hhaW4gcGVyIGlucHV0IHRocmVhZAotICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtRWZmZWN0Q2hhaW5zLmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HVygiYWRkRWZmZWN0Q2hhaW5fbCgpIGFscmVhZHkgb25lIGNoYWluICVwIG9uIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTc3OTQsNiArODI3OCw3IEBACiAKICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKICAgICBtSW5EZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgIG1QYXRjaCA9ICpwYXRjaDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKQEAgLTc4MzUsOSArODMyMCwxMCBAQAogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCi0gICAgaWYgKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB7CisgICAgaWYgKChtSW5EZXZpY2UgIT0gbVByZXZJbkRldmljZSkgfHwgKG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSBtSW5EZXZpY2U7CisgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CkBAIC03ODYwLDI0ICs4MzQ2LDI4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVRyYWNrcy5hZGQocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc5MzAsNyArODQyMCw3IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAogICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX05PTkUpLAotICAgICAgbURldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKICAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKICAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCiAgICAgICBtSGFsVm9sRmxvYXQoLTEuMGYpLCAvLyBJbml0aWFsaXplIHRvIGlsbGVnYWwgdmFsdWUgc28gaXQgYWx3YXlzIGdldHMgc2V0IHByb3Blcmx5IGxhdGVyLgpAQCAtNzk2NCw3ICs4NDU0LDcgQEAKICAgICB9CiAgICAgLy8gVGhpcyB3aWxsIGRlY3JlbWVudCByZWZlcmVuY2VzIGFuZCBtYXkgY2F1c2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoaXMgdGhyZWFkLgogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICB9CkBAIC04MDQzLDYgKzg1MzMsNyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLApAQCAtODA1MSw3ICs4NTQyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgIEFMT0dEX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCisgICAgICAgICAgICAgICAgICJNbWFwVGhyZWFkOjpzdGFydCBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwpAQCAtODA3NiwyMSArODU3MCwyMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGJvb2wgc2lsZW5jZWQgPSBmYWxzZTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQocG9ydElkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCk7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyBhYm9ydCBpZiBzdGFydCBpcyByZWplY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzdGFydCByZWplY3RlZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9CkBAIC04MTAxLDIxICs4NTk0LDIxIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPworICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0KCksIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CisKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICAvLyBmb3JjZSB2b2x1bWUgdXBkYXRlIHdoZW4gYSBuZXcgdHJhY2sgaXMgYWRkZWQKICAgICAgICAgbUhhbFZvbEZsb2F0ID0gLTEuMGY7Ci0gICAgfSBlbHNlIGlmICghc2lsZW5jZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNTaWxlbmNlZF9sKCkgJiYgdHJhY2stPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCi0gICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKKyAgICB9IGVsc2UgaWYgKCF0cmFjay0+aXNTaWxlbmNlZF9sKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgaWYgKHQtPmlzU2lsZW5jZWRfbCgpICYmIHQtPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCisgICAgICAgICAgICAgICAgdC0+aW52YWxpZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KLSAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOwogCi0gICAgdHJhY2stPnNldFNpbGVuY2VkX2woc2lsZW5jZWQpOwogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC04MTYyLDggKzg2NTUsOCBAQAogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dCh0cmFjay0+cG9ydElkKCkpOwpAQCAtODE4OCw3ICs4NjgxLDcgQEAKICAgICBpZiAobUhhbFN0cmVhbSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgIGlmICghbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC04NDE1LDcgKzg5MDgsNyBAQAogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCi0gICAgaWYgKGlzT3V0cHV0KCkgJiYgbVByZXZPdXREZXZpY2UgIT0gbU91dERldmljZSkgeworICAgIGlmIChpc091dHB1dCgpICYmIChtUHJldk91dERldmljZSAhPSBtT3V0RGV2aWNlIHx8IG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgbVByZXZPdXREZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwpAQCAtODQyNiw3ICs4OTE5LDcgQEAKICAgICAgICAgfQogICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9Ci0gICAgaWYgKCFpc091dHB1dCgpICYmIG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlKSB7CisgICAgaWYgKCFpc091dHB1dCgpICYmIChtUHJldkluRGV2aWNlICE9IG1JbkRldmljZSB8fCBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpKSB7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CkBAIC04NDU5LDkgKzg5NTIsOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwogICAgICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUF1ZGlvSHdEZXYtPmhhbmRsZSgpOwpAQCAtODYyNiw3ICs5MTE5LDcgQEAKICAgICBkcHJpbnRmKGZkLCAiICBBdHRyaWJ1dGVzOiBjb250ZW50IHR5cGUgJWQgdXNhZ2UgJWQgc291cmNlICVkXG4iLAogICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLCBtQXR0ci51c2FnZSwgbUF0dHIuc291cmNlKTsKICAgICBkcHJpbnRmKGZkLCAiICBTZXNzaW9uOiAlZCBwb3J0IElkOiAlZFxuIiwgbVNlc3Npb25JZCwgbVBvcnRJZCk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIGNsaWVudHNcbiIpOwogICAgIH0KIH0KQEAgLTg2MzksNyArOTEzMiw3IEBACiAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CkBAIC04ODQ1LDYgKzkzMzgsMTUgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgTW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CkBAIC04ODY3LDcgKzkzNjksMTMgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6ZXhpdFN0YW5kYnkoKQogewotICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgIHsKKyAgICAgICAgLy8gbUlucHV0IG1pZ2h0IGhhdmUgYmVlbiBjbGVhcmVkIGJ5IGNsZWFySW5wdXQoKQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5zdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCk7CiB9CiAKQEAgLTg5MzUsNCArOTQ0MywxMyBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCBlYTI5NDU1Li40OTY4ODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwogCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCkBAIC0zOTMsNiArMzkzLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc01zZERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc01zZERldmljZTsgfQorCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQzNCw2ICs0NDAsMTIgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vIF9fdW51c2VkKSB7IH0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB3aXRoaW4gdGhlIHRocmVhZExvb3AgdG8gb2J0YWluIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwuCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1FZmZlY3RDaGFpbnMKIAogICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfdCAgICAgICAgICAgIG1UeXBlOwpAQCAtNDczLDYgKzQ4NSwxMCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2T3V0RGV2aWNlOyAgIC8vIHByZXZpb3VzIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldkluRGV2aWNlOyAgICAvLyBwcmV2aW91cyBpbnB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQGJyaWVmIG1EZXZpY2VJZCAgY3VycmVudCBkZXZpY2UgcG9ydCB1bmlxdWUgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOwogCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbUlkOwpAQCAtNDkzLDEwICs1MDksMjYgQEAKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwogICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICAgICAgIG1UaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8IC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRMb29wIHN0YXRpc3RpY3MgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IC0xOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9FbmROcyA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OworCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzTXNkRGV2aWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgLy8gQSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIGV2YWx1YXRlZCBieSB0aGUgdGhyZWFkIGxvb3AgaGFzIGNoYW5nZWQgYW5kCiAgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBub3Qgd2FpdCBmb3IgYXN5bmMgd3JpdGUgY2FsbGJhY2sgaW4gdGhlIHRocmVhZCBsb29wIGJlZm9yZSBldmFsdWF0aW5nIGl0CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmc7CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgICAgIE5CQUlPX1RlZSAgICAgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3MgaXMgYSBzb3J0ZWQgdmVjdG9yIG9mIHRyYWNrIHR5cGUgVCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZlIHRyYWNrcyBvZiB0aHJlYWRMb29wKCkgdG8gYmUgY29uc2lkZXJlZCBieSB0aGUgbG9ja2VkIHByZXBhcmUgcG9ydGlvbi4KICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3Mgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFRocmVhZEJhc2UgbG9jayBoZWxkLgpAQCAtNTQzLDYgKzU3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+JiBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NDUsNyArNjgwLDcgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBsYXliYWNrVGhyZWFkKCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwpAQCAtNzA3LDYgKzc0Miw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBWb2x1bWVJbnRlcmZhY2UKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyTXV0ZShib29sIG11dGVkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKTsKQEAgLTc4NCw3ICs4MjAsNyBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXN5bmNocm9ub3VzIHNpZ25hbCB3YWl0IHRpbWUuCiAgICAgdmlydHVhbCAgICAgaW50NjRfdCAgICAgY29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IHsgcmV0dXJuIElOVDY0X01BWDsgfQpAQCAtODAxLDYgKzgzNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVRyYWNrcy5zaXplKCkgPCBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0RGV2aWNlICYgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpICYmIHBvcGNvdW50KGRldmljZSkgPiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTg4MCw2ICs5MjEsMTEgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXM7IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CisKKyAgICAvLyBtSGFwdGljQ2hhbm5lbE1hc2sgYW5kIG1IYXB0aWNDaGFubmVsQ291bnQgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIHRocmVhZCBzdXBwb3J0CisgICAgLy8gaGFwdGljIHBsYXliYWNrLgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CiBwcml2YXRlOgogICAgIC8vIG1NYXN0ZXJNdXRlIGlzIGluIGJvdGggUGxheWJhY2tUaHJlYWQgYW5kIGluIEF1ZGlvRmxpbmdlci4gIFdoZW4gYQogICAgIC8vIFBsYXliYWNrVGhyZWFkIG5lZWRzIHRvIGZpbmQgb3V0IGlmIG1hc3Rlci1tdXRlZCwgaXQgY2hlY2tzIGl0J3MgbG9jYWwKQEAgLTkzNSwxNiArOTgxLDE5IEBACiAgICAgdmlydHVhbCB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKLSAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgbmFtZXMgZm9yIGFsbCB0cmFja3MKLSAgICAvLyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCisgICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIHRyYWNrcyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgY2xhc3MgVHJhY2tzIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tOYW1lcykgOgotICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tOYW1lcyhzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsgfQorICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrSWRzKSA6CisgICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja0lkcyhzYXZlRGVsZXRlZFRyYWNrSWRzKSB7IH0KIAogICAgICAgICAvLyBTb3J0ZWRWZWN0b3IgbWV0aG9kcwotICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CisgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJjYW5ub3QgYWRkIHRyYWNrIik7CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spOwogICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTk2NSwyOCArMTAxNCwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1EZWxldGVkVHJhY2tOYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbURlbGV0ZWRUcmFja05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgeworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgdHJhY2tJZCA6IG1EZWxldGVkVHJhY2tJZHMpIHsKKyAgICAgICAgICAgICAgICBmKHRyYWNrSWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICByZXR1cm4gbURlbGV0ZWRUcmFja0lkcy5zaXplKCk7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpIHsgbURlbGV0ZWRUcmFja05hbWVzLmNsZWFyKCk7IH0KKyAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrSWRzKCkgeyBtRGVsZXRlZFRyYWNrSWRzLmNsZWFyKCk7IH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIFRyYWNrIG5hbWVzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcwotICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja05hbWVzOwotCi0gICAgICAgIC8vIEZhc3QgbG9va3VwIG9mIHByZXZpb3VzbHkgZGVsZXRlZCB0cmFjayBuYW1lcyBmb3IgcmV1c2UuCi0gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGRlY2lzaW9uIChhY3R1YWxseSBhbnkgbm9uLW5lZ2F0aXZlCi0gICAgICAgIC8vIGludGVnZXIgdGhhdCBpc24ndCBpbiBtVHJhY2tzWypdLT5uYW1lcygpIGNvdWxkIGJlIHVzZWQpIC0gd2UgYXR0ZW1wdAotICAgICAgICAvLyB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGF2YWlsYWJsZSBuYW1lLgotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1VbnVzZWRUcmFja05hbWVzOworICAgICAgICAvLyBUcmFja3MgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCisgICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tJZHM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCisgICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja0lkczsKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8c3A8VD4+IG1UcmFja3M7IC8vIHdyYXBwZWQgU29ydGVkVmVjdG9yLgogICAgIH07CkBAIC05OTcsNyArMTAzNyw4IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgICAgICAgICAgICAgICAgICAqbU91dHB1dDsKIAogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKLSAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lOworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2V7fTsKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSAgICAgICAgICAgIG1CYWxhbmNlOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVdyaXRlczsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluV3JpdGU7CkBAIC0xMDU2LDE2ICsxMDk3LDEzIEBACiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVBpcGVTaW5rOwogICAgIC8vIFRoZSBjdXJyZW50IHNpbmsgZm9yIHRoZSBub3JtYWwgbWl4ZXIgdG8gd3JpdGUgaXQncyAoc3ViKW1peCwgbU91dHB1dFNpbmsgb3IgbVBpcGVTaW5rCiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbU5vcm1hbFNpbms7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBGb3IgZHVtcHN5cwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgIG1UZWVTb3VyY2U7Ci0jZW5kaWYKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2NyZWVuU3RhdGU7ICAgLy8gY2FjaGVkIGNvcHkgb2YgZ1NjcmVlblN0YXRlCiAgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtGYXN0TWl4ZXJMb2dTaXplID0gOCAqIDEwMjQ7CiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogCisgICAgLy8gRG93bnN0cmVhbSBwYXRjaCBsYXRlbmN5LCBhdmFpbGFibGUgaWYgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDAuCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXN7MC45OTl9OwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgPSAwOwpAQCAtMTEyMSw3ICsxMTU5LDYgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTExNTQsNiArMTE5MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKCp0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsKQEAgLTExNjUsMjEgKzEyMTAsMzcgQEAKICAgICAgICAgICAgICAgICAvLyBCbGVuZGluZyB3aXRoIGxpbWl0ZXIgaXMgbm90IGlkZW1wb3RlbnQsCiAgICAgICAgICAgICAgICAgLy8gYW5kIGJsZW5kaW5nIHdpdGhvdXQgbGltaXRlciBpcyBpZGVtcG90ZW50IGJ1dCBpbmVmZmljaWVudCB0byBkbyB0d2ljZS4KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBtTWFzdGVyTW9uby5sb2FkKCkgJiYgIWhhc0Zhc3RNaXhlcigpOyB9CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdE1peGVyLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIERpcmVjdE91dHB1dFRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CiBwdWJsaWM6CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgICAgICA6IERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkgeyB9CisKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RGlyZWN0T3V0cHV0VGhyZWFkKCk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKwogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC0xMTk1LDEwICsxMjU2LDEwIEBACiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAotICAgIGJvb2wgbVZvbHVtZVNoYXBlckFjdGl2ZTsKKyAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmUgPSBmYWxzZTsKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZvaWQgcHJvY2Vzc1ZvbHVtZV9sKFRyYWNrICp0cmFjaywgYm9vbCBsYXN0VHJhY2spOwogCkBAIC0xMjA3LDEwICsxMjY4LDMxIEBACiAKICAgICB3cDxUcmFjaz4gICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKIAorICAgIC8vIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgaW5pdGlhbCBjb25kaXRpb24gb2YgbU1hc3RlckJhbGFuY2UgPSAwIChkaXNhYmxlZCkuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2VMZWZ0ID0gMS5mOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlUmlnaHQgPSAxLmY7CisKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgdmlydHVhbCAgICAgaW50NjRfdCAgICAgY29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcywgcXVlcnkgdGhlIG91dHB1dCBzaW5rIGRpcmVjdGx5LgorICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBvc2l0aW9uNjQsICZ0aW1lKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChpbnQ2NF90KXVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIE9mZmxvYWRUaHJlYWQgOiBwdWJsaWMgRGlyZWN0T3V0cHV0VGhyZWFkIHsKQEAgLTEzMTgsNiArMTQwMCwyMiBAQAogICAgIFNvcnRlZFZlY3RvciA8IHNwPE91dHB1dFRyYWNrPiA+ICBtT3V0cHV0VHJhY2tzOwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1PdXRwdXRUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgLy8gZm9yd2FyZCB0aGUgZmlyc3QgT3V0cHV0VHJhY2sncyBrZXJuZWwgaW5mb3JtYXRpb24gZm9yIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wIHRyYWNrVGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFRyYWNrc1swXS0+Z2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIGlmICh0cmFja1RpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID4gMCkgeworICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7ICAvLyBkaXNjYXJkIHNlcnZlciB0aW1lc3RhbXAgLSB0aGF0J3MgaWdub3JlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogfTsKIAogLy8gcmVjb3JkIHRocmVhZApAQCAtMTM3Niw5ICsxNDc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+UmVjb3JkVGhyZWFkKCk7CiAKQEAgLTE0MjUsNyArMTUyMCw3IEBACiAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbGVyIHNob3VsZCB0aGVuIGRvIGl0J3MgcGFydCBvZiB0aGUgc3RvcHBpbmcgcHJvY2VzcwogICAgICAgICAgICAgYm9vbCAgICAgICAgc3RvcChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBjbGVhcklucHV0KCk7CiAgICAgICAgICAgICB2aXJ0dWFsIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtKCkgY29uc3Q7CiAKQEAgLTE0MzksOCArMTUzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CkBAIC0xNDYxLDcgKzE1NTYsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RDYXB0dXJlICE9IDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKQEAgLTE0NzksOCArMTU3NCwxOCBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCiAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CiAKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGZhc3RUcmFja0F2YWlsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0VHJhY2tBdmFpbDsgfQorCisgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyBwb3Bjb3VudCBmb3IgZXhhY3RseSBvbmUgZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19pbnB1dF9kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5EZXZpY2UgJiBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiBwcml2YXRlOgogICAgICAgICAgICAgLy8gRW50ZXIgc3RhbmRieSBpZiBub3QgYWxyZWFkeSBpbiBzdGFuZGJ5LCBhbmQgc2V0IG1TdGFuZGJ5IGZsYWcKICAgICAgICAgICAgIHZvaWQgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwpAQCAtMTUwOCw4ICsxNjEzLDYgQEAKICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5SZWFyOyAgICAvLyBsYXN0IGZpbGxlZCBmcmFtZSArIDEKIAogICAgICAgICAgICAgLy8gRm9yIGR1bXBzeXMKLSAgICAgICAgICAgIGNvbnN0IHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgIG1UZWVTaW5rOwotCiAgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICAgICAgICBtUmVhZE9ubHlIZWFwOwogCiAgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKQEAgLTE1NTIsNiArMTY1NSw4IEBACiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdFRyYWNrQXZhaWw7ICAgIC8vIHRydWUgaWYgZmFzdCB0cmFjayBhdmFpbGFibGUKICAgICAgICAgICAgIC8vIGNvbW1vbiBzdGF0ZSB0byBhbGwgcmVjb3JkIHRocmVhZHMKICAgICAgICAgICAgIHN0ZDo6YXRvbWljX2Jvb2wgICAgICAgICAgICAgICAgICAgIG1CdE5yZWNTdXNwZW5kZWQ7CisKKyAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWFkID0gMDsgICAgLy8gY29udGludW91cyBydW5uaW5nIGNvdW50ZXIuCiB9OwogCiBjbGFzcyBNbWFwVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UKQEAgLTE2MDQsNyArMTcwOSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgICAgIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUhhbFN0cmVhbTsgfQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CkBAIC0xNjI3LDcgKzE3MzIsNyBAQAogICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIFVJRCByZWNvcmRzIHNpbGVuY2UKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQgX191bnVzZWQsIGJvb2wgc2lsZW5jZWQgX191bnVzZWQpIHt9CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTE2MzUsNyArMTc0MCw2IEBACiAKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cjsKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwotICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZDsKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOwogCiAgICAgICAgICAgICAgICAgd3A8TW1hcFN0cmVhbUNhbGxiYWNrPiAgbUNhbGxiYWNrOwpAQCAtMTY4OCw2ICsxNzkyLDggQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwpAQCAtMTcxNiw2ICsxODIyLDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNjZmI2OWYuLjBiYTBhYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTI1LDEzICsyNSwxMyBAQAogcHVibGljOgogICAgIGVudW0gdHJhY2tfc3RhdGUgewogICAgICAgICBJRExFLAotICAgICAgICBGTFVTSEVELAorICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKICAgICAgICAgLy8gbmV4dCAyIHN0YXRlcyBhcmUgY3VycmVudGx5IHVzZWQgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgIC8vIGFuZCBvZmZsb2FkZWQgdHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBJTkdfMSwgICAgIC8vIHdhaXRpbmcgZm9yIGZpcnN0IHVuZGVycnVuCiAgICAgICAgIFNUT1BQSU5HXzIsICAgICAvLyB3YWl0aW5nIGZvciBwcmVzZW50YXRpb24gY29tcGxldGUKLSAgICAgICAgUkVTVU1JTkcsCisgICAgICAgIFJFU1VNSU5HLCAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCiAgICAgICAgIFBBVVNFRCwKQEAgLTU0LDExICs1NCw2IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKLSAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCi0gICAgfTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLApAQCAtOTEsNiArODYsNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KQEAgLTEwMCw2ICs5NiwxMDYgQEAKIAogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHRoZSBidWZmZXIgY29udGVudHMgc2l6ZSBjb252ZXJ0ZWQgdG8gdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAqIGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHN0cmVhbWluZyB0cmFja3MuIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IKKyAgICAgICAgICAgICAqIFBDTSBzdGF0aWMgdHJhY2tzIGFuZCBub3QgZGVmaW5lZCBmb3Igbm9uLVBDTSB0cmFja3MuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLgorICAgICAgICAgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCkgKiAxMDAwIC8gc2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSB0cmFjayBzdXBwb3J0cyBzZXJ2ZXIgbGF0ZW5jeSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgdHJhY2sgbGlmZXRpbWUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQ7IH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSBzZXJ2ZXIgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFjaworICAgICAgICAgICAgICogdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4gIFRoaXMgaXMgdGhlIHRpbWUgZm9yIHRoZSBuZXh0IGZyYW1lIGluIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRoZSBkZXZpY2Ugc291cmNlIG9yIHNpbmsuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIHNlcnZlciB0aHJlYWQgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNvdXJjZS9zaW5rLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFNlcnZlckxhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRocmVhZCBsb2NrIGlzIGFjcXVpcmVkLCB0aGVzZSBhdG9taWNzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLCBjb25zaWRlcmVkIGEgYmVuaWduIHJhY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgc2VydmVyTGF0ZW5jeU1zID0gbVNlcnZlckxhdGVuY3lNcy5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckxhdGVuY3lNcyA9PSAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJvbVRyYWNrID0gbVNlcnZlckxhdGVuY3lGcm9tVHJhY2subG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSB0b3RhbCBjbGllbnQgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFja3MKKyAgICAgICAgICAgICAqIGZvciB0aGUgbmV4dCBjbGllbnQgYXBwIGFjY2VzcyB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlOyBpLmUuIHRoZQorICAgICAgICAgICAgICogc2VydmVyIGxhdGVuY3kgcGx1cyB0aGUgYnVmZmVyIGxhdGVuY3kuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIGNsaWVudCBhcHAgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNpbmsvc291cmNlLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRyYWNrTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTZXJ2ZXJMYXRlbmN5TXMoJnNlcnZlckxhdGVuY3lNcywgZnJvbVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXMgKyBidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBleHRlcm5hbC4KKyAgICAgICAgICAgc3RydWN0IEZyYW1lVGltZSB7CisgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lczsKKyAgICAgICAgICAgICAgIGludDY0X3QgdGltZU5zOworICAgICAgICAgICB9OworCisgICAgICAgICAgIC8vIEtlcm5lbEZyYW1lVGltZSBpcyB1cGRhdGVkIHBlciAibWl4IiBwZXJpb2QgZXZlbiBmb3Igbm9uLXBjbSB0cmFja3MuCisgICAgICAgICAgIHZvaWQgICAgICAgICBnZXRLZXJuZWxGcmFtZVRpbWUoRnJhbWVUaW1lICpmdCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZ0ID0gbUtlcm5lbEZyYW1lVGltZS5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0xMTEsOCArMjA3LDYgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KQEAgLTIwOCwxMyArMzAyLDE5IEBACiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgc3A8U2VydmVyUHJveHk+ICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7Ci0gICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOwogICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgLy8gdW5pcXVlIElEIGZvciB0aGlzIHRyYWNrIHVzZWQgYnkgYXVkaW8gcG9saWN5CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQorCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2t7fTsgLy8gbGF0ZW5jeSBmcm9tIHRyYWNrIG9yIHNlcnZlciB0aW1lc3RhbXAuCisgICAgc3RkOjphdG9taWM8ZG91YmxlPiBtU2VydmVyTGF0ZW5jeU1ze307ICAgICAgICAvLyBsYXN0IGxhdGVuY3kgcHVzaGVkIGZyb20gc2VydmVyIHRocmVhZC4KKyAgICBzdGQ6OmF0b21pYzxGcmFtZVRpbWU+IG1LZXJuZWxGcmFtZVRpbWV7fTsgICAgIC8vIGxhc3QgZnJhbWUgdGltZSBvbiBrZXJuZWwgc2lkZS4KIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCkBAIC0yMjksMyArMzI5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSBOVUxMKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogfTsKKworY2xhc3MgUGF0Y2hUcmFja0Jhc2UgOiBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyCit7CitwdWJsaWM6CisgICAgdXNpbmcgVGltZW91dCA9IHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2tCYXNlKHNwPENsaWVudFByb3h5PiBwcm94eSwgY29uc3QgVGhyZWFkQmFzZSYgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHNwPENsaWVudFByb3h5PiAgICAgICBtUHJveHk7CisgICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHkgPSBudWxscHRyOworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXR7fTsKKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggNmQyNWZiOS4uNjVmNzk5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTI4LDExICsyOCwxMSBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYsNiArNTYsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0Jhc2UiCiAKIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG5leHRUcmFja0lkID0gNTU7CiAKQEAgLTk3LDE0ICs5OSwxNSBAQAogICAgICAgICBtSWQoYW5kcm9pZF9hdG9taWNfaW5jKCZuZXh0VHJhY2tJZCkpLAogICAgICAgICBtVGVybWluYXRlZChmYWxzZSksCiAgICAgICAgIG1UeXBlKHR5cGUpLAotICAgICAgICBtVGhyZWFkSW9IYW5kbGUodGhyZWFkLT5pZCgpKSwKKyAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZCA/IHRocmVhZC0+aWQoKSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKSwKICAgICAgICAgbVBvcnRJZChwb3J0SWQpLAogICAgICAgICBtSXNJbnZhbGlkKGZhbHNlKQogewogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBBVURJT19VSURfSU5WQUxJRCAmJiBjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKICAgICAgICAgY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKICAgICB9CiAgICAgLy8gY2xpZW50VWlkIGNvbnRhaW5zIHRoZSB1aWQgb2YgdGhlIGFwcCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRyYWNrLCBzbyB3ZSBjYW4gYmxhbWUKQEAgLTE0NCw3ICsxNDcsNyBAQAogICAgICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShzaXplKTsKICAgICAgICAgaWYgKG1DYmxrTWVtb3J5ID09IDAgfHwKICAgICAgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIHNpemUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBfX2Z1bmNfXywgbUlkLCBzaXplKTsKICAgICAgICAgICAgIGNsaWVudC0+aGVhcCgpLT5kdW1wKCJBdWRpb1RyYWNrIik7CiAgICAgICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTUyLDcgKzE1NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNibGsgPSAoYXVkaW9fdHJhY2tfY2Jsa190ICopIG1hbGxvYyhzaXplKTsKICAgICAgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIHNpemUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBfX2Z1bmNfXywgbUlkLCBzaXplKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KQEAgLTE2Niw3ICsxNjksOCBAQAogICAgICAgICAgICAgaWYgKHJvSGVhcCA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyTWVtb3J5ID0gcm9IZWFwLT5hbGxvY2F0ZShidWZmZXJTaXplKSkgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlciA9IG1CdWZmZXJNZW1vcnktPnBvaW50ZXIoKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIGlmIChyb0hlYXAgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICByb0hlYXAtPmR1bXAoImJ1ZmZlciIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIwNSwyNyArMjA5LDEyIEBACiAgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCAoaW50KWFsbG9jKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgX19mdW5jX18sIG1JZCwgKGludClhbGxvYyk7CiAgICAgICAgIH0KICAgICAgICAgbUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOwogCiAjaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpOwotICAgICAgICAgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKHBpcGVGb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rVHJhY2tGcmFtZXMsIHBpcGVGb3JtYXQpOwotICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge3BpcGVGb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1UZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1UZWUuc2V0KHNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIGZvcm1hdCwgTkJBSU9fVGVlOjpURUVfRkxBR19UUkFDSyk7CiAjZW5kaWYKIAogICAgIH0KQEAgLTI0NCw5ICsyMzMsNiBAQAogCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6flRyYWNrQmFzZSgpCiB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICBkdW1wVGVlKC0xLCBtVGVlU291cmNlLCBtSWQsICdUJyk7Ci0jZW5kaWYKICAgICAvLyBkZWxldGUgdGhlIHByb3h5IGJlZm9yZSBkZWxldGluZyB0aGUgc2hhcmVkIG1lbW9yeSBpdCByZWZlcnMgdG8sIHRvIGF2b2lkIGRhbmdsaW5nIHJlZmVyZW5jZQogICAgIG1TZXJ2ZXJQcm94eS5jbGVhcigpOwogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CkBAIC0yNzQsOSArMjYwLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7CiAjaWZkZWYgVEVFX1NJTksKLSAgICBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKGJ1ZmZlci0+cmF3LCBidWZmZXItPmZyYW1lQ291bnQpOwotICAgIH0KKyAgICBtVGVlLndyaXRlKGJ1ZmZlci0+cmF3LCBidWZmZXItPmZyYW1lQ291bnQpOwogI2VuZGlmCiAKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKQEAgLTI5Myw5ICsyNzcsMzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK0F1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UGF0Y2hUcmFja0Jhc2U6OlBhdGNoVHJhY2tCYXNlKHNwPENsaWVudFByb3h5PiBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEJhc2UmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpCisgICAgOiBtUHJveHkocHJveHkpCit7CisgICAgaWYgKHRpbWVvdXQpIHsKKyAgICAgICAgc2V0UGVlclRpbWVvdXQoKnRpbWVvdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERvdWJsZSBidWZmZXIgbWl4ZXIKKyAgICAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiB0aHJlYWQuZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5zYW1wbGVSYXRlKCk7CisgICAgICAgIHNldFBlZXJUaW1lb3V0KHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kc3ttaXhCdWZmZXJOc30pOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBhdGNoVHJhY2tCYXNlOjpzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCkgeworICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSB0aW1lb3V0LmNvdW50KCkgLyBzdGQ6Om5hbm86OmRlbjsKKyAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IHRpbWVvdXQuY291bnQoKSAlIHN0ZDo6bmFubzo6ZGVuOworfQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0hhbmRsZSIKIAogQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6VHJhY2tIYW5kbGUoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+JiB0cmFjaykKICAgICA6IEJuQXVkaW9UcmFjaygpLApAQCAtMzQwLDYgKzM0NywxMCBAQAogICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgewpAQCAtMzY4LDYgKzM3OSw4IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFjayIKIAogLy8gVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soCkBAIC0zOTcsNyArNDEwLDYgQEAKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICBtTmFtZShUUkFDS19OQU1FX0ZBSUxVUkUpLCAgLy8gc2V0IHRvIFRSQUNLX05BTUVfUEVORElORyBvbiBjb25zdHJ1Y3RvciBzdWNjZXNzLgogICAgIG1NYWluQnVmZmVyKHRocmVhZC0+c2lua0J1ZmZlcigpKSwKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLApAQCAtNDE3LDggKzQyOSw4IEBACiAgICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAogICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1Iiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcyglZCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCiAgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDM0LDcgKzQ0Niw3IEBACiAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKIAogICAgIGlmICghdGhyZWFkLT5pc1RyYWNrQWxsb3dlZF9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCwgdWlkKSkgewotICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFja3MgYXZhaWxhYmxlIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCkBAIC00NTMsMTIgKzQ2NSwyNCBAQAogICAgICAgICBtRmFzdEluZGV4ID0gaTsKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKICAgICB9Ci0gICAgbU5hbWUgPSBUUkFDS19OQU1FX1BFTkRJTkc7CisKKyAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSCisgICAgICAgICAgICB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpEVVBMSUNBVElORzsKKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKKyAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfVCIpOworI2VuZGlmCisKKyAgICBpZiAoY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA9IG5ldyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIodGhpcyk7CisgICAgICAgIG1FeHRlcm5hbFZpYnJhdGlvbiA9IG5ldyBvczo6RXh0ZXJuYWxWaWJyYXRpb24oCisgICAgICAgICAgICAgICAgbVVpZCwgIiIgLyogcGtnICovLCBtQXR0ciwgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcik7CisgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6flRyYWNrKCkKIHsKLSAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OlRyYWNrIGRlc3RydWN0b3IiKTsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiAKICAgICAvLyBUaGUgZGVzdHJ1Y3RvciB3b3VsZCBjbGVhciBtU2hhcmVkQnVmZmVyLAogICAgIC8vIGJ1dCBpdCB3aWxsIG5vdCBwdXNoIHRoZSBkZWNyZW1lbnRlZCByZWZlcmVuY2UgY291bnQsCkBAIC00NzIsNyArNDk2LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbml0Q2hlY2soKSBjb25zdAogewogICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrQmFzZTo6aW5pdENoZWNrKCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtTmFtZSA9PSBUUkFDS19OQU1FX0ZBSUxVUkUpIHsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1DYmxrID09IG51bGxwdHIpIHsKICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNDk4LDE4ICs1MjIsMjEgQEAKICAgICAgICAgICAgIHdhc0FjdGl2ZSA9IHBsYXliYWNrVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkgJiYgIXdhc0FjdGl2ZSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVRocmVhZElvSGFuZGxlLCBtU3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+ZGVzdHJveSgpOyB9KTsKIH0KIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIlQgTmFtZSBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgIgotICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCi0gICAgICAgICAgICAgICAgICAiU1QgIEwgZEIgIFIgZEIgIFZTIGRCICIKLSAgICAgICAgICAgICAgICAgICIgIFNlcnZlciBGcm1DbnQgIEZybVJkeSBGIFVuZGVycnVucyAgRmx1c2hlZCAiCi0gICAgICAgICAgICAgICAgICAiTWFpbiBCdWYgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlR5cGUgICAgIElkIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBQb3J0IElkIFMgIEZsYWdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNUIFVzZyBDVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEcgZGIgIEwgZEIgIFIgZEIgIFZTIGRCICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIFNlcnZlciBGcm1DbnQgIEZybVJkeSBGIFVuZGVycnVucyAgRmx1c2hlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpID8gIiAgIExhdGVuY3kiIDogIiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCkBAIC01MTgsNyArNTQ1LDcgQEAKICAgICBzd2l0Y2ggKG1UeXBlKSB7CiAgICAgY2FzZSBUWVBFX0RFRkFVTFQ6CiAgICAgY2FzZSBUWVBFX09VVFBVVDoKLSAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaXNTdGF0aWMoKSkgewogICAgICAgICAgICAgdHJhY2tUeXBlID0gJ1MnOyAvLyBzdGF0aWMKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICcgJzsgLy8gbm9ybWFsCkBAIC01MzIsMTMgKzU1OSw5IEBACiAgICAgfQogCiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVjICUzZCIsIHRyYWNrVHlwZSwgbUZhc3RJbmRleCk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX1BFTkRJTkcpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgcGVuZCIsIHRyYWNrVHlwZSk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX0ZBSUxVUkUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgZmFpbCIsIHRyYWNrVHlwZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlZCAlYyAlNmQiLCBtRmFzdEluZGV4LCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICVjICU2ZCIsIHRyYWNrVHlwZSwgbUlkKTsKICAgICB9CiAKICAgICBjaGFyIG5vd0luVW5kZXJydW47CkBAIC01OTMsMjIgKzYxNiwyNyBAQAogICAgICAgICAgICAgPyAncicgLyogYnVmZmVyIHJlZHVjZWQgKi86IGJ1ZmZlclNpemVJbkZyYW1lcyA+IG1GcmFtZUNvdW50CiAgICAgICAgICAgICAgICAgICAgID8gJ2UnIC8qIGVycm9yICovIDogJyAnIC8qIGlkZW50aWNhbCAqLzsKIAotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICUycyAweCUwM1ggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlNS4yZyAlNS4yZyAlNS4yZyVjICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4elggJTA4elhcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlM3ggJTJ4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlNS4yZyAlNS4yZyAlNS4yZyAlNS4yZyVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSIsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAogICAgICAgICAgICAgbUNibGstPm1GbGFncywKIAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUoKSwKIAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICBtQXR0ci51c2FnZSwKKyAgICAgICAgICAgIG1BdHRyLmNvbnRlbnRfdHlwZSwKKworICAgICAgICAgICAgMjAuMCAqIGxvZzEwKG1GaW5hbFZvbHVtZSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMCh2c1ZvbHVtZS5maXJzdCksIC8vIFZvbHVtZVNoYXBlcihzKSB0b3RhbCB2b2x1bWUKQEAgLTYyMSwxMSArNjQ5LDIxIEBACiAgICAgICAgICAgICBmaWxsaW5nU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4sCi0gICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDAsCi0KLSAgICAgICAgICAgIChzaXplX3QpbU1haW5CdWZmZXIsIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAotICAgICAgICAgICAgKHNpemVfdCltQXV4QnVmZmVyICAgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4CisgICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDAKICAgICAgICAgICAgICk7CisKKyAgICBpZiAoaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgYm9vbCBmcm9tVHJhY2s7CisgICAgICAgIGlmIChnZXRUcmFja0xhdGVuY3lNcygmbGF0ZW5jeU1zLCAmZnJvbVRyYWNrKSA9PSBPSykgeworICAgICAgICAgICAgLy8gU2hvdyBsYXRlbmN5IGluIG1zZWMsIGZvbGxvd2VkIGJ5ICd0JyBpZiBmcm9tIHRyYWNrIHRpbWVzdGFtcCAodGhlIG1vc3QgYWNjdXJhdGUpCisgICAgICAgICAgICAvLyBvciAnaycgaWYgZXN0aW1hdGVkIGZyb20ga2VybmVsIGJlY2F1c2UgdHJhY2sgZnJhbWVzIGhhdmVuJ3QgYmVlbiBwcmVzZW50ZWQgeWV0LgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICU3LjJsZiAlYyIsIGxhdGVuY3lNcywgZnJvbVRyYWNrID8gJ3QnIDogJ2snKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUxMHMiLCBtQ2Jsay0+bVNlcnZlciAhPSAwID8gInVuYXZhaWwiIDogIm5ldyIpOworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzYW1wbGVSYXRlKCkgY29uc3QgewpAQCAtNjMzLDggKzY3MSw3IEBACiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBzaXplX3QgZGVzaXJlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKQEAgLTY0MywxNiArNjgwLDY3IEBACiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGJ1ZmZlci0+cmF3ID0gYnVmLm1SYXc7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwICYmICFpc1N0b3BwaW5nKCkgJiYgIWlzU3RvcHBlZCgpICYmICFpc1BhdXNlZCgpKSB7Ci0gICAgICAgIEFMT0dWKCJ1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCksIHN0YXRlOiAlZCIsCi0gICAgICAgICAgICAgICAgYnVmLm1GcmFtZUNvdW50LCBkZXNpcmVkRnJhbWVzLCBtU3RhdGUpOworICAgICAgICBBTE9HVigiJXMoJWQpOiB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCksIHN0YXRlOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmLm1GcmFtZUNvdW50LCBkZXNpcmVkRnJhbWVzLCBtU3RhdGUpOwogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CiAgICAgfQotCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBpbnRlcmNlcHRCdWZmZXIoKmJ1ZmZlcik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKKy8vIFRPRE86IGNvbXBlbnNhdGUgZm9yIHRpbWUgc2hpZnQgYmV0d2VlbiBIVyBtb2R1bGVzLgordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW50ZXJjZXB0QnVmZmVyKAorICAgICAgICBjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIHNvdXJjZUJ1ZmZlcikgeworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IHNvdXJjZUJ1ZmZlci5mcmFtZUNvdW50OworICAgIGZvciAoYXV0byYgc2luayA6IG1UZWVQYXRjaGVzKSB7CisgICAgICAgIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQqIHBhdGNoUmVjb3JkID0gc2luay5wYXRjaFJlY29yZC5nZXQoKTsKKworICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTgsIGZyYW1lQ291bnQpOworICAgICAgICAvLyBPbiBidWZmZXIgd3JhcCwgdGhlIGJ1ZmZlciBmcmFtZSBjb3VudCB3aWxsIGJlIGxlc3MgdGhhbiByZXF1ZXN0ZWQsCisgICAgICAgIC8vIHdoZW4gdGhpcyBoYXBwZW5zIGEgc2Vjb25kIGJ1ZmZlciBuZWVkcyB0byBiZSB1c2VkIHRvIHdyaXRlIHRoZSBsZWZ0b3ZlciBhdWRpbworICAgICAgICBzaXplX3QgZnJhbWVzTGVmdCA9IGZyYW1lQ291bnQgLSBmcmFtZXNXcml0dGVuOworICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiAhPSAwICYmIGZyYW1lc0xlZnQgIT0gMCkgeworICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiArPQorICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTggKyBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZSwgZnJhbWVzTGVmdCk7CisgICAgICAgICAgICBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1dfSUYoZnJhbWVzTGVmdCAhPSAwLCAiJXMoJWQpIFBhdGNoUmVjb3JkICVkIGNhbiBub3QgcHJvdmlkZSBiaWcgZW5vdWdoICIKKyAgICAgICAgICAgICAgICAgImJ1ZmZlciAlenUvJXp1LCBkcm9wcGluZyAlenUgZnJhbWVzIiwgX19mdW5jX18sIG1JZCwgcGF0Y2hSZWNvcmQtPm1JZCwKKyAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwgZnJhbWVDb3VudCwgZnJhbWVzTGVmdCk7CisgICAgfQorICAgIGF1dG8gc3BlbnQgPSBjZWlsPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnQpOworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAvLyBBdmVyYWdlIGlzIH4yMHVzIHBlciB0cmFjaywgdGhpcyBzaG91bGQgdmlydHVhbGx5IG5ldmVyIGJlIGxvZ2dlZCAoTG9nZ2luZyB0YWtlcyA+MjAwdXMpCisgICAgQUxPR0RfSUYoc3BlbnQgPiAyMDB1cywgIiVzOiB0b29rICVsbGR1cyB0byBpbnRlcmNlcHQgJXp1IHRyYWNrcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgIHNwZW50LmNvdW50KCksIG1UZWVQYXRjaGVzLnNpemUoKSk7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6d3JpdGVGcmFtZXMoQXVkaW9CdWZmZXJQcm92aWRlciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCkgeworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKyAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBhdXRvIHN0YXR1cyA9IGRlc3QtPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgQUxPR1coIiVzIFBhdGhSZWNvcmQgZ2V0TmV4dEJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlZDogJXMiLAorICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR19BU1NFUlQocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8PSBmcmFtZUNvdW50KTsKKyAgICBtZW1jcHkocGF0Y2hCdWZmZXIucmF3LCBzcmMsIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICBhdXRvIGZyYW1lc1dyaXR0ZW4gPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgIGRlc3QtPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKK30KKwogLy8gcmVsZWFzZUJ1ZmZlcigpIGlzIG5vdCBvdmVycmlkZGVuCiAKIC8vIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTY4Miw2ICs3NzAsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNzEwLDggKzgwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzcsMTQgKzgzMiwxNyBAQAogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFNUT1BQSU5HXzEgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFNUT1BQSU5HXzEgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFJFU1VNSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBSRVNVTUlORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgQUxPR1YoIj8gPT4gQUNUSVZFICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogPyA9PiBBQ1RJVkUgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc3RhdGVzIHRvIHJlc2V0IHBvc2l0aW9uIGluZm8gZm9yIG5vbi1vZmZsb2FkZWQvZGlyZWN0IHRyYWNrcwpAQCAtNzkwLDEyICs4ODgsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnN0YXJ0KCk7IH0pOworICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdG9wKCkKIHsKLSAgICBBTE9HVigic3RvcCglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04MTksMTUgKzkyMCwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwotICAgICAgICAgICAgQUxPR1YoIm5vdCBzdG9wcGluZy9zdG9wcGVkID0+IHN0b3BwaW5nL3N0b3BwZWQgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogbm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnN0b3AoKTsgfSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnBhdXNlKCkKIHsKLSAgICBBTE9HVigicGF1c2UoJWQpLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIiwgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODQ2LDcgKzk0OCw4IEBACiAgICAgICAgIGNhc2UgQUNUSVZFOgogICAgICAgICBjYXNlIFJFU1VNSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gUEFVU0lORzsKLSAgICAgICAgICAgIEFMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtODU0LDExICs5NTcsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIFBhdXNpbmcgdGhlIFRlZVBhdGNoIHRvIGF2b2lkIGEgZ2xpdGNoIG9uIHVuZGVycnVuLCBhdCB0aGUgY29zdCBvZiBidWZmZXJlZCBhdWRpbyBsb3NzLgorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5wYXVzZSgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2goKQogewotICAgIEFMT0dWKCJmbHVzaCglZCkiLCBtTmFtZSk7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04ODAsMTEgKzk4NSwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoImZsdXNoOiBvZmZsb2FkIGZsdXNoIik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBvZmZsb2FkIGZsdXNoIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgICAgICByZXNldCgpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgfHwgbVN0YXRlID09IFNUT1BQSU5HXzIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmx1c2hlZCBpbiBTVE9QUElOR18xIG9yIDIgc3RhdGUsIGNoYW5nZSBzdGF0ZSB0byBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CiAgICAgICAgICAgICB9CiAKQEAgLTkxNCw2ICsxMDIwLDggQEAKICAgICAgICAgLy8gYmVjYXVzZSB0aGUgaGFyZHdhcmUgYnVmZmVyIGNvdWxkIGhvbGQgYSBsYXJnZSBhbW91bnQgb2YgYXVkaW8KICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgfQorICAgIC8vIEZsdXNoIHRoZSBUZWUgdG8gYXZvaWQgb24gcmVzdW1lIHBsYXlpbmcgb2xkIGRhdGEgYW5kIGdsaXRjaGluZyBvbiB0aGUgdHJhbnNpdGlvbiB0byBuZXcgZGF0YQorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5mbHVzaCgpOyB9KTsKIH0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCkBAIC05NDksNyArMTA1Nyw3IEBACiB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJ0aHJlYWQgaXMgZGVhZCIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiB0aHJlYWQgaXMgZGVhZCIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgIH0gZWxzZSBpZiAoKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgfHwKICAgICAgICAgICAgICAgICAgICAgKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQpKSB7CkBAIC05NTksNiArMTA2NywxOSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsCisgICAgICAgIGludCBwcm9ncmFtSWQpIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fCAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKKyAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkICpkaXJlY3RPdXRwdXRUaHJlYWQgPSBzdGF0aWNfY2FzdDxEaXJlY3RPdXRwdXRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpOworICAgICAgICByZXR1cm4gZGlyZWN0T3V0cHV0VGhyZWFkLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKQEAgLTk2OSw4ICsxMDkwLDEwIEBACiAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyBvcHRpb25GbGFnCiAgICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb24tPmdldE9wdGlvbkZsYWdzKCk7CiAgICAgICAgIGlmICgob3B0aW9uRmxhZyAmIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T1BUSU9OX0ZMQUdfQ0xPQ0tfVElNRSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCi0gICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6ICVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCisgICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCpjb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24tPnNldE9wdGlvbkZsYWdzKAogICAgICAgICAgICAgICAgIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyhvcHRpb25GbGFnCkBAIC05ODUsNyArMTEwOCw3IEBACiAgICAgICAgIC8vIFNpZ25hbCB0aHJlYWQgdG8gZmV0Y2ggbmV3IHZvbHVtZS4KICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIHRocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMTcsNiArMTE0MCwxMSBAQAogICAgIH07CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNldFRlZVBhdGNoZXMoVGVlUGF0Y2hlcyB0ZWVQYXRjaGVzKSB7CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmRlc3Ryb3koKTsgfSk7CisgICAgbVRlZVBhdGNoZXMgPSBzdGQ6Om1vdmUodGVlUGF0Y2hlcyk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKIHsKICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKQEAgLTExMDUsMTEgKzEyMzMsMTQgQEAKICAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBmcmFtZXNXcml0dGVuIGlzbid0CiAgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgZG9lc24ndCBhbHdheXMgcmVmbGVjdCB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgaW4gdGhlIGgvdwogICAgIC8vIGJ1ZmZlcnMsIHBhcnRpY3VsYXJseSBpZiBhIHRyYWNrIGhhcyBiZWVuIHBhdXNlZCBhbmQgcmVzdW1lZCBkdXJpbmcgZHJhaW5pbmcKLSAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgKGxvbmcgbG9uZylmcmFtZXNXcml0dGVuKTsKICAgICBpZiAobVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID09IDApIHsKICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gZnJhbWVzV3JpdHRlbiArIGF1ZGlvSGFsRnJhbWVzOwotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDogbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKQEAgLTExNzUsNyArMTMwNiw4IEBACiAgICAgaWYgKGlzVGVybWluYXRlZCgpIHx8IG1TdGF0ZSA9PSBQQVVTRUQgfHwKICAgICAgICAgICAgICgoZnJhbWVzUmVhZHkoKSA9PSAwKSAmJiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBTVE9QUEVEKSkpKSB7Ci0gICAgICAgIEFMT0dXKCJUcmFjazo6c2V0U3luY0V2ZW50KCkgaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI0Niw3ICsxMzc4LDE3IEBACiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZVN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy91cGRhdGUgZnJhbWUgbWFwCiAgICAgbUZyYW1lTWFwLnB1c2godHJhY2tGcmFtZXNSZWxlYXNlZCwgc2lua0ZyYW1lc1dyaXR0ZW4pOwogCkBAIC0xMjU1LDYgKzEzOTcsNyBAQAogICAgIC8vIE91ciB0aW1lc3RhbXBzIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUgdHJhY2sgaXMgb24gdGhlIFRocmVhZCBhY3RpdmUgbGlzdC4KICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRyYWNrcyBhcmUgbm90IHJlbW92ZWQgYmVmb3JlIGZ1bGwgZHJhaW4uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lU3RhbXA7CisgICAgYm9vbCBkcmFpbmVkID0gdHJ1ZTsgLy8gZGVmYXVsdCBhc3N1bWUgZHJhaW5lZCwgaWYgbm8gc2VydmVyIGluZm8gZm91bmQKICAgICBib29sIGNoZWNrZWQgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWCAtIDE7CiAgICAgICAgICAgICBpID49IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7IC0taSkgewpAQCAtMTI2MywyMSArMTQwNiw2NCBAQAogICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID0gbUZyYW1lTWFwLmZpbmRYKGxvY2FsLm1Qb3NpdGlvbltpXSk7CiAgICAgICAgICAgICAvLyBjaGVjayBkcmFpbiBzdGF0ZSBmcm9tIHRoZSBsYXRlc3Qgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLgogICAgICAgICAgICAgaWYgKCFjaGVja2VkICYmIGkgPD0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgZHJhaW5lZCA9IGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghY2hlY2tlZCkgeyAvLyBubyBzZXJ2ZXIgaW5mbywgYXNzdW1lIGRyYWluZWQuCi0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQodHJ1ZSk7Ci0gICAgfQorCisgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZChkcmFpbmVkKTsKICAgICAvLyBTZXQgY29ycmVjdGlvbiBmb3IgZmx1c2hlZCBmcmFtZXMgdGhhdCBhcmUgbm90IGFjY291bnRlZCBmb3IgaW4gcmVsZWFzZWQuCiAgICAgbG9jYWwubUZsdXNoZWQgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCk7CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9ICFkcmFpbmVkOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lU3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6bXV0ZSgKKyAgICAgICAgLypvdXQqLyBib29sICpyZXQpIHsKKyAgICAqcmV0ID0gZmFsc2U7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgLy8gTG9jayBmb3IgdXBkYXRpbmcgbUhhcHRpY1BsYXliYWNrRW5hYmxlZC4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGlmICgobVRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RocmVhZC0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6dW5tdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAqcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPdXRwdXRUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Ok91dHB1dFRyYWNrKAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMTI5OSw5ICsxNDg1LDkgQEAKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgorICAgICAgICBBTE9HVigiJXMoKTogbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUsIG1DaGFubmVsTWFzayAweCUwOHgiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2JsaywgbUJ1ZmZlciwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKQEAgLTEzMTEsNyArMTQ5Nyw4IEBACiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgIH0KIH0KIApAQCAtMTM0Miw3ICsxNTI5LDcgQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7CkBAIC0xMzczLDggKzE1NjAsOSBAQAogICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvYnRhaW5CdWZmZXIoJm1PdXRCdWZmZXIsIHdhaXRUaW1lTGVmdE1zKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQxMCw4ICsxNTk4LDkgQEAKICAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTYxOCwxNCBAQAogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZGF0YSBpcyBjb25zdW1lZCAoc3RvcmVkIGxvY2FsbHkpOyBzZXQgZnJhbWVDb3VudCB0byAwLgorICAgICAgICAgICAgICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGVycm9yIGZvciB0aGlzLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQ0NCw3ICsxNjM2LDcgQEAKICAgICAgICAgc3RvcCgpOwogICAgIH0KIAotICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOworICAgIHJldHVybiBmcmFtZXMgLSBpbkJ1ZmZlci5mcmFtZUNvdW50OyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZC4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdApAQCAtMTQ5Niw2ICsxNjg4LDEwIEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hUcmFjayIKKwogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTE1MDQsMjEgKzE3MDAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCi0gICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIEFJRF9BVURJT1NFUlZFUiwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICBQYXRjaFRyYWNrQmFzZShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAqcGxheWJhY2tUaHJlYWQsIHRpbWVvdXQpCiB7Ci0gICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKLQotICAgIEFMT0dWKCJQYXRjaFRyYWNrICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CkBAIC0xNTI4LDcgKzE3MjEsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFjazo6c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xNTQyLDExICsxNzM1LDExIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7Ci0gICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyglZCk6IGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKQEAgLTE1NTcsNyArMTc1MCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMTU5Miw3ICsxNzg1LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVzdGFydElmRGlzYWJsZWQoKQogewogICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKLSAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXJ0KCk7CiAgICAgfQogfQpAQCAtMTYwMCw2ICsxNzkzLDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkSGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6UmVjb3JkSGFuZGxlKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjaykKQEAgLTE2MTUsNyArMTgxMCw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCiAgICAgICAgIGludCAvKmF1ZGlvX3Nlc3Npb25fdCovIHRyaWdnZXJTZXNzaW9uKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RhcnQoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgIG1SZWNvcmRUcmFjay0+c3RhcnQoKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QpZXZlbnQsIChhdWRpb19zZXNzaW9uX3QpIHRyaWdnZXJTZXNzaW9uKSk7CiB9CkBAIC0xNjI2LDE4ICsxODIxLDMyIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3Bfbm9udmlydHVhbCgpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdG9wKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBtUmVjb3JkVHJhY2stPnN0b3AoKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykpOwogfQogCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2V0TWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgaW50IC8qYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCovIGRpcmVjdGlvbikgeworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdD4oZGlyZWN0aW9uKSkpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZFRyYWNrIgogCiAvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCkBAIC0xNjcyLDE4ICsxODgxLDIwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKLSAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCi0gICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKLSAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgotICAgIC8vCi0gICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCi0gICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCi0gICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgotICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKCFpc0RpcmVjdCgpKSB7CisgICAgICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAorICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgorICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCisgICAgICAgIC8vIHRoZSByZWNvcmQgdHJhY2sgY29uZmlndXJhdGlvbiB2YWxpZC4KKyAgICAgICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIiwgX19mdW5jX18sIG1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKQEAgLTE2OTQsMTIgKzE5MDUsMjAgQEAKICAgICBpZiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IG9ubHkgTm9ybWFsIFJlY29yZCBoYXMgdGltZXN0YW1wcyAoRmFzdCBSZWNvcmQgZG9lcyBub3QpLgorICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZChtRm9ybWF0LCBmbGFncyk7CiAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQorICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpCisgICAgICAgICAgICArICJfUiIpOworI2VuZGlmCiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKLSAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXI7CiAgICAgZGVsZXRlIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH0KQEAgLTE3NTYsMTcgKzE5NzUsMzQgQEAKICAgICAvLyBzZWUgY29tbWVudHMgYXQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogICAgIHNwPFJlY29yZFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsKLSAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKLSAgICAgICAgfQorICAgICAgICB0cmFja19zdGF0ZSBwcmlvclN0YXRlID0gbVN0YXRlOwogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKKyAgICAgICAgICAgIHByaW9yU3RhdGUgPSBtU3RhdGU7CisgICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOyAvLyBtb3ZlIG1TdGF0ZSB0byBTVE9QUEVELCB0ZXJtaW5hdGUKKyAgICAgICAgfQorICAgICAgICAvLyBBUE0gcG9ydGlkL2NsaWVudCBtYW5hZ2VtZW50IGRvbmUgb3V0c2lkZSBvZiBsb2NrLgorICAgICAgICAvLyBOT1RFOiBpZiB0aHJlYWQgZG9lc24ndCBleGlzdCwgdGhlIGlucHV0IGRlc2NyaXB0b3IgcHJvYmFibHkgZG9lc24ndCBlaXRoZXIuCisgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgc3dpdGNoIChwcmlvclN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEFDVElWRTogICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIHN0aWxsIGFjdGl2ZQorICAgICAgICAgICAgY2FzZSBTVEFSVElOR18yOiAvLyBpbnZhbGlkYXRlZC9zdGFydC1hYm9ydGVkIGFmdGVyIHN0YXJ0SW5wdXQgc3VjY2Vzc2Z1bGx5IGNhbGxlZAorICAgICAgICAgICAgY2FzZSBQQVVTSU5HOiAgICAvLyBpbnZhbGlkYXRlZCB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIHN0b3AoKSBwYXVzaW5nIChzdGlsbCBhY3RpdmUpCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVEFSVElOR18xOiAvLyBpbnZhbGlkYXRlZC9zdGFydC1hYm9ydGVkIGFuZCBzdGFydElucHV0IG5vdCBzdWNjZXNzZnVsCisgICAgICAgICAgICBjYXNlIFBBVVNFRDogICAgIC8vIE9LLCBub3QgYWN0aXZlCisgICAgICAgICAgICBjYXNlIElETEU6ICAgICAgIC8vIE9LLCBub3QgYWN0aXZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RPUFBFRDogICAgLy8gdW5leHBlY3RlZCAoZGVzdHJveWVkKQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgcHJpb3Igc3RhdGU6ICVkIiwgX19mdW5jX18sIG1JZCwgcHJpb3JTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTc4MywzMSArMjAxOSw1MCBAQAogfQogCiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250IFNpbFxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQWN0aXZlICAgICBJZCBDbGllbnQgU2Vzc2lvbiBQb3J0IElkICBTICBGbGFncyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlIFNvdXJjZSAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBTZXJ2ZXIgRnJtQ250IEZybVJkeSBTaWwlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpID8gIiAgIExhdGVuY3kiIDogIiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2dSAlN3UgJTJzIDB4JTAzWCAiCi0gICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAiJTA4WCAlNnp1ICUzY1xuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNmQgJTZ1ICU3dSAlN3UgICUycyAweCUwM1ggIgorICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgJTZYICIKKyAgICAgICAgICAgICIlMDhYICU2enUgJTZ6dSAlM2MiLAogICAgICAgICAgICAgaXNGYXN0VHJhY2soKSA/ICdGJyA6ICcgJywKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbUlkLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICBtQXR0ci5zb3VyY2UsCiAKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCisgICAgICAgICAgICBtU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpLAogICAgICAgICAgICAgaXNTaWxlbmNlZCgpID8gJ3MnIDogJ24nCiAgICAgICAgICAgICApOworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgKHVzdWFsbHkgZm9yIGRlYnVnZ2luZykuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtMTgzNyw2ICsyMDkyLDE2IEBACiAgICAgICAgIGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzb3VyY2VGcmFtZXNSZWFkLAogICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKQogeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lc3RhbXA7CiAKICAgICAvLyBDb252ZXJ0IEhBTCBmcmFtZXMgdG8gc2VydmVyLXNpZGUgdHJhY2sgZnJhbWVzIGF0IHRyYWNrIHNhbXBsZSByYXRlLgpAQCAtMTg1MCw2ICsyMTE1LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9IHRydWU7IC8vIHVzZSB0cmFjayB1bmxlc3MgZGVidWdnaW5nLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSAtICh1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpKTsKKworICAgIG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLnN0b3JlKHVzZVRyYWNrVGltZXN0YW1wKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCkBAIC0xODY0LDYgKzIxMzgsMzEgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6c2V0TWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFJlY29yZCIKKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xODcxLDIwICsyMTcwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQogICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKLSAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIEFJRF9BVURJT1NFUlZFUiwKKyAgICAgICAgICAgICAgICBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAqcmVjb3JkVGhyZWFkLCB0aW1lb3V0KQogewotICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKLSAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwotCi0gICAgQUxPR1YoIlBhdGNoUmVjb3JkICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CkBAIC0xODk3LDEyICsyMTk0LDEyIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CiAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICJQYXRjaFJlY29yZCgpICVwIG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgICIlcyglZCk6IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTkxMyw3ICsyMjEwLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xOTMyLDcgKzIyMjksOSBAQAogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCi0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpNbWFwVHJhY2siCiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpNbWFwVHJhY2soVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCkBAIC0xOTQwLDEzICsyMjM5LDE0IEBACiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIChzaXplX3QpMCAvKiBmcmFtZUNvdW50ICovLAogICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qIGlzT3V0ICovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGlzT3V0LAogICAgICAgICAgICAgICAgICAgQUxMT0NfTk9ORSwKICAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKICAgICAgICAgbVBpZChwaWQpLCBtU2lsZW5jZWQoZmFsc2UpLCBtU2lsZW5jZWROb3RpZmllZChmYWxzZSkKQEAgLTE5NjMsNyArMjI2Myw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50IF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTE5OTQsMTkgKzIyOTQsMjggQEAKIHsKIH0KIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IFNlc3Npb24gUG9ydCBJZCAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBGbGFncyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0KCkgPyAiVXNnIENUIjogIlNvdXJjZSIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUgX191bnVzZWQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlMDhYICUwOFggJTZ1XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTd1ICUwOFggJTA4WCAlNnUgMHglMDNYICIsCiAgICAgICAgICAgICBtUGlkLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICBtQXR0ci5mbGFncyk7CisgICAgaWYgKGlzT3V0KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTN4ICUyeCIsIG1BdHRyLnVzYWdlLCBtQXR0ci5jb250ZW50X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2eCIsIG1BdHRyLnNvdXJjZSk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggMzhjM2MwMi4uNmVmMTliZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTk3LDggKzk3LDQyIEBACiAjZGVmaW5lIExPR19BVURJT19TVEFURSgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKICAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0FVRElPX1NUQVRFLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKKy8vIExvZyB0aGUgZGlmZmVyZW5jZSBiZXd0ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMgd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssCisvLyBkaXZpZGVkIGJ5IHRoZSBzYW1wbGUgcmF0ZS4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfTEFURU5DWShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX0xBVEVOQ1k+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBvdmVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX09WRVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9PVkVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgaW5mby4gVGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgdHlwZSwgZnJhbWVDb3VudCwgYW5kIHNhbXBsZVJhdGUuCisvLyBQYXJhbWV0ZXIgdHlwZSBpcyB0aHJlYWRfaW5mb190IGFzIGRlZmluZWQgaW4gTkJMb2cuaC4KKyNkZWZpbmUgTE9HX1RIUkVBRF9JTkZPKGluZm8pIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfSU5GTz4oaW5mbyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX1RIUkVBRF9QQVJBTVMocGFyYW1zKSBkbyB7TkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfUEFSQU1TPihwYXJhbXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHVuZGVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX1VOREVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfVU5ERVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB3YXJtdXAgdGltZSBpbiBtaWxsaXNlY29uZHMuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX1dBUk1VUF9USU1FKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV0FSTVVQX1RJTUU+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIGEgdHlwZWQgZW50cnkgdGhhdCByZXByZXNlbnRzIGEgdGhyZWFkJ3Mgd29yayB0aW1lIGluIG5hbm9zZWNvbmRzLgorLy8gUGFyYW1ldGVyIG5zIHNob3VsZCBiZSBvZiB0eXBlIHVpbnQzMl90LgorI2RlZmluZSBMT0dfV09SS19USU1FKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV09SS19USU1FPihucyk7IH0gd2hpbGUgKDApCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgeworLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bER1bW15TkJMb2dXcml0ZXIgYW5kIHRoZW4KKy8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxEdW1teU5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bworLy8gY2hlY2sgZm9yIG51bGxwdHIgZXZlcnkgdGltZS4gQWxzbyByZWR1Y2VzIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyBsb2dnaW5nIG1hY3JvIGFib3ZlCisvLyBlYWNoIHRpbWUgd2Ugd2FudCB0byBsb2cgYSBuZXcgdHlwZS4KIGV4dGVybiB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciAqdGxOQkxvZ1dyaXRlcjsKIH0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IDRjOTBiYjUuLmY3MmY0NGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMTEsOSArMTEsMTAgQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmN1dGlscyBcCkBAIC0yMiwxMSArMjMsMTUgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmF1ZGlvY2xpZW50IFwKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAogICAgIGxpYm1lZGlhX2hlbHBlciBcCiAgICAgbGlibWVkaWFtZXRyaWNzIFwKLSAgICBsaWJlZmZlY3RzY29uZmlnCisgICAgbGlibWVkaWF1dGlscyBcCisgICAgbGliZWZmZWN0c2NvbmZpZyBcCisgICAgbGlic2Vuc29ycHJpdmFjeQorCitMT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBcCisgICAgbGlic2Vuc29ycHJpdmFjeQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKQEAgLTQ4LDYgKzUzLDcgQEAKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgXAorICAgIGxpYmF1ZGlvcG9saWN5IFwKICAgICBsaWJzb3VuZHRyaWdnZXIKIAogaWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCkBAIC03Miw5ICs3OCwxMSBAQAogZW5kaWYgIyBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcworICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCkBAIC04Miw5ICs5MCw5IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhX2hlbHBlcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYW1ldHJpY3MKIAotaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieG1sMgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJoaWRsYmFzZSBsaWJ4bWwyCiAKK2lmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiBMT0NBTF9DRkxBR1MgKz0gLURVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCiBlbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIApAQCAtMTEwLDggKzExOCwxMSBAQAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDQ4MTJiMWYuLmJiNTQ0MWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtNjUsMjAgKzY1LDYgQEAKICAgICAgICAgQVBJX0lOUFVUX1RFTEVQSE9OWV9SWCwgLy8gdXNlZCBmb3IgY2FwdHVyZSBmcm9tIHRlbGVwaG9ueSBSWCBwYXRoCiAgICAgfSBpbnB1dF90eXBlX3Q7CiAKLSAgICBlbnVtIHsKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkUgPSAwLAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCA9ICgxIDw8IDApLCAgICAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBjYWxsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFID0gKDEgPDwgMSksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhbm90aGVyIGNhcHR1cmUKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQgPSAoMSA8PCAyKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgaG90d29yZAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCA9ICgxIDw8IDMpLCAgIC8vIHByZS1lbXB0ZWQgc29tZW9uZQotICAgICAgICAgICAgICAgIC8vIE5COiBwcmVlbXB0IGlzIG1hcmtlZCBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCBvdGhlcnMgYXJlIG9uIGZhaWxpbmcgY2FsbHMKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgPSAoMSA8PCA0KSwKLQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMID0gKEFQSV9JTlBVVF9DT05DVVJSRU5DWV9MQVNUIC0gMSksCi0gICAgfTsKLQotICAgIHR5cGVkZWYgdWludDMyX3QgY29uY3VycmVuY3lfdHlwZV9fbWFza190OwotCiBwdWJsaWM6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lJbnRlcmZhY2UoKSB7fQogICAgIC8vCkBAIC04OSwxNCArNzUsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBwaG9uZSBzdGF0ZS4gVmFsaWQgcGhvbmVzIHN0YXRlcyBhcmUgZGVmaW5lZCBieSBhdWRpb19tb2RlX3QKICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICAvLyBmb3JjZSB1c2luZyBhIHNwZWNpZmljIGRldmljZSBjYXRlZ29yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2FnZQpAQCAtMTIyLDE5ICsxMTAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC0xNDcsMTYgKzEzMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vCiAgICAgLy8gdm9sdW1lIGNvbnRyb2wgZnVuY3Rpb25zCkBAIC0yMDYsNiArMTg0LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjEzLDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyMzUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEpID0gMDsKIH07CiAKIApAQCAtMzI0LDExICszMTcsNiBAQAogICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKLSAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOwotCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOwogCkBAIC0zNTgsMTAgKzM0NiwxMyBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgPSAwOwogfTsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGZkODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMCBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJhdWRpb3BvbGljeV90ZXN0cyIKKyAgICB9LAorICAgIHsKKyAgICAgICAibmFtZSI6ICJzeXN0ZW1hdWRpb190ZXN0cyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNCBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4OTY3ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCi0vLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KLSNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAotCi1lbnVtIHJvdXRpbmdfc3RyYXRlZ3kgewotICAgIFNUUkFURUdZX01FRElBLAotICAgIFNUUkFURUdZX1BIT05FLAotICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKLSAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKLSAgICBTVFJBVEVHWV9EVE1GLAotICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCi0gICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAotICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCi0gICAgU1RSQVRFR1lfUkVST1VUSU5HLAotICAgIE5VTV9TVFJBVEVHSUVTCi19OwotCi19OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCmluZGV4IGZjMDEyYTIuLmEzYjZiMzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCkBAIC0yMCw2ICsyMCwyMiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworLyoqCisgKiBWb2x1bWVTb3VyY2UgaXMgdGhlIGRpc2NyaW1pbmVudCBmb3Igdm9sdW1lIG1hbmFnZW1lbnQgb24gYW4gb3V0cHV0LgorICogSXQgdXNlZCB0byBiZSB0aGUgc3RyZWFtIHR5cGUgYnkgbGVnYWN5LCBpdCBtYXkgYmUgaG9zdCB2b2x1bWUgZ3JvdXAgb3IgYSB2b2x1bWUgY3VydmVzIGlmCisgKiB3ZSBhbGxvdyB0byBoYXZlIG1vcmUgdGhhbiBvbmUgY3VydmUgcGVyIHZvbHVtZSBncm91cC4KKyAqLworZW51bSBWb2x1bWVTb3VyY2UgOiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxhdWRpb19zdHJlYW1fdHlwZV90Pjo6dHlwZTsKK3N0YXRpYyBjb25zdCBWb2x1bWVTb3VyY2UgVk9MVU1FX1NPVVJDRV9OT05FID0gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihBVURJT19TVFJFQU1fREVGQVVMVCk7CisKK3N0YXRpYyBpbmxpbmUgVm9sdW1lU291cmNlIHN0cmVhbVRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oc3RyZWFtKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKIC8vIEFic29sdXRlIG1pbiB2b2x1bWUgaW4gZEIgKGNhbiBiZSByZXByZXNlbnRlZCBpbiBzaW5nbGUgcHJlY2lzaW9uIG5vcm1hbCBmbG9hdCB2YWx1ZSkKICNkZWZpbmUgVk9MVU1FX01JTl9EQiAoLTc1OCkKIApAQCAtMTM0LDYgKzE1MCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKaW5kZXggOWJkNjhlMS4uNjA1ZmMxYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKQEAgLTE3LDkgKzE3LDIwIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBTdHJlYW1UeXBlVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK3N0YXRpYyBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgZGVmYXVsdEF0dHIgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIHN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBnRHluYW1pY0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogCitzdGF0aWMgY29uc3QgdWludDMyX3QgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgPSA1MDAwOworCiAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHRoZSBwb2xpY3kgd2lsbCB1c2UgbWF4IG1peGVyIHNhbXBsaW5nIHJhdGVzLgogLy8gRG8gbm90IGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCiAjZGVmaW5lIFNBTVBMRV9SQVRFX0haX01BWCAxOTIwMDAKQEAgLTMyLDE0ICs0Myw2IEBACiAjZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIEZDQ184CiAKIC8qKgotICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCi0gKiBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0cygpCi0gKi8KLSNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8XAotICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVTfEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikKLQotCi0vKioKICAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgd2hlcmUgbWF0Y2hpbmcgaW5wdXRzL291dHB1dHMgb24gZGV2aWNlCiAgKiB0eXBlIGFsb25lIGlzIG5vdCBlbm91Z2g6IHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdG9vCiAgKi8KQEAgLTY4LDIzICs3MSw2IEBACiB9CiAKIC8qKgotICogQ2hlY2sgaWYgdGhlIGlucHV0IGRldmljZSBnaXZlbiBpcyBjb25zaWRlcmVkIGFzIGEgdmlydHVhbCBkZXZpY2UuCi0gKgotICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY29uc2lkZXIKLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBhIHZpcnR1YWwgb25lLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc192aXJ0dWFsX2lucHV0X2RldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgewotICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCiAgKiB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlcgogICoKQEAgLTEwMSw2ICs4NywyMSBAQAogfQogCiAvKioKKyAqIENoZWNrIHdoZXRoZXIgYXVkaW8gZGV2aWNlIGhhcyBlbmNvZGluZyBjYXBhYmlsaXR5LgorICoKKyAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIGRldmljZSBoYXMgZW5jb2RpbmcgY2FwYWJpbGl0eSwgZmFsc2Ugb3RoZXJ3aXNlLi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGRldmljZV9oYXNfZW5jb2RpbmdfY2FwYWJpbGl0eShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgogICogUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgYSBnaXZlbiBhdWRpbyBzb3VyY2UgZm9yIGNhcHR1cmUuIFRoZSBwcmlvcml0eSBpcyB1c2VkIHdoZW4gbW9yZSB0aGFuIG9uZQogICogY2FwdHVyZSBzZXNzaW9uIGlzIGFjdGl2ZSBvbiBhIGdpdmVuIGlucHV0IHN0cmVhbSB0byBkZXRlcm1pbmUgd2hpY2ggc2Vzc2lvbiBkcml2ZXMgcm91dGluZyBhbmQKICAqIGVmZmVjdCBjb25maWd1cmF0aW9uLgpAQCAtMTA4LDcgKzEwOSwxMCBAQAogICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZSB0byBjb25zaWRlci4gVmFsaWQgc291cmNlcyBhcmU6CiAgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OCiAgKiAtIEFVRElPX1NPVVJDRV9DQU1DT1JERVIKKyAqIC0gQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFCisgKiAtIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRAogICogLSBBVURJT19TT1VSQ0VfTUlDCisgKiAtIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQogICogLSBBVURJT19TT1VSQ0VfRk1fVFVORVIKICAqIC0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OCiAgKiAtIEFVRElPX1NPVVJDRV9IT1RXT1JECkBAIC0xMjEsMTAgKzEyNSwxNiBAQAogewogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gNjsKKyAgICAgICAgcmV0dXJuIDk7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgotICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgcmV0dXJuIDg7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIHJldHVybiA3OworICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgorICAgICAgICByZXR1cm4gNjsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CisgICAgICAgIHJldHVybiA1OworICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgogICAgICAgICByZXR1cm4gNDsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKICAgICAgICAgcmV0dXJuIDM7CkBAIC0xNTIsMyArMTYyLDI1IEBACiAgICAgfQogICAgIHJldHVybiBmb3JtYXQxID09IGZvcm1hdDI7CiB9CisKKy8qKgorICogQGJyaWVmIGhhc1N0cmVhbSBjaGVja3MgaWYgYSBnaXZlbiBzdHJlYW0gdHlwZSBpcyBmb3VuZCBpbiB0aGUgbGlzdCBvZiBzdHJlYW1zCisgKiBAcGFyYW0gc3RyZWFtcyBjb2xsZWN0aW9uIG9mIHN0cmVhbSB0eXBlcyB0byBjb25zaWRlci4KKyAqIEBwYXJhbSBzdHJlYW1UeXBlIHRvIGNvbnNpZGVyCisgKiBAcmV0dXJuIHRydWUgaWYgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBzdHJlYW1zLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhhc1N0cmVhbShjb25zdCBhbmRyb2lkOjpTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZChiZWdpbihzdHJlYW1zKSwgZW5kKHN0cmVhbXMpLCBzdHJlYW1UeXBlKSAhPSBlbmQoc3RyZWFtcyk7Cit9CisKKy8qKgorICogQGJyaWVmIGhhc1ZvaWNlU3RyZWFtIGNoZWNrcyBpZiBhIHZvaWNlIHN0cmVhbSBpcyBmb3VuZCBpbiB0aGUgbGlzdCBvZiBzdHJlYW1zCisgKiBAcGFyYW0gc3RyZWFtcyBjb2xsZWN0aW9uIHRvIGNvbnNpZGVyLgorICogQHJldHVybiB0cnVlIGlmIHZvaWNlIHN0cmVhbSBpcyBmb3VuZCBpbiB0aGUgZ2l2ZW4gc3RyZWFtcywgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNWb2ljZVN0cmVhbShjb25zdCBhbmRyb2lkOjpTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zKQoreworICAgIHJldHVybiBoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDM3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb0dhaW4uY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUGF0Y2guY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BvbGljeU1peC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUG9ydC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUHJvZmlsZS5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUm91dGUuY3BwIiwKKyAgICAgICAgInNyYy9DbGllbnREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9Id01vZHVsZS5jcHAiLAorICAgICAgICAic3JjL0lPUHJvZmlsZS5jcHAiLAorICAgICAgICAic3JjL1NlcmlhbGl6ZXIuY3BwIiwKKyAgICAgICAgInNyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCIsCisgICAgICAgICJzcmMvVHlwZUNvbnZlcnRlci5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYm1lZGlhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9wb2xpY3ljb21tb24iXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNGM1Y2MuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9HYWluLmNwcCBcCi0gICAgc3JjL0h3TW9kdWxlLmNwcCBcCi0gICAgc3JjL0lPUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1BvcnQuY3BwIFwKLSAgICBzcmMvQXVkaW9Qcm9maWxlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIFwKLSAgICBzcmMvQXVkaW9QYXRjaC5jcHAgXAotICAgIHNyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgXAotICAgIHNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIFwKLSAgICBzcmMvU2Vzc2lvblJvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Wb2x1bWVDdXJ2ZS5jcHAgXAotICAgIHNyYy9UeXBlQ29udmVydGVyLmNwcCBcCi0gICAgc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYm1lZGlhCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMgXAotICAgIHN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLQotaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfU1JDX0ZJTEVTICs9IHNyYy9TZXJpYWxpemVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnhtbDIKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIFwKLQotZWxzZQotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIHNyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIFwKLSAgICBzcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9HYWlucy5jcHAKLQotZW5kaWYgI2lmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKaW5kZXggZjg2ZTc1YS4uYTk0OGVhOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCkBAIC0zOCw3ICszOCw3IEBACiBjbGFzcyBBdWRpb1JvdXRlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1JvdXRlPiA+CiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCmluZGV4IDRhYzUwOGYuLjk5NjM0N2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUzLDcgKzU0LDcgQEAKICAgICBpbnQgZ2V0TWF4UmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5tYXhfcmFtcF9tczsgfQogCiAgICAgLy8gVE9ETzogcmVtb3ZlIGR1bXAgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CiAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI5NjMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBJL08gZGVzY3JpcHRvcnMgdG8gaW1wbGVtZW50IHNvIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvbnRleHQKKyAqIGNhbiBiZSBxdWVyaWVkIGFuZCB1cGRhdGVkLgorICovCitjbGFzcyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQoreworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlKCkge307CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBJb0Rlc2NyaXB0b3IsIGNsYXNzIEZpbHRlcj4KK3NwPERldmljZURlc2NyaXB0b3I+IGZpbmRQcmVmZXJyZWREZXZpY2UoCisgICAgICAgIElvRGVzY3JpcHRvciYgZGVzYywgRmlsdGVyIGZpbHRlciwgYm9vbCYgYWN0aXZlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpCit7CisgICAgYXV0byBhY3RpdmVDbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgYXV0byBhY3RpdmVDbGllbnRzV2l0aFJvdXRlID0KKyAgICAgICAgZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgZmlsdGVyLCB0cnVlIC8qcHJlZmVycmVkRGV2aWNlKi8pOworICAgIGFjdGl2ZSA9IGFjdGl2ZUNsaWVudHMuc2l6ZSgpID4gMDsKKyAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZUNsaWVudHMuc2l6ZSgpID09IGFjdGl2ZUNsaWVudHNXaXRoUm91dGUuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VzLmdldERldmljZUZyb21JZChhY3RpdmVDbGllbnRzV2l0aFJvdXRlWzBdLT5wcmVmZXJyZWREZXZpY2VJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJb0NvbGxlY3Rpb24sIGNsYXNzIEZpbHRlcj4KK3NwPERldmljZURlc2NyaXB0b3I+IGZpbmRQcmVmZXJyZWREZXZpY2UoCisgICAgICAgIElvQ29sbGVjdGlvbiYgaW9Db2xsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpCit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW9Db2xsZWN0aW9uLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8gZGVzYyA9IGlvQ29sbGVjdGlvbi52YWx1ZUF0KGkpOworICAgICAgICBib29sIGFjdGl2ZTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gY3VyRGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShkZXNjLCBmaWx0ZXIsIGFjdGl2ZSwgZGV2aWNlcyk7CisgICAgICAgIGlmIChhY3RpdmUgJiYgY3VyRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGN1ckRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBjdXJEZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAppbmRleCBiMjVkNmQ0Li44MDNjZmFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtMTYsMzYgKzE2LDQ1IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElPUHJvZmlsZTsKIGNsYXNzIEF1ZGlvTWl4OworY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7CiAKIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIGlucHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gaW5wdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgotY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKK2NsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICAsIHB1YmxpYyBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+CiB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldE9wZW5SZWZDb3VudCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlKCkgY29uc3QgeyByZXR1cm4gKG1EZXZpY2UgIT0gbnVsbHB0cikgPworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORTsgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2U7IH0KKyAgICB2b2lkIHNldERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSB7IG1EZXZpY2UgPSBkZXZpY2U7IH0KKyAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0ICB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZSAhPSBudWxscHRyID8gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSA6ICBEZXZpY2VWZWN0b3IoKTsgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgICAgICAgbUlvSGFuZGxlOyAgICAgICAvLyBpbnB1dCBoYW5kbGUKLSAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCi0gICAgQXVkaW9NaXggICAgICAgICAgICAgICAgICAgICAgKm1Qb2xpY3lNaXg7ICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBpbnB1dCBoYW5kbGUKKyAgICBBdWRpb01peCAgICAgICAgICAgICptUG9saWN5TWl4ID0gbnVsbHB0cjsgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC01NSw0MyArNjQsNTAgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBnZXRQcmVlbXB0ZWRTZXNzaW9ucygpIGNvbnN0OwogICAgIGJvb2wgaGFzUHJlZW1wdGVkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7CiAgICAgdm9pZCBjbGVhclByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQgPiAwOyB9CiAgICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdDsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgYWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3A8QXVkaW9TZXNzaW9uPiBnZXRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpIGNvbnN0OworICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKyAgICBpbnQzMl90IGFjdGl2ZUNvdW50KCkgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50OyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpOwogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQuCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSkKICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKQogICAgIHZvaWQgc3RvcCgpOwogICAgIHZvaWQgY2xvc2UoKTsKIAotcHJpdmF0ZToKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOwotICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uICAgICAgICBtU2Vzc2lvbnM7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGdldENsaWVudHNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgorICAgIHZvaWQgYWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKworICAgIHZvaWQgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpOworCisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlID0gbnVsbHB0cjsgLyoqPCBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0byAqLworCiAgICAgLy8gQmVjYXVzZSBhIHByZWVtcHRpYmxlIGNhcHR1cmUgc2Vzc2lvbiBjYW4gcHJlZW1wdCBhbm90aGVyIG9uZSwgd2UgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAogICAgIC8vIHNpdHVhdGlvbiB3ZXJlIGVhY2ggc2Vzc2lvbiBpcyBhbGxvd2VkIHRvIHJlc3RhcnQgYWZ0ZXIgYmVpbmcgcHJlZW1wdGVkLAogICAgIC8vIHRodXMgcHJlZW1wdGluZyB0aGUgb3RoZXIgb25lIHdoaWNoIHJlc3RhcnRzIGFuZCBzbyBvbi4KQEAgLTk5LDcgKzExNSw5IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOwogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTExLDE5ICsxMjksMzEgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICAvLyBjb3VudCBhY3RpdmUgY2FwdHVyZSBzZXNzaW9ucyB1c2luZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2VzLgotICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIEFVRElPX0RFVklDRV9JTl9ERUZBVUxUIGlzIHBhc3NlZAotICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIGNvbnN0OworICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIGVtcHR5IHZlY3RvciBpcyBwYXNzZWQKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKICAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgogICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KICAgICAgKi8KLSAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKyAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKKyAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgKiBkZXZpY2UuCisgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHByZWZlcnJlZCBkZXZpY2UgcG9ydCBpZCBvZiB0aGVzZSBjbGllbnRzIHdpbGwgYmUgcmVzZXR0ZWQgdG8gTk9ORS4KKyAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDVlNWQzOGIuLmNmOTUxOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE2LDU1ICsxNiwyMzQgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb01peDsKIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKKworY2xhc3MgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZpcnR1YWwgfkFjdGl2aXR5VHJhY2tpbmcoKSA9IGRlZmF1bHQ7CisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICBpZiAobUFjdGl2aXR5Q291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWUpIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmICgoZGVsdGEgKyAoaW50KW1BY3Rpdml0eUNvdW50KSA8IDApIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBpbnZhbGlkIGRlbHRhICVkLCByZWZDb3VudCAlZCIsIF9fZnVuY19fLCBkZWx0YSwgbUFjdGl2aXR5Q291bnQpOworICAgICAgICB9CisgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICBpZiAoIW1BY3Rpdml0eUNvdW50KSB7CisgICAgICAgICAgICBzZXRTdG9wVGltZShzeXN0ZW1UaW1lKCkpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZpdHlDb3VudDsgfQorICAgIG5zZWNzX3QgZ2V0U3RvcFRpbWUoKSBjb25zdCB7IHJldHVybiBtU3RvcFRpbWU7IH0KKyAgICB2b2lkIHNldFN0b3BUaW1lKG5zZWNzX3Qgc3RvcFRpbWUpIHsgbVN0b3BUaW1lID0gc3RvcFRpbWU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKKyAgICB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEFjdGl2aXR5Q291bnQ6ICVkLCBTdG9wVGltZTogJSIgUFJJZDY0ICIsICIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q291bnQoKSwgZ2V0U3RvcFRpbWUoKSk7CisgICAgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7CisgICAgbnNlY3NfdCBtU3RvcFRpbWUgPSAwOworfTsKKworLyoqCisgKiBAYnJpZWYgVm9sdW1lQWN0aXZpdHk6IGl0IHRyYWNrcyB0aGUgYWN0aXZpdHkgZm9yIHZvbHVtZSBwb2xpY3kgKHZvbHVtZSBpbmRleCwgbXV0ZSwKKyAqIG1lbW9yaXplIHByZXZpb3VzIHN0b3AsIGFuZCBzdG9yZSBtdXRlIGlmIGluY29tcGF0aWJsZSBkZXZpY2Ugd2l0aCBhbm90aGVyIHN0cmF0ZWd5LgorICovCitjbGFzcyBWb2x1bWVBY3Rpdml0eSA6IHB1YmxpYyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgYm9vbCBpc011dGVkKCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudCA+IDA7IH0KKyAgICBpbnQgZ2V0TXV0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudDsgfQorICAgIGludCBpbmNNdXRlQ291bnQoKSB7IHJldHVybiArK21NdXRlQ291bnQ7IH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KCkgeyByZXR1cm4gbU11dGVDb3VudCA+IDAgPyAtLW1NdXRlQ291bnQgOiAtMTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLCBWb2x1bWU6ICUuMDNmLCBNdXRlQ291bnQ6ICUwMmRcbiIsIG1DdXJWb2x1bWVEYiwgbU11dGVDb3VudCk7CisgICAgfQorICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeyBtQ3VyVm9sdW1lRGIgPSB2b2x1bWU7IH0KKyAgICBmbG9hdCBnZXRWb2x1bWUoKSBjb25zdCB7IHJldHVybiBtQ3VyVm9sdW1lRGI7IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbU11dGVDb3VudCA9IDA7IC8qKjwgbXV0ZSByZXF1ZXN0IGNvdW50ZXIgKi8KKyAgICBmbG9hdCBtQ3VyVm9sdW1lRGIgPSBOQU47IC8qKjwgY3VycmVudCB2b2x1bWUgaW4gZEIuICovCit9OworLyoqCisgKiBOb3RlOiB2b2x1bWUgYWN0aXZpdGllcyBzaGFsbCBiZSBpbmRleGVkIGJ5IEN1cnZlc0lkIGlmIHdlIHdhbnQgdG8gYWxsb3cgbXVsdGlwbGUKKyAqIGN1cnZlcyBwZXIgdm9sdW1lIGdyb3VwLCBpbmZlcnJpbmcgYSBtdXRlIG1hbmFnZW1lbnQgb3Igdm9sdW1lIGJhbGFuY2luZyBiZXR3ZWVuIEhXIGFuZCBTVyBpcworICogZG9uZQorICovCit1c2luZyBWb2x1bWVBY3Rpdml0aWVzID0gc3RkOjptYXA8Vm9sdW1lU291cmNlLCBWb2x1bWVBY3Rpdml0eT47CisKKy8qKgorICogQGJyaWVmIFRoZSBBY3Rpdml0eSBjbGFzczogaXQgdHJhY2tzIHRoZSBhY3Rpdml0eSBmb3Igdm9sdW1lIHBvbGljeSAodm9sdW1lIGluZGV4LCBtdXRlLAorICogbWVtb3JpemUgcHJldmlvdXMgc3RvcCwgYW5kIHN0b3JlIG11dGUgaWYgaW5jb21wYXRpYmxlIGRldmljZSB3aXRoIGFub3RoZXIgc3RyYXRlZ3kuCisgKiBIYXZpbmcgdGhpcyBjbGFzcyBwcmV2ZW50cyBmcm9tIGxvb3Bpbmcgb24gYWxsIGF0dHJpYnV0ZXMgKGxlZ2FjeSBzdHJlYW1zKSBvZiB0aGUgc3RyYXRlZ3kKKyAqLworY2xhc3MgUm91dGluZ0FjdGl2aXR5IDogcHVibGljIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICB2b2lkIHNldE11dGVkQnlEZXZpY2UoIGJvb2wgaXNNdXRlZCkgeyBtSXNNdXRlZEJ5RGV2aWNlID0gaXNNdXRlZDsgfQorICAgIGJvb2wgaXNNdXRlZEJ5RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXV0ZWRCeURldmljZTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBY3Rpdml0eVRyYWNraW5nOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7CisgICAgfQorcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlIGRldmljZSBzZWxlY3Rpb24uCisgICAgICogU2VlIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgICovCisgICAgYm9vbCBtSXNNdXRlZEJ5RGV2aWNlID0gZmFsc2U7Cit9OwordXNpbmcgUm91dGluZ0FjdGl2aXRpZXMgPSBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIFJvdXRpbmdBY3Rpdml0eT47CiAKIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAogLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCi1jbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK2NsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+CiB7CiBwdWJsaWM6CiAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0ICB7IHJldHVybiBtRGV2aWNlczsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CiAKLSAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzZXRTdG9wVGltZSBzZXQgdGhlIHN0b3AgdGltZSBkdWUgdG8gdGhlIGNsaWVudCBzdG9wcGFnZSBvciBhIHJlIHJvdXRpbmcgb2YgdGhpcworICAgICAqIGNsaWVudAorICAgICAqIEBwYXJhbSBjbGllbnQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHdoZW4gdGhlIGNsaWVudCBzdG9wcGVkL3dhcyByZXJvdXRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3RvcFRpbWUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBuc2Vjc190IHN5c1RpbWUpOworCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgY2xpZW50LT5hY3RpdmUoKSBzdGF0ZSBhbmQgdGhlIG91dHB1dCBkZXNjcmlwdG9yJ3MgZ2xvYmFsIGFjdGl2ZSBjb3VudCwKKyAgICAgKiBhbG9uZyB3aXRoIHRoZSBzdHJlYW0gYWN0aXZlIGNvdW50IGFuZCBtQWN0aXZlQ2xpZW50cy4KKyAgICAgKiBUaGUgY2xpZW50IG11c3QgYmUgcHJldmlvdXNseSBhZGRlZCBieSB0aGUgYmFzZSBjbGFzcyBhZGRDbGllbnQoKS4KKyAgICAgKiBJbiBjYXNlIG9mIGR1cGxpY2F0aW5nIHRocmVhZCwgY2xpZW50IHNoYWxsIGJlIGFkZGVkIG9uIHRoZSBkdXBsaWNhdGVkIHRocmVhZCwgbm90IG9uIHRoZQorICAgICAqIGludm9sdmVkIG91dHB1dHMgYnV0IHNldENsaWVudEFjdGl2ZSB3aWxsIGJlIGNhbGxlZCBvbiBhbGwgb3V0cHV0IHRvIHRyYWNrIHN0cmF0ZWd5IGFuZAorICAgICAqIGFjdGl2ZSBjbGllbnQgZm9yIGEgZ2l2ZW4gb3V0cHV0LgorICAgICAqIEFjdGl2ZSByZWYgY291bnQgb2YgdGhlIGNsaWVudCB3aWxsIGJlIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIHRocm91Z2ggc2V0QWN0aXZlIEFQSQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UgPSBWT0xVTUVfU09VUkNFX05PTkUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQW55QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gYWN0aXZlTGlzdDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5wdXNoX2JhY2soaXRlci5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGl2ZUxpc3Q7CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldEFjdGl2aXR5Q291bnQoKSA6IDA7CisgICAgfQorICAgIGJvb2wgaXNNdXRlZChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuaXNNdXRlZCgpIDogZmFsc2U7CisgICAgfQorICAgIGludCBnZXRNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldE11dGVDb3VudCgpIDogMDsKKyAgICB9CisgICAgaW50IGluY011dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpCisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXNbdnNdLmluY011dGVDb3VudCgpOworICAgIH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllc1t2c10uZGVjTXV0ZUNvdW50KCk7CisgICAgfQorICAgIHZvaWQgc2V0Q3VyVm9sdW1lKFZvbHVtZVNvdXJjZSB2cywgZmxvYXQgdm9sdW1lKQorICAgIHsKKyAgICAgICAgLy8gRXZlbiBpZiBub3QgYWN0aXZpdHkgZm9yIHRoaXMgZ3JvdXAgcmVnaXN0ZXJlZCwgbmVlZCB0byBjcmVhdGUgYW55d2F5CisgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5zZXRWb2x1bWUodm9sdW1lKTsKKyAgICB9CisgICAgZmxvYXQgZ2V0Q3VyVm9sdW1lKFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcykgPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0Vm9sdW1lKCkgOiBOQU47CisgICAgfQorCisgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nQWN0aXZpdGllcy5maW5kKHBzKSAhPSBzdGQ6OmVuZChtUm91dGluZ0FjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQocHMpLmlzQWN0aXZlKGluUGFzdE1zLCBzeXNUaW1lKSA6IGZhbHNlOworICAgIH0KKyAgICBib29sIGlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUm91dGluZ0FjdGl2aXRpZXMuZmluZChwcykgIT0gc3RkOjplbmQobVJvdXRpbmdBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KHBzKS5pc011dGVkQnlEZXZpY2UoKSA6IGZhbHNlOworICAgIH0KKyAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIGJvb2wgaXNNdXRlZCkKKyAgICB7CisgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllc1twc10uc2V0TXV0ZWRCeURldmljZShpc011dGVkKTsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNzMsMjIgKzI1Miw1MyBAQAogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07Ci0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsgbVBhdGNoSGFuZGxlID0gaGFuZGxlOyB9OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0Ci0gICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07Ci0gICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUgaW4gZEIKLSAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCi0gICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgLy8gb3ZlcnJpZGUgQ2xpZW50TWFwSGFuZGxlciB0byBhYm9ydCB3aGVuIHJlbW92aW5nIGEgY2xpZW50IHdoZW4gYWN0aXZlLgorICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gY2xpZW50ID0gZ2V0Q2xpZW50KHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50LmdldCgpID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbm9uZXhpc3RlbnQgY2xpZW50IHBvcnRJZCAlZCIsIF9fZnVuY19fLCBtSWQsIHBvcnRJZCk7CisgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hlbiBhIGNsaWVudCBpcyByZW1vdmVkLCB3ZSBjb3VsZCByZW1vdmUgaXRzCisgICAgICAgIC8vIGFzc29jaWF0ZWQgYWN0aXZlIGNvdW50IGJ5IGNhbGxpbmcgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoKSwKKyAgICAgICAgLy8gYnV0IHRoYXQgd291bGQgYmUgaGlkaW5nIGEgcHJvYmxlbSwgc28gd2UgbG9nIGZhdGFsIGluc3RlYWQuCisgICAgICAgIGF1dG8gY2xpZW50SXRlciA9IHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50SXRlciAhPSBtQWN0aXZlQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpIHJlbW92aW5nIGNsaWVudCBwb3J0SWQgJWQgd2hpY2ggaXMgYWN0aXZlIChjb3VudCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHBvcnRJZCwgY2xpZW50LT5nZXRBY3Rpdml0eUNvdW50KCkpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OnJlbW92ZUNsaWVudChwb3J0SWQpOworICAgIH0KKworICAgIGNvbnN0IFRyYWNrQ2xpZW50VmVjdG9yJiBnZXRBY3RpdmVDbGllbnRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFjdGl2ZUNsaWVudHM7CisgICAgfQorCisgICAgRGV2aWNlVmVjdG9yIG1EZXZpY2VzOyAvKio8IGN1cnJlbnQgZGV2aWNlcyB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8gKi8KKyAgICBBdWRpb01peCAqbVBvbGljeU1peCA9IG51bGxwdHI7ICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCiBwcm90ZWN0ZWQ6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgIGNvbnN0IHNwPEF1ZGlvUG9ydD4gbVBvcnQ7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIHVpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2ZSBjb3VudAorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIC8vIFRoZSBBY3RpdmVDbGllbnRzIHNob3dzIHRoZSBjbGllbnRzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgQFZvbHVtZVNvdXJjZSBjb3VudHMKKyAgICAvLyBhbmQgbWF5IGluY2x1ZGUgdXBzdHJlYW0gY2xpZW50cyBmcm9tIGEgZHVwbGljYXRpbmcgdGhyZWFkLgorICAgIC8vIENvbXBhcmUgd2l0aCB0aGUgQ2xpZW50TWFwIChtQ2xpZW50cykgd2hpY2ggYXJlIGV4dGVybmFsIEF1ZGlvVHJhY2sgY2xpZW50cyBvZiB0aGUKKyAgICAvLyBvdXRwdXQgZGVzY3JpcHRvciAoYW5kIGRvIG5vdCBjb3VudCBpbnRlcm5hbCBQYXRjaFRyYWNrcykuCisgICAgVHJhY2tDbGllbnRWZWN0b3IgbUFjdGl2ZUNsaWVudHM7CisKKyAgICBSb3V0aW5nQWN0aXZpdGllcyBtUm91dGluZ0FjdGl2aXRpZXM7IC8qKjwgdHJhY2sgcm91dGluZyBhY3Rpdml0eSBvbiB0aGlzIG91cHV0LiovCisKKyAgICBWb2x1bWVBY3Rpdml0aWVzIG1Wb2x1bWVBY3Rpdml0aWVzOyAvKio8IHRyYWNrIHZvbHVtZSBhY3Rpdml0eSBvbiB0aGlzIG91cHV0LiovCiB9OwogCiAvLyBBdWRpbyBvdXRwdXQgZHJpdmVuIGJ5IGEgc29mdHdhcmUgbWl4ZXIgaW4gYXVkaW8gZmxpbmdlci4KQEAgLTk5LDE3ICszMDksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSB7IG1EZXZpY2VzID0gZGV2aWNlczsgfQorICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpOwogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9CisgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBbGxDbGllbnRzSW5hY3RpdmUoKQorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBjbGllbnRzTGlzdCh0cnVlKSkgeworICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICB9CisgICAgfQogICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtMTIwLDQ2ICszMzcsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAotICAgICAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOwotICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAotICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBjaGFuZ2VSZWZDb3VudCgxKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSk7Ci0gICAgICAgICAgICB2b2lkIHN0b3AoKTsKLSAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAorICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIHNldENsaWVudEFjdGl2ZSh0cnVlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCisgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoZmFsc2UpOworICAgICAgICB2b2lkIHN0b3AoKTsKKyAgICAgICAgdm9pZCBjbG9zZSgpOworICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGJ5IHR5cGUgKGZvciBub24gYnVzIC8gcmVtb3RlIHN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSB0eXBlIChlLmcuIGZvciBub24gYnVzIC8gcnN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyB0YWtlcyBhIHZlY3RvciBvZiBkZXZpY2VzIGFuZCBmaWx0ZXJzIHRoZW0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGRldmljZSBzdXBwb3J0ZWQgYnkgdGhpcyBvdXRwdXQgKHRoZSBwcm9maWxlIGZyb20gd2hpY2ggdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tKQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHJlZmVyZW5jZSBkZXZpY2UgdmVjdG9yIHRvIGJlIGZpbHRlcmVkCisgICAgICogQHJldHVybiB2ZWN0b3Igb2YgZGV2aWNlcyBmaWx0ZXJlZCBmcm9tIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBvZiB0aGlzIG91dHB1dCAod2Vha2x5IG9yIG5vdAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHR5cGUpCisgICAgICovCisgICAgRGV2aWNlVmVjdG9yIGZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTE3MCw3ICs0MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBtU291cmNlOworICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKIH07CiAKQEAgLTE3OCwyNSArNDE5LDUyIEBACiAgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIAorICAgICAqIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgogICAgICAqIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKICAgICAgKiBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3Jpbmcgd2hpY2gKICAgICAgKiB1c2VzIGFuIG91dHB1dCBmb3IgcGxheWJhY2sgd2l0aCBhIG5vbi1lbXB0eSwgbm9uICIwIiBhZGRyZXNzLgogICAgICAqLwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlUmVtb3RlbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIiBkZXZpY2UuCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIgorICAgICAqIGRldmljZS4KICAgICAgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgYSBsb2NhbC9yZW1vdGUgcGxheWJhY2suCiAgICAgICogVXNlZCBmb3IgaW5zdGFuY2UgYnkgcG9saWN5IG1hbmFnZXIgdG8gYWx0ZXIgdGhlIHNwZWFrZXIgcGxheWJhY2sgKCJzcGVha2VyIHNhZmUiIGJlaGF2aW9yKQogICAgICAqIHdoZW4gbWVkaWEgcGxheXMgb3Igbm90IGxvY2FsbHkuCiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3JpbmcuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gc3RyYXRlZ3kgaXMgYWN0aXZlIChvciB3YXMgYWN0aXZlCisgICAgICogaW4gdGhlIHBhc3QpIG9uIHRoZSBnaXZlbiBvdXRwdXQgYW5kIGFsbCB0aGUgb3V0cHV0cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgSFcgTW9kdWxlCisgICAgICogdGhlIHNhbWUgbW9kdWxlIHRoYW4gdGhlIGdpdmVuIG91dHB1dAorICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBiZSBjaGVja2VkIHVwb24gYWN0aXZpdHkgc3RhdHVzCisgICAgICogQHBhcmFtIGluUGFzdE1zIGlmIDAsIGNoZWNrIGN1cnJlbnRseSwgb3RoZXJ3aXNlLCBjaGVjayBpbiB0aGUgcGFzdAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHNoYWxsIGJlIHNldCBpZiByZXF1ZXN0IGlzIGRvbmUgZm9yIHRoZSBwYXN0IGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdXRwdXQgZm9sbG93aW5nIHRoZSBzdHJhdGVneSBpcyBhY3RpdmUgb24gdGhlIHNhbWUgbW9kdWxlIHRoYW4gZGVzYywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdF9zdHJhdGVneV90IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICAqIGJlZW4gY2hvc2VuIGFzIHRoZSBwcmVmZXJyZWQgZGV2aWNlIGJ5IGFueSBjbGllbnQsIHRoZSBwb2xpY3kgbWFuYWdlciBzaGFsbAorICAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgICogZGV2aWNlLgorICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgcHJlZmVycmVkIGRldmljZSBwb3J0IGlkIG9mIHRoZXNlIGNsaWVudHMgd2lsbCBiZSByZXNldHRlZCB0byBOT05FLgorICAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKQEAgLTIxOCwyNyArNDg2LDUzIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSBzb3VyY2UgZXhjZXB0IHRoZSBvbmUgdG8gYmUgaWdub3JlZAogICAgICAqLwotICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3Q7CisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FueUFjdGl2ZSh2b2x1bWVTb3VyY2VUb0lnbm9yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogY2xhc3MgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gOgogICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSBzb3VyY2UgZXhjZXB0IHRoZSBvbmUgdG8gYmUgaWdub3JlZAogICAgICAqLwotICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3Q7CisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FueUFjdGl2ZSh2b2x1bWVTb3VyY2VUb0lnbm9yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAppbmRleCBjMWMzZjNjLi4wODQzZmVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzAsNyArMzEsNyBAQAogcHVibGljOgogICAgIEF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwogICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CkBAIC00Nyw3ICs0OCw3IEBACiAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IDQzZjZlZDYuLjIyNjRkOGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0xNiw4ICsxNiwxMCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgotI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgogI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KQEAgLTI4LDcgKzMwLDYgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsMjEgKzM5LDIwIEBACiAgICAgQXVkaW9Qb2xpY3lDb25maWcoSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICp2b2x1bWVzID0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSkKICAgICAgICAgOiBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpLAotICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyhkZWZhdWx0T3V0cHV0RGV2aWNlcyksCi0gICAgICAgICAgbVZvbHVtZUN1cnZlcyh2b2x1bWVzKSwKKyAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKSwKICAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSkKICAgICB7fQogCi0gICAgdm9pZCBzZXRWb2x1bWVzKGNvbnN0IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJnZvbHVtZXMpCi0gICAgewotICAgICAgICBpZiAobVZvbHVtZUN1cnZlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAqbVZvbHVtZUN1cnZlcyA9IHZvbHVtZXM7Ci0gICAgICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0U291cmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeworICAgICAgICBtU291cmNlID0gZmlsZTsKICAgICB9CiAKICAgICB2b2lkIHNldEh3TW9kdWxlcyhjb25zdCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcykKQEAgLTEwMCw1MSArMTAwLDgzIEBACiAKICAgICB2b2lkIHNldERlZmF1bHRPdXRwdXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHREZXZpY2UpCiAgICAgewotICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMgPSBkZWZhdWx0RGV2aWNlOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IGRlZmF1bHREZXZpY2U7CiAgICAgfQogCi0gICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZXM7IH0KKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOyB9CiAKICAgICB2b2lkIHNldERlZmF1bHQodm9pZCkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIG1Tb3VyY2UgPSAiQXVkaW9Qb2xpY3lDb25maWc6OnNldERlZmF1bHQiOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKTsKLSAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOworICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwogCi0gICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlksIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hdHRhY2gobW9kdWxlKTsKIAotICAgICAgICBzcDxPdXRwdXRQcm9maWxlPiBvdXRQcm9maWxlOwotICAgICAgICBvdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwogICAgICAgICBvdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0NDEwMCkpOwotICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgb3V0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSk7CiAgICAgICAgIG1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShvdXRQcm9maWxlKTsKIAotICAgICAgICBzcDxJbnB1dFByb2ZpbGU+IGluUHJvZmlsZTsKLSAgICAgICAgaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwotICAgICAgICBpblByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOwotICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApKTsKKyAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CisgICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOwogICAgICAgICBpblByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZWZhdWx0SW5wdXREZXZpY2UpOwogICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShpblByb2ZpbGUpOwogCi0gICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKKyAgICB9CisKKyAgICAvLyBTdXJyb3VuZCBmb3JtYXRzLCB3aXRoIGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3ViZm9ybWF0cyB0aGF0IGFyZSBlcXVpdmFsZW50IGZyb20gdXNlcnMnIFBPVi4KKyAgICB1c2luZyBTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZm9ybWF0X3QsIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4+OworCisgICAgY29uc3QgU3Vycm91bmRGb3JtYXRzICZnZXRTdXJyb3VuZEZvcm1hdHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1TdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdHMoY29uc3QgU3Vycm91bmRGb3JtYXRzICZzdXJyb3VuZEZvcm1hdHMpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0gc3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0geworICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUU19IRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQUNfTEMsIHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwgQVVESU9fRk9STUFUX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDM19KT0MsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUM0LCB7fX19OwogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtU291cmNlOwogICAgIEh3TW9kdWxlQ29sbGVjdGlvbiAmbUh3TW9kdWxlczsgLyoqPCBDb2xsZWN0aW9uIG9mIE1vZHVsZSwgd2l0aCBQcm9maWxlcywgaS5lLiBNaXggUG9ydHMuICovCiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlczsKLSAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCiAgICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KICAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgogICAgIGJvb2wgbUlzU3BlYWtlckRyY0VuYWJsZWQ7CisgICAgU3Vycm91bmRGb3JtYXRzIG1TdXJyb3VuZEZvcm1hdHM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IDhmYzZmZTkuLmQ2ZjI0YjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC0xNiwxNSArMTYsMTcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+CiAKLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKioKICAqIGN1c3RvbSBtaXggZW50cnkgaW4gbVBvbGljeU1peGVzCkBAIC00MSwxMiArNDMsMTIgQEAKIAogICAgIGFuZHJvaWQ6OkF1ZGlvTWl4ICpnZXRNaXgoKTsKIAotICAgIHZvaWQgc2V0TWl4KEF1ZGlvTWl4ICZtaXgpOworICAgIHZvaWQgc2V0TWl4KGNvbnN0IEF1ZGlvTWl4ICZtaXgpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKKyAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBtaXggZGVzY3JpcHRvcgogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0OyAgLy8gQ29ycmVzcG9uZGluZyBvdXRwdXQgc3RyZWFtCiB9OwogCkBAIC02NiwyMSArNjgsNDEgQEAKICAgICAgKiBUcnkgdG8gZmluZCBhbiBvdXRwdXQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgZm93ciB0aGUgcmVzZWFyY2ggb2Ygb3V0cHV0IGRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtW291dF0gZGVzYyB0byByZXR1cm4gaWYgYW4gb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIChpbiB0aGlzIGNhc2UsIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciBvdXRwdXQgcGFyYW0gaXMgaW5pdGlhbGl6ZWQpLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBwcmltYXJ5IG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKiBAcGFyYW1bb3V0XSBzZWNvbmRhcnlEZXNjIG90aGVyIGRlc2MgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlIHJvdXRlZCB0by4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZwcmltYXJ5RGVzYywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcyk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlRGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIHRyeSB0byBmaW5kIGEgbWF0Y2hpbmcgbWl4IGZvciBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkCisgICAgICogb3V0cHV0IGRldmljZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0IG9mIG91dHB1dCBkZXZpY2VzIGN1cnJlbnRseSByZWFjaGFibGUKKyAgICAgKiBAcGFyYW0gcG9saWN5TWl4IHRvIGJlIHJldHVybmVkIGlmIGFueSBtaXggbWF0Y2hpbmcgb3VwdXQgZGVzY3JpcHRvcgorICAgICAqIEByZXR1cm4gZGV2aWNlIHNlbGVjdGVkIGZyb20gdGhlIG1peCBhdHRhY2hlZCB0byB0aGUgb3V0cHV0LCBudWxsIHBvaW50ZXIgb3RoZXJ3aXNlCisgICAgICovCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4ID0gbnVsbHB0cik7CiAKICAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclVpZCh1aWRfdCB1aWQsIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBlbnVtIGNsYXNzIE1peE1hdGNoU3RhdHVzIHsgTUFUQ0gsIE5PX01BVENILCBJTlZBTElEX01JWCB9OworICAgIE1peE1hdGNoU3RhdHVzIG1peE1hdGNoKGNvbnN0IEF1ZGlvTWl4KiBtaXgsIHNpemVfdCBtaXhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKaW5kZXggMDlhODZkZC4uMWI1YTJkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtNjUsNiArNjUsNyBAQAogICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CiAgICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9CiAKICAgICAvLyBBdWRpbyBwb3J0IElEcyBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKQEAgLTExNiw2ICsxMTcsNyBAQAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdDsKICAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KIAogICAgIGJvb2wgdXNlSW5wdXRDaGFubmVsTWFzaygpIGNvbnN0CiAgICAgewpAQCAtMTMyLDE2ICsxMzQsMTcgQEAKICAgICB2b2lkIGFkZFJvdXRlKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgeyBtUm91dGVzLmFkZChyb3V0ZSk7IH0KICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZnZXRSb3V0ZXMoKSBjb25zdCB7IHJldHVybiBtUm91dGVzOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKwogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3Q7CiAKICAgICBBdWRpb0dhaW5Db2xsZWN0aW9uIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogCiBwcml2YXRlOgogICAgIHZvaWQgcGlja0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykgY29uc3Q7CiAgICAgdm9pZCBwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZyYXRlLGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0OwogCisgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCiAgICAgU3RyaW5nOCAgbU5hbWU7CiAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7CkBAIC0xNTMsMjIgKzE1NiwyMCBAQAogY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvUG9ydENvbmZpZygpOwotICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9Ci0KICAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZyA9IE5VTEwpOwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaGFzU2FtZUh3TW9kdWxlQXMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJgorICAgICAgICByZXR1cm4gKG90aGVyICE9IDApICYmIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCkgIT0gMCkgJiYgKGdldEF1ZGlvUG9ydCgpICE9IDApICYmCiAgICAgICAgICAgICAgICAgKG90aGVyLT5nZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gZ2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpKTsKICAgICB9Ci0gICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKLSAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzazsKLSAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CisgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKKyAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDg3NDFjNjYuLmI1ODhkNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKQEAgLTE2LDkxICsxNiw4NCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJwb2xpY3kuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gU2FtcGxlUmF0ZVZlY3RvcjsKLXR5cGVkZWYgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBDaGFubmVsc1ZlY3RvcjsKIHR5cGVkZWYgVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBGb3JtYXRWZWN0b3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KTsKK2Jvb2wgb3BlcmF0b3I9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICByZXR1cm4gIShsZWZ0ID09IHJpZ2h0KTsKK30KKworY2xhc3MgQ2hhbm5lbHNWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PgoreworcHVibGljOgorICAgIENoYW5uZWxzVmVjdG9yKCkgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHN2KSA6CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHN2KSB7fQorICAgIENoYW5uZWxzVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4gdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNJbk1hc2soKSBjb25zdDsKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQgdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNPdXRNYXNrKCkgY29uc3Q7Cit9OwogCiBjbGFzcyBBdWRpb1Byb2ZpbGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOwotICAgIH0KKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBjcmVhdGVGdWxsRHluYW1pYygpOwogCisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOwogICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikKLSAgICB7fQorICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKTsKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmdldENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrczsgfQotCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZnZXRTYW1wbGVSYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzOyB9CisgICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKTsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKTsKIAorICAgIHZvaWQgY2xlYXIoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZEZvcm1hdCgpICYmIGhhc1ZhbGlkUmF0ZXMoKSAmJiBoYXNWYWxpZENoYW5uZWxzKCk7IH0KLQotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CisgICAgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFza3MuaW5kZXhPZihjaGFubmVscykgPj0gMDsKICAgICB9Ci0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOwotICAgIH0KKyAgICBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7IH0KIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3QodWludDMyX3QgcmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmdXBkYXRlZENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKIApAQCAtMTE5LDcgKzExMiw3IEBACiAKICAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBTdHJpbmc4ICBtTmFtZTsKQEAgLTEzNiwyMTMgKzEyOSw0OCBAQAogY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQotICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOwotICAgICAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgotICAgICAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgotICAgICAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKLSAgICAgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOwotICAgICAgICAvLyB9Ci0gICAgICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSk7CiAgICAgLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgb25jZSByZXRyaWV2aW5nIGNhcGFiaWxpdGllcwogICAgIC8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwotICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAotICAgICAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CisgICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7CisgICAgdm9pZCBjbGVhclByb2ZpbGVzKCk7CisgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGlzIHByb2ZpbGUgdmVjdG9yIGNvbnRhaW5zIGlucHV0IHByb2ZpbGVzLAorICAgIC8vIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGZyb20gJ291dHB1dFByb2ZpbGVzJywgYWNjb3JkaW5nIHRvCisgICAgLy8gdGhlIGdpdmVuIHByZWZlcmVuY2VzIGZvciBhdWRpbyBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzLgorICAgIC8vIE5vdGU6IHN0ZDo6dmVjdG9ycyBhcmUgdXNlZCBiZWNhdXNlIHNwZWNpYWxpemVkIGNvbnRhaW5lcnMgZm9yIGZvcm1hdHMKKyAgICAvLyAgICAgICBhbmQgY2hhbm5lbHMgY2FuIGJlIHNvcnRlZCBhbmQgdXNlIHRoZWlyIG93biBvcmRlcmluZy4KKyAgICBzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsIC8vIG9yZGVyOiBtb3N0IHByZWYgLT4gbGVhc3QgcHJlZgorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdDsKIAotICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdDsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KIAotICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdCB7IHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOyB9CisgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKIAogICAgIC8vIE9uZSBhdWRpbyBwcm9maWxlIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2ggZm9ybWF0IHN1cHBvcnRlZCBieSBBdWRpbyBIQUwKLSAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQotICAgIHsKLSAgICAgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKLSAgICAgICAgICAgIGFkZChwcm9maWxlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKTsKIAotICAgIHZvaWQgY2xlYXJQcm9maWxlcygpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci0gICAgewotICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICAgICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgOCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLCBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMik7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKaW5kZXggNmIyNGZkZS4uMDM1N2ZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCkBAIC00Niw3ICs0NiwyMCBAQAogCiAgICAgYXVkaW9fcm91dGVfdHlwZV90IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzUGF0Y2ggY2hlY2tzIGlmIGFuIGF1ZGlvIHBhdGNoIGlzIHN1cHBvcnRlZCBieSBhIFJvdXRlIGRlY2xhcmVkIGluCisgICAgICogdGhlIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBmaWxlLgorICAgICAqIElmIHRoZSBwYXRjaCBpcyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgYW4gQXVkaW9IQUwgKHdoaWNoIHN1cHBvcnRzIG9mIGNvdXJzZSBSb3V0aW5nIEFQSSAzLjApLAorICAgICAqIGF1ZGlvcG9saWN5IHdpbGwgbm90IHJlcXVlc3QgQXVkaW9GbGluZ2VyIHRvIHVzZSBhIHNvZnR3YXJlIGJyaWRnZSB0byByZWFsaXplIGEgcGF0Y2gKKyAgICAgKiBiZXR3ZWVuIDIgcG9ydHMuCisgICAgICogQHBhcmFtIHNyY1BvcnQgKGFrYSB0aGUgc291cmNlKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRzdFBvcnQgKGFrYSB0aGUgc2luaykgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXVkaW8gcm91dGUgc3VwcG9ydHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgc2luayBhbmQgdGhlIHNvdXJjZSwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb1BvcnRWZWN0b3IgbVNvdXJjZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTI0N2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgQXVkaW9NaXgqIHBvbGljeU1peCwKLSAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9Ci0gICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9Ci0gICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9Ci0gICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9Ci0gICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7Ci0gICAgdWludDMyX3QgYWN0aXZlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQ291bnQ7IH0gOwotCi0gICAgdWludDMyX3QgY2hhbmdlT3BlbkNvdW50KGludCBkZWx0YSk7Ci0gICAgdWludDMyX3QgY2hhbmdlQWN0aXZlQ291bnQoaW50IGRlbHRhKTsKLQotICAgIHZvaWQgc2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87Ci0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7Ci0gICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwotICAgIGJvb2wgbVNpbGVuY2VkOwotICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwotICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7Ci0gICAgQXVkaW9NaXgqIG1Qb2xpY3lNaXg7IC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqIG1DbGllbnRJbnRlcmZhY2U7Ci0gICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBtSW5mb1Byb3ZpZGVyOwotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiA6Ci0gICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPEF1ZGlvU2Vzc2lvbj4gPiwKLSAgICBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgYWRkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLQotICAgIHN0YXR1c190IHJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdWludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3Q7Ci0KLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEFjdGl2ZVNlc3Npb25Db3VudCgpIGNvbnN0OwotICAgIGJvb2wgaGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDM3ZmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnB1dCBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gZGVwZW5kZW50IGF1ZGlvIHNlc3Npb25zIGNhbiBxdWVyeSBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlaXIgY29udGV4dAotICovCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOwotCi19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QgPSAwOzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MGY0Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLSNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci0KLWNsYXNzIEF1ZGlvU291cmNlRGVzY3JpcHRvcjogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1NvdXJjZURlc2NyaXB0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgOgotICAgICAgICBtRGV2aWNlKGRldmljZSksIG1BdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwgbVVpZCh1aWQpIHt9Ci0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2VEZXNjcmlwdG9yKCkge30KLQotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2MtPm1IYW5kbGU7IH0KLQotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1EZXZpY2U7Ci0gICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOwotICAgIHVpZF90IG1VaWQ7Ci0gICAgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKLSAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwotICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7Ci19OwotCi1jbGFzcyBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gOgotICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2UpIDoKKyAgICAgICAgbVBvcnRJZChwb3J0SWQpLCBtVWlkKHVpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCisgICAgICAgIG1Db25maWcoY29uZmlnKSwgbVByZWZlcnJlZERldmljZUlkKHByZWZlcnJlZERldmljZUlkKSwgbUFjdGl2ZShmYWxzZSksCisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KKyAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdDsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cmlidXRlczsgfQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZzsgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQ7IH07CisgICAgdm9pZCBzZXRQcmVmZXJyZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkKSB7CisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VJZCA9IHByZWZlcnJlZERldmljZUlkOworICAgIH0KKyAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQorICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJZCBmb3IgdGhpcyBjbGllbnQKKyAgICBjb25zdCB1aWRfdCBtVWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsgLy8gdXNhZ2UuLi4KKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IG1Db25maWc7CisgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUHJlZmVycmVkRGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgIGJvb2wgbUFjdGl2ZTsKKyAgICAgICAgICBib29sIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKK307CisKK2NsYXNzIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSksCisgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwgbVN0cmF0ZWd5KHN0cmF0ZWd5KSwgbVZvbHVtZVNvdXJjZSh2b2x1bWVTb3VyY2UpLCBtRmxhZ3MoZmxhZ3MpLAorICAgICAgICBtU2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUoc2Vjb25kYXJ5T3V0cHV0cykpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJhdGVneTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4mIGdldFNlY29uZGFyeU91dHB1dHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2Vjb25kYXJ5T3V0cHV0czsKKyAgICB9OworICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtVm9sdW1lU291cmNlOyB9CisKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAgICAgY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1BY3Rpdml0eUNvdW50LCAiJXMoJXMpIGludmFsaWQgZGVsdGEgJWQsIGluYWN0aXZlIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8aW50PihtQWN0aXZpdHlDb3VudCkgPCAtZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBDbGllbnREZXNjcmlwdG9yOjpzZXRBY3RpdmUobUFjdGl2aXR5Q291bnQgPiAwKTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgIGNvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBtU3RyYXRlZ3k7CisgICAgY29uc3QgVm9sdW1lU291cmNlIG1Wb2x1bWVTb3VyY2U7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gbVNlY29uZGFyeU91dHB1dHM7CisKKyAgICAvKioKKyAgICAgKiByZXF1aXJlZCBmb3IgZHVwbGljYXRpbmcgdGhyZWFkLCBwcmV2ZW50IGZyb20gcmVtb3ZpbmcgYWN0aXZlIGNsaWVudCBmcm9tIGFuIG91dHB1dAorICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCisgICAgICovCisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRBcHBTdGF0ZShhcHBfc3RhdGVfdCBhcHBTdGF0ZSkgeyBtQXBwU3RhdGUgPSBhcHBTdGF0ZTsgfQorICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlKCkgeyByZXR1cm4gbUFwcFN0YXRlOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbUFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFOyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkRWZmZWN0czsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3QgYm9vbCBtSXNTb3VuZFRyaWdnZXI7CisgICAgICAgICAgYXBwX3N0YXRlX3QgbUFwcFN0YXRlOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmNjNDNmZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMzEsMTUgKzMxLDMxIEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKIAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgIFN0cmluZzggYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1BZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIHsgbUFkZHJlc3MgPSBhZGRyZXNzOyB9CisKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRFbmNvZGVkRm9ybWF0KCkgeyByZXR1cm4gbUN1cnJlbnRFbmNvZGVkRm9ybWF0OyB9CisKKyAgICB2b2lkIHNldEVuY29kZWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBoYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpIGNvbnN0OworCisgICAgYm9vbCBzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtNDcsNDQgKzYzLDE0MSBAQAogCiAgICAgLy8gQXVkaW9Qb3J0CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwotCi0gICAgU3RyaW5nOCBtQWRkcmVzczsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIFN0cmluZzggbUFkZHJlc3N7IiJ9OwogICAgIFN0cmluZzggbVRhZ05hbWU7IC8vIFVuaXF1ZSBodW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciBhIGRldmljZSBwb3J0IGZvdW5kIGluIGNvbmYgZmlsZS4KICAgICBhdWRpb19kZXZpY2VzX3QgICAgIG1EZXZpY2VUeXBlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotCi1mcmllbmQgY2xhc3MgRGV2aWNlVmVjdG9yOworICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsKIH07CiAKIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8RGV2aWNlRGVzY3JpcHRvcj4gPgogewogcHVibGljOgogICAgIERldmljZVZlY3RvcigpIDogU29ydGVkVmVjdG9yKCksIG1EZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfTk9ORSkge30KKyAgICBleHBsaWNpdCBEZXZpY2VWZWN0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIDogRGV2aWNlVmVjdG9yKCkKKyAgICB7CisgICAgICAgIGFkZChpdGVtKTsKKyAgICB9CiAKICAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CiAgICAgdm9pZCBhZGQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgdm9pZCByZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OwogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OwotICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICAvLyBJZiAnYWRkcmVzcycgaXMgZW1wdHkgYW5kICdjb2RlYycgaXMgQVVESU9fRk9STUFUX0RFRkFVTFQsIGEgZGV2aWNlIHdpdGggYSBub24tZW1wdHkKKyAgICAvLyBhZGRyZXNzIG1heSBiZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkICd0eXBlJyBhbmQgZW1wdHkgYWRkcmVzcy4KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZUZyb21JZAorICAgICAqIEBwYXJhbSBpZCBvZiB0aGUgRGV2aWNlRGVzY3JpcHRvciB0byBzZWFjaCAoYWthIFBvcnQgaGFuZGxlKS4KKyAgICAgKiBAcmV0dXJuIERldmljZURlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBwb3J0IGlkIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZS4gSWYgdGhlIGlkIGlzCisgICAgICogZXF1YWwgdG8gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgaXQgYWxzbyByZXR1cm5zIGEgbnVsbHB0ci4KKyAgICAgKi8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0IHsgcmV0dXJuIGluZGV4T2YoaXRlbSkgPj0gMDsgfQogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBjb250YWluc0F0TGVhc3RPbmUKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRGV2aWNlVmVjdG9yIGNvbnRhaW5zIGF0IGxpc3Qgb25lIG9mIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYWxsIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3RvcgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGNvbGxlY3Rpb24gYWdhaW5zdCBhbm90aGVyIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBmaWx0ZXIgYWdhaW5zdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWVyZ2UgdHdvIHZlY3RvcnMuIEFzIFNvcnRlZFZlY3RvciBJbXBsZW1lbnRhdGlvbiBpcyBidWdneSAoaXQgZG9lcyBub3QgY2hlY2sgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLCBvbmx5IG9mIHRoZSBzb3VyY2UsIGl0IHByb3ZpZGVzIGEgc2FmZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHNvdXJjZSBkZXZpY2UgdmVjdG9yIHRvIG1lcmdlIHdpdGgKKyAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIG1lcmdlZCB2ZWN0b3IuCisgICAgICovCisgICAgc3NpemVfdCBtZXJnZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhZGQoZGV2aWNlcyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTb3J0ZWRWZWN0b3I6Om1lcmdlKGRldmljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBvcGVyYXRvciA9PSBEZXZpY2VWZWN0b3IgYXJlIGVxdWFscyBpZiBhbGwgdGhlIERldmljZURlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIChha2EKKyAgICAgKiBEZXZpY2VEZXNjcmlwdG9yIHdpdGggc2FtZSB0eXBlIGFuZCBhZGRyZXNzKSBhbmQgdGhlIHZlY3RvciBoYXMgc2FtZSBzaXplLgorICAgICAqIEBwYXJhbSByaWdodCBEZXZpY2VWZWN0b3IgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmlnaHQgY29udGFpbnMgdGhlIHNhbWUgZGV2aWNlIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKHJpZ2h0LmluZGV4T2YoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERldmljZVZlY3RvciAmcmlnaHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRGaXJzdFZhbGlkQWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHZhbGlkIGFkZHJlc3Mgb2YgYSBsaXN0IG9mIGRldmljZSwgIiIgaWYgbm8gZGV2aWNlIHdpdGggdmFsaWQgYWRkcmVzcworICAgICAqIGZvdW5kLgorICAgICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGhlbHBzIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgd2hlcmUgd2UgdXNlZCB0byBoYXZlIGEKKyAgICAgKiBkZXZpY2VzIG1hc2sgYW5kIGFuIGFkZHJlc3MuCisgICAgICovCisgICAgU3RyaW5nOCBnZXRGaXJzdFZhbGlkQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5hZGRyZXNzKCkgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5hZGRyZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggMDQ4MzFjNi4uN2YwMWRjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC0xNiwyNSArMTYsMzggQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQogY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYm9vbCBpc011c2ljRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBpbnQgaW8sIGludCBzZXNzaW9uKSA6CisgICAgICAgIG1JZChpZCksIG1JbyhpbyksIG1TZXNzaW9uKHNlc3Npb24pLCBtRW5hYmxlZChmYWxzZSksCisgICAgICAgIG1Jc011c2ljRWZmZWN0KGlzTXVzaWNFZmZlY3QpCisgICAgeworICAgICAgICBtZW1jcHkgKCZtRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9CiAKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwogICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKworICAgIGJvb2wgaXNNdXNpY0VmZmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1Jc011c2ljRWZmZWN0OyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNNdXNpY0VmZmVjdDsKIH07CiAKIGNsYXNzIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIEtleWVkVmVjdG9yPGludCwgc3A8RWZmZWN0RGVzY3JpcHRvcj4gPgpAQCAtNDMsMTQgKzU2LDE2IEBACiAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKIAogICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwgaW50IGlkLCBib29sIGlzTXVzaWNFZmZlY3QpOwogICAgIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBnZXRFZmZlY3QoaW50IGlkKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sICAgICBpc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKLSAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyMjlhNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yOwotCi1jbGFzcyBHYWlucwotewotcHVibGljIDoKLSAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50LCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOwotCi0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IGNiOWY0OWUuLmViMzRkYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC00Niw2ICs0NiwyMiBAQAogCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXREZWNsYXJlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGVjbGFyZWREZXZpY2VzOyB9CiAgICAgdm9pZCBzZXREZWNsYXJlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QWxsRGV2aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1EZWNsYXJlZERldmljZXM7CisgICAgICAgIGRldmljZXMubWVyZ2UobUR5bmFtaWNEZXZpY2VzKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfQorICAgIHZvaWQgYWRkRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgbUR5bmFtaWNEZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKworICAgIGJvb2wgcmVtb3ZlRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1EeW5hbWljRGV2aWNlcy5yZW1vdmUoZGV2aWNlKSA+PSAwOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZ2V0RHluYW1pY0RldmljZXMoKSBjb25zdCB7IHJldHVybiBtRHluYW1pY0RldmljZXM7IH0KIAogICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldElucHV0UHJvZmlsZXMoKSBjb25zdCB7IHJldHVybiBtSW5wdXRQcm9maWxlczsgfQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQpAQCAtODEsOCArOTcsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC05Myw2ICsxMjAsNyBAQAogICAgIElucHV0UHJvZmlsZUNvbGxlY3Rpb24gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgdWludDMyX3QgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgogICAgIERldmljZVZlY3RvciBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgRGV2aWNlVmVjdG9yIG1EeW5hbWljRGV2aWNlczsgLyoqPCBkZXZpY2VzIHRoYXQgY2FuIGJlIGFkZGVkL3JlbW92ZWQgYXQgcnVudGltZSAoZS5nLiByc2J1bWl4KSovCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOwogICAgIEF1ZGlvUG9ydFZlY3RvciBtUG9ydHM7CiB9OwpAQCAtMTAyLDE0ICsxMzAsNjQgQEAKIHB1YmxpYzoKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CiAKLSAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzID0gdHJ1ZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VEZXNjcmlwdG9yIHJldHVybnMgYSBkZXZpY2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHRoZSBkZXZpY2UgdHlwZSBhbmQKKyAgICAgKiBkZXZpY2UgYWRkcmVzcyAoaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpLgorICAgICAqIEl0IG1heSBsb29wIHR3aWNlIG9uIGFsbCBtb2R1bGVzIHRvIGNoZWNrIGlmIGFsbG93VG9DcmVhdGUgaXMgdHJ1ZQorICAgICAqICAgICAgLWZpcnN0IGxvb3Agd2lsbCBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIGEgbW9kdWxlIHNpbmNlIGRlY2xhcmVkIGluIHRoZSBsaXN0CisgICAgICogb2YgZGV2aWNlIHBvcnQgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogICAgICAtKGFsbG93VG9DcmVhdGUgaXMgdHJ1ZSlzZWNvbmQgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSBvbmUKKyAgICAgKiBvciBtb3JlIHByb2ZpbGVzIG9uIGEgZ2l2ZW4gbW9kdWxlIGFuZCB3aWxsIGFkZCBhcyBhIHN1cHBvcnRlZCBkZXZpY2UgZm9yIHRoaXMgbW9kdWxlLgorICAgICAqICAgICAgIFRoZSBkZXZpY2Ugd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBkeW5hbWljIGxpc3Qgb2YgZGV2aWNlIG9mIHRoaXMgbW9kdWxlCisgICAgICogQHBhcmFtIHR5cGUgb2YgdGhlIGRldmljZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCBpZiBub3QgQVVESU9fRk9STUFUX0RFRkFVTFQsIG11c3QgbWF0Y2ggb25lIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gbWF0Y2hBZGRyZXNzIHRydWUgaWYgYSBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gYWxsb3dUb0NyZWF0ZSB0cnVlIGlmIGFsbG93ZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGV2aWNlIChlLmcuIGhkbWksIHVzYi4uLikKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIHR5cGUgKGFuZCBhZGRyZXNzIGlmIG1hdGNoQWRkcmVzcyBpcyB0cnVlKQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY3JlYXRlRGV2aWNlIGNyZWF0ZXMgYSBuZXcgZGV2aWNlIGZyb20gdGhlIHR5cGUgYW5kIGFkZHJlc3MgZ2l2ZW4uIEl0IGNoZWNrcyB0aGF0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgdHlwZSwgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIGRldmljZSAod2VhayBjaGVjaykuCisgICAgICogVGhpcyBjb25jZXJucyBvbmx5IGR5bmFtaWMgZGV2aWNlLCBha2EgZGV2aWNlIHdpdGggYSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBub3QKKyAgICAgKiBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb2R1bGUvdW5kZXJseWluZyBwcm9maWxlcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRpbmcgdGhpcyB0eXBlLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFuVXBGb3JEZXZpY2U6IGxvb3Agb24gYWxsIHByb2ZpbGVzIG9mIGFsbCBtb2R1bGVzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbQorICAgICAqIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2UuIElmIHRoaXMgZGV2aWNlIGlzIGEgZHluYW1pYyBkZXZpY2UgKGFrYSBhIGRldmljZSBub3QgaW4gdGhlCisgICAgICogeG1sIGZpbGUgd2l0aCBhIHJ1bnRpbWUgYWRkcmVzcyksIGl0IGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgY29sbGVjdGlvbiBvZiBkeW5hbWljCisgICAgICogZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uZTBiNTZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzUsNyArMzUsNyBAQAogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQogICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKLSAgICAgICAgICBtYXhPcGVuQ291bnQoKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgPyAxIDogMCksCisgICAgICAgICAgbWF4T3BlbkNvdW50KDEpLAogICAgICAgICAgIGN1ck9wZW5Db3VudCgwKSwKICAgICAgICAgICBtYXhBY3RpdmVDb3VudCgxKSwKICAgICAgICAgICBjdXJBY3RpdmVDb3VudCgwKSB7fQpAQCAtNTcsMTIgKzU3LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwgYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCi0gICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCi0gICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIC8vIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgIC8qKgorICAgICAqIEBicmllZiBpc0NvbXBhdGlibGVQcm9maWxlOiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwKKyAgICAgKiBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KKyAgICAgKiBDaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKiBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICogQHBhcmFtIGZvcm1hdCB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkRm9ybWF0IGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIGZvcm1hdAorICAgICAqIEBwYXJhbSBjaGFubmVsTWFzayB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkQ2hhbm5lbE1hc2sgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgY2hhbm5lbCBtYXNrCisgICAgICogQHBhcmFtIGZsYWdzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyB0cnVlIGlmIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkIG9uIGZsYWdzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9maWxlIGlzIGNvbXBhdGlibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC03Myw1NCArODYsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogICAgIHZvaWQgbG9nKCk7CiAKICAgICBib29sIGhhc1N1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiAhbVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpOyB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICBib29sIHN1cHBvcnRzRGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgfQogCi0gICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgIHRoZSBhZGRyZXNzIGVuZm9yY2VtZW50IGlzIGxpbWl0ZWQgdG8gIm9mZmljYWwgZGV2aWNlcyIgdGhhdCBkaXN0aW5ndWlzaGUgb24gYWRkcmVzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIGJvb2wgZm9yY2VDaGVja09uQWRkcmVzcyA9IGZhbHNlKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOwotICAgIH0KLQotICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZUZvclR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gbVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UtPnR5cGUoKSkgJiYgIWZvcmNlQ2hlY2tPbkFkZHJlc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0RldmljZVR5cGVzKGRldmljZS0+dHlwZSgpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhkZXZpY2UpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7IH0KKyAgICBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyByZXF1aXJlZCBmb3IgaXNPZmZsb2FkU3VwcG9ydGVkKCkgY2hlY2sKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCktPmhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIHZvaWQgY2xlYXJTdXBwb3J0ZWREZXZpY2VzKCkgeyBtU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOyB9CiAgICAgdm9pZCBhZGRTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KLQorICAgIHZvaWQgcmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICB9CiAgICAgdm9pZCBzZXRTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgYWRkcmVzcyk7Ci0gICAgfQotCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnRlZERldmljZXM7IH0KIAogICAgIGJvb2wgY2FuT3Blbk5ld0lvKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwMjJmYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLCBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0ID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjZiMDguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxWb2x1bWUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIHZpcnR1YWwgfklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgLyppc1NwZWFrZXJEcmNFbmFibGVkKi8pIHt9Ci0gICAgdmlydHVhbCB2b2lkIHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IGRzdCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgewotICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShzdHJlYW0sIHN0cmVhbSk7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3QgPSAwOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKaW5kZXggMjlkZTg0OC4uNDhjNDE0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCkBAIC0xNywyMjMgKzE3LDkgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lDb25maWcuaCIKLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLXN0cnVjdCBfeG1sTm9kZTsKLXN0cnVjdCBfeG1sRG9jOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBdWRpb0dhaW5UcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZGVbXTsgLyoqPCBnYWluIG1vZGVzIHN1cHBvcnRlZCwgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCi0gICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblZhbHVlTUJbXTsgLyoqPCBtaW4gdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heFZhbHVlTUJbXTsgLyoqPCBtYXggdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRWYWx1ZU1CW107IC8qKjwgZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RlcFZhbHVlTUJbXTsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtaW5SYW1wTXNbXTsgLyoqPCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4UmFtcE1zW107IC8qKjwgLm5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QICovCi0gICAgfTsKLQotICAgIHR5cGVkZWYgQXVkaW9HYWluIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9HYWluQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIEdhaW4gaGFzIG5vIGNoaWxkCi19OwotCi0vLyBBIHByb2ZpbGUgc2VjdGlvbiBjb250YWlucyBhIG5hbWUsICBvbmUgYXVkaW8gZm9ybWF0IGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKLS8vIGFuZCBjaGFubmVsIG1hc2tzIGZvciB0aGlzIGZvcm1hdAotc3RydWN0IEF1ZGlvUHJvZmlsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzYW1wbGluZ1JhdGVzW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZvcm1hdFtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsTWFza3NbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEF1ZGlvUHJvZmlsZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLX07Ci0KLXN0cnVjdCBNaXhQb3J0VHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZmxhZ3NbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4T3BlbkNvdW50W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heEFjdGl2ZUNvdW50W107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgSU9Qcm9maWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgSU9Qcm9maWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogR2FpblRyYWl0cwotfTsKLQotc3RydWN0IERldmljZVBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHRhZ05hbWVbXTsgLyoqPCAgPGRldmljZSB0YWcgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxkZXZpY2UgdHlwZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVbXTsgLyoqPCA8ZGV2aWNlIHJvbGU6IHNpbmsgb3Igc291cmNlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVNvdXJjZVtdOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzW107IC8qKjwgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCi0gICAgfTsKLSAgICB0eXBlZGVmIERldmljZURlc2NyaXB0b3IgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPERldmljZURlc2NyaXB0b3I+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBEZXZpY2VWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzIChvcHRpb25uYWwpCi19OwotCi1zdHJ1Y3QgUm91dGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVbXTsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVNaXhbXTsgLyoqPCB0eXBlIGF0dHJpYnV0ZSBtaXggdmFsdWUuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNpbmtbXTsgLyoqPCA8c2luazogaW52b2x2ZWQgaW4gdGhpcyByb3V0ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNvdXJjZXNbXTsgLyoqPCBzb3VyY2VzOiBhbGwgc291cmNlIHRoYXQgY2FuIGJlIGludm9sdmVkIGluIHRoaXMgcm91dGUuICovCi0gICAgfTsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEF1ZGlvUm91dGU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb1JvdXRlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBId01vZHVsZSAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KTsKLX07Ci0KLXN0cnVjdCBNb2R1bGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgSHdNb2R1bGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBId01vZHVsZUNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBtaXhQb3J0VHJhaXRzLCBkZXZpY2VQb3J0VHJhaXRzIGFuZCByb3V0ZVRyYWl0cwotICAgIC8vIE5lZWQgdG8gY2FsbCBkZXNlcmlhbGl6ZSBvbiBlYWNoIGNoaWxkCi19OwotCi1zdHJ1Y3QgR2xvYmFsQ29uZmlnVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzcGVha2VyRHJjRW5hYmxlZFtdOwotICAgIH07Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgX3htbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotfTsKLQotc3RydWN0IFZvbHVtZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZvbHVtZVBvaW50VGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0cmVhbVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZXZpY2VDYXRlZ29yeVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByZWZlcmVuY2VbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBWb2x1bWVDdXJ2ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8Vm9sdW1lQ3VydmU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gTm8gQ2hpbGQKLX07Ci0KLWNsYXNzIFBvbGljeVNlcmlhbGl6ZXIKLXsKLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJvb3ROYW1lOwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZlcnNpb25BdHRyaWJ1dGU7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNYWpvcjsgLyoqPCB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBnTWlub3I7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLQotcHVibGljOgotICAgIFBvbGljeVNlcmlhbGl6ZXIoKTsKLSAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpzdHIsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKLQotICAgIHN0ZDo6c3RyaW5nIG1Sb290RWxlbWVudE5hbWU7Ci0gICAgc3RkOjpzdHJpbmcgbVZlcnNpb247Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cwotfTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI0NDQwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotY2xhc3MgRGV2aWNlVmVjdG9yOwotCi1jbGFzcyBTZXNzaW9uUm91dGUgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIC8vIEZvciBJbnB1dCAoU291cmNlKSByb3V0ZXMsIHVzZSBTVFJFQU1fVFlQRV9OQSAoIk5BIiA9ICJub3QgYXBwbGljYWJsZSlmb3IgdGhlCi0gICAgLy8gc3RyZWFtVHlwZSBhcmd1bWVudAotICAgIHN0YXRpYyBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IFNUUkVBTV9UWVBFX05BID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0KLSAgICAvLyBGb3IgT3V0cHV0IChTaW5rKSByb3V0ZXMsIHVzZSBTT1VSQ0VfVFlQRV9OQSAoIk5BIiA9ICJub3QgYXBwbGljYWJsZSIpIGZvciB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQKLQotICAgIHN0YXRpYyBjb25zdCBhdWRpb19zb3VyY2VfdCBTT1VSQ0VfVFlQRV9OQSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotCi0gICAgU2Vzc2lvblJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotICAgICAgICA6IG1VaWQodWlkKSwKLSAgICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcihkZXZpY2VEZXNjcmlwdG9yKSwKLSAgICAgICAgICBtUmVmQ291bnQoMCksCi0gICAgICAgICAgbUFjdGl2aXR5Q291bnQoMCksCi0gICAgICAgICAgbUNoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAotICAgICAgICAgIG1Tb3VyY2Uoc291cmNlKQotICAgIHt9Ci0KLSAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBwcmVmaXgpOwotCi0gICAgYm9vbCBpc0FjdGl2ZU9yQ2hhbmdlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtRGV2aWNlRGVzY3JpcHRvciAhPSAwKSAmJiAobUNoYW5nZWQgfHwgKG1BY3Rpdml0eUNvdW50ID4gMCkpOwotICAgIH0KLQotICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtU2Vzc2lvbjsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAgICAgICAgbURldmljZURlc2NyaXB0b3I7Ci0KLSAgICAvLyAicmVmZXJlbmNlIiBjb3VudGluZwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgLy8gKy8tIG9uIHJlZmVyZW5jZXMKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q291bnQ7IC8vICsvLSBvbiBzdGFydC9zdG9wCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VkOwotICAgIC8vIGZvciBvdXRwdXRzCi0gICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAgIG1TdHJlYW1UeXBlOwotICAgIC8vIGZvciBpbnB1dHMKLSAgICBjb25zdCBhdWRpb19zb3VyY2VfdCAgICAgICAgbVNvdXJjZTsKLX07Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZU1hcDogcHVibGljIEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgc3A8U2Vzc2lvblJvdXRlPiA+Ci17Ci1wdWJsaWM6Ci0gICAgLy8gVGhlc2UgY29uc3RhbnRzIGlkZW50aWZ5IHRoZSBTZXNzaW9uUm91dE1hcCBhcyBob2xkaW5nIEVJVEhFUiBpbnB1dCByb3V0ZXMsCi0gICAgLy8gb3Igb3V0cHV0IHJvdXRlcy4gIEFuIGVycm9yIHdpbGwgb2NjdXIgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkZCBhIFNlc3Npb25Sb3V0ZQotICAgIC8vIG9iamVjdCB3aXRoIG1TdHJlYW1UeXBlID09IFNUUkVBTV9UWVBFX05BIChpLmUuIGFuIGlucHV0IFNlc3Npb25Sb3V0ZSkgdG8gYQotICAgIC8vIFNlc3Npb25Sb3V0TWFwIHRoYXQgaXMgbWFya2VkIGZvciBvdXRwdXQgKGkuZS4gbU1hcFR5cGUgPT0gU0VTU0lPTl9ST1VURV9NQVBfT1VUUFVUKQotICAgIC8vIGFuZCBzaW1pbGFybHkgIGZvciBvdXRwdXQgU2Vzc2lvblJvdXRlcyBhbmQgSW5wdXQgU2Vzc2lvblJvdXRlTWFwcy4KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIE1BUFRZUEVfSU5QVVQgPSAwLAotICAgICAgICBNQVBUWVBFX09VVFBVVCA9IDEKLSAgICB9IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdDsKLQotICAgIGV4cGxpY2l0IFNlc3Npb25Sb3V0ZU1hcChzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbWFwVHlwZSkgOgotICAgICAgICBtTWFwVHlwZShtYXBUeXBlKQotICAgIHt9Ci0KLSAgICBib29sIGhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHZvaWQgcmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgaW50IGluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGludCBkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBib29sIGdldEFuZENsZWFyUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsgLy8gYWxzbyBjbGVhcnMgdGhlIGNoYW5nZWQgZmxhZwotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pOwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKTsKLSAgICAvLyBTcGVjaWZ5IGFuIE91dHB1dChTaW5rKSByb3V0ZSBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEgaW4gdGhlCi0gICAgLy8gc291cmNlIGFyZ3VtZW50LgotICAgIC8vIFNwZWNpZnkgYW4gSW5wdXQoU291cmNlKSByb3V0IGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpBVURJT19TVFJFQU1fREVGQVVMVAotICAgIC8vIGluIHRoZSBzdHJlYW1UeXBlIGFyZ3VtZW50LgotICAgIHZvaWQgYWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVXNlZCB0byBtYXJrIGEgU2Vzc2lvblJvdXRlIGFzIGZvciBlaXRoZXIgaW5wdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX0lucHV0KQotICAgIC8vIG9yIG91dHB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfT3V0cHV0KQotICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGIxMDM3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAotY2xhc3MgU3RyZWFtRGVzY3JpcHRvcgotewotcHVibGljOgotICAgIFN0cmVhbURlc2NyaXB0b3IoKTsKLQotICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKLSAgICBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtQ2FuQmVNdXRlZDsgfQotICAgIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLSAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpOwotICAgIGludCBnZXRWb2x1bWVJbmRleE1pbigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1pbjsgfQotICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oaW50IHZvbEluZGV4TWluKTsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGludCB2b2xJbmRleE1heCk7Ci0gICAgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPj0gMDsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKLQotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICptVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX0NOVF07Ci0gICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLwotICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KLSAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCi0gICAgYm9vbCBtQ2FuQmVNdXRlZDsgLyoqPCB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkLiAqLwotfTsKLQotLyoqCi0gKiBzdHJlYW0gZGVzY3JpcHRvcnMgY29sbGVjdGlvbiBmb3Igdm9sdW1lIGNvbnRyb2wKLSAqLwotY2xhc3MgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3QsIFN0cmVhbURlc2NyaXB0b3I+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24KLXsKLXB1YmxpYzoKLSAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpOwotCi0gICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4KGRldmljZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7Ci0gICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5oYXNWb2x1bWVJbmRleEZvckRldmljZShkZXZpY2UpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqZ2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNaW4pOwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCmluZGV4IDYzYzE5ZDEuLjZiMDQ3NmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaApAQCAtMjMsMjYgKzIzLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERldmljZUNhdGVnb3J5VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBkZXZpY2VfY2F0ZWdvcnkgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBNaXhUeXBlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgUm91dGVGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFJ1bGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07CitzdHJ1Y3QgUnVsZVRyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPHVpbnQzMl90PiB7fTsKK3VzaW5nIERldmljZUNhdGVnb3J5VHJhaXRzID0gRGVmYXVsdFRyYWl0czxkZXZpY2VfY2F0ZWdvcnk+Oworc3RydWN0IE1peFR5cGVUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czxpbnQzMl90PiB7fTsKK3N0cnVjdCBSb3V0ZUZsYWdUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czx1aW50MzJfdD4ge307CiAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxEZXZpY2VDYXRlZ29yeVRyYWl0cz4gRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8TWl4VHlwZVRyYWl0cz4gTWl4VHlwZUNvbnZlcnRlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmIyYjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlIDxwb2xpY3kuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBDdXJ2ZVBvaW50Ci17Ci0gICAgQ3VydmVQb2ludCgpIHt9Ci0gICAgQ3VydmVQb2ludChpbnQgaW5kZXgsIGludCBhdHRlbnVhdGlvbkluTWIpIDoKLSAgICAgICAgbUluZGV4KGluZGV4KSwgbUF0dGVudWF0aW9uSW5NYihhdHRlbnVhdGlvbkluTWIpIHt9Ci0gICAgdWludDMyX3QgbUluZGV4OwotICAgIGludCBtQXR0ZW51YXRpb25Jbk1iOwotfTsKLQotaW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCBDdXJ2ZVBvaW50ICZsaHMsIGNvbnN0IEN1cnZlUG9pbnQgJnJocykKLXsKLSAgICByZXR1cm4gbGhzLm1JbmRleCA8IHJocy5tSW5kZXg7Ci19Ci0KLS8vIEEgdm9sdW1lIGN1cnZlIGZvciBhIGdpdmVuIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKLS8vIEl0IGNvbnRhaW5zIG9mIGxpc3Qgb2YgcG9pbnRzIG9mIHRoaXMgY3VydmUgZXhwcmVzc2luZyB0aGUgYXR0ZW51YXRpb24gaW4gTWlsbGliZWxzIGZvcgotLy8gYSBnaXZlbiB2b2x1bWUgaW5kZXggZnJvbSAwIHRvIDEwMAotY2xhc3MgVm9sdW1lQ3VydmUgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6Ci0gICAgICAgIG1EZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBtU3RyZWFtVHlwZShzdHJlYW0pIHt9Ci0KLSAgICBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQ2F0ZWdvcnk7IH0KLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotCi0gICAgdm9pZCBhZGQoY29uc3QgQ3VydmVQb2ludCAmcG9pbnQpIHsgbUN1cnZlUG9pbnRzLmFkZChwb2ludCk7IH0KLQotICAgIGZsb2F0IHZvbEluZGV4VG9EYihpbnQgaW5kZXhJblVpLCBpbnQgdm9sSW5kZXhNaW4sIGludCB2b2xJbmRleE1heCkgY29uc3Q7Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBTb3J0ZWRWZWN0b3I8Q3VydmVQb2ludD4gbUN1cnZlUG9pbnRzOwotICAgIGRldmljZV9jYXRlZ29yeSBtRGV2aWNlQ2F0ZWdvcnk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZTsKLX07Ci0KLS8vIFZvbHVtZSBDdXJ2ZXMgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgaW5kZXhlZCBieSBkZXZpY2UgY2F0ZWdvcnkKLWNsYXNzIFZvbHVtZUN1cnZlc0ZvclN0cmVhbSA6IHB1YmxpYyBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+Ci17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtKCkgOiBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLSAgICB7Ci0gICAgICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIDApOwotICAgIH0KLQotICAgIHNwPFZvbHVtZUN1cnZlPiBnZXRDdXJ2ZXNGb3IoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleE9mS2V5KGRldmljZSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVGb3IoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRQotICAgICAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtQ2FuQmVNdXRlZDsgfQotICAgIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKSB7IG1JbmRleEN1ci5jbGVhcigpOyB9Ci0gICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KSB7IG1JbmRleEN1ci5hZGQoZGV2aWNlLCBpbmRleCk7IH0KLQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oaW50IHZvbEluZGV4TWluKSB7IG1JbmRleE1pbiA9IHZvbEluZGV4TWluOyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9Ci0KLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGludCB2b2xJbmRleE1heCkgeyBtSW5kZXhNYXggPSB2b2xJbmRleE1heDsgfQotICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQotCi0gICAgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPj0gMDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gZ2V0T3JpZ2luVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQobU9yaWdpblZvbHVtZUN1cnZlcy5pbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkiKTsKLSAgICAgICAgcmV0dXJuIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMudmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnkpOwotICAgIH0KLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSBmb3IgVm9sdW1lIEN1cnZlIik7Ci0gICAgICAgIHJlcGxhY2VWYWx1ZUZvcihkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgIH0KLQotICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCi0gICAgewotICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSB2b2x1bWVDdXJ2ZS0+Z2V0RGV2aWNlQ2F0ZWdvcnkoKTsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG9yaWdpbmFsIFZvbHVtZSBDdXJ2ZXMgcGVyIGRldmljZSBjYXRlZ29yeSBpbiBvcmRlciB0byBzd2l0Y2ggY3VydmVzLgotICAgICAgICAgICAgbU9yaWdpblZvbHVtZUN1cnZlcy5hZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICAgICAgICAgIHJldHVybiBLZXllZFZlY3Rvcjo6YWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0LCBpbnQgaW5kZXhJblVpKSBjb25zdAotICAgIHsKLSAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IHZjID0gZ2V0Q3VydmVzRm9yKGRldmljZUNhdCk7Ci0gICAgICAgIGlmICh2YyAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmMtPnZvbEluZGV4VG9EYihpbmRleEluVWksIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSAlZCBmb3IgVm9sdW1lIEN1cnZlIiwgZGV2aWNlQ2F0KTsKLSAgICAgICAgICAgIHJldHVybiAwLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+IG1PcmlnaW5Wb2x1bWVDdXJ2ZXM7Ci0gICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLwotICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KLSAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCi0gICAgYm9vbCBtQ2FuQmVNdXRlZDsgLyoqPCB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkLiAqLwotfTsKLQotLy8gQ29sbGVjdGlvbiBvZiBWb2x1bWUgQ3VydmVzIGluZGV4ZWQgYnkgdXNlIGNhc2UKLWNsYXNzIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgVm9sdW1lQ3VydmVzRm9yU3RyZWFtPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24KLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBjb2xsZWN0aW9uIG9mIGN1cnZlcwotICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDAgOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpOwotICAgICAgICAgICAgS2V5ZWRWZWN0b3I6OmFkZChzdHJlYW0sIFZvbHVtZUN1cnZlc0ZvclN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9uY2UgWE1MIGhhcyBiZWVuIHBhcnNlZCwgbXVzdCBiZSBjYWxsIGZpcnN0IHRvIHNhbml0eSBjaGVjayB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpbmRleGVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKLSAgICB7Ci0gICAgICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNaW4oaW5kZXhNaW4pOwotICAgICAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgewotICAgICAgICBlZGl0Q3VydmVzRm9yKHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgZWRpdEN1cnZlc0ZvcihzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmNhbkJlTXV0ZWQoKTsgfQotCi0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmc291cmNlQ3VydmVzID0gZ2V0Q3VydmVzRm9yKHN0cmVhbVNyYyk7Ci0gICAgICAgIFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZHN0Q3VydmVzID0gZWRpdEN1cnZlc0ZvcihzdHJlYW1Ec3QpOwotICAgICAgICBBTE9HX0FTU0VSVChzb3VyY2VDdXJ2ZXMuc2l6ZSgpID09IGRzdEN1cnZlcy5zaXplKCksICJkZXZpY2UgY2F0ZWdvcnkgbm90IGFsaWduZWQiKTsKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZUN1cnZlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBjYXQgPSBzb3VyY2VDdXJ2ZXMua2V5QXQoaW5kZXgpOwotICAgICAgICAgICAgZHN0Q3VydmVzLnNldFZvbHVtZUN1cnZlKGNhdCwgc291cmNlQ3VydmVzLmdldE9yaWdpblZvbHVtZUN1cnZlKGNhdCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgY2F0LCBpbnQgaW5kZXhJblVpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLnZvbEluZGV4VG9EYihjYXQsIGluZGV4SW5VaSk7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5oYXNWb2x1bWVJbmRleEZvckRldmljZShkZXZpY2UpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotCi0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IHZvbHVtZUN1cnZlLT5nZXRTdHJlYW1UeXBlKCk7Ci0gICAgICAgIHJldHVybiBlZGl0Q3VydmVzRm9yKHN0cmVhbVR5cGUpLmFkZCh2b2x1bWVDdXJ2ZSk7Ci0gICAgfQotICAgIFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZWRpdEN1cnZlc0ZvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoc3RyZWFtKSA+PSAwLCAiSW52YWxpZCBzdHJlYW0gdHlwZSBmb3IgVm9sdW1lIEN1cnZlIik7Ci0gICAgICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pOwotICAgIH0KLSAgICBjb25zdCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0gJmdldEN1cnZlc0ZvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoc3RyZWFtKSA+PSAwLCAiSW52YWxpZCBzdHJlYW0gdHlwZSBmb3IgVm9sdW1lIEN1cnZlIik7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pOwotICAgIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggY2E2N2I4Ny4uYzkwYTU4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTM1LDIyICszNSwxNiBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Sb3V0ZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIDQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSAlenU6XG4iLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIDQpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCmluZGV4IDE5M2Q0YTYuLjI3MjU4NzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApAQCAtOTgsMzIgKzk4LDE3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgQXVkaW9HYWluOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDFlMDY0MGMuLjFmYTExMjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDIyICsxNywxOSBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJBdWRpb0lucHV0RGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbUlvSGFuZGxlKDApLAotICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksCi0gICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUHJvZmlsZShwcm9maWxlKQorICAgICwgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwpAQCAtNTAsMTkgKzQ3LDE0IEBACiAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotdWludDMyX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldE9wZW5SZWZDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRPcGVuQ291bnQoKTsKLX0KLQogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAogewogICAgIHJldHVybiBtSWQ7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0CithdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c291cmNlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkuc291cmNlOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTgzLDcgKzc1LDcgQEAKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IGlucHV0U291cmNlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gc291cmNlKCk7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdApAQCAtMTE4LDU3ICsxMTAsNTUgQEAKICAgICBtUHJlZW1wdGVkU2Vzc2lvbnMuY2xlYXIoKTsKIH0KIAotYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5oYXNBY3RpdmVTZXNzaW9uKCk7Ci19Ci0KIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmCisgICAgICAgICAgICAoKGNsaWVudC0+c291cmNlKCkgPT0gc291cmNlKSB8fAorICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudC0+c291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkgY29uc3QKIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CiAKLSAgICByZXR1cm4gbVNlc3Npb25zLmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICBmb3IgKGJvb2wgYWN0aXZlT25seSA6IHsgdHJ1ZSwgZmFsc2UgfSkgeworICAgICAgICBpbnQzMl90IHRvcFByaW9yaXR5ID0gLTE7CisgICAgICAgIGFwcF9zdGF0ZV90IHRvcFN0YXRlID0gQVBQX1NUQVRFX0lETEU7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBfc3RhdGVfdCBjdXJTdGF0ZSA9IGNsaWVudC0+YXBwU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChjdXJTdGF0ZSA+PSB0b3BTdGF0ZSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoY2xpZW50LT5zb3VyY2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gdG9wUHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGNsaWVudC0+YXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICB0b3BQcmlvcml0eSA9IGN1clByaW9yaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3BTdGF0ZSA9IGN1clN0YXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CiB9CiAKIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291bmRUcmlnZ2VyKCkgY29uc3QgewotICAgIC8vIHNvdW5kIHRyaWdnZXIgYW5kIG5vbiBzb3VuZCB0cmlnZ2VyIHNlc3Npb25zIGFyZSBub3QgbWl4ZWQKLSAgICAvLyBvbiBhIGdpdmVuIGlucHV0Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUF0KDApLT5pc1NvdW5kVHJpZ2dlcigpOwotfQotCi1zcDxBdWRpb1Nlc3Npb24+IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25zKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBpZiAoYWN0aXZlT25seSkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLmdldEFjdGl2ZVNlc3Npb25zKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uczsKKyAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBjbGllbnRzIGFyZSBub3QgbWl4ZWQgb24gYSBnaXZlbiBpbnB1dAorICAgIC8vIHNvIGNoZWNrIG9ubHkgZmlyc3QgY2xpZW50CisgICAgaWYgKGdldENsaWVudENvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotfQotCi1zaXplX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbkNvdW50KGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBpZiAoYWN0aXZlT25seSkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLmdldEFjdGl2ZVNlc3Npb25Db3VudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuc2l6ZSgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmFkZFNlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLCAvKkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciovdGhpcyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpyZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLnJlbW92ZVNlc3Npb24oc2Vzc2lvbik7CisgICAgcmV0dXJuIGdldENsaWVudEl0ZXJhYmxlKCkuYmVnaW4oKS0+aXNTb3VuZFRyaWdnZXIoKTsKIH0KIAogYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKQEAgLTE3OSw3ICsxNjksMTEgQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Ci0gICAgbVNlc3Npb25zLm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKQEAgLTE5MCw4ICsxODQsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCkKQEAgLTIwOCwyNCArMjAxLDI2IEBACiAKICAgICBtRGV2aWNlID0gZGV2aWNlOwogCi0gICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBtRGV2aWNlLT50eXBlKCk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+YWRkcmVzcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZS0+dHlwZSgpICE9IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLT50eXBlKCksIGRldmljZVR5cGUpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgaW5wdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBtU2FtcGxpbmdSYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKICAgICAgICAgbUNoYW5uZWxNYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgIG1Gb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKQEAgLTIzOSw3ICsyMzQsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RhcnQoKQogewotICAgIGlmIChnZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKICAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CiAgICAgICAgICAgICBBTE9HSSgiJXMgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkIiwgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjIsNDIgKzI1NywxODggQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKICAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGFjdGl2ZSBjbGllbnRzIGlmIGFueSAoY2FuIGhhcHBlbiBpZiBjbG9zZSgpIGlzIGNhbGxlZCB0byBmb3JjZQorICAgICAgICAvLyBjbGllbnRzIHRvIHJlY29ubmVjdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNsaWVudCB3aXRoIHBvcnQgSUQgJWQgc3RpbGwgYWN0aXZlIG9uIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1JZCk7CisgICAgICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlvSGFuZGxlKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKLSAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlcgotICAgICAgICAvLyBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzZXNzaW9ucwotICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0gICAgICAgIH0KKwogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBtU2Vzc2lvbnMuZHVtcChmZCwgMSk7CisgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpbnQgZXZlbnQgPSBhY3RpdmUgPyBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDogUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOworICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oZXZlbnQsIGNsaWVudCk7CisKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICBpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+dWlkKCksIGNsaWVudC0+c2Vzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5zb3VyY2UoKSwgY2xpZW50LT5wb3J0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTaWxlbmNlZCgpfTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IGdldENvbmZpZygpOworCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0czsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlZmZlY3RzTGlzdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsaWVudEVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgIGVmZmVjdHNMaXN0ID0gZ2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZyZWNvcmRDbGllbnRJbmZvLCAmc2Vzc2lvbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0cywgJmNvbmZpZywgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoSGFuZGxlLCBzb3VyY2UoKSk7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q2xpZW50c0ZvclNlc3Npb24oCisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPnNlc3Npb24oKSA9PSBzZXNzaW9uKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0Cit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmICgoIWFjdGl2ZU9ubHkgfHwgY2xpZW50LT5hY3RpdmUoKSkKKyAgICAgICAgICAgICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgfHwgc291cmNlID09IGNsaWVudC0+c291cmNlKCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwgY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9CisKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGdldENsaWVudHNGb3JTZXNzaW9uKChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5tU2Vzc2lvbik7CisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKS5nZXRFZmZlY3QoZWZmZWN0LT5tSWQpOworICAgICAgICBib29sIGNoYW5nZWQgPSAoZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICB8fCAoIWVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ICE9IG51bGxwdHIpOworICAgICAgICBjbGllbnQtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICBpZiAoY2hhbmdlZCAmJiBjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0VmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0Cit7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZW5hYmxlZEVmZmVjdHM7CisgICAgLy8gcmVwb3J0IGVmZmVjdHMgZm9yIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIHNvdXJjZSBhcyBhcHBsaWVkIHRvIGFsbCBjbGllbnRzCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPQorICAgICAgICBjbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBzb3VyY2UoKSwgZmFsc2UgLypwcmVmZXJyZWREZXZpY2VPbmx5Ki8pOworICAgIGlmIChjbGllbnRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZW5hYmxlZEVmZmVjdHMgPSBjbGllbnRzWzBdLT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlZEVmZmVjdHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FzU2lsZW5jZWQgPSBjbGllbnQtPmlzU2lsZW5jZWQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgd2FzU2lsZW5jZWQgIT0gY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICVzXG4iLCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGdldEVuYWJsZWRFZmZlY3RzKCkuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzIyLDU2ICs0NjMsNzQgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdWludDMyX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSBjb25zdAordWludDMyX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKIHsKICAgICB1aW50MzJfdCBjb3VudCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7CiAgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkgJiYKLSAgICAgICAgICAgICAgICAoKGRldmljZXMgPT0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIHx8Ci0gICAgICAgICAgICAgICAgICgoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlICYgZGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAoZGV2aWNlcy5pc0VtcHR5KCkgfHwgZGV2aWNlcy5jb250YWlucyhpbnB1dERlc2NyaXB0b3ItPmdldERldmljZSgpKSkpIHsKICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGNvdW50OwogfQogCi1WZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzKQorVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0QWN0aXZlSW5wdXRzKCkKIHsKICAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0czsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkKLSAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwKLSAgICAgICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpKSB7CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkpIHsKICAgICAgICAgICAgIGFjdGl2ZUlucHV0cy5hZGQoaW5wdXREZXNjcmlwdG9yKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gYWN0aXZlSW5wdXRzOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAorc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRJbnB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGlucHV0RGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgcmV0dXJuIGRldmljZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5tSW9IYW5kbGUgPT0gZWZmZWN0LT5tSW8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICB9CiAgICAgfQorfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Y2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKAorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkgPT0gZGlzY29ubmVjdGVkRGV2aWNlLT5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuSW5wdXRzIGR1bXA6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKKyAgICB9CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDk5YjQ1YzguLjcyOTNiYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcApAQCAtMzQsMTkgKzM0LDggQEAKIAogQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgIDogbVBvcnQocG9ydCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewotICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKLSAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7Ci0gICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwotICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwotICAgIH0KICAgICBpZiAobVBvcnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwogICAgICAgICBpZiAobVBvcnQtPm1HYWlucy5zaXplKCkgPiAwKSB7CkBAIC01NSw0OCArNDQsODcgQEAKICAgICB9CiB9CiAKK2F1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRDb25maWcoKSBjb25zdAoreworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0geyAuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlLCAuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgLmZvcm1hdCA9IG1Gb3JtYXQgfTsKKyAgICByZXR1cm4gY29uZmlnOworfQorCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewogICAgIHJldHVybiBtUG9ydC5nZXQoKSAhPSBudWxscHRyID8gbVBvcnQtPmdldE1vZHVsZUhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogfQogCithdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBhdGNoSGFuZGxlOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsKK30KKwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAotewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKLX0KLQogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKIHsKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBoYXNTYW1lSHdNb2R1bGVBcyhvdXRwdXREZXNjKTsKLSAgICB9CisgICAgcmV0dXJuIGhhc1NhbWVId01vZHVsZUFzKG91dHB1dERlc2MpOwogfQogCi12b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFN0b3BUaW1lKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgbnNlY3NfdCBzeXNUaW1lKQogewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCi0gICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgIG1Wb2x1bWVBY3Rpdml0aWVzW2NsaWVudC0+dm9sdW1lU291cmNlKCldLnNldFN0b3BUaW1lKHN5c1RpbWUpOworICAgIG1Sb3V0aW5nQWN0aXZpdGllc1tjbGllbnQtPnN0cmF0ZWd5KCldLnNldFN0b3BUaW1lKHN5c1RpbWUpOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpCit7CisgICAgYXV0byBjbGllbnRJdGVyID0gc3RkOjpmaW5kKGJlZ2luKG1BY3RpdmVDbGllbnRzKSwgZW5kKG1BY3RpdmVDbGllbnRzKSwgY2xpZW50KTsKKyAgICBpZiAoYWN0aXZlID09IChjbGllbnRJdGVyICE9IGVuZChtQWN0aXZlQ2xpZW50cykpKSB7CisgICAgICAgIEFMT0dXKCIlcyglcyk6IGlnbm9yZWQgYWN0aXZlOiAlZCwgY3VycmVudCBzdHJlYW0gY291bnQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgYWN0aXZlLAorICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQoY2xpZW50LT5zdHJhdGVneSgpKS5nZXRBY3Rpdml0eUNvdW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzLmVyYXNlKGNsaWVudEl0ZXIpOworICAgIH0KKyAgICBjb25zdCBpbnQgZGVsdGEgPSBhY3RpdmUgPyAxIDogLTE7CisgICAgLy8gSWYgcHMgaXMgdW5rbm93biwgaXQgaXMgdGltZSB0byB0cmFjayBpdCEKKyAgICBtUm91dGluZ0FjdGl2aXRpZXNbY2xpZW50LT5zdHJhdGVneSgpXS5jaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKyAgICBtVm9sdW1lQWN0aXZpdGllc1tjbGllbnQtPnZvbHVtZVNvdXJjZSgpXS5jaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpbnZhbGlkIGRlYWN0aXZhdGlvbiB3aXRoIGdsb2JhbFJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKKworICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSB8fCAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICBtR2xvYmFsQWN0aXZlQ291bnQgPiAwID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZzLCB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIHJldHVybiAodnMgPT0gVk9MVU1FX1NPVVJDRV9OT05FKSA/CisgICAgICAgICAgICAgICAgaXNBY3RpdmUoaW5QYXN0TXMpIDogKG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpIDogZmFsc2UpOwogfQogCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CkBAIC0xMDUsMzcgKzEzMywxNyBAQAogICAgIGlmIChpblBhc3RNcyAhPSAwKSB7CiAgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuZmlyc3QgPT0gc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1BBVENIKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChpblBhc3RNcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN5c1RpbWUgPT0gMCkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNTAsOSArMTU4LDkgQEAKICAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKICAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAogICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtQ3VyVm9sdW1lW3N0cmVhbV0gfHwgZm9yY2UpIHsKKyAgICBpZiAodm9sdW1lICE9IGdldEN1clZvbHVtZShzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHN0cmVhbSkpIHx8IGZvcmNlKSB7CiAgICAgICAgIEFMT0dWKCJzZXRWb2x1bWUoKSBmb3Igc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwotICAgICAgICBtQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CisgICAgICAgIHNldEN1clZvbHVtZShzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHN0cmVhbSksIHZvbHVtZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODQsMzIgKzE5Miw1NSBAQAogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCitUcmFja0NsaWVudFZlY3RvciBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fAorICAgICAgICAgICAgICAgIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmICFjbGllbnQtPmlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnZvbHVtZVNvdXJjZVRvSWdub3JlXShjb25zdCBhdXRvICZjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjMsNDMgKzI1NCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1PdXRwdXQxLT5kZXZpY2VzKCk7CisgICAgICAgIGRldmljZXMubWVyZ2UobU91dHB1dDItPmRldmljZXMoKSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICByZXR1cm4gbURldmljZXM7CiB9CiAKIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwpAQCAtMjcxLDEyICsyOTMsMzkgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIHN1cHBvcnRlZERldmljZXMubWVyZ2UobU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzLmZpbHRlcihkZXZpY2VzKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dDItPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOworICAgICAgIHJldHVybiBtUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpOwogICAgIH0KIH0KIApAQCAtMjg5LDQxICszMzgsMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOworICAgICAgICBtT3V0cHV0Mi0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKICAgICB9Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLQotICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50Ci0gICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOwotICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKLSAgICB9Ci0gICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA+IDApICYmIChtR2xvYmFsUmVmQ291bnQgPT0gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC0zNzAsMjggKzM5NCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0KLSAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcwotICAgICAgICAvLyBlbmFibGVkCi0gICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZSwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBjaGFuZ2VkOworICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzIGVuYWJsZWQKKyAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbChnZXRDdXJWb2x1bWUoc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihzdHJlYW0pKSk7CisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KQogeworICAgIG1EZXZpY2VzID0gZGV2aWNlczsKKyAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzID0gZGV2aWNlcy5nZXRGaXJzdFZhbGlkQWRkcmVzcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZpY2VzLnR5cGVzKCk7CisKICAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnOwogICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgewogICAgICAgICBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwpAQCAtNDAyLDcgKzQyNiw2IEBACiAgICAgICAgIGxDb25maWcgPSAqY29uZmlnOwogICAgIH0KIAotICAgIG1EZXZpY2UgPSBkZXZpY2U7CiAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IG9uZQogICAgIGlmICgobVByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAmJgpAQCAtNDIwLDE5ICs0NDMsMTkgQEAKIAogICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobUZsYWdzIHwgZmxhZ3MpOwogCi0gICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCBhZGRyZXNzICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCisgICAgICAgICAgbURldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2VzLnR5cGVzKCkgIT0gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5PdXRwdXQgcmV0dXJuZWQgZGV2aWNlICUwOHggd2hlbiBnaXZlbiBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2VzLnR5cGVzKCksIGRldmljZSk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKQEAgLTQ5MSw2ICs1MTQsMTcgQEAKIHZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKICAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGFjdGl2ZSBjbGllbnRzIGlmIGFueSAoY2FuIGhhcHBlbiBpZiBjbG9zZSgpIGlzIGNhbGxlZCB0byBmb3JjZQorICAgICAgICAvLyBjbGllbnRzIHRvIHJlY29ubmVjdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNsaWVudCB3aXRoIHBvcnQgSUQgJWQgc3RpbGwgYWN0aXZlIG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1JZCk7CisgICAgICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgICAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOwogICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1Jb0hhbmRsZSwgcGFyYW0udG9TdHJpbmcoKSk7CkBAIC00OTksMTEgKzUzMyw2IEBACiAKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKLSAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSkKLSAgICAgICAgLy8gYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc3RyZWFtcyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0gICAgICAgIH0KICAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudC0tOwogICAgICAgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CkBAIC01MzQsNDUgKzU2MywzMSBAQAogfQogCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKK0h3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5tRGV2aWNlLCBjbGllbnRJbnRlcmZhY2UpLAorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+c3JjRGV2aWNlKCksIGNsaWVudEludGVyZmFjZSksCiAgICAgICBtU291cmNlKHNvdXJjZSkKIHsKIH0KIAotc3RhdHVzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU291cmNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1Tb3VyY2UtPmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19kZXZpY2VzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQotewotICAgIHJldHVybiBtRGV2aWNlOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJTb3VyY2U6XG4iKTsKKyAgICBtU291cmNlLT5kdW1wKGRzdCwgMCwgMCk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnQocG9ydCk7CiB9CiAKIApAQCAtNTkxLDM5ICs2MDYsMzggQEAKIH0KIAogLy8gU3dBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmVMb2NhbGx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpCi0gICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKQorICAgICAgICAgICAgICAgICYmICgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSA9PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQogICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKQEAgLTYzNCwxMSArNjQ4LDI4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG90aGVyRGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5zaGFyZXNId01vZHVsZVdpdGgob3RoZXJEZXNjKSAmJgorICAgICAgICAgICAgICAgIG90aGVyRGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcywgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAgJiYKKyAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MCwxMiArNjgxLDExIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7Ci0gICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPmdldE1vZHVsZSgpICE9IE5VTEwpKSB7CisgICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRQcm9maWxlIDogcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02OTAsODkgKzcyMCw1OSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi0KLXN0YXR1c190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlLCBpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi5jZDFjMmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI5IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICZjZmcgPSBjZmdzW2ldOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICBbJXMgJWRdICIsIHNwYWNlcywgIiIsIHByZWZpeCwgaSArIDEpOworICAgICAgICBpZiAoY2ZnLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgICAgICAgICAgZGV2aWNlVG9TdHJpbmcobVBhdGNoLnNvdXJjZXNbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7CisgICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkRldmljZSBJRCAlZCAlcyIsIGNmZy5pZCwgZGV2aWNlLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtMTYxLDE2ICsxMzcsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAwODkzMGYxLi4yYzQ2OTVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC00Miw3ICs0Miw3IEBACiAgICAgbU91dHB1dC5jbGVhcigpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoQXVkaW9NaXggJm1peCkKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OnNldE1peChjb25zdCBBdWRpb01peCAmbWl4KQogewogICAgIG1NaXggPSBtaXg7CiB9CkBAIC01Miw2NCArNTIsNTUgQEAKICAgICByZXR1cm4gJm1NaXg7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIHN0ZDo6c3RyaW5nIG1peFR5cGVMaXRlcmFsOwogICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peC5tTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7CiAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXgubU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIHJvdXRlRmxhZ0xpdGVyYWw7CiAgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1NaXgubVJvdXRlRmxhZ3MsIHJvdXRlRmxhZ0xpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgRmxhZ3M6ICVzXG4iLCBzcGFjZXMsICIiLCByb3V0ZUZsYWdMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGRldmljZVRvU3RyaW5nKG1NaXgubURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpbnQgaW5kZXhDcml0ZXJpb24gPSAwOwogICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbU1peC5tQ3JpdGVyaWEpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgaWYgKG1NaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOwogICAgICAgICAgICAgaWYgKCFTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UsIHNvdXJjZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgcnVsZUxpdGVyYWw7CiAgICAgICAgIGlmICghUnVsZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tUnVsZSwgcnVsZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXyxjcml0ZXJpb24ubVJ1bGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpyZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBBdWRpb01peCBtaXgsCkBAIC0xNjUsMTM3ICsxNTYsMjAzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldE91dHB1dEZvckF0dHIoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkLCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcykKIHsKICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHF1ZXJ5aW5nICV6dSBtaXhlczoiLCBzaXplKCkpOwotICAgIGRlc2MgPSAwOworICAgIHByaW1hcnlEZXNjID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcG9saWN5RGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgIGlmICghcG9saWN5RGVzYykgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBTa2lwaW5nICV6dTogTWl4IGhhcyBubyBvdXRwdXQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIEF1ZGlvTWl4ICptaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOworICAgICAgICBjb25zdCBib29sIHByaW1hcnlPdXRwdXRNaXggPSAhaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgtPm1Sb3V0ZUZsYWdzKTsKIAotICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKLSAgICAgICAgICAgIC8vICAgICAgYXMgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgdHJlYXRtZW50IG9mIHVzYWdlLSBvciB1aWQtYmFzZWQgcnVsZXMKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4ICYmIHByaW1hcnlEZXNjICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2tpcGluZyAlenU6IFByaW1hcnkgb3V0cHV0IGFscmVhZHkgZm91bmQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gUHJpbWFyeSBvdXRwdXQgYWxyZWFkeSBmb3VuZAorICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBoYXNVaWRFeGNsdWRlUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1peE1hdGNoKG1peCwgaSwgYXR0cmlidXRlcywgdWlkKSkgeworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg6IHJldHVybiBCQURfVkFMVUU7IC8vIFRPRE86IERvIHdlIHJlYWxseSB3YW50IHRvIGFib3J0PworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g6CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBkb2VzIG5vdCBtYXRjaCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGUgbWl4CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpNQVRDSDo7CisgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBoYXNBZGRyTWF0Y2ggPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgVUlEIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgVUlEcwotICAgICAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpZEV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSBjaGVja3M6IGZvciBlYWNoICJkaW1lbnNpb24iIG9mIHJ1bGVzICh1c2FnZSwgdWlkLi4uKSwgd2UgY2FuCi0gICAgICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgotICAgICAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNVaWRNYXRjaFJ1bGVzICYmIGhhc1VpZEV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpdGVyYXRpbmcgb24gY3JpdGVyaWEgYmVjYXVzZSBhbiBleGNsdXNpb24gd2FzIGZvdW5kICh3aWxsIGZhaWwpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgZXhpdGluZyBvbiBzdWNjZXNzIChvciBpbXBsaWNpdCBmYWlsdXJlIGFzIGRlc2MgaXMgMCkKLSAgICAgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKLSAgICAgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmICF1c2FnZU1hdGNoRm91bmQpICB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGdldE91dHB1dEZvckF0dHIgd2lsbCB1c2UgbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICBwb2xpY3lEZXNjLT5tUG9saWN5TWl4ID0gbWl4OworICAgICAgICBpZiAocHJpbWFyeU91dHB1dE1peCkgeworICAgICAgICAgICAgcHJpbWFyeURlc2MgPSBwb2xpY3lEZXNjOworICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBzZXQgcHJpbWFyeSBkZXNjIiwgX19mdW5jX18sIGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBvbGljeURlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWl4ICV6dSBpZ25vcmVkIGFzIHNlY29uZGFyeU91dHB1dCBiZWNhdXNlIG5vdCBvcGVuZWQgeWV0IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEFkZCBhIHNlY29uZGFyeSBkZXNjICV6dSIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy0+cHVzaF9iYWNrKHBvbGljeURlc2MpOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAocHJpbWFyeURlc2MgPT0gbnVsbHB0ciAmJiBzZWNvbmRhcnlEZXNjcy0+ZW1wdHkoKSkgPyBCQURfVkFMVUUgOiBOT19FUlJPUjsKK30KIAotICAgICAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCitBdWRpb1BvbGljeU1peENvbGxlY3Rpb246Ok1peE1hdGNoU3RhdHVzIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6bWl4TWF0Y2goCisgICAgICAgIGNvbnN0IEF1ZGlvTWl4KiBtaXgsIHNpemVfdCBtaXhJbmRleCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQpIHsKKworICAgIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgLy8gTG9vcGJhY2sgcmVuZGVyIG1peGVzIGFyZSBjcmVhdGVkIGZyb20gYSBwdWJsaWMgQVBJIGFuZCB0aHVzIHJlc3RyaWN0ZWQKKyAgICAgICAgLy8gdG8gbm9uIHNlbnNpYmxlIGF1ZGlvIHRoYXQgaGF2ZSBub3Qgb3B0ZWQgb3V0LgorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19OT19DQVBUVVJFKSA9PSBBVURJT19GTEFHX05PX0NBUFRVUkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9VTktOT1dOIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX01FRElBIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX0dBTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKKyAgICAgICAgLy8gICAgICBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSB0cmVhdG1lbnQgb2YgdXNhZ2UtIG9yIHVpZC1iYXNlZCBydWxlcworICAgICAgICBib29sIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VNYXRjaEZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIHVpZE1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzQWRkck1hdGNoID0gZmFsc2U7CisKKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCIgZ2V0T3V0cHV0Rm9yQXR0cjogbWl4ICV6dTogaW5zcGVjdGluZyBtaXggY3JpdGVyaWEgJXp1IG9mICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1peEluZGV4LCBqLCBtaXgtPm1Dcml0ZXJpYS5zaXplKCkpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgIGhhc0FkZHJNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgdXNhZ2VzCisgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7CisgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyB1c2FnZSBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRNYXRjaFJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCisgICAgICAgICAgICAgICAgICAgIHVpZE1hdGNoRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX1VJRDoKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KKyAgICAgICAgICAgIC8vIG9ubHkgaGF2ZSBNQVRDSCBydWxlcywgb3IgRVhDTFVERSBydWxlcyBpbiBlYWNoIGRpbWVuc2lvbiwgbm90IGEgY29tYmluYXRpb24KKyAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9VSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKQorICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKKyAgICAgICAgICAgIH0KKworICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQorCisgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQorICAgICAgICBpZiAoaGFzQWRkck1hdGNoIHx8CisgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgeworICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpNQVRDSDsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gbWl4OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgfSBlbHNlIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZUFuZE1peEZvck91dHB1dCgKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQsCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAodmFsdWVBdChpKS0+Z2V0T3V0cHV0KCkgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgKnBvbGljeU1peCA9IG1peDsKKyAgICAgICAgICAgIC8vIFRoaXMgRGVzYyBpcyBpbnZvbHZlZCBpbiBhIE1peCwgd2hpY2ggaGFzIHRoZSBoaWdoZXN0IHByaW8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gbWl4LT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRldmljZSAoMHgleCwgYWRkcj0lcykgZm9yY2VkIGJ5IG1peCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVR5cGUsIGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgYWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbERldmljZXMsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgQXVkaW9NaXggKm1peCA9IHZhbHVlQXQoaSktPmdldE1peCgpOwotCiAgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1JFQ09SREVSUykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTMwNCwxNyArMzYxLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlID09IGlucHV0U291cmNlKSB8fAogICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgIT0gaW5wdXRTb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsRGV2aWNlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgUG9saWN5TWl4IG9ubHkgZm9yIHJlbW90ZSBzdWJtaXggZm9yIGlucHV0CisgICAgICAgICAgICAgICAgLy8gc28gbWl4LT5tRGV2aWNlVHlwZSBjYW4gb25seSBiZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgYXV0byBtaXhEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxEZXZpY2VzLmdldERldmljZShkZXZpY2UsIG1peC0+bURldmljZUFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpZiAobWl4RGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqcG9saWN5TWl4ID0gbWl4OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1peERldmljZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIHJldHVybiBudWxscHRyOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpCkBAIC0zMjgsNyArMzkwLDcgQEAKICAgICBBTE9HVigiZ2V0SW5wdXRNaXhGb3JBdHRyIGxvb2tpbmcgZm9yIGFkZHJlc3MgJXNcbiAgbWl4ZXMgYXZhaWxhYmxlOiIsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisgICAgICAgICAgICBjb25zdCBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKICAgICAgICAgICAgIEFMT0dWKCJcdG1peCAlenUgYWRkcmVzcz0lcyIsIGksIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwogICAgIH0KICNlbmRpZgpAQCAtMzQ5LDE0ICs0MTEsOTUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgc3RkOjpzdHJpbmcgbG9nKCJcbkF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKLSAgICB3cml0ZShmZCwgbG9nLmNfc3RyKCksIGxvZy5zaXplKCkpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHJ1bGVzIGZvciB0aGlzIHVpZAorICAgIHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKworICAgIC8vIGZvciBlYWNoIHBsYXllciBtaXg6IGFkZCBhIHJ1bGUgdG8gbWF0Y2ggb3IgZXhjbHVkZSB0aGUgdWlkIGJhc2VkIG9uIHRoZSBkZXZpY2UKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIDIsIGkpOworICAgICAgICBjb25zdCBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgbWl4IGdvZXMgdG8gYSBkZXZpY2UgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcworICAgICAgICBib29sIGRldmljZU1hdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGV2aWNlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgaWYgKGRldmljZXNbal0ubVR5cGUgPT0gbWl4LT5tRGV2aWNlVHlwZQorICAgICAgICAgICAgICAgICAgICAmJiBkZXZpY2VzW2pdLm1BZGRyZXNzID09IG1peC0+bURldmljZUFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZU1hdGNoKSB7CisgICAgICAgICAgICBtaXgtPnNldE1hdGNoVWlkKHVpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIG1peCBkb2Vzbid0IGdvIHRvIG9uZSBvZiB0aGUgbGlzdGVkIGRldmljZXMgZm9yIHRoZSBnaXZlbiB1aWQsCisgICAgICAgICAgICAvLyBtb2RpZnkgaXRzIHJ1bGVzIHRvIGV4Y2x1ZGUgdGhlIHVpZAorICAgICAgICAgICAgbWl4LT5zZXRFeGNsdWRlVWlkKHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiByZW1vdmUgZXhpc3RpbmcgcnVsZXMgdGhhdCBtYXRjaCBvciBleGNsdWRlIHRoaXMgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIGZvdW5kVWlkUnVsZSA9IGZhbHNlOworICAgICAgICBjb25zdCBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gY3JpdGVyaWFUb1JlbW92ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlOworICAgICAgICAgICAgLy8gaXMgdGhpcyBydWxlIGFmZmVjdGluZyB0aGUgdWlkPworICAgICAgICAgICAgaWYgKChydWxlID09IFJVTEVfRVhDTFVERV9VSUQgfHwgcnVsZSA9PSBSVUxFX01BVENIX1VJRCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgZm91bmRVaWRSdWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjcml0ZXJpYVRvUmVtb3ZlLmluc2VydChjcml0ZXJpYVRvUmVtb3ZlLmJlZ2luKCksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZFVpZFJ1bGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY3JpdGVyaWFUb1JlbW92ZS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhLnJlbW92ZUF0KGNyaXRlcmlhVG9SZW1vdmVbal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwKKyAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdCB7CisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogZmluZCBydWxlcyB0aGF0IGRvbid0IGV4Y2x1ZGUgdGhpcyB1aWQsIGFuZCBhZGQgdGhlIGRldmljZSB0byB0aGUgbGlzdAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYm9vbCBydWxlQWxsb3dzVWlkID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgQXVkaW9NaXggKm1peCA9IHZhbHVlQXQoaSktPmdldE1peCgpOworICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBydWxlID0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGU7CisgICAgICAgICAgICBpZiAocnVsZSA9PSBSVUxFX0VYQ0xVREVfVUlECisgICAgICAgICAgICAgICAgICAgICYmIHVpZCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCkgeworICAgICAgICAgICAgICAgIHJ1bGVBbGxvd3NVaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocnVsZUFsbG93c1VpZCkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoQXVkaW9EZXZpY2VUeXBlQWRkcihtaXgtPm1EZXZpY2VUeXBlLCBtaXgtPm1EZXZpY2VBZGRyZXNzKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgIH0KK30KKwogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKaW5kZXggZDg1NTYyZS4uOWZjZjVlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCkBAIC0zMSw5ICszMSwxNSBAQAogLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgogdm9pZCBBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKIHsKKyAgICBBTE9HVigiJXM6IGF0dGFjaGluZyBtb2R1bGUgJXMgdG8gcG9ydCAlcyIsIF9fRlVOQ1RJT05fXywgZ2V0TW9kdWxlTmFtZSgpLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgbU1vZHVsZSA9IG1vZHVsZTsKIH0KIAordm9pZCBBdWRpb1BvcnQ6OmRldGFjaCgpCit7CisgICAgbU1vZHVsZSA9IG51bGxwdHI7Cit9CisKIC8vIE5vdGUgdGhhdCBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpCiB7CkBAIC0zNTQsMjYgKzM2MCwxOCBAQAogICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKIH0KIAotdm9pZCBBdWRpb1BvcnQ6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIEF1ZGlvUG9ydDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIGlmICghbU5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgbVByb2ZpbGVzLmR1bXAoZmQsIHNwYWNlcyk7CisgICAgICAgIG1Qcm9maWxlcy5kdW1wKGRzdCwgc3BhY2VzKTsKIAogICAgICAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBidWZmZXI7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1HYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zODYsMjIgKzM4NCwxMiBAQAogCiAvLyAtLS0gQXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCiAKLUF1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKLXsKLSAgICBtU2FtcGxpbmdSYXRlID0gMDsKLSAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIG1lbXNldCgmbUdhaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcpKTsKLSAgICBtR2Fpbi5pbmRleCA9IC0xOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnID0geyAuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrIH07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKIAogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CkBAIC00MjUsNiArNDEzLDkgQEAKICAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKICAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CiAgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgbUZsYWdzID0gY29uZmlnLT5mbGFnczsKKyAgICB9CiAKIGV4aXQ6CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtNDM2LDMzICs0MjcsMzggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB1cGRhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgVCYgcG9ydENvbmZpZ0ZpZWxkLCBUIGF1ZGlvX3BvcnRfY29uZmlnOjoqcG9ydF9jb25maWdfZmllbGQsCisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLCBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZywKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbmZpZ01hc2ssIFQgZGVmYXVsdFZhbHVlKQoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykgeworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBudWxscHRyKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIGNvbmZpZ01hc2spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHNyY0NvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBwb3J0Q29uZmlnRmllbGQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IGRlZmF1bHRWYWx1ZTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlCisKIHZvaWQgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IHNyY0NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gMDsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBzcmNDb25maWctPmNoYW5uZWxfbWFzazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewotICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBzcmNDb25maWctPmZvcm1hdDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgfQorICAgIHVwZGF0ZUZpZWxkKG1TYW1wbGluZ1JhdGUsICZhdWRpb19wb3J0X2NvbmZpZzo6c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUsIDB1KTsKKyAgICB1cGRhdGVGaWVsZChtQ2hhbm5lbE1hc2ssICZhdWRpb19wb3J0X2NvbmZpZzo6Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClBVURJT19DSEFOTkVMX05PTkUpOworICAgIHVwZGF0ZUZpZWxkKG1Gb3JtYXQsICZhdWRpb19wb3J0X2NvbmZpZzo6Zm9ybWF0LAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKICAgICBpZiAoKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSAmJiBhdWRpb3BvcnQgIT0gTlVMTCkgewogICAgICAgICBkc3RDb25maWctPmdhaW4gPSBtR2FpbjsKQEAgLTQ3OCw2ICs0NzQsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CiAgICAgfQorCisgICAgdXBkYXRlRmllbGQobUZsYWdzLCAmYXVkaW9fcG9ydF9jb25maWc6OmZsYWdzLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTLCB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKaW5kZXggZmQ2ZmMxYy4uYTY0NWUwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCkBAIC0xNCwyMCArMTQsMTEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc0luTWFzaygpIGNvbnN0Cit7CisgICAgQ2hhbm5lbHNWZWN0b3IgaW5NYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgaW5NYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5NYXNrVmVjdG9yOworfQorCitDaGFubmVsc1ZlY3RvciBDaGFubmVsc1ZlY3Rvcjo6YXNPdXRNYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBvdXRNYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgb3V0TWFza1ZlY3Rvci5hZGQoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dE1hc2tWZWN0b3I7Cit9CisKK2Jvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCit7CisgICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCisgICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKK30KKworc3RhdGljIEF1ZGlvUHJvZmlsZSogY3JlYXRlRnVsbER5bmFtaWNJbXBsKCkKK3sKKyAgICBBdWRpb1Byb2ZpbGUqIGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKKyAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7CisgICAgcmV0dXJuIGR5bmFtaWNQcm9maWxlOworfQorCisvLyBzdGF0aWMKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpCit7CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgorICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KQoreworICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7CisgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCisgICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIHt9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKK3sKKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpjbGVhcigpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0V4YWN0KHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewpAQCAtMzksMjcgKzEzMSw2IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yID09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCi17Ci0gICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvcihzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCi17Ci0gICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCi0gICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0CiB7CkBAIC0xODIsNDcgKzI1Myw3OSBAQAogICAgIHJldHVybiBiZXN0TWF0Y2ggPiAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CiB9CiAKLXZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPyAiW2R5bmFtaWMgY2hhbm5lbHNdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID8gIltkeW5hbWljIHJhdGVzXSIgOiAiIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsOwogICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKG1Gb3JtYXQsIGZvcm1hdExpdGVyYWwpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KICAgICBpZiAoIW1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIAogICAgIGlmICghbUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOworICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKKyAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKKyAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7CisgICAgLy8gfQorICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOworICAgIHJldHVybiBpbmRleDsKK30KKworc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKK3sKKyAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgICAgICBmb3JtYXRzLmFkZChwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRDaGFubmVsc0Zvcihwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcm9maWxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSAmJiBwcm9maWxlID09IHByb2ZpbGVUb0FkZCkgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAorICAgIHJldHVybiBhZGQocHJvZmlsZVRvQWRkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCkBAIC0yODEsNiArMzg0LDIyOCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjbGVhclByb2ZpbGVzKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoLS1pKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0KGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMgYW5kIHRoZSBjb250ZW50cyBvZiAnb3JkZXInLgorLy8gVGhlIHJlc3VsdCBpcyBvcmRlcmVkIGFjY29yZGluZyB0byAnb3JkZXInLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3JkZXI+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIGNvbnN0IE9yZGVyJiBvcmRlcikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCl9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gY29tbW9uOworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoY29tbW9uLCBjb21tb24uYmVnaW4oKSkpOworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBvcmRlcikgeworICAgICAgICBpZiAoY29tbW9uLmZpbmQoZSkgIT0gY29tbW9uLmVuZCgpKSByZXN1bHQucHVzaF9iYWNrKGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBJbnRlcnNlY3QgdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMsIHJldHVybiBjb21tb24gZWxlbWVudHMgYWNjb3JkaW5nIHRvICdjb21wJyBvcmRlcmluZy4KKy8vICdjb21wJyBpcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb21wYXJlPgorc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gaW50ZXJzZWN0QW5kT3JkZXIoCisgICAgICAgIGNvbnN0IFQmIGlucHV0MSwgY29uc3QgVCYgaW5wdXQyLCBDb21wYXJlIGNvbXApCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgQ29tcGFyZT4gc2V0MXtpbnB1dDEuYmVnaW4oKSwgaW5wdXQxLmVuZCgpLCBjb21wfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQye2lucHV0Mi5iZWdpbigpLCBpbnB1dDIuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oc2V0MS5iZWdpbigpLCBzZXQxLmVuZCgpLCBzZXQyLmJlZ2luKCksIHNldDIuZW5kKCksCisgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgY29tcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHByZWZlcnJlZE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2UgKmJlc3RPdXRwdXRDb25maWcpIGNvbnN0Cit7CisgICAgYXV0byBmb3JtYXRzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoZ2V0U3VwcG9ydGVkRm9ybWF0cygpLAorICAgICAgICAgICAgb3V0cHV0UHJvZmlsZXMuZ2V0U3VwcG9ydGVkRm9ybWF0cygpLCBwcmVmZXJyZWRGb3JtYXRzKTsKKyAgICAvLyBQaWNrIHRoZSBiZXN0IGNvbXBhdGlibGUgcHJvZmlsZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBmb3JtYXRzKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gaW5wdXRQcm9maWxlID0gZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gb3V0cHV0UHJvZmlsZSA9IG91dHB1dFByb2ZpbGVzLmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGYpOworICAgICAgICBpZiAoaW5wdXRQcm9maWxlID09IG51bGxwdHIgfHwgb3V0cHV0UHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNoYW5uZWxzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRDaGFubmVscygpLmFzT3V0TWFzaygpLAorICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCksIHByZWZlcnJlZE91dHB1dENoYW5uZWxzKTsKKyAgICAgICAgaWYgKGNoYW5uZWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gc2FtcGxlUmF0ZXMgPSBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzID8KKyAgICAgICAgICAgICAgICBpbnRlcnNlY3RBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksIG91dHB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8dHlwZW5hbWUgU2FtcGxlUmF0ZVZlY3Rvcjo6dmFsdWVfdHlwZT4oKSkgOgorICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKTsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCIlcygpIGZvdW5kIGNoYW5uZWwgbWFzayAlI3ggYW5kIHNhbXBsZSByYXRlICVkIGZvciBmb3JtYXQgJSN4LiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sICpjaGFubmVscy5iZWdpbigpLCAqc2FtcGxlUmF0ZXMuYmVnaW4oKSwgZik7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmZvcm1hdCA9IGY7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPnNhbXBsZV9yYXRlID0gKnNhbXBsZVJhdGVzLmJlZ2luKCk7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmNoYW5uZWxfbWFzayA9ICpjaGFubmVscy5iZWdpbigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkgJiYgaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0Zvcm1hdFZlY3RvciBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdAoreworICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKK3sKKyAgICAvLyBPbmx5IGFsbG93IHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9mIGR5bmFtaWMgcHJvZmlsZQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKKyAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKKyAgICAgICAgYWRkKHByb2ZpbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyA4KTsKKyAgICB9Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldFNhbXBsZVJhdGVzRm9yKAorICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCiBpbnQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA3OWFkMWY3Li43OWYwOTE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMjQsMjkgKzI0LDMyIEBACiBuYW1lc3BhY2UgYW5kcm9pZAogewogCi12b2lkIEF1ZGlvUm91dGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CiAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Citib29sIEF1ZGlvUm91dGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3QKK3sKKyAgICBpZiAobVNpbmsgPT0gMCB8fCBkc3RQb3J0ID09IDAgfHwgZHN0UG9ydCAhPSBtU2luaykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCIlczogc2lua3MgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc291cmNlUG9ydCA6IG1Tb3VyY2VzKSB7CisgICAgICAgIGlmIChzb3VyY2VQb3J0ID09IHNyY1BvcnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogc291cmNlcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgc291cmNlUG9ydC0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGE0NmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU2Vzc2lvbiIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1Nlc3Npb246OkF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkgOgotICAgIG1SZWNvcmRDbGllbnRJbmZvKHsgLnVpZCA9IHVpZCwgLnNlc3Npb24gPSBzZXNzaW9uLCAuc291cmNlID0gaW5wdXRTb3VyY2V9KSwKLSAgICBtQ29uZmlnKHsgLmZvcm1hdCA9IGZvcm1hdCwgLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZSwgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrfSksCi0gICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKLSAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAotICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKLXsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VPcGVuQ291bnQoaW50IGRlbHRhKQotewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1PcGVuQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgb3BlbiBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1PcGVuQ291bnQpOwotICAgICAgICBtT3BlbkNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtT3BlbkNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBtT3BlbkNvdW50KTsKLSAgICByZXR1cm4gbU9wZW5Db3VudDsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudChpbnQgZGVsdGEpCi17Ci0gICAgY29uc3QgdWludDMyX3Qgb2xkQWN0aXZlQ291bnQgPSBtQWN0aXZlQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUFjdGl2ZUNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGludmFsaWQgZGVsdGEgJWQsIGFjdGl2ZSBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1BY3RpdmVDb3VudCk7Ci0gICAgICAgIG1BY3RpdmVDb3VudCA9ICh1aW50MzJfdCkoLWRlbHRhKTsKLSAgICB9Ci0gICAgbUFjdGl2ZUNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBhY3RpdmUgY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1BY3RpdmVDb3VudCk7Ci0gICAgaW50IGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FOwotCi0gICAgaWYgKChvbGRBY3RpdmVDb3VudCA9PSAwKSAmJiAobUFjdGl2ZUNvdW50ID4gMCkpIHsKLSAgICAgICAgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUOwotICAgIH0gZWxzZSBpZiAoKG9sZEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1BY3RpdmVDb3VudCA9PSAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQgIT0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FKSB7Ci0gICAgICAgIC8vIER5bmFtaWMgcG9saWN5IGNhbGxiYWNrOgotICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQpID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGNhbGxiYWNrOgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZtUmVjb3JkQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtQWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uOjptYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdAotewotICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbVJlY29yZENsaWVudEluZm8uc291cmNlICYmCi0gICAgICAgIG90aGVyLT5mb3JtYXQoKSA9PSBtQ29uZmlnLmZvcm1hdCAmJgotICAgICAgICBvdGhlci0+c2FtcGxlUmF0ZSgpID09IG1Db25maWcuc2FtcGxlX3JhdGUgJiYKLSAgICAgICAgb3RoZXItPmNoYW5uZWxNYXNrKCkgPT0gbUNvbmZpZy5jaGFubmVsX21hc2sgJiYKLSAgICAgICAgb3RoZXItPmZsYWdzKCkgPT0gbUZsYWdzICYmCi0gICAgICAgIG90aGVyLT51aWQoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby51aWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246OnNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKQotewotICAgIG1JbmZvUHJvdmlkZXIgPSBwcm92aWRlcjsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246Om9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdAotewotICAgIGlmIChtQWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIHJlc2VuZCB0aGUgY2FsbGJhY2sgYWZ0ZXIgcmVxdWVyeWluZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIGluZm8gcHJvdmlkZXIKLSAgICAgICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBwcm92aWRlciA9IG1JbmZvUHJvdmlkZXI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldENvbmZpZygpIDoKLSAgICAgICAgICAgICAgICBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKLSAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gc2Vzc2lvbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc291cmNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuZm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGU6ICVkXG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2s6ICUwOHhcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUNvbmZpZy5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlzIHNvdW5kdHJpZ2dlcjogJXNcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUlzU291bmRUcmlnZ2VyID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3BlbiBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1PcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFjdGl2ZSBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1BY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjphZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBBTE9HVygiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgYWxyZWFkeSBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0SW5mb1Byb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBhZGQoc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICBBTE9HVigiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgIGNsaWVudCAlZCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OnJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgaW4iLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBBTE9HVigicmVtb3ZlU2Vzc2lvbigpIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKLSAgICB2YWx1ZUF0KGluZGV4KS0+c2V0SW5mb1Byb3ZpZGVyKE5VTEwpOwotICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0T3BlbkNvdW50KCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCBvcGVuQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3BlbkNvdW50ICs9IHZhbHVlQXQoaSktPm9wZW5Db3VudCgpOwotICAgIH0KLSAgICByZXR1cm4gb3BlbkNvdW50OwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3QKLXsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbnMuYWRkKHZhbHVlQXQoaSktPnNlc3Npb24oKSwgdmFsdWVBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZVNlc3Npb25zOwotfQotCi1zaXplX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3QKLXsKLSAgICBzaXplX3QgYWN0aXZlQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVNlc3Npb25Db3VudCgpICE9IDA7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZXF1aXZhbGVudCB0byBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gb25seSBpZiBpdAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY2FwdHVyZSB0cmlnZ2VyZWQgYnkgYSBoYXJkd2FyZSBob3R3b3JkIHJlY29nbml0aW9uCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPiAwICYmCi0gICAgICAgICAgICAgICAgKChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gc291cmNlKSB8fAotICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKLSAgICAgICAgICAgICAgICAgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYKLSAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5pc1NvdW5kVHJpZ2dlcigpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYXVkaW9fc291cmNlX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLSAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gIGF1ZGlvU2Vzc2lvbiA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhY3RpdmVPbmx5ICYmIGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IGN1clByaW9yaXR5OwotICAgICAgICAgICAgc291cmNlID0gYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5vblNlc3Npb25JbmZvVXBkYXRlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBTZXNzaW9uczpcbiIsIHNwYWNlcywgIiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMzZTU3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU291cmNlRGVzY3JpcHRvciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPEh3TW9kdWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPElPUHJvZmlsZS5oPgotI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEF1ZGlvU291cmNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtU3RyZWFtOiAlZFxuIiwgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibURldmljZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtRGV2aWNlLT5kdW1wKGZkLCAyICwgMCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvU291cmNlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIHNvdXJjZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gU291cmNlICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDdhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX0NsaWVudERlc2NyaXB0b3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIHNzIDw8ICJQb3J0SWQ6ICIgPDwgbVBvcnRJZCA8PCAiIFNlc3Npb25JZDogIiA8PCBtU2Vzc2lvbklkIDw8ICIgVWlkOiAiIDw8IG1VaWQ7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0NsaWVudCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFBvcnQgSWQ6ICVkIFNlc3Npb24gSWQ6ICVkIFVJRDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbVBvcnRJZCwgbVNlc3Npb25JZCwgbVVpZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRm9ybWF0OiAlMDh4IFNhbXBsaW5nIHJhdGU6ICVkIENoYW5uZWxzOiAlMDh4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Db25maWcuZm9ybWF0LCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXR0cmlidXRlczogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcmVmZXJyZWQgRGV2aWNlIElkOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtUHJlZmVycmVkRGV2aWNlSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0YXRlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZSA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7Cit9CisKK3ZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgfQorfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncyk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgKyAyIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKK30KKworU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6U291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLAorICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAorICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8pLAorICAgICAgICBtUGF0Y2hEZXNjKHBhdGNoRGVzYyksIG1TcmNEZXZpY2Uoc3JjRGV2aWNlKQoreworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpCit7CisgICAgbVN3T3V0cHV0ID0gc3dPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0SHdPdXRwdXQoY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+JiBod091dHB1dCkKK3sKKyAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERldmljZTpcbiIsIHNwYWNlcywgIiIpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCAyLCAwKTsKK30KKwordm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMDVmNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Q29uZmlnUGFyc2luZ1V0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2s7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LnVzZUlucHV0Q2hhbm5lbE1hc2soKSkgewotICAgICAgICAgICAgICAgIGlmIChJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXVkaW9Qb3J0Lm1HYWlucy5hZGQoZ2Fpbik7Ci19Ci0KLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRBdWRpb1BvcnRHYWluKG5vZGUsIGF1ZGlvUG9ydCwgaW5kZXgrKyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYykKLXsKLSAgICBsb2FkQXVkaW9Qb3J0R2FpbnMocm9vdCwgKmRldmljZURlc2MpOwotICAgIGlmIChkZXZpY2VEZXNjLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBkZXZpY2VEZXNjLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJmRldmljZURlc2MtPm1HYWluKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9UWVBFKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VGcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAotICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChyb290LT5uYW1lKSk7Ci0KLSAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlVmVjdG9yKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKG5vZGUsIGRldmljZURlc2MpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgKGxpdGVyYWwgdHlwZSkgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotCi0gICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIHJvbGUpOwotCi0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7Ci0gICAgU2FtcGxlUmF0ZVZlY3RvciBzYW1wbGVSYXRlczsKLSAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsczsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPFNhbXBsZVJhdGVUcmFpdHM+KG5vZGUtPnZhbHVlLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGRldmljZXMsIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkQXVkaW9Qb3J0R2FpbnMobm9kZSwgKnByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoZm9ybWF0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0NoYW5uZWxzKGNoYW5uZWxzLmlzRW1wdHkoKSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiwgZm9yIGVhY2ggZm9ybWF0LCBjcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBjb2xsZWN0aW9uIG9mIHJhdGUgYW5kIGNoYW5uZWxzLgotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sIGNoYW5uZWxzLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQoZm9ybWF0c1tpXSA9PSBnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljUmF0ZShzYW1wbGVSYXRlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm9maWxlLT5zZXRBdWRpb1Byb2ZpbGVzKGF1ZGlvUHJvZmlsZXMpOwotICAgIEFMT0dXX0lGKCFwcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCksICJsb2FkJXMoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIiwKLSAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiKTsKLSAgICBpZiAocHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkJXMoKSBhZGRpbmcgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAotICAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiLAotICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpLCBwcm9maWxlLT5nZXRGbGFncygpKTsKLSAgICAgICAgcmV0dXJuIG1vZHVsZS0+YWRkUHJvZmlsZShwcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVEZXZpY2Uobm9kZSwgZGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZXMpOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSwgY29uZmlnKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobm9kZS0+bmFtZSk7Ci0gICAgICAgIGlmIChsb2FkSHdNb2R1bGUobm9kZSwgbW9kdWxlLCBjb25maWcpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBod01vZHVsZXMuYWRkKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZWNsYXJlZERldmljZXMpCi17Ci0gICAgY2hhciAqdGFnTGl0ZXJhbCA9IHN0cm5kdXAodGFnLCBzdHJsZW4odGFnKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZ0xpdGVyYWwsIEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlRnJvbVN0cmluZyhkZXZUYWcsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaW5CaXQgPSB0eXBlICYgQVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc2luZ2xlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkJpdCB8ICgxIDw8ICgzMSAtIF9fYnVpbHRpbl9jbHoodHlwZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSAmPSB+c2luZ2xlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2ID0gbmV3IERldmljZURlc2NyaXB0b3Ioc2luZ2xlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB9Ci0gICAgZnJlZSh0YWdMaXRlcmFsKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKLSAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKLSAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgICAgICBjb25maWcuYWRkQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0RGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPnNldEhhbFZlcnNpb24obWFqb3IsIG1pbm9yKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsIG1ham9yLCBtaW5vcik7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIHByaW1hcnlNb2R1bGUpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQ7Ci0gICAgICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KG5vZGUtPnZhbHVlLCBzcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGxvYWRNb2R1bGVHbG9iYWxDb25maWcocm9vdCwgcHJpbWFyeU1vZHVsZSwgY29uZmlnKTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBId01vZHVsZUNvbGxlY3Rpb24gaHdNb2R1bGVzOwotICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLCBjb25maWcpOwotCi0gICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24sIGF0dGFjaGVkIHRvIHByaW1hcnkuCi0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBjb25maWcsIGh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOwotCi0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhod01vZHVsZXMpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggMTljMjA2Mi4uYTMxMjFkMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgpAQCAtMjYsMTQgKzI3LDMwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIERldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBGb3JtYXRWZWN0b3J7fSwgdGFnTmFtZSkKK3sKK30KKworRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cywKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgOgogICAgIEF1ZGlvUG9ydChTdHJpbmc4KCIiKSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpLAotICAgIG1BZGRyZXNzKCIiKSwgbVRhZ05hbWUodGFnTmFtZSksIG1EZXZpY2VUeXBlKHR5cGUpLCBtSWQoMCkKKyAgICBtVGFnTmFtZSh0YWdOYW1lKSwgbURldmljZVR5cGUodHlwZSksIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cykKIHsKKyAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fCB0eXBlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCApIHsKICAgICAgICAgbUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQorICAgIC8qIElmIGZyYW1ld29yayBydW5zIGFnYWluc3QgYSBwcmUgNS4wIEF1ZGlvIEhBTCwgZW5jb2RlZCBmb3JtYXRzIGFyZSBhYnNlbnQgZnJvbSB0aGUgY29uZmlnLgorICAgICAqIEZJWE1FOiBBUE0gc2hvdWxkIGtub3cgdGhlIHZlcnNpb24gb2YgdGhlIEhBTCBhbmQgZG9uJ3QgYWRkIHRoZSBmb3JtYXRzIGZvciBWNS4wLgorICAgICAqIEZvciBub3csIHRoZSB3b3JrYXJvdW5kIHRvIHJlbW92ZSBBQzMgYW5kIElFQzYxOTM3IHN1cHBvcnQgb24gSERNSSBpcyB0byBkZWNsYXJlCisgICAgICogc29tZXRoaW5nIGxpa2UgJ2VuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCInIG9uIHRoZSBIRE1JIGRldmljZVBvcnQuCisgICAgICovCisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JICYmIG1FbmNvZGVkRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOworICAgIH0KIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CkBAIC00NywxNSArNjQsNTcgQEAKICAgICBtSWQgPSBnZXROZXh0VW5pcXVlSWQoKTsKIH0KIAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkZXRhY2goKSB7CisgICAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBBdWRpb1BvcnQ6OmRldGFjaCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjaGVja0VxdWFsKGNvbnN0IFQmIGYxLCBjb25zdCBUJiBmMikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzMShmMS5iZWdpbigpLCBmMS5lbmQoKSk7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczIoZjIuYmVnaW4oKSwgZjIuZW5kKCkpOworICAgIHJldHVybiBzMSA9PSBzMjsKK30KKwogYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAogewogICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKICAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKICAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZ0Zvcm1hdHMgKGlmIGRldmljZSBzdXBwb3J0cyBlbmNvZGluZykKICAgICBpZiAob3RoZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJiAobUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKTsKKworICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJiAobUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKSAmJgorICAgICAgICAgICBjaGVja0VxdWFsKG1FbmNvZGVkRm9ybWF0cywgb3RoZXItPm1FbmNvZGVkRm9ybWF0cyk7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvcjo6aGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKSBjb25zdAoreworICAgIGlmICghZGV2aWNlX2hhc19lbmNvZGluZ19jYXBhYmlsaXR5KHR5cGUoKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAobUN1cnJlbnRFbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKworYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZGb3JtYXQgOiBtRW5jb2RlZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGRldkZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCkBAIC03MCw3ICsxMjksNyBAQAogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+ZXF1YWxzKGl0ZW0pKSB7IC8vIGl0ZW0gbWF5IGJlIG51bGwgc3A8PiwgaS5lLiBBVURJT19ERVZJQ0VfTk9ORQogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjEsNzAgKzE4MCw4NCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIHJlbW92ZShkZXZpY2UpOworICAgIH0KK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKK2F1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZVR5cGVzIHw9IGRldmljZS0+dHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VUeXBlczsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0CiB7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgLy8gSWYgZm9ybWF0IGlzIHNwZWNpZmllZCwgbWF0Y2ggaXQgYW5kIGlnbm9yZSBhZGRyZXNzCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgaWYgYWRkcmVzcyBpcyBzcGVjaWZpZWQgbWF0Y2ggaXQKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhbHdheXMgbWF0Y2gKKyAgICAgICAgICAgIGlmICgoKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5hZGRyZXNzKCkgPT0gYWRkcmVzcykgJiYKKyAgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB8fAorICAgICAgICAgICAgICAgIChpdGVtQXQoaSktPnN1cHBvcnRzRm9ybWF0KGZvcm1hdCkgJiYgZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCi0gICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjolcygpIGZvciB0eXBlICUwOHggYWRkcmVzcyBcIiVzXCIgZm91bmQgJXAgZm9ybWF0ICUwOHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSwgZm9ybWF0KTsKICAgICByZXR1cm4gZGV2aWNlOwogfQogCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICBpZiAoaWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAorRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKIHsKICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKICAgICBib29sIGlzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSk7CiAgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7Ci0gICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPnR5cGUoKSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT50eXBlKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CiAgICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwpAQCAtMjAwLDIwICsyNzMsMTUgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgRGV2aWNlVmVjdG9yOjpkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtMjQ2LDE5ICszMTQsMTggQEAKICAgICAvLyB3aXRob3V0IHRoZSB0ZXN0PwogICAgIC8vIFRoaXMgaGFzIGJlZW4gZGVtb25zdHJhdGVkIHRvIE5PVCBiZSB0cnVlIChhdCBzdGFydCB1cCkKICAgICAvLyBBTE9HX0FTU0VSVChtTW9kdWxlICE9IE5VTEwpOwotICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPQotICAgICAgICAgICAgbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAleCIsIG1JZCwgbURldmljZVR5cGUpOworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKICAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOwogICAgIHBvcnQtPmlkID0gbUlkOwogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKICAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKLSAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPmdldEhhbmRsZSgpOworICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKIH0KIApAQCAtMjcwLDQyICszMzcsNzMgQEAKICAgICBwb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CiB9CiAKLXN0YXR1c190IERldmljZURlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIGlmIChtSWQgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKICAgICB9CiAgICAgaWYgKCFtVGFnTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKICAgICBpZiAoZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7CiAgICAgfQogICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMsIHZlcmJvc2UpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgdmVyYm9zZSk7Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCkgPDwgIixAOiIgPDwgbUFkZHJlc3M7CisgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0geyJ7In07CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CisgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6ZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZERldmljZXM7Cit9CisKK2Jvb2wgRGV2aWNlVmVjdG9yOjpjb250YWluc0F0TGVhc3RPbmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiAhZmlsdGVyKGRldmljZXMpLmlzRW1wdHkoKTsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbHRlcihkZXZpY2VzKS5zaXplKCkgPT0gZGV2aWNlcy5zaXplKCk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9nKCkgY29uc3QKIHsKICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7CiAgICAgZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZSk7Ci0gICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JVg6JXMsIGFkZHI6JXMiLCBtSWQsICBtRGV2aWNlVHlwZSwgZGV2aWNlLmNfc3RyKCksCisgICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JTA4WDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKICAgICAgICAgICBtQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBBdWRpb1BvcnQ6OmxvZygiICAiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKaW5kZXggN2IyMzQxZS4uODlmOTg5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKQEAgLTIyLDI1ICsyMiwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJRDogJWRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0kvTzogJWRcbiIsIHNwYWNlcywgIiIsIG1Jbyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc011c2ljIEVmZmVjdDogJXNcbiIsIHNwYWNlcywgIiIsIGlzTXVzaWNFZmZlY3QoKT8gInllcyIgOiAibm8iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2Vzc2lvbjogJWRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTmFtZTogJXNcbiIsIHNwYWNlcywgIiIsICBtRGVzYy5uYW1lKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwogfQogCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CkBAIC01MywxMCArNDIsMTQgQEAKIAogc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgYm9vbCBpc011c2ljRWZmZWN0KQogeworICAgIGlmIChnZXRFZmZlY3QoaWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGVmZmVjdCAlcyBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPm5hbWUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgewogICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAogICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKQEAgLTY2LDM0ICs1OSwzMyBAQAogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ID4gbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpIHsKICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQgPSBtVG90YWxFZmZlY3RzTWVtb3J5OwogICAgIH0KLSAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKLSAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHNlc3Npb24sIGlkKTsKICAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIGRlc2MtPm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOwotICAgIG1lbWNweSAoJmVmZmVjdERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgIGVmZmVjdERlc2MtPm1JbyA9IGlvOwotICAgIGVmZmVjdERlc2MtPm1TdHJhdGVneSA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKLSAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKLQorICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcihkZXNjLCBpc011c2ljRWZmZWN0LCBpZCwgaW8sIHNlc3Npb24pOwogICAgIGFkZChpZCwgZWZmZWN0RGVzYyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3NwPEVmZmVjdERlc2NyaXB0b3I+IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRFZmZlY3QoaW50IGlkKSBjb25zdAogewogICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVBdChpbmRleCk7Cit9CisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gZ2V0RWZmZWN0KGlkKTsKKyAgICBpZiAoZWZmZWN0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIGVmZmVjdCBJRCAlZCIsIF9fRlVOQ1RJT05fXywgaWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaW5kZXgpOwotCi0gICAgc2V0RWZmZWN0RW5hYmxlZChlZmZlY3REZXNjLCBmYWxzZSk7Ci0KICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CiAgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CkBAIC0xMTksNiArMTExLDE0IEBACiAgICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQodmFsdWVBdChpbmRleCksIGVuYWJsZWQpOwogfQogCitib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdAoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpLT5tRW5hYmxlZDsKK30KIAogc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCkBAIC0xNTAsMTEgKzE1MCwxMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPmlzTXVzaWNFZmZlY3QoKSkgJiYKICAgICAgICAgICAgICAgICAoKGVmZmVjdERlc2MtPm1EZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpID09IDApKSB7CiAgICAgICAgICAgICBBTE9HVigiaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBub24gb2ZmbG9hZGFibGUgZWZmZWN0ICVzIGVuYWJsZWQgb24gc2Vzc2lvbiAlZCIsCiAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBlZmZlY3REZXNjLT5tU2Vzc2lvbik7CkBAIC0xNzQsMjQgKzE3NCwyMiBAQAogICAgIHJldHVybiBNQVhfRUZGRUNUU19NRU1PUlk7CiB9CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiXG5Ub3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCLCBNYXggbWVtb3J5IHVzZWQ6ICVkIEtCXG4iLAotICAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSwgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAiXG4lKnNUb3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgIgorICAgICAgICAgICAgIlRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsCisgICAgICAgICAgICAoZmxvYXQpIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC8gMTAsCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5LAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0VmZmVjdHM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEVmZmVjdCAlZDpcbiIsIHNwYWNlcywgIiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA3YTE3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkdhaW5zIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiR2FpbnMuaCIKLSNpbmNsdWRlIDxWb2x1bWUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEVuZ2luZWRlZmF1bHQKLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU2LjBmfSwgezIwLCAtMzQuMGZ9LCB7NjAsIC0xMS4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzUuN2Z9LCB7MzMsIC0yNi4xZn0sIHs2NiwgLTEzLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLS8vIEFVRElPX1NUUkVBTV9TWVNURU0sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIGFuZCBBVURJT19TVFJFQU1fRFRNRiB2b2x1bWUgdHJhY2tzCi0vLyBBVURJT19TVFJFQU1fUklORyBvbiBwaG9uZXMgYW5kIEFVRElPX1NUUkVBTV9NVVNJQyBvbiB0YWJsZXRzLgotLy8gQVVESU9fU1RSRUFNX0RUTUYgdHJhY2tzIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHdoaWxlIGluIGNhbGwgKFNlZSBBdWRpb1NlcnZpY2UuamF2YSkuCi0vLyBUaGUgcmFuZ2UgaXMgY29uc3RyYWluZWQgYmV0d2VlbiAtMjRkQiBhbmQgLTZkQiBvdmVyIHNwZWFrZXIgYW5kIC0zMGRCIGFuZCAtMThkQiBvdmVyIGhlYWRzZXQuCi0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zMC4wZn0sIHszMywgLTI2LjBmfSwgezY2LCAtMjIuMGZ9LCB7MTAwLCAtMTguMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MzMsIC02OC4wZn0sIHs2NiwgLTM0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MSwgLTk2LjBmfSwgezIsIC05Ni4wZn0sIHsxMDAsIC05Ni4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAwLjBmfSwgezEsIDAuMGZ9LCB7MiwgMC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0xMjguMGZ9LCB7MjAsIC04MC4wZn0sIHs2MCwgLTQwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKkdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RFVklDRV9DQVRFR09SWV9DTlRdID0gewotICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUklORwotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0FMQVJNCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTwotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUwotICAgICAgLy8gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciI6IGFsd2F5cyBzaWxlbnQgZXhjZXB0IG9uIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUkVST1VUSU5HCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUEFUQ0gKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLX07Ci0KLS8vc3RhdGljCi1mbG9hdCBHYWluczo6dm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwgaW50IGluZGV4SW5VaSkKLXsKLSAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4IC0gY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleDsKLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gaW5kZXhNaW4pKSAvIChpbmRleE1heCAtIGluZGV4TWluKTsKLQotICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKLSAgICBpbnQgc2VnbWVudCA9IDA7Ci0gICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMV0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAwOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMl0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAxOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDI7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAwLjBmOwotICAgIH0KLQotICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgotICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KLSAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7Ci0KLSAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCi0gICAgICAgICAgICBkZWNpYmVscywKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24pOwotCi0gICAgcmV0dXJuIGRlY2liZWxzOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKaW5kZXggYWVmN2RiZS4uZTBiMjMzZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApAQCAtNTEsNyArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgZGV2RGVzYy0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwogICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZEZXNjKTsKIAogICAgIHJldHVybiBhZGRPdXRwdXRQcm9maWxlKHByb2ZpbGUpOwpAQCAtOTcsNiArMTAwLDkgQEAKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobU91dHB1dFByb2ZpbGVzW2ldLT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBtT3V0cHV0UHJvZmlsZXNbaV0tPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTMsNyArMTE5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHglMDh4IiwKQEAgLTEyNiw2ICsxMzUsOSBAQAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1JbnB1dFByb2ZpbGVzW2ldLT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBtSW5wdXRQcm9maWxlc1tpXS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjE4LDM3ICsyMzAsMzcgQEAKICAgICBtSGFuZGxlID0gaGFuZGxlOwogfQogCi12b2lkIEh3TW9kdWxlOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKK2Jvb2wgSHdNb2R1bGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byAmcm91dGUgOiBtUm91dGVzKSB7CisgICAgICAgIGlmIChyb3V0ZS0+c3VwcG9ydHNQYXRjaChzcmNQb3J0LCBkc3RQb3J0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit2b2lkIEh3TW9kdWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKICAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBvdXRwdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBpbnB1dHM6XG4iLCBzdHJsZW4oIiAgLSBpbnB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gaW5wdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgIDIsIHRydWUpOwotICAgIG1Sb3V0ZXMuZHVtcChmZCwgMik7CisgICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgMiwgdHJ1ZSk7CisgICAgbUR5bmFtaWNEZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEeW5hbWljIiksICAyLCB0cnVlKTsKKyAgICBtUm91dGVzLmR1bXAoZHN0LCAyKTsKIH0KIAogc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0CkBAIC0yNjEsNjQgKzI3MywxNjAgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZVR5cGVzKGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiAqdGhpcykgewotICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSA/CisgICAgICAgIGNvbnN0IGF1dG8mIHByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/CiAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDogbW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IHByb2ZpbGVzKSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZVR5cGVzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIHNwIDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlKHR5cGUsIFN0cmluZzgoKSwgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CitzcDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKIHsKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0cikgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhkZXZpY2UtPnR5cGUoKSwgZW5jb2RlZEZvcm1hdCk7Cit9CisKK0RldmljZVZlY3RvciBId01vZHVsZUNvbGxlY3Rpb246OmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZSgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGcm9tTmFtZShuYW1lKTsKKyAgICBpZiAobW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcigpOworICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1RvQ3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzKSBjb25zdAoreworICAgIFN0cmluZzggZGV2QWRkcmVzcyA9IChhZGRyZXNzID09IG51bGxwdHIgfHwgIW1hdGNoQWRkcmVzcykgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoYWRkcmVzcyk7CiAgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIChkZXZBZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CisgICAgICAgIGRldkFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CisgICAgICAgIGF1dG8gbW9kdWxlRGV2aWNlID0gbW9kdWxlRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgZGV2QWRkcmVzcywgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgIGlmIChtb2R1bGVEZXZpY2UpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRBZGRyZXNzKGRldkFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGFsbG93VG9DcmVhdGUpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlRGV2aWNlOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbWF0Y2hBZHJlc3MpIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworICAgIH0KKyAgICBpZiAoIWFsbG93VG9DcmVhdGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlcyAlMDR4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIG5hbWUsIGRldmljZVR5cGUsIGFkZHJlc3MpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZURldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0Cit7CisgICAgc3A8SHdNb2R1bGU+IGh3TW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXModHlwZSwgZW5jb2RlZEZvcm1hdCk7CisgICAgaWYgKGh3TW9kdWxlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDR4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGUsCisgICAgICAgICAgICAgIGFkZHJlc3MpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChuYW1lKSk7CisgICAgZGV2aWNlLT5zZXROYW1lKFN0cmluZzgobmFtZSkpOworICAgIGRldmljZS0+c2V0QWRkcmVzcyhTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICBkZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7CisKKyAgLy8gQWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3Qgb2YgZHluYW1pYyBkZXZpY2VzCisgICAgaHdNb2R1bGUtPmFkZER5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKKyAgICBBTE9HRCgiJXM6IGFkZGluZyBkeW5hbWljIGRldmljZSAlcyB0byBtb2R1bGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworCisgICAgY29uc3QgYXV0byAmcHJvZmlsZXMgPSAoYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBwcm9maWxlcykgeworICAgICAgICAvLyBBZGQgdGhlIGRldmljZSBhcyBzdXBwb3J0ZWQgdG8gYWxsIHByb2ZpbGUgc3VwcG9ydGluZyAid2Vha2x5IiBvciBub3QgdGhlIGRldmljZQorICAgICAgICAvLyBhY2NvcmRpbmcgdG8gaXRzIHR5cGUKKyAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSwgZmFsc2UgLyptYXRjaEFkcmVzcyovKSkgeworCisgICAgICAgICAgICAvLyBAdG9kbyBxdWlkIG9mIGF1ZGlvIHByb2ZpbGU/IGltcG9ydCB0aGUgcHJvZmlsZSBmcm9tIGRldmljZSBvZiB0aGUgc2FtZSB0eXBlPworICAgICAgICAgICAgY29uc3QgYXV0byAmaXNvVHlwZURldmljZUZvclByb2ZpbGUgPQorICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5nZXREZXZpY2UodHlwZSwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CisKKyAgICAgICAgICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSAlcyB0byBwcm9maWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CisgICAgICAgIERldmljZVZlY3RvciBtb2R1bGVEZXZpY2VzID0gaHdNb2R1bGUtPmdldEFsbERldmljZXMoKTsKKyAgICAgICAgaWYgKCFtb2R1bGVEZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRldmljZS0+ZGV0YWNoKCk7CisgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGZyb20gZHluYW1pYyBsaXN0LCBub3QgZnJvbSBkZWNsYXJlZCBsaXN0ISEhCisgICAgICAgIGlmICghaHdNb2R1bGUtPmdldER5bmFtaWNEZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGh3TW9kdWxlLT5yZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgIEFMT0dWKCIlczogcmVtb3ZlZCBkeW5hbWljIGRldmljZSAlcyBmcm9tIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworCisgICAgICAgIGNvbnN0IElPUHJvZmlsZUNvbGxlY3Rpb24gJnByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkgPworICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgICAgICAvLyBGb3IgY2xlYW51cCwgc3Ryb25nIG1hdGNoIGlzIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCB0cnVlIC8qbWF0Y2hBZHJlc3MqLykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHJlbW92aW5nIGRldmljZSAlcyBmcm9tIHByb2ZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5yZW1vdmVTdXBwb3J0ZWREZXZpY2UoZGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPnNldE5hbWUoU3RyaW5nOChkZXZpY2VfbmFtZSkpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICByZXR1cm4gZGV2RGVzYzsKIH0KIAotc3RhdHVzX3QgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggZmJjMjM4NC4uZmUyZWFlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6SU9Qcm9maWxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgpAQCAtMjQsMTEgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KLS8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKLWJvb2wgSU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NSwxNCArNDIsOCBAQAogICAgICAgICAgICAgZ2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOwogCi0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIGp1c3QgY2hlY2sgdHlwZXMgaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgc2VsZWN0ZWQKLSAgICAgICAgaWYgKHBvcGNvdW50KGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA+IDEpIHsKLSAgICAgICAgICAgIGlmICgobVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgIT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpID09IDApIHsKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbVN1cHBvcnRlZERldmljZXMuY29udGFpbnNBbGxEZXZpY2VzKGRldmljZXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC02NiwxOSArNTcsMjMgQEAKICAgICBhdWRpb19mb3JtYXRfdCBteVVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbXlVcGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKICAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHsKKyAgICAgICAgLmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMICYgfkFVRElPX1BPUlRfQ09ORklHX0dBSU4sCisgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrLAorICAgICAgICAuZm9ybWF0ID0gZm9ybWF0LAorICAgIH07CiAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKQogICAgIHsKLSAgICAgICAgaWYgKGNoZWNrQ29tcGF0aWJsZUF1ZGlvUHJvZmlsZSgKKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoJmNvbmZpZykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tDb21wYXRpYmxlQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG15VXBkYXRlZFNhbXBsaW5nUmF0ZSwgbXlVcGRhdGVkQ2hhbm5lbE1hc2ssIG15VXBkYXRlZEZvcm1hdCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7Ci0gICAgICAgICAgICAuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEwgJiB+QVVESU9fUE9SVF9DT05GSUdfR0FJTiwKLSAgICAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCi0gICAgICAgIH07CiAgICAgICAgIGlmIChjaGVja0V4YWN0QXVkaW9Qcm9maWxlKCZjb25maWcpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTEwOCwxNiArMTAzLDExIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCA0KTsKIAotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwogICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKICAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKQEAgLTEyNSwyMSArMTE1LDE0IEBACiAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwogICAgIH0KICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLQotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTI1MzExMy4uODFkMzk2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE3LDI0MSArMTcsNDI0IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6U2VyaWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOworI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24tPmFkZChlbGVtZW50KSA+PSAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCBTdGRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICBhdXRvIHBhaXIgPSBjb2xsZWN0aW9uLT5pbnNlcnQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBwYWlyLnNlY29uZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3N0cnVjdCBBdWRpb0dhaW5UcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9HYWluLCBBdWRpb0dhaW5Db2xsZWN0aW9uPgogewotICAgIHhtbENoYXIgKnhtbFZhbHVlID0geG1sR2V0UHJvcChjdXIsIChjb25zdCB4bWxDaGFyKilhdHRyaWJ1dGUpOwotICAgIGlmICh4bWxWYWx1ZSA9PSBOVUxMKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2FpbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1vZGUgPSAibW9kZSI7CisgICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2sgPSAiY2hhbm5lbF9tYXNrIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5WYWx1ZU1CID0gIm1pblZhbHVlTUIiOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhWYWx1ZU1CID0gIm1heFZhbHVlTUIiOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbHVlTUIgPSAiZGVmYXVsdFZhbHVlTUIiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0ZXBWYWx1ZU1CID0gInN0ZXBWYWx1ZU1CIjsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluUmFtcE1zID0gIm1pblJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhSYW1wTXMgPSAibWF4UmFtcE1zIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gY2hpbGRyZW4KK307CisKKy8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0CitzdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUHJvZmlsZSwgQXVkaW9Qcm9maWxlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInByb2ZpbGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzYW1wbGluZ1JhdGVzID0gInNhbXBsaW5nUmF0ZXMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtaXhQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cworfTsKKworc3RydWN0IERldmljZVBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8RGV2aWNlRGVzY3JpcHRvciwgRGV2aWNlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImRldmljZVBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSAidGFnTmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICAvKiogb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYWRkcmVzcyA9ICJhZGRyZXNzIjsKKyAgICAgICAgLyoqIG9wdGlvbmFsOiB0aGUgbGlzdCBvZiBlbmNvZGVkIGF1ZGlvIGZvcm1hdHMgdGhhdCBhcmUga25vd24gdG8gYmUgc3VwcG9ydGVkLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuY29kZWRGb3JtYXRzID0gImVuY29kZWRGb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQorfTsKKworc3RydWN0IFJvdXRlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUm91dGUsIEF1ZGlvUm91dGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicm91dGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZU1peCA9ICJtaXgiOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzaW5rID0gInNpbmsiOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KKyAgICAgICAgLyoqIHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzb3VyY2VzID0gInNvdXJjZXMiOworICAgIH07CisKKyAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1vZHVsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxId01vZHVsZSwgSHdNb2R1bGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1vZHVsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJoYWxWZXJzaW9uIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCisgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKK307CisKK3N0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNwZWFrZXJEcmNFbmFibGVkID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7Cit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZFRyYWl0cworeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInN1cnJvdW5kU291bmQiOworCisgICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworICAgIC8vIENoaWxkcmVuOiBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzCit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cyA6IHB1YmxpYyBTdGRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUG9saWN5Q29uZmlnOjpTdXJyb3VuZEZvcm1hdHM+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZm9ybWF0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZm9ybWF0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN1YmZvcm1hdHMgPSAic3ViZm9ybWF0cyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworY2xhc3MgUG9saWN5U2VyaWFsaXplcgoreworcHVibGljOgorICAgIFBvbGljeVNlcmlhbGl6ZXIoKSA6IG1WZXJzaW9ue3N0ZDo6dG9fc3RyaW5nKGdNYWpvcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhnTWlub3IpfQorICAgIHsKKyAgICAgICAgQUxPR1YoIiVzOiBWZXJzaW9uPSVzIFJvb3Q9JXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwgcm9vdE5hbWUpOworICAgIH0KKyAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01ham9yID0gMTsgLyoqPCB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01pbm9yID0gMDsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVZlcnNpb247CisKKyAgICAvLyBDaGlsZHJlbjogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzLCBTdXJyb3VuZFNvdW5kVHJhaXRzIChvcHRpb25hbCkKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOworLy8gaHR0cDovL2IvMTExMDY3Mjc3IC0gQWRkIGJhY2sgY29uc3RleHByIHdoZW4gd2Ugc3dpdGNoIHRvIEMrKzE3LgordGVtcGxhdGUgPD4KK2F1dG8geG1sRGVsZXRlcjx4bWxDaGFyPiA9IFtdKHhtbENoYXIgKnMpIHsgeG1sRnJlZShzKTsgfTsKKworLyoqIEByZXR1cm4gYSB1bmlxdWVfcHRyIHdpdGggdGhlIGNvcnJlY3QgZGVsZXRlciBmb3IgdGhlIGxpYnhtbDIgb2JqZWN0LiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYXV0byBtYWtlX3htbFVuaXF1ZShUICp0KSB7CisgICAgLy8gV3JhcCBkZWxldGVyIGluIGxhbWJkYSB0byBlbmFibGUgZW1wdHkgYmFzZSBvcHRpbWl6YXRpb24KKyAgICBhdXRvIGRlbGV0ZXIgPSBbXShUICp0KSB7IHhtbERlbGV0ZXI8VD4odCk7IH07CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxULCBkZWNsdHlwZShkZWxldGVyKT57dCwgZGVsZXRlcn07Cit9CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICBhdXRvIHhtbFZhbHVlID0gbWFrZV94bWxVbmlxdWUoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGF0dHJpYnV0ZSkpKTsKKyAgICBpZiAoeG1sVmFsdWUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHN0cmluZyB2YWx1ZSgoY29uc3QgY2hhciopeG1sVmFsdWUpOwotICAgIHhtbEZyZWUoeG1sVmFsdWUpOworICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHhtbFZhbHVlLmdldCgpKSk7CiAgICAgcmV0dXJuIHZhbHVlOwogfQogCi11c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKLQotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6cm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWFqb3IgPSAxOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01pbm9yID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKLQogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHZvaWQgZ2V0UmVmZXJlbmNlKGNvbnN0IF94bWxOb2RlICpyb290LCBjb25zdCBfeG1sTm9kZSAqJnJlZk5vZGUsIGNvbnN0IHN0cmluZyAmcmVmTmFtZSkKK2NvbnN0IHhtbE5vZGUqIGdldFJlZmVyZW5jZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWZOYW1lKQogewotICAgIGNvbnN0IF94bWxOb2RlICpjb2wgPSByb290OwotICAgIHdoaWxlIChjb2wgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjb2wtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIgPSBjb2wtPmNoaWxkcmVuOwotICAgICAgICAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilnUmVmZXJlbmNlRWxlbWVudE5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPmNoaWxkcmVuOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0OjpyZWZlcmVuY2VUYWcpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgVHJhaXQ6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmVmTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZOb2RlID0gY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjb2wgPSBjb2wtPm5leHQ7CiAgICAgfQotICAgIHJldHVybjsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQorc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gKmNvbGxlY3Rpb24sCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSAmJgotICAgICAgICAgICAgICAgIHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBOVUxMOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXI7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290OwotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyRWxlbWVudCBlbGVtZW50OwotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjpkZXNlcmlhbGl6ZShkb2MsIGNoaWxkLCBlbGVtZW50LCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICAgICAgYXV0byBlbGVtZW50ID0gVHJhaXQ6OmRlc2VyaWFsaXplKGNoaWxkLCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6YWRkRWxlbWVudFRvQ29sbGVjdGlvbihlbGVtZW50LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgewogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6dGFnID0gImdhaW4iOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKLQotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1vZGVbXSA9ICJtb2RlIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza1tdID0gImNoYW5uZWxfbWFzayI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluVmFsdWVNQltdID0gIm1pblZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFZhbHVlTUJbXSA9ICJtYXhWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQltdID0gImRlZmF1bHRWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQltdID0gInN0ZXBWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5SYW1wTXNbXSA9ICJtaW5SYW1wTXMiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFJhbXBNc1tdID0gIm1heFJhbXBNcyI7Ci0KLXN0YXR1c190IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9HYWluVHJhaXRzOjpFbGVtZW50PiBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKICAgICBzdGF0aWMgdWludDMyX3QgaW5kZXggPSAwOwotICAgIGdhaW4gPSBuZXcgRWxlbWVudChpbmRleCsrLCB0cnVlKTsKKyAgICBFbGVtZW50IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4KyssIHRydWUpOwogCi0gICAgc3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bW9kZSk7CisgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CiAgICAgaWYgKCFjaGFubmVsc0xpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhjaGFubmVsTWFza0Zyb21TdHJpbmcoY2hhbm5lbHNMaXRlcmFsKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CiAgICAgaW50MzJfdCBtaW5WYWx1ZU1COwogICAgIGlmICghbWluVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluVmFsdWVNQkxpdGVyYWwsIG1pblZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihtaW5WYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKICAgICBpbnQzMl90IG1heFZhbHVlTUI7CiAgICAgaWYgKCFtYXhWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhWYWx1ZU1CTGl0ZXJhbCwgbWF4VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKG1heFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKICAgICBpbnQzMl90IGRlZmF1bHRWYWx1ZU1COwogICAgIGlmICghZGVmYXVsdFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCwgZGVmYXVsdFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoZGVmYXVsdFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKICAgICB1aW50MzJfdCBzdGVwVmFsdWVNQjsKICAgICBpZiAoIXN0ZXBWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhzdGVwVmFsdWVNQkxpdGVyYWwsIHN0ZXBWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKHN0ZXBWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOwogICAgIHVpbnQzMl90IG1pblJhbXBNczsKICAgICBpZiAoIW1pblJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluUmFtcE1zTGl0ZXJhbCwgbWluUmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhtaW5SYW1wTXMpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CiAgICAgdWludDMyX3QgbWF4UmFtcE1zOwogICAgIGlmICghbWF4UmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhSYW1wTXNMaXRlcmFsLCBtYXhSYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKG1heFJhbXBNcyk7CiAgICAgfQotICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwgX19GVU5DVElPTl9fLAorICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgZ2Fpbi0+Z2V0TW9kZSgpLCBnYWluLT5nZXRDaGFubmVsTWFzaygpLCBnYWluLT5nZXRNaW5WYWx1ZUluTWIoKSwKICAgICAgICAgICBnYWluLT5nZXRNYXhWYWx1ZUluTWIoKSk7CiAKLSAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGdhaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAicHJvZmlsZXMiOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjp0YWcgPSAicHJvZmlsZSI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6c2FtcGxpbmdSYXRlc1tdID0gInNhbXBsaW5nUmF0ZXMiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmZvcm1hdFtdID0gImZvcm1hdCI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzW10gPSAiY2hhbm5lbE1hc2tzIjsKLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOwotICAgIHN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Zm9ybWF0KTsKLSAgICBzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKKyAgICBzdGQ6OnN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Zm9ybWF0KTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CiAKLSAgICBwcm9maWxlID0gbmV3IEVsZW1lbnQoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CisgICAgRWxlbWVudCBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOwogCiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBnRHluYW1pY0Zvcm1hdCk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuaXNFbXB0eSgpKTsKICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLmlzRW1wdHkoKSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKLQotY29uc3QgY2hhciAqY29uc3QgTWl4UG9ydFRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJtaXhQb3J0cyI7Ci1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjp0YWcgPSAibWl4UG9ydCI7Ci0KLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmZsYWdzW10gPSAiZmxhZ3MiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnRbXSA9ICJtYXhPcGVuQ291bnQiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudFtdID0gIm1heEFjdGl2ZUNvdW50IjsKLQotc3RhdHVzX3QgTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsIFB0ckVsZW1lbnQgJm1peFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPE1peFBvcnRUcmFpdHM6OkVsZW1lbnQ+IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmNoaWxkLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnJvbGUpOwogICAgIGlmIChyb2xlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogUm9sZT0lcyIsIF9fRlVOQ1RJT05fXywgcm9sZS5jX3N0cigpKTsKLSAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IHJvbGUgPT0gInNvdXJjZSIgPyBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19mdW5jX18sIHJvbGUuY19zdHIoKSk7CisgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSAocm9sZSA9PSBBdHRyaWJ1dGVzOjpyb2xlU291cmNlKSA/CisgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CiAKLSAgICBtaXhQb3J0ID0gbmV3IEVsZW1lbnQoU3RyaW5nOChuYW1lLmNfc3RyKCkpLCBwb3J0Um9sZSk7CisgICAgRWxlbWVudCBtaXhQb3J0ID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIGNoaWxkLCBwcm9maWxlcywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oY2hpbGQsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBtaXhQb3J0LT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAotICAgIHN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOworICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CkBAIC0yNjEsNTIgKzQ0NCw0NiBAQAogICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOwogICAgICAgICB9CiAgICAgfQotICAgIHN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOwogICAgIGlmICghbWF4T3BlbkNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heE9wZW5Db3VudCwgbWl4UG9ydC0+bWF4T3BlbkNvdW50KTsKICAgICB9Ci0gICAgc3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKICAgICBpZiAoIW1heEFjdGl2ZUNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heEFjdGl2ZUNvdW50LCBtaXhQb3J0LT5tYXhBY3RpdmVDb3VudCk7CiAgICAgfQogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgQXVkaW9HYWluVHJhaXRzOjpDb2xsZWN0aW9uIGdhaW5zOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgY2hpbGQsIGdhaW5zLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjaGlsZCwgJmdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1peFBvcnQtPnNldEdhaW5zKGdhaW5zKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbWl4UG9ydDsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6dGFnID0gImRldmljZVBvcnQiOwotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7Ci0KLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dGFnTmFtZVtdID0gInRhZ05hbWUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6YWRkcmVzc1tdID0gImFkZHJlc3MiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlU291cmNlW10gPSAic291cmNlIjsKLQotc3RhdHVzX3QgRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZGV2aWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48RGV2aWNlUG9ydFRyYWl0czo6RWxlbWVudD4gRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGVOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPwogICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIApAQCAtMzE0LDMzOCArNDkxLDMwMSBAQAogICAgIGlmICghZGV2aWNlRnJvbVN0cmluZyh0eXBlTmFtZSwgdHlwZSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSkgewotICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX0ZVTkNUSU9OX18sIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX2Z1bmNfXywgdHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGRldmljZURlc2MgPSBuZXcgRWxlbWVudCh0eXBlLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRGb3JtYXRzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6ZW5jb2RlZEZvcm1hdHMsIGVuY29kZWRGb3JtYXRzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBGb3JtYXRWZWN0b3IgZW5jb2RlZEZvcm1hdHM7CisgICAgaWYgKCFlbmNvZGVkRm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBlbmNvZGVkRm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKGVuY29kZWRGb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICB9CisgICAgRWxlbWVudCBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgZW5jb2RlZEZvcm1hdHMsIFN0cmluZzgobmFtZS5jX3N0cigpKSk7CiAKLSAgICBzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6YWRkcmVzcyk7CiAgICAgaWYgKCFhZGRyZXNzLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fZnVuY19fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIGRldmljZURlc2MtPnNldEFkZHJlc3MoU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpKTsKICAgICB9CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCByb290LCBwcm9maWxlcywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oY3VyLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgICAgICBwcm9maWxlcy5hZGQoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICB9CiAgICAgZGV2aWNlRGVzYy0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBBdWRpb0dhaW4gY2hpbGRyZW4KLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIHJvb3QsIGRldmljZURlc2MtPm1HYWlucywgTlVMTCk7Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY3VyLCAmZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPmFkZHJlc3MoKS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGRldmljZURlc2M7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjp0YWcgPSAicm91dGUiOwotY29uc3QgY2hhciAqY29uc3QgUm91dGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAicm91dGVzIjsKLQotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6dHlwZVtdID0gInR5cGUiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6dHlwZU1peFtdID0gIm1peCI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzaW5rW10gPSAic2luayI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzb3VyY2VzW10gPSAic291cmNlcyI7Ci0KLQotc3RhdHVzX3QgUm91dGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKK1JldHVybjxSb3V0ZVRyYWl0czo6RWxlbWVudD4gUm91dGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQogewotICAgIHN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0eXBlKTsKICAgICBpZiAodHlwZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBhdWRpb19yb3V0ZV90eXBlX3Qgcm91dGVUeXBlID0gKHR5cGUgPT0gQXR0cmlidXRlczo6dHlwZU1peCkgPwogICAgICAgICAgICAgICAgIEFVRElPX1JPVVRFX01JWCA6IEFVRElPX1JPVVRFX01VWDsKIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQocm91dGVUeXBlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBFbGVtZW50IHJvdXRlID0gbmV3IEF1ZGlvUm91dGUocm91dGVUeXBlKTsKIAotICAgIHN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICBzdGQ6OnN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNpbmspOwogICAgIGlmIChzaW5rQXR0ci5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnNpbmspOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnNpbmspOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICAvLyBDb252ZXJ0IFNpbmsgbmFtZSB0byBwb3J0IHBvaW50ZXIKICAgICBzcDxBdWRpb1BvcnQ+IHNpbmsgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKFN0cmluZzgoc2lua0F0dHIuY19zdHIoKSkpOwogICAgIGlmIChzaW5rID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBzaW5rIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fRlVOQ1RJT05fXywgc2lua0F0dHIuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX2Z1bmNfXywgc2lua0F0dHIuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGVsZW1lbnQtPnNldFNpbmsoc2luayk7CisgICAgcm91dGUtPnNldFNpbmsoc2luayk7CiAKLSAgICBzdHJpbmcgc291cmNlc0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgc3RkOjpzdHJpbmcgc291cmNlc0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKICAgICBpZiAoc291cmNlc0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gVG9rZW5pemUgYW5kIENvbnZlcnQgU291cmNlcyBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIEF1ZGlvUG9ydFZlY3RvciBzb3VyY2VzOwotICAgIGNoYXIgKnNvdXJjZXNMaXRlcmFsID0gc3RybmR1cChzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpOwotICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayhzb3VyY2VzTGl0ZXJhbCwgIiwiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBzb3VyY2VzTGl0ZXJhbHtzdHJuZHVwKAorICAgICAgICAgICAgICAgIHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSl9OworICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayhzb3VyY2VzTGl0ZXJhbC5nZXQoKSwgIiwiKTsKICAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKICAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBkZXZUYWcpOwotICAgICAgICAgICAgICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIGRldlRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgIH0KICAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsICIsIik7CiAgICAgfQotICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwogCi0gICAgc2luay0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgc2luay0+YWRkUm91dGUocm91dGUpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IHNvdXJjZXMuaXRlbUF0KGkpOwotICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKGVsZW1lbnQpOworICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKHJvdXRlKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U291cmNlcyhzb3VyY2VzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcm91dGUtPnNldFNvdXJjZXMoc291cmNlcyk7CisgICAgcmV0dXJuIHJvdXRlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VzVGFnID0gImF0dGFjaGVkRGV2aWNlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VUYWcgPSAiaXRlbSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKLQotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjp0YWcgPSAibW9kdWxlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJtb2R1bGVzIjsKLQotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjp2ZXJzaW9uW10gPSAiaGFsVmVyc2lvbiI7Ci0KLXN0YXR1c190IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48TW9kdWxlVHJhaXRzOjpFbGVtZW50PiBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICB1aW50MzJfdCB2ZXJzaW9uTWFqb3IgPSAwLCB2ZXJzaW9uTWlub3IgPSAwOwotICAgIHN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOwogICAgIGlmICghdmVyc2lvbkxpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBzc2NhbmYodmVyc2lvbkxpdGVyYWwuY19zdHIoKSwgIiV1LiV1IiwgJnZlcnNpb25NYWpvciwgJnZlcnNpb25NaW5vcik7Ci0gICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWFqb3IpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKIAotICAgIG1vZHVsZSA9IG5ldyBFbGVtZW50KG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOworICAgIEVsZW1lbnQgbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOwogCiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW5zOiBBdWRpbyBNaXggUG9ydCwgQXVkaW8gRGV2aWNlIFBvcnRzIChTb3VyY2UvU2luayksIEF1ZGlvIFJvdXRlcwogICAgIE1peFBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gbWl4UG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGRvYywgcm9vdCwgbWl4UG9ydHMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihjdXIsICZtaXhQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFByb2ZpbGVzKG1peFBvcnRzKTsKIAogICAgIERldmljZVBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gZGV2aWNlUG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihjdXIsICZkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VQb3J0cyk7CiAKICAgICBSb3V0ZVRyYWl0czo6Q29sbGVjdGlvbiByb3V0ZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihkb2MsIHJvb3QsIHJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGN1ciwgJnJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0Um91dGVzKHJvdXRlcyk7CiAKLSAgICBjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGRyZW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOwotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICphdHRhY2hlZERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSkpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY2hpbGRyZW4gIT0gTlVMTDsKKyAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBhdHRhY2hlZERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPmRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGF0dGFjaGVkRGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZERldmljZS5nZXQoKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YWRkQXZhaWxhYmxlRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGF0dGFjaGVkRGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKmRlZmF1bHRPdXRwdXREZXZpY2UgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZGVmYXVsdE91dHB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOCgoY29uc3QgY2hhciopZGVmYXVsdE91dHB1dERldmljZSkpOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZykpKSB7CisgICAgICAgICAgICBhdXRvIGRlZmF1bHRPdXRwdXREZXZpY2UgPSBtYWtlX3htbFVuaXF1ZSh4bWxOb2RlTGlzdEdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi0+ZG9jLCBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdE91dHB1dERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlZmF1bHRPdXRwdXREZXZpY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gMCAmJiBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0RGVmYXVsdE91dHB1dERldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsIF9fRlVOQ1RJT05fXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbEZyZWUoZGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtb2R1bGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEdsb2JhbENvbmZpZ1RyYWl0czo6dGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOwotCi1jb25zdCBjaGFyIEdsb2JhbENvbmZpZ1RyYWl0czo6QXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWRbXSA9ICJzcGVha2VyX2RyY19lbmFibGVkIjsKLQotCi1zdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKK3N0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXRhZykpIHsKLSAgICAgICAgICAgIHN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQorICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CiAgICAgICAgICAgICBib29sIGlzU3BlYWtlckRyY0VuYWJsZWQ7CiAgICAgICAgICAgICBpZiAoIXNwZWFrZXJEcmNFbmFibGVkLmVtcHR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnRhZyA9ICJ2b2x1bWUiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7Ci0KLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdHJlYW1bXSA9ICJzdHJlYW0iOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5W10gPSAiZGV2aWNlQ2F0ZWdvcnkiOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZVtdID0gInJlZiI7Ci0KLXN0YXR1c190IFZvbHVtZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3N0YXR1c190IFN1cnJvdW5kU291bmRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgc3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwotICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlTGl0ZXJhbCwgc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICBpZiAoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnk7Ci0gICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGRldmljZUNhdGVnb3J5KSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICBkZXZpY2VDYXRlZ29yeUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOwogCi0gICAgc3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKLSAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKLSAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihyb290LT5wYXJlbnQsIHJlZiwgcmVmZXJlbmNlTmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbVR5cGUpOwotCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPyByb290LT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil2b2x1bWVQb2ludFRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKnBvaW50RGVmaW5pdGlvbiA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKHBvaW50RGVmaW5pdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzIGZvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cz4oCisgICAgICAgICAgICAgICAgICAgIGN1ciwgJmZvcm1hdHMsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3Vycm91bmRGb3JtYXRzKGZvcm1hdHMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBwb2ludDsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50MzJfdD4gPigoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uLCBwb2ludCwgIiwiKTsKLSAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX0ZVTkNUSU9OX18sIHZvbHVtZVBvaW50VGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50LT5hZGQoQ3VydmVQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTsKLSAgICAgICAgICAgIHhtbEZyZWUocG9pbnREZWZpbml0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKLQotICAgIC8vIGRlc2VyaWFsaXplIHZvbHVtZSBzZWN0aW9uCi0gICAgVm9sdW1lVHJhaXRzOjpDb2xsZWN0aW9uIHZvbHVtZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4oZG9jLCBjdXIsIHZvbHVtZXMsICZjb25maWcpOwotICAgIGNvbmZpZy5zZXRWb2x1bWVzKHZvbHVtZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNb2R1bGVUcmFpdHM+KHJvb3QsICZtb2R1bGVzLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQ5ZmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLVN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQotICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IHN0cmVhbSdzIGluZGV4IHRvIG1JbmRleE1heCBzbyB2b2x1bWUgaXNuJ3QgMCBpbgotICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBKYXZhIGxheWVyIGRvZXNuJ3QgY2FsbCBpbnRvIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSB0bwotICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2b2x1bWUuCi0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgbUluZGV4TWF4KTsKLX0KLQotaW50IFN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci17Ci0gICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCi17Ci0gICAgbUluZGV4Q3VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKLXsKLSAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1TdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQotewotICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnksIHBvaW50KTsKLX0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKLX0KLQotZmxvYXQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdAotewotICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSB2YWx1ZUF0KHN0cmVhbSk7Ci0gICAgcmV0dXJuIEdhaW5zOjp2b2xJbmRleFRvRGIoc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGNhdGVnb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCksIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluVWkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotewotICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgewotICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7Ci0gICAgc2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcwotICAgIGlmIChpc1NwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9SSU5HLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9NVVNJQywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLXsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0cmVhbURzdCwgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW3N0cmVhbVNyY11bal0pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNmY0OGVhZS4uN2M3NmQ4YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTQ1LDYgKzQ1LDcgQEAKIGNvbnN0IFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6OlRhYmxlIFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19SRU5ERVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKE1JWF9ST1VURV9GTEFHX0FMTCksCiAgICAgVEVSTUlOQVRPUgogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzZjFiYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWZsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOwotCi0gICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOwotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7Ci0gICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOwotICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKLSAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7Ci0gICAgfQotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOwotCi0gICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKLSAgICBzaXplX3QgaW5kZXhJblVpUG9zaXRpb24gPSBtQ3VydmVQb2ludHMub3JkZXJPZihDdXJ2ZVBvaW50KHZvbElkeCwgMCkpOwotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA+PSBuYkN1cnZlUG9pbnRzKSB7Ci0gICAgICAgIC8vdXNlIGxhc3QgcG9pbnQgb2YgdGFibGUKLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID09IDApIHsKLSAgICAgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uICE9IG1DdXJ2ZVBvaW50c1swXS5tSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOyAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1swXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOwotICAgIH0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgLQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSApOwotCi0gICAgQUxPR1YoIlZPTFVNRSBtRGV2aWNlQ2F0ZWdvcnkgJWQsIG1TdHJlYW1UeXBlICVkIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIG1EZXZpY2VDYXRlZ29yeSwgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgsIHZvbElkeCwKLSAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4LAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSwgZGVjaWJlbHMsCi0gICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpOwotCi0gICAgcmV0dXJuIGRlY2liZWxzOwotfQotCi12b2lkIFZvbHVtZUN1cnZlOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgeyIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIoJTNkLCAlNWQpIiwKLSAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi12b2lkIFZvbHVtZUN1cnZlc0ZvclN0cmVhbTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgaWYgKCFjdXJ2ZVBvaW50cykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKLSAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwgbUluZGV4Q3VyLmtleUF0KGkpLCBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7Ci0gICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyAlcyA6IiwKLSAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotc3RhdHVzX3QgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOwotICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOwotICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgc3RyZWFtVHlwZUxpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICIgJXMgKCUwMnp1KTogQ3VydmUgcG9pbnRzIGZvciBkZXZpY2UgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVMaXRlcmFsLmNfc3RyKCksIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCwgMiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCBhNzVmMWNiLi5iNGNjMWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTE4NSwxNCArMTg1LDI3IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIAotICAgIDwhLS0gVm9sdW1lIHNlY3Rpb24gLS0+CisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbjoKKyAgICAgICAgSU1QT1JUQU5UIE5PVEU6IFZvbHVtZSB0YWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIGVuZ2luZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBpdCBoZXJlIGZvciBsZWdhY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgd2lsbCBmYWxsYmFjayBvbiB0aGVzZSBmaWxlcyBpZiBub25lIGFyZSBwcm92aWRlZCBieSBlbmdpbmUuCisgICAgIC0tPgogCiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCmluZGV4IDU4NzY4YzMuLjlhZDYwOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKQEAgLTMwLDExICszMCwyMSBAQAogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFjYTMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWNfdHYueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIHZlcnNpb24gc2VjdGlvbiBjb250YWlucyBhIOKAnHZlcnNpb27igJ0gdGFnIGluIHRoZSBmb3JtIOKAnG1ham9yLm1pbm9y4oCdIGUuZyB2ZXJzaW9uPeKAnTEuMOKAnSAtLT4KKworICAgIDwhLS0gR2xvYmFsIGNvbmZpZ3VyYXRpb24gRGVjYWxhcmF0aW9uIC0tPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwiLz4KKworICAgICAgICA8IS0tIFVzYiBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InVzYl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJyX3N1Ym1peF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgIDwvbW9kdWxlcz4KKyAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CisKKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CisKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCmluZGV4IDI2YzM4MWYuLjgzNTBlYjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKQEAgLTE1LDYgKzE1LDkgQEAKIC0tPgogCiA8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDwhLS0gR2xvYmFsIGNvbmZpZ3VyYXRpb24gRGVjYWxhcmF0aW9uIC0tPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIi8+CisKICAgICA8bW9kdWxlcz4KICAgICAgICAgPCEtLSBTdHViIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3R1Yl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KQEAgLTI2LDUgKzI5LDYgQEAKIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KIAogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9tc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTdiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIE11bHRpIFN0cmVhbSBEZWNvZGVyIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9Im1zZCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICA8aXRlbT5NUzEyIElucHV0PC9pdGVtPgorICAgICAgICA8aXRlbT5NUzEyIE91dHB1dDwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgaW5wdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGNvbXByZXNzZWQgaW5wdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUR8QVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gVGhlIEhXIEFWIFN5bmMgZmxhZyBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBvdXRwdXQiIHJvbGU9InNpbmsiIGZsYWdzPSJBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBJbnB1dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CVVMiICByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibXMxMiBvdXRwdXQiIHNvdXJjZXM9Ik1TMTIgT3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA1YjdhZTdmLi5lZWRjOTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xLDUgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmbGllIC0tPgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgLS0+CiA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CiAgICAgPGF0dGFjaGVkRGV2aWNlcz4KICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYwMTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmlsZSBmb3IgVFYgLS0+Cis8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8ZGVmYXVsdE91dHB1dERldmljZT5TcGVha2VyPC9kZWZhdWx0T3V0cHV0RGV2aWNlPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iZGlyZWN0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QiIC8+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InR1bm5lbCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMiIC8+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiIC8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik91dCBBdXggRGlnaXRhbCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCIgcm9sZT0ic2luayIKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMgQVVESU9fRk9STUFUX0lFQzYxOTM3IiAvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iT3V0IEF1eCBEaWdpdGFsIiBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkaXJlY3QsdHVubmVsIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9zdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGExODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzdXJyb3VuZFNvdW5kPgorICA8IS0tIEVhY2ggb2YgdGhlIGxpc3RlZCBmb3JtYXRzIGdldHMgYW4gZW50cnkgaW4gU3Vycm91bmQgU2V0dGluZ3MgZGlhbG9nIG9uIFRWIGRldmljZXMuCisgICAgICAgVGhlcmUgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgSmF2YSBFTkNPRElOR18uLi4gY29udGFudCBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LmphdmEsCisgICAgICAgYW5kIGEgZGlzcGxheSBuYW1lIGRlZmluZWQgaW4gQXVkaW9Gb3JtYXQudG9EaXNwbGF5TmFtZS4gRm9yIHRoZSBmb3JtYXRzIHRoYXQgZG9uJ3QKKyAgICAgICBuZWVkIGEgZGVkaWNhdGVkIFN1cnJvbmQgU2V0dGluZ3MgZGlhbG9nIGVudHJ5LCBhIHN1YmZvcm1hdHMgbGlzdCBoYXMgdG8gYmUgdXNlZC4gLS0+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RUUyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFNfSEQiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUFDX0xDIiBzdWJmb3JtYXRzPSJBVURJT19GT1JNQVRfQUFDX0hFX1YxIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIgQVVESU9fRk9STUFUX0FBQ19FTEQgQVVESU9fRk9STUFUX0FBQ19YSEUiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUM0IiAvPgorICA8L2Zvcm1hdHM+Cis8L3N1cnJvdW5kU291bmQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVkZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwMjdlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEVuZ2luZUNvbmZpZy5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPFByb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPFN0cmVhbVZvbHVtZUN1cnZlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKworY2xhc3MgRW5naW5lQmFzZSA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworCisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtUGhvbmVTdGF0ZTsgfQorCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmF0ZWd5VmVjdG9yIGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgb3ZlcnJpZGU7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIG92ZXJyaWRlOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisKKworICAgIGVuZ2luZUNvbmZpZzo6UGFyc2luZ1Jlc3VsdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIGNvbnN0IFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqZ2V0QXBtT2JzZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBtQXBtT2JzZXJ2ZXI7IH0KKworICAgIGlubGluZSBib29sIGlzSW5DYWxsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSk7CisgICAgfQorCisgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oc3RyZWFtKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOworCisgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworIHByaXZhdGU6CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlciA9IG51bGxwdHI7CisKKyAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgbVByb2R1Y3RTdHJhdGVnaWVzOworICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZSA9IEFVRElPX01PREVfTk9STUFMOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLworCisgICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9IHt9OworCisgICAgU3RyZWFtVm9sdW1lQ3VydmVzIG1TdHJlYW1Wb2x1bWVDdXJ2ZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjUwNWIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQGJyaWVmIFRoZSBQcm9kdWN0U3RyYXRlZ3kgY2xhc3MgZGVzY3JpYmVzIGZvciBlYWNoIHByb2R1Y3Rfc3RyYXRlZ3lfdCBpZGVudGlmaWVyIHRoZQorICogYXNzb2NpYXRlZCBhdWRpbyBhdHRyaWJ1dGVzLCB0aGUgZGV2aWNlIHR5cGVzIHRvIHVzZSwgdGhlIGRldmljZSBhZGRyZXNzIHRvIHVzZS4KKyAqIFRoZSBpZGVudGlmaWVyIGlzIHZvbHVudGFyaWx5IG5vdCBzdHJvbmdseSB0eXBlZCBpbiBvcmRlciB0byBiZSBleHRlbnNpYmxlIGJ5IE9FTS4KKyAqLworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+Cit7Citwcml2YXRlOgorICAgIHN0cnVjdCBBdWRpb0F0dHJpYnV0ZXMgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICAgICAgdWludDMyX3QgbUdyb3VwSWQgPSAwOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH07CisKKyAgICB1c2luZyBBdWRpb0F0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+OworCitwdWJsaWM6CisgICAgUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHZvaWQgYWRkQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IGxpc3RBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdDsKKworICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3Q7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdXBwb3J0ZWRTdHJlYW1zKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWF0Y2hlcyBjaGVja3MgaWYgdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMgc2hhbGwgZm9sbG93IHRoZSBzdHJhdGVneS4KKyAgICAgKiAgICAgICAgT3JkZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2l0aGluIGEgc3RyYXRlZ3kgbWF0dGVycy4KKyAgICAgKiAgICAgICAgSWYgb25seSB0aGUgdXNhZ2UgaXMgYXZhaWxhYmxlLCB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkIG9uIHRoZSB1c2FnZXMgb2YgdGhlIGdpdmVuCisgICAgICogICAgICAgIGF0dHJpYnV0ZXMsIG90aGVyd2lzZSBhbGwgZmllbGRzIG11c3QgbWF0Y2guCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXR0cmlidXRlcyBtYXRjaGVzIHdpdGggdGhlIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzKSBjb25zdDsKKworICAgIGJvb2wgc3VwcG9ydFN0cmVhbVR5cGUoY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSkgY29uc3Q7CisKKyAgICB2b2lkIHNldERldmljZUFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpCisgICAgeworICAgICAgICBtRGV2aWNlQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VBZGRyZXNzOyB9CisKKyAgICB2b2lkIHNldERldmljZVR5cGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZXMoKSBjb25zdCB7IHJldHVybiBtQXBwbGljYWJsZURldmljZXM7IH0KKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKworICAgIEF1ZGlvQXR0cmlidXRlc1ZlY3RvciBtQXR0cmlidXRlc1ZlY3RvcjsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICBzdGQ6OnN0cmluZyBtRGV2aWNlQWRkcmVzczsgLyoqPCBEZXZpY2UgYWRkcmVzcyBhcHBsaWNhYmxlIGZvciB0aGlzIHN0cmF0ZWd5LCBtYXliZSBlbXB0eSAqLworCisgICAgLyoqCisgICAgICogQXBwbGljYWJsZSBkZXZpY2UocykgdHlwZSBtYXNrIGZvciB0aGlzIHN0cmF0ZWd5LgorICAgICAqLworICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKK307CisKK2NsYXNzIFByb2R1Y3RTdHJhdGVneU1hcCA6IHB1YmxpYyBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIHNwPFByb2R1Y3RTdHJhdGVneT4gPgoreworcHVibGljOgorICAgIC8qKgorICAgICAqIEBicmllZiBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiB0aGUgdmVjdG9yIGlzIGRpbWVuc2lvbm5pbmcuCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiBAcmV0dXJuIGFwcGxpY2FibGUgcHJvZHVjdCBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSwgZGVmYXVsdCBpZiBub25lIGFwcGxpY2FibGUuCisgICAgICovCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqICAgICAgICBBdWRpb01hbmFnZXI6IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIGZvcm1lciByb3V0aW5nIHN0cmF0ZWd5CisgICAgICogICAgICAgIENhckF1ZGlvTWFuYWdlcjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgY2FyIHVzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgW2dldEF1ZGlvQXR0cmlidXRlc0ZvckNhclVzYWdlXQorICAgICAqICAgICAgICBPZW1FeHRlbnNpb246IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIE9lbSB1c2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0ZWd5CisgICAgICogQHJldHVybiBhdWRpbyBhdHRyaWJ1dGVzIChvciBhdCBsZWFzdCBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMpIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICovCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldERlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9TdHJlYW1Wb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9TdHJlYW1Wb2x1bWVDdXJ2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBiN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1N0cmVhbVZvbHVtZUN1cnZlcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmVhbVZvbHVtZUN1cnZlcworeworcHVibGljOgorICAgIFN0cmVhbVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzd2l0Y2hWb2x1bWVDdXJ2ZSBjb250cm9sIEFQSSBmb3IgRW5naW5lLCBhbGxvd3MgdG8gc3dpdGNoIHRoZSB2b2x1bWUgY3VydmVzCisgICAgICogZnJvbSBvbmUgc3RyZWFtIHR5cGUgdG8gYW5vdGhlci4KKyAgICAgKiBAcGFyYW0gc3JjIHNvdXJjZSBzdHJlYW0gdHlwZQorICAgICAqIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gc3RyZWFtIHR5cGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpCisgICAgeworICAgICAgICBpZiAoIWhhc0N1cnZlc0ZvcihzdHJlYW1TcmMpIHx8ICFoYXNDdXJ2ZXNGb3Ioc3RyZWFtRHN0KSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyBjdXJ2ZXMgZGVmaW5lZCBmb3Igc3RyZWFtcyAlZCAlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtU3JjLCBzdHJlYW1Ec3QpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVzICZzb3VyY2VDdXJ2ZXMgPSBnZXRDdXJ2ZXNGb3Ioc3RyZWFtU3JjKTsKKyAgICAgICAgVm9sdW1lQ3VydmVzICZkc3RDdXJ2ZXMgPSBlZGl0Q3VydmVzRm9yKHN0cmVhbURzdCk7CisgICAgICAgIHJldHVybiBkc3RDdXJ2ZXMuc3dpdGNoQ3VydmVzRnJvbShzb3VyY2VDdXJ2ZXMpOworICAgIH0KKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZChjb25zdCBWb2x1bWVDdXJ2ZXMgJmN1cnZlcywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorICAgIHsKKyAgICAgICAgbUN1cnZlcy5lbXBsYWNlKHN0cmVhbVR5cGUsIGN1cnZlcyk7CisgICAgfQorCisgICAgYm9vbCBoYXNDdXJ2ZXNGb3IoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgeworICAgICAgICByZXR1cm4gbUN1cnZlcy5maW5kKHN0cmVhbSkgIT0gZW5kKG1DdXJ2ZXMpOworICAgIH0KKworICAgIFZvbHVtZUN1cnZlcyAmZWRpdEN1cnZlc0ZvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1DdXJ2ZXMuZmluZChzdHJlYW0pICE9IGVuZChtQ3VydmVzKSwgIkludmFsaWQgc3RyZWFtIHR5cGUgZm9yIFZvbHVtZSBDdXJ2ZSIpOworICAgICAgICByZXR1cm4gbUN1cnZlc1tzdHJlYW1dOworICAgIH0KKyAgICBjb25zdCBWb2x1bWVDdXJ2ZXMgJmdldEN1cnZlc0ZvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1DdXJ2ZXMuZmluZChzdHJlYW0pICE9IGVuZChtQ3VydmVzKSwgIkludmFsaWQgc3RyZWFtIHR5cGUgZm9yIFZvbHVtZSBDdXJ2ZSIpOworICAgICAgICByZXR1cm4gbUN1cnZlcy5hdChzdHJlYW0pOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtCisgICAgICogQHBhcmFtIHN0cmVhbSB0eXBlIGZvciB3aGljaCB0aGUgdm9sdW1lIGN1cnZlcyBpbnRlcmZhY2UgaXMgcmVxdWVzdGVkCisgICAgICogQHJldHVybiB0aGUgVm9sdW1lQ3VydmVzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqLworICAgIFZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgIHsKKyAgICAgICAgQUxPR19BU1NFUlQobUN1cnZlcy5maW5kKHN0cmVhbSkgIT0gZW5kKG1DdXJ2ZXMpLCAiSW52YWxpZCBzdHJlYW0gdHlwZSBmb3IgVm9sdW1lIEN1cnZlIik7CisgICAgICAgIHJldHVybiBtQ3VydmVzW3N0cmVhbV07CisgICAgfQorICAgIC8qKgorICAgICAqIEBicmllZiByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUgaGVscGVyIGNvbnRyb2wgQVBJIGZvciBlbmdpbmUgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdm9sdW1lCisgICAgICogY3VydmVzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICogQHBhcmFtIHN0cmVhbSBmb3Igd2hpY2ggdGhlIHZvbHVtZSBjdXJ2ZXMgd2lsbCBiZSByZXN0b3JlZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgeworICAgICAgICBpZiAoIWhhc0N1cnZlc0ZvcihzdHJlYW0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIGN1cnZlcyBkZWZpbmVkIGZvciBzdHJlYW1zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzd2l0Y2hWb2x1bWVDdXJ2ZShzdHJlYW0sIHN0cmVhbSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPGF1ZGlvX3N0cmVhbV90eXBlX3QsIFZvbHVtZUN1cnZlcz4gbUN1cnZlczsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNjNlMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJVm9sdW1lQ3VydmVzLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEN1cnZlUG9pbnQKK3sKKyAgICBDdXJ2ZVBvaW50KCkge30KKyAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgorICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KKyAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQoreworICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKK30KKworLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQorLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCisvLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCitjbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgOiBtRGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSB7fQorCisgICAgdm9pZCBhZGQoY29uc3QgQ3VydmVQb2ludCAmcG9pbnQpIHsgbUN1cnZlUG9pbnRzLmFkZChwb2ludCk7IH0KKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihpbnQgaW5kZXhJblVpLCBpbnQgdm9sSW5kZXhNaW4sIGludCB2b2xJbmRleE1heCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKKworICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGRldmljZV9jYXRlZ29yeSBtRGV2aWNlQ2F0ZWdvcnk7CisgICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKK307CisKKy8vIFZvbHVtZSBDdXJ2ZXMgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgaW5kZXhlZCBieSBkZXZpY2UgY2F0ZWdvcnkKK2NsYXNzIFZvbHVtZUN1cnZlcyA6IHB1YmxpYyBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+LAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXMKK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVDdXJ2ZXMoaW50IGluZGV4TWluID0gMCwgaW50IGluZGV4TWF4ID0gMTAwKSA6CisgICAgICAgIG1JbmRleE1pbihpbmRleE1pbiksIG1JbmRleE1heChpbmRleE1heCksIG1TdHJlYW0oQVVESU9fU1RSRUFNX0RFRkFVTFQpCisgICAgeworICAgICAgICBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIDApOworICAgIH0KKyAgICBWb2x1bWVDdXJ2ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA6CisgICAgICAgIG1JbmRleE1pbihpbmRleE1pbiksIG1JbmRleE1heChpbmRleE1heCksIG1TdHJlYW0oc3RyZWFtKQorICAgIHsKKyAgICAgICAgYWRkQ3VycmVudFZvbHVtZUluZGV4KEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCAwKTsKKyAgICB9CisKKyAgICAvLyBPbmNlIFhNTCBoYXMgYmVlbiBwYXJzZWQsIG11c3QgYmUgY2FsbCBmaXJzdCB0byBzYW5pdHkgY2hlY2sgdGFibGUgYW5kIGluaXRpYWxpemUgaW5kZXhlcworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKKyAgICB7CisgICAgICAgIG1JbmRleE1pbiA9IGluZGV4TWluOworICAgICAgICBtSW5kZXhNYXggPSBpbmRleE1heDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHNwPFZvbHVtZUN1cnZlPiBnZXRDdXJ2ZXNGb3IoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbmRleE9mS2V5KGRldmljZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVGb3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCisgICAgICAgIGlmIChtSW5kZXhDdXIuZmluZChkZXZpY2UpID09IGVuZChtSW5kZXhDdXIpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmF0KGRldmljZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtQ2FuQmVNdXRlZDsgfQorICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KKyAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtSW5kZXhDdXJbZGV2aWNlXSA9IGluZGV4OworICAgIH0KKworICAgIGludCBnZXRWb2x1bWVJbmRleE1pbigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1pbjsgfQorCisgICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9CisKKyAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CisgICAgeworICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmZpbmQoZGV2aWNlKSAhPSBlbmQobUluZGV4Q3VyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzd2l0Y2hDdXJ2ZXNGcm9tKGNvbnN0IFZvbHVtZUN1cnZlcyAmcmVmZXJlbmNlQ3VydmVzKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByZWZlcmVuY2VDdXJ2ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMhIGRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCwgY2Fubm90IHN3aXRjaCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IGtleUF0KGluZGV4KTsKKyAgICAgICAgICAgIHNldFZvbHVtZUN1cnZlKGNhdCwgcmVmZXJlbmNlQ3VydmVzLmdldE9yaWdpblZvbHVtZUN1cnZlKGNhdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzd2l0Y2hDdXJ2ZXNGcm9tKCp0aGlzKTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gZ2V0T3JpZ2luVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAorICAgIHsKKyAgICAgICAgQUxPR19BU1NFUlQobU9yaWdpblZvbHVtZUN1cnZlcy5pbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkiKTsKKyAgICAgICAgcmV0dXJuIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMudmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnkpOworICAgIH0KKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSBmb3IgVm9sdW1lIEN1cnZlIik7CisgICAgICAgIHJlcGxhY2VWYWx1ZUZvcihkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgIH0KKworICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCisgICAgeworICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSB2b2x1bWVDdXJ2ZS0+Z2V0RGV2aWNlQ2F0ZWdvcnkoKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG9yaWdpbmFsIFZvbHVtZSBDdXJ2ZXMgcGVyIGRldmljZSBjYXRlZ29yeSBpbiBvcmRlciB0byBzd2l0Y2ggY3VydmVzLgorICAgICAgICAgICAgbU9yaWdpblZvbHVtZUN1cnZlcy5hZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICAgICAgICAgIHJldHVybiBLZXllZFZlY3Rvcjo6YWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0CisgICAgeworICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKKyAgICAgICAgaWYgKHZjICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOworICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+IG1PcmlnaW5Wb2x1bWVDdXJ2ZXM7CisgICAgc3RkOjptYXA8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLworICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KKyAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCisgICAgY29uc3QgYm9vbCBtQ2FuQmVNdXRlZCA9IHRydWU7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KKworICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgLyoqPCBLZWVwIGl0IGZvciBsZWdhY3kuICovCit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmFiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9CYXNlIgorI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKKyNpbmNsdWRlICJFbmdpbmVEZWZhdWx0Q29uZmlnLmgiCisjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwordm9pZCBFbmdpbmVCYXNlOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCit7CisgICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKKyAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBudWxscHRyKT8gTk9fRVJST1IgOiBOT19JTklUOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworCisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fU1RSRUFNX0RUTUYpOworICAgIH0gZWxzZSBpZiAoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgIWlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgRW5naW5lQmFzZTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQorCitlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIGxvYWRQcm9kdWN0U3RyYXRlZ2llcyA9CisgICAgICAgICAgICBbXShhdXRvJiBzdHJhdGVneUNvbmZpZ3MsIGF1dG8mIHByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIHVpbnQzMl90IGdyb3VwaWQgPSAwOworICAgICAgICBmb3IgKGF1dG8mIHN0cmF0ZWd5Q29uZmlnIDogc3RyYXRlZ3lDb25maWdzKSB7CisgICAgICAgICAgICBzcDxQcm9kdWN0U3RyYXRlZ3k+IHN0cmF0ZWd5ID0gbmV3IFByb2R1Y3RTdHJhdGVneShzdHJhdGVneUNvbmZpZy5uYW1lKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ3JvdXAgOiBzdHJhdGVneUNvbmZpZy5hdHRyaWJ1dGVzR3JvdXBzKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogZ3JvdXAuYXR0cmlidXRlc1ZlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ktPmFkZEF0dHJpYnV0ZXMoe2dyb3VwLnN0cmVhbSwgZ3JvdXBpZCwgYXR0cn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cGlkICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lJZCA9IHN0cmF0ZWd5LT5nZXRJZCgpOworICAgICAgICAgICAgcHJvZHVjdFN0cmF0ZWdpZXNbc3RyYXRlZ3lJZF0gPSBzdHJhdGVneTsKKyAgICAgICAgfQorICAgIH07CisgICAgYXV0byBsb2FkVm9sdW1lQ3VydmVzID0gW10oY29uc3QgYXV0byAmY29uZmlnVm9sdW1lcywgYXV0byAmc3RyZWFtVm9sdW1lQ29sbGVjdGlvbikgeworICAgICAgICBmb3IgKGF1dG8gJmNvbmZpZ1ZvbHVtZSA6IGNvbmZpZ1ZvbHVtZXMpIHsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICAgICAgaWYgKGNvbmZpZ1ZvbHVtZS5zdHJlYW0uZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICAgICAhU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb25maWdWb2x1bWUuc3RyZWFtLCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdHJlYW0gdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWb2x1bWVDdXJ2ZXMgdm9sdW1lQ3VydmVzKHN0cmVhbVR5cGUsIGNvbmZpZ1ZvbHVtZS5pbmRleE1pbiwgY29uZmlnVm9sdW1lLmluZGV4TWF4KTsKKyAgICAgICAgICAgIGZvciAoYXV0byAmY29uZmlnQ3VydmUgOiBjb25maWdWb2x1bWUudm9sdW1lQ3VydmVzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb25maWdDdXJ2ZS5kZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUNhdGVnb3J5KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0N1cnZlLmRldmljZUNhdGVnb3J5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IGN1cnZlID0gbmV3IFZvbHVtZUN1cnZlKGRldmljZUNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gJnBvaW50IDogY29uZmlnQ3VydmUuY3VydmVQb2ludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VydmUtPmFkZCh7cG9pbnQuaW5kZXgsIHBvaW50LmF0dGVudWF0aW9uSW5NYn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2x1bWVDdXJ2ZXMuYWRkKGN1cnZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbVZvbHVtZUNvbGxlY3Rpb24uYWRkKHZvbHVtZUN1cnZlcywgc3RyZWFtVHlwZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgYXV0byByZXN1bHQgPSBlbmdpbmVDb25maWc6OnBhcnNlKCk7CisgICAgaWYgKHJlc3VsdC5wYXJzZWRDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQsIHVzaW5nIGRlZmF1bHQgbWF0Y2hpbmcgcGhvbmUgZXhwZXJpZW5jZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBlbmdpbmVDb25maWc6OkNvbmZpZyBjb25maWcgPSBnRGVmYXVsdEVuZ2luZUNvbmZpZzsKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmV0ID0gZW5naW5lQ29uZmlnOjpwYXJzZUxlZ2FjeVZvbHVtZXMoY29uZmlnLnZvbHVtZUdyb3Vwcyk7CisgICAgICAgIHJlc3VsdCA9IHtzdGQ6Om1ha2VfdW5pcXVlPGVuZ2luZUNvbmZpZzo6Q29uZmlnPihjb25maWcpLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQgPT0gTk9fRVJST1IgPyAwIDogMSl9OworICAgIH0KKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAic2tpcHBlZCAlenUgZWxlbWVudHMiLCByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisgICAgbG9hZFByb2R1Y3RTdHJhdGVnaWVzKHJlc3VsdC5wYXJzZWRDb25maWctPnByb2R1Y3RTdHJhdGVnaWVzLCBtUHJvZHVjdFN0cmF0ZWdpZXMpOworICAgIGxvYWRWb2x1bWVDdXJ2ZXMocmVzdWx0LnBhcnNlZENvbmZpZy0+dm9sdW1lR3JvdXBzLCBtU3RyZWFtVm9sdW1lQ3VydmVzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJhdGVneVZlY3RvciBFbmdpbmVCYXNlOjpnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdAoreworICAgIGF1dG8gZmluZEJ5RmxhZyA9IFtdKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVnaWVzLCBhdXRvIGZsYWcpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihwcm9kdWN0U3RyYXRlZ2llcyksIGVuZChwcm9kdWN0U3RyYXRlZ2llcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IGF1dG8gJnN0cmF0ZWd5KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBzdHJhdGVneS5zZWNvbmQtPmdldEF1ZGlvQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgZmxhZykgPT0gZmxhZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOworICAgIH07CisgICAgYXV0byBzdHJhdGVnaWVzID0gbVByb2R1Y3RTdHJhdGVnaWVzOworICAgIGF1dG8gZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyID0gZmluZEJ5RmxhZyhzdHJhdGVnaWVzLCBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpOworCisgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEICYmCisgICAgICAgICAgICBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXIgIT0gc3RyYXRlZ2llcy5lbmQoKSkgeworICAgICAgICBhdXRvIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5ID0gKmVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlcjsKKyAgICAgICAgc3RyYXRlZ2llcy5lcmFzZShlbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXIpOworICAgICAgICBzdHJhdGVnaWVzLmluc2VydChiZWdpbihzdHJhdGVnaWVzKSwgZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3kpOworICAgIH0KKyAgICBTdHJhdGVneVZlY3RvciBvcmRlcmVkU3RyYXRlZ2llczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBzdHJhdGVnaWVzKSB7CisgICAgICAgIG9yZGVyZWRTdHJhdGVnaWVzLnB1c2hfYmFjayhpdGVyLnNlY29uZC0+Z2V0SWQoKSk7CisgICAgfQorICAgIHJldHVybiBvcmRlcmVkU3RyYXRlZ2llczsKK30KKworU3RyZWFtVHlwZVZlY3RvciBFbmdpbmVCYXNlOjpnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgLy8gQFRPRE8gZGVmYXVsdCBtdXNpYyBzdHJlYW0gdG8gY29udHJvbCB2b2x1bWUgaWYgbm8gZ3JvdXA/CisgICAgcmV0dXJuIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgIT0gZW5kKG1Qcm9kdWN0U3RyYXRlZ2llcykpID8KKyAgICAgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuYXQocHMpLT5nZXRTdXBwb3J0ZWRTdHJlYW1zKCkgOgorICAgICAgICAgICAgICAgIFN0cmVhbVR5cGVWZWN0b3IoQVVESU9fU1RSRUFNX01VU0lDKTsKK30KKworQXR0cmlidXRlc1ZlY3RvciBFbmdpbmVCYXNlOjpnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICByZXR1cm4gKG1Qcm9kdWN0U3RyYXRlZ2llcy5maW5kKHBzKSAhPSBlbmQobVByb2R1Y3RTdHJhdGVnaWVzKSkgPworICAgICAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5hdChwcyktPmdldEF1ZGlvQXR0cmlidXRlcygpIDogQXR0cmlidXRlc1ZlY3RvcigpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKAorICAgICAgICB7cHJvZHVjdFN0cmF0ZWd5LT5nZXROYW1lKCksIHByb2R1Y3RTdHJhdGVneS0+bGlzdEF1ZGlvQXR0cmlidXRlcygpLAorICAgICAgICAgcHJvZHVjdFN0cmF0ZWd5LT5nZXRJZCgpfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKK3sKKyAgICByZXR1cm4gJm1TdHJlYW1Wb2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtKGdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpKTsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHJldHVybiAmbVN0cmVhbVZvbHVtZUN1cnZlcy5nZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQoreworICAgIHJldHVybiBtU3RyZWFtVm9sdW1lQ3VydmVzLnN3aXRjaFZvbHVtZUN1cnZlKHN0cmVhbVNyYywgc3RyZWFtRHN0KTs7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICByZXR1cm4gbVN0cmVhbVZvbHVtZUN1cnZlcy5yZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoc3RyZWFtKTsKK30KKwordm9pZCBFbmdpbmVCYXNlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuZHVtcChkc3QsIDIpOworICAgIG1TdHJlYW1Wb2x1bWVDdXJ2ZXMuZHVtcChkc3QsIDIpOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY0MmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLyoqCisgKiBAYnJpZWYgQXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyBoYXJkIGNvZGVkIGFycmF5IG9mIHN0cmF0ZWdpZXMgdG8gZmlsbCBuZXcgZW5naW5lIEFQSSBjb250cmFjdC4KKyAqLworY29uc3QgZW5naW5lQ29uZmlnOjpQcm9kdWN0U3RyYXRlZ2llcyBnT3JkZXJlZFN0cmF0ZWdpZXMgPSB7CisgICAgeyJTVFJBVEVHWV9QSE9ORSIsCisgICAgIHsKKyAgICAgICAgIHsicGhvbmUiLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwKKyAgICAgICAgICAgICIifX0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzY28iLCBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19TQ08sCisgICAgICAgICAgICAiIn19LAorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9TT05JRklDQVRJT04iLAorICAgICB7CisgICAgICAgICB7InJpbmciLCBBVURJT19TVFJFQU1fUklORywKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0sCisgICAgICAgICB7ImFsYXJtIiwgQVVESU9fU1RSRUFNX0FMQVJNLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FMQVJNLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fSwKKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfQUNDRVNTSUJJTElUWSIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9NRURJQSIsCisgICAgIHsKKyAgICAgICAgIHsibXVzaWMiLCBBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzeXN0ZW0iLCBBVURJT19TVFJFQU1fU1lTVEVNLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfRFRNRiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0RUTUYsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1RUUywKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfQkVBQ09OLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1JFUk9VVElORyIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1JFUk9VVElORywKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9QQVRDSCIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1BBVENILAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfQorfTsKKworY29uc3QgZW5naW5lQ29uZmlnOjpDb25maWcgZ0RlZmF1bHRFbmdpbmVDb25maWcgPSB7CisgICAgMS4wLAorICAgIGdPcmRlcmVkU3RyYXRlZ2llcywKKyAgICB7fSwKKyAgICB7fSwKKyAgICB7fQorfTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjA3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1Byb2R1Y3RTdHJhdGVneSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlByb2R1Y3RTdHJhdGVneS5oIgorCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1Byb2R1Y3RTdHJhdGVneTo6UHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSA6CisgICAgbU5hbWUobmFtZSksCisgICAgbUlkKHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4oSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90Pjo6Z2V0TmV4dEhhbmRsZSgpKSkKK3sKK30KKwordm9pZCBQcm9kdWN0U3RyYXRlZ3k6OmFkZEF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhdWRpb0F0dHJpYnV0ZXMpCit7CisgICAgbUF0dHJpYnV0ZXNWZWN0b3IucHVzaF9iYWNrKGF1ZGlvQXR0cmlidXRlcyk7Cit9CisKK3N0ZDo6dmVjdG9yPGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcz4gUHJvZHVjdFN0cmF0ZWd5OjpsaXN0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QKK3sKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IGFuZHJvaWRBYTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBhbmRyb2lkQWEucHVzaF9iYWNrKHthdHRyLm1Hcm91cElkLCBhdHRyLm1TdHJlYW0sIGF0dHIubUF0dHJpYnV0ZXN9KTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWRBYTsKK30KKworQXR0cmlidXRlc1ZlY3RvciBQcm9kdWN0U3RyYXRlZ3k6OmdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0Cit7CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ckdyb3VwIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgYXR0clZlY3Rvci5wdXNoX2JhY2soYXR0ckdyb3VwLm1BdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgaWYgKG5vdCBhdHRyVmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJWZWN0b3I7CisgICAgfQorICAgIHJldHVybiB7IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIgfTsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6Om1hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsKKyAgICB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IFByb2R1Y3RTdHJhdGVneTo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYXR0cl0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKHN1cHBvcnRlZEF0dHIubUF0dHJpYnV0ZXMsIGF0dHIpOyB9KTsKKyAgICByZXR1cm4gaXRlciAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpID8gaXRlci0+bVN0cmVhbSA6IEFVRElPX1NUUkVBTV9ERUZBVUxUOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtVHlwZTsgfSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1BdHRyaWJ1dGVzIDogQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OmlzRGVmYXVsdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksIFtdKGNvbnN0IGF1dG8gJmF0dHIpIHsKKyAgICAgICAgcmV0dXJuIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHI7IH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgUHJvZHVjdFN0cmF0ZWd5OjpnZXRTdXBwb3J0ZWRTdHJlYW1zKCkgY29uc3QKK3sKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzdHJlYW1zKSwgZW5kKHN0cmVhbXMpLCBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0pID09IGVuZChzdHJlYW1zKSAmJgorICAgICAgICAgICAgICAgIHN1cHBvcnRlZEF0dHIubVN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soc3VwcG9ydGVkQXR0ci5tU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyZWFtczsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OnN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmVhbVR5cGVdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW1UeXBlOyB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOworICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7CisgICAgaWYgKCFPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKG1BcHBsaWNhYmxlRGV2aWNlcywgZGV2aWNlTGl0ZXJhbCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBkZXZpY2UgJWQiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlRGV2aWNlcyk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHt0eXBlOiVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpdGVyYWwuY19zdHIoKSwgbURldmljZUFkZHJlc3MuY19zdHIoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR3JvdXA6ICVkIHN0cmVhbTogJXNcbiIsIHNwYWNlcyArIDMsICIiLCBhdHRyLm1Hcm91cElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp0b1N0cmluZyhhdHRyLm1TdHJlYW0pLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIEF0dHJpYnV0ZXM6ICIsIHNwYWNlcyArIDMsICIiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXR0U3RyID0KKyAgICAgICAgICAgICAgICBhdHRyLm1BdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyID8gInsgQW55IH0iIDogYW5kcm9pZDo6dG9TdHJpbmcoYXR0ci5tQXR0cmlidXRlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlc1xuIiwgYXR0U3RyLmNfc3RyKCkpOworICAgIH0KK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+bWF0Y2hlcyhhdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gbWF0Y2hpbmcgcHJvZHVjdCBzdHJhdGVneSBmb3IgYXR0cmlidXRlcyAlcywgcmV0dXJuIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIGdldERlZmF1bHQoKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgY29uc3QgYXV0byBzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBpZiAoc3RyYXRlZ3ktPnN1cHBvcnRTdHJlYW1UeXBlKHN0cmVhbSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHN0cmVhbSAlcywgdXNpbmcgZGVmYXVsdCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiB7fTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBpdGVyLnNlY29uZC0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW07CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBhdHRyaWJ1dGVzICVzLCB1c2luZyBkZWZhdWx0IChha2EgTVVTSUMpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiAgQVVESU9fU1RSRUFNX01VU0lDOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZWZhdWx0KCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPmlzRGVmYXVsdCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHVzaW5nIGRlZmF1bHQgJXMiLCBfX0ZVTkNUSU9OX18sIGl0ZXIuc2Vjb25kLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBObyBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGlmIChmaW5kKHN0cmF0ZWd5KSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQiLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKVswXTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+c3VwcG9ydFN0cmVhbVR5cGUoc3RyZWFtKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3Igc3RyZWFtICVkLCB1c2luZyBkZWZhdWx0IiwgX19GVU5DVElPTl9fLCBzdHJlYW0pOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKKworYXVkaW9fZGV2aWNlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBpZiAoZmluZChzdHJhdGVneSkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5Iiwgc3RyYXRlZ3kpOworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGVmYXVsdFN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdChnZXREZWZhdWx0KCkpLT5nZXREZXZpY2VUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXREZXZpY2VUeXBlcygpOworfQorCitzdGQ6OnN0cmluZyBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzSWQpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQocHNJZCkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5IiwgcHNJZCk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0KGdldERlZmF1bHQoKSktPmdldERldmljZUFkZHJlc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIGF0KHBzSWQpLT5nZXREZXZpY2VBZGRyZXNzKCk7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5TWFwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZHVjdCBTdHJhdGVnaWVzIGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaXRlci5zZWNvbmQtPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvU3RyZWFtVm9sdW1lQ3VydmVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1N0cmVhbVZvbHVtZUN1cnZlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzYjAwMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1N0cmVhbVZvbHVtZUN1cnZlcy5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpFbmdpbmU6OlN0cmVhbVZvbHVtZUN1cnZlcyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlN0cmVhbVZvbHVtZUN1cnZlcy5oIgorI2luY2x1ZGUgPFR5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIFN0cmVhbVZvbHVtZUN1cnZlczo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgaWYgKG1DdXJ2ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1N0cmVhbXMgZHVtcDpcbiIsIHNwYWNlcywgIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAgICIlKnNTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iLCBzcGFjZXMgKyAyLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW1DdXJ2ZSA6IG1DdXJ2ZXMpIHsKKyAgICAgICAgc3RyZWFtQ3VydmUuc2Vjb25kLmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBmYWxzZSk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1ZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtQ3VydmUgOiBtQ3VydmVzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOworICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhzdHJlYW1DdXJ2ZS5maXJzdCwgc3RyZWFtVHlwZUxpdGVyYWwpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIiAlcyAoJTAyZCk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBzdHJlYW1DdXJ2ZS5maXJzdCk7CisgICAgICAgIHN0cmVhbUN1cnZlLnNlY29uZC5kdW1wKGRzdCwgc3BhY2VzICsgMiwgdHJ1ZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyY2E3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Zsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOworCisgICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7CisgICAgICAgIC8vIGFuIGluZGV4IG9mIDAgbWVhbnMgbXV0ZSByZXF1ZXN0IHdoZW4gdm9sSW5kZXhNaW4gPiAwCisgICAgICAgIGlmIChpbmRleEluVWkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlZPTFVNRSBmb3JjaW5nIG11dGUgZm9yIGluZGV4IDAgd2l0aCBtaW4gaW5kZXggJWQiLCB2b2xJbmRleE1pbik7CisgICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOworICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKKyAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OworICAgIH0KKworICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCisgICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OworICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOworCisgICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKKyAgICBzaXplX3QgaW5kZXhJblVpUG9zaXRpb24gPSBtQ3VydmVQb2ludHMub3JkZXJPZihDdXJ2ZVBvaW50KHZvbElkeCwgMCkpOworICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA+PSBuYkN1cnZlUG9pbnRzKSB7CisgICAgICAgIC8vdXNlIGxhc3QgcG9pbnQgb2YgdGFibGUKKyAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKKyAgICB9CisgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID09IDApIHsKKyAgICAgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uICE9IG1DdXJ2ZVBvaW50c1swXS5tSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOyAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1swXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOworICAgIH0KKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSArCisgICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSAqCisgICAgICAgICAgICAgICAgKCAoKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgLQorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSApOworCisgICAgQUxPR1YoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCisgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4LAorICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSwgZGVjaWJlbHMsCisgICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpOworCisgICAgcmV0dXJuIGRlY2liZWxzOworfQorCit2b2lkIFZvbHVtZUN1cnZlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3sKKyAgICBpZiAoIWN1cnZlUG9pbnRzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZHN0LT5hcHBlbmQoIiB7Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAoJTNkLCAlNWQpIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdChpID09IChtQ3VydmVQb2ludHMuc2l6ZSgpIC0gMSkgPyAiIH1cbiIgOiAiLCAiKTsKKyAgICB9Cit9CisKK3ZvaWQgVm9sdW1lQ3VydmVzOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3sKKyAgICBpZiAoIWN1cnZlUG9pbnRzKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlMDJkICAgICAgJXMgICAgICAgICAlMDNkICAgICAgICAlMDNkICAgICAgICAiLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtLCBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1JbmRleEN1cikgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlMDR4IDogJTAyZCwgIiwgc3BhY2VzLCAiIiwgcGFpci5maXJzdCwgcGFpci5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0TGl0ZXJhbDsKKyAgICAgICAgRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OnRvU3RyaW5nKGtleUF0KGkpLCBkZXZpY2VDYXRMaXRlcmFsKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyA6Iiwgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIHRydWUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjkyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tcG9uZW50IGJ1aWxkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTKSBcCisgICAgZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbgorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9FbmdpbmVDb25maWcuY3BwCisKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yIC1XZXh0cmEKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhbmRyb2lkaWN1IFwKKyAgICBsaWJ4bWwyIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJjdXRpbHMKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK0xPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9fc3lzdGVtX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODgxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworc3RydWN0IF94bWxOb2RlOworc3RydWN0IF94bWxEb2M7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbmdpbmVDb25maWcgeworCisvKiogRGVmYXVsdCBwYXRoIG9mIGF1ZGlvIHBvbGljeSB1c2FnZXMgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY29uc3RleHByIGNoYXIgREVGQVVMVF9QQVRIW10gPSAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCI7CisKKy8qKiBEaXJlY3RvcmllcyB3aGVyZSB0aGUgZWZmZWN0IGxpYnJhcmllcyB3aWxsIGJlIHNlYXJjaCBmb3IuICovCitjb25zdGV4cHIgY29uc3QgY2hhciogUE9MSUNZX1VTQUdFX0xJQlJBUllfUEFUSFtdID0geyIvb2RtL2V0Yy8iLCAiL3ZlbmRvci9ldGMvIiwgIi9zeXN0ZW0vZXRjLyJ9OworCit1c2luZyBBdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fYXR0cmlidXRlc190PjsKK3VzaW5nIFN0cmVhbVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdHJ1Y3QgQXR0cmlidXRlc0dyb3VwIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3Q7Cit9OworCit1c2luZyBBdHRyaWJ1dGVzR3JvdXBzID0gc3RkOjp2ZWN0b3I8QXR0cmlidXRlc0dyb3VwPjsKKworc3RydWN0IEN1cnZlUG9pbnQgeworICAgIGludCBpbmRleDsKKyAgICBpbnQgYXR0ZW51YXRpb25Jbk1iOworfTsKK3VzaW5nIEN1cnZlUG9pbnRzID0gc3RkOjp2ZWN0b3I8Q3VydmVQb2ludD47CisKK3N0cnVjdCBWb2x1bWVDdXJ2ZSB7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnk7CisgICAgQ3VydmVQb2ludHMgY3VydmVQb2ludHM7Cit9OwordXNpbmcgVm9sdW1lQ3VydmVzID0gc3RkOjp2ZWN0b3I8Vm9sdW1lQ3VydmU+OworCitzdHJ1Y3QgVm9sdW1lR3JvdXAgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtOworICAgIGludCBpbmRleE1pbjsKKyAgICBpbnQgaW5kZXhNYXg7CisgICAgVm9sdW1lQ3VydmVzIHZvbHVtZUN1cnZlczsKK307Cit1c2luZyBWb2x1bWVHcm91cHMgPSBzdGQ6OnZlY3RvcjxWb2x1bWVHcm91cD47CisKK3N0cnVjdCBQcm9kdWN0U3RyYXRlZ3kgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgQXR0cmlidXRlc0dyb3VwcyBhdHRyaWJ1dGVzR3JvdXBzOworfTsKKwordXNpbmcgUHJvZHVjdFN0cmF0ZWdpZXMgPSBzdGQ6OnZlY3RvcjxQcm9kdWN0U3RyYXRlZ3k+OworCit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OworCitzdHJ1Y3QgQ3JpdGVyaW9uVHlwZQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc0luY2x1c2l2ZTsKKyAgICBWYWx1ZVBhaXJzIHZhbHVlUGFpcnM7Cit9OworCit1c2luZyBDcml0ZXJpb25UeXBlcyA9IHN0ZDo6dmVjdG9yPENyaXRlcmlvblR5cGU+OworCitzdHJ1Y3QgQ3JpdGVyaW9uCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0TGl0ZXJhbFZhbHVlOworfTsKKwordXNpbmcgQ3JpdGVyaWEgPSBzdGQ6OnZlY3RvcjxDcml0ZXJpb24+OworCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIFByb2R1Y3RTdHJhdGVnaWVzIHByb2R1Y3RTdHJhdGVnaWVzOworICAgIENyaXRlcmlhIGNyaXRlcmlhOworICAgIENyaXRlcmlvblR5cGVzIGNyaXRlcmlvblR5cGVzOworICAgIFZvbHVtZUdyb3VwcyB2b2x1bWVHcm91cHM7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIHByb2R1Y3Qgc3RyYXRlZ2llcworfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgYXVkaW8gcG9saWN5IHVzYWdlIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJuIGF1ZGlvIHBvbGljeSB1c2FnZSBAc2VlIENvbmZpZworICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKTsKKworfSAvLyBuYW1lc3BhY2UgZW5naW5lQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZiYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Db25maWciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJFbmdpbmVDb25maWcuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK25hbWVzcGFjZSBlbmdpbmVDb25maWcgeworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmdWZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VFbGVtZW50TmFtZSA9ICJyZWZlcmVuY2UiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lID0gIm5hbWUiOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEJhc2VTZXJpYWxpemVyVHJhaXRzIHsKKyAgICB0eXBlZGVmIEUgRWxlbWVudDsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworfTsKKworc3RydWN0IEF0dHJpYnV0ZXNHcm91cFRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxBdHRyaWJ1dGVzR3JvdXAsIEF0dHJpYnV0ZXNHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJBdHRyaWJ1dGVzR3JvdXAiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJBdHRyaWJ1dGVzR3JvdXBzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbVR5cGUgPSAic3RyZWFtVHlwZSI7CisgICAgfTsKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmcHMpOworfTsKKworc3RydWN0IFByb2R1Y3RTdHJhdGVneVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxQcm9kdWN0U3RyYXRlZ3ksIFByb2R1Y3RTdHJhdGVnaWVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiUHJvZHVjdFN0cmF0ZWd5IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiUHJvZHVjdFN0cmF0ZWdpZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgfTsKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmcHMpOworfTsKK3N0cnVjdCBWYWx1ZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWYWx1ZVBhaXIsIFZhbHVlUGFpcnM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2YWx1ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZhbHVlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbGl0ZXJhbCA9ICJsaXRlcmFsIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpudW1lcmljYWwgPSAibnVtZXJpY2FsIjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBDcml0ZXJpb25UeXBlVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPENyaXRlcmlvblR5cGUsIENyaXRlcmlvblR5cGVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiY3JpdGVyaW9uX3R5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJjcml0ZXJpb25fdHlwZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBDcml0ZXJpb25UcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Q3JpdGVyaW9uLCBDcml0ZXJpYT4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImNyaXRlcmlvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImNyaXRlcmlhIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbCA9ICJkZWZhdWx0IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBWb2x1bWVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Vm9sdW1lQ3VydmUsIFZvbHVtZUN1cnZlcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZvbHVtZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRldmljZUNhdGVnb3J5ID0gImRldmljZUNhdGVnb3J5IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2UgPSAicmVmIjsgLyoqPCBGb3Igdm9sdW1lIGN1cnZlcyBmYWN0b3JpemF0aW9uLiAqLworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZUdyb3VwVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZvbHVtZUdyb3VwLCBWb2x1bWVHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2b2x1bWVHcm91cCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZUdyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsgLy8gRm9yIGxlZ2FjeSB2b2x1bWUgY3VydmVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqaW5kZXhNaW4gPSAiaW5kZXhNaW4iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmluZGV4TWF4ID0gImluZGV4TWF4IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKKwordXNpbmcgeG1sQ2hhclVuaXF1ZSA9IHN0ZDo6dW5pcXVlX3B0cjx4bWxDaGFyLCBkZWNsdHlwZSh4bWxGcmVlKT47CisKK3VzaW5nIHhtbENoYXJVbmlxdWUgPSBzdGQ6OnVuaXF1ZV9wdHI8eG1sQ2hhciwgZGVjbHR5cGUoeG1sRnJlZSk+OworCitzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7CisgICAgeG1sQ2hhclVuaXF1ZSBjaGFyUHRyKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4oYXR0cmlidXRlKSksIHhtbEZyZWUpOworICAgIGlmIChjaGFyUHRyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB2YWx1ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihjaGFyUHRyLmdldCgpKSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBnZXRSZWZlcmVuY2UoY29uc3QgX3htbE5vZGUgKnJvb3QsIGNvbnN0IF94bWxOb2RlIComcmVmTm9kZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZykKK3sKKyAgICBmb3IgKHJvb3QgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IHJvb3QgIT0gTlVMTDsgcm9vdCA9IHJvb3QtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgZm9yICh4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWdSZWZlcmVuY2VFbGVtZW50TmFtZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZOYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5vZGUgPSBjdXI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+CitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmbmJTa2lwcGVkRWxlbWVudCkKK3sKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSAmJgorICAgICAgICAgICAgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXI7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjpkZXNlcmlhbGl6ZShkb2MsIGNoaWxkLCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG5iU2tpcHBlZEVsZW1lbnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYgPSAiYXR0cmlidXRlc1JlZiI7IC8qKjwgZm9yIGZhY3Rvcml6YXRpb24uICovCisKK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUF0dHJpYnV0ZXMoY29uc3QgX3htbE5vZGUgKmN1ciwgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKQoreworICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkNvbnRlbnRUeXBlIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworICAgICAgICAgICAgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGU7CisgICAgICAgICAgICBpZiAobm90IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoY29udGVudFR5cGVYbWwuY19zdHIoKSwgY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY29udGVudCB0eXBlICVzIiwgY29udGVudFR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICBBTE9HVigiJXMgY29udGVudCB0eXBlICVzIiwgIF9fRlVOQ1RJT05fXywgY29udGVudFR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlOworICAgICAgICAgICAgaWYgKG5vdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcodXNhZ2VYbWwuY19zdHIoKSwgdXNhZ2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdXNhZ2UgJXMiLCB1c2FnZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9IHVzYWdlOworICAgICAgICAgICAgQUxPR1YoIiVzIHVzYWdlICVzIiwgIF9fRlVOQ1RJT05fXywgdXNhZ2VYbWwuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiRmxhZ3MiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisKKyAgICAgICAgICAgIEFMT0dWKCIlcyBmbGFncyAlcyIsICBfX0ZVTkNUSU9OX18sIGZsYWdzLmNfc3RyKCkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5mbGFncyA9IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsICIgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBidW5kbGVLZXkgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAia2V5Iik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBidW5kbGVWYWx1ZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICBBTE9HVigiJXMgQnVuZGxlICVzICVzIiwgIF9fRlVOQ1RJT05fXywgYnVuZGxlS2V5LmNfc3RyKCksIGJ1bmRsZVZhbHVlLmNfc3RyKCkpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWdzKGJ1bmRsZUtleSArICI9IiArIGJ1bmRsZVZhbHVlKTsKKyAgICAgICAgICAgIHN0ZDo6c3RybmNweShhdHRyaWJ1dGVzLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdHRyaWJ1dGVzKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSB7CisgICAgLy8gUmV0cmlldmUgY29udGVudCB0eXBlLCB1c2FnZSwgZmxhZ3MsIGFuZCBidW5kbGUgZnJvbSB4bWwKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJBdHRyaWJ1dGVzIikpKSB7CisgICAgICAgICAgICBjb25zdCB4bWxOb2RlICphdHRyTm9kZSA9IGN1cjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGF0dHJSZWYgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBhdHRyaWJ1dGVzQXR0cmlidXRlUmVmKTsKKyAgICAgICAgICAgIGlmICghYXR0clJlZi5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVmZXJlbmNlKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyksIGF0dHJOb2RlLCBhdHRyUmVmLCBhdHRyaWJ1dGVzQXR0cmlidXRlUmVmKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ck5vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGF0dHJSZWYuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoZG9jLCBhdHRyTm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZUF0dHJpYnV0ZXMoYXR0ck5vZGUtPnhtbENoaWxkcmVuTm9kZSwgYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBdHRyaWJ1dGVzKGN1ciwgYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc1ZlY3RvciAmY29sbGVjdGlvbikKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBCQURfVkFMVUU7CisgICAgLy8gRWl0aGVyIHdlIGRvIHByb3ZpZGUgb25seSBvbmUgYXR0cmlidXRlcyBvciBhIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkNvbnRlbnRUeXBlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiRmxhZ3MiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkJ1bmRsZSIpKSkgeworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdHRyaWJ1dGVzKGRvYywgY3VyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2hfYmFjayhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZG9uZSBpZiB0aGUgIkF0dHJpYnV0ZXMiIGJhbGlzZSBpcyBvbWl0dGVkLCBvbmx5IG9uZSBBdHRyaWJ1dGVzIGlzIGFsbG93ZWQKKyAgICAgICAgICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgQXR0cmlidXRlc0dyb3VwVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmYXR0cmlidXRlc0dyb3VwKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZXNHcm91cFRyYWl0cyBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbVR5cGVYbWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICBpZiAobm90IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZVhtbC5jX3N0cigpLCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXMiLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCBjaGlsZCwgYXR0cmlidXRlc1ZlY3QpOworCisgICAgYXR0cmlidXRlc0dyb3VwLnB1c2hfYmFjayh7bmFtZSwgc3RyZWFtVHlwZSwgYXR0cmlidXRlc1ZlY3R9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFZhbHVlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsIENvbGxlY3Rpb24gJnZhbHVlcykKK3sKKyAgICBzdGQ6OnN0cmluZyBsaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICBpZiAobGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdWludDMyX3QgbnVtZXJpY2FsID0gMDsKKyAgICBzdGQ6OnN0cmluZyBudW1lcmljYWxUYWcgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om51bWVyaWNhbCk7CisgICAgaWYgKG51bWVyaWNhbFRhZy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFjb252ZXJ0VG8obnVtZXJpY2FsVGFnLCBudW1lcmljYWwpKSB7CisgICAgICAgIEFMT0dFKCIlczogOiBJbnZhbGlkIHZhbHVlKCVzKSIsIF9fRlVOQ1RJT05fXywgbnVtZXJpY2FsVGFnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB2YWx1ZXMucHVzaF9iYWNrKHtudW1lcmljYWwsIGxpdGVyYWx9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IENyaXRlcmlvblR5cGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY3JpdGVyaW9uVHlwZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgaWYgKHR5cGUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOworICAgIGJvb2wgaXNJbmNsdXNpdmUodHlwZSA9PSAiaW5jbHVzaXZlIik7CisKKyAgICBWYWx1ZVBhaXJzIHBhaXJzOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZhbHVlVHJhaXRzPihkb2MsIGNoaWxkLCBwYWlycywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGNyaXRlcmlvblR5cGVzLnB1c2hfYmFjayh7bmFtZSwgaXNJbmNsdXNpdmUsIHBhaXJzfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDcml0ZXJpb25UcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY3JpdGVyaWEpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCk7CisgICAgaWYgKGRlZmF1bHRWYWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIE5vdCBtYW5kYXRvcnkgdG8gcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUgZm9yIGEgY3JpdGVyaW9uLCBldmVuIGl0IGlzIHJlY29tbWFuZGVkLi4uCisgICAgICAgIEFMT0dWKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIChidXQgcmVjb21tYW5kZWQpIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsLCBkZWZhdWx0VmFsdWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgaWYgKHR5cGVOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOworCisgICAgY3JpdGVyaWEucHVzaF9iYWNrKHtuYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBQcm9kdWN0U3RyYXRlZ3lUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZzdHJhdGVnaWVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIlByb2R1Y3RTdHJhdGVneVRyYWl0cyBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc2l6ZV90IHNraXBwZWQgPSAwOworICAgIEF0dHJpYnV0ZXNHcm91cHMgYXR0ckdyb3VwczsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXR0cmlidXRlc0dyb3VwVHJhaXRzPihkb2MsIGNoaWxkLCBhdHRyR3JvdXBzLCBza2lwcGVkKTsKKworICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKHtuYW1lLCBhdHRyR3JvdXBzfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnkgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOworICAgIGlmIChkZXZpY2VDYXRlZ29yeS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7CisgICAgY29uc3QgX3htbE5vZGUgKnJlZiA9IE5VTEw7CisgICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgZ2V0UmVmZXJlbmNlKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyksIHJlZiwgcmVmZXJlbmNlTmFtZSwgY29sbGVjdGlvblRhZyk7CisgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUmV0cmlldmUgY3VydmUgcG9pbnQgZnJvbSByZWZlcmVuY2UgZWxlbWVudCBpZiBmb3VuZCBvciBkaXJlY3RseSBmcm9tIGN1cnJlbnQgY3VydmUKKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8KKyAgICAgICAgIHJvb3QtPnhtbENoaWxkcmVuTm9kZSA6IHJlZi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZvbHVtZVBvaW50VGFnKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBwb2ludFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChwb2ludFhtbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwb2ludDsKKyAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50Pj4oCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSksIHBvaW50LCAiLCIpOworICAgICAgICAgICAgaWYgKHBvaW50LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzOiAlcyIsIF9fZnVuY19fLCB2b2x1bWVQb2ludFRhZywKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoX2JhY2soe3BvaW50WzBdLCBwb2ludFsxXX0pOworICAgICAgICB9CisgICAgfQorICAgIHZvbHVtZXMucHVzaF9iYWNrKHsgZGV2aWNlQ2F0ZWdvcnksIGN1cnZlUG9pbnRzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVm9sdW1lR3JvdXBUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW0gPSB7fTsKKyAgICBpbnQgaW5kZXhNaW4gPSAwOworICAgIGludCBpbmRleE1heCA9IDA7CisKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6Om5hbWUpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIG5hbWVYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAobmFtZVhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihuYW1lWG1sLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilBdHRyaWJ1dGVzOjpzdHJlYW0pKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHN0cmVhbVhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1YbWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzdHJlYW1YbWwuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWluKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1pblhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1pblhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWluTGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1pblhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNaW5MaXRlcmFsLCBpbmRleE1pbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWF4KSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1heFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1heFhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWF4TGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1heFhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNYXhMaXRlcmFsLCBpbmRleE1heCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogZ3JvdXA9JXMgc3RyZWFtPSVzIGluZGV4TWluPSVkLCBpbmRleE1heD0lZCIsCisgICAgICAgICAgX19mdW5jX18sIG5hbWUuY19zdHIoKSwgc3RyZWFtLmNfc3RyKCksIGluZGV4TWluLCBpbmRleE1heCk7CisKKyAgICBWb2x1bWVDdXJ2ZXMgZ3JvdXBWb2x1bWVDdXJ2ZXM7CisgICAgc2l6ZV90IHNraXBwZWQgPSAwOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVUcmFpdHM+KGRvYywgcm9vdCwgZ3JvdXBWb2x1bWVDdXJ2ZXMsIHNraXBwZWQpOworICAgIHZvbHVtZXMucHVzaF9iYWNrKHsgbmFtZSwgc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgsIGdyb3VwVm9sdW1lQ3VydmVzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsZWdhY3lWb2x1bWVUYWcgPSAidm9sdW1lIjsKKworc3RhdHVzX3QgZGVzZXJpYWxpemVMZWdhY3lWb2x1bWUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZvbHVtZUN1cnZlcz4gJmxlZ2FjeVZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAic3RyZWFtIik7CisgICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgc3RyZWFtIGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAiZGV2aWNlQ2F0ZWdvcnkiKTsKKyAgICBpZiAoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgZGV2aWNlQ2F0ZWdvcnkgZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAicmVmIik7CisgICAgY29uc3QgeG1sTm9kZSAqcmVmID0gTlVMTDsKKyAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgcmVmLCByZWZlcmVuY2VOYW1lLCBsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlczogcmVmZXJlbmNlIGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8KKyAgICAgICAgIGN1ci0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZykpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgcG9pbnRYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAocG9pbnRYbWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19mdW5jX18sIGxlZ2FjeVZvbHVtZVRhZywKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvaW50OworICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQ+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19mdW5jX18sIFZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaF9iYWNrKHtwb2ludFswXSwgcG9pbnRbMV19KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsZWdhY3lWb2x1bWVzW3N0cmVhbVR5cGVMaXRlcmFsXS5wdXNoX2JhY2soeyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGN1cnZlUG9pbnRzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgJm5iU2tpcHBlZEVsZW1lbnQpCit7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZvbHVtZUN1cnZlcz4gbGVnYWN5Vm9sdW1lTWFwOworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopbGVnYWN5Vm9sdW1lY29sbGVjdGlvblRhZykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilsZWdhY3lWb2x1bWVUYWcpKSB7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZShkb2MsIGNoaWxkLCBsZWdhY3lWb2x1bWVNYXApOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJTa2lwcGVkRWxlbWVudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZU1hcEl0ZXIgOiBsZWdhY3lWb2x1bWVNYXApIHsKKyAgICAgICAgdm9sdW1lR3JvdXBzLnB1c2hfYmFjayh7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIHZvbHVtZU1hcEl0ZXIuZmlyc3QsIDAsIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZU1hcEl0ZXIuc2Vjb25kIH0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIHhtbERvY1B0ciBkb2M7CisgICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGlmIChkb2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2U6IGVtcHR5IGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnVmVyc2lvbkF0dHJpYnV0ZSk7CisgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBjb25maWctPnZlcnNpb24gPSBzdGQ6OnN0b2YodmVyc2lvbik7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFByb2R1Y3RTdHJhdGVneVRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Q3JpdGVyaW9uVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpYSwgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxDcml0ZXJpb25UeXBlVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpb25UeXBlcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVHcm91cFRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+dm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7CisKKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShjb25zdCBjaGFyKiBwYXRoLCBWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgeworICAgIHhtbERvY1B0ciBkb2M7CisgICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGlmIChkb2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2U6IGVtcHR5IGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihkb2MsIGN1ciwgdm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPSB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9zeXN0ZW0vZXRjIn07CitzdGF0aWMgY29uc3QgaW50IGtDb25maWdMb2NhdGlvbkxpc3RTaXplID0KKyAgICAgICAgKHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0KSAvIHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0WzBdKSk7CitzdGF0aWMgY29uc3QgaW50IGdBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aCA9IDEyODsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1YbWxDb25maWdGaWxlTmFtZSA9ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUgPQorICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCI7CisKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lcyhWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgeworICAgIGNoYXIgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlW2dBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aF07CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBmaWxlTmFtZXM7CisgICAgc3RhdHVzX3QgcmV0OworCisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSAmJgorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCisgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soYXBtQTJkcE9mZmxvYWREaXNhYmxlZFhtbENvbmZpZ0ZpbGVOYW1lKTsKKyAgICB9CisgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1YbWxDb25maWdGaWxlTmFtZSk7CisKKyAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldCA9IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHZvbHVtZUdyb3Vwcyk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWE0MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKaW5kZXggMDQ1OTRmNS4uYzllOTUwNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCkBAIC0xNyw3ICsxNyw5IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxJVm9sdW1lQ3VydmVzLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC0yOCw2ICszMCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIERldmljZVN0cmF0ZWd5TWFwID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBEZXZpY2VWZWN0b3I+OwordXNpbmcgU3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+OworCisKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCiAgKi8KQEAgLTUwLDQyICs1Niw2IEBACiAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikgPSAwOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBpbnB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gaW5wdXQgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZSB0byBnZXQgdGhlIHNlbGVjdGVkIGlucHV0IGRldmljZSBhc3NvY2lhdGVkIHRvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGlucHV0IGRldmljZSBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3V0cHV0IGRldmljZSBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmVhbSB0eXBlIGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgb3VwdXQgZGV2aWNlIGlzIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgb3VwdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3ksIG1heSBiZSBub25lIGlmIGVycm9yLgotICAgICAqLwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RhdGVneSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBmb3Igd2hpY2ggdGhlIHNlbGVjdGVkIHN0cmF0ZWd5IGZvbGxvd2VkIGJ5IGlzIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZSB0byBnZXQgdGhlIHNlbGVjdGVkIHN0cmF0ZWd5IGZvbGxvd2VkIGJ5LgotICAgICAqCi0gICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIFRlbGVwaG9ueSBNb2RlLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBtb2RlOiBBbmRyb2lkIFBob25lIHN0YXRlIChub3JtYWwsIHJpbmd0b25lLCBjc3YsIGluIGNvbW11bmljYXRpb24pCkBAIC0xMzMsNiArMTAzLDE1NSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkRldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBzZWxlY3RlZCBAcHJvZHVjdF9zdHJhdGVneV90IGZvbGxvd2VkIGJ5LgorICAgICAqCisgICAgICogQHJldHVybiBAcHJvZHVjdF9zdHJhdGVneV90IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4KKyAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIG9mIHRoZSBvdXRwdXQgcmVxdWVzdGluZyBEZXZpY2Uocykgc2VsZWN0aW9uCisgICAgICogQHBhcmFtIHByZWZlcmVkRGV2aWNlIHZhbGlkIHJlZmVyZW5jZSBpZiBhIHByZWZlcmVkIGRldmljZSBpcyByZXF1ZXN0ZWQsIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiB2ZWN0b3Igb2Ygc2VsZWN0ZWQgZGV2aWNlIGRlc2NyaXB0b3JzLgorICAgICAqICAgICAgICAgQXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gY3VycmVudCBwaG9uZSBzdGF0ZSwgZm9yY2VkIHN0YXRlcywgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgKiAgICAgICAgIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsCisgICAgICogICAgICAgICBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBUaGlzIGFsbG93cyB0bzoKKyAgICAgKiAgICAgIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAqICAgICAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICogICAgICAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICogICAgICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICogICAgICBiZWZvcmUgbWFuYWdlciB1cGRhdGVzIGl0cyBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIExlZ2FjeSBmdW5jdGlvbiByZXRyaWV2aW5nIGRldmljZXMgZnJvbSBhIHN0cmVhbSB0eXBlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSBvZiB0aGUgb3V0cHV0IHJlcXVlc3RpbmcgRGV2aWNlKHMpIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nCisgICAgICogICAgICAgICB0byBjdXJyZW50IHBob25lIHN0YXRlLCBmb3JjZWQgc3RhdGVzLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAqICAgICAgICAgaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwKKyAgICAgKiAgICAgICAgIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIFRoaXMgYWxsb3dzIHRvOgorICAgICAqICAgICAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICogICAgICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgKiAgICAgICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgKiAgICAgIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgKiAgICAgIGJlZm9yZSBtYW5hZ2VyIHVwZGF0ZXMgaXRzIG91dHB1dHMuCisgICAgICovCisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW1bb3V0XSBtaXggdG8gYmUgdXNlZCBpZiBhIG1peCBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgYXVkaW8gYXR0cmlidXRlcywgbWF5IGJlIG51bGwgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIEF1ZGlvTWl4ICoqbWl4ID0gbnVsbHB0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUgZm9yIGEgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXVkaW8gYXR0cmlidXRlcyB0byBnZXQgdGhlIGFzc29jaWF0ZWQgYXVkaW9fc3RyZWFtX3R5cGVfdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYXVkaW9fc3RyZWFtX3R5cGVfdCBhc3NvY2lhdGVkIHRvIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEF0dHJpYnV0ZXNGb3JTdHJlYW0gZ2V0IHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGZyb20gbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gYXVkaW8gYXR0cmlidXRlcyBtYXRjaGluZyB0aGUgbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgbGVnYWN5IHN0cmVhbSB0eXBlIGZvbGxvd2luZworICAgICAqIHRoZSBnaXZlbiBwcm9kdWN0IHN0cmF0ZWd5CisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIGFzc29jaWF0ZWQgbGVnYWN5IFN0cmVhbSBUeXBlcyB2ZWN0b3Igb2YgdGhlIGdpdmVuIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBwcm9kdWN0IHN0cmF0ZWd5LiBBbnkgYXR0cmlidXRlcyB0aGF0ICJtYXRjaGVzIiB3aXRoIHRoaXMgb25lIHdpbGwgZm9sbG93IHRoZSBwcm9kdWN0CisgICAgICogc3RyYXRlZ3kuCisgICAgICogIm1hdGNoaW5nIiBtZWFucyB0aGUgdXNhZ2Ugc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCB1c2FnZSwgQU5ECisgICAgICogY29udGVudCB0eXBlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgY29udGVudCB0eXBlIEFORAorICAgICAqIGZsYWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIGZsYWdzIEFORAorICAgICAqIHRhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgdGFncy4KKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHByb2R1Y3Qgc3RyYXRlZ3kgaWRzLCBlbXB0eSBpZiB1bmtub3duIHN0cmF0ZWd5LgorICAgICAqLworICAgIHZpcnR1YWwgQXR0cmlidXRlc1ZlY3RvciBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE9yZGVyZWRBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzCisgICAgICogQHJldHVybiBwcmlvcml0eSBvcmRlcmVkIHByb2R1Y3Qgc3RyYXRlZ2llcyB0byBoZWxwIHRoZSBBdWRpb1BvbGljeU1hbmFnZXIgZXZhbHVhdGluZyB0aGUKKyAgICAgKiBkZXZpY2Ugc2VsZWN0aW9uIHBlciBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0aXplZCBzdHJhdGVnaWVzLgorICAgICAqLworICAgIHZpcnR1YWwgU3RyYXRlZ3lWZWN0b3IgZ2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlLiBEZXZpY2Ugc2VsZWN0aW9uIGZvciBBdWRpb0F0dHJpYnV0ZSAvIFN0cmVhbXMgaXMgY2FjaGVkCisgICAgICogaW4gdGhlIGVuZ2luZSBpbiBvcmRlciB0byBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIGF1ZGlvIHN5c3RlbSBpcyBzdGFibGUuCisgICAgICogV2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSBhbmRyb2lkIG1vZGUgaXMgY2hhbmdlZCwgZW5naW5lIGlzIG5vdGlmaWVkIGFuZCBjYW4gdXBkYXRlCisgICAgICogdGhlIGNhY2hlLgorICAgICAqIFdoZW4gc3RhcnRpbmcgLyBzdG9wcGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uLCB0aGUgZW5naW5lCisgICAgICogbmVlZHMgdG8gdXBkYXRlIHRoZSBjYWNoZSB1cG9uIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMuIEludHJvc3BlY3Rpb24gQVBJIHRvIHJldHJpZXZlIGEgY29sbGVjdGlvbiBvZgorICAgICAqIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHRoYXQgYWxsb3dzIHRvIGJ1aWxkIEF1ZGlvQXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gYQorICAgICAqIHByb2R1Y3Rfc3RyYXRlZ3kgd2hpY2ggaXMganVzdCBhbiBpbmRleC4gSXQgaGFzIGFsc28gYSBodW1hbiByZWFkYWJsZSBuYW1lIHRvIGhlbHAgdGhlCisgICAgICogQ2FyL09lbS9BdWRpb01hbmFnZXIgaWRlbnRpeWluZyB0aGUgdXNlIGNhc2UuCisgICAgICogQHBhcmFtIHN0cmF0ZWdpZXMgY29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBsaXN0IGhhcyBiZWVuIHJldHJpZXZlZCwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgcmVxdWVzdGVkIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gSVZvbHVtZUN1cnZlcyBpbnRlcmZhY2UgcG9pbnRlciBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZSByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUgc3RyZWFtCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCA9IDA7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaAppbmRleCBiNzkwMmNmLi40M2JhNjI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCkBAIC0xNiw3ICsxNiw2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaD4KICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CkBAIC01MSw4ICs1MCw2IEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgPSAwOwotCiAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0ID0gMDsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawppbmRleCBjMjEwNWU5Li4yYjdlNGM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawpAQCAtMTEsMTQgKzExLDE1IEBACiAgICAgc3JjL0VuZ2luZS5jcHAgXAogICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAogICAgIHNyYy9TdHJlYW0uY3BwIFwKLSAgICBzcmMvU3RyYXRlZ3kuY3BwIFwKLSAgICBzcmMvVXNhZ2UuY3BwIFwKICAgICBzcmMvSW5wdXRTb3VyY2UuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgXAorICAgIC4uL2VuZ2luZS9jb21tb24vc3JjL1N0cmVhbVZvbHVtZUN1cnZlcy5jcHAgXAorICAgIC4uL2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAgXAorICAgIC4uL2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCiAKIGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uIDo9IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZQorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZQogCiBMT0NBTF9DRkxBR1MgKz0gXAogICAgIC1XYWxsIFwKQEAgLTMyLDggKzMzLDEyIEBACiAgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAogICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTQ1LDEzICs1MCwxNCBAQAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZyBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgXAogICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYnBhcmFtZXRlciBcCiAgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeSBcCiAgICAgbGlieG1sMgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDc2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDExNyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworUFJPVklTSU9OX0NSSVRFUklPTl9UWVBFUyA6PSAkKFRPT0xTKS9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIFRPUCBGSUxFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fcGhvbmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRV9TVEVNKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llc19waG9uZS54bWwgIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzX3Bob25lLnhtbAorTE9DQUxfTU9EVUxFX1NURU0gOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKKworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFVVE9NT1RJVkUgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fYXV0b21vdGl2ZS54bWwKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGF1dG9tb3RpdmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXNfYXV0b21vdGl2ZS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzX2F1dG9tb3RpdmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBhdXRvbW90aXZlLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gY29tbW9uLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKworQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9IHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpby1iYXNlLmgKK0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9jb21tb24vJChMT0NBTF9NT0RVTEUpLmluCisKK2luY2x1ZGUgJChQUk9WSVNJT05fQ1JJVEVSSU9OX1RZUEVTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZiMDJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPGNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTYxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisgICAgPCEtLSBPRU0gVXNhZ2VzIC0tPgorICAgIDwhLS0gcHJvZHVjdF9zdHJhdGVneSB3aWxsIGJlIGRlZmluZWQgYWNjb3JkaW5nIHRoaXMgb3JkZXIKKyAgICBwcm9kdWN0X3N0cmF0ZWd5IGlzIG9lbV90cmFmZmljX2Fub3VuY2VtZW50IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkIGZvcgorICAgIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgaW50IHR5cGUgPSAwOworICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9PRU1fVFlQRSwgMCk7CisgICAgfQorICAgIGlmKAorICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAoIGFhLm1Vc2FnZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFICkgJiYKKyAgICAoIHR5cGUgPT0gMSApICkKKyAgICAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ib2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPCEtLSAgdHJhZmZpY19hbm5vdWNlbWVudCA9IDEgLS0+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV9zdHJhdGVneV8xIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJvZW0iIHZhbHVlPSIyIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ib2VtX3N0cmF0ZWd5XzIiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIENhciBVc2FnZXMgLS0+CisgICAgPCEtLSBLZWVwIHRob3NlIGxpbmVzIG9ubHkgZm9yIGNhciAtLT4KKyAgICA8IS0tIENoZWNrIGNhciBjb25kaXRpb25zIGlmIGFueSBPRU0gY29uZGl0aW9ucyBtYXRjaGVkIC0tPgorICAgIDwhLS0gQXMgZGVmaW5lZCBieSBDYXJBdWRpb0F0dHJpYnV0ZXNVdGlsLmphdmEgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgcmFkaW8gaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgICAgIGludCB0eXBlID0gQ0FSX0FVRElPX1RZUEVfREVGQVVMVDsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9DQVJfQVVESU9fVFlQRSwgQ0FSX0FVRElPX1RZUEVfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoCisgICAgICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgICAgICggdHlwZSA9PSBDQVJfQVVESU9fVFlQRV9SQURJTyApICkKKyAgICAgICAgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyYWRpbyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9ImV4dF9hdWRpb19zb3VyY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjciLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jb21tYW5kIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfVk9JQ0VfQ09NTUFORCA9IDEgLS0+CisgICAgICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic2FmZXR5X2FsZXJ0Ij4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDwhLS0gIENBUl9BVURJT19UWVBFX1NBRkVUWV9BTEVSVCA9IDIgLS0+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIyIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBUbyBiZSBjaGVja2VkCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9CT1RUT00KKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0NBUl9QUk9YWQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfTUVESUFfTVVURQorICAgIC0tPgorCisgICAgPCEtLSBHZW5lcmljIFVzYWdlcyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im11c2ljIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8IS0tIERlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBoYXMgZW1wdHkgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im5hdl9ndWlkYW5jZSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NhbGwiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfU0NPIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJhbGFybSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyaW5nIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUklORyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJub3RpZmljYXRpb24iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic3lzdGVtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODJiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaWE+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXMiIHR5cGU9IklucHV0RGV2aWNlc01hc2tUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiB0eXBlPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IlRlbGVwaG9ueU1vZGUiIHR5cGU9IkFuZHJvaWRNb2RlVHlwZSIgZGVmYXVsdD0iTm9ybWFsIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIHR5cGU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JNZWRpYSIgdHlwZT0iRm9yY2VVc2VGb3JNZWRpYVR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmQiIHR5cGU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckRvY2siIHR5cGU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW0iIHR5cGU9IkZvcmNlVXNlRm9yU3lzdGVtVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgdHlwZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiB0eXBlPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIgdHlwZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorPC9jcml0ZXJpYT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNzM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaW9uX3R5cGVzPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJJbnB1dERldmljZXNNYXNrVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB0eXBlPSJpbmNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPCEtLSBsZWdhY3kgcmVtb3RlIHN1Ym1peCAtLT4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSIwIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkFuZHJvaWRNb2RlVHlwZSIgdHlwZT0iZXhjbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkJvb2xlYW5UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZhbHNlIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJUcnVlIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3BlYWtlciIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yTWVkaWFUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTcGVha2VyIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhlYWRwaG9uZXMiIG51bWVyaWNhbD0iMiIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRBMmRwIiBudW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9CdEEyZHAiIG51bWVyaWNhbD0iMTAiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmRUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0Q2FyRG9jayIgbnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdERlc2tEb2NrIiBudW1lcmljYWw9IjciLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvclN5c3RlbVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSIgPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMiIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyIiBudW1lcmljYWw9IjEzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMiIG51bWVyaWNhbD0iMTQiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0U2NvIiBudW1lcmljYWw9IjMiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKzwvY3JpdGVyaW9uX3R5cGVzPgorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNmRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBEZWZhdWx0IFZvbHVtZSBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gRnVsbCBEZWZhdWx0IFZvbHVtZSB0YWJsZSBmb3IgYWxsIGRldmljZSBjYXRlZ29yeSAtLT4KKzx2b2x1bWVzPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiPgorICAgICAgICA8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTk2MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgU3lzdGVtIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0yNDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xMjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtNjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgTWVkaWEgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIE1lZGlhIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDY4MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD40MiwtMjA3MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD44NSwtNTQwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgPCEtLSBOb24tbXV0YWJsZSBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogZmlyc3QgcG9pbnQgaXMgYWx3YXlzIGZvciBpbmRleCAwICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGF0dGVudWF0aW9uIGlzIHNtYWxsIGVub3VnaCB0aGF0IHN0cmVhbSBjYW4gc3RpbGwgYmUgaGVhcmQgLS0+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgICAgYmFzZWQgb24gREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSBmb3IgaGVhZHNldCAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgU3BlYWtlciBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorPC92b2x1bWVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyZTM3OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisKKyAgICA8IS0tICJoaWRkZW4gc3RyYXRlZ2llcyIgbGlrZSBUVFMsIGVuZm9yY2VkIGF1ZGlibGU6CisgICAgICAgICAgICBTaGFsbCB3ZSBleHBvc2UgdGhlbSBoZXJlIG9yIGtlZXAgaXQgaGFyZCBjb2RlZCAtLT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZm9yIGVuZm9yY2VkIHN5c3RlbSBzb3VuZHMgaW4gY2VydGFpbgorICAgICAgICAgY291bnRyaWVzIChlLmcuIGNhbWVyYSBpbiBKYXBhbikKKyAgICAgICAgIFRoaXMgc3RyYXRlZ3kgd2lsbCBvbmx5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gcGhvbmUgaWYgZm9yY2UgZm9yIHN5c3RlbSBpcyBzZXQgdG8KKyAgICAgICAgIGVuZm9yY2VkLiAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEhPTkUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUxBUk0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGV4Y2x1c2l2ZWx5IHRyYW5zbWl0dGVkIHRocm91Z2ggdGhlICBzcGVha2VyCisgICAgICAgICAoVFRTKSBvZiB0aGUgZGV2aWNlIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgcmVyb3V0aW5nIG1heSBiZSByZW1vdmVkIGFzIGZvbGxvd2luZyBtZWRpYT8/PyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1JFUk9VVElORyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QQVRDSCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1BBVENIIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwyMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFZvbHVtZSBzZWN0aW9uIGRlZmluZXMgYSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeS4KK0l0IGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yIGEgZ2l2ZW4KK3ZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwLgorPHZvbHVtZSBzdHJlYW094oCdQVVESU9fU1RSRUFNX01VU0lD4oCdIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI3MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtOTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX1NZU1RFTTwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC01MTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD41NywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI1MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50Pjg1LC0yMzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIxMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fUklORzwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fTVVTSUM8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MjU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fQUxBUk08L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX0RUTUY8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fVFRTPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8c3RyZWFtPkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8c3RyZWFtPkFVRElPX1NUUkVBTV9SRVJPVVRJTkc8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX1BBVENIPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaAppbmRleCBhNTk3ZTg3Li5lZmM2OWRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC0xOSwxMCArMTksOCBAQAogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlOwogY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogY2xhc3MgRW5naW5lOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKaW5kZXggMmUyOWE5Yi4uMWZjMjI2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMTYsMTAgKzE2LDExIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8RW5naW5lRGVmaW5pdGlvbi5oPgogI2luY2x1ZGUgPFZvbHVtZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtMzYsMTkgKzM3LDYgQEAKIHsKIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGUgZW5naW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmF0ZWd5IHRvIGFkZAotICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgotICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IGlkKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBBZGQgYSBzdHJlYW1zIHRvIHRoZSBlbmdpbmUuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmVhbSB0byBhZGQKQEAgLTYyLDE5ICs1MCw2IEBACiAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3QgaWQpID0gMDsKIAogICAgIC8qKgotICAgICAqIEFkZCBhIHVzYWdlIHRvIHRoZSBlbmdpbmUKLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgdXNhZ2UgdG8gYWRkCi0gICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCi0gICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdXNhZ2UgaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqLwotICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgaWQpID0gMDsKLQotICAgIC8qKgogICAgICAqIEFkZCBhbiBpbnB1dCBzb3VyY2UgdG8gdGhlIGVuZ2luZQogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgdG8gYWRkCkBAIC04OCwyNiArNjMsNiBAQAogICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IGlkKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRldmljZSB0byBiZSB1c2VkIGJ5IGEgc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5OiBuYW1lIG9mIHRoZSBzdHJhdGVneSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW06IG5hbWUgb2YgdGhlIHN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmF0ZWd5IHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJlYW0sIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgc3RyZWFtLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBzdHJlYW06IG5hbWUgb2YgdGhlIHN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0CkBAIC0xMTksMTYgKzc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHVzYWdlOiBuYW1lIG9mIHRoZSB1c2FnZSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiB1c2FnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHVzYWdlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgaW5wdXQgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYW4gaW5wdXQgc291cmNlLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZTogbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CkBAIC0xMzksNiArODQsMjIgQEAKICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBwcm9kdWN0IHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgcHJvZHVjdCBzdHJhdGVneSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsKaW5kZXggYmFhZWZkMi4uMDYwODMwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCkBAIC03LDE1NiArNywxNDYgQEAKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1pZmVxICgxLCAwKQotCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSBuby1pbnB1dF9jb25maWd1cmFibGUpKQorCiBQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCi1CVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5taworI0BUT0RPOiB1cHN0cmVhbSBuZXcgZG9tYWluIGdlbmVyYXRvcgorI0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFBGV19DT1JFKS9zdXBwb3J0L2FuZHJvaWQvYnVpbGRfcGZ3X3NldHRpbmdzLm1rCiBQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCiBQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKIAorVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENPTkZJR1VSQVRJT04gRklMRVMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIFBvbGljeSBQRlcgdG9wIGxldmVsIGZpbGUgIyMjIyMjIyMjCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yawogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKS5pbgogCisjIGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsgcHJldmVudHMgZnJvbSB1c2luZyBkZWJ1ZyBpbnRlcmZhY2UKIEFVRElPX1BBVFRFUk4gPSBAVFVOSU5HX0FMTE9XRURACi1pZmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorI2lmZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCiBBVURJT19WQUxVRSA9IGZhbHNlCi1lbHNlCi1BVURJT19WQUxVRSA9IHRydWUKLWVuZGlmCisjZWxzZQorI0FVRElPX1ZBTFVFID0gdHJ1ZQorI2VuZGlmCiAKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKExPQ0FMX01PRFVMRV9QQVRIKS8kKExPQ0FMX01PRFVMRSkKK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvJChMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCkvJChMT0NBTF9NT0RVTEUpCiAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIAotCi0jIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCi0gICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAotICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAotCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgQ29tbW9uIFN0cnVjdHVyZXMgIyMjIyMjIyMjCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CiBMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogCi0jIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Ci1MT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5Ci1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCi0gICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCi0gICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAotICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotCi1pZmVxICgkKHBmd19yZWJ1aWxkX3NldHRpbmdzKSx0cnVlKQotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0Ci1QRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwotCi1pbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotZWxzZQotIyBVc2UgdGhlIGV4aXN0aW5nIGZpbGUKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTZXR0aW5ncy8kKExPQ0FMX01PRFVMRV9TVEVNKQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZiAjIHBmd19yZWJ1aWxkX3NldHRpbmdzCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIEV4YW1wbGUgU3RydWN0dXJlcyAjIyMjIyMjIyMKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwuY29tbW9uCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCisgICAgbGlicG9saWN5LXN1YnN5c3RlbSBcCisKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCiAKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gT3V0cHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1vdXRwdXQKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9PdXRwdXREZXZpY2UueG1sCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5Ci1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCi0gICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCi0gICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAotICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbC5jb21tb24gXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKIAotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAogUEZXX0VERF9GSUxFUyA6PSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwogCiBpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSkKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gSW5wdXQgIyMjIyMjIyMjCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkKKwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kubm8taW5wdXQKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9JbnB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sLmNvbW1vbiBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAogCi1QRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi1QRldfQ1JJVEVSSUFfRklMRSA6PSAkKExPQ0FMX1BBVEgpL3BvbGljeV9jcml0ZXJpYS50eHQKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCiBQRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3NOb0lucHV0L2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvdm9sdW1lcy5wZncKIAogaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKIAotZW5kaWYgIyBpZmVxICgxLCAwKQorZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksbm8taW5wdXRfY29uZmlndXJhYmxlKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRhNThmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEBOT1RFOgorIyBBdWRpbyBQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYWJsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAorIworIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1BGV19DT1JFIDo9IGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoVE9PTFMpL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5taworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwuY2FyCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQcm9kdWN0U3RyYXRlZ2llcy54bWwuY2FyIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCisgICAgbGlicG9saWN5LXN1YnN5c3RlbQorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEVfU1RFTSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwuY2FyCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5LmNhcgorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKKworUEZXX0VERF9GSUxFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFBGV19FRERfRklMRVMpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwuY2FyIFwKKyAgICBQb2xpY3lDbGFzcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKKworUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK2luY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNzE3IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTEKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogT2VtU3RyYXRlZ3kyCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA4X09FTTEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDhfT0VNMQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzA5X09FTTIKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDlfT0VNMgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFZvaWNlQ29tbWFuZAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL2RldmljZV9hZGRyZXNzID0gQlVTMDJfVk9JQ0VfQ09NTUFORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBOYXZHdWlkYW5jZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAxX05BVl9HVUlEQU5DRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBWb2ljZUNhbGwKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9kZXZpY2VfYWRkcmVzcyA9IEJVUzA0X0NBTEwKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfQ0FMTAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IEFsYXJtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA1X0FMQVJNCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA1X0FMQVJNCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDNfQ0FMTF9SSU5HCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX0NBTExfUklORworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA2X05PVElGSUNBVElPTgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNl9OT1RJRklDQVRJT04KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTeXN0ZW0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vZGV2aWNlX2FkZHJlc3MgPSBCVVMwN19TWVNURU1fU09VTkQKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDdfU1lTVEVNX1NPVU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCisgICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIvPgorCisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1NZU1RFTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JJTkciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTVVTSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUxBUk0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIgorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9EVE1GIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9UVFMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUkVST1VUSU5HIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9QQVRDSCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9ERUZBVUxUIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX01JQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9DQU1DT1JERVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5wcm9jZXNzZWQiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0ZNX1RVTkVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9IT1RXT1JEIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgIDwvQ29tcG9uZW50TGlicmFyeT4KKworICAgIDxJbnN0YW5jZURlZmluaXRpb24+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InByb2R1Y3Rfc3RyYXRlZ2llcyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWdpZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JiYTAzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisKKyAgPENvbXBvbmVudFR5cGUgTmFtZT0iUHJvZHVjdFN0cmF0ZWdpZXMiIERlc2NyaXB0aW9uPSIiPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9Im9lbV9zdHJhdGVneV8xIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0ib2VtX3N0cmF0ZWd5XzIiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9InJhZGlvIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0iZXh0X2F1ZGlvX3NvdXJjZSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW1hbmQiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJzYWZldHlfYWxlcnQiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0ibmF2X2d1aWRhbmNlIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgppbmRleCBmNTYxNWNkLi5mODBhMDdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbgpAQCAtMSw2ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8UGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5IiBTZXJ2ZXJQb3J0PSI1MDE5IiBUdW5pbmdBbGxvd2VkPSJAVFVOSU5HX0FMTE9XRURAIj4KKyAgICBTeXN0ZW1DbGFzc05hbWU9IlBvbGljeSIgU2VydmVyUG9ydD0iL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIvcG9saWN5X2RlYnVnIgorICAgIFR1bmluZ0FsbG93ZWQ9IkBUVU5JTkdfQUxMT1dFREAiPgogCiAgICAgPFN1YnN5c3RlbVBsdWdpbnM+CiAgICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDk0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9jb25maWd1cmFibGUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMgUG9saWN5IFBGVyBTdHJ1Y3R1cmVzICMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sLnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIFwKKyAgICBQcm9kdWN0U3RyYXRlZ2llcy54bWwucGhvbmUgXAorICAgIFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIFwKKyAgICBsaWJwb2xpY3ktc3Vic3lzdGVtIFwKKworTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUHJvZHVjdFN0cmF0ZWdpZXMueG1sLnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQcm9kdWN0U3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5LnBob25lCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorCitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoUEZXX0VERF9GSUxFUykKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbC5waG9uZSBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCisKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTkzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKQEAgLTAsMCArMSw1OTYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisKKwlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKKwkJIworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKKwkJIworCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogRGV2aWNlCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAxCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdwpAQCAtMCwwICsxLDYyNSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ2llcworCXN1cERvbWFpbjogRHRtZgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXJXaGVuTm90SW5DYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpAQCAtMCwwICsxLDM2MSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKworCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCSMgbm8gZW5mb3JjZWRfYXVkaWJsZSBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQkjCisJCQkJIyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKwkJCQkjIGV4Y2VwdDoKKwkJCQkjICAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorCQkJCSMgICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JTeXN0ZW0gSXMgRm9yY2VTeXN0ZW1FbmZvcmNlZAorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQU5ZCisJCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNwZWFrZXIgaXMgYWxzbyB0aGUgZmFsbGJhY2sgZGV2aWNlIGlmIGFueSBvZiB0aGUgZGV2aWNlIGZyb20gRGV2aWNlMiBkb21haW4KKwkJCQkJIyBpcyBzZWxlY3RlZC4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JEZXZpY2UKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEhkbWkKKwkJCQkJCUFOWQorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJCQkJRm9yY2VVc2VGb3JEb2NrIElzTm90IEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IE5vRGV2aWNlCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQzNTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpAQCAtMCwwICsxLDM0MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IE1lZGlhCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTNkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3CkBAIC0wLDAgKzEsNDgzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGhvbmUKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCSMKKwkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQorCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbworCQkJCQkJIworCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIG9uIGRlZmF1bHQgb3V0cHV0IGRldmljZSB3aGljaCBjYW4gYmUgc3BlYWtlciBmb3IgZXhhbXBsZQorCQkJCSMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjRjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDQzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUmVyb3V0aW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmVyb3V0aW5nL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CkBAIC0wLDAgKzEsNDkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCQkJCQlidXMgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjbworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CkBAIC0wLDAgKzEsNTM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcnMKKworCQkJY29uZjogU3BlYWtlclNhZmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCisJCQkJIworCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKKwkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNzY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CkBAIC0wLDAgKzEsNDMgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdW5rbm93bi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2Y2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV91bmtub3duLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogVW5rbm93bgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy91bmtub3duL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Vua25vd24vZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1Y2UyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQcm9kdWN0U3RyYXRlZ2llcy54bWwiLz4KKworCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUEFUQ0giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfREVGQVVMVCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9NSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfQ0FNQ09SREVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZm1fdHVuZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9GTV9UVU5FUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfSE9UV09SRCIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwcm9kdWN0X3N0cmF0ZWdpZXMiIFR5cGU9IlByb2R1Y3RTdHJhdGVnaWVzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorCisgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iIj4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorCisgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKyAgICAgIDxDb21wb25lbnQgTmFtZT0icGhvbmUiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLz4KKworICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8+CisgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvPgorICA8L0NvbXBvbmVudFR5cGU+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKaW5kZXggYjQzZjgzYi4uMDcxMDQ0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKQEAgLTg0NzIsNyArODQ3Miw3IEBACiAgICAgPENvbmZpZ3VyYXRpb25zPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgotICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ1RvbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IlJpbmd0b25lIi8+CiAgICAgICAgIDwvQ29tcG91bmRSdWxlPgogICAgICAgPC9Db25maWd1cmF0aW9uPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUGhvbmUiPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTE5ODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKLQkJIwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKLQkJIwotCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCi0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzYzc0MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRHRtZgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYwotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNDYzMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCSMKLQkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotCQkJCSMgZXhjZXB0OgotCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0JCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCi0JCQkJCUFMTAotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBTlkKLQkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgotCQkJCQkjIGlzIHNlbGVjdGVkLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQotCQkJCQkJQU5ZCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBOb0RldmljZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjZhZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogTWVkaWEKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzcxYWQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogUGhvbmUKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZQotCQkJY29uZjogU2NvQ2Fya2l0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCSMKLQkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQotCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbwotCQkJCQkJIwotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBvbiBkZWZhdWx0IG91dHB1dCBkZXZpY2Ugd2hpY2ggY2FuIGJlIHNwZWFrZXIgZm9yIGV4YW1wbGUKLQkJCQkjCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNjJmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogUmVyb3V0aW5nCi0JCSMKLQkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5Ci0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQwZDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCBidXQgSERNSSBpcyBub3QgcmVhY2hhYmxlCi0JCQkJCSMKLQkJCQkJaGRtaSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IFNwZWFrZXIKLQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIEVORk9SQ0VEX0FVRElCTEUgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjczYzRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFNvbmlmaWNhdGlvblJlc3BlY3RmdWwKLQkJIwotCQkjIFNvbmlmaWNpYXRpb24gUmVzcGVjdGZ1bCBmb2xsb3dzOgotCQkjCS0gSWYgaW4gY2FsbDogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0IGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaW4gY2FsbCBhbHNvLi4uKQotCQkjCS0gSWYgbm90IGluIGNhbGwgQU5EIGEgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZSByZW1vdGVseTogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0Ci0JCSMgICAgIGZvbGxvd3MgZW5mb3JjZWQgYXVkaWJsZSwgd2hpY2ggZm9sbG93cyBtZWRpYSkKLQkJIwktIGlmIG5vdCBpbiBjYWxsIGFuZCBubyBtdXNpYyBzdHJlYW0gYWN0aXZlIHJlbW90ZWx5IGFuZCBtdXNpYyBzdHJlYW0gYWN0aXZlKTogc3RyYXRlZ3kKLQkJIyAgICAgbWVkaWEKLQkJIyAgIC0gT3RoZXJ3aXNlIGZvbGxvd3Mgc29uaWZpY2F0aW9uIGJ5IHJlcGxhY2luZyBzcGVha2VyIHdpdGggc3BlYWtlciBzYWZlIGlmIHNwZWFrZXIgaXMKLQkJIwkgIHNlbGVjdGVkLgotCQkjCi0JCSMgQ2FzZSBvZiBzdHJlYW0gYWN0aXZlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VycwotCi0JCQljb25mOiBTcGVha2VyU2FmZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlclNhZmUKLQkJCQkjCi0JCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCBhbmQgcmVwbGFjZSBzcGVha2VyIGJ5IHNwZWFrZXIgc2FmZQotCQkJCSMgaWYgYW5kIG9ubHkgaWYgc3BlYWtlciBvbmx5IHNlbGVjdGVkCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJCSMKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWMyMTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCi0JCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQwYjlkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotZG9tYWluOiBTdHJhdGVneUZvclN0cmVhbQotCi0JY29uZjogQ2FsaWJyYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkjCi0JCSMgTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotCQkjIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0JCSMKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGVuZm9yY2VkX2F1ZGlibGUKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSB0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5Ci0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSByZXJvdXRpbmcKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKaW5kZXggYjMxMTVlNy4uZmJlYTllMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CkBAIC0yNCw3ICsyNCw3IEBACiAJCQkjIEluIGNhc2Ugb2YgUmluZyBvciBBbGFybSBzdHJlYW0gdHlwZSBhY3RpdmUsIHN3aXRjaGluZyB0byBzb25pZmljYXRpb24KIAkJCSMgQHRvZG86IGhhbmRsZSB0aGlzIGR5bmFtaWMgY2FzZS4gQXMgYSBXQSwgdXNpbmcgUmluZ3RvbmUgbW9kZS4uLgogCQkJIwotCQkJVGVsZXBob255TW9kZSBJcyBSaW5nVG9uZQorCQkJVGVsZXBob255TW9kZSBJcyBSaW5ndG9uZQogCiAJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CmluZGV4IDkxN2Q0YTcuLmY5MjM2MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKQEAgLTksNyArOSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMzcsNyArMzcsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC05Myw3ICs5Myw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjA1LDcgKzIwNSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAppbmRleCA0NjFlNDRhLi41NmM1ZWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApAQCAtMzcsNiArMzcsMTAgQEAKICAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+CiAgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjIzIi8+CiAgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcm94eSIgU2l6ZT0iMSIgUG9zPSIyNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZWFyaW5nX2FpZCIgU2l6ZT0iMSIgUG9zPSIyNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlY2hvX2NhbmNlbGxlciIgU2l6ZT0iMSIgUG9zPSIyOCIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgpAQCAtNjcsNiArNzEsOSBAQAogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayIgU2l6ZT0iMSIgUG9zPSIxOCIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIxOSIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJveHkiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2JsZSIgU2l6ZT0iMSIgUG9zPSIyMyIvPgogICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgpAQCAtMTI2LDMwICsxMzMsNiBAQAogICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAotICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSBkZWZpbml0aW9uIGFzIGFuIGVudW1lcmF0aW9uLiBOdW1lcmljYWwgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmFsdWUKLSAgICAgICAgIG9mIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGluIHBvbGljeSBoZWFkZXIgZmlsZS4gLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3kiPgotICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtZWRpYSIgTnVtZXJpY2FsPSIwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBob25lIiBOdW1lcmljYWw9IjEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uIiBOdW1lcmljYWw9IjIiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIE51bWVyaWNhbD0iMyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjQiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI1Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgTnVtZXJpY2FsPSI2Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iNyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iOCIvPgotICAgICAgICA8L0VudW1QYXJhbWV0ZXI+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IlN0cmF0ZWd5OiclMSciPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgogCiAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVm9sdW1lUHJvZmlsZVR5cGUiPgpAQCAtMTcwLDI5ICsxNTMsMzAgQEAKICAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiLz4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iICBNYXBwaW5nPSJTdHJlYW0iPgogICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUiIFR5cGU9IlZvbHVtZVByb2ZpbGVUeXBlIgogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJWb2x1bWUgcHJvZmlsZSBmb2xsb3dlZCBieSBhIGdpdmVuIHN0cmVhbSB0eXBlLiIvPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIAogICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgogCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2UiPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfc3RyYXRlZ3kiIFR5cGU9IlN0cmF0ZWd5IiBNYXBwaW5nPSJVc2FnZTonJTEnIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQogICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZSI+CiAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UiIFR5cGU9IklucHV0RGV2aWNlc01hc2siCi0gICAgICAgICAgICAgICAgICAgTWFwcGluZz0iSW5wdXRTb3VyY2U6JyUxJyIgRGVzY3JpcHRpb249IlNlbGVjdGVkIElucHV0IGRldmljZSIvPgorICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+CiAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPRFVDVCBTVFJBVEVHWSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVneSIgTWFwcGluZz0iUHJvZHVjdFN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzZWxlY3RlZF9vdXRwdXRfZGV2aWNlcyIgVHlwZT0iT3V0cHV0RGV2aWNlc01hc2siLz4KKyAgICAgICAgPFN0cmluZ1BhcmFtZXRlciBOYW1lPSJkZXZpY2VfYWRkcmVzcyIgTWF4TGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249ImlmIGFueSwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBQUk9EVUNUIFNUUkFURUdZIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKwogPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAppbmRleCBhZDljMzU2Li5hNGU3NTM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApAQCAtMTEsMTIwICsxMSw1NCBAQAogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KIAotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iSWRlbnRpZmllciBtdXN0IG1hdGNoIHRoZSBlbnVtIHZhbHVlIHRvIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgYmV0d2VlbiB0aGUgUG9saWN5TWFuYWdlciBhbmQgUEZXIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBob25lIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOlBob25lLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb24sSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvblJlc3BlY3RmdWwsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlZEF1ZGlibGUsSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlcm91dGluZyxJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQogICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpWb2ljZUNhbGwsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06U3lzdGVtLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSaW5nLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06TXVzaWMsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpBbGFybSxJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpFbmZvcmNlQXVkaWJsZSxJZGVudGlmaWVyOjciCi0gICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06RHRtZixJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpUdHMsSWRlbnRpZmllcjo5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMCIKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSZXJvdXRpbmcsSWRlbnRpZmllcjoxMSIKKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlBhdGNoLElkZW50aWZpZXI6MTIiCisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1BBVENIIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KICAgICAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb191c2FnZV90IGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6VW5rbm93bixJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmciIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uU2lnbmFsbGluZyxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QWxhcm0sSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uVGVsZXBob255UmluZ3RvbmUsSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvblJlcXVlc3QsSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkluc3RhbnQsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkRlbGF0ZWQsSWRlbnRpZmllcjo5Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9ldmVudCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkV2ZW50LElkZW50aWZpZXI6MTAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VOYXZpZ2F0aW9uR3VpZGFuY2UsSWRlbnRpZmllcjoxMiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX3NvbmlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlU29uaWZpY2F0aW9uLElkZW50aWZpZXI6MTMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZ2FtZSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjoxNCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2aXJ0dWFsX3NvdXJjZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VmlydHVhbFNvdXJjZSxJZGVudGlmaWVyOjE1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFudCIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbnQsSWRlbnRpZmllcjoxNiIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KIAogICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6RGVmYXVsdCxJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOk1pYyxJZGVudGlmaWVyOjEiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0RFRkFVTFQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfTUlDIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlVXBsaW5rLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgogICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VEb3dubGluayxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDYWxsLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Q2FtY29yZGVyLElkZW50aWZpZXI6NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0NBTUNPUkRFUiIvPgogICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VSZWNvZ25pdGlvbixJZGVudGlmaWVyOjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVtb3RlU3VibWl4LElkZW50aWZpZXI6OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CiAgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlVucHJvY2Vzc2VkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KICAgICAgICAgPC9Db21wb25lbnRUeXBlPgogCiAgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CkBAIC0xMzMsOCArNjcsNiBAQAogCiAgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgogICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+CiAgICAgPC9JbnN0YW5jZURlZmluaXRpb24+CiA8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9wb2xpY3lfY3JpdGVyaWEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODBjYmUxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1FeGNsdXNpdmVDcml0ZXJpb24gVGVsZXBob255TW9kZSAgICAgICAgICAgICAgICA6ICAgTm9ybWFsICAgICAgICAgIFJpbmdUb25lICAgICAgICAgICAgICAgIEluQ2FsbCAgICAgICAgICAgICAgSW5Db21tdW5pY2F0aW9uCi1JbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlSW5wdXREZXZpY2VzICAgICAgICA6ICAgQ29tbXVuaWNhdGlvbiBBbWJpZW50IEJ1aWx0aW5NaWMgQmx1ZXRvb3RoU2NvSGVhZHNldCBXaXJlZEhlYWRzZXQgSGRtaSBUZWxlcGhvbnlSeCBCYWNrTWljIFJlbW90ZVN1Ym1peCBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgRm1UdW5lciBUdlR1bmVyIExpbmUgU3BkaWYgQmx1ZXRvb3RoQTJkcCBMb29wYmFjayBJcCBCdXMgU3R1YgotSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZU91dHB1dERldmljZXMgICAgICAgOiAgIEVhcnBpZWNlIFNwZWFrZXIgV2lyZWRTcGVha2VyIFdpcmVkSGVhZHNldCBXaXJlZEhlYWRwaG9uZSBCbHVldG9vdGhTY28gQmx1ZXRvb3RoU2NvSGVhZHNldCBCbHVldG9vdGhTY29DYXJraXQgQmx1ZXRvb3RoQTJkcCBCbHVldG9vdGhBMmRwSGVhZHBob25lcyBCbHVldG9vdGhBMmRwU3BlYWtlciBIZG1pIEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBSZW1vdGVTdWJtaXggVGVsZXBob255VHggTGluZSBIZG1pQXJjIFNwZGlmIEZtIEF1eExpbmUgU3BlYWtlclNhZmUgSXAgQnVzIFN0dWIKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyICAgICAgICAgICAgRm9yY2VCdFNjbwotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yTWVkaWEgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIJCQlGb3JjZUhlYWRwaG9uZXMgICAgICAgICBGb3JjZUJ0QTJkcCAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sgICAgRm9yY2VOb0J0QTJkcCAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JSZWNvcmQgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlQnRTY28gICAgICAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckRvY2sgICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSAgICAgRm9yY2VCdENhckRvY2sgICAgICBGb3JjZUJ0RGVza0RvY2sgICAgIEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JTeXN0ZW0gICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciAgIEZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCmluZGV4IDM1NTljZjEuLjY1ZGM5YWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCkBAIC04LDEwICs4LDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAgXAogICAgIFBvbGljeVN1YnN5c3RlbS5jcHAgXAotICAgIFN0cmF0ZWd5LmNwcCBcCiAgICAgSW5wdXRTb3VyY2UuY3BwIFwKICAgICBTdHJlYW0uY3BwIFwKLSAgICBVc2FnZS5jcHAKKyAgICBQcm9kdWN0U3RyYXRlZ3kuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSBcCiAgICAgLVdhbGwgXApAQCAtMjEsMTUgKzIwLDIwIEBACiAgICAgLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSAgXAogICAgIGxpYnBhcmFtZXRlciBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJsb2cgXAogCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9jbGllbnRfaGVhZGVycyBcCisgICAgbGliYmFzZV9oZWFkZXJzCisKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGZ3X3V0aWxpdHkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCmluZGV4IGVhYzRlZmUuLmY5MWY4ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCiAjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKICNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCkBAIC0zMyw5ICszNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAogICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKIHsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZShjb250ZXh0LmdldEl0ZW0oTWFwcGluZ0tleU5hbWUpKTsKKworICAgIGlmKG5vdCBhbmRyb2lkOjpTb3VyY2VUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKG5hbWUsIG1JZCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBJbnB1dCBTb3VyY2UgbmFtZTogJXMsIGludmFsaWQgWE1MIHN0cnVjdHVyZSBmaWxlIiwgbmFtZS5jX3N0cigpKTsKKyAgICB9CiAgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRJbnB1dFNvdXJjZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRJbnB1dFNvdXJjZShuYW1lLCBtSWQpOwogfQogCiBib29sIElucHV0U291cmNlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCmluZGV4IDk4ZDEwYTkuLmJmYzFiY2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCkBAIC0xNywxMCArMTcsOSBAQAogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgogI2luY2x1ZGUgIlN1YnN5c3RlbU9iamVjdEZhY3RvcnkuaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgIlByb2R1Y3RTdHJhdGVneS5oIgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzYsOSArMzUsOCBAQAogCiAKIGNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmVhbUNvbXBvbmVudE5hbWUgPSAiU3RyZWFtIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJTdHJhdGVneSI7CiBjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUgPSAiSW5wdXRTb3VyY2UiOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptVXNhZ2VDb21wb25lbnROYW1lID0gIlVzYWdlIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWUgPSAiUHJvZHVjdFN0cmF0ZWd5IjsKIAogUG9saWN5U3Vic3lzdGVtOjpQb2xpY3lTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvcmU6OmxvZzo6TG9nZ2VyICZsb2dnZXIpCiAgICAgOiBDU3Vic3lzdGVtKG5hbWUsIGxvZ2dlciksCkBAIC02NSwyMiArNjMsMTYgQEAKICAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAogICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8U3RyZWFtPigKICAgICAgICAgICAgIG1TdHJlYW1Db21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQotICAgICAgICApOwotICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCi0gICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJhdGVneT4oCi0gICAgICAgICAgICBtU3RyYXRlZ3lDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCi0gICAgICAgICk7Ci0gICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKLSAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFVzYWdlPigKLSAgICAgICAgICAgIG1Vc2FnZUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlOYW1lKSkKICAgICAgICAgKTsKICAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAogICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8SW5wdXRTb3VyY2U+KAogICAgICAgICAgICAgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxQcm9kdWN0U3RyYXRlZ3k+KAorICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWUsIDApCiAgICAgICAgICk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaAppbmRleCA4MjJlZWI5Li45YmYxYzIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCkBAIC01Myw3ICs1Myw2IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDM7IC8qKjwgYW1lbmQzIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtU3RyZWFtQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZTsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVVzYWdlQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI5ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQcm9kdWN0U3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnByb2R1Y3Rfc3RyYXRlZ3lfdDsKKworUHJvZHVjdFN0cmF0ZWd5OjpQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQoreworICAgIEFMT0dfQVNTRVJUKGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAhPSBudWxscHRyLCAiSW52YWxpZCBDb25maWd1cmFibGUgRWxlbWVudCIpOworICAgIG1Qb2xpY3lTdWJzeXN0ZW0gPSBzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSk7CisgICAgQUxPR19BU1NFUlQobVBvbGljeVN1YnN5c3RlbSAhPSBudWxscHRyLCAiSW52YWxpZCBQb2xpY3kgU3Vic3lzdGVtIik7CisKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlID0gbVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCk7CisgICAgQUxPR19BU1NFUlQobVBvbGljeVBsdWdpbkludGVyZmFjZSAhPSBudWxscHRyLCAiSW52YWxpZCBQb2xpY3kgUGx1Z2luIEludGVyZmFjZSIpOworCisgICAgc3RkOjpzdHJpbmcgbmFtZShpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldE5hbWUoKSk7CisgICAgbUlkID0gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKG5hbWUpOworCisgICAgQUxPR19BU1NFUlQobUlkICE9IFBST0RVQ1RfU1RSQVRFR1lfSU5WQUxJRCwgIlByb2R1Y3QgU3RyYXRlZ3kgJXMgbm90IGZvdW5kIiwgbmFtZS5jX3N0cigpKTsKKworICAgIEFMT0dFKCJQcm9kdWN0IFN0cmF0ZWd5ICVzIGFkZGVkIiwgbmFtZS5jX3N0cigpKTsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBEZXZpY2UgZGV2aWNlUGFyYW1zOworICAgIGJsYWNrYm9hcmRSZWFkKCZkZXZpY2VQYXJhbXMsIHNpemVvZihkZXZpY2VQYXJhbXMpKTsKKworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KG1JZCwgZGV2aWNlUGFyYW1zLmFwcGxpY2FibGVEZXZpY2UpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kobUlkLCBkZXZpY2VQYXJhbXMuZGV2aWNlQWRkcmVzcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjA4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFByb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Cit7Citwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBtTWF4U3RyaW5nU2l6ZSA9IDI1NzsgLyoqPCBtYXggc3RyaW5nIHNpemUgKHBsdXMgemVybyB0ZXJtaW5hbCkuICovCisKKyAgICBzdHJ1Y3QgRGV2aWNlCisgICAgeworICAgICAgICB1aW50MzJfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLworICAgICAgICBjaGFyIGRldmljZUFkZHJlc3NbbU1heFN0cmluZ1NpemVdOyAvKio8IGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmF0ZWd5LiAqLworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3B1YmxpYzoKKyAgICBQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAorICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIGFuZHJvaWQ6OnByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZjM2E4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCi0jaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwotCi1TdHJhdGVneTo6U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKLSAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAotICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKLXsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKLQotICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyYXRlZ3koZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Ci19Ci0KLWJvb2wgU3RyYXRlZ3k6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKLXsKLSAgICB1aW50MzJfdCBhcHBsaWNhYmxlT3V0cHV0RGV2aWNlOwotICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlT3V0cHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZU91dHB1dERldmljZSkpOwotICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VGb3JTdHJhdGVneShtSWQsIGFwcGxpY2FibGVPdXRwdXREZXZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyYjgyYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgotI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWNsYXNzIFBvbGljeVN1YnN5c3RlbTsKLQotY2xhc3MgU3RyYXRlZ3kgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAotewotcHVibGljOgotICAgIFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOwotCi1wcml2YXRlOgotICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgotICAgICAqLwotICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOwotCi0gICAgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneSBtSWQ7IC8qKjwgc3RyYXRlZ3kgaWRlbnRpZmllciB0byBsaW5rIHdpdGggYXVkaW8uaC4qLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKaW5kZXggYzY0MmEyMy4uNTIzMGUwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKQEAgLTE3LDkgKzE3LDkgQEAKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwogCiBTdHJlYW06OlN0cmVhbShjb25zdCBzdHJpbmcgJi8qbWFwcGluZ1ZhbHVlKi8sCiAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCkBAIC0yOSwxMCArMjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKICAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCiB7Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZShjb250ZXh0LmdldEl0ZW0oTWFwcGluZ0tleU5hbWUpKTsKKworICAgIGlmIChub3QgYW5kcm9pZDo6U3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhuYW1lLCBtSWQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgU3RyZWFtIHR5cGUgbmFtZTogJXMsIGludmFsaWQgWE1MIHN0cnVjdHVyZSBmaWxlIiwgbmFtZS5jX3N0cigpKTsKKyAgICB9CiAKICAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmVhbShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJlYW0obmFtZSwgbUlkKTsKIH0KIAogYm9vbCBTdHJlYW06OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKQEAgLTQwLDExICs0NCw4IEBACiAgICAgQXBwbGljYWJsZSBwYXJhbXM7CiAgICAgYmxhY2tib2FyZFJlYWQoJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOwogCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JTdHJlYW0obUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KHBhcmFtcy5zdHJhdGVneSkpOwotCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJhbXMudm9sdW1lUHJvZmlsZSkpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgbUlkLCBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJhbXMudm9sdW1lUHJvZmlsZSkpOwogCiAgICAgcmV0dXJuIHRydWU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaAppbmRleCA0YTg3NWRiLi5lMGNlMmZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCkBAIC0yOSw3ICsyOSw2IEBACiBwcml2YXRlOgogICAgIHN0cnVjdCBBcHBsaWNhYmxlCiAgICAgewotICAgICAgICB1aW50MzJfdCBzdHJhdGVneTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KICAgICAgICAgdWludDMyX3Qgdm9sdW1lUHJvZmlsZTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KICAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTlmOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJVc2FnZS5oIgotI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKLQotVXNhZ2U6OlVzYWdlKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsIGNvcmU6OmxvZzo6TG9nZ2VyICZsb2dnZXIpCi0gICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAotICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCi0gICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOwotCi0gICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRVc2FnZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKLX0KLQotYm9vbCBVc2FnZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQotewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKLSAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFN0cmF0ZWd5Rm9yVXNhZ2UobUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KGFwcGxpY2FibGVTdHJhdGVneSkpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwMjA0Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgotI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWNsYXNzIFBvbGljeVN1YnN5c3RlbTsKLQotY2xhc3MgVXNhZ2UgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAotewotcHVibGljOgotICAgIFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKLSAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOwotCi1wcml2YXRlOgotICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgotICAgICAqLwotICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOwotCi0gICAgYXVkaW9fdXNhZ2VfdCBtSWQ7IC8qKjwgdXNhZ2UgaWRlbnRpZmllciB0byBsaW5rIHdpdGggYXVkaW8uaC4gKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0MWQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZQpAQCAtMCwwICsxLDQgQEAKK3VzZXJkZWJ1Z19vcl9lbmcoYAorICBhbGxvdyBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcl9zb2NrZXQ6ZGlyIHJ3X2Rpcl9wZXJtczsKKyAgYWxsb3cgYXVkaW9zZXJ2ZXIgYXVkaW9zZXJ2ZXJfc29ja2V0OnNvY2tfZmlsZSBjcmVhdGVfZmlsZV9wZXJtczsKKycpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZS50ZSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjE5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZS50ZQpAQCAtMCwwICsxLDIgQEAKKyMgUG9saWN5IEVuZ2luZSByZW1vdGUgY29ubmVjdGlvbiBmb3IgcnVudGltZSBkZWJ1ZyBvZiBwYXJhbWV0ZXIgZnJhbWV3b3JrCit0eXBlIGF1ZGlvc2VydmVyX3NvY2tldCwgZmlsZV90eXBlLCBjb3JlZG9tYWluX3NvY2tldDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlX2NvbnRleHRzIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwZmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlX2NvbnRleHRzCkBAIC0wLDAgKzEgQEAKKy9kZXYvc29ja2V0L2F1ZGlvc2VydmVyKC8uKik/ICAgIHU6b2JqZWN0X3I6YXVkaW9zZXJ2ZXJfc29ja2V0OnMwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCmluZGV4IGI3MmRlZDguLjAyYjQxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCkBAIC0xOCw4ICsxOCw2IEBACiAKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0yOCwxMCArMjYsOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiAvKioKICAqIENvbGxlY3Rpb24gb2YgcG9saWN5IGVsZW1lbnQgYXMgYSBtYXAgaW5kZXhlZCB3aXRoIGEgdGhlaXIgVUlEIHR5cGUuCkBAIC0xNDksMTUgKzE0NSw5IEBACiB0ZW1wbGF0ZSA8Pgogc3RydWN0IENvbGxlY3Rpb248c3RkOjpzdHJpbmc+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwogdGVtcGxhdGUgPD4KLXN0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwotdGVtcGxhdGUgPD4KIHN0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKIAotdHlwZWRlZiBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5Q29sbGVjdGlvbjsKIHR5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PiBTdHJlYW1Db2xsZWN0aW9uOwotdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+IFVzYWdlQ29sbGVjdGlvbjsKIHR5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4gSW5wdXRTb3VyY2VDb2xsZWN0aW9uOwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKaW5kZXggNTJlNzdlNS4uOTc5NTBkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKQEAgLTIyLDEwICsyMiw4IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KIGNsYXNzIEVsZW1lbnQKQEAgLTY0LDcgKzYyLDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqCiAgICAgICogQHRwYXJhbSBQcm9wZXJ0eSBmb3Igd2hpY2ggdGhpcyBwb2xpY3kgZWxlbWVudCBoYXMgc2V0dGVyIC8gZ2V0dGVyLgpAQCAtNzUsNyArNzMsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKaW5kZXggMGQxOGZmYS4uODlhMTY5NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcApAQCAtMjUsOTIgKzI1LDYzIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgIkVuZ2luZS5oIgotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCiAjaW5jbHVkZSAiU3RyZWFtLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKLSNpbmNsdWRlICJVc2FnZS5oIgorCisjaW5jbHVkZSA8RW5naW5lQ29uZmlnLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6bWFwOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotdGVtcGxhdGUgPD4KLVN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkKLXsKLSAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKLX0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiB0ZW1wbGF0ZSA8PgogU3RyZWFtQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KCkKIHsKICAgICByZXR1cm4gbVN0cmVhbUNvbGxlY3Rpb247CiB9CiB0ZW1wbGF0ZSA8PgotVXNhZ2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4oKQotewotICAgIHJldHVybiBtVXNhZ2VDb2xsZWN0aW9uOwotfQotdGVtcGxhdGUgPD4KIElucHV0U291cmNlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PigpCiB7CiAgICAgcmV0dXJuIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247CiB9CiAKIHRlbXBsYXRlIDw+Ci1jb25zdCBTdHJhdGVneUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdHJhdGVneUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogY29uc3QgU3RyZWFtQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KCkgY29uc3QKIHsKICAgICByZXR1cm4gbVN0cmVhbUNvbGxlY3Rpb247CiB9CiB0ZW1wbGF0ZSA8PgotY29uc3QgVXNhZ2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4oKSBjb25zdAotewotICAgIHJldHVybiBtVXNhZ2VDb2xsZWN0aW9uOwotfQotdGVtcGxhdGUgPD4KIGNvbnN0IElucHV0U291cmNlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247CiB9CiAKLUVuZ2luZTo6RW5naW5lKCkKLSAgICA6IG1NYW5hZ2VySW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBsdWdpbkludGVyZmFjZSh0aGlzKSwKLSAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3IobmV3IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkpLAotICAgICAgbUFwbU9ic2VydmVyKE5VTEwpCitFbmdpbmU6OkVuZ2luZSgpIDogbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSkKIHsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4iKTsKKyAgICB9CiB9CiAKIEVuZ2luZTo6fkVuZ2luZSgpCiB7Ci0gICAgbVN0cmF0ZWd5Q29sbGVjdGlvbi5jbGVhcigpOwogICAgIG1TdHJlYW1Db2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgbUlucHV0U291cmNlQ29sbGVjdGlvbi5jbGVhcigpOwotICAgIG1Vc2FnZUNvbGxlY3Rpb24uY2xlYXIoKTsKLX0KLQotCi12b2lkIEVuZ2luZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotewotICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7Ci0gICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7CiB9CiAKIHN0YXR1c190IEVuZ2luZTo6aW5pdENoZWNrKCkKIHsKLSAgICBpZiAobVBvbGljeVBhcmFtZXRlck1nciA9PSBOVUxMIHx8IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnN0YXJ0KCkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAobVBvbGljeVBhcmFtZXRlck1nciA9PSBudWxscHRyIHx8IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnN0YXJ0KCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3Qgc3RhcnQgUG9saWN5IFBGVyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKT8gTk9fRVJST1IgOiBOT19JTklUOworICAgIHJldHVybiBFbmdpbmVCYXNlOjppbml0Q2hlY2soKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KQEAgLTEzOCw1NSArMTA5LDE2IEBACiAgICAgcmV0dXJuIGVsZW1lbnQtPnRlbXBsYXRlIGdldDxQcm9wZXJ0eT4oKTsKIH0KIAotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCitib29sIEVuZ2luZTo6c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZwcm9maWxlKQogewotICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90Pih1c2FnZSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotewotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7Ci0KLSAgICAvKiogVGhpcyBpcyB0aGUgb25seSBjYXNlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBiZWNhdXNlIHRoZSBQRlcgaXMgdW5hYmxlIHRvIGtub3cgdGhlCi0gICAgICogYWN0aXZpdHkgb2Ygc3RyZWFtcy4KLSAgICAgKgotICAgICAqIC1XaGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgotICAgICAqIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKLSAgICAgKiB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90Ci0gICAgICogaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKLSAgICAgKgotICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCi0gICAgICovCi0gICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMICYmCi0gICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCi0gICAgICAgICAgICAhb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgotICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihTVFJBVEVHWV9NRURJQSk7Ci0gICAgfQotICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZICYmCi0gICAgICAgIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCi0gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCi0gICAgICAgICAgICAvLyBEZXZpY2UgRm9yIFNvbmlmaWNhdGlvbiBjb25mIGZpbGUgaGFzIEhETUksIFNQRElGIGFuZCBIRE1JIEFSQyB1bnJlYWNoZWFibGUuCi0gICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7Ci19Ci0KLWJvb2wgRW5naW5lOjpQbHVnaW5JbnRlcmZhY2VJbXBsOjpzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnByb2ZpbGUpCi17Ci0gICAgaWYgKG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSkpIHsKLSAgICAgICAgbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRWb2x1bWVDdXJ2ZXMoKS5zd2l0Y2hWb2x1bWVDdXJ2ZShwcm9maWxlLCBzdHJlYW0pOworICAgIGlmIChzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0sIHByb2ZpbGUpKSB7CisgICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CiBib29sIEVuZ2luZTo6c2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSkKIHsKQEAgLTIwMCw3ICsxMzIsMTEgQEAKIAogc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQogewotICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldFBob25lU3RhdGUobW9kZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0UGhvbmVTdGF0ZShtb2RlKTsKIH0KIAogYXVkaW9fbW9kZV90IEVuZ2luZTo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0CkBAIC0yMTEsNyArMTQ3LDExIEBACiBzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwogfQogCiBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEVuZ2luZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdApAQCAtMjIwLDI4ICsxNjAsMjE2IEBACiB9CiAKIHN0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogeworICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisKICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZEZXNjLT50eXBlKCkpKSB7CiAgICAgICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOwogICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfQogICAgIHJldHVybiBCQURfVFlQRTsKIH0KIAorc3RhdHVzX3QgRW5naW5lOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKQoreworICAgIGF1dG8gcmVzdWx0ID0gRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICAvLyBDdXN0b20gWE1MIFBhcnNpbmcKKyAgICBhdXRvIGxvYWRDcml0ZXJpYT0gW3RoaXNdKGNvbnN0IGF1dG8mIGNvbmZpZ0NyaXRlcmlhLCBjb25zdCBhdXRvJiBjb25maWdDcml0ZXJpb25UeXBlcykgeworICAgICAgICBmb3IgKGF1dG8mIGNyaXRlcmlvbiA6IGNvbmZpZ0NyaXRlcmlhKSB7CisgICAgICAgICAgICBlbmdpbmVDb25maWc6OkNyaXRlcmlvblR5cGUgY3JpdGVyaW9uVHlwZTsKKyAgICAgICAgICAgIGZvciAoYXV0byAmY29uZmlnQ3JpdGVyaW9uVHlwZSA6IGNvbmZpZ0NyaXRlcmlvblR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NyaXRlcmlvblR5cGUubmFtZSA9PSBjcml0ZXJpb24udHlwZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uVHlwZSA9IGNvbmZpZ0NyaXRlcmlvblR5cGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5vdCBjcml0ZXJpb25UeXBlLm5hbWUuZW1wdHkoKSwgIkludmFsaWQgY3JpdGVyaW9uIHR5cGUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbi5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbVBvbGljeVBhcmFtZXRlck1nci0+YWRkQ3JpdGVyaW9uKGNyaXRlcmlvbi5uYW1lLCBjcml0ZXJpb25UeXBlLmlzSW5jbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblR5cGUudmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb24uZGVmYXVsdExpdGVyYWxWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbG9hZENyaXRlcmlhKHJlc3VsdC5wYXJzZWRDb25maWctPmNyaXRlcmlhLCByZXN1bHQucGFyc2VkQ29uZmlnLT5jcml0ZXJpb25UeXBlcyk7CisgICAgcmV0dXJuIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ID09IDA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIHByb2R1Y3RTdHJhdGVnaWVzID0gZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKTsKKyAgICBpZiAocHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgPT0gcHJvZHVjdFN0cmF0ZWdpZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gZ2V0IGRldmljZSBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBwcyk7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworCisgICAgLyoqIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgYmVjYXVzZSB0aGUgUEZXIGlzIHVuYWJsZSB0byBrbm93IHRoZQorICAgICAqIGFjdGl2aXR5IG9mIHN0cmVhbXMuCisgICAgICoKKyAgICAgKiAtV2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KKyAgICAgKiBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICogdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAorICAgICAqIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCisgICAgICoKKyAgICAgKiAtV2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgorICAgICAqLworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgaWYgKHBzID09IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSAmJgorICAgICAgICAgICAgIWlzX3N0YXRlX2luX2NhbGwoZ2V0UGhvbmVTdGF0ZSgpKSAmJgorICAgICAgICAgICAgIW91dHB1dHMuaXNBY3RpdmVSZW1vdGVseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkgJiYKKyAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneUZvck1lZGlhID0KKyAgICAgICAgICAgICAgICBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgZGV2aWNlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Rm9yTWVkaWEpOworICAgIH0gZWxzZSBpZiAocHMgPT0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSAmJgorICAgICAgICAob3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORykpIHx8CisgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSkgeworICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQorICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgorICAgICAgICAgICAgLy8gRGV2aWNlIEZvciBTb25pZmljYXRpb24gY29uZiBmaWxlIGhhcyBIRE1JLCBTUERJRiBhbmQgSERNSSBBUkMgdW5yZWFjaGVhYmxlLgorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lOb3RpZmljYXRpb24gPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX1JJTkcpOworICAgICAgICBkZXZpY2VzID0gcHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lOb3RpZmljYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcyk7CisgICAgfQorICAgIGlmIChkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FIHx8CisgICAgICAgICAgICAoZGV2aWNlcyAmIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CisgICAgICAgIEFMT0dFX0lGKGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUsICIlczogbm8gdmFsaWQgZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICB9CisgICAgaWYgKC8qZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VzKSovIGRldmljZXMgPT0gQVVESU9fREVWSUNFX09VVF9CVVMpIHsKKyAgICAgICAgLy8gV2UgZG8gZXhwZWN0IG9ubHkgb25lIGRldmljZSBmb3IgdGhlc2UgdHlwZXMgb2YgZGV2aWNlcworICAgICAgICAvLyBDcml0ZXJpb24gZGV2aWNlIGFkZHJlc3MgZ2FyYW50ZWUgdGhpcyBvbmUgaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIElmIHRoaXMgY3JpdGVyaW9uIGlzIG5vdCB3aXNoZWQsIG5lZWQgdG8gZW5zdXJlIHRoaXMgZGV2aWNlIGlzIGF2YWlsYWJsZQorICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MocHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcykuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlczpkZXZpY2UgMHgleCAlcyAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgYWRkcmVzcy5jX3N0cigpLCBwcyk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgfQorICAgIEFMT0dWKCIlczpkZXZpY2UgMHgleCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgcHMpOworICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJyZWREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgZXhwbGljdCByb3V0aW5nIGRldmljZQorICAgIGlmIChwcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXMgZXhwbGljaXQgUm91dGluZyBvbiBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgcHJlZmVycmVkRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZERldmljZSk7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IEVuZ2luZUJhc2U6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgYXV0byAmaW5wdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0SW5wdXRzKCk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKyAgICAvLworICAgIC8vIEV4cGxpY2l0IFJvdXRpbmcgPz8/IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQKKyAgICAvLyBmaXJzdCBhcyBpdCB1c2VkIHRvIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXRzLCBhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBwb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtaXgpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZ2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oYXR0ci5zb3VyY2UpOworCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIGFkZHJlc3MgPSAiMCI7CisgICAgICAgIHN0ZDo6c2l6ZV90IHBvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFncyB7IGF0dHIudGFncyB9OworICAgICAgICBpZiAoKHBvcyA9IHRhZ3MuZmluZCgiYWRkcj0iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSB0YWdzLnN1YnN0cihwb3MgKyBzdGQ6OnN0cmxlbigiYWRkcj0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK3ZvaWQgRW5naW5lOjp1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpCit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXNbc3RyYXRlZ3ktPmdldElkKCldID0gZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneS0+Z2V0SWQoKSk7CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6c2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykKK3sKKyAgICBpZiAoZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5maW5kKHN0cmF0ZWd5KSA9PSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHNldCBhZGRyZXNzICVzIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgc3RyYXRlZ3kpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VBZGRyZXNzKGFkZHJlc3MpOworfQorCitib29sIEVuZ2luZTo6c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKK3sKKyAgICBpZiAoZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5maW5kKHN0cmF0ZWd5KSA9PSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0IGRldmljZSAlZCBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZVR5cGVzKGRldmljZXMpOworICAgIHJldHVybiB0cnVlOworfQorCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKLSAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbVBsdWdpbkludGVyZmFjZTsKKyAgICByZXR1cm4gdGhpczsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAppbmRleCAzMjhkMjNkLi41NTUzOTk0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTE2LDIyICsxNiwyMCBAQAogCiAjcHJhZ21hIG9uY2UKIAotCisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQ29sbGVjdGlvbi5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZAoteworbmFtZXNwYWNlIGFuZHJvaWQgewogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CiAKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjsKIGNsYXNzIFZvbHVtZVByb2ZpbGU7CiAKLWNsYXNzIEVuZ2luZQorY2xhc3MgRW5naW5lIDogcHVibGljIEVuZ2luZUJhc2UsIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCiB7CiBwdWJsaWM6CiAgICAgRW5naW5lKCk7CkBAIC00MCwxMzIgKzM4LDY5IEBACiAgICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KICAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CiAKLXByaXZhdGU6Ci0gICAgLy8vIEludGVyZmFjZSBtZW1iZXJzCi0gICAgY2xhc3MgTWFuYWdlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgLy8vCisgICAgLy8vIGZyb20gRW5naW5lQmFzZQorICAgIC8vLworICAgIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIEF1ZGlvTWl4ICoqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkgb3ZlcnJpZGU7CisKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgIC8vLworICAgIHN0YXR1c190IGFkZFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIG92ZXJyaWRlCiAgICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWFuYWdlckludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQotCi0gICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1Qb2xpY3lFbmdpbmUtPnNldE9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGlucHV0U291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7Ci0gICAgfSBtTWFuYWdlckludGVyZmFjZTsKLQotICAgIGNsYXNzIFBsdWdpbkludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKKyAgICAgICAgcmV0dXJuIGFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOworICAgIH0KKyAgICBzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3Qgc291cmNlKSBvdmVycmlkZQogICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFBsdWdpbkludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorICAgICAgICByZXR1cm4gYWRkPGF1ZGlvX3NvdXJjZV90PihuYW1lLCBzb3VyY2UpOworICAgIH0KKyAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPHJvdXRpbmdfc3RyYXRlZ3k+KG5hbWUsIHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4obmFtZSwgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IHVzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3VzYWdlX3Q+KG5hbWUsIHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fc291cmNlX3Q+KG5hbWUsIHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvclN0cmF0ZWd5KGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgJnN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2b2x1bWVQcm9maWxlKTsKKyAgICBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsIGlucHV0U291cmNlKTsKKyAgICB9CisgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90PihzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UpOwotICAgICAgICB9CisgICAgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSBvdmVycmlkZTsKIAotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1QbHVnaW5JbnRlcmZhY2U7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUobmFtZSk7CisgICAgfQogCiBwcml2YXRlOgogICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwogICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOwogCi0gICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOwotCi0gICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpOwotICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOwotICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0OwotICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwotICAgIFN0cmF0ZWd5Q29sbGVjdGlvbiBtU3RyYXRlZ3lDb2xsZWN0aW9uOyAvKio8IFN0cmF0ZWdpZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLwogICAgIFN0cmVhbUNvbGxlY3Rpb24gbVN0cmVhbUNvbGxlY3Rpb247IC8qKjwgU3RyZWFtcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICAqLwotICAgIFVzYWdlQ29sbGVjdGlvbiBtVXNhZ2VDb2xsZWN0aW9uOyAvKio8IFVzYWdlcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAgICAgSW5wdXRTb3VyY2VDb2xsZWN0aW9uIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb247IC8qKjwgSW5wdXQgc291cmNlcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgpAQCAtMTg2LDEyICsxMjEsMTYgQEAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KICAgICBib29sIHNldFByb3BlcnR5Rm9yS2V5KGNvbnN0IFByb3BlcnR5ICZwcm9wZXJ0eSwgY29uc3QgS2V5ICZrZXkpOwogCisgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgLyoqCiAgICAgICogUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGhpZGRlbiB0aHJvdWdoIGEgd3JhcHBlci4KICAgICAgKi8KICAgICBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlciAqbVBvbGljeVBhcmFtZXRlck1ncjsKIAotICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7CisgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCmluZGV4IDlhYTg5YjIuLjI0NDI1OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBFbmdpbmVJbnN0YW5jZTo6RW5naW5lSW5zdGFuY2UoKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBhZTM5ZmVmLi5kMjUyZDNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMjAsMTMgKzIwLDEzIEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpCiB7Ci0gICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAorICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKaW5kZXggNmM0OThkYy4uZTE4NjVjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaApAQCAtMTgsMTAgKzE4LDggQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiAvKioKICAqIFNwZWNpYWxpemF0aW9uIG9mIHBvbGljeSBiYXNlIGNsYXNzIGVsZW1lbnQgZm9yIGF1ZGlvX3NvdXJjZV90CkBAIC02MSw3ICs1OSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKi8KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTM5OTE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9TdHJhdGVneSIKLQotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi1zdGF0dXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcikKLXsKLSAgICBpZiAoaWRlbnRpZmllciA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0gICAgQUxPR0QoIiVzOiBTdHJhdGVneSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkZXZpY2UgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5LgotICogSXQgY2hlY2tzIGlmIHRoZSBvdXRwdXQgZGV2aWNlIGlzIHZhbGlkLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlcyBzZWxlY3RlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgotICoKLSAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGRldmljZSBpcyBlaXRoZXIgdmFsaWQgb3Igbm9uZSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gKi8KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpzZXQ8YXVkaW9fZGV2aWNlc190PihhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLXsKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZXMpIHx8IGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dEKCIlczogMHglWCBmb3Igc3RyYXRlZ3kgJXMiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLWF1ZGlvX2RldmljZXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpnZXQ8YXVkaW9fZGV2aWNlc190PigpIGNvbnN0Ci17Ci0gICAgQUxPR1YoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVEZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlRGV2aWNlczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1N2Q1NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLS8qKgotICogQHRwYXJhbSBhdWRpb19kZXZpY2VzX3Q6IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4KLSAqLwotdGVtcGxhdGUgPD4KLWNsYXNzIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4KLXsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyhBVURJT19ERVZJQ0VfTk9ORSkKLSAgICB7fQotICAgIH5FbGVtZW50KCkge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKi8KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgKgotICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCi0gICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgotICAgICoKLSAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICovCi0gICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAgKi8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQotCi0gICAgLyoqCi0gICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90Ci0gICAgICogb3IgYSBzdHJpbmcuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0KLXByaXZhdGU6Ci0gICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCi0gICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOwotICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOwotCi0gICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0KLSAgICBhdWRpb19kZXZpY2VzX3QgbUFwcGxpY2FibGVEZXZpY2VzOyAvKio8IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KLX07Ci0KLXR5cGVkZWYgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneTsKLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCmluZGV4IDBlZDM2NGYuLjI5N2ViMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldElkZW50aWZpZXIoYXVkaW9fc3RyZWFtX3R5cGVfdCBpZGVudGlmaWVyKQogewpAQCAtMzYsMzIgKzM0LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qKgotKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhpcyBzdHJlYW0uCi0qIEl0IGNoZWNrcyBpZiB0aGUgc3RyYXRlZ3kgaXMgdmFsaWQuCi0qCi0qIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0qCi0qIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGlzIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotKi8KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLXsKLSAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIEFMT0dEKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXJvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXM6IDB4JVggZm9yIFN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OwotfQotCiB0ZW1wbGF0ZSA8Pgogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGF1ZGlvX3N0cmVhbV90eXBlX3Qgdm9sdW1lUHJvZmlsZSkKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCmluZGV4IDY5MDIwMDMuLmE0ZmRkMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaApAQCAtMTgsMjMgKzE4LDIwIEBACiAKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiRW5naW5lRGVmaW5pdGlvbi5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1hcD4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiAvKioKLSAqIEB0cGFyYW0gcm91dGluZ19zdHJhdGVneTogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uCisgKiBAdHBhcmFtIHByb2R1Y3Rfc3RyYXRlZ3lfdDogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uCiAgKi8KIHRlbXBsYXRlIDw+CiBjbGFzcyBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+CiB7CiBwdWJsaWM6CiAgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKLSAgICAgICAgOiBtTmFtZShuYW1lKSwKLSAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKQorICAgICAgICA6IG1OYW1lKG5hbWUpCiAgICAge30KICAgICB+RWxlbWVudCgpIHt9CiAKQEAgLTYyLDcgKzU5LDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSAgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKi8KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CkBAIC03OSw4ICs3Niw2IEBACiAgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCi0KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1Wb2x1bWVQcm9maWxlOyAvKio8IFZvbHVtZSBQcm9maWxlIGZvbGxvd2VkIGJ5IHRoaXMgc3RyZWFtLiAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMDgyOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvVXNhZ2UiCi0KLSNpbmNsdWRlICJVc2FnZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3VzYWdlX3QgaWRlbnRpZmllcikKLXsKLSAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1VTQUdFX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0gICAgQUxPR0QoIiVzOiBVc2FnZSAlcyBoYXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotc3RhdHVzX3QgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6c2V0PHJvdXRpbmdfc3RyYXRlZ3k+KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgaWYgKHN0cmF0ZWd5ID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dEKCIlczogJWQgZm9yIFVzYWdlICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1yb3V0aW5nX3N0cmF0ZWd5IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OmdldDxyb3V0aW5nX3N0cmF0ZWd5PigpIGNvbnN0Ci17Ci0gICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlU3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVTdHJhdGVneTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllMGUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotLyoqCi0gKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuCi0gKi8KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+Ci17Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKLSAgICAgICAgOiBtTmFtZShuYW1lKSwKLSAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKQotICAgIHt9Ci0gICAgfkVsZW1lbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAqCi0gICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCi0gICAgKgotICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKGF1ZGlvX3VzYWdlX3QgaWRlbnRpZmllcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICAqLwotICAgIGF1ZGlvX3VzYWdlX3QgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKLSAgICAgKiBvciBhIHN0cmluZy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0gICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgYXVkaW9fdXNhZ2VfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4gKi8KLX07Ci0KLXR5cGVkZWYgRWxlbWVudDxhdWRpb191c2FnZV90PiBVc2FnZTsKLQotfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGYyOWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBvd25lcjogInJlbmF1bHQiLAorICAgIG1haW46ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkyOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZiNzBhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CkBAIC0wLDAgKzEsMjQzIEBACisjIS91c3IvYmluL3B5dGhvbgorCisjCisjIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRJbmNsdWRlIGFzIEVJCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tIGFzIE1JTklET00KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKyMKKyMgSGVscGVyIHNjcmlwdCB0aGF0IGhlbHBzIHRvIGZlZWQgYXQgYnVpbGQgdGltZSB0aGUgWE1MIGNyaXRlcmlvbiB0eXBlcyBmaWxlIHVzZWQgYnkKKyMgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZSB0byBzdGFydCB0aGUgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgSXQgcHJldmVudHMgdG8gZmlsbCB0aGVtIG1hbnVhbGx5IGFuZCBhdm9pZCBkaXZlcmdlbmNlcyB3aXRoIGFuZHJvaWQuCisjCisjIFRoZSBEZXZpY2UgVHlwZXMgY3JpdGVyaW9uIHR5cGVzIGFyZSBmZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSB3aXRoIHRoZSBvcHRpb24KKyMgICAgICAgICAgIC0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciA8cGF0aC90by9hbmRyb2lkL2F1ZGlvL2Jhc2UvZmlsZS9hdWRpby1iYXNlLmg+CisjCisjIFRoZSBEZXZpY2UgQWRkcmVzc2VzIGNyaXRlcmlvbiB0eXBlcyBhcmUgZmVkIGZyb20gdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyMgaW4gb3JkZXIgdG8gZGlzY292ZXIgYWxsIHRoZSBkZXZpY2VzIGZvciB3aGljaCB0aGUgYWRkcmVzcyBtYXR0ZXIuCisjICAgICAgICAgICAtLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUgPHBhdGgvdG8vYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sPgorIworIyBUaGUgcmVmZXJlbmNlIGZpbGUgb2YgY3JpdGVyaW9uIHR5cGVzIG11c3QgYWxzbyBiZSBzZXQgYXMgYW4gaW5wdXQgb2YgdGhlIHNjcmlwdDoKKyMgICAgICAgICAgIC0tY3JpdGVyaW9udHlwZXMgPHBhdGgvdG8vY3JpdGVyaW9uL2ZpbGUvYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbC5pbj4KKyMKKyMgQXQgbGFzdCwgdGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0IHNoYWxsIGJlIHNldCBhbHNvOgorIyAgICAgICAgICAgLS1vdXRwdXRmaWxlIDxwYXRoL3RvL291dC92ZW5kb3IvZXRjL2F1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWw+CisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBhdWRpbyBjcml0ZXJpb24gdHlwZSBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gQmFzZSBDIGhlYWRlciBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkFORFJPSURfQVVESU9fQkFTRV9IRUFERVIiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUnLAorICAgICAgICAgICAgaGVscD0iQW5kcm9pZCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IihBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY3JpdGVyaW9udHlwZXMnLAorICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIFhNTCBiYXNlIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPicgXAorICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSU9OX1RZUEVfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgb3V0cHV0ZmlsZSBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShjcml0ZXJpb25UeXBlcywgYWRkcmVzc0NyaXRlcmlhLCBjcml0ZXJpb25UeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKyAgICBjcml0ZXJpb25fdHlwZXNfaW5fdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlvblR5cGVzRmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19kaWN0IGluIGNyaXRlcmlvblR5cGVzLml0ZW1zKCk6CisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZSBpbiBjcml0ZXJpb25fdHlwZXNfcm9vdC5maW5kYWxsKCdjcml0ZXJpb25fdHlwZScpOgorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICBvcmRlcmVkX3ZhbHVlcyA9IE9yZGVyZWREaWN0KHNvcnRlZCh2YWx1ZXNfZGljdC5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMV0pKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9yZGVyZWRfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2xpdGVyYWwnLCBrZXkpCisKKyAgICBpZiBhZGRyZXNzQ3JpdGVyaWE6CisgICAgICAgIGZvciBjcml0ZXJpb25fbmFtZSwgdmFsdWVzX2xpc3QgaW4gYWRkcmVzc0NyaXRlcmlhLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSBjcml0ZXJpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiLCBsaXRlcmFsPXZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cigxIDw8IGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKGNyaXRlcmlvbl90eXBlc19yb290LCBlbmNvZGluZz0ndXRmOCcsIG1ldGhvZD0neG1sJykKKyAgICByZXBhcnNlZCA9IE1JTklET00ucGFyc2VTdHJpbmcoeG1sc3RyKQorICAgIHByZXR0eVhtbFN0ciA9IHJlcGFyc2VkLnRvcHJldHR5eG1sKG5ld2w9J1xyXG4nKQorICAgIHByZXR0eVhtbFN0ciA9IG9zLmxpbmVzZXAuam9pbihbcyBmb3IgcyBpbiBwcmV0dHlYbWxTdHIuc3BsaXRsaW5lcygpIGlmIHMuc3RyaXAoKV0pCisgICAgb3V0cHV0RmlsZS53cml0ZShwcmV0dHlYbWxTdHIuZW5jb2RlKCd1dGYtOCcpKQorCitkZWYgY2FwaXRhbGl6ZUxpbmUobGluZSk6CisgICAgcmV0dXJuICcgJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBsaW5lLnNwbGl0KCcgJykpKQorCisKKyMKKyMgUGFyc2UgdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgZGV2aWNlIGNyaXRlcmlhIGFkZHJlc3NlcworIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdChhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKSkKKyAgICAjCisgICAgIyBleHRyYWN0IGFsbCBkZXZpY2VzIGFkZHJlc3NlcyBmcm9tIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnc2luaycgOiAiT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiLAorICAgICAgICAnc291cmNlJyA6ICJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB9CisKKyAgICBhZGRyZXNzX2NyaXRlcmlhID0geworICAgICAgICAnT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUnIDogW10sCisgICAgICAgICdJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlJyA6IFtdIH0KKworICAgIG9sZFdvcmtpbmdEaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50ICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZFdvcmtpbmdEaXIKKworICAgIG5ld0RpciA9IG9zLnBhdGguam9pbihvbGRXb3JraW5nRGlyICwgYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZS5uYW1lKQorCisgICAgcG9saWN5X2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld0RpcikpKQorCisgICAgcHJpbnQgIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKQorCisgICAgcG9saWN5X3Jvb3QgPSBwb2xpY3lfaW5fdHJlZS5nZXRyb290KCkKKyAgICBFSS5pbmNsdWRlKHBvbGljeV9yb290KQorCisgICAgb3MuY2hkaXIob2xkV29ya2luZ0RpcikKKworICAgIGZvciBkZXZpY2UgaW4gcG9saWN5X3Jvb3QuaXRlcignZGV2aWNlUG9ydCcpOgorICAgICAgICBmb3Iga2V5IGluIGFkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZS5rZXlzKCk6CisgICAgICAgICAgICBpZiBkZXZpY2UuZ2V0KCdyb2xlJykgPT0ga2V5IGFuZCBkZXZpY2UuZ2V0KCdhZGRyZXNzJykgOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306IDx7fT4iLmZvcm1hdChrZXksIGRldmljZS5nZXQoJ2FkZHJlc3MnKSkpCisgICAgICAgICAgICAgICAgYWRkcmVzc19jcml0ZXJpYVthZGRyZXNzX2NyaXRlcmlhX21hcHBpbmdfdGFibGVba2V5XV0uYXBwZW5kKGRldmljZS5nZXQoJ2FkZHJlc3MnKSkKKworICAgIGZvciBjcml0ZXJpYSBpbiBhZGRyZXNzX2NyaXRlcmlhOgorICAgICAgICB2YWx1ZXMgPSAnLCcuam9pbihhZGRyZXNzX2NyaXRlcmlhW2NyaXRlcmlhXSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGNyaXRlcmlhLCB2YWx1ZXMpKQorCisgICAgcmV0dXJuIGFkZHJlc3NfY3JpdGVyaWEKKworIworIyBQYXJzZSB0aGUgYXVkaW8tYmFzZS5oIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgYW5kcm9pZCBkZXBlbmRlbnQgY3JpdGVyaW9uIHR5cGVzOgorIyAgIC1BbmRyb2lkIE1vZGUKKyMgICAtT3V0cHV0IGRldmljZXMgdHlwZQorIyAgIC1JbnB1dCBkZXZpY2VzIHR5cGUKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICMKKyAgICAjIEFkYXB0YXRpb24gdGFibGUgYmV0d2VlbiBBbmRyb2lkIEVudW1lcmF0aW9uIHByZWZpeCBhbmQgQXVkaW8gUEZXIENyaXRlcmlvbiB0eXBlIG5hbWVzCisgICAgIworICAgIGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnQVVESU9fTU9ERScgOiAiQW5kcm9pZE1vZGVUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9PVVQnIDogIk91dHB1dERldmljZXNNYXNrVHlwZSIsCisgICAgICAgICdBVURJT19ERVZJQ0VfSU4nIDogIklucHV0RGV2aWNlc01hc2tUeXBlIn0KKworICAgIGFsbF9jcml0ZXJpYSA9IHsKKyAgICAgICAgJ0FuZHJvaWRNb2RlVHlwZScgOiB7fSwKKyAgICAgICAgJ091dHB1dERldmljZXNNYXNrVHlwZScgOiB7fSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc01hc2tUeXBlJyA6IHt9IH0KKworICAgICMKKyAgICAjIF9DTlQsIF9NQVgsIF9BTEwgYW5kIF9OT05FIGFyZSBwcm9oaWJpdGVkIHZhbHVlcyBhcyB0aGVyIGFyZSBqdXN0IGhlbHBlcnMgZm9yIGVudW0gdXNlcnMuCisgICAgIworICAgIGlnbm9yZWRfdmFsdWVzID0gWyAnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORScgXQorCisgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiXHMqKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXF8iIFwKKyAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAorICAgICAgICByIig/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdKykiKQorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQorCisgICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGVudW1lcmF0ZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgICAgIG1hdGNoID0gY3JpdGVyaWFfcGF0dGVybi5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIlRoZSBmb2xsb3dpbmcgbGluZSBpcyBWQUxJRDoge306e31cbnt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUubmFtZSwgbGluZV9udW1iZXIsIGxpbmUpKQorCisgICAgICAgICAgICBjcml0ZXJpb25fbmFtZSA9IGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlW21hdGNoLmdyb3VwZGljdCgpWyd0eXBlJ11dCisgICAgICAgICAgICBsaXRlcmFsID0gJycuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbWF0Y2guZ3JvdXBkaWN0KClbJ2xpdGVyYWwnXS5zcGxpdCgnXycpKSkKKyAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQorCisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0CisgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorCisgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIGludChudW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0udmFsdWVzKCk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJjcml0ZXJpb24ge30gZHVwbGljYXRlZCB2YWx1ZXM6Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306e30iLmZvcm1hdChudW1lcmljYWxfdmFsdWUsIGxpdGVyYWwpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiS0VFUElORyBMQVRFU1QiKQorICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0KKworICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtsaXRlcmFsXSA9IGludChudW1lcmljYWxfdmFsdWUsIDApCisKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGxpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSkpCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcikKKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlcyA9IGFyZ3MuY3JpdGVyaW9udHlwZXMKKworICAgIGdlbmVyYXRlWG1sQ3JpdGVyaW9uVHlwZXNGaWxlKGFsbF9jcml0ZXJpYSwgYWRkcmVzc19jcml0ZXJpYSwgY3JpdGVyaW9uX3R5cGVzLCBhcmdzLm91dHB1dGZpbGUpCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NjQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKQEAgLTAsMCArMSwzNSBAQAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT09MIDo9IGRvbWFpbkdlbmVyYXRvclBvbGljeS5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT1BMRVZFTF9GSUxFIDo9ICQoUEZXX1RPUExFVkVMX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklBX0ZJTEUgOj0gJChQRldfQ1JJVEVSSUFfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfVFVOSU5HX0ZJTEUgOj0gJChQRldfVFVOSU5HX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0VERF9GSUxFUyA6PSAkKFBGV19FRERfRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0RPTUFJTl9GSUxFUyA6PSAkKFBGV19ET01BSU5fRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1NDSEVNQVNfRElSIDo9ICQoUEZXX1NDSEVNQVNfRElSKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFBGV19DUklURVJJT05fVFlQRVNfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSBkb21haW5HZW5lcmF0b3JQb2xpY3kucHkKKworCSIkKE1ZX1RPT0wpIiAtLXZhbGlkYXRlIFwKKwkJLS10b3BsZXZlbC1jb25maWcgIiQoTVlfVE9QTEVWRUxfRklMRSkiIFwKKwkJLS1jcml0ZXJpYSAiJChNWV9DUklURVJJQV9GSUxFKSIgXAorCQktLWNyaXRlcmlvbnR5cGVzICIkKE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFKSIgXAorCQktLWluaXRpYWwtc2V0dGluZ3MgJChNWV9UVU5JTkdfRklMRSkgXAorCQktLWFkZC1lZGRzICQoTVlfRUREX0ZJTEVTKSBcCisJCS0tYWRkLWRvbWFpbnMgJChNWV9ET01BSU5fRklMRVMpIFwKKwkJLS1zY2hlbWFzLWRpciAkKE1ZX1NDSEVNQVNfRElSKSA+ICIkQCIKKworCisjIENsZWFyIHZhcmlhYmxlcyBmb3IgZnVydGhlciB1c2UKK1BGV19UT1BMRVZFTF9GSUxFIDo9CitQRldfU1RSVUNUVVJFX0ZJTEVTIDo9CitQRldfQ1JJVEVSSUFfRklMRSA6PQorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9CitQRldfVFVOSU5HX0ZJTEUgOj0KK1BGV19FRERfRklMRVMgOj0KK1BGV19ET01BSU5fRklMRVMgOj0KK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzkyOTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKQEAgLTAsMCArMSwyNjggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMKKyMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IEVkZFBhcnNlcgorZnJvbSBQRldTY3JpcHRHZW5lcmF0b3IgaW1wb3J0IFBmd1NjcmlwdFRyYW5zbGF0b3IKK2ltcG9ydCBob3N0Q29uZmlnCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCisKKyMKKyMgSW4gb3JkZXIgdG8gYnVpbGQgdGhlIFhNTCBTZXR0aW5ncyBmaWxlIGF0IGJ1aWxkIHRpbWUsIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjIHNoYWxsIGJlIHN0YXJ0ZWQgYW5kIGZlZCB3aXRoIGFsbCB0aGUgY3JpdGVyaW9uIHR5cGVzL2NyaXRlcmlhIHRoYXQgd2lsbCBiZSB1c2VkIGJ5CisjIHRoZSBlbmdpbmVjb25maWd1cmFibGUuCisjIFRoaXMgc2NyaXB0cyBhbGxvd3MgZ2VuZXJhdGVzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBzYW1lIGF1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwgLworIyBhdWRpb19jcml0ZXJpYS54bWwgZmlsZXMgdXNlZCBhdCBydW4gdGltZSBieSB0aGUgZW5naW5lY29uZmlndXJhYmxlCisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBTZXR0aW5ncyBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS10b3BsZXZlbC1jb25maWcnLAorICAgICAgICAgICAgaGVscD0iVG9wLWxldmVsIHBhcmFtZXRlci1mcmFtZXdvcmsgY29uZmlndXJhdGlvbiBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlRPUExFVkVMX0NPTkZJR19GSUxFIiwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpYScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpYSBmaWxlLCBpbiBYTUwgZm9ybWF0OiBcCisgICAgICAgICAgICAgICAgICBpbiAnPGNyaXRlcmlhPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb24gbmFtZT0iIiB0eXBlPSIiLz4gXAorICAgICAgICAgICAgICAgICAgICAgIDwvY3JpdGVyaWE+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJQV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpb250eXBlcycsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgWE1MIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPiBcCisgICAgICAgICAgICAgPC9jcml0ZXJpb25fdHlwZXM+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJT05fVFlQRV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW5pdGlhbC1zZXR0aW5ncycsCisgICAgICAgICAgICBoZWxwPSJJbml0aWFsIFhNTCBzZXR0aW5ncyBmaWxlIChjb250YWluaW5nIGEgXAorICAgICAgICA8Q29uZmlndXJhYmxlRG9tYWlucz4gIHRhZyIsCisgICAgICAgICAgICBuYXJncz0nPycsCisgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfU0VUVElOR1NfRklMRSIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hZGQtZG9tYWlucycsCisgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIHNpbmdsZSBkb21haW4gZmlsZXMgKGVhY2ggY29udGFpbmluZyBhIHNpbmdsZSBcCisgICAgICAgIDxDb25maWd1cmFibGVEb21haW4+IHRhZyIsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfRE9NQUlOX0ZJTEUiLAorICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgZGVzdD0neG1sX2RvbWFpbl9maWxlcycsCisgICAgICAgICAgICBkZWZhdWx0PVtdKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYWRkLWVkZHMnLAorICAgICAgICAgICAgaGVscD0iTGlzdCBvZiBmaWxlcyBpbiBFREQgc3ludGF4IChha2EgXCIucGZ3XCIgZmlsZXMpIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkVERF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIG5hcmdzPScqJywKKyAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBkZXN0PSdlZGRfZmlsZXMnKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc2NoZW1hcy1kaXInLAorICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IG9mIHBhcmFtZXRlci1mcmFtZXdvcmsgWE1MIFNjaGVtYXMgZm9yIGdlbmVyYXRpb24gXAorICAgICAgICB2YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhcmdldC1zY2hlbWFzLWRpcicsCisgICAgICAgICAgICBoZWxwPSJJZ25vcmVkLiBLZXB0IGZvciByZXRyby1jb21wYXRpYmlsaXR5IikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZhbGlkYXRlJywKKyAgICAgICAgICAgIGhlbHA9IlZhbGlkYXRlIHRoZSBzZXR0aW5ncyBhZ2FpbnN0IFhNTCBzY2hlbWFzIiwKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisjCisjIFBhcnNlcyBhdWRpb19jcml0ZXJpb25fdHlwZXMueG1sIC8gYXVkaW9fY3JpdGVyaWEueG1sIGZpbGVzIHVzZWQgYXQgcnVuIHRpbWUgYnkgdGhlCisjIGVuZ2luZWNvbmZpZ3VyYWJsZSBhbmQgb3V0cHV0cyBhIGRpY3Rpb25uYXJ5IG9mIGNyaXRlcmlhLgorIyBGb3IgZWFjaCBjcml0ZXJpYSwgdGhlIG5hbWUsIHR5cGUgKGFrYSBpbmNsdXNpdmUgKGJpdGZpZWxkKSBvciBleGNsdXNpdmUgKGVudW0pLCB0aGUgdmFsdWVzCisjIGFyZSBwcm92aWRlZC4KKyMKK2RlZiBwYXJzZUNyaXRlcmlhQW5kQ3JpdGVyaW9uVHlwZXMoY3JpdGVyaWFGaWxlLCBjcml0ZXJpb25UeXBlc0ZpbGUpOgorICAgICMgUGFyc2UgY3JpdGVyaWEgYW5kIGNyaXRlcmlvbiB0eXBlcyBYTUwgZmlsZXMKKyAgICAjCisgICAgY3JpdGVyaWFfdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlhRmlsZSkKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpYUZpbGUge30iLmZvcm1hdChjcml0ZXJpYUZpbGUpKQorICAgIGNyaXRlcmlvbl90eXBlc190cmVlID0gRVQucGFyc2UoY3JpdGVyaW9uVHlwZXNGaWxlKQorICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCisKKyAgICBjcml0ZXJpYV9yb290ID0gY3JpdGVyaWFfdHJlZS5nZXRyb290KCkKKyAgICBjcml0ZXJpb25fdHlwZXNfcm9vdCA9IGNyaXRlcmlvbl90eXBlc190cmVlLmdldHJvb3QoKQorCisgICAgYWxsX2NyaXRlcmlhID0gW10KKyAgICBmb3IgY3JpdGVyaW9uIGluIGNyaXRlcmlhX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uJyk6CisgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uLmdldCgnbmFtZScpCisgICAgICAgIHR5cGVfbmFtZSA9IGNyaXRlcmlvbi5nZXQoJ3R5cGUnKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgdHlwZV9uYW1lIHt9Ii5mb3JtYXQodHlwZV9uYW1lKSkKKworICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGVzIGluIGNyaXRlcmlvbl90eXBlc190cmVlLmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CisgICAgICAgICAgICBjcml0ZXJpb25fdHlwZV9uYW1lID0gY3JpdGVyaW9uX3R5cGVzLmdldCgnbmFtZScpCisgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZV9uYW1lID09IHR5cGVfbmFtZToKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25faW5jbHVzaXZlbmVzcyA9IGNyaXRlcmlvbl90eXBlcy5nZXQoJ3R5cGUnKQorCisgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcyA9IFtdCisKKyAgICAgICAgICAgICAgICB2YWx1ZXNfbm9kZSA9IGNyaXRlcmlvbl90eXBlcy5maW5kKCd2YWx1ZXMnKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlc19ub2RlOgorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzX25vZGUuZmluZGFsbCgndmFsdWUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKHZhbHVlLmdldCgnbGl0ZXJhbCcpKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGNyaXRlcmlvbl92YWx1ZXMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKCcnKQorCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3R5cGVfbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl90eXBlX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3MpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl92YWx1ZXMge30iLmZvcm1hdChjcml0ZXJpb25fdmFsdWVzKSkKKworICAgICAgICAgICAgICAgIGFsbF9jcml0ZXJpYS5hcHBlbmQoeworICAgICAgICAgICAgICAgICAgICAibmFtZSIgOiBjcml0ZXJpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImluY2x1c2l2ZSIgOiBjcml0ZXJpb25faW5jbHVzaXZlbmVzcywKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIgOiBjcml0ZXJpb25fdmFsdWVzfSkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgcmV0dXJuIGFsbF9jcml0ZXJpYQorCisjCisjIFBhcnNlcyB0aGUgRWRkIGZpbGVzIChha2EgLnBmdyBleHRlbnNpb24gZmlsZSksIHdoaWNoIGlzIGEgc2ltcGxpZmllZCBsYW5ndWFnZSB0byB3cml0ZSB0aGUKKyMgcGFyYW1ldGVyIGZyYW1ld29yayBzZXR0aW5ncy4KKyMKK2RlZiBwYXJzZUVkZChFRERGaWxlcyk6CisgICAgcGFyc2VkX2VkZHMgPSBbXQorCisgICAgZm9yIGVkZF9maWxlIGluIEVEREZpbGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByb290ID0gRWRkUGFyc2VyLlBhcnNlcigpLnBhcnNlKGVkZF9maWxlKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15U3ludGF4RXJyb3IgYXMgZXg6CisgICAgICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKHN0cihleCkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkVYSVQgT04gRkFJTFVSRSIpCisgICAgICAgICAgICBleGl0KDIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdC5wcm9wYWdhdGUoKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15UHJvcGFnYXRpb25FcnJvciwgZXggOgorICAgICAgICAgICAgbG9nZ2luZy5jcml0aWNhbChzdHIoZXgpKQorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJFWElUIE9OIEZBSUxVUkUiKQorICAgICAgICAgICAgZXhpdCgxKQorCisgICAgICAgIHBhcnNlZF9lZGRzLmFwcGVuZCgoZWRkX2ZpbGUubmFtZSwgcm9vdCkpCisgICAgcmV0dXJuIHBhcnNlZF9lZGRzCisKKyMKKyMgR2VuZXJhdGVzIGFsbCB0aGUgcmVxdWlyZWQgY29tbWFuZHMgdG8gYmUgc2VudCB0byB0aGUgaW5zdGFuY2Ugb2YgcGFyYW1ldGVyLWZyYW1ld29yayBsYXVuY2hlZAorIyBhdCBydW50aW1lIHRvIGdlbmVyYXRlIHRoZSBYTUwgU2V0dGluZ3MgZmlsZS4KKyMgSXQgdGFrZXMgYXMgaW5wdXQgdGhlIGNvbGxlY3Rpb24gb2YgY3JpdGVyaWEsIHRoZSBkb21haW5zIGFuZCB0aGUgc2ltcGxpZmllZCBzZXR0aW5ncyByZWFkIGZyb20KKyMgcGZ3LgorIworZGVmIGdlbmVyYXRlRG9tYWluQ29tbWFuZHMobG9nZ2luZywgYWxsX2NyaXRlcmlhLCBpbml0aWFsX3NldHRpbmdzLCB4bWxfZG9tYWluX2ZpbGVzLCBwYXJzZWRfZWRkcyk6CisgICAgICAgICMgY3JlYXRlIGFuZCBpbmplY3QgYWxsIHRoZSBjcml0ZXJpYQorICAgICAgICBsb2dnaW5nLmluZm8oIkNyZWF0aW5nIGFsbCBjcml0ZXJpYSIpCisgICAgICAgIGZvciBjcml0ZXJpb24gaW4gYWxsX2NyaXRlcmlhOgorICAgICAgICAgICAgeWllbGQgWyJjcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24iLCBjcml0ZXJpb25bJ2luY2x1c2l2ZSddLAorICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblsnbmFtZSddXSArIGNyaXRlcmlvblsndmFsdWVzJ10KKworICAgICAgICB5aWVsZCBbInN0YXJ0Il0KKworICAgICAgICAjIEltcG9ydCBpbml0aWFsIHNldHRpbmdzIGZpbGUKKyAgICAgICAgaWYgaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGluaXRpYWwgc2V0dGluZ3MgZmlsZSB7fSIuZm9ybWF0KGluaXRpYWxfc2V0dGluZ3MpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5zV2l0aFNldHRpbmdzWE1MIiwgaW5pdGlhbF9zZXR0aW5nc10KKworICAgICAgICAjIEltcG9ydCBlYWNoIHN0YW5kYWxvbmUgZG9tYWluIGZpbGVzCisgICAgICAgIGZvciBkb21haW5fZmlsZSBpbiB4bWxfZG9tYWluX2ZpbGVzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgc2luZ2xlIGRvbWFpbiBmaWxlIHt9Ii5mb3JtYXQoZG9tYWluX2ZpbGUpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5XaXRoU2V0dGluZ3NYTUwiLCBkb21haW5fZmlsZV0KKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBzY3JpcHQgZm9yIGVhY2ggRUREIGZpbGUKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBwYXJzZWRfZWRkIGluIHBhcnNlZF9lZGRzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUcmFuc2xhdGluZyBhbmQgaW5qZWN0aW5nIEVERCBmaWxlIHt9Ii5mb3JtYXQoZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJhbnNsYXRvciA9IFBmd1NjcmlwdFRyYW5zbGF0b3IoKQorICAgICAgICAgICAgcGFyc2VkX2VkZC50cmFuc2xhdGUodHJhbnNsYXRvcikKKyAgICAgICAgICAgIGZvciBjb21tYW5kIGluIHRyYW5zbGF0b3IuZ2V0U2NyaXB0KCk6CisgICAgICAgICAgICAgICAgeWllbGQgY29tbWFuZAorCisjCisjIEVudHJ5IHBvaW50IG9mIHRoZSBkb21haW4gZ2VuZXJhdG9yLgorIyAgICAgICAtUGFyc2VzIENyaXRlcmlvbiB0eXBlcyBhbmQgY3JpdGVyaWEgZmlsZXMKKyMgICAgICAgLVBhcnNlcyBzZXR0aW5ncyB3cml0dGVuIGluIHNpbXBsaWZpZWQgcGZ3IGxhbmd1YWdlLgorIyAgICAgICAtTGF1bmNoZXMgYSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjICAgICAgIC1UcmFuc2xhdGVzIHRoZSBzZXR0aW5ncyBpbnRvIGNvbW1hbmQgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYnkgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgICAgICAgLVVzZSB0aGUgZXhwb3J0cyBjb21tYW5kIGFuZCBvdXRwdXQgdGhlbSBpbiBYTUwgU2V0dGluZ3MgZmlsZS4KKyMKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIGFsbF9jcml0ZXJpYSA9IHBhcnNlQ3JpdGVyaWFBbmRDcml0ZXJpb25UeXBlcyhhcmdzLmNyaXRlcmlhLCBhcmdzLmNyaXRlcmlvbnR5cGVzKQorCisgICAgIworICAgICMgRUREIGZpbGVzIChha2EgIi5wZnciIGZpbGVzKQorICAgICMKKyAgICBwYXJzZWRfZWRkcyA9IHBhcnNlRWRkKGFyZ3MuZWRkX2ZpbGVzKQorCisgICAgIyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgdG9wbGV2ZWwgY29uZmlndXJhdGlvbiBmaWxlIHRvIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzCisgICAgIyBiZXR3ZWVuIGRldmVsb3BtZW50IHNldHVwIGFuZCB0YXJnZXQgKGluc3RhbGxhdGlvbikgc2V0dXAsIGluIHBhcnRpY3VsYXIsIHRoZQorICAgICMgVHVuaW5nTXdpdGggb2RlIG11c3QgYmUgZW5mb3JjZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3aWxsIGJlIGFsbG93ZWQgb24gdGhlIHRhcmdldAorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKG1vZGU9J3cnLCBkZWxldGU9RmFsc2UsIHN1ZmZpeD0iLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSJUTVBkb21haW5HZW5lcmF0b3JQRkNvbmZpZ18iKQorCisgICAgaW5zdGFsbF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoYXJncy50b3BsZXZlbF9jb25maWcpKQorICAgIGhvc3RDb25maWcuY29uZmlndXJlKAorICAgICAgICAgICAgaW5maWxlPWFyZ3MudG9wbGV2ZWxfY29uZmlnLAorICAgICAgICAgICAgb3V0ZmlsZT1mYWtlX3RvcGxldmVsX2NvbmZpZywKKyAgICAgICAgICAgIHN0cnVjdFBhdGg9aW5zdGFsbF9wYXRoKQorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLmNsb3NlKCkKKworICAgICMgQ3JlYXRlIHRoZSBjb25uZWN0b3IuIFBpcGUgaXRzIGlucHV0IHRvIHVzIGluIG9yZGVyIHRvIHdyaXRlIGNvbW1hbmRzOworICAgICMgY29ubmVjdCBpdHMgb3V0cHV0IHRvIHN0ZG91dCBpbiBvcmRlciB0byBoYXZlIGl0IGR1bXAgdGhlIGRvbWFpbnMKKyAgICAjIHRoZXJlOyBjb25uZWN0IGl0cyBlcnJvciBvdXRwdXQgdG8gc3RkZXJyLgorICAgIGNvbm5lY3RvciA9IHN1YnByb2Nlc3MuUG9wZW4oWyJkb21haW5HZW5lcmF0b3JDb25uZWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2UnIGlmIGFyZ3MudmVyYm9zZSBlbHNlICduby12ZXJib3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRhdGUnIGlmIGFyZ3MudmFsaWRhdGUgZWxzZSAnbm8tdmFsaWRhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2NoZW1hc19kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN5cy5zdGRvdXQsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN5cy5zdGRlcnIpCisKKyAgICBpbml0aWFsX3NldHRpbmdzID0gTm9uZQorICAgIGlmIGFyZ3MuaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgaW5pdGlhbF9zZXR0aW5ncyA9IG9zLnBhdGgucmVhbHBhdGgoYXJncy5pbml0aWFsX3NldHRpbmdzKQorCisgICAgZm9yIGNvbW1hbmQgaW4gZ2VuZXJhdGVEb21haW5Db21tYW5kcyhsb2dnaW5nLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCdcMCcuam9pbihjb21tYW5kKSkKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCJcbiIpCisKKyAgICAjIENsb3NpbmcgdGhlIGNvbm5lY3RvcidzIGlucHV0IHRyaWdnZXJzIHRoZSBkb21haW4gZ2VuZXJhdGlvbgorICAgIGNvbm5lY3Rvci5zdGRpbi5jbG9zZSgpCisgICAgY29ubmVjdG9yLndhaXQoKQorICAgIG9zLnJlbW92ZShmYWtlX3RvcGxldmVsX2NvbmZpZy5uYW1lKQorICAgIHJldHVybiBjb25uZWN0b3IucmV0dXJuY29kZQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBleGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViZGZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKENSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9BTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUgOj0gJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVE9PTCA6PSAkKEhPU1RfT1VUKS9iaW4vYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKKyAgICAkKENSSVRFUklPTl9UWVBFU19GSUxFKSBcCisgICAgJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCisKKwkiJChNWV9DUklURVJJT05fVE9PTCkiIFwKKwkJLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICIkKE1ZX0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkiIFwKKwkJLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0tb3V0cHV0ZmlsZSAiJChAKSIKKworIyBDbGVhciB2YXJpYWJsZXMgZm9yIGZ1cnRoZXIgdXNlCitDUklURVJJT05fVFlQRVNfRklMRSA6PQorQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9CitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tawppbmRleCAzNmUwZjQyLi5jN2Q4ZDM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTEwLDEzICsxMCwyMiBAQAogICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKKyAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uCiAKLUxPQ0FMX1NSQ19GSUxFUzo9IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlieG1sMgorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtMjgsMTUgKzM3LDMgQEAKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ09ORklHVVJBVElPTiBGSUxFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBzcGVjaWZpYyBtYW5hZ2VtZW50IG9mIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpCi1MT0NBTF9TUkNfRklMRVMgOj0gY29uZmlnLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCmluZGV4IDliMDQ0MmUuLjRiNTc0NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgIlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCIKICNpbmNsdWRlIDxQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3Rvci5oPgogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UuaD4KQEAgLTU2LDE1ICs1NSwzNyBAQAogICAgIH0KIH07CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwogCi1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lID0KICAgICAiL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lID0KKyAgICAiL3ZlbmRvci9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lID0gIlRlbGVwaG9ueU1vZGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiOworCisvKioKKyAqIE9yZGVyIE1VU1QgYmUgYWxpZ24gd2l0aCBkZWZpbnRpaW9uIG9mIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB3aXRoaW4gYXVkaW9fcG9saWN5LmgKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdGb3JjZVVzZUNyaXRlcmlvblRhZ1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPQoreworICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID0gICAgICAgICJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9ICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvck1lZGlhIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JSZWNvcmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10gPSAgICAgICJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIgorfTsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4ge307CkBAIC03NSwxOCArOTYsNDMgQEAKICAgICA6IG1QZndDb25uZWN0b3JMb2dnZXIobmV3IFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyKQogewogICAgIC8vIENvbm5lY3RvcgotICAgIG1QZndDb25uZWN0b3IgPSBuZXcgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yKG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lKTsKKyAgICBpZiAoYWNjZXNzKG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUsIFJfT0spID09IDApIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworICAgIH0KIAogICAgIC8vIExvZ2dlcgogICAgIG1QZndDb25uZWN0b3ItPnNldExvZ2dlcihtUGZ3Q29ubmVjdG9yTG9nZ2VyKTsKK30KIAotICAgIC8vIExvYWQgY3JpdGVyaWEgZmlsZQotICAgIGlmICgobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSAmJgotICAgICAgICAobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5laXRoZXIgdmVuZG9yIGNvbmYgZmlsZSAoJXMpIG5vciBzeXN0ZW0gY29uZiBmaWxlICglcykgY291bGQgYmUgZm91bmQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoLAotICAgICAgICAgICAgICBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCk7CitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzSW5jbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVBhaXJzIHBhaXJzLCBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG5vdCBpc1N0YXJ0ZWQoKSwgIkNhbm5vdCBhZGQgYSBjcml0ZXJpb24gaWYgUEZXIGlzIGFscmVhZHkgc3RhcnRlZCIpOworICAgIGF1dG8gY3JpdGVyaW9uVHlwZSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOworCisgICAgZm9yIChhdXRvIHBhaXIgOiBwYWlycykgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgcGFpciAlZCwlcyBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgcGFpci5maXJzdCwKKyAgICAgICAgICAgICAgcGFpci5zZWNvbmQuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kLCBlcnJvcik7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKG5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKKyAgICAgICAgICAgICAgICAiJXM6IENyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOworCisgICAgYXV0byBjcml0ZXJpb24gPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24obmFtZSwgY3JpdGVyaW9uVHlwZSk7CisgICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOworCisgICAgaWYgKG5vdCBkZWZhdWx0VmFsdWUuZW1wdHkoKSkgeworICAgICAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOworICAgICAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRlZmF1bHRWYWx1ZS5jX3N0cigpLCBudW1lcmljYWxWYWx1ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShudW1lcmljYWxWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6On5QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCkBAIC0xMTIsMTEyICsxNTgsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlKGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlvblR5cGVzLmZpbmQodHlwZU5hbWUpID09IG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uVHlwZSAlcyBhbHJlYWR5IGFkZGVkIiwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgQUxPR0QoIiVzOiBBZGRpbmcgbmV3IGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGVOYW1lLmNfc3RyKCkpOwotCi0gICAgbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKAotICAgIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCi0gICAgdWludDMyX3QgbnVtZXJpY1ZhbHVlLAotICAgIGNvbnN0IHN0cmluZyAmbGl0ZXJhbFZhbHVlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSAhPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgJXMgbm90IGZvdW5kIiwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgQUxPR1YoIiVzOiBBZGRpbmcgbmV3IHZhbHVlIHBhaXIgKCVkLCVzKSBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBudW1lcmljVmFsdWUsIGxpdGVyYWxWYWx1ZS5jX3N0cigpLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqY3JpdGVyaW9uVHlwZSA9IG1Qb2xpY3lDcml0ZXJpb25UeXBlc1t0eXBlTmFtZV07Ci0gICAgc3RkOjpzdHJpbmcgZXJyb3I7Ci0gICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLCBlcnJvcik7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlOwotICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0KLSAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnR5cGVOYW1lID0gbm9kZS0+bmFtZTsKLSAgICAgICAgY2hhciAqdmFsdWVOYW1lcyA9IHN0cm5kdXAobm9kZS0+dmFsdWUsIHN0cmxlbihub2RlLT52YWx1ZSkpOwotCi0gICAgICAgIGFkZENyaXRlcmlvblR5cGUodHlwZU5hbWUsIGlzSW5jbHVzaXZlKTsKLQotICAgICAgICB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgICAgIGNoYXIgKmN0eDsKLSAgICAgICAgY2hhciAqdmFsdWVOYW1lID0gc3RydG9rX3IodmFsdWVOYW1lcywgIiwiLCAmY3R4KTsKLSAgICAgICAgd2hpbGUgKHZhbHVlTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoc3RybGVuKHZhbHVlTmFtZSkgIT0gMCkgewotCi0gICAgICAgICAgICAgICAgLy8gQ29uZiBmaWxlIG1heSB1c2Ugb3Igbm90IHBhaXIsIGlmIG5vIHBhaXIsIHVzZSBpbmNyZW1lbnRhbCBpbmRleCwgZWxzZQotICAgICAgICAgICAgICAgIC8vIHVzZSBwcm92aWRlZCBpbmRleC4KLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHZhbHVlTmFtZSwgJzonKSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlyc3QgPSBzdHJ0b2sodmFsdWVOYW1lLCAiOiIpOwotICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNvbmQgPSBzdHJ0b2soTlVMTCwgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGZpcnN0ICE9IE5VTEwpICYmIChzdHJsZW4oZmlyc3QpICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgIT0gTlVMTCkgJiYgKHN0cmxlbihzZWNvbmQpICE9IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBwYWlyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG88c3RyaW5nLCB1aW50MzJfdD4oZmlyc3QsIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGluZGV4KCVzKSBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIGluZGV4LCBzZWNvbmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGZ3SW5kZXggPSBpc0luY2x1c2l2ZSA/IDEgPDwgaW5kZXggOiBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgcGZ3SW5kZXgsIHZhbHVlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWVOYW1lID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmY3R4KTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHZhbHVlTmFtZXMpOwotICAgIH0KLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIGZhbHNlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0cmluZyAmdHlwZSkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLQotICAgICAgICBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdEZWZhdWx0VGFnKSB7Ci0gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBub2RlLT52YWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ1R5cGVUYWcpIHsKLSAgICAgICAgICAgIHR5cGUgPSBub2RlLT52YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCAlcyAlcyBub2RlIiwgX19GVU5DVElPTl9fLCBub2RlLT5uYW1lLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogVCAqUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEVsZW1lbnQoY29uc3Qgc3RyaW5nICZuYW1lLCBzdGQ6Om1hcDxzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKQogewpAQCAtMjM2LDk3ICsxNzYsNiBAQAogICAgIHJldHVybiBpdCAhPSBlbGVtZW50c01hcC5lbmQoKSA/IGl0LT5zZWNvbmQgOiBOVUxMOwogfQogCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IG5vIGluY2x1c2l2ZSBjcml0ZXJpYSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLSAgICAgICAgbG9hZENyaXRlcmlvbihub2RlKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvbihjb25zdCBzdHJpbmcgJm5hbWUsIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQobmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAotICAgICAgICAgICAgICAgICJSb3V0ZSBDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIG5hbWUuY19zdHIoKSk7Ci0KLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqY3JpdGVyaW9uVHlwZSA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlPih0eXBlTmFtZSwgbVBvbGljeUNyaXRlcmlvblR5cGVzKTsKLQotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24obmFtZSwgY3JpdGVyaW9uVHlwZSk7Ci0KLSAgICBtUG9saWN5Q3JpdGVyaWFbbmFtZV0gPSBjcml0ZXJpb247Ci0gICAgaW50IG51bWVyaWNhbFZhbHVlID0gMDsKLSAgICBpZiAoIWNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSwgIG51bWVyaWNhbFZhbHVlKSkgewotICAgICAgICBBTE9HRSgiJXM7IHRyeWluZyB0byBhcHBseSBpbnZhbGlkIGRlZmF1bHQgbGl0ZXJhbCB2YWx1ZSAoJXMpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBkZWZhdWx0TGl0ZXJhbFZhbHVlLmNfc3RyKCkpOwotICAgIH0KLSAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG51bWVyaWNhbFZhbHVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlvbihjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjb25zdCBjaGFyICpjcml0ZXJpb25OYW1lID0gcm9vdC0+bmFtZTsKLQotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKGNyaXRlcmlvbk5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBjcml0ZXJpb25OYW1lKTsKLQotICAgIHN0cmluZyBwYXJhbUtleU5hbWUgPSAiIjsKLSAgICBzdHJpbmcgcGF0aCA9ICIiOwotICAgIHN0cmluZyB0eXBlTmFtZSA9ICIiOwotICAgIHN0cmluZyBkZWZhdWx0VmFsdWUgPSAiIjsKLQotICAgIHBhcnNlQ2hpbGRyZW4ocm9vdCwgZGVmYXVsdFZhbHVlLCB0eXBlTmFtZSk7Ci0KLSAgICBhZGRDcml0ZXJpb24oY3JpdGVyaW9uTmFtZSwgdHlwZU5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDb25maWcoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnUG9saWN5Q29uZlRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IGZpbmQgbm9kZSBmb3IgcGZ3IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HRCgiJXM6IExvYWRpbmcgY29uZiBmb3IgcGZ3IiwgX19GVU5DVElPTl9fKTsKLSAgICBsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShub2RlKTsKLSAgICBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShub2RlKTsKLSAgICBsb2FkQ3JpdGVyaWEobm9kZSk7Ci19Ci0KLQotc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgQUxPR19BU1NFUlQocGF0aCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlOiBlbXB0eSBwYXRoIik7Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBBTE9HRCgiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJVbmFibGUgdG8gYWxsb2NhdGUgYSBjb25maWd1cmF0aW9uIG5vZGUiKTsKLSAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKLQotICAgIGxvYWRDb25maWcocm9vdCk7Ci0KLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0gICAgQUxPR0QoIiVzOiBsb2FkZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogYm9vbCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6aXNTdGFydGVkKCkKIHsKICAgICByZXR1cm4gbVBmd0Nvbm5lY3RvciAmJiBtUGZ3Q29ubmVjdG9yLT5pc1N0YXJ0ZWQoKTsKQEAgLTMzNSw5ICsxODQsOSBAQAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4obW9kZSkpKSB7CkBAIC0zNTEsOSArMjAwLDkgQEAKIGF1ZGlvX21vZGVfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0CiB7CiAgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9OT1JNQUw7CiAgICAgfQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19tb2RlX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7CkBAIC0zNzAsNyArMjE5LDcgQEAKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0uY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihjb25maWcpKSkgewpAQCAtMzkwLDcgKzIzOSw3IEBACiAgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0pOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgfQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190Pihjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCkpOwpAQCAtNDA0LDEyICsyNTMsNDUgQEAKICAgICByZXR1cm4gaW50ZXJmYWNlLT5nZXRMaXRlcmFsVmFsdWUodmFsdWVUb0NoZWNrLCBsaXRlcmFsVmFsdWUpOwogfQogCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBjcml0ZXJpb25OYW1lID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZEZXNjLT50eXBlKCkpID8KKyAgICAgICAgICAgICAgICBnT3V0cHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWUgOiBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZTsKKworICAgIEFMT0dWKCIlczogZGV2aWNlIHdpdGggYWRkcmVzcyAlcyAlcyIsIF9fRlVOQ1RJT05fXywgZGV2RGVzYy0+YWRkcmVzcygpLnN0cmluZygpLAorICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFPyAiZGlzY29ubmVjdGVkIiA6ICJjb25uZWN0ZWQiKTsKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQorICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihjcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOworCisgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGF1dG8gY3JpdGVyaW9uVHlwZSA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uVHlwZSgpOworICAgIGludCBkZXZpY2VBZGRyZXNzSWQ7CisgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZXZEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCksIGRldmljZUFkZHJlc3NJZCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiB1bmtub3duIGRldmljZSBhZGRyZXNzIHJlcG9ydGVkICglcykiLCBfX0ZVTkNUSU9OX18sIGRldkRlc2MtPmFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICBpbnQgY3VycmVudFZhbHVlTWFzayA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKTsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgY3VycmVudFZhbHVlTWFzayB8PSBkZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjdXJyZW50VmFsdWVNYXNrICY9IH5kZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoY3VycmVudFZhbHVlTWFzayk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKQEAgLTQyMCw5ICszMDIsOSBAQAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ091dHB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShvdXRwdXREZXZpY2VzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZkMTc2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBEZWZpbml0aW9ucyBmb3IgYXVkaW8gcG9saWN5IGNyaXRlcmlhIGNvbmZpZ3VyYXRpb24gZmlsZSAoYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYpICAgLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0vLyAgICAgIEBUT0RPOiBzY3JpcHRlZCBmcm9tIGF1ZGlvLmggJiBhdWRpb19wb2xpY3ksaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoID0KLSAgICAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoID0KLSAgICAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotCi0vKioKLSAqIFBGVyBpbnN0YW5jZXMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQb2xpY3lDb25mVGFnID0gIlBvbGljeSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdEZWZhdWx0VGFnID0gIkRlZmF1bHQiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnVHlwZVRhZyA9ICJUeXBlIjsKLQotLyoqCi0gKiBQRlcgZWxlbWVudHMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkluY2x1c2l2ZUNyaXRlcmlvblR5cGUiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJFeGNsdXNpdmVDcml0ZXJpb25UeXBlIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0NyaXRlcmlvblRhZyA9ICJDcml0ZXJpb24iOwotCi0vKioKLSAqIFBGVyBrbm93biBjcml0ZXJpb24gdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbnB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVJbnB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZU91dHB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZyA9ICJUZWxlcGhvbnlNb2RlIjsKLQotLyoqCi0gKiBPcmRlciBNVVNUIGJlIGFsaWduIHdpdGggZGVmaW50aWlvbiBvZiBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3Qgd2l0aGluIGF1ZGlvX3BvbGljeS5oCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBnRm9yY2VVc2VDcml0ZXJpb25UYWdbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0KLXsKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9ICAgICAgICAiRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPSAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JNZWRpYSIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yUmVjb3JkIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddID0gICAgICAiRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIKLX07Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2Q1YTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBATk9URToKLSMgQXVkaW8gUG9saWN5IENyaXRlcmlhIGZpbGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKLSMKLSMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDcml0ZXJpb24gdHlwZSBFeGFtcGxlOgotIyBGb3IgZWFjaCBjcml0ZXJpb24sIGEgY291cGxlIG9mIG51bWVyaWNhbCwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcm92aWRlZCB0byB0aGUgUEZXLgotIyBUaGUgbnVtZXJpY2FsIHBhcnQgaXMgbm90IG1hbmRhdG9yeS4gSWYgbm90IGZpbGxlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IG51bWVyaWNhbCB2YWx1ZSB3aWxsIGJlCi0jIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYnkgYXVkaW8gSEFMIHVzaW5nIHRoZSBmb2xsb3dpbmcgbG9naWM6Ci0jICAgLSBFeGNsdXNpdmUgY3JpdGVyaW9uOgotIyAgICAgICAgICAqIDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAgICAgIC4uLgotIyAgICAgICAgICAqIE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLgotIyAgIC0gSW5jbHVzaXZlIGNyaXRlcmlvbjoKLSMgICAgICAgICAgKiAxIDw8IDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIDw8IDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICAgICAgLi4uCi0jICAgICAgICAgICogMSA8PCBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZSwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlfEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiAgW251bWVyaWNhbCB2YWx1ZSAxOl08bGl0ZXJhbCB2YWx1ZSAxPixbbnVtZXJpY2FsIHZhbHVlIDI6XTxsaXRlcmFsIHZhbHVlIDI+LDxsaXRlcmFsIHZhbHVlIDM+LC4uLgotIyAgICB9Ci0jIH0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyaXRlcmlvbjoKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBDcml0ZXJpb24gewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiB7Ci0jICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDxDcml0ZXJpb24gdHlwZSBuYW1lPgotIyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICA8ZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uPgotIyAgICAgICAgfQotIyAgICB9Ci0jIH0KLQotUG9saWN5IHsKLSAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSAgICAgICAgIwotICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAjIEFVRElPX0RFVklDRV9PVVRfKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMKLSAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlICAgRWFycGllY2UsU3BlYWtlcixXaXJlZEhlYWRzZXQsV2lyZWRIZWFkcGhvbmUsQmx1ZXRvb3RoU2NvLEJsdWV0b290aFNjb0hlYWRzZXQsQmx1ZXRvb3RoU2NvQ2Fya2l0LEJsdWV0b290aEEyZHAsQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMsQmx1ZXRvb3RoQTJkcFNwZWFrZXIsSGRtaSxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsUmVtb3RlU3VibWl4LFRlbGVwaG9ueVR4LExpbmUsSGRtaUFyYyxTcGRpZixGbSxBdXhMaW5lLFNwZWFrZXJTYWZlCi0gICAgICAgICMKLSAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgIyBBVURJT19ERVZJQ0VfSU5fKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMgTm90ZSBhbHNvIHRoYXQgZGlyZWN0aW9uIGJpdCB3aWxsIGJlIGRlY2ltYXRlZCBieSBBdWRpb0hBTCBpbiBvcmRlciB0byBhbGxvdyB1c2luZyBhIG1hc2sKLSAgICAgICAgIyB3aXRoIHRoZSBjYXJkaW5hbGl0eSBvZiAxIGJldHdlZW4gYSBiaXQgYW5kIGFuIGlucHV0IGRldmljZS4KLSAgICAgICAgIwotICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZSAgICBDb21tdW5pY2F0aW9uLEFtYmllbnQsQnVpbHRpbk1pYyxCbHVldG9vdGhTY29IZWFkc2V0LFdpcmVkSGVhZHNldCxIZG1pLFRlbGVwaG9ueVJ4LEJhY2tNaWMsUmVtb3RlU3VibWl4LEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxGbVR1bmVyLFR2VHVuZSxMaW5lLFNwZGlmLEJsdWV0b290aEEyZHAsTG9vcGJhY2sKLSAgICB9Ci0gICAgRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhdWRpb19tb2RlX3QKLSAgICAgICAgIyBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgQW5kcm9pZE1vZGVUeXBlICAgICAwOk5vcm1hbCwxOlJpbmdUb25lLDI6SW5DYWxsLDM6SW5Db21tdW5pY2F0aW9uCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMzpGb3JjZUJ0U2NvCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlICAgICAgICAgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMjpGb3JjZUhlYWRwaG9uZXMsNDpGb3JjZUJ0QTJkcCw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrLDEwOkZvcmNlTm9CdEEyZHAKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwzOkZvcmNlQnRTY28sNTpGb3JjZVdpcmVkQWNjZXNzb3J5Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUgICAgICAgICAgICAgMDpGb3JjZU5vbmUsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDY6Rm9yY2VCdENhckRvY2ssNzpGb3JjZUJ0RGVza0RvY2ssODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMTE6Rm9yY2VTeXN0ZW1FbmZvcmNlZAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUgIDA6Rm9yY2VOb25lLDEyOkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW9fcG9saWN5LmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUgIDA6Rm9yY2VOb25lLDEzOkZvcmNlRW5jb2RlZFN1cnJvdW5kTmV2ZXIsMTQ6Rm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMKLSAgICB9Ci0KLSAgICBDcml0ZXJpb24gewotICAgICAgICBBdmFpbGFibGVJbnB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQotICAgICAgICB9Ci0gICAgICAgIEF2YWlsYWJsZU91dHB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIE91dHB1dERldmljZXNNYXNrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKLSAgICAgICAgfQotICAgICAgICBUZWxlcGhvbnlNb2RlIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBbmRyb2lkTW9kZVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBOb3JtYWwKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvck1lZGlhIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvck1lZGlhVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckRvY2sgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvclN5c3RlbSB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCmluZGV4IDRjMWFjZmUuLjViZmFkMjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPEh3TW9kdWxlLmg+CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SV0xvY2suaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMjcsMjcgKzMyLDIwIEBACiAKIGNsYXNzIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcjsKIGNsYXNzIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U7Ci1jbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZTsKIHN0cnVjdCBjbm9kZTsKIAogY2xhc3MgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXI7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKIAogY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIKIHsKIHByaXZhdGU6Ci0gICAgdHlwZWRlZiBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyICo+IENyaXRlcmlvblR5cGVWYWx1ZVBhaXI7Ci0KLSAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICo+IENyaXRlcmlvbkNvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKj4gQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25Db2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25NYXBJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIENyaXRlcmlvbk1hcENvbnN0SXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6aXRlcmF0b3IgQ3JpdGVyaW9uVHlwZU1hcEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIENyaXRlcmlhVHlwZU1hcENvbnN0SXRlcmF0b3I7CisgICAgdXNpbmcgQ3JpdGVyaWEgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqPjsKIAogcHVibGljOgogICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CkBAIC0xMjAsNiArMTE4LDIwIEBACiAgICAgICovCiAgICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcyk7CiAKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBhZGRDcml0ZXJpb24gdG8gdGhlIHBvbGljeSBwZncKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgY3JpdGVyaW9uCisgICAgICogQHBhcmFtIGlzSW5jbHVzaXZlIGlmIHRydWUsIGluY2x1c2l2ZSwgaWYgZmFsc2UgZXhjbHVzaXZlIGNyaXRlcmlvbiB0eXBlCisgICAgICogQHBhcmFtIHBhaXJzIG9mIG51bWVyaWNhbC9saXRlcmFsIHZhbHVlcyBvZiB0aGUgY3JpdGVyaW9uCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBwcm92aWRlZCBhcyBsaXRlcmFsLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNJbmNsdXNpdmUsIFZhbHVlUGFpcnMgcGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUpOworCiBwcml2YXRlOgogICAgIC8qKgogICAgICAqIEFwcGx5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwbGF0Zm9ybSBvbiB0aGUgcG9saWN5IHBhcmFtZXRlciBtYW5hZ2VyLgpAQCAtMTMzLDk2ICsxNDUsNyBAQAogICAgICAqLwogICAgIHZvaWQgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKIAotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNyaXRlcmlvbiBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHBhdGggQ3JpdGVyaW9uIGNvbmYgZmlsZSBwYXRoLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpcyBwYXJzaW5nIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uIHR5cGUuCi0gICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSBhdHRyaWJ1dGUgb2YgdGhlIGNyaXRlcmlvbiB0eXBlLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdmFsdWUgcGFpciB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIHZhbHVlIHBhaXIgaXMgYWRkZWQgdG8uCi0gICAgICogQHBhcmFtW2luXSBudW1lcmljIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtW2luXSBsaXRlcmFsIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgdWludDMyX3QgbnVtZXJpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWwpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY3JpdGVyaW9uIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIGNyaXRlcmlvbiBpcyBhc3NvY2lhdGVkIHRvLgotICAgICAqIEBwYXJhbVtpbl0gZGVmYXVsdExpdGVyYWxWYWx1ZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpOwotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBpbmNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaWEgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlhKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIGEgY3JpdGVyaW9uIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlvbiB0eXBlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIHRydWUgaWYgaW5jbHVzaXZlLCBmYWxzZSBpcyBleGNsdXNpdmUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENvbmZpZyhjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY2hpZHJlbiBub2RlIGZyb20gYSBnaXZlbiByb290IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICogQHBhcmFtW291dF0gZGVmYXVsdFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgotICAgICAqIEBwYXJhbVtvdXRdIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCi0gICAgKi8KLSAgICB2b2lkIHBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0ZDo6c3RyaW5nICZ0eXBlKTsKLQotICAgIC8qKgorICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhbiBlbGVtZW50IGZyb20gYSBtYXAgYnkgaXRzIG5hbWUuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFQgdHlwZSBvZiBlbGVtZW50IHRvIHNlYXJjaC4KQEAgLTI2Niw4ICsxODksNyBAQAogCiAgICAgYm9vbCBpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uLCBpbnQgdmFsdWVUb0NoZWNrKTsKIAotICAgIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpb25UeXBlczsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIFR5cGUgbWFwLiAqLwotICAgIENyaXRlcmlvbkNvbGxlY3Rpb24gbVBvbGljeUNyaXRlcmlhOyAvKio8IFBvbGljeSBDcml0ZXJpb24gTWFwLiAqLworICAgIENyaXRlcmlhIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KIAogICAgIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvciAqbVBmd0Nvbm5lY3RvcjsgLyoqPCBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgY29ubmVjdG9yLiAqLwogICAgIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyICptUGZ3Q29ubmVjdG9yTG9nZ2VyOyAvKio8IFBvbGljeSBQRlcgbG9nZ2VyLiAqLwpAQCAtMjg0LDYgKzIwNiw3IEBACiAgICAgc3RydWN0IHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkOwogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lOyAvKio8IERlZmF1bHQgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWU7IC8qKjwgVmVuZG9yIFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKaW5kZXggODM3ZDViYi4uOTRmYTc4OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpAQCAtOCwxMCArOCwxMyBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICBzcmMvRW5naW5lLmNwcCBcCiAgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCisgICAgLi4vZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9TdHJlYW1Wb2x1bWVDdXJ2ZXMuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIFwKKyAgICAuLi9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcAogCiBhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKyAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAogTE9DQUxfQ0ZMQUdTICs9IFwKICAgICAtV2FsbCBcCkBAIC0yNiw4ICsyOSw3IEBACiAgICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2h3IFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZnJhbWV3b3Jrcy1hdikgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBiaW9uaWMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJpb25pYykKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtMzcsMTIgKzM5LDE5IEBACiBMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IGxpYmJhc2VfaGVhZGVycwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmxvZyBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZyBcCisgICAgbGliYXVkaW9wb2xpY3kKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZlZTRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gVE9QIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9kZWZhdWx0KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fcGhvbmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRV9TVEVNKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llc19waG9uZS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXNfcGhvbmUueG1sCitMT0NBTF9NT0RVTEVfU1RFTSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICMgaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfZGVmYXVsdCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBEZWZhdWx0IFZvbHVtZSBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gRnVsbCBEZWZhdWx0IFZvbHVtZSB0YWJsZSBmb3IgYWxsIGRldmljZSBjYXRlZ29yeSAtLT4KKzx2b2x1bWVzPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiPgorICAgICAgICA8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTk2MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgU3lzdGVtIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0yNDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xMjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtNjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgTWVkaWEgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIE1lZGlhIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDY4MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD40MiwtMjA3MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD44NSwtNTQwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgPCEtLSBOb24tbXV0YWJsZSBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogZmlyc3QgcG9pbnQgaXMgYWx3YXlzIGZvciBpbmRleCAwICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGF0dGVudWF0aW9uIGlzIHNtYWxsIGVub3VnaCB0aGF0IHN0cmVhbSBjYW4gc3RpbGwgYmUgaGVhcmQgLS0+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgICAgYmFzZWQgb24gREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSBmb3IgaGVhZHNldCAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgU3BlYWtlciBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorPC92b2x1bWVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJlMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisKKyAgICA8IS0tICJoaWRkZW4gc3RyYXRlZ2llcyIgbGlrZSBUVFMsIGVuZm9yY2VkIGF1ZGlibGU6CisgICAgICAgICAgICBTaGFsbCB3ZSBleHBvc2UgdGhlbSBoZXJlIG9yIGtlZXAgaXQgaGFyZCBjb2RlZCAtLT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZm9yIGVuZm9yY2VkIHN5c3RlbSBzb3VuZHMgaW4gY2VydGFpbgorICAgICAgICAgY291bnRyaWVzIChlLmcuIGNhbWVyYSBpbiBKYXBhbikKKyAgICAgICAgIFRoaXMgc3RyYXRlZ3kgd2lsbCBvbmx5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gcGhvbmUgaWYgZm9yY2UgZm9yIHN5c3RlbSBpcyBzZXQgdG8KKyAgICAgICAgIGVuZm9yY2VkLiAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEhPTkUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUxBUk0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGV4Y2x1c2l2ZWx5IHRyYW5zbWl0dGVkIHRocm91Z2ggdGhlICBzcGVha2VyCisgICAgICAgICAoVFRTKSBvZiB0aGUgZGV2aWNlIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgcmVyb3V0aW5nIG1heSBiZSByZW1vdmVkIGFzIGZvbGxvd2luZyBtZWRpYT8/PyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1JFUk9VVElORyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QQVRDSCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1BBVENIIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiZGUxZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwyMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFZvbHVtZSBzZWN0aW9uIGRlZmluZXMgYSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeS4KK0l0IGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yIGEgZ2l2ZW4KK3ZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwLgorPHZvbHVtZSBzdHJlYW094oCdQVVESU9fU1RSRUFNX01VU0lD4oCdIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI3MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtOTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX1NZU1RFTTwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC01MTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD41NywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI1MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50Pjg1LC0yMzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIxMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fUklORzwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fTVVTSUM8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MjU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fQUxBUk08L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTwvc3RyZWFtPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX0RUTUY8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPHN0cmVhbT5BVURJT19TVFJFQU1fVFRTPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8c3RyZWFtPkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8c3RyZWFtPkFVRElPX1NUUkVBTV9SRVJPVVRJTkc8L3N0cmVhbT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxzdHJlYW0+QVVESU9fU1RSRUFNX1BBVENIPC9zdHJlYW0+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCmluZGV4IGU4NmFlNWYuLmYxOTE3MzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CisjaW5jbHVkZSA8QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zOCw2MCArMzksMzMgQEAKIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIHsKIAorc3RydWN0IGxlZ2FjeV9zdHJhdGVneV9tYXAgeyBjb25zdCBjaGFyICpuYW1lOyBsZWdhY3lfc3RyYXRlZ3kgaWQ7IH07CitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8bGVnYWN5X3N0cmF0ZWd5X21hcD4gZ0xlZ2FjeVN0cmF0ZWd5ID0geworICAgIHsgIlNUUkFURUdZX05PTkUiLCBTVFJBVEVHWV9OT05FIH0sCisgICAgeyAiU1RSQVRFR1lfTUVESUEiLCBTVFJBVEVHWV9NRURJQSB9LAorICAgIHsgIlNUUkFURUdZX1BIT05FIiwgU1RSQVRFR1lfUEhPTkUgfSwKKyAgICB7ICJTVFJBVEVHWV9TT05JRklDQVRJT04iLCBTVFJBVEVHWV9TT05JRklDQVRJT04gfSwKKyAgICB7ICJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCIsIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIH0sCisgICAgeyAiU1RSQVRFR1lfRFRNRiIsIFNUUkFURUdZX0RUTUYgfSwKKyAgICB7ICJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIiwgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB9LAorICAgIHsgIlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiB9LAorICAgIHsgIlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIH0sCisgICAgeyAiU1RSQVRFR1lfUkVST1VUSU5HIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sCisgICAgeyAiU1RSQVRFR1lfUEFUQ0giLCBTVFJBVEVHWV9SRVJPVVRJTkcgfSwgLy8gYm9pbGVyIHRvIG1hbmFnZSBzdHJlYW0gcGF0Y2ggdm9sdW1lCit9OworCiBFbmdpbmU6OkVuZ2luZSgpCi0gICAgOiBtTWFuYWdlckludGVyZmFjZSh0aGlzKSwKLSAgICAgIG1QaG9uZVN0YXRlKEFVRElPX01PREVfTk9STUFMKSwKLSAgICAgIG1BcG1PYnNlcnZlcihOVUxMKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgewotICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICBhdXRvIHJlc3VsdCA9IEVuZ2luZUJhc2U6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsCisgICAgICAgICAgICAgIlBvbGljeSBFbmdpbmUgY29uZmlndXJhdGlvbiBpcyBwYXJ0aWFsbHkgaW52YWxpZCwgc2tpcHBlZCAlenUgZWxlbWVudHMiLAorICAgICAgICAgICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50KTsKKworICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBnTGVnYWN5U3RyYXRlZ3kpIHsKKyAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwW2dldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShzdHJhdGVneS5uYW1lKV0gPSBzdHJhdGVneS5pZDsKICAgICB9CiB9CiAKLUVuZ2luZTo6fkVuZ2luZSgpCi17Ci19Ci0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQotewotICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IE5VTEwpID8gIE5PX0VSUk9SIDogTk9fSU5JVDsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKLXsKLSAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwotCi0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKLSAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKLSAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOwotCi0gICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9IGVsc2UgaWYgKGlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmICFpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0Vm9sdW1lQ3VydmVzKCkucmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7CiAgICAgc3dpdGNoKHVzYWdlKSB7CkBAIC0xMDEsNyArNzUsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgpAQCAtMTEyLDcgKzg1LDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKQEAgLTEyMCw3ICs5Miw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKQEAgLTEzMCwyMSArMTAxLDE4IEBACiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEhETUlfU1lTVEVNX0FVRElPIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgpAQCAtMTU0LDEwOSArMTIyLDI1IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRU5DT0RFRF9TVVJST1VORCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkc6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfVklCUkFURV9SSU5HSU5HIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKICAgICAgICAgYnJlYWs7IC8vIFRPRE8gcmV0dXJuIEJBRF9WQUxVRT8KICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCi0gICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUkVST1VUSU5HOwotICAgIH0KLX0KLQotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKLXsKLSAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoICh1c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKLSAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKLQotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7Ci0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywgKHVpbnQzMl90KUFVRElPX0RFVklDRV9OT05FKTsKLX0KLQotCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneUludChyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCi0gICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0CithdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneUludChsZWdhY3lfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgdWludDMyX3QgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPQpAQCAtMjY5LDE2ICsxNTMsMTcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgotICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpIHsKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCiAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJvb2wgbWVkaWFfYWN0aXZlX2xvY2FsbHkgPQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKQotICAgICAgICAgICAgICAgICAgICB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKKyAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSksCisgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CiAgICAgICAgICAgICAvLyByb3V0aW5nIGlzIHNhbWUgYXMgbWVkaWEgd2l0aG91dCB0aGUgInJlbW90ZSIgZGV2aWNlCiAgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludChTVFJBVEVHWV9NRURJQSwKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKQEAgLTMxNSwxNCArMjAwLDE0IEBACiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlJbnB1dERldmljZXMgPQotICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAKICAgICAgICAgICAgIC8vIFRPRE86IGdldFByaW1hcnlPdXRwdXQgcmV0dXJuIG9ubHkgZGV2aWNlcyBmcm9tIGZpcnN0IG1vZHVsZSBpbgogICAgICAgICAgICAgLy8gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sLCBoZWFyaW5nIGFpZCBpcyBub3QgdGhlcmUsIGJ1dCBpdCdzCiAgICAgICAgICAgICAvLyBhIHByaW1hcnkgZGV2aWNlCiAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSBvZiBzb2x2aW5nIHRoaXMgcHJvYmxlbQogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeU91dHB1dERldmljZXMgPQotICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSAmCisgICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKS50eXBlcygpIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkgJgogICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKIAogICAgICAgICAgICAgaWYgKCgoYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgpAQCAtMzM0LDcgKzIxOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkKICAgICAgICAgLy8gb3JkZXIgb2YgcHJpb3JpdHkKLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CkBAIC0zNTIsNyArMjM3LDcgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwogICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CkBAIC0zODYsNyArMjcxLDcgQEAKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvCiAgICAgICAgICAgICAvLyBBMkRQIHNwZWFrZXIgd2hlbiBmb3JjaW5nIHRvIHNwZWFrZXIgb3V0cHV0CiAgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwpAQCAtNDEwLDkgKzI5NSw5IEBACiAKICAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKIAotICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5Ci0gICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgotICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpIHsKKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlCisgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8CisgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCiAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwpAQCAtNDI3LDcgKzMxMiw3IEBACiAgICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQogCiAgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgewogICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgIH0KIApAQCAtNDQzLDkgKzMyOCw5IEBACiAgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVXNlIE9OTFkgQmx1ZXRvb3RoIFNDTyBvdXRwdXQgd2hlbiByaW5naW5nIGluIHZpYnJhdGlvbiBtb2RlCi0gICAgICAgICAgICBpZiAoISgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICAgICAgaWYgKCEoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQogICAgICAgICAgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10KKyAgICAgICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UyICE9IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2UyOwpAQCAtNDU0LDcgKzMzOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVXNlIGJvdGggQmx1ZXRvb3RoIFNDTyBhbmQgcGhvbmUgZGVmYXVsdCBvdXRwdXQgd2hlbiByaW5naW5nIGluIG5vcm1hbCBtb2RlCi0gICAgICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgeworICAgICAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgewogICAgICAgICAgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkgewpAQCAtNDc2LDcgKzM2MSw3IEBACiAgICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBvdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBkZXNjLT5kZXZpY2UoKSAmCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBkZXNjLT5kZXZpY2VzKCkudHlwZXMoKSAmCiAgICAgICAgICAgICAgICAgICAgIChBVURJT19ERVZJQ0VfT1VUX0hETUkgfCBBVURJT19ERVZJQ0VfT1VUX1NQRElGIHwgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+bUZvcm1hdCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTQ4NCw5ICszNjksOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMgPQotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykgfHwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSk7CisgICAgICAgICAgICBpZiAob3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORykpIHx8CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCiAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKQEAgLTUwNyw3ICszOTIsNyBAQAogICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CiAgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIjAiKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIjAiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IDApIHsKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MTcsMTEgKzQwMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHByZXZlbnQgcm91dGluZyB0byBCVCBoZWFyaW5nIGFpZChiLzEyMjkzMTI2MSkuCisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKICAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC01MzIsNyArNDE5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgeworICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC01NjEsNyArNDQ4LDcgQEAKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7CisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTgyLDcgKzQ2OSw3IEBACiAKICAgICAgICAgLy8gSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgogICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9PQorICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pID09CiAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgewogICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgIH0KQEAgLTYwNCw3ICs0OTEsNyBAQAogCiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICBBTE9HVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIHN0cmF0ZWd5ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBkZXZpY2UgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKICAgICAgICAgQUxPR0VfSUYoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FLAogICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIik7CiAgICAgfQpAQCAtNjE1LDkgKzUwMiw5IEBACiAKIGF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAogewotICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOwotICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKLSAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOwogICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKQEAgLTYzMiw2ICs1MTksNyBAQAogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKICAgICAgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTY1MSw3ICs1MzksNyBAQAogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApIHsKICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQOwotICAgIH0gZWxzZSBpZiAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICB9IGVsc2UgaWYgKChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKICAgICAgICAgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpIHsKICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKQEAgLTY3MSwxMiArNTU5LDExIEBACiAgICAgICAgIGlmICgoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpID09IDApIHsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOwotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPQotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgc3dpdGNoIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKICAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgewpAQCAtNzEwLDcgKzU5Nyw3IEBACiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKLSAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKICAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CiAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgewpAQCAtNzM5LDE2ICs2MjYsMzIgQEAKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CiAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikgewogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKICAgICAgICAgYnJlYWs7CkBAIC03NjUsMTAgKzY2OCwxMDcgQEAKICAgICByZXR1cm4gZGV2aWNlOwogfQogCit2b2lkIEVuZ2luZTo6dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKQoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byAmc3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgYXV0byBkZXZpY2VzID0gZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneS0+Z2V0SWQoKSk7CisgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llc1tzdHJhdGVneS0+Z2V0SWQoKV0gPSBkZXZpY2VzOworICAgICAgICBzdHJhdGVneS0+c2V0RGV2aWNlVHlwZXMoZGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgc3RyYXRlZ3ktPnNldERldmljZUFkZHJlc3MoZGV2aWNlcy5nZXRGaXJzdFZhbGlkQWRkcmVzcygpLmNfc3RyKCkpOworICAgIH0KK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworCisgICAgYXV0byBsZWdhY3lTdHJhdGVneSA9IG1MZWdhY3lTdHJhdGVneU1hcC5maW5kKHN0cmF0ZWd5KSAhPSBlbmQobUxlZ2FjeVN0cmF0ZWd5TWFwKSA/CisgICAgICAgICAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwLmF0KHN0cmF0ZWd5KSA6IFNUUkFURUdZX05PTkU7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludChsZWdhY3lTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpQVVESU9fREVWSUNFX05PTkUpOworICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJyZWREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgZXhwbGljdCByb3V0aW5nIGRldmljZQorICAgIGlmIChwcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXMgZXhwbGljaXQgUm91dGluZyBvbiBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgcHJlZmVycmVkRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZERldmljZSk7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgYXV0byAmaW5wdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0SW5wdXRzKCk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKworICAgIC8vCisgICAgLy8gRXhwbGljaXQgUm91dGluZyA/Pz8gd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZAorICAgIC8vIGZpcnN0IGFzIGl0IHVzZWQgdG8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dHMsIGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UpOworCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIGFkZHJlc3MgPSAiMCI7CisgICAgICAgIHN0ZDo6c2l6ZV90IHBvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFncyB7IGF0dHIudGFncyB9OworICAgICAgICBpZiAoKHBvcyA9IHRhZ3MuZmluZCgiYWRkcj0iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSB0YWdzLnN1YnN0cihwb3MgKyBzdGQ6OnN0cmxlbigiYWRkcj0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworfQorCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKLSAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKaW5kZXggMDYxODZjMS4uZDhhMzY5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKLQorI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTI5LDExNCArMjksNjcgQEAKIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIHsKIAotY2xhc3MgRW5naW5lCitlbnVtIGxlZ2FjeV9zdHJhdGVneSB7CisgICAgU1RSQVRFR1lfTk9ORSA9IC0xLAorICAgIFNUUkFURUdZX01FRElBLAorICAgIFNUUkFURUdZX1BIT05FLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICBTVFJBVEVHWV9EVE1GLAorICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAorICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCisgICAgU1RSQVRFR1lfUkVST1VUSU5HLAorfTsKKworY2xhc3MgRW5naW5lIDogcHVibGljIEVuZ2luZUJhc2UKIHsKIHB1YmxpYzoKICAgICBFbmdpbmUoKTsKLSAgICB2aXJ0dWFsIH5FbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5FbmdpbmUoKSA9IGRlZmF1bHQ7CiAKICAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgogICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKIAogcHJpdmF0ZToKLSAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKLSAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisgICAgLy8vCisgICAgLy8vIGZyb20gRW5naW5lQmFzZSwgc28gZnJvbSBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1Qb2xpY3lFbmdpbmUtPnNldE9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0Q2hlY2soKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFBob25lU3RhdGUobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IC8qZGV2RGVzYyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7Ci0gICAgfSBtTWFuYWdlckludGVyZmFjZTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVyZWREZXZpY2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBBdWRpb01peCAqKm1peCA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwogICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOwogCi0gICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICBpbmxpbmUgYm9vbCBpc0luQ2FsbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChtUGhvbmVTdGF0ZSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0gICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZVN0YXRlOwotICAgIH0KLSAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOwotICAgIH0KICAgICBzdGF0dXNfdCBzZXREZWZhdWx0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCi0gICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAotICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdDsKKworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KIAotICAgIC8qKiBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbi4gKi8KLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07CisgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKKyAgICBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIGxlZ2FjeV9zdHJhdGVneT4gbUxlZ2FjeVN0cmF0ZWd5TWFwOwogfTsKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggNWRiZDViMy4uYjU2M2EwNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0zOCwyMSArMzgsMjAgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8YXVkaW9fcG9saWN5X2NvbmYuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKLSNpZm5kZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotI2luY2x1ZGUgPENvbmZpZ1BhcnNpbmdVdGlscy5oPgotI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KLSNlbmRpZgogI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSA8cG9saWN5Lmg+CkBAIC02NywyNSArNjYsMTUgQEAKIC8vIG1lZGlhIC8gbm90aWZpY2F0aW9uIC8gc3lzdGVtIHZvbHVtZS4KIGNvbnN0ZXhwciBmbG9hdCBJTl9DQUxMX0VBUlBJRUNFX0hFQURST09NX0RCID0gMy5mOwogCi0jZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQotLy8gQXJyYXkgb2YgYWxsIHN1cnJvdW5kIGZvcm1hdHMuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgU1VSUk9VTkRfRk9STUFUU1tdID0gewotICAgIEFVRElPX0ZPUk1BVF9BQzMsCi0gICAgQVVESU9fRk9STUFUX0VfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9EVFMsCi0gICAgQVVESU9fRk9STUFUX0RUU19IRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQsCi0gICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQywKLX07Ci0vLyBBcnJheSBvZiBhbGwgQUFDIGZvcm1hdHMuIFdoZW4gQUFDIGlzIGVuYWJsZWQgYnkgdXNlcnMsIGFsbCBBQUMgZm9ybWF0cyBzaG91bGQgYmUgZW5hYmxlZC4KLXN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBBQUNfRk9STUFUU1tdID0gewotICAgIEFVRElPX0ZPUk1BVF9BQUNfTEMsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwKLSAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxELAotICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFLAotfTsKKy8vIENvbXByZXNzZWQgZm9ybWF0cyBmb3IgTVNEIG1vZHVsZSwgb3JkZXJlZCBmcm9tIG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZC4KK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gY29tcHJlc3NlZEZvcm1hdHNPcmRlciA9IHt7CisgICAgICAgIEFVRElPX0ZPUk1BVF9NQVRfMl8xLCBBVURJT19GT1JNQVRfTUFUXzJfMCwgQVVESU9fRk9STUFUX0VfQUMzLAorICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB9fTsKKy8vIENoYW5uZWwgbWFza3MgZm9yIE1TRCBtb2R1bGUsIDNEID4gMkQgPiAxRCBvcmRlcmluZyAobW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkKS4KK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciA9IHt7CisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB9fTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KQEAgLTk0LDQzICs4Myw0OSBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmZGV2aWNlX2FkZHJlc3MpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbShkZXZpY2VfYWRkcmVzcyk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oZGV2aWNlLT5hZGRyZXNzKCkpOwogICAgIGNvbnN0IFN0cmluZzgga2V5KHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFID8KICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA6IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1EaXNjb25uZWN0KTsKLSAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UpOworICAgIHBhcmFtLmFkZEludChrZXksIGRldmljZS0+dHlwZSgpKTsKICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7Ci0gICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCi0gICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMgZm9ybWF0IDB4JVgiLAorICAgICAgICAgICAgZGV2aWNlVHlwZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHJldHVybiBCQURfVkFMVUU7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2VUeXBlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogCiAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2VzCi0gICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpKSB7CiAgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CiAKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldmljZSk7CiAKICAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAogICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQpAQCAtMTQwLDIxICsxMzUsMjMgQEAKICAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgY29ubmVjdGluZyBkZXZpY2UgJXMgZm9ybWF0ICV4IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBtb2R1bGUgbmFtZT0lcyIsIG1vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtMTYyLDkzICsxNTksMTIzIEBACiAKICAgICAgICAgICAgIC8vIEJlZm9yZSBjaGVja2luZyBvdXRwdXRzLCBicm9hZGNhc3QgY29ubmVjdCBldmVudCB0byBhbGxvdyBIQUwgdG8gcmV0cmlldmUgZHluYW1pYwogICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBvbiBuZXdseSBjb25uZWN0ZWQgZGV2aWNlcyAoaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSBvdXRwdXRzLi4uKQotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBvdXRwdXRzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCi0gICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgICAgIG1Id01vZHVsZXMuY2xlYW5VcEZvckRldmljZShkZXZpY2UpOworCisgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCiAgICAgICAgICAgICAvLyBvdXRwdXRzIHNob3VsZCBuZXZlciBiZSBlbXB0eSBoZXJlCiAgICAgICAgICAgICBBTE9HX0FTU0VSVChvdXRwdXRzLnNpemUoKSAhPSAwLCAic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IgogICAgICAgICAgICAgICAgICAgICAiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgbm8gb3V0cHV0cyBidXQgc3RhdHVzIE9LIik7Ci0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0cy5zaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLCBfX2Z1bmNfXywgb3V0cHV0cy5zaXplKCkpOwogCiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRldmljZSBub3QgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgICAgIC8vIFNlbmQgRGlzY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCiAgICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCi0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAotICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBtT3V0cHV0cy5jbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoZGV2aWNlKTsKKworICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIG91dHB1dHMpOworCisgICAgICAgICAgICAvLyBSZXNldCBhY3RpdmUgZGV2aWNlIGNvZGVjCisgICAgICAgICAgICBkZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpOwogCiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAgICAgICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBpbnZhbGlkIHN0YXRlOiAleCIsIF9fZnVuY19fLCBzdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAotICAgICAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAotICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCi0gICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byBldmFsdWF0ZSBwbGF5YmFjayByb3V0aW5nIHdoZW4gY29ubmVjdGluZyBhIHJlbW90ZSBzdWJtaXgKKyAgICAgICAgLy8gb3V0cHV0IGRldmljZSB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kgb2YgdHlwZSByZWNvcmRlciBhcyBubworICAgICAgICAvLyBwbGF5YmFjayB1c2UgY2FzZSBpcyBhZmZlY3RlZC4KKyAgICAgICAgYm9vbCBkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyA9IHRydWU7CisgICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgICAgICAmJiBzdHJuY21wKGRldmljZV9hZGRyZXNzLCAiMCIsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pICE9IDApIHsKICAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qb2xpY3lNaXggIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdHJuY21wKGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgIGF1dG8gY2hlY2tDbG9zZU91dHB1dHMgPSBbJl0oKSB7CisgICAgICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCisgICAgICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgQTJEUCBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9OworCisgICAgICAgIGlmIChkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcykgeworICAgICAgICAgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKGNoZWNrQ2xvc2VPdXRwdXRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VPdXRwdXRzKCk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgbXNkT3V0RGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgewotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KLSAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAobXNkT3V0RGV2aWNlcy5pc0VtcHR5KCkgfHwgbXNkT3V0RGV2aWNlcyAhPSBkZXNjLT5kZXZpY2VzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKQEAgLTI1Niw2NyArMjgzLDY2IEBACiAgICAgfSAgLy8gZW5kIGlmIGlzIG91dHB1dCBkZXZpY2UKIAogICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2VzCi0gICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VUeXBlKSkgewogICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7CiAKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogICAgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgICB7CiAgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgaW50cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgaW5wdXRzLi4uKQotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSk7CisKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKKwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZpY2UpIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC0zMjYsMTkgKzM1MiwxOSBAQAogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogCiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2RGVzYyk7CisgICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9IC8vIGVuZCBpZiBpcyBpbnB1dCBkZXZpY2UKIAotICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOworICAgIEFMT0dXKCIlcygpIGludmFsaWQgZGV2aWNlOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIApAQCAtMzQ2LDcgKzM3Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsCisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93VG9DcmVhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihkZXZpY2VfYWRkcmVzcykgIT0gMCkvKm1hdGNoQWRkcmVzcyovKTsKIAogICAgIGlmIChkZXZEZXNjID09IDApIHsKQEAgLTM2Miw1NSArMzg5LDY1IEBACiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgX19mdW5jX18sIGRldmljZSk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSkgIT0gMCkgPworICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IDApID8KICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDogQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIFN0cmluZzggcmVwbHk7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgaW50IGlzUmVjb25maWdBMmRwU3VwcG9ydGVkID0gMDsKIAotICAgIEFMT0dWKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKCkgZGV2aWNlOiAweCVYLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCgpIGRldmljZTogMHglWCwgYWRkcmVzcyAlcyBuYW1lICVzIGVuY29kZWRGb3JtYXQ6IDB4JVgiLAorICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIC8vIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZURldmljZXMgPSBnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICBpZiAoZGV2aWNlTGlzdC5lbXB0eSgpKSB7CiAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG86IGRldmljZSBpcyBub3QgY29ubmVjdGVkCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwogCiAgICAgLy8gRm9yIG9mZmxvYWRlZCBBMkRQLCBIdyBtb2R1bGVzIG1heSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvCi0gICAgLy8gY29uZmlndXJlIGNvZGVjcy4gQ2hlY2sgaWYgYW55IG9mIHRoZSBsb2FkZWQgaHcgbW9kdWxlcwotICAgIC8vIHN1cHBvcnRzIHRoaXMuCi0gICAgLy8gSWYgc3VwcG9ydGVkLCBzZW5kIGEgc2V0IHBhcmFtZXRlciB0byBjb25maWd1cmUgQTJEUCBjb2RlY3MKLSAgICAvLyBhbmQgcmV0dXJuLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCisgICAgLy8gY29uZmlndXJlIGNvZGVjcy4KKyAgICAvLyBIYW5kbGUgdHdvIHNwZWNpZmljIGNhc2VzIGJ5IHNlbmRpbmcgYSBzZXQgcGFyYW1ldGVyIHRvCisgICAgLy8gY29uZmlndXJlIEEyRFAgY29kZWNzLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCisgICAgLy8gQ2FzZSAxOiBBMkRQIGFjdGl2ZSBkZXZpY2Ugc3dpdGNoZXMgZnJvbSBwcmltYXJ5IHRvIHByaW1hcnkKKyAgICAvLyBtb2R1bGUKKyAgICAvLyBDYXNlIDI6IEEyRFAgZGV2aWNlIGNvbmZpZyBjaGFuZ2VzIG9uIHByaW1hcnkgbW9kdWxlLgogICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7Ci0gICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpKTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOwotICAgICAgICByZXBsaWVkUGFyYW1ldGVycy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSwgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpOwotICAgICAgICBpZiAoaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHApOwotICAgICAgICAgICAgcGFyYW0uYWRkKGtleSwgU3RyaW5nOCgidHJ1ZSIpKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoZGV2aWNlLCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHByaW1hcnlIYW5kbGUgPSBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCk7CisgICAgICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpLmNvbnRhaW5zKGRldkRlc2MpICYmCisgICAgICAgICAgIChtb2R1bGUgIT0gMCAmJiBtb2R1bGUtPmdldEhhbmRsZSgpID09IHByaW1hcnlIYW5kbGUpKSB7CisgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSwgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKGlzUmVjb25maWdBMmRwU3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7CisgICAgICAgICAgICAgICAgcGFyYW0uYWRkKGtleSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGV2RGVzYy0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxOCw3ICs0NTUsOCBAQAogICAgIC8vIFRoaXMgd2lsbCBmb3JjZSByZWFkaW5nIGFnYWluIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+Z2V0RW5jb2RlZEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKSBlcnJvciBkaXNhYmxpbmcgY29ubmVjdGlvbiBzdGF0ZTogJWQiLAogICAgICAgICAgICAgICBzdGF0dXMpOwpAQCAtNDI3LDcgKzQ2NSw3IEBACiAKICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKSBlcnJvciBlbmFibGluZyBjb25uZWN0aW9uIHN0YXRlOiAlZCIsCiAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC00MzcsMTYgKzQ3NSw2MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgQUxPR1YoImdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoKSIpOworICAgIGNoYXIgKnRvayA9IE5VTEwsICpzYXZlcHRyOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGNoYXIgZW5jb2RpbmdfZm9ybWF0c19saXN0W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgLy8gRklYTUUgVGhpcyBsaXN0IHNob3VsZCBub3QgY29tZSBmcm9tIGEgcHJvcGVydHkgYnV0IHRoZSBzdXBwb3J0ZWQgZW5jb2RlZAorICAgIC8vIGZvcm1hdHMgb2YgZGVjbGFyZWQgQTJEUCBkZXZpY2VzIGluIHByaW1hcnkgbW9kdWxlCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuY2FwIiwgZW5jb2RpbmdfZm9ybWF0c19saXN0LCAiIik7CisgICAgdG9rID0gc3RydG9rX3IoZW5jb2RpbmdfZm9ybWF0c19saXN0LCAiLSIsICZzYXZlcHRyKTsKKyAgICBmb3IgKDt0b2sgIT0gTlVMTDsgdG9rID0gc3RydG9rX3IoTlVMTCwgIi0iLCAmc2F2ZXB0cikpIHsKKyAgICAgICAgaWYgKHN0cmNtcCh0b2ssICJzYmMiKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNCQyBvZmZsb2FkIHN1cHBvcnRlZFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfU0JDOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2ssICJhcHR4IikgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBBUFRYIG9mZmxvYWQgc3VwcG9ydGVkXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BUFRYOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2ssICJhcHR4aGQiKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IEFQVFggSEQgb2ZmbG9hZCBzdXBwb3J0ZWRcbiIsX19mdW5jX18pOworICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0FQVFhfSEQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHRvaywgImxkYWMiKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IExEQUMgb2ZmbG9hZCBzdXBwb3J0ZWRcbiIsX19mdW5jX18pOworICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0xEQUM7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHRvaywgImFhYyIpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQUFDIG9mZmxvYWQgc3VwcG9ydGVkXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVuZGVmaW5lZCB0b2tlbiAtICVzXG4iLF9fZnVuY19fLCB0b2spOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0cy0+cHVzaF9iYWNrKGZvcm1hdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoY29uc3QgRGV2aWNlVmVjdG9yICZyeERldmljZXMsIHVpbnQzMl90IGRlbGF5TXMpCiB7CiAgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CisgICAgYm9vbCBjcmVhdGVSeFBhdGNoID0gZmFsc2U7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CiAKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKKyAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCkudHlwZXMoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKLSAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisgICAgQUxPR19BU1NFUlQoIXJ4RGV2aWNlcy5pc0VtcHR5KCksICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHNlbGVjdGVkIG91dHB1dCBkZXZpY2UiKTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gfTsKKyAgICBhdXRvIHR4U291cmNlRGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIEFMT0dfQVNTRVJUKHR4U291cmNlRGV2aWNlICE9IDAsICJ1cGRhdGVDYWxsUm91dGluZygpIGlucHV0IHNlbGVjdGVkIGRldmljZSBub3QgYXZhaWxhYmxlIik7CisKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICVzIHR4RGV2aWNlICVzIiwKKyAgICAgICAgICByeERldmljZXMuaXRlbUF0KDApLT50b1N0cmluZygpLmNfc3RyKCksIHR4U291cmNlRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKQEAgLTQ1OSw1NyArNTQxLDkyIEBACiAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwogICAgIH0KIAotICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzCi0gICAgLy8gdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgotICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KLSAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSAmIHJ4RGV2aWNlKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKKyAgICBhdXRvIHRlbGVwaG9ueVJ4TW9kdWxlID0KKyAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgYXV0byB0ZWxlcGhvbnlUeE1vZHVsZSA9CisgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAvLyByZXRyaWV2ZSBSeCBTb3VyY2UgYW5kIFR4IFNpbmsgZGV2aWNlIGRlc2NyaXB0b3JzCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNpbmtEZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisKKyAgICAvLyBSWCBhbmQgVFggVGVsZXBob255IGRldmljZSBhcmUgZGVjbGFyZWQgYnkgUHJpbWFyeSBBdWRpbyBIQUwKKyAgICBpZiAoaXNQcmltYXJ5TW9kdWxlKHRlbGVwaG9ueVJ4TW9kdWxlKSAmJiBpc1ByaW1hcnlNb2R1bGUodGVsZXBob255VHhNb2R1bGUpICYmCisgICAgICAgICAgICAodGVsZXBob255UnhNb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMpKSB7CisgICAgICAgIGlmIChyeFNvdXJjZURldmljZSA9PSAwIHx8IHR4U2lua0RldmljZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBSWCAvIFRYIFRlbGVwaG9ueSBkZXZpY2UocykgaXMoYXJlKSBub3QgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgQUxPR0UoInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFR4IGFuZC9vciBSWCBkZXZpY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgICAgICB9CisgICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBwYXRjaCAoYWthIFN3IEJyaWRnaW5nKSBpZiBQcmltYXJ5IEhXIG1vZHVsZSBoYXMgZGVjbGFyZWQgc3VwcG9ydGluZyBhCisgICAgICAgIC8vIHJvdXRlIGJldHdlZW4gdGVsZXBob255IFJYIHRvIFNpbmsgZGV2aWNlIGFuZCBTb3VyY2UgZGV2aWNlIHRvIHRlbGVwaG9ueSBUWAorICAgICAgICBjb25zdCBhdXRvICZwcmltYXJ5TW9kdWxlID0gdGVsZXBob255UnhNb2R1bGU7CisgICAgICAgIGNyZWF0ZVJ4UGF0Y2ggPSAhcHJpbWFyeU1vZHVsZS0+c3VwcG9ydHNQYXRjaChyeFNvdXJjZURldmljZSwgcnhEZXZpY2VzLml0ZW1BdCgwKSk7CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSAhcHJpbWFyeU1vZHVsZS0+c3VwcG9ydHNQYXRjaCh0eFNvdXJjZURldmljZSwgdHhTaW5rRGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvcgorICAgICAgICAvLyB2b2ljZSBjYWxscyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICAgICAgY3JlYXRlUnhQYXRjaCA9ICEoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKS5jb250YWlucyhyeERldmljZXMuaXRlbUF0KDApKSkgJiYKKyAgICAgICAgICAgICAgICAocnhTb3VyY2VEZXZpY2UgIT0gMCk7CiAgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCiAgICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCi0gICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKLSAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9ICEoYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpLmNvbnRhaW5zKHR4U291cmNlRGV2aWNlKSkgJiYKKyAgICAgICAgICAgICAgICAodHhTaW5rRGV2aWNlICE9IDApOworICAgIH0KKyAgICAvLyBVc2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgIGlmICghY3JlYXRlUnhQYXRjaCkgeworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCB0cnVlLCBkZWxheU1zKTsKICAgICB9IGVsc2UgeyAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaCh0cnVlIC8qaXNSeCovLCByeERldmljZSwgZGVsYXlNcyk7Ci0gICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaCh0cnVlIC8qaXNSeCovLCByeERldmljZXMuaXRlbUF0KDApLCBkZWxheU1zKTsKKworICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSBidXQgUlggZGV2aWNlIGlzCisgICAgICAgIC8vIG9uIG90aGVyIEhXIG1vZHVsZSwgU2lua01ldGFEYXRhIG9mIHRlbGVwaG9ueSBpbnB1dCBzaG91bGQgaGFuZGxlIGl0CisgICAgICAgIC8vIGFzc3VtaW5nIHRoZSBkZXZpY2UgdXNlcyBhdWRpbyBIQUwgVjUuMCBhbmQgYWJvdmUKICAgICB9CiAgICAgaWYgKGNyZWF0ZVR4UGF0Y2gpIHsgLy8gY3JlYXRlIFRYIHBhdGggYXVkaW8gcGF0Y2gKLSAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4U291cmNlRGV2aWNlLCBkZWxheU1zKTsKICAgICB9CiAKICAgICByZXR1cm4gbXV0ZVdhaXRNczsKIH0KIAogc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKLSAgICAgICAgYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAgICAgaWYgKGlzUngpIHsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc2lua3NbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZGV2aWNlKS4KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICB9IGVsc2UgewotICAgICAgICB0eFNvdXJjZURldmljZURlc2MgPSBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShkZXZpY2UpLgorICAgICAgICAgICAgICAgIGFkZFNpbmsobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBpc1J4ID8gZGV2aWNlIDogQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFg7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvdXRwdXREZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAvLyBAVE9ETzogc3RpbGwgaWdub3JpbmcgdGhlIGFkZHJlc3MsIG9yIG5vdCBkZWFsaW5nIHBsYXRmb3JtIHdpdGggbXV0bGlwbGUgdGVsZXBob255ZGV2aWNlcworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG91dHB1dERldmljZSA9IGlzUnggPworICAgICAgICAgICAgICAgIGRldmljZSA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Iob3V0cHV0RGV2aWNlKSwgbU91dHB1dHMpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CiAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgdGFyZ2V0IGRldmljZQogICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksICIlcygpICVzIGRldmljZSBvdXRwdXQgJWQgaXMgZHVwbGljYXRlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0KTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0ggfSk7CiAgICAgfQogCiAgICAgaWYgKCFpc1J4KSB7CkBAIC01MTgsMzkgKzYzNSw1MCBAQAogICAgICAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoIGFuZCBsb2dpYyBoZXJlIG11c3QgYmUKICAgICAgICAgLy8gc3ltbWV0cmljIHRvIHRoZSBvbmUgaW4gc3RhcnRJbnB1dCgpCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyh0eFNvdXJjZURldmljZURlc2MpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy5rZXlBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLnBhdGNoKCksICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCiAgICAgICAgICAgICAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyAlcyBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMsIGlzUnggPyAiUlgiIDogIlRYIik7CiAgICAgc3A8QXVkaW9QYXRjaD4gYXVkaW9QYXRjaDsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvUGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksIG1VaWRDYWNoZWQpOwogICAgICAgICBhdWRpb1BhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CiAgICAgICAgIGF1ZGlvUGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwogICAgIH0KICAgICByZXR1cm4gYXVkaW9QYXRjaDsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmREZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CiAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAogICAgICAgICAgICAgIiVzKCkgc2VsZWN0ZWQgZGV2aWNlIHR5cGUgJSN4IGlzIG5vdCBpbiBkZXZpY2VzIGxpc3QiLCBfX2Z1bmNfXywgZGV2aWNlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgZGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICByZXR1cm4gZGV2aWNlRGVzYzsKKyAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZURldmljZVR5cGVzKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdCB7CisgICAgc3A8SHdNb2R1bGU+IG1vZCA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUobW9kdWxlSWQpOworICAgIHJldHVybiBtb2QgIT0gMCA/IGRldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUobW9kLT5nZXRIYW5kbGUoKSkgOiBBVURJT19ERVZJQ0VfTk9ORTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGV2aWNlT2ZNb2R1bGUoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORAorICAgICAgICAgICAgICAgIHx8IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKQorICAgICAgICAgICAgICAgIC5pbmRleE9mKGRldkRlc2MpICE9IE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTU2NCwxNCArNjkyLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PwotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdG9wcwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNTg0LDQ4ICs3MDYsNDcgQEAKICAgICAgICAgICAgICAgICAgIHx8IChpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CiAKICAgICBpbnQgZGVsYXlNcyA9IDA7CiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBhdXRvIHNvbmlmaWNhdGlvblN0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAogICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCiAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCi0gICAgICAgICAgICBpZiAoKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKLSAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUobXVzaWNTdHJhdGVneSwgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgogICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bGF0ZW5jeSgpKjIpKSB7CiAgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCi0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKICAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCiAgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICByeERldmljZSA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKTsKKyAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZXMsIGRlbGF5TXMpOwogICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewogICAgICAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNjM1LDQwICs3NTYsMzAgQEAKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gcmVldmFsdWF0ZSByb3V0aW5nIG9uIGFsbCBvdXRwdXRzIGluIGNhc2UgdHJhY2tzIGhhdmUgYmVlbiBzdGFydGVkIGR1cmluZyB0aGUgY2FsbAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLCAwIC8qZGVsYXlNcyovKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCAwIC8qZGVsYXlNcyovKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KIAogICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9CisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKTsKIH0KIAogYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UGhvbmVTdGF0ZSgpIHsKQEAgLTY3Niw3ICs3ODcsNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKICAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSB1c2FnZSAlZCwgY29uZmlnICVkLCBtUGhvbmVTdGF0ZSAlZCIsIHVzYWdlLCBjb25maWcsIG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7CiAgICAgaWYgKGNvbmZpZyA9PSBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSkpIHsKQEAgLTY5Miw5ICs4MDMsNyBAQAogICAgICAgICAgICAgKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAvLyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMgaGFuZGxlZCBieSBzeXN0ZW0gVUkKQEAgLTcwNCwyNiArODEzLDI3IEBACiAgICAgICAgIGRlbGF5TXMgPSBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUzsKICAgICB9CiAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSwgZGVsYXlNcyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgd2FpdE1zID0gdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcywgZGVsYXlNcyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXREZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgewotICAgICAgICAgICAgd2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICAvLyBBcyBkb25lIGluIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSwgd2UgY291bGQgYWxzbyBmaXggZGVmYXVsdCBkZXZpY2UgaXNzdWUgYnkKKyAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KKyAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCisgICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7Ci0gICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlLCB3YWl0TXMsIHRydWUpOworICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgIW5ld0RldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCB3YWl0TXMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7CisgICAgICAgIGF1dG8gbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7CiAgICAgICAgIC8vIEZvcmNlIG5ldyBpbnB1dCBzZWxlY3Rpb24gaWYgdGhlIG5ldyBkZXZpY2UgY2FuIG5vdCBiZSByZWFjaGVkIHZpYSBjdXJyZW50IGlucHV0Ci0gICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMobmV3RGV2aWNlKSkgewogICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBuZXdEZXZpY2UpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2xvc2VJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwpAQCAtNzM2LDI4ICs4NDYsMzEgQEAKICAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwogfQogCi0vLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCi0vLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAotc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKKy8vIEZpbmQgYW4gb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZC4gV2hlbiAiZGlyZWN0T25seSIgaXMgc2V0LCByZXN0cmljdAorLy8gc2VhcmNoIHRvIHByb2ZpbGVzIGZvciBkaXJlY3Qgb3V0cHV0cy4KK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSkKIHsKLSAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KLSAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9Ci0gICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAotICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpOwotICAgIGZsYWdzID0KLSAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChkaXJlY3RPbmx5KSB7CisgICAgICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgorICAgICAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGV2YW50RmxhZ3MgPQorICAgICAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8CisgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpOworICAgICAgICBmbGFncyA9CisgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQogCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qdXBkYXRlZEZvcm1hdCovLAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLApAQCAtNzY1LDEwICs4NzgsMTYgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5IHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIGlmIGNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb2RlYworICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGlyZWN0T25seSkgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgIC8vIHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQogICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzgzLDggKzkwMiw3IEBACiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAKICAgICAvLyBOb3RlIHRoYXQgcmVsYXRlZCBtZXRob2QgZ2V0T3V0cHV0Rm9yQXR0cigpIHVzZXMgZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgbm90IHNlbGVjdE91dHB1dCgpLgogICAgIC8vIFdlIHVzZSBzZWxlY3RPdXRwdXQoKSBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGRlc2lyZWQgQXVkaW9UcmFjayBzYW1wbGUgcmF0ZSwKQEAgLTc5MiwxMyArOTEwLDE1MSBAQAogICAgIC8vIGdldE91dHB1dCgpIHNvbGVseSBvbiBhdWRpb19zdHJlYW1fdHlwZSBzdWNoIGFzIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCkKICAgICAvLyBhbmQgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgpLgogCi0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKIAotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBzdHJlYW0gJWQgc2VsZWN0ZWQgZGV2aWNlICUwOHgsIG91dHB1dCAlZCIsIHN0cmVhbSwgZGV2aWNlLCBvdXRwdXQpOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBzdHJlYW0gJWQgc2VsZWN0ZWQgZGV2aWNlcyAlcywgb3V0cHV0ICVkIiwgc3RyZWFtLAorICAgICAgICAgIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXQpOwogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtKQoreworICAgIGlmIChzcmNBdHRyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhzcmNBdHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBzcmNBdHRyLT51c2FnZSwgc3JjQXR0ci0+Y29udGVudF90eXBlLCBzcmNBdHRyLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpkc3RBdHRyID0gKnNyY0F0dHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNyY1N0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3JjU3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHNyY1N0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRySW50KAorICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcykKK3sKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlczsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIERldmljZVZlY3RvciBtc2REZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHJlcXVlc3RlZFBvcnRJZCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXMocmVzdWx0QXR0ciwgYXR0ciwgKnN0cmVhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAqc3RyZWFtID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKnJlc3VsdEF0dHIpOworCisgICAgQUxPR1YoIiVzKCkgYXR0cmlidXRlcz0lcyBzdHJlYW09JXMgc2Vzc2lvbiAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sCisgICAgICAgICAgdG9TdHJpbmcoKnJlc3VsdEF0dHIpLmNfc3RyKCksIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCksIHNlc3Npb24sIHJlcXVlc3RlZFBvcnRJZCk7CisKKyAgICAvLyBUaGUgcHJpbWFyeSBvdXRwdXQgaXMgdGhlIGV4cGxpY2l0IHJvdXRpbmcgKGVnLiBzZXRQcmVmZXJyZWREZXZpY2UpIGlmIHNwZWNpZmllZCwKKyAgICAvLyAgICAgICBvdGhlcndpc2UsIGZhbGxiYWNrIHRvIHRoZSBkeW5hbWljIHBvbGljaWVzLCBpZiBub25lIG1hdGNoLCBxdWVyeSB0aGUgZW5naW5lLgorICAgIC8vIFNlY29uZGFyeSBvdXRwdXRzIGFyZSBhbHdheXMgZm91bmQgYnkgZHluYW1pYyBwb2xpY2llcyBhcyB0aGUgZW5naW5lIGRvIG5vdCBzdXBwb3J0IHRoZW0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcG9saWN5RGVzYzsKKyAgICBpZiAobVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoKnJlc3VsdEF0dHIsIHVpZCwgcG9saWN5RGVzYywgc2Vjb25kYXJ5RGVzY3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBvbGljeURlc2MgPSBudWxscHRyOyAvLyByZXNldCBnZXRPdXRwdXRGb3JBdHRyIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICAgICBzZWNvbmRhcnlEZXNjcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgcm91dGluZyBpcyBoaWdoZXIgcHJpb3JpdHkgdGhlbiBhbnkgZHluYW1pYyBwb2xpY3kgcHJpbWFyeSBvdXRwdXQKKyAgICBib29sIHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMgPSByZXF1ZXN0ZWREZXZpY2UgPT0gbnVsbHB0ciAmJiBwb2xpY3lEZXNjICE9IG51bGxwdHI7CisKKyAgICAvLyBGSVhNRTogaW4gY2FzZSBvZiBSRU5ERVIgcG9saWN5LCB0aGUgb3V0cHV0IGNhcGFiaWxpdGllcyBzaG91bGQgYmUgY2hlY2tlZAorICAgIGlmICgodXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcyB8fCAhc2Vjb25kYXJ5RGVzY3MtPmVtcHR5KCkpCisgICAgICAgICYmICFhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgeworICAgICAgICBBTE9HRCgiJXM6IHJlamVjdGluZyByZXF1ZXN0IGFzIGR5bmFtaWMgYXVkaW8gcG9saWN5IG9ubHkgc3VwcG9ydCBwY20iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICh1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzKSB7CisgICAgICAgICpvdXRwdXQgPSBwb2xpY3lEZXNjLT5tSW9IYW5kbGU7CisgICAgICAgIEF1ZGlvTWl4ICptaXggPSBwb2xpY3lEZXNjLT5tUG9saWN5TWl4OworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZURlc2MgIT0gMCA/IGRldmljZURlc2MtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgLy8gVmlydHVhbCBzb3VyY2VzIG11c3QgYWx3YXlzIGJlIGR5bmFtaWNhbHkgb3IgZXhwbGljaXRseSByb3V0ZWQKKyAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBleHBsaWNpdCByb3V0aW5nIG1hbmFnZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kgaW4gQVBNIGlzIG5vdyBoYW5kbGVkIGJ5IGVuZ2luZQorICAgIC8vIGluIG9yZGVyIHRvIGxldCB0aGUgY2hvaWNlIG9mIHRoZSBvcmRlciB0byBmdXR1cmUgdmVuZG9yIGVuZ2luZQorICAgIG91dHB1dERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0ciwgcmVxdWVzdGVkRGV2aWNlLCBmYWxzZSk7CisKKyAgICBpZiAoKHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCisgICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgorICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCisgICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgorICAgIC8vIFRPRE86IFJlbW92ZSBjaGVjayBvZiBBVURJT19TVFJFQU1fTVVTSUMgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGVkIG9uIHRoZSBhcHAgc2lkZS4KKyAgICBpZiAob3V0cHV0RGV2aWNlcy50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCisgICAgICAgICgqc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQyAgfHwgcmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTikgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkUG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgICAgICAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzKCkgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3ggc3RyZWFtICVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MsIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCkpOworCisgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGlmICghbXNkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZXMuaXNFbXB0eSgpID8gbnVsbHB0ciA6IG91dHB1dERldmljZXMuaXRlbUF0KDApOworICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RQYXRjaChkZXZpY2UpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBVc2luZyBNU0QgZGV2aWNlcyAlcyBpbnN0ZWFkIG9mIGRldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBvdXRwdXREZXZpY2VzID0gbXNkRGV2aWNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhvdXRwdXREZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpzZWxlY3RlZERldmljZUlkID0gZ2V0Rmlyc3REZXZpY2VJZChvdXRwdXREZXZpY2VzKTsKKworICAgIEFMT0dWKCIlcyByZXR1cm5zIG91dHB1dCAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODA3LDEwMyArMTA2Myw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIHVpZCwgZGVzYykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZGVzYyAhPSAwLCAiSW52YWxpZCBkZXNjIHJldHVybmVkIGJ5IGdldE91dHB1dEZvckF0dHIiKTsKLSAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCi0gICAgICAgICAgICAiIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzLAotICAgICAgICAgICAgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0KLSAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1PdXRwdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgKnN0cmVhbSwgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSwgZGV2aWNlRGVzYywgdWlkKTsKLQotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotCi0gICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgfQotCi0gICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCi0gICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgotICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCi0gICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKLSAgICAgICAgKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKLSAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKLSAgICAgICAgaXNJbkNhbGwoKSkgewotICAgICAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IiwKLSAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKLQotICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKLSAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0RGVzY3M7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOwogCi0gICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgLy8gUHJldmVudCBmcm9tIHN0b3JpbmcgaW52YWxpZCByZXF1ZXN0ZWQgZGV2aWNlIGlkIGluIGNsaWVudHMKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCA9CisgICAgICByZXF1ZXN0ZWREZXZpY2UgIT0gbnVsbHB0ciA/IHJlcXVlc3RlZFBvcnRJZCA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQ7CiAKLSAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAorICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dERlc2NzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gd2Vha1NlY29uZGFyeU91dHB1dERlc2NzOworICAgIGZvciAoYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeU91dHB1dERlc2NzKSB7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MucHVzaF9iYWNrKHNlY29uZGFyeURlc2MpOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnID0gey5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgIC5mb3JtYXQgPSBjb25maWctPmZvcm1hdCwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIH07CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2MgPQorICAgICAgICBuZXcgVHJhY2tDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVRvVm9sdW1lU291cmNlKCpzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjcykpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IoKm91dHB1dCk7CisgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoIiVzKCkgcmV0dXJucyBvdXRwdXQgJWQgcmVxdWVzdGVkUG9ydElkICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAqb3V0cHV0LCByZXF1ZXN0ZWRQb3J0SWQsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLApAQCAtOTM0LDcgKzExNDcsOCBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICAqZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CiAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKLSAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICAgICAgICAgKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQykgPT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgQUxPR1YoIlNldCBWb0lQIGFuZCBEaXJlY3Qgb3V0cHV0IGZsYWdzIGZvciBQQ00gZm9ybWF0Iik7CkBAIC05NjAsMTEgKzExNzQsMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgfQogCiAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewpAQCAtOTc5LDcgKzExOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5jaGFubmVsX21hc2sgPT0gZGVzYy0+bUNoYW5uZWxNYXNrKSAmJgogICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbiA9PSBkZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbikpIHsKICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTk5MywxOSArMTIwOCwzNCBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBnZXRGaXJzdERldmljZUFkZHJlc3MoZGV2aWNlcyk7CiAKLSAgICAgICAgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZSwgYWRkcmVzcywgc3RyZWFtLCAqZmxhZ3MsICZvdXRwdXQpOworICAgICAgICAvLyBNU0QgcGF0Y2ggbWF5IGJlIHVzaW5nIHRoZSBvbmx5IG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gc2VydmljZSB0aGlzIHJlcXVlc3QuIFJlbGVhc2UKKyAgICAgICAgLy8gTVNEIHBhdGNoIHRvIHByaW9yaXRpemUgdGhpcyByZXF1ZXN0IG92ZXIgYW55IGFjdGl2ZSBvdXRwdXQgb24gTVNELgorICAgICAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1zZFBhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoID0gbXNkUGF0Y2hlc1tpXTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3M7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzW2pdOworICAgICAgICAgICAgICAgIGlmIChzaW5rLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaW5rLT5leHQuZGV2aWNlLnR5cGUgJiBkZXZpY2VzLnR5cGVzKCkpICE9IEFVRElPX0RFVklDRV9OT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzcy5pc0VtcHR5KCkgfHwgc3RybmNtcChzaW5rLT5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tSGFuZGxlLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZXMsIHN0cmVhbSwgKmZsYWdzLCAmb3V0cHV0KTsKIAogICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAogICAgICAgICAgICAgKGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gMCAmJiBjb25maWctPnNhbXBsZV9yYXRlICE9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpIHx8CiAgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgY29uZmlnLT5mb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgfHwKICAgICAgICAgICAgIChjb25maWctPmNoYW5uZWxfbWFzayAhPSAwICYmIGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxlIHJhdGUgJWQgJWQsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiIAorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4IiwgX19mdW5jX18sIG91dHB1dCwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgY29uZmlnLT5mb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMTAxOCwxNCArMTI0OCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24gPSBzZXNzaW9uOwogCiAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwogICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgQUxPR1YoIiVzIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgb3V0cHV0KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KQEAgLTEwNDYsMzAgKzEyNzQsMTg5IEBACiAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCiAgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQotICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2VzKCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsICIKICAgICAgICAgICAgICJzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVscyAlI3gsIGZsYWdzICUjeCIsCiAgICAgICAgICAgICBzdHJlYW0sIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKIAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkQXVkaW9JbkRldmljZSgpIGNvbnN0IHsKKyAgICBhdXRvIG1zZEluRGV2aWNlcyA9IG1Id01vZHVsZXMuZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICByZXR1cm4gbXNkSW5EZXZpY2VzLmlzRW1wdHkoKT8gbnVsbHB0ciA6IG1zZEluRGV2aWNlcy5pdGVtQXQoMCk7Cit9CisKK0RldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZEF1ZGlvT3V0RGV2aWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3TW9kdWxlcy5nZXRBdmFpbGFibGVEZXZpY2VzRnJvbU1vZHVsZU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworfQorCitjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFBhdGNoZXMoKSBjb25zdCB7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlczsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IDApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9QYXRjaGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UgPSAmcGF0Y2gtPm1QYXRjaC5zb3VyY2VzW2pdOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9PSBtc2RNb2R1bGUtPmdldEhhbmRsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZFBhdGNoZXMuYWRkQXVkaW9QYXRjaChwYXRjaC0+bUhhbmRsZSwgcGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbXNkUGF0Y2hlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzcDxId01vZHVsZT4gZGV2aWNlTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2Uob3V0cHV0RGV2aWNlLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlcyIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzID0gbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgaWYgKGlucHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIGlucHV0IHByb2ZpbGVzIGZvciBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gZGV2aWNlTW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgIGlmIChvdXRwdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gb3V0cHV0IHByb2ZpbGVzIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIG1zZFByb2ZpbGVzOworICAgIC8vIEVhY2ggSU9Qcm9maWxlIHJlcHJlc2VudHMgYSBNaXhQb3J0IGZyb20gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisgICAgZm9yIChjb25zdCBhdXRvICZpblByb2ZpbGUgOiBpbnB1dFByb2ZpbGVzKSB7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKGluUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIG1zZFByb2ZpbGVzLmFwcGVuZFZlY3RvcihpblByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGRldmljZVByb2ZpbGVzOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSkgeworICAgICAgICAgICAgZGV2aWNlUHJvZmlsZXMuYXBwZW5kVmVjdG9yKG91dFByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIGJlc3RTaW5rQ29uZmlnOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1zZFByb2ZpbGVzLmZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoZGV2aWNlUHJvZmlsZXMsCisgICAgICAgICAgICBjb21wcmVzc2VkRm9ybWF0c09yZGVyLCBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyLCB0cnVlIC8qcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcyovLAorICAgICAgICAgICAgJmJlc3RTaW5rQ29uZmlnKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dEKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGVzIGZvdW5kIGZvciBkZXZpY2U6ICVzLCBod0F2U3luYzogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdBdlN5bmMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBzaW5rQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIHNpbmtDb25maWctPmNoYW5uZWxfbWFzayA9IGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBzaW5rQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gRm9yIGVuY29kZWQgc3RyZWFtcyBmb3JjZSBkaXJlY3QgZmxhZyB0byBwcmV2ZW50IGRvd25zdHJlYW0gbWl4aW5nLgorICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgc291cmNlQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIC8vIFNwZWNpZnkgZXhhY3QgY2hhbm5lbCBtYXNrIHRvIHByZXZlbnQgZ3Vlc3NpbmcgYnkgYml0IGNvdW50IGluIFBhdGNoUGFuZWwuCisgICAgc291cmNlQ29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgc291cmNlQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gQ29weSBpbnB1dCBzdHJlYW0gZGlyZWN0bHkgd2l0aG91dCBhbnkgcHJvY2Vzc2luZyAoZS5nLiByZXNhbXBsaW5nKS4KKyAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChod0F2U3luYykgeworICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUgfAorICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLIHwgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUIHwgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgc2lua0NvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgc291cmNlQ29uZmlnLT5jb25maWdfbWFzayB8PSBjb25maWdfbWFzazsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhdGNoQnVpbGRlciBBdWRpb1BvbGljeU1hbmFnZXI6OmJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3QKK3sKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZ2V0TXNkQXVkaW9JbkRldmljZSgpKS5hZGRTaW5rKG91dHB1dERldmljZSk7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc291cmNlQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNvdXJjZXNbMF07CisgICAgYXVkaW9fcG9ydF9jb25maWcgc2lua0NvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zaW5rc1swXTsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgTVNEIG1vZHVsZSBoYXMgSFdfQVZfU1lOQyBmbGFnIHNldCBpbiB0aGUgQVAgY29uZmlnIGZpbGUuCisgICAgLy8gRm9yIG5vdywgd2UganVzdCBmb3JjZWZ1bGx5IHRyeSB3aXRoIEh3QXZTeW5jIGZpcnN0LgorICAgIHN0YXR1c190IHJlcyA9IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3Iob3V0cHV0RGV2aWNlLCB0cnVlIC8qaHdBdlN5bmMqLywKKyAgICAgICAgICAgICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUiA/IE5PX0VSUk9SIDoKKyAgICAgICAgICAgIGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgZmFsc2UgLypod0F2U3luYyovLCAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBGb3VuZCBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIGVuY29kZWQgYXVkaW8uIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgcmV0dXJuIChQYXRjaEJ1aWxkZXIoKSkuYWRkU291cmNlKHNvdXJjZUNvbmZpZykuYWRkU2luayhzaW5rQ29uZmlnKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBVc2UgbWVkaWEgc3RyYXRlZ3kgZm9yIHVuc3BlY2lmaWVkIG91dHB1dCBkZXZpY2UuIFRoaXMgc2hvdWxkIG9ubHkKKyAgICAgICAgLy8gb2NjdXIgb24gY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCkuIERldmljZSBjb25uZWN0aW9uIGV2ZW50cyBtYXkKKyAgICAgICAgLy8gdGhlcmVmb3JlIGludmFsaWRhdGUgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cy4KKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRldmljZXMuaXNFbXB0eSgpLCAibm8gb3V0cHVkZXZpY2UgdG8gc2V0IE1zZCBQYXRjaCIpOworICAgICAgICBkZXZpY2UgPSBkZXZpY2VzLml0ZW1BdCgwKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlciA9IGJ1aWxkTXNkUGF0Y2goZGV2aWNlKTsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CisgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlcyA9IGdldE1zZFBhdGNoZXMoKTsKKyAgICBpZiAoIW1zZFBhdGNoZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobXNkUGF0Y2hlcy5zaXplKCkgPiAxLAorICAgICAgICAgICAgICAgICJUaGUgY3VycmVudCBNU0QgcHJvdG90eXBlIG9ubHkgc3VwcG9ydHMgb25lIG91dHB1dCBwYXRjaCIpOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjdXJyZW50UGF0Y2ggPSBtc2RQYXRjaGVzLnZhbHVlQXQoMCk7CisgICAgICAgIGlmIChhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmY3VycmVudFBhdGNoLT5tUGF0Y2gsIHBhdGNoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKGN1cnJlbnRQYXRjaC0+bUhhbmRsZSwgbVVpZENhY2hlZCk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgLTEgLyppbmRleCovLCBudWxscHRyIC8qcGF0Y2hIYW5kbGUqLywKKyAgICAgICAgICAgIHBhdGNoLCAwIC8qZGVsYXlNcyovLCBtVWlkQ2FjaGVkLCBudWxscHRyIC8qcGF0Y2hEZXNjUHRyKi8pOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgTVNEIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgQUxPR0lfSUYoc3RhdHVzID09IE5PX0VSUk9SLCAiJXMoKSBQYXRjaCBjcmVhdGVkIGZyb20gTVNEX0lOIHRvICIKKyAgICAgICAgICAgImRldmljZTolcyAoZm9ybWF0OiUjeCBjaGFubmVsczolI3ggc2FtcGxlcmF0ZTolZCkiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LAorICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpCiB7CiAgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCi0gICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlcygpKS4KICAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKLSAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKLSAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGJpdCBkZXB0aCB0aGUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIG9uZQotICAgIC8vIDM6IHRoZSBwcmltYXJ5IG91dHB1dAotICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgaGFwdGljIHBsYXliYWNrIHdoZW4gcmVxdWVzdGluZyBoYXB0aWMgcGxheWJhY2sKKyAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKKyAgICAvLyAzOiB0aGUgb3V0cHV0IHdpdGggdGhlIGJpdCBkZXB0aCB0aGUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIG9uZQorICAgIC8vIDQ6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDU6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKQEAgLTEwNzksMTggKzE0NjYsNDYgQEAKICAgICB9CiAKICAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOworICAgIGNvbnN0IHNpemVfdCBoYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRm9ybWF0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXRGb3JGbGFncyA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCisgICAgLy8gRmxhZ3Mgd2hpY2ggbXVzdCBiZSBwcmVzZW50IG9uIGJvdGggdGhlIHJlcXVlc3QgYW5kIHRoZSBzZWxlY3RlZCBvdXRwdXQKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga01hbmRhdGVkRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSk7CisKICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBoYXB0aWMgY2hhbm5lbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgaGFwdGljIG91dHB1dCBpZiBwcmVzZW50LgorICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBoYXB0aWMgb3V0cHV0LCBzYW1lIGF1ZGlvIGZvcm1hdCBhbmQgc2FtcGxlIHJhdGUgYXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgaWYgKGhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBoYXB0aWMgY2hhbm5lbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgZmlyc3Qgb3V0cHV0IHRoYXQKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGhhcHRpYyBwbGF5YmFjay4KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA+PSBoYXB0aWNDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBoYXB0aWMgY2hhbm5lbCBpcyBub3Qgc3BlY2lmaWVkLCBza2lwIGhhcHRpYyBvdXRwdXQuCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGtNYW5kYXRlZEZsYWdzICYgZmxhZ3MpICE9CisgICAgICAgICAgICAgICAgKGtNYW5kYXRlZEZsYWdzICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmdldEZsYWdzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewpAQCAtMTEzOCw2NyArMTU1MywzMiBAQAogICAgIHJldHVybiBvdXRwdXRzWzBdOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKLSAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgLy8gUm91dGluZz8KLSAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOwotICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOwotICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peDsKLSAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCk7Ci0gICAgICAgIGlmICgocG9saWN5TWl4LT5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKG5ld0RldmljZSAhPSBvdXRwdXREZXNjLT5kZXZpY2UoKSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLQotICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CisgICAgdWludDMyX3QgZGVsYXlNczsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQsICZkZWxheU1zKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG5ld0RldmljZSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgIH0KLQogICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICB9CkBAIC0xMjA2LDE5ICsxNTg2LDIyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCiB7CiAgICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCiAgICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwogCiAgICAgKmRlbGF5TXMgPSAwOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisgICAgYXV0byBjbGllbnRTdHJhdGVneSA9IGNsaWVudC0+c3RyYXRlZ3koKTsKKyAgICBhdXRvIGNsaWVudEF0dHIgPSBjbGllbnQtPmF0dHJpYnV0ZXMoKTsKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKLSAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgeworICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKSAvKnNvdXJjZVRvSWdub3JlKi8pKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7CkBAIC0xMjMzLDYgKzE2MTYsMjQgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peDsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZVR5cGU7CisgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOworICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgICAgICAgICAgbmV3RGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0RldmljZVR5cGUgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOworICAgICAgICB9CisgICAgICAgIHNwIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShuZXdEZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZSwgIiVzOiBubyBkZXZpY2UgZm91bmQgdD0ldSwgYT0lcyIsIF9fZnVuY19fLCBuZXdEZXZpY2VUeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICB9CisKICAgICAvLyByZXF1aXJlc011dGVDaGVjayBpcyBmYWxzZSB3aGVuIHdlIGNhbiBieXBhc3MgbXV0ZSBzdHJhdGVneS4KICAgICAvLyBJdCBjb3ZlcnMgYSBjb21tb24gY2FzZSB3aGVuIHRoZXJlIGlzIG5vIG1hdGVyaWFsbHkgYWN0aXZlIGF1ZGlvCiAgICAgLy8gYW5kIG11dGluZyB3b3VsZCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgZGVsYXkgYW5kIGRyb3BwZWQgYXVkaW8uCkBAIC0xMjQyLDMxICsxNjQzLDM3IEBACiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCiAgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKLSAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgZGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChkZXZpY2VzICE9IG91dHB1dERlc2MtPmRldmljZXMoKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGNsaWVudFN0cmF0ZWd5LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAxIHx8ICFkZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKGRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgfQotCi0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKKyAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0KKyAgICAgICAgICAgIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSkpIHx8CisgICAgICAgICAgICAgZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSkgfHwKKyAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKSk7CiAgICAgICAgIHVpbnQzMl90IHdhaXRNcyA9IGJlYWNvbk11dGVMYXRlbmN5OwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgewogICAgICAgICAgICAgICAgIC8vIEFuIG91dHB1dCBoYXMgYSBzaGFyZWQgZGV2aWNlIGlmCiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQogICAgICAgICAgICAgICAgIC8vIC0gc3VwcG9ydHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UKICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNoYXJlZERldmljZSA9IG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcykuaXNFbXB0eSgpKTsKIAogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzOgogICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKQEAgLTEyNzYsNyArMTY4Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIG91dHB1dC4KICAgICAgICAgICAgICAgICBpZiAoc2hhcmVkRGV2aWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBkZXZpY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZXMoKSAhPSBkZXZpY2VzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjk5LDI1ICsxNzA2LDIwIEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlV2FpdE1zID0KLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSwgMCwgTlVMTCwgYWRkcmVzcywgcmVxdWlyZXNNdXRlQ2hlY2spOwotCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIGZvcmNlLCAwLCBOVUxMLCByZXF1aXJlc011dGVDaGVjayk7CiAKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQogICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOwogCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pKSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgICAgICB9CiAKQEAgLTEzMzYsNTYgKzE3MzgsMzggQEAKIAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOworICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pLCB0cnVlLCBvdXRwdXREZXNjKTsKICAgICB9CiAKLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKKyAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VzLnR5cGVzKCkpICYmIHBvbGljeU1peCAhPSBOVUxMICYmCisgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKLSAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSb3V0aW5nPwotICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIGludCBhY3Rpdml0eUNvdW50ID0gbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IChtT3V0cHV0Um91dGVzLmhhc1JvdXRlKHNlc3Npb24pICYmIChhY3Rpdml0eUNvdW50ID09IDApKTsKLQotICAgICAgICBpZiAoZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50KTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgKSB7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKQEAgLTEzOTMsNTIgKzE3NzcsNjUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKIHsKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisKICAgICBoYW5kbGVFdmVudEZvckJlYWNvbihzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUyA/IFNUT1BQSU5HX0JFQUNPTiA6IFNUT1BQSU5HX09VVFBVVCk7CiAKLSAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQorICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPiAwKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMSkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSh0cnVlKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGNsaWVudC0+c3RyYXRlZ3koKSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgICAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSB0cnVlOworICAgICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CiAgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworICAgICAgICBvdXRwdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKICAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdG9wVGltZShjbGllbnQsIHN5c3RlbVRpbWUoKSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCiAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgogICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAogICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCiAgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCiAgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CiAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjI7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNBY3RpdmUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlMiA9IGdldE5ld091dHB1dERldmljZShkZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGRlc2MtPmRldmljZSgpICE9IG5ld0RldmljZTI7CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlcyAhPSBkZXNjLT5kZXZpY2VzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzMiA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2VzKCkgIT0gbmV3RGV2aWNlczI7CiAKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzMiwgZm9yY2UsIGRlbGF5TXMpOworCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWFwcGx5IGRldmljZSBzcGVjaWZpYyB2b2x1bWUgaWYgbm90IGRvbmUgYnkgc2V0T3V0cHV0RGV2aWNlKCkKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIG5ld0RldmljZTIsIGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIG5ld0RldmljZXMyLnR5cGVzKCksIGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTQ0OCwxMCArMTg0NSwxMCBAQAogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG91dHB1dERlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX1JJTkcpLCBmYWxzZSwgb3V0cHV0RGVzYyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudC0+YXR0cmlidXRlcygpLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTE0NjEsMzUgKzE4NTgsNDEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgLy8gSWYgYW4gb3V0cHV0IGRlc2NyaXB0b3IgaXMgY2xvc2VkIGR1ZSB0byBhIGRldmljZSByb3V0aW5nIGNoYW5nZSwKKyAgICAgICAgLy8gdGhlbiB0aGVyZSBhcmUgcmFjZSBjb25kaXRpb25zIHdpdGggcmVsZWFzZU91dHB1dCBmcm9tIHRyYWNrcworICAgICAgICAvLyB0aGF0IG1heSBiZSBkZXN0cm95ZWQgKHdpdGggbm8gUGxheWJhY2tUaHJlYWQpIG9yIGEgUGxheWJhY2tUaHJlYWQKKyAgICAgICAgLy8gZGVzdHJveWVkIHNob3J0bHkgdGhlcmVhZnRlci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGVyZSB3ZSBqdXN0IGxvZyBhIHdhcm5pbmcsIGluc3RlYWQgb2YgYSBmYXRhbCBlcnJvci4KKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBSb3V0aW5nCi0gICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gc3RvcE91dHB1dCgpIG5lZWRzIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYmVmb3JlIHJlbGVhc2VPdXRwdXQoKQorICAgIC8vIG90aGVyd2lzZSB0aGVyZSBtYXkgYmUgaW5hY2N1cmF0ZSBzdHJlYW0gcmVmZXJlbmNlIGNvdW50cy4KKyAgICAvLyBUaGlzIGlzIGNoZWNrZWQgaW4gb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50IGJlbG93LgorICAgIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogfQogCi0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTUwMCwyOCArMTkwMywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCi0gICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3ggYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLCBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncywgdG9TdHJpbmcoKmF0dHIpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CiAgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLSAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2M7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWREZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGJvb2wgaXNTb3VuZFRyaWdnZXI7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCiAgICAgLy8gcG9zc2libGUKQEAgLTE1MzQsOCArMTk0MSw4IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmdldENsaWVudHNGb3JTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU0NCw3NSArMTk1MSw2NyBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJRC4KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IFVJRCBpcyBzaWxlbmNlZCwgYWxsb3cgYSBuZXcgVUlEIGNvbm5lY3Rpb24gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgVUlECi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9TZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3Igc2Vzc2lvbiAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXAgaXMgb3JkZXJlZCBieSBrZXkgdmFsdWVzIChwb3J0SWQpIGFuZCBwb3J0SWRzIGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbHkuIFNvIHRoZSBmaXJzdCBjbGllbnQgaW4gdGhpcyBsaXN0IGlzIHRoZSBvbmUgb3BlbmVkIGJ5IGF1ZGlvIGZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBtbWFwIHN0cmVhbSBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYmUgaWdub3JlZCBhcyBpdCBkb2VzIG5vdCBjb3JyZXNwb25kCisgICAgICAgICAgICAgICAgLy8gdG8gYW4gYWN0dWFsIGNsaWVudAorICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gKmNsaWVudHMuY2JlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gY2xpZW50LT51aWQoKSAmJiAhY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIGNsaWVudCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+dWlkKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKIAotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CiAKLSAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKLSAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgorICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChhdHRyLT50YWdzICsgc3RybGVuKCJhZGRyPSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBpZiAoZXhwbGljaXRSb3V0aW5nRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGV4cGxpY2l0Um91dGluZ0RldmljZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCisgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAocG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBleHRlcm5hbCBwb2xpY3ksIGJ1dCB0aGlzIGlucHV0IGlzIGF0dGFjaGVkIHRvIGEgbWl4IG9mIHJlY29yZGVycywKLSAgICAgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKLSAgICAgICAgICAgICAgICAvLyBrbm93IGFib3V0IGl0IGFuZCBpcyB0aGVyZWZvcmUgY29uc2lkZXJlZCAibGVnYWN5IgotICAgICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyByZWNvcmRpbmcgYSBtaXggb2YgcGxheWVycyBkZWZpbmVkIGJ5IGFuIGV4dGVybmFsIHBvbGljeSwgd2UncmUgcmVyb3V0aW5nIGZvcgotICAgICAgICAgICAgICAgIC8vIGFuIGV4dGVybmFsIHBvbGljeQotICAgICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTLCAiSW52YWxpZCBNaXggVHlwZSIpOworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCisgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTYyMCw0MyArMjAxOSw0OSBAQAogCiAgICAgfQogCi0gICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBzZXNzaW9uLCB1aWQsIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sIGF0dHJpYnV0ZXMsIGNvbmZpZywgZmxhZ3MsIHBvbGljeU1peCk7CiAgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CitleGl0OgogCi0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgJWQgdHlwZSAlZCBzZWxlY3RlZERldmljZUlkICVkIiwKLSAgICAgICAgICAgICppbnB1dCwgKmlucHV0VHlwZSwgKnNlbGVjdGVkRGV2aWNlSWQpOworICAgICpzZWxlY3RlZERldmljZUlkID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpID8KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaXNTb3VuZFRyaWdnZXIgPSBhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKSA+IDA7CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBjbGllbnREZXNjID0gbmV3IFJlY29yZENsaWVudERlc2NyaXB0b3IoKnBvcnRJZCwgdWlkLCBzZXNzaW9uLCAqYXR0ciwgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQsIGF0dHJpYnV0ZXMuc291cmNlLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIpOworICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoKmlucHV0KTsKKyAgICBpbnB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIAogZXJyb3I6Ci0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCkKIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKICAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgaW5wdXQgPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7CkBAIC0xNjY2LDcgKzIwNzEsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCisgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgogICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpOwogICAgIH0KQEAgLTE2ODEsOCArMjA4Niw3IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBwcm9maWxlRmxhZ3MgPSBmbGFnczsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHByb2ZpbGVGb3JtYXQgPSBjb25maWctPmZvcm1hdDsgLy8gcmVzZXQgZWFjaCB0aW1lIHRocm91Z2ggbG9vcCwgaW4gY2FzZSBpdCBpcyB1cGRhdGVkCi0gICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOwogICAgICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CiAgICAgICAgICAgICBicmVhazsgLy8gc3VjY2VzcwpAQCAtMTY5MSw5ICsyMDk1LDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlRmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IC8vIHJldHJ5CiAgICAgICAgIH0gZWxzZSB7IC8vIGZhaWwKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCAiCi0gICAgICAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CisgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgCisgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzKTsKICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICAgfQogICAgIH0KQEAgLTE3MDgsODYgKzIxMTIsNDEgQEAKICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KIAotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gbmV3IEF1ZGlvU2Vzc2lvbihzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIC8vIHJldXNlIGFuIG9wZW4gaW5wdXQgaWYgcG9zc2libGUKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gcmV1c2VkSW5wdXREZXNjOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgLy8gcmV1c2UgaW5wdXQgaWY6Ci0gICAgICAgIC8vIC0gaXQgc2hhcmVzIHRoZSBzYW1lIHByb2ZpbGUKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpcyBub3QgYSByZXJvdXRlIHN1Ym1peCBpbnB1dAotICAgICAgICAvLyAgICAgIEFORAotICAgICAgICAvLyAtIGl0IGlzOiBub3QgdXNlZCBmb3Igc291bmQgdHJpZ2dlcgotICAgICAgICAvLyAgICAgICAgICAgICAgICBPUgotICAgICAgICAvLyAgICAgICAgICB1c2VkIGZvciBzb3VuZCB0cmlnZ2VyIGFuZCBhbGwgY2xpZW50cyB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBJRAotICAgICAgICAvLwotICAgICAgICBpZiAoKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpICYmCi0gICAgICAgICAgICAoaXNTb3VuZFRyaWdnZXIgPT0gZGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgJiYKLSAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0KLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXMgPSBkZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoYXMgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhbGxvdyB1bm1hdGNoaW5nIHByb3BlcnRpZXMgb24gc2FtZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgaWYgKGFzLT5tYXRjaGVzKGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXMtPmNoYW5nZU9wZW5Db3VudCgxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSByZWNvcmQgd2l0aCBkaWZmZXJlbnQgYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBleGlzdHMgZm9yIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7ICkgeworICAgICAgICAgICAgc3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlICE9IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHNvdW5kIHRyaWdnZXIsIHJldXNlIGlucHV0IGlmIHVzZWQgYnkgb3RoZXIgc291bmQgdHJpZ2dlciBvbiBzYW1lIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGVsc2UKKyAgICAgICAgICAgIC8vICAgIHJldXNlIGlucHV0IGlmIGFjdGl2ZSBjbGllbnQgYXBwIGlzIG5vdCBpbiBJRExFIHN0YXRlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCgpOworICAgICAgICAgICAgYm9vbCBkb0Nsb3NlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTb3VuZFRyaWdnZXIgIT0gY2xpZW50LT5pc1NvdW5kVHJpZ2dlcigpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTb3VuZFRyaWdnZXIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50LT5pc1NvdW5kVHJpZ2dlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IGNsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJiBjbGllbnQtPmFwcFN0YXRlKCkgIT0gQVBQX1NUQVRFX0lETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9DbG9zZSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBhbHJlYWR5IG9wZW5lZCBpbnB1dCBzdHJlYW0gb24gdGhpcyBwcm9maWxlIGlmOgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IGNhcHR1cmUgc291cmNlIGlzIGJhY2tncm91bmQgT1IKLSAgICAgICAgICAgIC8vIC0gdGhlIHBhdGggcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb25zIG1hdGNoIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBuZXcgc291cmNlIHByaW9yaXR5IGlzIGxlc3MgdGhhbiB0aGUgaGlnaGVzdCBzb3VyY2UgcHJpb3JpdHkgb24gdGhpcyBpbnB1dAotICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBjYW5ub3QgYmUgcmV1c2VkLCBjbG9zZSBpdCBiZWZvcmUgb3BlbmluZyBhIG5ldyBzdHJlYW0KLSAgICAgICAgICAgIC8vIG9uIHRoZSBzYW1lIHByb2ZpbGUgZm9yIHRoZSBuZXcgY2xpZW50IHNvIHRoYXQgdGhlIHJlcXVlc3RlZCBwYXRoIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIC8vIGNhbiBiZSBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghaXNDb25jdXJyZW50U291cmNlKGlucHV0U291cmNlKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGRlc2MtPm1TYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayAhPSBjb25maWctPmNoYW5uZWxfbWFzayB8fAotICAgICAgICAgICAgICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChkZXNjLT5tRm9ybWF0LCBjb25maWctPmZvcm1hdCkpICYmCi0gICAgICAgICAgICAgICAgICAgIChzb3VyY2VfcHJpb3JpdHkoZGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGZhbHNlIC8qYWN0aXZlT25seSovKSkgPAotICAgICAgICAgICAgICAgICAgICAgc291cmNlX3ByaW9yaXR5KGlucHV0U291cmNlKSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV1c2VkSW5wdXREZXNjID0gZGVzYzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChkb0Nsb3NlKSB7CisgICAgICAgICAgICAgICAgY2xvc2VJbnB1dChkZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHJldXNpbmcgaW5wdXQgJWQiLCBfX0ZVTkNUSU9OX18sIG1JbnB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChyZXVzZWRJbnB1dERlc2MgIT0gMCkgewotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIHNlc3Npb25zID0gcmV1c2VkSW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25zKGZhbHNlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbnMua2V5QXQoaik7Ci0gICAgICAgICAgICBzdG9wSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgICAgIHJlbGVhc2VJbnB1dChyZXVzZWRJbnB1dERlc2MtPm1Jb0hhbmRsZSwgY3VycmVudFNlc3Npb24pOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICB9Ci0KICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAogICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CkBAIC0xNzk1LDE0ICsyMTU0LDcgQEAKICAgICBsQ29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGVDaGFubmVsTWFzazsKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKLSAgICBpZiAoYWRkcmVzcyA9PSAiIikgewotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKLSAgICAgICAgYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MgOiBTdHJpbmc4KCIiKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4oJmxDb25maWcsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgIGhhbElucHV0U291cmNlLCBwcm9maWxlRmxhZ3MsICZpbnB1dCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGhhbElucHV0U291cmNlLCBwcm9maWxlRmxhZ3MsICZpbnB1dCk7CiAKICAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8CkBAIC0xODE5LDcgKzIxNzEsNiBAQAogICAgIH0KIAogICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLSAgICBpbnB1dERlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwogCiAgICAgYWRkSW5wdXQoaW5wdXQsIGlucHV0RGVzYyk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMTgyNywzODkgKzIxNzgsMTc2IEBACiAgICAgcmV0dXJuIGlucHV0OwogfQogCi0vL3N0YXRpYwotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgcmV0dXJuIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKTsKLX0KKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKQotewotICAgIC8vIERvIG5vdCBhbGxvdyBjYXB0dXJlIGlmIGFuIGFjdGl2ZSB2b2ljZSBjYWxsIGlzIHVzaW5nIGEgc29mdHdhcmUgcGF0Y2ggYW5kCi0gICAgLy8gdGhlIGNhbGwgVFggc291cmNlIGRldmljZSBpcyBvbiB0aGUgc2FtZSBIVyBtb2R1bGUuCi0gICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKLSAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoCi0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc3RhcnRpbmcgY29uY3VycmVudCBjYXB0dXJlIGlzIGVuYWJsZWQgaWY6Ci0gICAgLy8gMSkgY2FwdHVyaW5nIGZvciByZS1yb3V0aW5nCi0gICAgLy8gMikgY2FwdHVyaW5nIGZvciBIT1RXT1JEIHNvdXJjZQotICAgIC8vIDMpIGNhcHR1cmluZyBmb3IgRk0gVFVORVIgc291cmNlCi0gICAgLy8gMykgQWxsIG90aGVyIGFjdGl2ZSBjYXB0dXJlcyBhcmUgZWl0aGVyIGZvciByZS1yb3V0aW5nIG9yIEhPVFdPUkQKLQotICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpIHx8Ci0gICAgICAgICAgICBpc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZUlucHV0IDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShhY3RpdmVJbnB1dC0+aW5wdXRTb3VyY2UodHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGFjdGl2ZUlucHV0LT5tRGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiByZW1vdmUgd2hlbiBjb25jdXJyZW50IGNhcHR1cmUgaXMgcmVhZHkuIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIGJ1ZyBiLzYzMDgzNTM3LgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSB7Ci0gICAgaWYgKCFtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKSB7Ci0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IDA7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKiBuTW9kdWxlcyA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG51bU1vZHVsZXMgIT0gMCkgewotICAgICAgICAgICAgbk1vZHVsZXMgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqKSBjYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXMsIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgaWYgKG5Nb2R1bGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgLy8gV2UgZmFpbGVkIHRvIG1hbGxvYyB0aGUgYnVmZmVyLCBzbyBqdXN0IHNheSBubyBmb3Igbm93LCBhbmQgaG9wZSB0aGF0IHdlIGhhdmUgbW9yZQotICAgICAgICAgICAgICAvLyByYW0gdGhlIG5leHQgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG1vZHVsZSBkZXNjcmlwdG9ycyIpOwotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU1vZHVsZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlICY9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vZHVsZXNbaV0ucHJvcGVydGllcy5jb25jdXJyZW50X2NhcHR1cmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShuTW9kdWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpCi17Ci0KLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGlucHV0OiVkLCBzZXNzaW9uOiVkLCBzaWxlbmNlZDolZCwgY29uY3VycmVuY3k6JWQpIiwKLSAgICAgICAgICAgIGlucHV0LCBzZXNzaW9uLCBzaWxlbmNlZCwgKmNvbmN1cnJlbmN5KTsKLQotICAgICpjb25jdXJyZW5jeSA9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0vLyBGSVhNRTogZGlzYWJsZSBjb25jdXJyZW50IGNhcHR1cmUgdW50aWwgVUkgaXMgcmVhZHkKLSNpZiAwCi0gICAgaWYgKCFpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGlucHV0RGVzYywgYXVkaW9TZXNzaW9uKSkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdGFydGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjbGllbnQtPnNlc3Npb24oKTsKKworICAgIEFMT0dWKCIlcyBpbnB1dDolZCwgc2Vzc2lvbjolZCkiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBzZXNzaW9uKTsKKworICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcygpICE9IDApIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBjYWxsIGluIHByb2dyZXNzIiwgaW5wdXQpOwotICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLQotICAgICAgICAvLyBJZiBhIFVJRCBpcyBpZGxlIGFuZCByZWNvcmRzIHNpbGVuY2UgYW5kIGFub3RoZXIgbm90IHNpbGVuY2VkIHJlY29yZGluZyBzdGFydHMKLSAgICAgICAgLy8gZnJvbSBhbm90aGVyIFVJRCAoaWRsZSBvciBhY3RpdmUpIHdlIHN0b3AgdGhlIGN1cnJlbnQgaWRsZSBVSUQgcmVjb3JkaW5nIGluCi0gICAgICAgIC8vIGZhdm9yIG9mIHRoZSBuZXcgb25lIC0gIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSIgVE0KLSAgICAgICAgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb25JZCA9IGFjdGl2ZVNlc3Npb24tPnNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBzdG9wcGluZyBzaWxlbmNlZCBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNQcmVlbXB0ZWRTZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEhPVFdPUkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbiBzdXBwb3J0cyBjb25jdXJyZW50IGNhcHR1cmUgaWYgdGhlCi0gICAgICAgIC8vIGlucHV0IGlzIGFsc28gYSBzb3VuZCB0cmlnZ2VyIGlucHV0LiBPdGhlcndpc2UsIHdlIHNob3VsZCBwcmVlbXB0IGFueSBob3R3b3JkIHN0cmVhbQotICAgICAgICAvLyB0aGF0J3MgcnVubmluZy4KLSAgICAgICAgY29uc3QgYm9vbCBhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyID0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSA/IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSA6IGZhbHNlOwotCi0gICAgICAgIC8vIGlmIGNhcHR1cmUgaXMgYWxsb3dlZCwgcHJlZW1wdCBjdXJyZW50bHkgYWN0aXZlIEhPVFdPUkQgY2FwdHVyZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciAmJiBhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwotICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKLSAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZm9yIEhPVFdPUkQgcHJlZW1wdGluZyBIT1RXT1JEIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHdpdGggdGhlIGNvcnJlY3Qgc2lsZW5jZSBzdGF0ZQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwotCi0gICAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKKyAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKICAgICAvLyBhcmUgY29uc2lkZXJlZCBmb3IgZGV2aWNlIHNlbGVjdGlvbgotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKKyAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZGV2aWNlLCB0cnVlIC8qIGZvcmNlICovKTsKIAotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMSB8fCBtSW5wdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgotICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKLSAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoaW5wdXREZXNjLT5hY3RpdmVDb3VudCgpICA9PSAxKSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDEpIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOwotICAgICAgICAgICAgaWYgKCgoZGV2aWNlICYgcHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDEpIHsKLSAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPmdldERldmljZVR5cGUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90Ci0gICAgICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgewotICAgICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7CisgICAgQUxPR1YoIiVzIGlucHV0ICVkIHNvdXJjZSA9ICVkIGV4aXQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnNvdXJjZSgpKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKCFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5zdG9wKCk7Ci0gICAgICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpLCBmYWxzZSAvKiBmb3JjZSAqLyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICAgICAgaWYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90Ci0gICAgICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKLSAgICAgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOwotCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CisgICAgaW5wdXREZXNjLT5zdG9wKCk7CisgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+Z2V0RGV2aWNlVHlwZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCisgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhpbnB1dERlc2MtPmdldERldmljZSgpKSAmJgorICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgcmVsZWFzaW5nIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKIAotICAgIC8vIFJvdXRpbmcKLSAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgQUxPR1YoIiVzICVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCk7CiAKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisgICAgaW5wdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIAotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgb24gc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCksIHNlc3Npb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KC0xKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+cmVtb3ZlQXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIGlmIChpbnB1dERlc2MtPmdldE9wZW5SZWZDb3VudCgpID4gMCkgewotICAgICAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCA+IDAiKTsKKyAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpID4gMCkgeworICAgICAgICBBTE9HVigiJXMoJWQpICV6dSBjbGllbnRzIHJlbWFpbmluZyIsIF9fZnVuY19fLCBwb3J0SWQsIGlucHV0RGVzYy0+Z2V0Q2xpZW50Q291bnQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBjbG9zZUlucHV0KGlucHV0KTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKKyAgICBBTE9HVigiJXMgZXhpdCIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCkKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0LT5jbGllbnRzTGlzdCh0cnVlKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBjbG9zZUNsaWVudChjbGllbnQtPnBvcnRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBzdG9wSW5wdXQocG9ydElkKTsKKyAgICByZWxlYXNlSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgewpAQCAtMjIyNiw3ICsyMzY0LDYgQEAKICAgICAgICAgfQogICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgfQotICAgIG1JbnB1dFJvdXRlcy5jbGVhcigpOwogICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKQEAgLTIyNDEsMTQgKzIzNzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQogewogICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1heCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGZvciBzdHJlYW0gJWQ6IGludmFsaWQgbWluICVkIG9yIG1heCAlZCIsIF9fZnVuY19fLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEB0b2RvOiBvdXIgcHJvcG9zYWwgbm93IHVzZSBYTUwgdG8gc3RvcmUgSW5kZXhlcyBNaW4gJiBNYXgKKyAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAKICAgICAvLyBpbml0aWFsaXplIG90aGVyIHByaXZhdGUgc3RyZWFtIHZvbHVtZXMgd2hpY2ggZm9sbG93IHRoaXMgb25lCiAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRTdHJlYW1Wb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAgICAgfQogfQogCkBAIC0yMjU2LDEzICsyMzk4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLQorICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pOwogICAgIC8vIFZPSUNFX0NBTEwgYW5kIEJMVUVUT09USF9TQ08gc3RyZWFtIGhhdmUgbWluVm9sdW1lSW5kZXggPiAwIGJ1dAogICAgIC8vIGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbiBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCi0gICAgaWYgKCgoaW5kZXggPCBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1pbihzdHJlYW0pKSAmJgorICAgIGlmICgoKGluZGV4IDwgY3VydmVzLmdldFZvbHVtZUluZGV4TWluKCkpICYmCiAgICAgICAgICAgICAhKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSAmJgogICAgICAgICAgICAgaW5kZXggPT0gMCkpIHx8Ci0gICAgICAgICAgICAoaW5kZXggPiBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pKSkgeworICAgICAgICAgICAgKGluZGV4ID4gY3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CkBAIC0yMjcwLDcgKzI0MTIsNyBAQAogICAgIH0KIAogICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgaWYgKCFjdXJ2ZXMuY2FuQmVNdXRlZCgpKSBpbmRleCA9IGN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogCiAgICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA4eCwgaW5kZXggJWQiLAogICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CkBAIC0yMjgwLDMyICsyNDIyLDMyIEBACiAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUN1cnZlcy0+YWRkQ3VycmVudFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisgICAgICAgIGF1dG8gJmN1ckN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihjdXJTdHJlYW0pKTsKKyAgICAgICAgY3VyQ3VydmVzLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKICAgICB9CiAKICAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFuZCBzdHJlYW1zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmc6CiAgICAgLy8gLSBUaGUgcmVxdWVzdGVkIHN0cmVhbSAob3IgYSBzdHJlYW0gbWF0Y2hpbmcgZm9yIHZvbHVtZSBjb250cm9sKSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dAotICAgIC8vIC0gVGhlIGRldmljZSAob3IgZGV2aWNlcykgc2VsZWN0ZWQgYnkgdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdHJlYW0gaW5jbHVkZXMKKyAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtIGluY2x1ZGVzCiAgICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKICAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQotICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneQorICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtCiAgICAgLy8gLSBGb3IgZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlIChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSksIGFwcGx5IHZvbHVtZSBvbmx5IGlmCiAgICAgLy8gbm8gc3BlY2lmaWMgZGV2aWNlIHZvbHVtZSB2YWx1ZSBleGlzdHMgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UuCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IGRlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKKyAgICAgICAgICAgIGlmICghKHN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIShkZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIChpc0luQ2FsbCgpICYmIChjdXJTdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkpIHsKKyAgICAgICAgICAgIGlmICghKGRlc2MtPmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHx8IGlzSW5DYWxsKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTdHJlYW1EZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShnZXREZXZpY2VGb3JTdHJhdGVneSgKLSAgICAgICAgICAgICAgICAgICAgY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTdHJlYW1EZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKmZyb21DYWNoZSovKS50eXBlcygpKTsKICAgICAgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJgogICAgICAgICAgICAgICAgICAgICAoKGN1clN0cmVhbURldmljZSAmIGRldmljZSkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTIzMTUsMTcgKzI0NTcsMTkgQEAKICAgICAgICAgICAgICAgICBjdXJTdHJlYW1EZXZpY2UgfD0gZGV2aWNlOwogICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gKFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGN1ckRldmljZSkgJiBjdXJTdHJlYW1EZXZpY2UpICE9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIW1Wb2x1bWVDdXJ2ZXMtPmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBjdXJTdHJlYW1EZXZpY2UpOworICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIWN1cnZlcy5oYXNWb2x1bWVJbmRleEZvckRldmljZShjdXJTdHJlYW1EZXZpY2UpOwogICAgICAgICAgICAgfQotCisgICAgICAgICAgICAvLyByZXNjYWxlIGluZGV4IGJlZm9yZSBhcHBseWluZyB0byBjdXJTdHJlYW0gYXMgcmFuZ2VzIG1heSBiZSBkaWZmZXJlbnQgZm9yCisgICAgICAgICAgICAvLyBzdHJlYW0gYW5kIGN1clN0cmVhbQorICAgICAgICAgICAgaW50IGlkeCA9IHJlc2NhbGVWb2x1bWVJbmRleChpbmRleCwgc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pOwogICAgICAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7CiAgICAgICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwogICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKICAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQotICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKSA/IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpZHgsIGRlc2MsIGN1ckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKICAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKICAgICAgICAgICAgICAgICB9CkBAIC0yMzQ1LDE0ICsyNDg5LDE0IEBACiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2UgY29ycmVzcG9uZGluZyB0bwotICAgIC8vIHRoZSBzdHJhdGVneSB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8uCisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMKKyAgICAvLyBzdHJlYW0gYnkgdGhlIGVuZ2luZS4KICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oc3RyZWFtLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CiAgICAgfQogICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CiAKLSAgICAqaW5kZXggPSAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpOworICAgICppbmRleCA9ICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwogICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTIzNjgsOSArMjUxMiw5IEBACiAgICAgLy8gMzogVGhlIHByaW1hcnkgb3V0cHV0CiAgICAgLy8gNDogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAogCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKIAogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKQEAgLTIzODYsNyArMjUzMCw3IEBACiAKICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhZGVzYy0+aXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDKSkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQykpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzIGFjdGl2ZU9ubHkgJWQgb3V0cHV0ICVkIGZsYWdzIDB4JTA4eCIsCkBAIC0yNDQxLDcgKzI1ODUsMzYgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdHMuaXNFZmZlY3RFbmFibGVkKGlkKSkgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVkIGVuYWJsZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgc2V0RWZmZWN0RW5hYmxlZChpZCwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSBtRWZmZWN0cy5nZXRFZmZlY3QoaWQpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtSW5wdXRzLnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdApAQCAtMjQ1MSwxNCArMjYyNCwxNCBAQAogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGFjdGl2ZSA9IG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5QYXN0TXMpOworICAgICAgICBhY3RpdmUgPSBtT3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pLCBpblBhc3RNcyk7CiAgICAgfQogICAgIHJldHVybiBhY3RpdmU7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKLSAgICByZXR1cm4gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKKyAgICByZXR1cm4gbU91dHB1dHMuaXNBY3RpdmVSZW1vdGVseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pLCBpblBhc3RNcyk7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CkBAIC0yNTAzLDMzICsyNjc2LDQ1IEBACiAgICAgc3A8SHdNb2R1bGU+IHJTdWJtaXhNb2R1bGU7CiAgICAgLy8gZXhhbWluZSBlYWNoIG1peCdzIHJvdXRlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgb3IgTUlYX1JPVVRFX0ZMQUdfUkVOREVSLCBub3QgdGhlIGNvbWJpbmF0aW9uCi0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19BTEwpID09IE1JWF9ST1VURV9GTEFHX0FMTCkgeworICAgICAgICBBdWRpb01peCBtaXggPSBtaXhlc1tpXTsKKyAgICAgICAgLy8gT25seSBjYXB0dXJlIG9mIHBsYXliYWNrIGlzIGFsbG93ZWQgaW4gTE9PUF9CQUNLICYgUkVOREVSIG1vZGUKKyAgICAgICAgaWYgKGlzX21peF9sb29wYmFja19yZW5kZXIobWl4Lm1Sb3V0ZUZsYWdzKSAmJiBtaXgubU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIFBvbGljeSBNaXggJXp1IG9mICV6dTogIgorICAgICAgICAgICAgICAgICAgIk9ubHkgY2FwdHVyZSBvZiBwbGF5YmFjayBpcyBhbGxvd2VkIGluIExPT1BfQkFDSyAmIFJFTkRFUiBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCkpOwogICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgTE9PUF9CQUNLIiwgaSwgbWl4ZXMuc2l6ZSgpKTsKKyAgICAgICAgLy8gTE9PUF9CQUNLIGFuZCBMT09QX0JBQ0sgfCBSRU5ERVIgaGF2ZSB0aGUgc2FtZSByZW1vdGUgc3VibWl4IGJhY2tlbmQgYW5kIGFyZSBoYW5kbGVkCisgICAgICAgIC8vIGluIHRoZSBzYW1lIHdheS4KKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0sgJWQiLCBpLCBtaXhlcy5zaXplKCksCisgICAgICAgICAgICAgICAgICBtaXgubVJvdXRlRmxhZ3MpOwogICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpOwogICAgICAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiBVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4LCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgYWRkcmVzcyAlcyIsIGksIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peC5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXgubUZvcm1hdDsKICAgICAgICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCiAgICAgICAgICAgICAvLyBzdGVyZW8gYW5kIGxldCBhdWRpbyBmbGluZ2VyIGRvIHRoZSBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkLgogICAgICAgICAgICAgb3V0cHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKQEAgLTI1MzksMzEgKzI3MjQsMzcgQEAKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPmFkZElucHV0UHJvZmlsZShhZGRyZXNzLCAmaW5wdXRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKIAotICAgICAgICAgICAgaWYgKG1peGVzW2ldLm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGlmIChtaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewogICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG1peGVzW2ldLm1EZXZpY2VUeXBlOworICAgICAgICB9IGVsc2UgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBtaXgubURldmljZVR5cGU7CiAgICAgICAgICAgICBBTE9HVigiIHJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBSRU5ERVIsIGRldj0weCVYIGFkZHI9JXMiLAotICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2wgZm91bmRPdXRwdXQgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwIDsgaiA8IG1PdXRwdXRzLnNpemUoKSA7IGorKykgewogICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3IoZGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChwYXRjaCAhPSAwKSAmJiAocGF0Y2gtPm1QYXRjaC5udW1fc2lua3MgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSA9PSBkZXZpY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3RybmNtcChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgZGVzYykgIT0gTk9fRVJST1IpIHsKKworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peCwgZGVzYykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgcmVnaXN0ZXIgbWl4IFJFTkRFUiwgIGRldj0weCVYIGFkZHI9JXMiLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kT3V0cHV0ID0gdHJ1ZTsKQEAgLTI1NzQsMTIgKzI3NjUsMTIgQEAKIAogICAgICAgICAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIgRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgZGV2aWNlIDB4JVggYWRkciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZE91dHB1dCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIgT3V0cHV0IG5vdCBmb3VuZCBmb3IgbWl4ICV6dSBmb3IgZGV2aWNlIDB4JVggYWRkciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yNjIwLDE4ICsyODExLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSAgewogICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MpOwogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlSW5wdXRQcm9maWxlKGFkZHJlc3MpOwogCi0gICAgICAgIH0gaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgeworICAgICAgICB9IGVsc2UgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewogICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KG1peC5tRGV2aWNlQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTI2NDEsNTcgKzI4MzIsMTE3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGF1ZGlvRm9ybWF0UHJlZml4TGVuID0gc2l6ZW9mKCJBVURJT19GT1JNQVRfIik7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbXQgOiBtTWFudWFsU3Vycm91bmRGb3JtYXRzKSB7CisgICAgICAgIGlmIChpKysgIT0gMCkgZHN0LT5hcHBlbmQoIiwgIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNmbXQ7CisgICAgICAgIEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcoZm10LCBzZm10KTsKKyAgICAgICAgZHN0LT5hcHBlbmQoc2ZtdC5zaXplKCkgPj0gYXVkaW9Gb3JtYXRQcmVmaXhMZW4gPworICAgICAgICAgICAgICAgIHNmbXQuY19zdHIoKSArIGF1ZGlvRm9ybWF0UHJlZml4TGVuIC0gMSA6IHNmbXQuY19zdHIoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICBBTE9HVigiJXMoKSB1aWQ9JWQgbnVtIGRldmljZXMgJXp1IiwgX19GVU5DVElPTl9fLCB1aWQsIGRldmljZXMuc2l6ZSgpKTsKKyAgICAvLyB1aWQvZGV2aWNlIGFmZmluaXR5IGlzIG9ubHkgZm9yIG91dHB1dCBkZXZpY2VzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VzW2ldLm1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoInNldFVpZERldmljZUFmZmluaXRpZXMoKSBkZXZpY2U9JTA4eCBpcyBOT1QgYW4gb3V0cHV0IGRldmljZSIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZXNbaV0ubVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSAgbVBvbGljeU1peGVzLnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKKyAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlZXZhbHVhdGUgb3V0cHV0cyBmb3IgYWxsIGdpdmVuIGRldmljZXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0ubUFkZHJlc3MsIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXRVaWREZXZpY2VBZmZpbml0aWVzKCkgZXJyb3IgaW4gY2hlY2tPdXRwdXRzRm9yRGV2aWNlIGZvciBkZXZpY2U9JTA4eCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYWRkcj0lcyIsIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0ubUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgQUxPR1YoIiVzKCkgdWlkPSVkIiwgX19GVU5DVElPTl9fLCB1aWQpOworICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzOworICAgIHN0YXR1c190IHJlcyA9ICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlc0ZvclVpZCh1aWQsIGRldmljZXMpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVldmFsdWF0ZSBvdXRwdXRzIGZvciBhbGwgZm91bmQgZGV2aWNlcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0ubUFkZHJlc3MsIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHggYWRkcj0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0ubUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAorICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOworICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUGhvbmUgc3RhdGU6ICVzXG4iLCBzdGF0ZUxpdGVyYWwuY19zdHIoKSk7CisgICAgY29uc3QgY2hhciogZm9yY2VVc2VzW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9IHsKKyAgICAgICAgImNvbW11bmljYXRpb25zIiwgIm1lZGlhIiwgInJlY29yZCIsICJkb2NrIiwgInN5c3RlbSIsCisgICAgICAgICJIRE1JIHN5c3RlbSBhdWRpbyIsICJlbmNvZGVkIHN1cnJvdW5kIG91dHB1dCIsICJ2aWJyYXRlIHJpbmdpbmciIH07CisgICAgZm9yIChhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgaSA9IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgIGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSA9IChhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QpKChpbnQpaSArIDEpKSB7CisgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2VWYWx1ZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKGkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcmNlIHVzZSBmb3IgJXM6ICVkIiwgZm9yY2VVc2VzW2ldLCBmb3JjZVVzZVZhbHVlKTsKKyAgICAgICAgaWYgKGkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EICYmCisgICAgICAgICAgICAgICAgZm9yY2VVc2VWYWx1ZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIgKE1BTlVBTDogIik7CisgICAgICAgICAgICBkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKGRzdCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFRUUyBvdXRwdXQgJXNhdmFpbGFibGVcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiIiA6ICJub3QgIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbmZpZyBzb3VyY2U6ICVzXG4iLCBtQ29uZmlnLmdldFNvdXJjZSgpLmNfc3RyKCkpOyAvLyBnZXRDb25maWcgbm90IGNvbnN0CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOworICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOworICAgIG1PdXRwdXRzLmR1bXAoZHN0KTsKKyAgICBtSW5wdXRzLmR1bXAoZHN0KTsKKyAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGRzdCk7CisgICAgbVBvbGljeU1peGVzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9Tb3VyY2VzLmR1bXAoZHN0KTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcblBvbGljeSBFbmdpbmUgZHVtcDpcbiIpOworICAgIG1FbmdpbmUtPmR1bXAoZHN0KTsKK30KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAotICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIHN0YXRlTGl0ZXJhbDsKLSAgICBBdWRpb01vZGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSwgc3RhdGVMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVzXG4iLCBzdGF0ZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAotICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGhkbWkgc3lzdGVtIGF1ZGlvICVkXG4iLAotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBlbmNvZGVkIHN1cnJvdW5kIG91dHB1dCAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgVFRTIG91dHB1dCAlc1xuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICJhdmFpbGFibGUiIDogIm5vdCBhdmFpbGFibGUiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGR1bXAoJnJlc3VsdCk7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwotICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7Ci0gICAgbU91dHB1dHMuZHVtcChmZCk7Ci0gICAgbUlucHV0cy5kdW1wKGZkKTsKLSAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKLSAgICBtRWZmZWN0cy5kdW1wKGZkKTsKLSAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZmQpOwotICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGZkKTsKLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjcxMiwxMiArMjk2Myw5IEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7Ci0gICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KQEAgLTI3MzYsOSArMjk4NCwxMiBAQAogICAgIH0KIAogICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKLSAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgewotICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICBjb25zdCBpbnQgbWluX2R1cmF0aW9uX3NlY3MgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIC0xIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChtaW5fZHVyYXRpb25fc2VjcyA+PSAwKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtaW5fZHVyYXRpb25fc2Vjcyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewpAQCAtMjc1OCwxNSArMzAwOSwzNCBAQAogCiAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCiAgICAgLy8gQVVESU9fREVWSUNFX05PTkUKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KERldmljZVZlY3RvcigpIC8qaWdub3JlIGRldmljZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOwogICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRfZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhhdHRyaWJ1dGVzLmZsYWdzLCAmb3V0cHV0X2ZsYWdzKTsKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KERldmljZVZlY3RvcigpIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CisgICAgQUxPR1YoIiVzKCkgcHJvZmlsZSAlc2ZvdW5kIHdpdGggbmFtZTogJXMsICIKKyAgICAgICAgInNhbXBsZSByYXRlOiAldSwgZm9ybWF0OiAweCV4LCBjaGFubmVsX21hc2s6IDB4JXgsIG91dHB1dCBmbGFnczogMHgleCIsCisgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIsCisgICAgICAgIChwcm9maWxlICE9IDAgPyBwcm9maWxlLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkgOiAibnVsbCIpLAorICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5mb3JtYXQsIGNvbmZpZy5jaGFubmVsX21hc2ssIG91dHB1dF9mbGFncyk7CisgICAgcmV0dXJuIChwcm9maWxlICE9IDApOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjg3NSw4ICszMTQ1LDcgQEAKICAgICB9CiAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOwogCi0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAotICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICBpZiAoIWF1ZGlvX3BhdGNoX2lzX3ZhbGlkKHBhdGNoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93CkBAIC0yOTQ4LDggKzMyMTcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldkRlc2MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRTYW1wbGluZ1JhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LApAQCAtMjk3MCw3ICszMjM4LDcgQEAKICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQogICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlcy50eXBlcygpLCB0cnVlLCAwLCBoYW5kbGUpOworICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIHRydWUsIDAsIGhhbmRsZSk7CiAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CkBAIC0yOTk5LDE0ICszMjY3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZm9ybWF0LApAQCAtMzAyMCw5ICszMjg3LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCi0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+dHlwZSgpLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2RGVzYy0+dHlwZSgpLCB0cnVlLCBoYW5kbGUpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgc2V0dGluZyBkZXZpY2UgJXMgb24gb3V0cHV0ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldmljZSwgdHJ1ZSwgaGFuZGxlKTsKICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKQEAgLTMwNDIsMTYgKzMzMDksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vdXBkYXRlIHNvdXJjZSBhbmQgc2luayB3aXRoIG91ciBvd24gZGF0YSBhcyB0aGUgZGF0YSBwYXNzZWQgaW4gdGhlIHBhdGNoIG1heQogICAgICAgICAgICAgLy8gYmUgaW5jb21wbGV0ZS4KICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBuZXdQYXRjaCA9ICpwYXRjaDsKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworICAgICAgICAgICAgc3JjRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKIAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewpAQCAtMzA1OSwyOSArMzMyNiwyOSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOworICAgICAgICAgICAgICAgIHNpbmtEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CiAKICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKICAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJlbnQgSFcgbW9kdWxlcyBPUgogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAKLSAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2VEZXNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDwgMykpIHsKKyAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMCBidXQgbm8gcm91dGUgaGFzIGJlZW4gZGVjbGFyZWQgYmV0d2VlbiBkZXZpY2VzCisgICAgICAgICAgICAgICAgaWYgKCFzcmNEZXZpY2UtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3JjRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPnR5cGUoKSwgbU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0byBnbyB2aWEKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CkBAIC0zMDk1LDI4ICszMzYyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKIAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZuZXdQYXRjaCwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBpbmRleCwgaGFuZGxlLCAmbmV3UGF0Y2gsIDAsIHVpZCwgJnBhdGNoRGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTMxNTYsMTEgKzM0MDMsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CkBAIC0zMjQ5LDEwICszNDk2LDEwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnID0ge307CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZyA9IHt9OwogICAgICAgICBhdWRpb1BvcnRDb25maWctPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgMCk7CiAgICAgfQpAQCAtMzI4MCwzMSArMzUyNywzMSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAvLyBUYWtlIHRoZSBmaXJzdCBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgcHJvZHVjdCBzdHJhdGVneSBhcyBpdCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSByb3V0ZWQKKyAgICAvLyBkZXZpY2UuIEFsbCBhdHRyaWJ1dGVzIHdpaGluIGEgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSAicm91dGluZyBzdHJhdGVneSIKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKS5mcm9udCgpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZmFsc2UpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgIGlmIChtT3V0cHV0cy5rZXlBdChqKSA9PSBvdXB0dXRUb1NraXApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgaWYgKCFpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5KSkgeworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHMpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvLyBJZiB0aGUgZGVmYXVsdCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kgaXMgb24gYW5vdGhlciBvdXRwdXQgbWl4LAogICAgICAgICAvLyBpbnZhbGlkYXRlIGFsbCB0cmFja3MgaW4gdGhpcyBzdHJhdGVneSB0byBmb3JjZSByZSBjb25uZWN0aW9uLgogICAgICAgICAvLyBPdGhlcndpc2Ugc2VsZWN0IG5ldyBkZXZpY2Ugb24gdGhlIG91dHB1dCBtaXguCiAgICAgICAgIGlmIChvdXRwdXRzLmluZGV4T2YobU91dHB1dHMua2V5QXQoaikpIDwgMCkgewotICAgICAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvIHN0cmVhbSA6IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgZmFsc2UpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsIGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyksIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTMzMTIsMTMgKzM1NTksMTggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhclNlc3Npb25Sb3V0ZXModWlkX3QgdWlkKQogewogICAgIC8vIHJlbW92ZSBvdXRwdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAotICAgIFNvcnRlZFZlY3Rvcjxyb3V0aW5nX3N0cmF0ZWd5PiBhZmZlY3RlZFN0cmF0ZWdpZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltT3V0cHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFN0cmF0ZWdpZXMuYWRkKGdldFN0cmF0ZWd5KHJvdXRlLT5tU3RyZWFtVHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPHByb2R1Y3Rfc3RyYXRlZ3lfdD4gYWZmZWN0ZWRTdHJhdGVnaWVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBvdXRwdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYXV0byBjbGllbnRTdHJhdGVneSA9IGNsaWVudC0+c3RyYXRlZ3koKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKGFmZmVjdGVkU3RyYXRlZ2llcyksIGVuZChhZmZlY3RlZFN0cmF0ZWdpZXMpLCBjbGllbnRTdHJhdGVneSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZChhZmZlY3RlZFN0cmF0ZWdpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZmZlY3RlZFN0cmF0ZWdpZXMucHVzaF9iYWNrKGNsaWVudC0+c3RyYXRlZ3koKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzI5LDEyICszNTgxLDEyIEBACiAKICAgICAvLyByZW1vdmUgaW5wdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zb3VyY2VfdD4gYWZmZWN0ZWRTb3VyY2VzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUlucHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChyb3V0ZS0+bVNvdXJjZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChjbGllbnQtPnNvdXJjZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzNDIsNyArMzU5NCw3IEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHNUb0Nsb3NlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5pbnB1dFNvdXJjZSgpKSA+PSAwKSB7CisgICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPnNvdXJjZSgpKSA+PSAwKSB7CiAgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLmFkZChpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzU0LDggKzM2MDYsOCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCkKIHsKICAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1NvdXJjZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHNvdXJjZURlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChzb3VyY2VEZXNjLT51aWQoKSA9PSB1aWQpIHsKICAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShtQXVkaW9Tb3VyY2VzLmtleUF0KGkpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMzNjcsODcgKzM2MTksMTEwIEBACiB7CiAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CiAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfSU5QVVQpOwotICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfSE9UV09SRCB9OworICAgICpkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0ciktPnR5cGUoKTsKIAogICAgIHJldHVybiBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWNxdWlyZVNlc3Npb24oKnNlc3Npb24sICppb0hhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7Ci0gICAgQUxPR1YoIiVzIHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBhcmd1bWVudDogc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotCiAgICAgaWYgKHNvdXJjZS0+cm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8CiAgICAgICAgICAgICBzb3VyY2UtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBBTE9HVigiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOworICAgICAgICBBTE9HVygiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0KICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKHNvdXJjZS0+ZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlLT5leHQuZGV2aWNlLmFkZHJlc3MpKTsKLSAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgaWYgKHNyY0RldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQotICAgICAgICAgICAgbmV3IEF1ZGlvU291cmNlRGVzY3JpcHRvcihzcmNEZXZpY2VEZXNjLCBhdHRyaWJ1dGVzLCB1aWQpOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2g7CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaCA9IHt9OwogICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZkdW1teVBhdGNoLCB1aWQpOwotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MgPSBwYXRjaERlc2M7CisKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbmV3IFNvdXJjZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgKnBvcnRJZCwgdWlkLCAqYXR0cmlidXRlcywgcGF0Y2hEZXNjLCBzcmNEZXZpY2UsCisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgIHN0cmVhbVRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUF1ZGlvU291cmNlcy5hZGQoc291cmNlRGVzYy0+Z2V0SGFuZGxlKCksIHNvdXJjZURlc2MpOwotICAgICAgICAqaGFuZGxlID0gc291cmNlRGVzYy0+Z2V0SGFuZGxlKCk7CisgICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKCpwb3J0SWQsIHNvdXJjZURlc2MpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCiB7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKIAogICAgIC8vIG1ha2Ugc3VyZSB3ZSBvbmx5IGhhdmUgb25lIHBhdGNoIHBlciBzb3VyY2UuCiAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPSBzb3VyY2VEZXNjLT5tRGV2aWNlOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gc291cmNlRGVzYy0+YXR0cmlidXRlcygpOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc291cmNlRGVzYy0+c3RyZWFtKCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0gc291cmNlRGVzYy0+c3JjRGV2aWNlKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2lua0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2Uoc2lua0RldmljZSwgU3RyaW5nOCgiIikpOworICAgIERldmljZVZlY3RvciBzaW5rRGV2aWNlcyA9CisgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCB0cnVlKTsKKyAgICBBTE9HX0FTU0VSVCghc2lua0RldmljZXMuaXNFbXB0eSgpLCAiY29ubmVjdEF1ZGlvU291cmNlKCk6IG5vIGRldmljZSBmb3VuZCBmb3IgYXR0cmlidXRlcyIpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBzaW5rRGV2aWNlcy5pdGVtQXQoMCk7CisgICAgQUxPR19BU1NFUlQobUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMoc2lua0RldmljZSksICIlczogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1QYXRjaDsKIAotICAgIGlmIChzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0KLSAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFuZGxlKCkgJiYKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA+PSAzICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoIiVzIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzAiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChzcmNEZXZpY2UtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2UpICYmCisgICAgICAgICAgICBzcmNEZXZpY2UtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpID49IDMgJiYKKyAgICAgICAgICAgIHNpbmtEZXZpY2UtPmdldE1vZHVsZSgpLT5zdXBwb3J0c1BhdGNoKHNyY0RldmljZSwgc2lua0RldmljZSkgJiYKKyAgICAgICAgICAgIHNyY0RldmljZS0+Z2V0QXVkaW9Qb3J0KCktPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyBEZXZpY2UgdG8gRGV2aWNlIHJvdXRlIHN1cHBvcnRlZCBieSA+PTMuMCBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBIVyBvciBTVyBwYXRjaAogICAgICAgICAvLyAgIGNyZWF0ZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgLy8gICBjcmVhdGUgSHdvdXRwdXQgYW5kIGFkZCB0byBtSHdPdXRwdXRzCiAgICAgfSBlbHNlIHsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNvdXJjZURlc2MtPmNvbmZpZygpLnNhbXBsZV9yYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gc291cmNlRGVzYy0+Y29uZmlnKCkuY2hhbm5lbF9tYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgJnNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBubyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBubyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICUwOHggaXMgZHVwbGljYXRlZCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCBpcyBkdXBsaWNhdGVkIiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5zdGFydCgpOwpAQCAtMzQ2MCw1MSArMzczNSw1NiBAQAogICAgICAgICAvLyBiZSBjb25uZWN0ZWQgYXMgd2VsbCBhcyB0aGUgc3RyZWFtIHR5cGUgZm9yIHZvbHVtZSBjb250cm9sCiAgICAgICAgIC8vIC0gdGhlIHNpbmsgaXMgZGVmaW5lZCBieSB3aGF0ZXZlciBvdXRwdXQgZGV2aWNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIG91dHB1dAogICAgICAgICAvLyB0aG91Z2ggd2hpY2ggdGhpcyBwYXRjaCBpcyByb3V0ZWQuCi0gICAgICAgIHBhdGNoLT5udW1fc2lua3MgPSAwOwotICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMgPSAyOwotICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMF0sIE5VTEwpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMV0sIE5VTEwpOwotICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gc3RyZWFtOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzcmNEZXZpY2UpLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBzdHJlYW0gfSk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgIEFMT0dWKCIlcyBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1QYXRjaCA9ICpwYXRjaEJ1aWxkZXIucGF0Y2goKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBwb3J0SWQgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXREZXNjIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKKwogICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBzaW5rRGV2aWNlLCBOVUxMLCAmZGVsYXlNcyk7CisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTUyLDUwICszODMyLDYgQEAKICAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKSB7Ci0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGlvSGFuZGxlLCBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSk7Ci0gICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAotICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksIHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBmb3JtYXQsIGJhaWxpbmcgb3V0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGZvcm1hdCA6IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKSkgewotICAgICAgICAvLyBPbmx5IEFVRElPX0ZPUk1BVF9BQUNfTEMgd2lsbCBiZSB1c2VkIGluIFNldHRpbmdzIFVJIGZvciBhbGwgQUFDIGZvcm1hdHMuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBBQUNfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUNfTEM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBleGlzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0c1tpXSkgewotICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChTVVJST1VORF9GT1JNQVRTW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhpc3QgJiYgaXNTdXJyb3VuZEZvcm1hdCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCkBAIC0zNjA1LDI2MSArMzg0MSwxOTkgQEAKICAgICAgICAgICAgIChzdXJyb3VuZEZvcm1hdHMgPT0gTlVMTCB8fCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkID09IE5VTEwpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiZ2V0U3Vycm91bmRGb3JtYXRzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIiwKLSAgICAgICAgICAgICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7Ci0KLSAgICAvLyBPbmx5IHJldHVybiB2YWx1ZSBpZiB0aGVyZSBpcyBIRE1JIG91dHB1dC4KLSAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAgcmVwb3J0ZWQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogCiAgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKICAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7Ci0gICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IDA7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOyAvLyBVc2VzIHByaW1hcnkgc3Vycm91bmQgZm9ybWF0cyBvbmx5CiAgICAgaWYgKHJlcG9ydGVkKSB7Ci0gICAgICAgIC8vIE9ubHkgZ2V0IHN1cnJvdW5kIGZvcm1hdHMgd2hpY2ggYXJlIHJlcG9ydGVkIGJ5IGRldmljZS4KLSAgICAgICAgLy8gRmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSTsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwotICAgICAgICBib29sIHJlcG9ydGVkRm9ybWF0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycy4KLSAgICAgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoQVVESU9fREVWSUNFX09VVF9IRE1JKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dHMuaXRlbUF0KGopLCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1heCBPdXRwdXQgbnVtYmVyICV1IGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1heE9wZW5Db3VudCwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0LCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIC8vIFJldHVybiBmb3JtYXRzIGZyb20gYWxsIGRldmljZSBwcm9maWxlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGJ5CisgICAgICAgIC8vIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXTsKKyAgICAgICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzID0KKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5nZXRBdWRpb1BvcnQoKS0+Z2V0QXVkaW9Qcm9maWxlcygpLmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc3VwcG9ydGVkRm9ybWF0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQoc3VwcG9ydGVkRm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIuc2Vjb25kLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVwb3J0ZWRGb3JtYXRGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoU1VSUk9VTkRfRk9STUFUU1tpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSBmb3JtYXRzLnNpemUoKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOworICAgIGZvciAoY29uc3QgYXV0byYgZm9ybWF0OiBmb3JtYXRzKSB7CiAgICAgICAgIGlmIChmb3JtYXRzV3JpdHRlbiA8IGZvcm1hdHNNYXgpIHsKLSAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXRzW2ldOwotICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0c1tpXSA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZmluZChBQUNfRk9STUFUU1tpXSkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsKKyAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXQ7CisgICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgc3dpdGNoIChmb3JjZVVzZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChmb3JtYXQpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1TdXJyb3VuZEZvcm1hdHMuZmluZChmb3JtYXRzW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVI6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gQVVUTyBvciBBTFdBWVMgPT4gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRbZm9ybWF0c1dyaXR0ZW4rK10gPSBmb3JtYXRFbmFibGVkOwogICAgICAgICB9Ci0gICAgICAgICgqbnVtU3Vycm91bmRGb3JtYXRzKSsrOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYXVkaW8gZm9ybWF0IGlzIGEgc3Vycm91bmQgZm9ybWF0cy4KLSAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gU1VSUk9VTkRfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgaXNTdXJyb3VuZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWlzU3Vycm91bmRGb3JtYXQpIHsKKyAgICBBTE9HVigiJXMoKSBmb3JtYXQgMHglWCBlbmFibGVkICVkIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKKyAgICBjb25zdCBhdXRvJiBmb3JtYXRJdGVyID0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5maW5kKGF1ZGlvRm9ybWF0KTsKKyAgICBpZiAoZm9ybWF0SXRlciA9PSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIGZvcm1hdCAweCVYIGlzIG5vdCBhIGtub3duIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gTUFOVUFMLgotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKLSAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwotICAgIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKSAhPQorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vdCBpbiBtYW51YWwgbW9kZSBmb3Igc3Vycm91bmQgc291bmQgZm9ybWF0IHNlbGVjdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmICgobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmIGVuYWJsZWQpCi0gICAgICAgICAgICB8fCAobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSA9PSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmICFlbmFibGVkKSkgeworICAgIGlmICgobU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChhdWRpb0Zvcm1hdCkgIT0gMCkgPT0gZW5hYmxlZCkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgLy8gVGhlIG9wZXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gdGhlcmUgaXMgSERNSSBvdXRwdXQgYXZhaWxhYmxlLgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBzdXJyb3VuZEZvcm1hdHNCYWNrdXAobU1hbnVhbFN1cnJvdW5kRm9ybWF0cyk7CiAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2Uoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjOwogICAgIGJvb2wgcHJvZmlsZVVwZGF0ZWQgPSBmYWxzZTsKLSAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgIC8vIEZJWE1FOiBXaHkgZG9pbmcgdGhpcyBmb3IgaW5wdXQgSERNSSBkZXZpY2VzIGlmIHdlIGRvbid0IGF1Z21lbnQgdGhlaXIgcmVwb3J0ZWQgZm9ybWF0cz8KKyAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KIAotICAgIC8vIFVuZG8gdGhlIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIGR1ZSB0byBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLgogICAgIGlmICghcHJvZmlsZVVwZGF0ZWQpIHsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1coIiVzKCkgbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZCwgdW5kb2luZyBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSIsIF9fZnVuY19fKTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6bW92ZShzdXJyb3VuZEZvcm1hdHNCYWNrdXApOwogICAgIH0KIAogICAgIHJldHVybiBwcm9maWxlVXBkYXRlZCA/IE5PX0VSUk9SIDogSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOnNldFJlY29yZFNpbGVuY2VkKHVpZDolZCwgc2lsZW5jZWQ6JWQpIiwgdWlkLCBzaWxlbmNlZCk7CisgICAgQUxPR1YoIiVzKHVpZDolZCwgc3RhdGU6JWQpIiwgX19mdW5jX18sIHVpZCwgc3RhdGUpOwogCi0gICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0gICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGFjdGl2ZVNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KGopOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPnVpZCgpID09IHVpZCkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldEFwcFN0YXRlKHN0YXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQ7CisgICAgICAgICAgICBvdXRQcm9maWxlLT50b0F1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9Qb3J0Lm51bV9jaGFubmVsX21hc2tzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LmNoYW5uZWxfbWFza3NbaV0gJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgcG9ydCBJZCAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgaWYgKHBhdGNoRGVzYyA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5vIHBhdGNoIHdpdGggaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZW1vdmVBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogCi0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHNvdXJjZURlc2MpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzd091dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Id091dHB1dC5wcm9tb3RlKCk7CisgICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5od091dHB1dCgpLnByb21vdGUoKTsKICAgICAgICAgaWYgKGh3T3V0cHV0RGVzYyAhPSAwKSB7CiAgICAgICAgICAgLy8gICByZWxlYXNlIHBhdGNoIGJldHdlZW4gc3JjIGRldmljZSBhbmQgb3V0cHV0IGRldmljZQogICAgICAgICAgIC8vICAgY2xvc2UgSHdvdXRwdXQgYW5kIHJlbW92ZSBmcm9tIG1Id091dHB1dHMKQEAgLTM4NzAsMTYgKzQwNDQsMTUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCitzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCiB7Ci0gICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2U7CisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU291cmNlcy5zaXplKCk7IGkrKykgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHNvdXJjZVN0cmF0ZWd5ID0KLSAgICAgICAgICAgICAgICAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKLSAgICAgICAgaWYgKHNvdXJjZVN0cmF0ZWd5ID09IHN0cmF0ZWd5ICYmIG91dHB1dERlc2MgIT0gMCAmJiBvdXRwdXREZXNjLT5tSW9IYW5kbGUgPT0gb3V0cHV0KSB7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoYXR0ciwgc291cmNlRGVzYy0+YXR0cmlidXRlcygpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgIT0gMCAmJiBvdXRwdXREZXNjLT5tSW9IYW5kbGUgPT0gb3V0cHV0KSB7CiAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2VEZXNjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM4OTUsNyArNDA2OCw2IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uKys7CiB9CiAKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCiAvLyBUcmVibGl6ZWQgYXVkaW8gcG9saWN5IHhtbCBjb25maWcgd2lsbCBiZSBsb2NhdGVkIGluIC9vZG0vZXRjIG9yIC92ZW5kb3IvZXRjLgogc3RhdGljIGNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9CiAgICAgICAgIHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKQEAgLTM5MjQsNDMgKzQwOTYsMzMgQEAKIAogICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CiAgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIGNvbmZpZyk7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsICZjb25maWcpOwogICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2UoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci0jZW5kaWYKIAogQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypmb3JUZXN0aW5nKi8pCiAgICAgOgotICAgIG1VaWRDYWNoZWQoZ2V0dWlkKCkpLAorICAgIG1VaWRDYWNoZWQoQUlEX0FVRElPU0VSVkVSKSwgLy8gbm8gbmVlZCB0byBjYWxsIGdldHVpZCgpLCB0aGVyZSdzIG9ubHkgb25lIG9mIHVzIHJ1bm5pbmcuCiAgICAgbXBDbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAogICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIHN0YXRpY19jYXN0PFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24qPihtVm9sdW1lQ3VydmVzLmdldCgpKSksCi0jZWxzZQotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCkpLAotICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSksCi0jZW5kaWYKKyAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtRGVmYXVsdE91dHB1dERldmljZSksCiAgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCiAgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLAogICAgIG1CZWFjb25NdXRlZChmYWxzZSksCiAgICAgbVR0c091dHB1dEF2YWlsYWJsZShmYWxzZSksCiAgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAotICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSksCi0gICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZShmYWxzZSkKKyAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpCiB7CiB9CiAKQEAgLTM5NzEsMjEgKzQxMzMsMjIgQEAKICAgICBpbml0aWFsaXplKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgewotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKLSNlbHNlCi0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKQotICAgICAgICAgICAmJiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSkgeworLy8gIFRoaXMgY2hlY2sgaXMgdG8gY2F0Y2ggYW55IGxlZ2FjeSBwbGF0Zm9ybSB1cGRhdGluZyB0byBRIHdpdGhvdXQgaGF2aW5nCisvLyAgc3dpdGNoZWQgdG8gWE1MIHNpbmNlIGl0cyBkZXByZWNhdGlvbiBvbiBPLgorLy8gVE9ETzogYWZ0ZXIgUSByZWxlYXNlLCByZW1vdmUgdGhpcyBjaGVjayBhbmQgZmxhZyBhcyBYTUwgaXMgbm93IHRoZSBvbmx5CisvLyAgICAgICAgb3B0aW9uIGFuZCBhbGwgbGVnYWN5IHBsYXRmb3JtIHNob3VsZCBoYXZlIHRyYW5zaXRpb25lZCB0byBYTUwuCisjaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKKyNlcnJvciBBdWRpbyBwb2xpY3kgbm8gbG9uZ2VyIHN1cHBvcnRzIGxlZ2FjeSAuY29uZiBjb25maWd1cmF0aW9uIGZvcm1hdAogI2VuZGlmCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgeworICAgIGlmIChkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKGdldENvbmZpZygpKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwogICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemUoKSB7Ci0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhnZXRDb25maWcoKS5pc1NwZWFrZXJEcmNFbmFibGVkKCkpOwotCiAgICAgLy8gT25jZSBwb2xpY3kgY29uZmlnIGhhcyBiZWVuIHBhcnNlZCwgcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVuZ2luZSBhbmQgaW5pdGlhbGl6ZSBpdC4KICAgICBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFlbmdpbmVJbnN0YW5jZSkgewpAQCAtNDAwNyw4ICs0MTcwLDYgQEAKIAogICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCiAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCi0gICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzQWxsKSB7CiAgICAgICAgIGh3TW9kdWxlLT5zZXRIYW5kbGUobXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShod01vZHVsZS0+Z2V0TmFtZSgpKSk7CiAgICAgICAgIGlmIChod01vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CkBAIC00MDM3LDUxICs0MTk4LDQ5IEBACiAgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCk7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHN1cHBvcnRlZERldmljZSA9IDA7CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAgICAgLy8gb3V0cHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUob3V0cHV0RGV2aWNlVHlwZXMpOworICAgICAgICAgICAgICAgIC8vIGNob29zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy4KKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZSA9IGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHN1cHBvcnRlZERldmljZSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBwcm9maWxlVHlwZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7Ci0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IHN1cHBvcnRlZERldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlcyAlcyBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKICAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CkBAIC00MDk2LDg1ICs0MjU1LDY4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShpbnB1dERldmljZVR5cGVzKTsKLQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbFByb2ZpbGVEZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcy5maWx0ZXIobUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IElucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKLQogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbihudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy5pdGVtQXQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2IDogaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXYpOwotICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZEZXNjLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbFByb2ZpbGVEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KGluUHJvZmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dHlwZSgpKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBhdXRvIGNoZWNrQW5kU2V0QXZhaWxhYmxlID0gW3RoaXNdKGF1dG8mIGRldmljZXMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmRldmljZSA9IGRldmljZXNbaV07CisgICAgICAgICAgICBpZiAoIWRldmljZS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnJlbW92ZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgaSsrOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOwotICAgICAgICBpKys7Ci0gICAgfQorICAgIH07CisgICAgY2hlY2tBbmRTZXRBdmFpbGFibGUobUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworCiAgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQotICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewotICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8ICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgQUxPR0VfSUYobURlZmF1bHRPdXRwdXREZXZpY2UgIT0gMCwgIkRlZmF1bHQgZGV2aWNlICVzIGlzIHVucmVhY2hhYmxlIiwKKyAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgfQogICAgIC8vIElmIG1pY3JvcGhvbmVzIGFkZHJlc3MgaXMgZW1wdHksIHNldCBpdCBhY2NvcmRpbmcgdG8gZGV2aWNlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CQUNLX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDIwNSw3ICs0MzQ3LDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDIzOCw0NCArNDM4MCwyOCBAQAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzIC8qaW4qLywKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgIGRlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICBpZiAoZGV2RGVzYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOworICAgIGNvbnN0IFN0cmluZzggJmFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKIAotICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQpAQCAtNDI4MywxMyArNDQwOSwxMCBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQyOTcsNyArNDQyMCw3IEBACiAgICAgICAgIEFMT0dWKCIgIGZvdW5kICV6dSBwcm9maWxlcywgJXp1IG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtNDMxMyw4ICs0NDM2LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzMzAsMTYgKzQ0NTMsMTYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2VUeXBlLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzNTgsNyArNDQ4MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwogCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC00MzY3LDE0ICs0NDkxLDE1IEBACiAKICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIGFkZHJlc3MgIT0gIjAiKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIGFkZHJlc3MgIT0gIjAiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChhZGRyZXNzLCBwb2xpY3lNaXgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGFkZHJlc3MsIHBvbGljeU1peCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOwogCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKQEAgLTQ0MDYsMjggKzQ1MzEsMjggQEAKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCi0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsIGRldmljZSwgdHJ1ZS8qZm9yY2UqLywgMC8qZGVsYXkqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLypwYXRjaCBoYW5kbGUqLywgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2VzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgRGV2aWNlVmVjdG9yKGRldmljZSksIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdApAQCAtNDQzNiwxMCArNDU2MSwxMCBAQAogICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSA9PSBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBkZXNjLT5zdXBwb3J0c0RldmljZShkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CkBAIC00NDUwLDcgKzQ1NzUsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGh3TW9kdWxlLT5nZXROYW1lKCkpOwpAQCAtNDQ2MiwyNCArNDU4NywyMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOwogCi0gICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwogICAgICAgICAgICAgfQpAQCAtNDQ5MywxOSArNDYxNiwxNiBAQAogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwogCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC00NTIwLDggKzQ2NDAsOCBAQAogICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NTQwLDE0ICs0NjYwLDE0IEBACiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDU2NCwyMCArNDY4NCwyMSBAQAogICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCiAKICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBpbnB1dCAlZCIsIGlucHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAvLyBlbmQgc2NhbiBwcm9maWxlcwogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNDU4NSw3ICs0NzA2LDcgQEAKICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKSkpIHsKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwogICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwpAQCAtNDU5Nyw3ICs0NzE4LDcgQEAKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkuc2l6ZSgpOwogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwpAQCAtNDYxNCwzOCArNDczNSwzMSBAQAogewogICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gY2xvc2luZ091dHB1dCA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKGNsb3NpbmdPdXRwdXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiY2xvc2VPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVBvbGljeU1peGVzLmNsb3NlT3V0cHV0KG91dHB1dERlc2MpOworICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChjbG9zaW5nT3V0cHV0KTsKIAogICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0LT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXQtPm1PdXRwdXQxID09IGNsb3NpbmdPdXRwdXQgfHwgZHVwT3V0cHV0LT5tT3V0cHV0MiA9PSBjbG9zaW5nT3V0cHV0KSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHJlbWFpbmluZ091dHB1dCA9CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0ID8gZHVwT3V0cHV0LT5tT3V0cHV0MiA6IGR1cE91dHB1dC0+bU91dHB1dDE7CiAgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSByZW1haW5pbmdPdXRwdXQtPmlzQWN0aXZlKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBuby1vcCBvbiB0aGUgY2xvc2luZyBvdXRwdXQgd2hlcmUgYWxsIGNsaWVudHMgaGFzIGFscmVhZHkgYmVlbiBzZXQgaW5hY3RpdmUKKyAgICAgICAgICAgIGR1cE91dHB1dC0+c2V0QWxsQ2xpZW50c0luYWN0aXZlKCk7CiAgICAgICAgICAgICAvLyBzdG9wKCkgd2lsbCBiZSBhIG5vIG9wIGlmIHRoZSBvdXRwdXQgaXMgc3RpbGwgYWN0aXZlIGJ1dCBpcyBuZWVkZWQgaW4gY2FzZSBhbGwKICAgICAgICAgICAgIC8vIGFjdGl2ZSBzdHJlYW1zIHJlZmNvdW50cyB3aGVyZSBjbGVhcmVkIGFib3ZlCiAgICAgICAgICAgICBpZiAod2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdPdXRwdXQtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtNDY1Nyw3ICs0NzcxLDcgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoY2xvc2luZ091dHB1dC0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgKHZvaWQpIC8qc3RhdHVzX3Qgc3RhdHVzKi8gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNDY2NSwxMCArNDc3OSwyNiBAQAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIAotICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CisgICAgY2xvc2luZ091dHB1dC0+Y2xvc2UoKTsKIAogICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgIC8vIE1TRCBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gc3VwcG9ydCBhIG5vbi1NU0QgZGlyZWN0IG91dHB1dC4gUmVzZXQgTVNEIHBhdGNoIGlmCisgICAgLy8gbm8gZGlyZWN0IG91dHB1dHMgYXJlIG9wZW4uCisgICAgaWYgKCFnZXRNc2RBdWRpb091dERldmljZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2ODMsNiArNDgxMyw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTQ2OTMsNTEgKzQ4MjQsNjcgQEAKIAogICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworCisgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSAmJgorICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICB9CiB9CiAKLVNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQorU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2VzKAorICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQogewogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKIAotICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBBTE9HVlYoIiVzKCkgZGV2aWNlcyAlcyIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBBTE9HVlYoIm91dHB1dCAlenUgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJXp1IGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JXMiLAogICAgICAgICAgICAgICAgIGksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRzQWxsRGV2aWNlcyhkZXZpY2VzKQorICAgICAgICAgICAgICAgICYmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgQUxPR1ZWKCIlcygpIGZvdW5kIG91dHB1dCAlZCIsIF9fZnVuY19fLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG91dHB1dHM7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCkKIHsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIGNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpOworICAgIGlmIChvbk91dHB1dHNDaGVja2VkICE9IG51bGxwdHIgJiYgb25PdXRwdXRzQ2hlY2tlZCgpKSBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSAhPSAwKSB7CisgICAgICAgIHNldE1zZFBhdGNoKCk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6Zm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0CiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMobEF0dHIpID09CisgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJBdHRyKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgYXV0byBwc0lkID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyKTsKKworICAgIERldmljZVZlY3RvciBvbGREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgMCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIDAsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKG9sZERldmljZXMsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKG5ld0RldmljZXMsIG1PdXRwdXRzKTsKIAogICAgIC8vIGFsc28gdGFrZSBpbnRvIGFjY291bnQgZXh0ZXJuYWwgcG9saWN5LXJlbGF0ZWQgY2hhbmdlczogYWRkIGFsbCBvdXRwdXRzIHdoaWNoIGFyZQogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBwb2xpY2llcyBpbiB0aGUgImJlZm9yZSIgYW5kICJhZnRlciIgb3V0cHV0IHZlY3RvcnMKLSAgICBBTE9HVlYoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKTogcG9saWN5IHJlbGF0ZWQgb3V0cHV0cyIpOworICAgIEFMT0dWVigiJXMoKTogcG9saWN5IHJlbGF0ZWQgb3V0cHV0cyIsIF9fZnVuY19fKTsKICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtUHJldmlvdXNPdXRwdXRzLnNpemUoKSA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKQEAgLTQ3NTMsNyArNDkwMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgaWYgKHNyY091dHB1dHMgIT0gZHN0T3V0cHV0cykgewogICAgICAgICAvLyBnZXQgbWF4aW11bSBsYXRlbmN5IG9mIGFsbCBzb3VyY2Ugb3V0cHV0cyB0byBkZXRlcm1pbmUgdGhlIG1pbmltdW0gbXV0ZSB0aW1lIGd1YXJhbnRlZWluZwogICAgICAgICAvLyBhdWRpbyBmcm9tIGludmFsaWRhdGVkIHRyYWNrcyB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gdW5tdXRpbmcKICAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7CkBAIC00NzYzLDQ4ICs0OTEwLDY0IEBACiAgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOworICAgICAgICBBTE9HVl9JRighKHNyY091dHB1dHMuaXNFbXB0eSgpIHx8IGRzdE91dHB1dHMuaXNFbXB0eSgpKSwKKyAgICAgICAgICAgICAgIiVzOiBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVzIHRvIG91dHB1dCAlcyIsIF9fZnVuY19fLCBwc0lkLAorICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzcmNPdXRwdXRzWzBdKS5jX3N0cigpLAorICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhkc3RPdXRwdXRzWzBdKS5jX3N0cigpKTsKICAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCiAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0IDogc3JjT3V0cHV0cykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlRm9yKHNyY091dCk7Ci0gICAgICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3kpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBtYXhMYXRlbmN5ICogTEFURU5DWV9NVVRFX0ZBQ1RPUiwgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwc0lkKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwc0lkLCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHNJZCwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KHNyY091dCwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlID0gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KHNyY091dCwgYXR0cik7CiAgICAgICAgICAgICBpZiAoc291cmNlICE9IDApewogICAgICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmVhbSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoYXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSkpKSB7CiAgICAgICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICAgICAgfQotICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmVhbSAoYW5kIGxpbmtlZCkgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzSWQpKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKIHsKLSAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7Ci0gICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KS5mcm9udCgpOworICAgICAgICBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTZWNvbmRhcnlPdXRwdXRzKCkgeworICAgIHN0ZDo6c2V0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IHN0cmVhbXNUb0ludmFsaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2NyaXB0b3IgPSBtT3V0cHV0c1tpXTsKKyAgICAgICAgZm9yIChjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQgOiBvdXRwdXREZXNjcmlwdG9yLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBjb2RlIGR1cGxpY2F0ZWQgZnJvbSBnZXRPdXRwdXRGb3JBdHRySW50CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5RGVzY3M7CisgICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihjbGllbnQtPmF0dHJpYnV0ZXMoKSwgY2xpZW50LT51aWQoKSwgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlEZXNjcyk7CisgICAgICAgICAgICBpZiAoIXN0ZDo6ZXF1YWwoY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy5iZWdpbigpLCBzZWNvbmRhcnlEZXNjcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1zVG9JbnZhbGlkYXRlLmluc2VydChjbGllbnQtPnN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIDogc3RyZWFtc1RvSW52YWxpZGF0ZSkgeworICAgICAgICBBTE9HRCgiJXMgSW52YWxpZGF0ZSBzdHJlYW0gJWQgZHVlIHRvIHNlY29uZGFyeSBvdXRwdXQgY2hhbmdlIiwgX19mdW5jX18sIHN0cmVhbSk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCkBAIC00ODU3LDEwOCArNTAyMCw4NyBAQAogICAgIH0KIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuICBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAotICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKG91dHB1dERlc2MsIFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwgYWN0aXZlLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQorICAgIC8vIExlZ2FjeSBFbmdpbmUgY2Fubm90IHRha2UgY2FyZSBvZiBidXMgZGV2aWNlcyBhbmQgbWl4LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY29uZmxpY3QKKyAgICAvLyBvZiBzZXRGb3JjZVVzZSAvIERlZmF1bHQgQnVzIGRldmljZSBoZXJlCisgICAgZGV2aWNlID0gbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvck91dHB1dChvdXRwdXREZXNjLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIFN0cmVhbVR5cGVWZWN0b3Igc3RyZWFtcyA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSk7CisgICAgICAgIGF1dG8gYXR0ciA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdFN0cmF0ZWd5KS5mcm9udCgpOworCisgICAgICAgIGlmICgoaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYKKyAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpKSB8fAorICAgICAgICAgICAgIChoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0FMQVJNKSAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKKyAgICAgICAgICAgIC8vIFJldHJpZXZhbCBvZiBkZXZpY2VzIGZvciB2b2ljZSBETCBpcyBkb25lIG9uIHByaW1hcnkgb3V0cHV0IHByb2ZpbGUsIGNhbm5vdAorICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJvdXRlICh3b3VsZCBmb3JjZSBtb2RpZnlpbmcgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGlzIHByb2ZpbGUpCisgICAgICAgICAgICBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZnJvbUNhY2hlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCi0gICAgLy8gNTogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5Ci0gICAgLy8gNjogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCi0gICAgLy8gNzogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKLSAgICAvLyA4OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKLSAgICAvLyA5OiB0aGUgc3RyYXRlZ3kgZm9yIGJlYWNvbiwgYS5rLmEuICJ0cmFuc21pdHRlZCB0aHJvdWdoIHNwZWFrZXIiIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgdC10LXMKLQotICAgIC8vIEZJWE1FOiBleHRlbmQgdXNlIG9mIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoKSB0byBhbGwgc3RyYXRlZ2llcwotICAgIC8vIHdpdGggYSByZWZpbmVkIHJ1bGUgY29uc2lkZXJpbmcgbXV0dWFsbHkgZXhjbHVzaXZlIGRldmljZXMgKHVzaW5nIHNhbWUgYmFja2VuZCkKLSAgICAvLyBhcyBvcHBvc2VkIHRvIGFsbCBzdHJlYW1zIG9uIHRoZSBzYW1lIGF1ZGlvIEhBTCBtb2R1bGUuCi0gICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9NRURJQSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0RUTUYpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9SRVJPVVRJTkcpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORywgZnJvbUNhY2hlKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOworICAgIEFMT0dWKCIlcyBzZWxlY3RlZCBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKAorICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJXMgZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0RGV2aWNlKCktPnRvU3RyaW5nKCkuY19zdHIoKSwgaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPmdldERldmljZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCi0gICAgLy8gQVVESU9fREVWSUNFX05PTkUsIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCi0gICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7Ci0gICAgICAgIHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsKKyAgICBkZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0RGVzYywgQVVESU9fU09VUkNFX0RFRkFVTFQsIGFjdGl2ZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgfQotICAgIGlmIChzb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2Uoc291cmNlKTsKKworICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucworICAgIC8vIGEgbnVsbCBzcDw+LCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCk7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKKyAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAKICAgICByZXR1cm4gZGV2aWNlOwpAQCAtNDk2OSw2NSArNTExMSw1MCBAQAogICAgIHJldHVybiAoc3RyZWFtMSA9PSBzdHJlYW0yKTsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLX0KLQogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewogICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCi0gICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQotICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCi0gICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgIC8vIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0ncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLgorICAgIC8vIGVuZ2luZSdzIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0gd291bGQgZmFsbGJhY2sgb24gaXRzIGRlZmF1bHQgYmVoYXZpb3IgKG1vc3QgcHJvYmFibHkKKyAgICAvLyBkZXZpY2UgZm9yIG11c2ljIHN0cmVhbSksIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgorICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKKyAgICBEZXZpY2VWZWN0b3IgYWN0aXZlRGV2aWNlczsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3QgY3VyU3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQ7CisgICAgICAgICBjdXJTdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKGN1clN0cmVhbSArIDEpKSB7CisgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBjdXJTdHJhdGVneSA9IGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2VzID0KLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSljdXJTdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGN1clN0cmVhbSwgZmFsc2UvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShjdXJEZXZpY2VzKTsKKyAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlcyhjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgICAgIGN1ckRldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVEZXZpY2VzLm1lcmdlKG91dHB1dERlc2MtPmRldmljZXMoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgIH0KIAorICAgIC8vIEZhdm9yIGRldmljZXMgc2VsZWN0ZWQgb24gYWN0aXZlIHN0cmVhbXMgaWYgYW55IHRvIHJlcG9ydCBjb3JyZWN0IGRldmljZSBpbiBjYXNlIG9mCisgICAgLy8gZXhwbGljaXQgZGV2aWNlIHNlbGVjdGlvbgorICAgIGlmICghYWN0aXZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGV2aWNlcyA9IGFjdGl2ZURldmljZXM7CisgICAgfQogICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAogICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7Ci0gICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICBEZXZpY2VWZWN0b3Igc3BlYWtlclNhZmVEZXZpY2VzID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKKyAgICBpZiAoIXNwZWFrZXJTYWZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikpOworICAgICAgICBkZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotcm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsImdldFN0cmF0ZWd5KCkgY2FsbGVkIGZvciBBVURJT19TVFJFQU1fUEFUQ0giKTsKLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSkpOworICAgIHJldHVybiBkZXZpY2VzLnR5cGVzKCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgc3dpdGNoKHN0cmVhbSkgewogICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSk7CiAgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC01MDk0LDQwICs1MjIxLDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKLXsKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhIHN0cmVhbSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgLy8gc3BlY2lmaWVkIHN0cmF0ZWd5IGFuZCB1c2UgaXQgaW4gcHJpb3JpdHkgb3ZlciBkZWZhdWx0IHJvdXRpbmcgcnVsZXMuCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwotICAgICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3JjZWREZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZnJvbUNhY2hlKSB7Ci0gICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOwotICAgIH0KLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICB9CisgICAgbUVuZ2luZS0+dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CiB9CiAKIHVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcHJldkRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KQEAgLTUxMzgsMzQgKzUyMzksMzYgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzLnNpemUoKSA+PSAyKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGN1ckRldmljZSA9IGN1ckRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiAoY3VyRGV2aWNlICYgZGV2aWNlKSAmJiAoY3VyRGV2aWNlICE9IGRldmljZSk7CisgICAgYXV0byBwcm9kdWN0U3RyYXRlZ2llcyA9IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpOworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogcHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0KKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBjdXJEZXZpY2VzID0gY3VyRGV2aWNlcy5maWx0ZXIob3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiBjdXJEZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXZpY2VzKSAmJiBjdXJEZXZpY2VzICE9IGRldmljZXM7CiAgICAgICAgIGJvb2wgZG9NdXRlID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pIHsKKyAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKXsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5LCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRvTXV0ZSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCBvdXRwdXQgaWYgaXQgZG9lcyBub3Qgc2hhcmUgYW55IGRldmljZSB3aXRoIGN1cnJlbnQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgaWYgKChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zQXRMZWFzdE9uZShvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlenUgKGN1ckRldmljZSAlMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgbXV0ZSwgZGVzYywgbXV0ZSA/IDAgOiBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWVigiJXMoKSAlcyAoY3VyRGV2aWNlICVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGN1ckRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHJvZHVjdFN0cmF0ZWd5LCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CkBAIC01MTgzLDcgKzUyODYsNyBAQAogCiAgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bwogICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7CisgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMgIT0gcHJldkRldmljZXMpKSB7CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKICAgICAgICAgLy8gdGVtcG9yYXJ5IG11dGUgZHVyYXRpb24gaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDQgdGltZXMgdGhlIHJlcG9ydGVkIGxhdGVuY3kKICAgICAgICAgdWludDMyX3QgdGVtcE11dGVEdXJhdGlvbk1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogNDsKQEAgLTUxOTEsMTMgKzUyOTQsMTMgQEAKICAgICAgICAgICAgIG11dGVXYWl0TXMgPSB0ZW1wTXV0ZVdhaXRNczsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBwcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCiAgICAgICAgICAgICAgICAgLy8gZGVsYXllZCBkZXZpY2UgY2hhbmdlCi0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIG91dHB1dERlc2MsIGRlbGF5TXMpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyArIHRlbXBNdXRlRHVyYXRpb25NcywgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHJvZHVjdFN0cmF0ZWd5LCB0cnVlLCBvdXRwdXREZXNjLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHJvZHVjdFN0cmF0ZWd5LCBmYWxzZSwgb3V0cHV0RGVzYywgZGVsYXlNcyArIHRlbXBNdXRlRHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUyMTEsNDYgKzUzMTQsNDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCiB7Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZGVsYXlNcyAlZCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZGVsYXlNcyk7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKIAogICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKLSAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKLSAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAotICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZXMsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlcywgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9Ci0gICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKLSAgICAvLyBvdXRwdXQgcHJvZmlsZQotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKICAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCi0gICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzID0gb3V0cHV0RGVzYy0+ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgcHJldkRldmljZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZSBvciBpZiBuZXcgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgQU5EIHByZXZpb3VzIGRldmljZShzKSBpcyhhcmUpIHN0aWxsCisgICAgLy8gYXZhaWxhYmxlIChvdGhlcndpc2UgcmVzZXQgZGV2aWNlIG11c3QgYmUgZG9uZSBvbiB0aGUgb3V0cHV0KQorICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcykuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAlcyBmb3Igb3V0cHV0IiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgMHglMDR4IiwgcHJldkRldmljZSk7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZXMoKSBwcmV2RGV2aWNlICVzIiwgcHJldkRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpZiAoIWZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0RGV2aWNlcyhmaWx0ZXJlZERldmljZXMpOwogICAgIH0KIAogICAgIC8vIGlmIHRoZSBvdXRwdXRzIGFyZSBub3QgbWF0ZXJpYWxseSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbXV0ZS4KICAgICBpZiAocmVxdWlyZXNNdXRlQ2hlY2spIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2VzLCBkZWxheU1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiJXM6IHN1cHByZXNzaW5nIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIG11dGVXYWl0TXMgPSAwOwpAQCAtNTI2MSw4OSArNTM2NCwzMiBAQAogICAgIC8vICAgICAgT1IgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UKICAgICAvLyAgQU5EIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQKICAgICAvLyAgQU5EIHRoZSBvdXRwdXQgaXMgY29ubmVjdGVkIGJ5IGEgdmFsaWQgYXVkaW8gcGF0Y2guCi0gICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCi0gICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmCi0gICAgICAgICFmb3JjZSAmJgotICAgICAgICBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHNldHRpbmcgc2FtZSBkZXZpY2UgMHglMDR4IG9yIG51bGwgZGV2aWNlIiwgZGV2aWNlKTsKKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2VzKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpIHx8IGZpbHRlcmVkRGV2aWNlcyA9PSBwcmV2RGV2aWNlcykgJiYKKyAgICAgICAgICAgICFmb3JjZSAmJiBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2UgJXMgb3IgbnVsbCBkZXZpY2UsIGZvcmNlPSVkLCBwYXRjaCBoYW5kbGU9JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZm9yY2UsIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9CiAKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisgICAgQUxPR1YoIiVzIGNoYW5naW5nIGRldmljZSB0byAlcyIsIF9fZnVuY19fLCBmaWx0ZXJlZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIC8vIGRvIHRoZSByb3V0aW5nCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRlbGF5TXMsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwotICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjKTsKKyAgICAgICAgQUxPR19BU1NFUlQoZmlsdGVyZWREZXZpY2VzLnNpemUoKSA8PSBBVURJT19QQVRDSF9QT1JUU19NQVgsICJUb28gbWFueSBzaW5rIHBvcnRzIik7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZmlsdGVyZWREZXZpY2UgOiBmaWx0ZXJlZERldmljZXMpIHsKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGZpbHRlcmVkRGV2aWNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOwotICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgotICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluZm9ybSBhbGwgaW5wdXQgYXMgd2VsbAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgaW5wdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogaW5mb3JtIGlucHV0ICVkIG9mIGRldmljZTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlucHV0Q21kLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSxkZXZpY2UpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q21kLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgb3V0cHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMpOwogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBmaWx0ZXJlZERldmljZXMudHlwZXMoKSwgZGVsYXlNcyk7CiAKICAgICByZXR1cm4gbXV0ZVdhaXRNczsKIH0KQEAgLTUzNzIsNjMgKzU0MTgsMzAgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgewotICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKChkZXZpY2UgIT0gbnVsbHB0cikgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5nZXREZXZpY2UoKSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+c2V0RGV2aWNlKGRldmljZSk7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhpbnB1dERlc2MsCiAgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CiAgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCi0gICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgotICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dERlc2NdKGNvbnN0IFBhdGNoQnVpbGRlcjo6bWl4X3VzZWNhc2VfdCYgdXNlY2FzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSB1c2VjYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyB9KS4KICAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKLSAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIGlucHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIDApOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NDU3LDggKzU0NzAsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLApAQCAtNTQ3OCw3ICs1NDkwLDcgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CiAgICAgICAgICAgICAvL3VwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlICAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICAgICAgIC8qdXBkYXRlZEZvcm1hdCovCkBAIC01NDg5LDcgKzU1MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MqLykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC01NTEzLDQzICs1NTI1LDEyIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKLXsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2VsZWN0ZWREZXZpY2VGcm9tTWl4ID0KLSAgICAgICAgICAgbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCBhdmFpbGFibGVEZXZpY2VUeXBlcywgcG9saWN5TWl4KTsKLQotICAgIGlmIChzZWxlY3RlZERldmljZUZyb21NaXggIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGV2aWNlRnJvbU1peDsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCi17Ci0gICAgLy8gUm91dGluZwotICAgIC8vIFNjYW4gdGhlIHdob2xlIFJvdXRlTWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHJvdXRlOgotICAgIC8vIGlmIHRoZSBpbnB1dCBzb3VyY2UgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKLSAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCi0gICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewotICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci19Ci0KIGZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBmbG9hdCB2b2x1bWVEQiA9IG1Wb2x1bWVDdXJ2ZXMtPnZvbEluZGV4VG9EYihzdHJlYW0sIFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgaW5kZXgpOworICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pOworICAgIGZsb2F0IHZvbHVtZURCID0gY3VydmVzLnZvbEluZGV4VG9EYihWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KGRldmljZSksIGluZGV4KTsKIAogICAgIC8vIGhhbmRsZSB0aGUgY2FzZSBvZiBhY2Nlc3NpYmlsaXR5IGFjdGl2ZSB3aGlsZSBhIHJpbmd0b25lIGlzIHBsYXlpbmc6IGlmIHRoZSByaW5ndG9uZSBpcyBtdWNoCiAgICAgLy8gbG91ZGVyIHRoYW4gdGhlIGFjY2Vzc2liaWxpdHkgcHJvbXB0LCB0aGUgcHJvbXB0IGNhbm5vdCBiZSBoZWFyZCwgdGh1cyBtYXNraW5nIHRoZSB0b3VjaApAQCAtNTU2Miw5ICs1NTQzLDkgQEAKICAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEQiAtIDQgPiB2b2x1bWVEQiA/IHJpbmdWb2x1bWVEQiAtIDQgOiB2b2x1bWVEQjsKICAgICB9CiAKLSAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIGVhcnBpZWNlIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQotICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgJiYKLSAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8IG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7CisgICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KKyAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYKKyAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8IG1PdXRwdXRzLmlzQWN0aXZlTG9jYWxseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSkgewogICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CkBAIC01NTc0LDEwICs1NTU1LDkgQEAKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTogewotICAgICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPQotICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKKyAgICAgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwogICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkKKyAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBkZXZpY2UpCiAgICAgICAgICAgICAgICAgKyBJTl9DQUxMX0VBUlBJRUNFX0hFQURST09NX0RCOwogICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWF4Vm9pY2VWb2xEYikgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lKCkgc3RyZWFtICVkIGF0IHZvbD0lZiBvdmVycmlkZW4gYnkgc3RyZWFtICVkIGF0IHZvbD0lZiIsCkBAIC01NTk3LDMwICs1NTc3LDMxIEBACiAgICAgLy8gc3BlYWtlciBpcyBwYXJ0IG9mIHRoZSBzZWxlY3QgZGV2aWNlcwogICAgIC8vIC0gaWYgbXVzaWMgaXMgcGxheWluZywgYWx3YXlzIGxpbWl0IHRoZSB2b2x1bWUgdG8gY3VycmVudCBtdXNpYyB2b2x1bWUsCiAgICAgLy8gd2l0aCBhIG1pbmltdW0gdGhyZXNob2xkIGF0IC0zNmRCIHNvIHRoYXQgbm90aWZpY2F0aW9uIGlzIGFsd2F5cyBwZXJjZWl2ZWQuCi0gICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwogICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8CiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSB8CiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUIHwKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpKSAmJgotICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKKyAgICAgICAgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0FMQVJNIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUklORykKKyAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pCiAgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQotICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSAmJgorICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09CisgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuY2FuQmVNdXRlZCgpKSB7CiAgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKICAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKICAgICAgICAgLy8ganVzdCBzdG9wcGVkCiAgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAogICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7CiAgICAgICAgICAgICB2b2x1bWVEQiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOwogICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2xEQiA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX01VU0lDKS5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKICAgICAgICAgICAgIGZsb2F0IG1pblZvbERCID0gKG11c2ljVm9sREIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/CiAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sREIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOwogICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWluVm9sREIpIHsKQEAgLTU2NDAsNyArNTYyMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpICE9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKLSAgICAgICAgICAgICAgICBzdHJlYW1fc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fQUxBUk0gJiYgc3RyZWFtICE9IEFVRElPX1NUUkVBTV9SSU5HKSkgewogICAgICAgICAgICAgdm9sdW1lREIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKICAgICAgICAgfQogICAgIH0KQEAgLTU2NDgsMTcgKzU2MjksNDIgQEAKICAgICByZXR1cm4gdm9sdW1lREI7CiB9CiAKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pCit7CisgICAgaWYgKHNyY1N0cmVhbSA9PSBkc3RTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHNyY0luZGV4OworICAgIH0KKyAgICBhdXRvICZzcmNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoc3JjU3RyZWFtKTsKKyAgICBhdXRvICZkc3RDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoZHN0U3RyZWFtKTsKKyAgICBmbG9hdCBtaW5TcmMgPSAoZmxvYXQpc3JjQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworICAgIGZsb2F0IG1pbkRzdCA9IChmbG9hdClkc3RDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICBmbG9hdCBtYXhEc3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisKKyAgICAvLyBwcmVzZXJ2ZSBtdXRlIHJlcXVlc3Qgb3IgY29ycmVjdCByYW5nZQorICAgIGlmIChzcmNJbmRleCA8IG1pblNyYykgeworICAgICAgICBpZiAoc3JjSW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3JjSW5kZXggPSBtaW5TcmM7CisgICAgfSBlbHNlIGlmIChzcmNJbmRleCA+IG1heFNyYykgeworICAgICAgICBzcmNJbmRleCA9IG1heFNyYzsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKG1pbkRzdCArICgoc3JjSW5kZXggLSBtaW5TcmMpICogKG1heERzdCAtIG1pbkRzdCkpIC8gKG1heFNyYyAtIG1pblNyYykpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCi0gICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAotICAgICAgICAgICAgICBzdHJlYW0sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKG91dHB1dERlc2MtPmlzTXV0ZWQoc3RyZWFtVG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlcygpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsIF9fZnVuY19fLCBzdHJlYW0sIG91dHB1dERlc2MtPmdldE11dGVDb3VudChzdHJlYW0pKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CkBAIC01NjcyLDcgKzU2NzgsNyBAQAogICAgIH0KIAogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwpAQCAtNTY5MCw3ICs1Njk2LDcgQEAKICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CiAgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOwogICAgICAgICB9CkBAIC01NzEzLDcgKzU3MTksNyBAQAogCiAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewogICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLApAQCAtNTcyMSwxOCArNTcyNywxNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwKLSAgICAgICAgICAgc3RyYXRlZ3ksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KKyAgICBmb3IgKGF1dG8gc3RyZWFtOiBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlcygpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0sIG9uLAorICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKICAgICB9CiB9CiAKQEAgLTU3NDMsMzAgKzU3NDcsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAogICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCi0gICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOwotCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHN0cmVhbSksIGRldmljZSk7CisgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSk7CiAgICAgaWYgKG9uKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSAmJgorICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzTXV0ZWQoc3RyZWFtVG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGlmIChjdXJ2ZXMuY2FuQmVNdXRlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAogICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CiAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgICAgIG91dHB1dERlc2MtPmluY011dGVDb3VudChzdHJlYW1Ub1ZvbHVtZVNvdXJjZShzdHJlYW0pKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHN0cmVhbVRvVm9sdW1lU291cmNlKHN0cmVhbSkpKSB7CiAgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmRlY011dGVDb3VudChzdHJlYW1Ub1ZvbHVtZVNvdXJjZShzdHJlYW0pKSA9PSAwKSB7CiAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKQEAgLTU3NzQsMTA2ICs1Nzc4LDkgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbVByaW1hcnlPdXRwdXQ7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQotewotICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLX0KLQogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQogewotICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmVhbSB0eXBlPwogICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTyB8IEFVRElPX0ZMQUdfQkVBQ09OKSkgIT0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC01OTA0LDM3ICs1ODExLDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCiB7CiAgICAgcmV0dXJuIG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKQEAgLTU5NTMsMTAgKzU4MjksMTAgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bURldmljZS0+ZXF1YWxzKGRldmljZURlc2MpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTgyLDEyOSArNTg1OCw2NyBAQAogICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MtPm1VaWQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgbUlucHV0cy5jbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CisKKyAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CiB9CiAKLS8vIE1vZGlmeSB0aGUgbGlzdCBvZiBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHN1cHBvcnRlZC4KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7Ci0gICAgRm9ybWF0VmVjdG9yICZmb3JtYXRzID0gKmZvcm1hdHNQdHI7Ci0gICAgLy8gVE9ETyBTZXQgdGhpcyBiYXNlZCBvbiBDb25maWcgcHJvcGVydGllcy4KLSAgICBjb25zdCBib29sIGFsd2F5c0ZvcmNlQUMzID0gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGVuZm9yY2VkU3Vycm91bmQoCisgICAgICAgICAgICBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gYWxsU3Vycm91bmQ7ICAvLyBBIGZsYXQgc2V0IG9mIGFsbCBrbm93biBzdXJyb3VuZCBmb3JtYXRzCisgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICBhbGxTdXJyb3VuZC5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogcGFpci5zZWNvbmQpIGFsbFN1cnJvdW5kLmluc2VydChzdWJmb3JtYXQpOworICAgIH0KIAogICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CiAgICAgQUxPR0QoIiVzOiBmb3JjZWQgdXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZvcmNlVXNlKTsKKyAgICAvLyBUaGlzIGlzIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZvcm1hdHMgZGVwZW5kaW5nIG9uIHRoZSBzdXJyb3VuZCBtb2RlOgorICAgIC8vICAgJ2FsbCBzdXJyb3VuZCcgPSBhbGxTdXJyb3VuZAorICAgIC8vICAgJ2VuZm9yY2VkIHN1cnJvdW5kJyA9IGVuZm9yY2VkU3Vycm91bmQgW21heSBpbmNsdWRlIElFQzY5MTM3IHdoaWNoIGlzbid0IHJhdyBzdXJyb3VuZCBmbXRdCisgICAgLy8gICAnbm9uLXN1cnJvdW5kJyA9IG5vdCBpbiAnYWxsIHN1cnJvdW5kJyBhbmQgbm90IGluICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyAgICdtYW51YWwgc3Vycm91bmQnID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cworICAgIC8vIEFVVE86ICAgZm9ybWF0cyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBBTFdBWVM6IGZvcm1hdHMgdiAnYWxsIHN1cnJvdW5kJyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBORVZFUjogIGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJworICAgIC8vIE1BTlVBTDogZm9ybWF0cyBeICgnbm9uLXN1cnJvdW5kJyB2ICdtYW51YWwgc3Vycm91bmQnIHYgKElFQzY5MTM3IF4gJ2VuZm9yY2VkIHN1cnJvdW5kJykpCiAKLSAgICAvLyBJZiBNQU5VQUwsIGtlZXAgdGhlIHN1cHBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIGFzIGN1cnJlbnQgZW5hYmxlZCBvbmVzLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OworICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwKKyAgICAgICAgICAgIHx8IGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7CisgICAgICAgIC8vIGZvcm1hdFNldCBpcyAoZm9ybWF0cyBeICdub24tc3Vycm91bmQnKQorICAgICAgICBmb3IgKGF1dG8gZm9ybWF0SXRlciA9IGZvcm1hdHNQdHItPmJlZ2luKCk7IGZvcm1hdEl0ZXIgIT0gZm9ybWF0c1B0ci0+ZW5kKCk7ICsrZm9ybWF0SXRlcikgeworICAgICAgICAgICAgaWYgKGFsbFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwICYmIGVuZm9yY2VkU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KCpmb3JtYXRJdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZm9ybWF0c1B0ci0+YmVnaW4oKSwgZm9ybWF0c1B0ci0+ZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzUHRyLT5jbGVhcigpOyAgLy8gUmUtZmlsbGVkIGZyb20gdGhlIGZvcm1hdFNldCBhdCB0aGUgZW5kLgorCiAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgewotICAgICAgICBmb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1TdXJyb3VuZEZvcm1hdHMuYmVnaW4oKTsgaXQgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoKml0KTsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZW5kKCkpOworICAgICAgICAvLyBFbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZSBpZiBpdCdzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgaWYgKGVuZm9yY2VkU3Vycm91bmQuY291bnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KSAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlLgotICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgIH0gZWxzZSB7IC8vIE5FVkVSLCBBVVRPIG9yIEFMV0FZUwotICAgICAgICAvLyBBbmFseXplIG9yaWdpbmFsIHN1cHBvcnQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKHNzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IChzc2l6ZV90KWZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIEFMV0FZUywgcmVtb3ZlIGFsbCBvdGhlciBzdXJyb3VuZCBmb3JtYXRzIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd2lsbCBhZGQgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeyAvLyBBVVRPIG9yIEFMV0FZUworICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGFsbFN1cnJvdW5kLmJlZ2luKCksIGFsbFN1cnJvdW5kLmVuZCgpKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIE1vZGlmeSBmb3JtYXRzIGJhc2VkIG9uIHN1cnJvdW5kIHByZWZlcmVuY2VzLgotICAgICAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgewotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCB8fCBzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7ICkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBBVVRPIG9yIEFMV0FZUwotICAgICAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCi0gICAgICAgICAgICBpZiAoKGFsd2F5c0ZvcmNlQUMzIHx8IChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNBQzMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KLSAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgICAgICAvLyB0aGVuIHRoZSByZXBvcnQgaXMgdmFsaWQgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0gICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0VfQUMzKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAvLyBUaGUgSEFMIGNvdWxkIGRvIHRoaXMgYnV0IGFkZCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuCi0gICAgICAgICAgICBpZiAoKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgJiYgIXN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcmVwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyB0byBlbmFibGVkIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzNfSk9DOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZW5mb3JjZWRTdXJyb3VuZC5iZWdpbigpLCBlbmZvcmNlZFN1cnJvdW5kLmVuZCgpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQgOiBmb3JtYXRTZXQpIHsKKyAgICAgICAgZm9ybWF0c1B0ci0+cHVzaChmb3JtYXQpOwogICAgIH0KIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKSB7CiAgICAgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyA9ICpjaGFubmVsTWFza3NQdHI7CiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKQEAgLTYxMzQsMTYgKzU5NDgsMTcgQEAKICAgICAgICAgLy8gSWYgbm90IHRoZW4gYWRkIDUuMSBzdXBwb3J0LgogICAgICAgICBpZiAoIXN1cHBvcnRzNWRvdDEpIHsKICAgICAgICAgICAgIGNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSk7Ci0gICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR0koIiVzOiBmb3JjZSBNQU5VQUwgb3IgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fZnVuY19fKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKQogewogICAgIFN0cmluZzggcmVwbHk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKIAogICAgIC8vIEZvcm1hdCBNVVNUIGJlIGNoZWNrZWQgZmlyc3QgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIEF1ZGlvUHJvZmlsZQogICAgIGlmIChwcm9maWxlcy5oYXNEeW5hbWljRm9ybWF0KCkpIHsKQEAgLTYxNTcsOCArNTk3Miw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoJmZvcm1hdHMpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKKyAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhkZXZEZXNjLCAmZm9ybWF0cyk7CiAgICAgICAgIH0KICAgICAgICAgcHJvZmlsZXMuc2V0Rm9ybWF0cyhmb3JtYXRzKTsKICAgICB9CkBAIC02MTkwLDggKzYwMDYsOSBAQAogICAgICAgICAgICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCByZXBseSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3NGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSkgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYxOTksNCArNjAxNiw1OCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KAorICAgICAgICAgICAgcGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FID8KKyAgICAgICAgICAgICpwYXRjaEhhbmRsZSA6IGlvRGVzY3JpcHRvci0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaCgKKyAgICAgICAgICAgIGNhbGxlciwgaW5kZXgsIHBhdGNoSGFuZGxlLCBwYXRjaCwgZGVsYXlNcywgbVVpZENhY2hlZCwgJnBhdGNoRGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpb0Rlc2NyaXB0b3ItPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKQoreworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigiJXMoKSBBRjo6Y3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgY2FsbGVyLCBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaChwYXRjaCwgdWlkKTsKKyAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICB9CisgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorICAgIGlmIChwYXRjaERlc2NQdHIpICpwYXRjaERlc2NQdHIgPSBwYXRjaERlc2M7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA0OGUwNDcyLi4wNmExZjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIApAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CkBAIC0zOCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8QXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CkBAIC00Niw4ICs0OSw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgotI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk1LDEyICs5NywxNCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CkBAIC0xMDksMjQgKzExMywxOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTM4LDE2ICsxMzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLApAQCAtMTYwLDkgKzE1NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbVRvU3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyZWFtVG9TdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKICAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CkBAIC0xNzMsMTQgKzE3Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwotICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCkBAIC0xOTMsMTAgKzE4NywxNyBAQAogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgICAgICAvLyBoZWxwZXJzIGZvciBkdW1wKGludCBmZCkKKyAgICAgICAgdm9pZCBkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3Q7CisgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworCisgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CiAKKyAgICAgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CisKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yMjYsMTIgKzIyNywxNSBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTI0NCwxMCArMjQ4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgIH0KIAogcHJvdGVjdGVkOgogICAgICAgICAvLyBBIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIG1vcmUgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBpbml0aWFsaXphdGlvbiBwcm9jZXNzLApAQCAtMjk0LDY1ICszMTAsNTYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gKm1Wb2x1bWVDdXJ2ZXM7IH0KICAgICAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgfQogCisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gKmN1cnZlcyA9IG1FbmdpbmUtPmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3IgYXR0cmlidXRlcyAlcyIsIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuICpjdXJ2ZXM7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3Igc3RyZWFtICVzIiwgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKLSAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKLSAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCi0gICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQotICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86Ci0gICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKLSAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgotICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECi0gICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKLQotICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KICAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KICAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CisgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CiAgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CiAgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKLQogICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCiAgICAgICAgIC8vIGRldmljZQogICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgICAgICAvLyByZXNjYWxlIHZvbHVtZSBpbmRleCBmcm9tIHNyY1N0cmVhbSB3aXRoaW4gcmFuZ2Ugb2YgZHN0U3RyZWFtCisgICAgICAgIGludCByZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0U3RyZWFtKTsKICAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtMzYzLDEyICszNzAsMjAgQEAKICAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldFN0cmF0ZWd5TXV0ZSBNdXRlIG9yIHVubXV0ZSBhbGwgYWN0aXZlIGNsaWVudHMgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0CisgICAgICAgICAqIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICAgICAqIEBwYXJhbSBzdHJhdGVneSB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBvbiB0cnVlIGZvciBtdXRlLCBmYWxzZSBmb3IgdW5tdXRlCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUpOwogCiAgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKICAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMzc3LDEwICszOTIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CiAKLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOwotCiAgICAgICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CiAKICAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCkBAIC0zOTQsMTUgKzQwNSwxMyBAQAogICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKICAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KICAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgotICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CiAKLSAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzKTsKIAogICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgogICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CkBAIC00MTAsMTUgKzQxOSwzNSBAQAogICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KICAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5Ci0gICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworICAgICAgICAvLyBydW5zIGFsbCB0aGUgY2hlY2tzIHJlcXVpcmVkIGZvciBhY2NvbW9kYXRpbmcgY2hhbmdlcyBpbiBkZXZpY2VzIGFuZCBvdXRwdXRzCisgICAgICAgIC8vIGlmICdvbk91dHB1dHNDaGVja2VkJyBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG91dHB1dHMKKyAgICAgICAgLy8gY2hlY2sgdmlhICdjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMnLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScsCisgICAgICAgIC8vIEEyRFAgc3VzcGVuZCBzdGF0dXMgaXMgcmVjaGVja2VkLgorICAgICAgICB2b2lkIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCA9IG51bGxwdHIpOwogCi0gICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgdGhlCisgICAgICAgICAqIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICAgICAqIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuCisgICAgICAgICAqIGF0dHJpYnV0ZXMgY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgICAgIGJvb2wgZm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIFNhbWUgYXMgQHNlZSBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoKQorICAgICAgICAgKiAgICAgIGJ1dCBmb3IgYSBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSBidXQgZm9yIHNlY29uZGFyeSBvdXRwdXRzLiBNYWtlIHN1cmUgaWYgYSBzZWNvbmRhcnkKKyAgICAgICAgLy8gb3V0cHV0IGNvbmRpdGlvbiBjaGFuZ2VzLCB0aGUgdHJhY2sgaXMgcHJvcGVybHkgcmVyb3V0ZWQKKyAgICAgICAgdm9pZCBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKwogICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQogICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKIApAQCAtNDI2LDE4ICs0NTUsMjEgQEAKICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCiAgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgogICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisgICAgICAgIERldmljZVZlY3RvciBnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOwogCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzOiB1cGRhdGVzIGNhY2hlIG9mIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgKiBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBpcyBjaGFuZ2VkOgorICAgICAgICAgKiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgICAqIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSgpL2dldERldmljZXNGb3JBdHRyaWJ1dGVzIGlmCisgICAgICAgICAqIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAogICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCiAgICAgICAgIHsKQEAgLTQ0OSwzNCArNDgxLDUwIEBACiAgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwogICAgICAgICB9CiAKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwotICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwogCi0gICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMKKyAgICAgICAgICogICAgICB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uLgorICAgICAgICAgKiAgICAgIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAgKiAgICAgIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjCisgICAgICAgICAqIEBwYXJhbSBwcmV2RGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDApOwogICAgICAgICAvLyBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2sgYXJlIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCi0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXNjcmlwdG9ycywgbWF5IGJlIGVtcHR5IGlmIGlnbm9yaW5nIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQKKyAgICAgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsTWFzaworICAgICAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdE9ubHkKKyAgICAgICAgICogQHJldHVybiBJT1Byb2ZpbGUgdG8gYmUgdXNlZCBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvck91dHB1dChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIApAQCAtNDg5LDYyICs1MzcsODcgQEAKICAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnJlbW92ZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIGJvb2wgaXNQcmltYXJ5TW9kdWxlKGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IDAgfHwgIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUtPmdldEhhbmRsZSgpID09IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0Rmlyc3REZXZpY2VJZCBvZiB0aGUgRGV2aWNlIFZlY3RvcgorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIElkLAorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAqLworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldEZpcnN0RGV2aWNlSWQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBnZXRGaXJzdERldmljZUFkZHJlc3MoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tTdHJhdGVneVJvdXRlOiB3aGVuIGFuIG91dHB1dCBpcyBiZWVpbmcgcmVyb3V0ZWQsIHJlY29uc2lkZXIgZWFjaCBvdXRwdXQKKyAgICAgICAgICogdGhhdCBtYXkgaG9zdCBhIHN0cmF0ZWd5IHBsYXlpbmcgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqIEBwYXJhbSBvdXB0dXRUb1NraXAgb3V0cHV0IHRoYXQgaW5pdGlhdGVkIHRoZSByZXJvdXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU4LDIwICs2MzEsMTcgQEAKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKIAotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworCiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAogICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKIAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+IG1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKICAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQogICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsgLy8gY29udGFpbnMgb25seSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIG5vcm1hbGx5IG5vdCBuZWVkZWQsIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1wcworCiAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnIG1Db25maWc7CiAKICAgICAgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1BdWRpb1BvcnRHZW5lcmF0aW9uOwpAQCAtNTg0LDcgKzY1NCw3IEBACiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKIAogICAgICAgICBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtSHdPdXRwdXRzOwotICAgICAgICBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKKyAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCiAgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKICAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKQEAgLTYwOCwxNyArNjc4LDI3IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKIHByaXZhdGU6CiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKKyAgICAgICAgdm9pZCBtb2RpZnlTdXJyb3VuZEZvcm1hdHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CiAKLSAgICAgICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKTsKKyAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpIGNvbnN0OworICAgICAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBnZXRNc2RQYXRjaGVzKCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSA9IG51bGxwdHIpOwogCiAgICAgICAgIC8vIElmIGFueSwgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcyBvZiBhbiBBdWRpbyBQcm9maWxlcyBjb2xsZWN0aW9uCi0gICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgdm9pZCB1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKTsKIAogICAgICAgICAvLyBOb3RpZnkgdGhlIHBvbGljeSBjbGllbnQgb2YgYW55IGNoYW5nZSBvZiBkZXZpY2Ugc3RhdGUgd2l0aCBBVURJT19JT19IQU5ETEVfTk9ORSwKQEAgLTYyNiw0MiArNzA2LDU3IEBACiAgICAgICAgIC8vIEl0IGNhbiBnaXZlIGEgY2hhbmNlIHRvIEhBTCBpbXBsZW1lbnRlciB0byByZXRyaWV2ZSBkeW5hbWljIGNhcGFiaWxpdGllcyBhc3NvY2lhdGVkCiAgICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlIGZvciBleGFtcGxlLgogICAgICAgICAvLyBUT0RPIGF2b2lkIG9wZW5pbmcgc3RyZWFtIHRvIHJldHJpZXZlIGNhcGFiaWxpdGllcyBvZiBhIHByb2ZpbGUuCi0gICAgICAgIHZvaWQgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCiAgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucwogICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgotICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCi0gICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgotICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKLSAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KLSAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKICAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgZ2V0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBmcm9tIGVpdGhlciBhIHNvdXJjZSBhdWRpb19hdHRyaWJ1dGVzX3QKKyAgICAgICAgLy8gb3IgYXVkaW9fc3RyZWFtX3R5cGVfdCwgcmVzcGVjdGl2ZWx5LgorICAgICAgICBzdGF0dXNfdCBnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSk7CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgY2FsbGVkIGJ5IGdldE91dHB1dEZvckF0dHIoKSBhbmQgY29ubmVjdEF1ZGlvU291cmNlLgorICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRySW50KGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKTsKLSAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgaW5wdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRJbnB1dEZvckRldmljZSBzZWxlY3RzIGFuIGlucHV0IGhhbmRsZSBmb3IgYSBnaXZlbiBpbnB1dCBkZXZpY2UgYW5kCisgICAgICAgICAqIHJlcXVlc3RlciBjb250ZXh0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgdXNlZCBieSByZXF1ZXN0ZXIsIHNlbGVjdGVkIGJ5IHBvbGljeSBtaXggcnVsZXMgb3IgZW5naW5lCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uIHJlcXVlc3RlciBzZXNzaW9uIGlkCisgICAgICAgICAqIEBwYXJhbSB1aWQgcmVxdWVzdGVyIHVpZAorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyByZXF1ZXN0ZXIgYXVkaW8gYXR0cmlidXRlcyAoZS5nLiBpbnB1dCBzb3VyY2UgYW5kIHRhZ3MgbWF0dGVyKQorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIHJlcXVlc3RlciBhdWRpbyBjb25maWd1cmF0aW9uIChlLmcuIHNhbXBsZSByYXRlLCBmb3JtYXQsIGNoYW5uZWwgbWFzaykuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyByZXF1ZXN0ZXIgaW5wdXQgZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIHBvbGljeU1peCBtYXkgYmUgbnVsbCwgcG9saWN5IHJ1bGVzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSByZXF1ZXN0ZXIKKyAgICAgICAgICogQHJldHVybiBpbnB1dCBpbyBoYW5kbGUgYWthIHVuaXF1ZSBpbnB1dCBpZGVudGlmaWVyIHNlbGVjdGVkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KTsKIAotICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKICAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgogICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQogICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZApAQCAtNjY5LDI1ICs3NjQsMjkgQEAKICAgICAgICAgdWludDMyX3Qgc2V0QmVhY29uTXV0ZShib29sIG11dGUpOwogICAgICAgICBib29sICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CiAKLSAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UgYW5kIHJldHVybiBhc3NvY2lhdGVkIHBvbGljeQotICAgICAgICAvLyBtaXggaWYgYW55LiBDYWxscyBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpLgotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4ID0gTlVMTCk7Ci0KICAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLgotICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZvaWQgdXBkYXRlTW9ubyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQpLCAoaW50KW1NYXN0ZXJNb25vKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgIH0KLQotICAgICAgICBib29sIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKTsKLSAgICAgICAgYm9vbCBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLSAgICAgICAgYm9vbCBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCBiMDY0ZjhjLi5kODI2MTkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0xNTUsMTcgKzE1NSw2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdG9wVG9uZSgpCi17Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQogewogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKQEAgLTIyMCwxMiArMjA5LDE3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogfQogCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNGExY2FiNC4uNDk0NzcxNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMSw3ICszMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMTcsNiArMzE3LDIwMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEhPVFdPUkQsIEZNX1RVTkVSIGFuZCBFQ0hPX1JFRkVSRU5DRSBhcmUgc3BlY2lhbCBjYXNlIHNvdXJjZXMgPiBNQVguCisgICAgaWYgKHNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CisgICAgICAgICAgICAoc291cmNlID4gQVVESU9fU09VUkNFX01BWCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzb3VyY2UgdHlwZSAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQywgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgcHJlLXByb2Nlc3NpbmcgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc291cmNlIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzb3VyY2UgZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzb3VyY2UgdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShzb3VyY2UpOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzb3VyY2UgdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHNvdXJjZSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoYXR0cmlidXRlc19pbml0aWFsaXplcih1c2FnZSkpOworCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCwgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgaW5zZXJ0IGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHN0cmVhbSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHN0cmVhbSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzdHJlYW0gdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHN0cmVhbXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc3RyZWFtIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc291cmNlIHR5cGUuCisgICAgc2l6ZV90IG51bVNvdXJjZXMgPSBtSW5wdXRTb3VyY2VzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNvdXJjZXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzb3VyY2UuCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtSW5wdXRTb3VyY2VzW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzb3VyY2VzIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc3RyZWFtIHR5cGUuCisgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJlYW1zOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc3RyZWFtLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHN0cmVhbXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogdm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdFZlY3Rvcjo6c2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpCiB7CkBAIC0zMzgsNyArNTMzLDggQEAKICAgICBDQU1DT1JERVJfU1JDX1RBRywKICAgICBWT0lDRV9SRUNfU1JDX1RBRywKICAgICBWT0lDRV9DT01NX1NSQ19UQUcsCi0gICAgVU5QUk9DRVNTRURfU1JDX1RBRworICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcsCisgICAgVk9JQ0VfUEVSRk9STUFOQ0VfU1JDX1RBRwogfTsKIAogLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNjIzMTgwZS4uNmFkMDFmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC02NCw3ICs2NCw2IEBACiAgICAgc3RhdHVzX3QgcmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCi0KICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cwogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KICAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLApAQCAtODIsMTggKzgxLDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAorICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc291cmNlcyBvZiB0eXBlIHxzb3VyY2V8LgorICAgIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzdHJlYW1zIG9mIGEgZ2l2ZW4gdXNhZ2UuCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHNvdXJjZSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHN0cmVhbSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiBwcml2YXRlOgogCiAgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBjbGFzcyBFZmZlY3REZXNjIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKHR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkocHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKGlkKSB7IH0KKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3REZXNjKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFRkZFQ1RfVVVJRF9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeyB9CiAgICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZChvcmlnLm1UeXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcmlnLm1PcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KG9yaWcubVByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChvcmlnLm1JZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKQEAgLTExNiw3ICsxNTcsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVHlwZVV1aWQ7CisgICAgICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwogICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOworICAgICAgICBpbnQzMl90IG1Qcmlvcml0eTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbUlkOwogICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDczMzdmMDQuLmQzMWNlNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE3LDEyICsxNywxMiBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcgKzMyLDggQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDksNyArNTAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNjYsNyArNjcsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC03OSw3ICs4MSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTE3NCw3ICsxNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTgzLDcgKzE4Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTE5Miw3ICsxOTUsOCBAQAogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyk7CiAKICAgICAvLyBGSVhNRTogSW50cm9kdWNlIGEgd2F5IHRvIGNoZWNrIGZvciB0aGUgdGhlIHRlbGVwaG9ueSBkZXZpY2UgYmVmb3JlIG9wZW5pbmcgdGhlIG91dHB1dAogICAgIGlmICgocmVzdWx0ID09IE5PX0VSUk9SKSAmJgpAQCAtMjAwLDEwMSArMjA0LDEyNSBAQAogICAgICAgICAhbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkLCB1aWQpKSB7CiAgICAgICAgIC8vIElmIHRoZSBhcHAgdHJpZXMgdG8gcGxheSBtdXNpYyB0aHJvdWdoIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGFuZCBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbgogICAgICAgICAvLyB0aGUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IGRldmljZS4KLSAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqb3V0cHV0LCAqc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqcG9ydElkKTsKICAgICAgICAgZmxhZ3MgPSBvcmlnaW5hbEZsYWdzOwogICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+Y2xlYXIoKTsKKyAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICBzcCA8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KCphdHRyLCAqb3V0cHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQsICpzdHJlYW0pOworICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQocG9ydElkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKKwogICAgIC8vIGNhbGxlZCBmcm9tIGludGVybmFsIHRocmVhZDogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKLSAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTMxMywxNCArMzQxLDE3IEBACiAgICAgfQogCiAgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJgotICAgICAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUKQorICAgICAgICAgICAgfHwgKGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUgorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM0NCw3ICszNzUsOCBAQAogCiAgICAgaWYgKChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyB8fAogICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIHx8Ci0gICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCkgJiYKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIHx8CisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpICYmCiAgICAgICAgICFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMzk4LDE3ICs0MzAsMTMgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCpwb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgb3BQYWNrYWdlTmFtZSwgc2Vzc2lvbik7Ci0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNDb25jdXJyZW50ID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlID0gZmFsc2U7IC8vVE9ETyA6IHVwZGF0ZSBmcm9tIEFQTS0+Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgY2xpZW50LT5kZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkLCBvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKQEAgLTQzNSwyMyArNDYzLDYgQEAKICAgICByZXR1cm4gcmF3YnVmZmVyOwogfQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db25jdXJyZW5jeVN0cmluZygKLSAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls2NF07IC8vIG92ZXJzaXplZAotICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVzJXMlcyIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpPyAiLGNhbGwiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKT8gIixjYXB0dXJlIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCk/ICIsaG90d29yZCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQpPyAiLHByZWVtcHQiOiIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLG5vbmUiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJmJ1ZmZlclsxXTsKLX0KLQogc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZVN0cjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CkBAIC00NjMsNyArNDc0LDcgQEAKICAgICByZXR1cm4gdHlwZVN0cjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDg2LDE4ICs0OTcsMTYgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIC8vIElmIFVJRCBpbmFjdGl2ZSBpdCByZWNvcmRzIHNpbGVuY2UgdW50aWwgYmVjb21pbmcgYWN0aXZlCi0gICAgKnNpbGVuY2VkID0gIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNsaWVudC0+dWlkKSAmJiAhY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2U7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kgPQotICAgICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOworCisgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbiwgKnNpbGVuY2VkLCAmY29uY3VycmVuY3kpOworICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KHBvcnRJZCk7CiAKICAgICB9CiAKQEAgLTUwNiw3ICs1MTUsNiBAQAogCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lbXSA9ICJhdWRpb3BvbGljeSI7CiAKLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJlYXNvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucmVhc29uIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVN0YXR1c1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuc3RhdHVzIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIjsKQEAgLTUyMCw2NCArNTI4LDUyIEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2VbXSA9CiAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLmRldmljZSI7CiAKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQXVkaW9Qb2xpY3kpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrQXVkaW9Qb2xpY3kpOwogICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7CiAKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UmVhc29uLCBhdWRpb0NvbmN1cnJlbmN5U3RyaW5nKGNvbmN1cnJlbmN5KS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVN0YXR1cywgc3RhdHVzKTsKIAogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdobyBpcyBhY3RpdmUKLSAgICAgICAgICAgIC8vIE5COiBtaWdodCB0aGUgb3RoZXIgcGFydHkgaGF2ZSBnaXZlbiB1cCB0aGUgbWljcm9waG9uZSBzaW5jZSB0aGVuPyBob3cgc3VyZS4KLSAgICAgICAgICAgIC8vIHBlcmhhcHMgY291bGQgaGF2ZSBnaXZlbiB1cCBvbiBpdC4KLSAgICAgICAgICAgIC8vIHdlIGhvbGQgbUxvY2ssIHNvIHBlcmhhcHMgd2UncmUgc2FmZSBmb3IgdGhpcyBsb29waW5nCi0gICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgIT0gQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKICAgICAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICAgICAgaXRlbSA9IE5VTEw7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY29uY3VycmVuY3kgJiB+QXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0SW5wdXQoKTogaW52YWxpZCBjb25jdXJyZW5jeSB0eXBlICVkIiwgKGludCljb25jdXJyZW5jeSk7Ci0KLSAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgY29uY3VycmVuY3kKLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGluY2FsbCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY29uY3VycmVudCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKICAgICAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIH0KIApAQCAtNTg5LDYgKzU4NSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOwpAQCAtNTk4LDExICs1OTUsMTQgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKIAogICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCiAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTYyMCw2ICs2MjAsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAgICAgQUxPR1coIiVzIHJlbGVhc2luZyBhY3RpdmUgY2xpZW50IHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisgICAgICAgIH0KKwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICB9CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC02MjcsMTUgKzYzNSwxNSBAQAogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbywgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlvKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTY5OCwxMSArNzA2LDEyIEBACiB1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KKyAgICAvLyBETyBOT1QgTE9DSywgbWF5IGJlIGNhbGxlZCBmcm9tIEF1ZGlvRmxpbmdlciB3aXRoIGxvY2sgaGVsZCwgcmVhY2hpbmcgZGVhZGxvY2sKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQpAQCAtODAzLDI3ICs4MTIsMTAwIEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgICpjb3VudCA9IDA7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyA9PSAwKSB7Ci0gICAgICAgICpjb3VudCA9IDA7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoCiAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KWF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgc291cmNlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCB1c2FnZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTgzNyw2ICs5MTksMTcgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIm1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7Cit9CisKKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTk0MCw5ICsxMDMzLDE0IEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworCisgICAgLy8gbG9vcGJhY2t8cmVuZGVyIG9ubHkgbmVlZCBhIE1lZGlhUHJvamVjdGlvbiAoY2hlY2tlZCBpbiBjYWxsZXIgQXVkaW9TZXJ2aWNlLmphdmEpCisgICAgYm9vbCBuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgeworICAgICAgICAgICAgcmV0dXJuICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncyk7IH0pOworICAgIGlmIChuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nICYmICFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtOTU0LDI3ICsxMDUyLDUyIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSwKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEwMjYsNiArMTE0OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUChmb3JtYXRzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC0xMDM2LDQgKzExNzAsNDcgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QTExeVVpZHModWlkcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMsIG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEpOworfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGYzY2RkYzMuLjc2YWMxOTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CkBAIC0zNSwxNiArMzQsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwpAQCAtNzAsOCArNjgsNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgICAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAotICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZApAQCAtODksMTEgKzg1LDEzIEBACiAKICAgICBtVWlkUG9saWN5ID0gbmV3IFVpZFBvbGljeSh0aGlzKTsKICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5ID0gbmV3IFNlbnNvclByaXZhY3lQb2xpY3kodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogfQogCiBBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQogewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmV4aXQoKTsKIApAQCAtMTA1LDYgKzEwMyw5IEBACiAKICAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOwogICAgIG1VaWRQb2xpY3kuY2xlYXIoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LmNsZWFyKCk7CiB9CiAKIC8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcwpAQCAtMTE4LDEzICsxMTksMTcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7Ci0gICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQgcGlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQsIHBpZCk7CiAKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHRva2VuLCBub3RpZmljYXRpb25DbGllbnQpOwogCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKQEAgLTEzNiwyMiArMTQxLDMzIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih1aWQpLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKIH0KIAogLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpCiB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh1aWQpOworICAgICAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHRva2VuKTsKICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICBib29sIGhhc1NhbWVVaWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGhhc1NhbWVVaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyICYmICFoYXNTYW1lVWlkKSB7CiAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBiaW5kZXIgZGVhdGggbm90aWZpY2F0aW9uOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWQpOwogICAgICAgICB9CkBAIC0xOTksMjIgKzIxNSwzNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0yMzksOCArMjY3LDkgQEAKIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbVBpZChwaWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCiAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSkKIHsKIH0KQEAgLTI1NCw3ICsyODMsNyBAQAogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCk7CisgICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkLCBtUGlkKTsKICAgICB9CiB9CiAKQEAgLTI3NSwxOSArMzA0LDI0IEBACiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMzI1LDI0ICszNTksMTc0IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXMoKQogewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKLSAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXNfbCgpCit7CisvLyAgICBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgYWxsb3cgY2FwdHVyZSAoZG9lcyBub3QgZm9yY2Ugc2lsZW5jZSkgaW4gdGhlCisvLyAgICBmb2xsb3dpbmcgY2FzZXM6CisvLyAgICBUaGUgY2xpZW50IGlzIHRoZSBhc3Npc3RhbnQKKy8vICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUAorLy8gICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgT1IgdXNlcyBWT0lDRV9SRUNPR05JVElPTiBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAorLy8gICAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gcHJpdmFjeSBzZW5zaXRpdmUgYWN0aXZlIGNhcHR1cmUKKy8vICAgIE9SIFRoZSBjbGllbnQgaXMgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisvLyAgICAgICAgQU5EIGlzIG9uIFRPUCBPUiBsYXRlc3Qgc3RhcnRlZAorLy8gICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgIE9SIHRoZSBzb3VyY2UgaXMgb25lIG9mOiBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkssCisvLyAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTAorLy8gICAgT1IgQW55IG90aGVyIGNsaWVudAorLy8gICAgICAgIEFORCBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZXJlIGlzIG5vIHByaXZhY3kgc2Vuc2l0aXZlIGFjdGl2ZSBjYXB0dXJlCisvL1RPRE86IG1hbWFuYWdlIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgYWNjb3JkaW5nIHRvIHVzZSBjYXNlIHByaW9yaXR5CisKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gdG9wQWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gMDsKKyAgICBib29sIGlzQTExeU9uVG9wID0gbVVpZFBvbGljeS0+aXNBMTF5T25Ub3AoKTsKKyAgICBib29sIGlzQXNzaXN0YW50T25Ub3AgPSBmYWxzZTsKKyAgICBib29sIGlzU2Vuc2l0aXZlQWN0aXZlID0gZmFsc2U7CisKKyAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIGNvbnRpbnVlOworICAgICAgICBpZiAoaXNQcml2YWN5U2Vuc2l0aXZlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcykgeworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNTZW5zaXRpdmVBY3RpdmUgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50LT51aWQpID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IHRvcFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICB0b3BBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIHRvcFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U3RhcnROcykgeworICAgICAgICAgICAgbGF0ZXN0QWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgIGxhdGVzdFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0b3BBY3RpdmUgPT0gbnVsbHB0ciAmJiBsYXRlc3RBY3RpdmUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRvcEFjdGl2ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGxhdGVzdEFjdGl2ZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgY29udGludWU7CisKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2U7CisgICAgICAgIGJvb2wgaXNPblRvcCA9IGN1cnJlbnQgPT0gdG9wQWN0aXZlOworICAgICAgICBib29sIGlzTGF0ZXN0ID0gY3VycmVudCA9PSBsYXRlc3RBY3RpdmU7CisgICAgICAgIGJvb2wgaXNMYXRlc3RTZW5zaXRpdmUgPSBjdXJyZW50ID09IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICAgICAgYm9vbCBmb3JjZUlkbGUgPSB0cnVlOworICAgICAgICBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCgoKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFpc1NlbnNpdGl2ZUFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIGlmICgoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYKKyAgICAgICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyB8fAorICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCB8fAorICAgICAgICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSykpIHsKKyAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpc0Fzc2lzdGFudE9uVG9wICYmIChpc09uVG9wIHx8IGlzTGF0ZXN0KSAmJgorICAgICAgICAgICAgICAgICghaXNTZW5zaXRpdmVBY3RpdmUgfHwgaXNMYXRlc3RTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsCisgICAgICAgICAgICAgICAgICAgICAgZm9yY2VJZGxlID8gQVBQX1NUQVRFX0lETEUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwbVN0YXRGcm9tQW1TdGF0ZShtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50LT51aWQpKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwgQVBQX1NUQVRFX0lETEUpOworICAgIH0KK30KKworLyogc3RhdGljICovCithcHBfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFwbVN0YXRGcm9tQW1TdGF0ZShpbnQgYW1TdGF0ZSkgeworICAgIHN3aXRjaCAoYW1TdGF0ZSkgeworICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV046CisgICAgICAgIHJldHVybiBBUFBfU1RBVEVfSURMRTsKKyAgICBjYXNlIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A6CisgICAgICAgIHJldHVybiBBUFBfU1RBVEVfVE9QOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQVBQX1NUQVRFX0ZPUkVHUk9VTkQ7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzUHJpdmFjeVNlbnNpdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXBwU3RhdGVfbCh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQoreworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBcHBTdGF0ZSh1aWQsIHN0YXRlKTsKICAgICB9CiAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYpIHsKKyAgICAgICAgYm9vbCBzaWxlbmNlZCA9IHN0YXRlID09IEFQUF9TVEFURV9JRExFOwogICAgICAgICBhZi0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CiAgICAgfQogfQpAQCAtMzYyLDkgKzU0Niw2IEBACiAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG9uZVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOwpAQCAtNTA1LDcgKzY4Niw4IEBACiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtNTE0LDYgKzY5Niw3IEBACiAgICAgICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZiBsaW5rVG9EZWF0aCBmYWlsZWQ6ICVkIiwgcmVzKTsKKwogICAgICAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CiAgICAgfQogfQpAQCAtNTMyLDggKzcxNSw3IEBACiAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Y2hlY2tSZWdpc3RlcmVkKCkgewogICAgIGJvb2wgbmVlZFRvUmVyZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTU0MywxMDMgKzcyNSwyMTIgQEAKICAgICAgICAgLy8gTG9va3MgbGlrZSBBY3Rpdml0eU1hbmFnZXIgaGFzIGRpZWQgcHJldmlvdXNseSwgYXR0ZW1wdCB0byByZS1yZWdpc3Rlci4KICAgICAgICAgcmVnaXN0ZXJTZWxmKCk7CiAgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIGNoZWNrUmVnaXN0ZXJlZCgpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCiAgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSk7CiAgICAgfQogICAgIHJldHVybiBhY3RpdmU7CiB9CiAKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0VWlkU3RhdGUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgIH0KKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZCAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgorICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgaW50IHN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBzdGF0ZSA9IGFtLmdldFVpZFByb2Nlc3NTdGF0ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkR29uZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCBmYWxzZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGZhbHNlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7Ci0gICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2VydmljZS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCAhYWN0aXZlKTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwcm9jU3RhdGVTZXEgX191bnVzZWQpIHsKKyAgICBpZiAocHJvY1N0YXRlICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgcHJvY1N0YXRlLCB0cnVlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNPdmVycmlkZGVuID0gZmFsc2UsIHdhc0FjdGl2ZSA9IGZhbHNlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCAmd2FzT3ZlcnJpZGRlbiwgJndhc0FjdGl2ZSk7Ci0gICAgfQotICAgIGlmICghd2FzT3ZlcnJpZGRlbiAmJiBpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBTdGFydGVkIHRvIG92ZXJyaWRlLgotICAgIH0gZWxzZSBpZiAod2FzT3ZlcnJpZGRlbiAmJiAhaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBpc1VpZEFjdGl2ZSh1aWQpKTsgIC8vIE92ZXJyaWRlIGNlYXNlZCwgbm90aWZ5IHdpdGggZ3JvdW5kIHRydXRoLgotICAgIH0gZWxzZSBpZiAod2FzQWN0aXZlICE9IGFjdGl2ZSkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIE92ZXJyaWRlIHVwZGF0ZWQuCisgICAgdXBkYXRlVWlkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGluc2VydCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UoKSB7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+dXBkYXRlVWlkU3RhdGVzKCk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCB3YXNBY3RpdmUgPSBpc1VpZEFjdGl2ZSh1aWQpOworICAgIGludCBwcmV2aW91c1N0YXRlID0gZ2V0VWlkU3RhdGUodWlkKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbUNhY2hlZFVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsIG51bGxwdHIsICZ3YXNBY3RpdmUpOwotICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHNlcnZpY2UgaWYgY3VycmVudGx5IG92ZXJyaWRkZW4uCi0gICAgICAgIGlmIChtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKSAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSByZXR1cm47CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCh1aWRzLCB1aWQsIGFjdGl2ZSwgc3RhdGUsIGluc2VydCk7CiAgICAgfQotICAgIGJvb2wgbm93QWN0aXZlID0gYWN0aXZlICYmIGluc2VydDsKLSAgICBpZiAod2FzQWN0aXZlICE9IG5vd0FjdGl2ZSkgbm90aWZ5U2VydmljZSh1aWQsIG5vd0FjdGl2ZSk7CisgICAgaWYgKHdhc0FjdGl2ZSAhPSBpc1VpZEFjdGl2ZSh1aWQpIHx8IHN0YXRlICE9IHByZXZpb3VzU3RhdGUpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSgpOworICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKSB7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CiAgICAgYXV0byBpdCA9IHVpZHMtPmZpbmQodWlkKTsKICAgICBpZiAoaXQgIT0gdWlkcy0+ZW5kKCkpIHsKLSAgICAgICAgaWYgKHdhc1RoZXJlICE9IG51bGxwdHIpICp3YXNUaGVyZSA9IHRydWU7Ci0gICAgICAgIGlmICh3YXNBY3RpdmUgIT0gbnVsbHB0cikgKndhc0FjdGl2ZSA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChpbnNlcnQpIHsKLSAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBhY3RpdmU7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmZpcnN0ID0gYWN0aXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IHN0YXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWlkcy0+ZXJhc2UoaXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnNlcnQpIHsKLSAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9IGVsc2UgaWYgKGluc2VydCAmJiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSB7CisgICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlPblRvcCgpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnVpZCA6IG1DYWNoZWRVaWRzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZC5maXJzdCk7CisgICAgICAgIGlmIChpdCA9PSBtQTExeVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1aWQuc2Vjb25kLnNlY29uZCA+PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QCisgICAgICAgICAgICAgICAgJiYgdWlkLnNlY29uZC5zZWNvbmQgPD0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0JPVU5EX0ZPUkVHUk9VTkRfU0VSVklDRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVNlcnZpY2UgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQogICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCiB7Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKIH0KIAogCkBAIC02NDksNyArOTQwLDYgQEAKICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOwotICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQpAQCAtNjc0LDY4ICs5NjQsNTQgQEAKICAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKQEAgLTc0NSw3ICsxMDIxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogewpAQCAtNzU1LDcgKzEwMzMsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKQEAgLTc4NSw3ICsxMDY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKQEAgLTgxMSw4ICsxMDkzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgZGF0YS0+bUNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1EZXZpY2VDb25maWcsIGRhdGEtPm1FZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSwgZGF0YS0+bVNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTAwLDI3ICsxMTgzLDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7Ci0gICAgc3A8VG9uZURhdGE+IGRhdGEgPSBuZXcgVG9uZURhdGEoKTsKLSAgICBkYXRhLT5tVHlwZSA9IHR5cGU7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTk2NywzMyArMTIyOSwyNSBAQAogICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwogICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKICAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCkBAIC0xMDc2LDkgKzEzMzAsMTQgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTsKQEAgLTEwODYsOCArMTM0NSwxMSBAQAogICAgIGRhdGEtPm1FdmVudCA9IGV2ZW50OwogICAgIGRhdGEtPm1DbGllbnRJbmZvID0gKmNsaWVudEluZm87CiAgICAgZGF0YS0+bUNsaWVudENvbmZpZyA9ICpjbGllbnRDb25maWc7CisgICAgZGF0YS0+bUNsaWVudEVmZmVjdHMgPSBjbGllbnRFZmZlY3RzOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOworICAgIGRhdGEtPm1FZmZlY3RzID0gZWZmZWN0czsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKKyAgICBkYXRhLT5tU291cmNlID0gc291cmNlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CiAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAogICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKQEAgLTEyMTIsNiArMTQ3NCw3IEBACiAgICAgICAgICAgICAgICAgcGF0Y2ggPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXRjaCwgMCwgc2l6ZW9mKHBhdGNoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUyOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoMjsKQEAgLTEyNTYsOCArMTUxOSw2IEBACiAKICAgICAgICAgfSBicmVhazsKIAotICAgICAgICBjYXNlIFNUQVJUX1RPTkU6Ci0gICAgICAgIGNhc2UgU1RPUF9UT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzMzAsMjcgKzE1OTEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBkZWxheU1zKTsKIH0KIAotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIH0KLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOwotICAgIHJldHVybiAwOwotfQotCiBpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQogewogICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwpAQCAtMTQwNiw5ICsxNjQ2LDYgQEAKIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKTsKLWludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci1pbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKTsKIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0MDdkN2E1Li44Y2Q2ZTgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTMzLDEzICszMywxMiBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CkBAIC02MiwzNiArNjEsMzMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xMDIsOCArOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMTM0LDYgKzEyOSwyMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTE1OSwxMCArMTY5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMTkyLDEwICsyMDIsMTQgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pOwpAQCAtMjA3LDE0ICsyMjEsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcyk7CisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtMjI0LDcgKzI0NCw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKIAotICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKTsKKyAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKQEAgLTIzMiwxMiArMjUyLDIyIEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKQEAgLTI0OSw3ICsyNzksNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2hlbGxDb21tYW5kKGludCBpbiwgaW50IG91dCwgaW50IGVyciwgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAvLyBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIFVJRCByZWNvcmRzIG9ubHkgc2lsZW5jZQotICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgLy8gT3ZlcnJpZGVzIHRoZSBVSUQgc3RhdGUgYXMgaWYgaXQgaXMgaWRsZQogICAgIHN0YXR1c190IGhhbmRsZVNldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOwpAQCAtMjY1LDYgKzI5NSwxNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKworICAgIGFwcF9zdGF0ZV90IGFwbVN0YXRGcm9tQW1TdGF0ZShpbnQgYW1TdGF0ZSk7CisKKyAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlcygpOworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzX2woKTsKKworICAgIHZvaWQgc2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpOworCisgICAgc3RhdGljIGJvb2wgaXNQcml2YWN5U2Vuc2l0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKICAgICAvLyBJZiByZWNvcmRpbmcgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIFVJRCBpcyBhbGxvd2VkIHRvIGRvIHRoYXQuIElmIHRoZSBVSUQgaXMgaWRsZQogICAgIC8vIHRoZW4gaXQgY2Fubm90IHJlY29yZCBhbmQgZ2V0cyBidWZmZXJzIHdpdGggemVyb3MgLSBzaWxlbmNlLiBBcyBzb29uIGFzIHRoZSBVSUQKICAgICAvLyB0cmFuc2l0aW9ucyB0byBhbiBhY3RpdmUgc3RhdGUgd2Ugd2lsbCBzdGFydCByZXBvcnRpbmcgYnVmZmVycyB3aXRoIGRhdGEuIFRoaXMgYXBwcm9hY2gKQEAgLTI3NCw3ICszMTUsNyBAQAogICAgIGNsYXNzIFVpZFBvbGljeSA6IHB1YmxpYyBCblVpZE9ic2VydmVyLCBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQotICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSksIG1Bc3Npc3RhbnRVaWQoMCkge30KIAogICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOwogICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CkBAIC0yODMsMzQgKzMyNCw2MyBAQAogICAgICAgICB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobykgb3ZlcnJpZGU7CiAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQpOworICAgICAgICBpbnQgZ2V0VWlkU3RhdGUodWlkX3QgdWlkKTsKKyAgICAgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IG1Bc3Npc3RhbnRVaWQgPSB1aWQ7IH0KKyAgICAgICAgYm9vbCBpc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgcmV0dXJuIHVpZCA9PSBtQXNzaXN0YW50VWlkOyB9CisgICAgICAgIHZvaWQgc2V0QTExeVVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7IG1BMTF5VWlkcy5jbGVhcigpOyBtQTExeVVpZHMgPSB1aWRzOyB9CisgICAgICAgIGJvb2wgaXNBMTF5VWlkKHVpZF90IHVpZCk7CisgICAgICAgIGJvb2wgaXNBMTF5T25Ub3AoKTsKIAogICAgICAgICAvLyBCblVpZE9ic2VydmVyIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlLCB0cnVlKTsgfQogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7Ci0gICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgY2hlY2tSZWdpc3RlcmVkKCk7CiAKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgTXV0ZXggbUxvY2s7CiAgICAgICAgIGJvb2wgbU9ic2VydmVyUmVnaXN0ZXJlZDsKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1DYWNoZWRVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtT3ZlcnJpZGVVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtQ2FjaGVkVWlkczsKKyAgICAgICAgdWlkX3QgbUFzc2lzdGFudFVpZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKICAgICB9OwogCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gcmVjb3JkaW5nLiBUaGlzIGlzIGhhbmRsZWQgc2ltaWxhciB0byBpZGxlIFVJRHMsIGFueSBhcHAgdGhhdCBhdHRlbXB0cworICAgIC8vIHRvIHJlY29yZCB3aGlsZSBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHdpbGwgcmVjZWl2ZSBidWZmZXJzIHdpdGggemVyb3MuIEFzIHNvb24gYXMKKyAgICAvLyBzZW5zb3IgcHJpdmFjeSBpcyBkaXNhYmxlZCBhY3RpdmUgYXBwcyB3aWxsIHJlY2VpdmUgdGhlIGV4cGVjdGVkIGRhdGEgd2hlbiByZWNvcmRpbmcuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgfTsKKworICAgIC8vIFRocmVhZCB1c2VkIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKICAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCiAgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0zMTksOCArMzg5LDYgQEAKIAogICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAogICAgICAgICAgICAgU0VUX1ZPTFVNRSwKICAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAogICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKQEAgLTM0NSwyMCArNDEzLDEzIEBACiAgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKIAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMzcwLDEzICs0MzEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKQEAgLTM5MCw3ICs0NTUsNyBAQAogCiAgICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCisgICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU0VUX1ZPTFVNRSwgU0VUX1BBUkFNRVRFUlMuLi4KICAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCiAgICAgICAgICAgICBNdXRleCBtTG9jazsgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB0byBtQ29uZAogICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KQEAgLTQwNiwxMiArNDcxLDYgQEAKICAgICAgICAgICAgIEF1ZGlvQ29tbWFuZERhdGEoKSB7fQogICAgICAgICB9OwogCi0gICAgICAgIGNsYXNzIFRvbmVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICB9OwotCiAgICAgICAgIGNsYXNzIFZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKQEAgLTQzMiwxNiArNDkxLDEyIEBACiAKICAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewpAQCAtNDcxLDE0ICs1MjYsMTYgQEAKICAgICAgICAgICAgIGludCBtRXZlbnQ7CiAgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUNsaWVudEVmZmVjdHM7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IG1FZmZlY3RzOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKICAgICAgICAgfTsKIAogICAgICAgICBNdXRleCAgIG1Mb2NrOwogICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CiAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCiAgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCiAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CkBAIC01NTMsMTEgKzYxMCw2IEBACiAgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKLSAgICAgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0KICAgICAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogCkBAIC01ODIsOSArNjM0LDEzIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCkBAIC01OTcsMTkgKzY1MywyOCBAQAogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1VaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwogCkBAIC02MTksMzQgKzY4NCw2MCBAQAogCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKICAgICB9OwogCisgICAgY2xhc3MgQXVkaW9DbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIGlvKGlvKSwgdWlkKHVpZCksIHBpZChwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKHNlc3Npb24pLCBkZXZpY2VJZChkZXZpY2VJZCksIGFjdGl2ZShmYWxzZSkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9DbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKworICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsgLy8gc291cmNlLCBmbGFncyAuLi4KKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW87ICAgICAgICAgIC8vIGF1ZGlvIEhBTCBzdHJlYW0gSU8gaGFuZGxlCisgICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECisgICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECisgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gUGxheWJhY2svQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKKyAgICB9OworCiAgICAgLy8gLS0tIEF1ZGlvUmVjb3JkQ2xpZW50IC0tLQogICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1JlY29yZCBjbGllbnQKICAgICAvLyAoYmV0d2VlbiBjYWxscyB0byBnZXRJbnB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZUlucHV0KCkpCi0gICAgY2xhc3MgQXVkaW9SZWNvcmRDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgY2xhc3MgQXVkaW9SZWNvcmRDbGllbnQgOiBwdWJsaWMgQXVkaW9DbGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZENsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGlucHV0KSwgdWlkKHVpZCksIHBpZChwaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBzZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUoZmFsc2UpLCBpc0NvbmN1cnJlbnQoZmFsc2UpLCBpc1ZpcnR1YWxEZXZpY2UoZmFsc2UpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkQ2xpZW50KCkge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBkZXZpY2VJZCksCisgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHN0YXJ0VGltZU5zKDApIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgotICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQotICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAotICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAogICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKLSAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCi0gICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnM7CisgICAgfTsKKworICAgIC8vIC0tLSBBdWRpb1BsYXliYWNrQ2xpZW50IC0tLQorICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1RyYWNrIGNsaWVudAorICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldE91dHB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZU91dHB1dCgpKQorICAgIGNsYXNzIEF1ZGlvUGxheWJhY2tDbGllbnQgOiBwdWJsaWMgQXVkaW9DbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9QbGF5YmFja0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKICAgICB9OwogCiAgICAgLy8gQSBjbGFzcyBhdXRvbWF0aWNhbGx5IGNsZWFyaW5nIGFuZCByZXN0b3JpbmcgYmluZGVyIGNhbGxlciBpZGVudGl0eSBpbnNpZGUKQEAgLTY3NiwyMSArNzY3LDIzIEBACiAgICAgLy8gbUxvY2sgcHJvdGVjdHMgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgdGhhdCBjYW4gY2FsbCBpbnRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBhbmQgcG9zc2libHkgYmFjayBpbiB0byBhdWRpbyBwb2xpY3kgc2VydmljZSBhbmQgYWNxdWlyZSBtRWZmZWN0c0xvY2suCiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZSAqbUF1ZGlvUG9saWN5TWFuYWdlcjsKICAgICBBdWRpb1BvbGljeUNsaWVudCAqbUF1ZGlvUG9saWN5Q2xpZW50OwogCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCB1aWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50NjRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOwogICAgIE11dGV4IG1Ob3RpZmljYXRpb25DbGllbnRzTG9jazsgIC8vIHByb3RlY3RzIG1Ob3RpZmljYXRpb25DbGllbnRzCiAgICAgLy8gTWFuYWdlIGFsbCBlZmZlY3RzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsKIAogICAgIHNwPFVpZFBvbGljeT4gbVVpZFBvbGljeTsKKyAgICBzcDxTZW5zb3JQcml2YWN5UG9saWN5PiBtU2Vuc29yUHJpdmFjeVBvbGljeTsKKwogICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9SZWNvcmRDbGllbnQ+ID4gICBtQXVkaW9SZWNvcmRDbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gPiAgIG1BdWRpb1BsYXliYWNrQ2xpZW50czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGE0M2RhZWEuLjk3YmU0NGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tawpAQCAtNCw5ICs0LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKyAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKQEAgLTE4LDYgKzE2LDEwIEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCisKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAogCkBAIC0yOSw0ICszMSwzNCBAQAogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cworCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKKyMgc3lzdGVtL2F1ZGlvLmggdXRpbGl0aWVzIHRlc3QKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJiYXNlIFwKKyAgbGlibG9nIFwKKyAgbGlibWVkaWFfaGVscGVyIFwKKyAgbGlidXRpbHMKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgIGxpYm1lZGlhX2hlYWRlcnMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgc3lzdGVtYXVkaW9fdGVzdHMuY3BwIFwKKworTE9DQUxfTU9EVUxFIDo9IHN5c3RlbWF1ZGlvX3Rlc3RzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCisKK0xPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKaW5kZXggZWI4MjIyYy4uNmFlMzU0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTYwLDkgKzYwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IH0KICAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9Ci0gICAgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgLyp0b25lKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQotICAgIHN0YXR1c190IHN0b3BUb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IC8qdm9sdW1lKi8sIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCAvKnNlc3Npb24qLywKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKnNyY091dHB1dCovLApAQCAtNzgsMTEgKzc1LDE0IEBACiAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgLyp1c2UqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQogICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCAvKnJlZ0lkKi8sIGludDMyX3QgLypzdGF0ZSovKSBvdmVycmlkZSB7IH0KLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgLypldmVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190KiAvKmNsaWVudEluZm8qLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qY2xpZW50Q29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmRldmljZUNvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IC8qcGF0Y2hIYW5kbGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhOTU5M2I4Li5kZTU2NzBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTE2LDkgKzE2LDE1IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKwogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdENsaWVudC5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaCIKIApAQCAtMTA2LDEwICsxMTIsMzkgQEAKICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7CiB9OwogCitjbGFzcyBQYXRjaENvdW50Q2hlY2sgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGF0Y2hDb3VudENoZWNrKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgKmNsaWVudCkKKyAgICAgICAgICAgIDogbUNsaWVudHtjbGllbnR9LAorICAgICAgICAgICAgICBtSW5pdGlhbENvdW50e21DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpfSB7fQorICAgIGludCBkZWx0YUZyb21TbmFwc2hvdCgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGN1cnJlbnRDb3VudCA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOworICAgICAgICBpZiAobUluaXRpYWxDb3VudCA8PSBjdXJyZW50Q291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q291bnQgLSBtSW5pdGlhbENvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0oc3RhdGljX2Nhc3Q8aW50PihtSW5pdGlhbENvdW50IC0gY3VycmVudENvdW50KSk7CisgICAgICAgIH0KKyAgICB9CisgIHByaXZhdGU6CisgICAgY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqbUNsaWVudDsKKyAgICBjb25zdCBzaXplX3QgbUluaXRpYWxDb3VudDsKK307CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7ICh2b2lkKWNvbmZpZzsgfQorCisgICAgdm9pZCBkdW1wVG9Mb2coKTsKKyAgICB2b2lkIGdldE91dHB1dEZvckF0dHIoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBudWxscHRyKTsKKyAgICBQYXRjaENvdW50Q2hlY2sgc25hcHNob3RQYXRjaENvdW50KCkgeyByZXR1cm4gUGF0Y2hDb3VudENoZWNrKG1DbGllbnQuZ2V0KCkpOyB9CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudD4gbUNsaWVudDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXI7CkBAIC0xMTksNiArMTU0LDcgQEAKICAgICBtQ2xpZW50LnJlc2V0KG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7CiAgICAgbU1hbmFnZXItPmdldENvbmZpZygpLnNldERlZmF1bHQoKTsKKyAgICBTZXRVcENvbmZpZygmbU1hbmFnZXItPmdldENvbmZpZygpKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdGlhbGl6ZSgpKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0Q2hlY2soKSk7CiB9CkBAIC0xMjgsMTQgKzE2NCw3MyBAQAogICAgIG1DbGllbnQucmVzZXQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpkdW1wVG9Mb2coKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7fTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbG9jYWxQb3J0SWQ7CisgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBBU1NFUlRfRVEoT0ssIG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgICAgICAgICAmYXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCAwIC8qdWlkKi8sICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSkpOworICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKK30KKworCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgSW5pdFN1Y2Nlc3MpIHsKICAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCiB9CiAKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgewogICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKG51bGxwdHIsICZoYW5kbGUsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsIG51bGxwdHIsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKQEAgLTE2MiwzNSArMjU3LDE4MCBAQAogICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CiAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGhhbmRsZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICBBU1NFUlRfRVEoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7Ci0gICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGcm9tTWl4KSB7Ci0gICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB1aWRfdCB1aWQgPSA0MjsKLSAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNyYyA9IHBhdGNoLnNvdXJjZXNbMF07Ci0gICAgICAgIHNyYy5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKLSAgICAgICAgc3JjLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwotICAgICAgICBzcmMuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0tPmdldElkKCk7Ci0gICAgICAgIC8vIE5vdGU6IHRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICAgICAgc3JjLnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICAgIHNyYy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAgICAgc3JjLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNpbmsgPSBwYXRjaC5zaW5rc1swXTsKLSAgICAgICAgc2luay5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgICAgIHNpbmsudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7Ci0gICAgICAgIHNpbmsuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5nZXRJZCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgdWlkKSk7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXSkuCisgICAgICAgICAgICBhZGRTaW5rKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIHVpZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKLSAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogLy8gVE9ETzogQWRkIHBhdGNoIGNyZWF0aW9uIHRlc3RzIHRoYXQgaW52b2x2ZSBhbHJlYWR5IGV4aXN0aW5nIHBhdGNoCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOworfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdXNpbmcgU2VyaWFsaXplciB0byBsb2FkIHBhcnQgb2YgdGhlIGNvbmZpZyBmcm9tIGEgc3RyaW5nLgorICAgIG1Nc2RPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX0JVUyk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBwY21PdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGFjM091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoYWMzT3V0cHV0UHJvZmlsZSk7CisgICAgbU1zZElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVUyk7CisgICAgLy8gTWF0Y2ggb3V0cHV0IHByb2ZpbGUgZnJvbSBBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbUlucHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDQ0MTAwKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWctPmdldEh3TW9kdWxlcygpOworICAgIG1vZHVsZXMuYWRkKG1zZE1vZHVsZSk7CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CisgICAgbU1zZE91dHB1dERldmljZS0+YXR0YWNoKG1zZE1vZHVsZSk7CisgICAgbU1zZElucHV0RGV2aWNlLT5hdHRhY2gobXNkTW9kdWxlKTsKKworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJtc2QgaW5wdXQiKSk7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1zZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUgPQorICAgICAgICAgICAgbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIGNvbXByZXNzZWQgaW5wdXQiKSk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShhYzNPdXRwdXRQcm9maWxlKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+c2V0RmxhZ3MoCisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUpOworCisgICAgc3A8SW5wdXRQcm9maWxlPiBtc2RJbnB1dFByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoIm1zZCBvdXRwdXQiKSk7CisgICAgbXNkSW5wdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtSW5wdXRQcm9maWxlKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkSW5wdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKG1zZElucHV0UHJvZmlsZSk7CisKKyAgICAvLyBBZGQgYSBwcm9maWxlIHdpdGggYW5vdGhlciBlbmNvZGluZyB0byB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gdGVzdCByb3V0aW5nCisgICAgLy8gb2Ygc3RyZWFtcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE1TRC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR0c091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIGNvbmZpZy0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5hZGRBdWRpb1Byb2ZpbGUoZHRzT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgiZW5jb2RlZCIpKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShkdHNPdXRwdXRQcm9maWxlKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoY29uZmlnLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIGNvbmZpZy0+Z2V0SHdNb2R1bGVzKCkuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpLT4KKyAgICAgICAgICAgIGFkZE91dHB1dFByb2ZpbGUocHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpUZWFyRG93bigpIHsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLmNsZWFyKCk7CisgICAgbU1zZElucHV0RGV2aWNlLmNsZWFyKCk7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CisgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CisgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIFBhdGNoQ3JlYXRpb25PblNldEZvcmNlVXNlKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0clBjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFBsdXNQY21Sb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyVW5zdXBwb3J0ZWRGb3JtYXRCeXBhc3Nlc01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CisgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX05FKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoLTEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYWU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlN5c0F1ZGlvX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSW52YWxpZCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAwOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hWYWxpZCkgeworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICAvLyBJdCdzIE9LIG5vdCB0byBoYXZlIHNpbmtzLgorICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSkpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS4KKyAgICAgICAgICAgICAgICAgICAgYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSHdBdlN5bmMpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworICAgIGRldmljZV9zcmNfY2ZnLmZsYWdzLmlucHV0ID0gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgZGV2aWNlX3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIG1peF9zaW5rX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NyY19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKKyAgICBtaXhfc3JjX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hFcXVhbCkgeworICAgIGNvbnN0IGF1ZGlvX3BhdGNoIHBhdGNoMXt9LCBwYXRjaDJ7fTsKKyAgICAvLyBJbnZhbGlkIHBhdGNoZXMgYXJlIG5vdCBlcXVhbC4KKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJnBhdGNoMSwgJnBhdGNoMikpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzaW5rID0geworICAgICAgICAuaWQgPSAyLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rX2h3X2F2X3N5bmMgPSBzaW5rOworICAgIHNpbmtfaHdfYXZfc3luYy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBzaW5rX2h3X2F2X3N5bmMuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzBlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTczIEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLworLy8gbGliY2FtZXJhc2VydmljZQorLy8KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlIiwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAorICAgICAgICAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmFDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIiwKKyAgICAgICAgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCisgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAorICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlscy9UYWdNb25pdG9yLmNwcCIsCisgICAgICAgICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ5dXYiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAic3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJkZXB0aHBob3RvIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAorICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmltYWdlX2lvIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgiLAorICAgICAgICAibGlieG1sMiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8taWdub3JlZC1xdWFsaWZpZXJzIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA5NjI2MWFiLi40Y2ZlY2ZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTE0LDkxICsxNCw5IEBACiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIGxpYmNhbWVyYXNlcnZpY2UKLSMKLQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2FtZXJhIHNlcnZpY2Ugc291cmNlCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAgXAotICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKLSAgICBDYW1lcmFGbGFzaGxpZ2h0LmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBcCi0gICAgY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgXAotICAgIGFwaTEvQ2FtZXJhQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBcCi0gICAgZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBcCi0gICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAotICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXAotICAgIHV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBcCi0gICAgdXRpbHMvVGFnTW9uaXRvci5jcHAgXAotICAgIHV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlidWkgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHNjYWxsc3RhY2sgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGliZm1xIFwKLSAgICBsaWJndWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGlianBlZyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBCdWlsZCB0ZXN0cyB0b28KKyMgQnVpbGQgdGVzdHMKIAogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBiYTAyNDRlLi5lMDY4OTdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNDcsMTEgKzQ3LDE1IEBACiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lbXVucmVhY2hhYmxlL21lbXVucmVhY2hhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KQEAgLTY5LDYgKzczLDcgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgewogICAgIGNvbnN0IGNoYXIqIGtQZXJtaXNzaW9uU2VydmljZU5hbWUgPSAicGVybWlzc2lvbiI7CkBAIC03Nyw2ICs4Miw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmE7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYUNsaWVudDsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OwpAQCAtMTQxLDYgKzE0NywxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZW51bWVyYXRlUHJvdmlkZXJzKCkgewpAQCAtMjE0LDEzICsyMjcsMTQgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgaS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICAgICAgaS5zZWNvbmQtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2e2NhbWVyYUlkfSk7CiAgICAgfQogfQogCiBDYW1lcmFTZXJ2aWNlOjp+Q2FtZXJhU2VydmljZSgpIHsKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgewpAQCAtMzM3LDcgKzM1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogICAgICAgICAgICAgLy8gRW5zdXJlIG5vdCBpbiBiaW5kZXIgUlBDIHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAogICAgICAgICAgICAgICAgICAgICAib25EZXZpY2VTdGF0dXNDaGFuZ2VkIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGNhbWVyYSBzZXJ2aWNlIHByb2Nlc3MhIik7CiAgICAgICAgICAgICBjbGllbnRUb0Rpc2Nvbm5lY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgfQpAQCAtNDk4LDE3ICs1MTIsMzcgQEAKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICB9CiAKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRhZ3NSZW1vdmVkOworICAgIC8vIElmIGl0J3Mgbm90IGNhbGxpbmcgZnJvbSBjYW1lcmFzZXJ2ZXIsIGNoZWNrIHRoZSBwZXJtaXNzaW9uLgorICAgIGlmICgoY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSkgJiYKKyAgICAgICAgICAgICFjaGVja1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+cmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoCisgICAgICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSksCisgICAgICAgICAgICAgICAgJnRhZ3NSZW1vdmVkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIHJlbW92ZSBjYW1lcmEiCisgICAgICAgICAgICAgICAgICAgICIgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcgY2FtZXJhIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGFnc1JlbW92ZWQuZW1wdHkoKSkgeworICAgICAgICByZXMgPSBjYW1lcmFJbmZvLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0NIQVJBQ1RFUklTVElDX0tFWVNfTkVFRElOR19QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLmRhdGEoKSwgdGFnc1JlbW92ZWQuc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIGluc2VydCBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAia2V5cyBuZWVkaW5nIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nVWlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci19Ci0KIFN0cmluZzggQ2FtZXJhU2VydmljZTo6Z2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUobnVsbHB0cik7CiAgICAgY2hhciBmb3JtYXR0ZWRUaW1lWzY0XTsKQEAgLTU4OSw3ICs2MjMsNyBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKIAogICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKQEAgLTYwMSw3ICs2MzUsNyBAQAogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CiAgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCkBAIC02MTQsMTIgKzY0OCwxMyBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwpAQCAtNjQzLDcgKzY3OCw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCiAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCkBAIC03MzIsNyArNzY3LDcgQEAKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIFN0cmluZzE2IGludGVybmFsUGFja2FnZU5hbWUoImNhbWVyYXNlcnZlciIpOwogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOwpAQCAtNzQyLDggKzc3Nyw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHVpZCwgVVNFX0NBTExJTkdfUElELAotICAgICAgICAgICAgQVBJXzEsIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gdG1wKQorICAgICAgICAgICAgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGE6ICVzIiwgX19GVU5DVElPTl9fLCByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTc4Miw5ICs4MTYsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC04NDEsNyArODc1LDcgQEAKICAgICB9CiAjZW5kaWYgIC8vIF9fQlJJTExPX18KIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSBIQUwgbW9kdWxlIG5vdCBsb2FkZWQpIiwKQEAgLTg3NSw4ICs5MDksOCBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ2xpZW50UGVybWlzc2lvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNsaWVudE5hbWU4LCBpbnQmIGNsaWVudFVpZCwgaW50JiBjbGllbnRQaWQsCiAgICAgICAgIC8qb3V0Ki9pbnQmIG9yaWdpbmFsQ2xpZW50UGlkKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IGNhbGxpbmdVaWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBjbGllbnRVaWQKICAgICBpZiAoY2xpZW50VWlkID09IFVTRV9DQUxMSU5HX1VJRCkgewpAQCAtOTIyLDYgKzk1NiwxNCBAQAogICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIH0KIAorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBwcmV2ZW50IGFjY2VzcyB0byB0aGUgY2FtZXJhCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgQUxPR0UoIkFjY2VzcyBEZW5pYWw6IGNhbm5vdCB1c2UgdGhlIGNhbWVyYSB3aGVuIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIHdoZW4gc2Vuc29yIHByaXZhY3kgIgorICAgICAgICAgICAgICAgICJpcyBlbmFibGVkIiwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgfQorCiAgICAgLy8gT25seSB1c2UgcGFzc2VkIGluIGNsaWVudFBpZCB0byBjaGVjayBwZXJtaXNzaW9uLiBVc2UgY2FsbGluZyBQSUQgYXMgdGhlIGNsaWVudCBQSUQgdGhhdCdzCiAgICAgLy8gY29ubmVjdGVkIHRvIGNhbWVyYSBzZXJ2aWNlIGRpcmVjdGx5LgogICAgIG9yaWdpbmFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwpAQCAtOTQ1LDcgKzk4Nyw3IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgewogICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYW1lcmFTdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhIElEICVzKSIsIGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwpAQCAtMTE0OSw3ICsxMTkxLDcgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKQEAgLTExNTcsNyArMTE5OSw3IEBACiAgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CiAgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLApAQCAtMTIwNywxMSArMTI0OSwxMCBAQAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjM0LDEyICsxMjc1LDExIEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIHRydWUsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNDgsNiArMTI4OCwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpIHsKKyAgICAvLyBJZiB0aGUgdGhyZWFkIHNlcnZpbmcgdGhpcyBjYWxsIGlzIG5vdCBhIGh3YmluZGVyIHRocmVhZCBhbmQgdGhlIGNhbGxlcgorICAgIC8vIGlzbid0IHRoZSBjYW1lcmFzZXJ2ZXIgaXRzZWxmLCBhbmQgdGhlIGNhbWVyYSBpZCBiZWluZyByZXF1ZXN0ZWQgaXMgdG8gYmUKKyAgICAvLyBwdWJsaWNhbGx5IGhpZGRlbiwgd2Ugc2hvdWxkIHJlamVjdCB0aGUgY29ubmVjdGlvbi4KKyAgICBpZiAoIWhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkgJiYKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZSgKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLApAQCAtMTI2MCwxNSArMTMxMiwxNCBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCiAgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjgwLDcgKzEzMzEsNyBAQAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCkBAIC0xMjkzLDYgKzEzNDQsMTQgQEAKICAgICAgICAgICAgIChoYWxWZXJzaW9uID09IC0xKSA/ICJkZWZhdWx0IiA6IHN0ZDo6dG9fc3RyaW5nKGhhbFZlcnNpb24pLmNfc3RyKCksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGVmZmVjdGl2ZUFwaUxldmVsKSk7CiAKKyAgICBpZiAoc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjYW1lcmFJZCkpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBzeXN0ZW0tb25seSBjYW1lcmEgaWQgJXMsIGNvbm5lY3Rpb24gcmVqZWN0ZWQiLAorICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgfQogICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCkBAIC0xMzY1LDcgKzE0MjQsNyBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0NDksNyArMTUwOCw3IEBACiAgICAgfQogCiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyB2ZXJpZnkgaWQgaXMgdmFsaWQuCiAgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKQEAgLTE1NTYsNyArMTYxNSw3IEBACiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhcmdzKSB7Ci0gICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwogCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKQEAgLTE1NjUsNyArMTYyNCw3IEBACiAgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbm5vdCBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIgogICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCkBAIC0xNTc4LDkgKzE2MzcsMTAgQEAKIAogICAgIHN3aXRjaChldmVudElkKSB7CiAgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTRVJfU1dJVENIRUQ6IHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIGFuZCBzZW5zb3IgcHJpdmFjeSBwb2xpY3kgdXBkYXRlcywgaW4gY2FzZSB3ZSdyZSByZWNvdmVyaW5nCiAgICAgICAgICAgICAvLyBmcm9tIGEgc3lzdGVtIHNlcnZlciBjcmFzaAogICAgICAgICAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgICAgICBkb1VzZXJTd2l0Y2goLypuZXdVc2VySWRzKi8gYXJncyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTU5NCw5ICsxNjU0LDYwIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpIHsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOworCisgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKKyAgICBpZiAocGlkICE9IHNlbGZQaWQpIHsKKyAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aAorICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKKyAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX1NFTkRfU1lTVEVNX0VWRU5UUyIpKSkgeworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbm5vdCBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgZGV2aWNlIgorICAgICAgICAgICAgICAgICAgICAiIHN0YXRlIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgICAgICAiTm8gcGVybWlzc2lvbiB0byBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgZGV2aWNlIHN0YXRlIgorICAgICAgICAgICAgICAgICAgICAiIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7CisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOworICAgIH0KKyAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQorICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKKyAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOworCisgICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOworICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG5ld0RldmljZVN0YXRlKTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gKmNhbWVyYVN0YXR1c2VzKSB7CisgICAgcmV0dXJuIGFkZExpc3RlbmVySGVscGVyKGxpc3RlbmVyLCBjYW1lcmFTdGF0dXNlcyk7Cit9CisKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gKmNhbWVyYVN0YXR1c2VzLAorICAgICAgICBib29sIGlzVmVuZG9yTGlzdGVuZXIpIHsKKwogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBBTE9HVigiJXM6IEFkZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbGlzdGVuZXIuZ2V0KCkpOwpAQCAtMTYxMSwyMCArMTcyMiwyNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LnNlY29uZCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9BTFJFQURZX0VYSVNUUywgIkxpc3RlbmVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOworICAgICAgICBtTGlzdGVuZXJMaXN0LmVtcGxhY2VfYmFjayhpc1ZlbmRvckxpc3RlbmVyLCBsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyogQ29sbGVjdCBjdXJyZW50IGRldmljZXMgYW5kIHN0YXR1cyAqLwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBpZiAoIWlzVmVuZG9yTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoaS5maXJzdC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYW5ub3QgYWRkIHB1YmxpYyBsaXN0ZW5lciBmb3IgaGlkZGVuIHN5c3RlbS1vbmx5ICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGkuZmlyc3QuY19zdHIoKSwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY1OSw3ICsxNzc2LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LT5zZWNvbmQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgewogICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgICAgICAgICB9CkBAIC0xNzE3LDcgKzE4MzQsNyBAQAogICAgIH0KIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7Ci0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICBzd2l0Y2ggKGRldmljZVZlcnNpb24pIHsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKQEAgLTE3MzQsNiArMTg1MSw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwpAQCAtMTc1NCw2ICsxODcyLDE4IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAvKm91dCovIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGNvbnN0IFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgKmlzU3VwcG9ydGVkID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNIaWRkZW5QaHlzaWNhbENhbWVyYShpZC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CkBAIC0xOTAxLDEzICsyMDMxLDEzIEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CiAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICAvLyBSZWFjcXVpcmUgbVNlcnZpY2VMb2NrCiAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKQEAgLTE5NzUsNyArMjEwNSw2IEBACiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKIAotCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CkBAIC0yMDkxLDcgKzIyMjAsNyBAQAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAogICAgICAgICBtQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjYW1lcmFDbGllbnQ7CkBAIC0yMTc4LDYgKzIzMDcsOCBAQAogICAgIHNDYW1lcmFTZXJ2aWNlLT5yZW1vdmVCeUNsaWVudCh0aGlzKTsKICAgICBzQ2FtZXJhU2VydmljZS0+bG9nRGlzY29ubmVjdGVkKG1DYW1lcmFJZFN0ciwgbUNsaWVudFBpZCwKICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKSk7CisgICAgc0NhbWVyYVNlcnZpY2UtPm1DYW1lcmFQcm92aWRlck1hbmFnZXItPnJlbW92ZVJlZihDYW1lcmFQcm92aWRlck1hbmFnZXI6OkRldmljZU1vZGU6OkNBTUVSQSwKKyAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5jX3N0cigpKTsKIAogICAgIHNwPElCaW5kZXI+IHJlbW90ZSA9IGdldFJlbW90ZSgpOwogICAgIGlmIChyZW1vdGUgIT0gbnVsbHB0cikgewpAQCAtMjIwMCw3ICsyMzMxLDcgQEAKICAgICAvLyBObyBkdW1waW5nIG9mIGNsaWVudHMgZGlyZWN0bHkgb3ZlciBCaW5kZXIsCiAgICAgLy8gbXVzdCBnbyB0aHJvdWdoIENhbWVyYVNlcnZpY2U6OmR1bXAKICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhTTl9FVkVOVF9MT0dfSUQsICIyNjI2NTQwMyIsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOworICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMzM3LDcgKzI0NjgsNyBAQAogCiAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAogICAgIC8vIGFuZCB0byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgYnkgY2xpZW50LgotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQogICAgIG5vdGlmeUVycm9yKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQsIHJlc3VsdEV4dHJhcyk7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMjUzOCw2ICsyNjY5LDU5IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgU2Vuc29yUHJpdmFjeVBvbGljeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBzcG0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBSZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgc3BtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogVW5yZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ibG9ja0FsbENsaWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBTZW5zb3JQcml2YWN5TWFuYWdlciBoYXMgZGllZCIpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjY5OCw4ICsyODgyLDggQEAKIAogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CkBAIC0yODcyLDcgKzMwNTYsNyBAQAogICAgICAgKiBiaW5kZXIgZHJpdmVyCiAgICAgICAqLwogICAgIC8vIFBJRCBoZXJlIGlzIGFwcHJveGltYXRlIGFuZCBjYW4gYmUgd3JvbmcuCi0gICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKKyAgICBsb2dDbGllbnREaWVkKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAogICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudAogICAgIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZCh3aG8pOwpAQCAtMjkyOCw3ICszMTEyLDEzIEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2KGNhbWVyYUlkKSk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lci5maXJzdCAmJgorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNraXBwaW5nIGNhbWVyYSBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yIHN5c3RlbS1vbmx5IGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuc2Vjb25kLT5vblN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTYoY2FtZXJhSWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiB9CkBAIC0zMDIzLDYgKzMyMTMsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tBbGxDbGllbnRzKCkgeworICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5ibG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uLCBudWxscHRyLCBudWxscHRyKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDYyNGQxY2EuLmNmMGNlZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgogCkBAIC0xNTMsMTIgKzE1NCwxOSBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKTsKKwogICAgIC8vIE9LID0gc3VwcG9ydHMgYXBpIG9mIHRoYXQgdmVyc2lvbiwgLUVPUE5PVFNVUFAgPSBkb2VzIG5vdCBzdXBwb3J0CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBzdXBwb3J0c0NhbWVyYUFwaSgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgaW50MzJfdCBhcGlWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtMTY3LDYgKzE3NSwxMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIGJpbmRlcjo6U3RhdHVzICAgICAgYWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcywgYm9vbCBpc1ZlbmRvciA9IGZhbHNlKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENsaWVudCBmdW5jdGlvbmFsaXR5CiAKQEAgLTUzMSw2ICs1NDMsNyBAQAogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOwogICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCk7CiAgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CisgICAgICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkIF9fdW51c2VkLCBpbnQzMl90IHByb2NTdGF0ZSBfX3VudXNlZCwgaW50NjRfdCBwcm9jU3RhdGVTZXEgX191bnVzZWQpIHt9CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CkBAIC01NDgsOCArNTYxLDM1IEBACiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbU92ZXJyaWRlVWlkczsKICAgICB9OyAvLyBjbGFzcyBVaWRQb2xpY3kKIAorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIsCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVNlbnNvclByaXZhY3lFbmFibGVkKGZhbHNlKSwgbVJlZ2lzdGVyZWQoZmFsc2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgICAgICBNdXRleCBtU2Vuc29yUHJpdmFjeUxvY2s7CisgICAgICAgICAgICBib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKKyAgICAgICAgICAgIGJvb2wgbVJlZ2lzdGVyZWQ7CisgICAgfTsKKwogICAgIHNwPFVpZFBvbGljeT4gbVVpZFBvbGljeTsKIAorICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgLy8gRGVsYXktbG9hZCB0aGUgQ2FtZXJhIEhBTCBtb2R1bGUKICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwogCkBAIC01ODEsMTIgKzYyMSwxNSBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCk7CiAKKyAgICAvLyBTaG91bGQgYW4gb3BlcmF0aW9uIGF0dGVtcHQgb24gYSBjYW1lcmFJZCBiZSByZWplY3RlZCwgaWYgdGhlIGNhbWVyYSBpZCBpcworICAgIC8vIGFkdmVydGlzZWQgYXMgYSBwdWJsaWNhbGx5IGhpZGRlbiBzZWN1cmUgY2FtZXJhLCBieSB0aGUgY2FtZXJhIEhBTCA/CisgICAgYm9vbCBzaG91bGRSZWplY3RIaWRkZW5DYW1lcmFDb25uZWN0aW9uKGNvbnN0IFN0cmluZzggJiBjYW1lcmFJZCk7CisKICAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscwogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAotICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CiAKICAgICAvLyBMb2NrIGd1YXJkaW5nIGNhbWVyYSBzZXJ2aWNlIHN0YXRlCkBAIC03NDgsNyArNzkxLDggQEAKICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1DYW1lcmFQcm92aWRlck1hbmFnZXI7CiAKICAgICAvLyBHdWFyZGVkIGJ5IG1TdGF0dXNMaXN0ZW5lck11dGV4Ci0gICAgc3RkOjp2ZWN0b3I8c3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PiBtTGlzdGVuZXJMaXN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxib29sLCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+PiBtTGlzdGVuZXJMaXN0OworCiAgICAgTXV0ZXggICAgICAgbVN0YXR1c0xpc3RlbmVyTG9jazsKIAogICAgIC8qKgpAQCAtODIwLDYgKzg2NCw5IEBACiAgICAgLy8gQmxvY2tzIGFsbCBjbGllbnRzIGZyb20gdGhlIFVJRAogICAgIHZvaWQgYmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCk7CiAKKyAgICAvLyBCbG9ja3MgYWxsIGFjdGl2ZSBjbGllbnRzLgorICAgIHZvaWQgYmxvY2tBbGxDbGllbnRzKCk7CisKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CiAKQEAgLTgzMiwxMCArODc5LDYgQEAKICAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAogICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKIAotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYXMgYSBmb3JtYXR0ZWQgc3RyaW5nLgogICAgICAqLwpAQCAtODQ0LDcgKzg4Nyw3IEBACiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0NhbWVyYUFjY2Vzcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYWM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiY2FtZXJhc2VydmljZV90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOGJiMjRkNC4uMTYyYjUwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTQ0LDEwICs0NSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKQEAgLTU4LDggKzU1LDcgQEAKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCkBAIC02OSw4ICs2NSw2IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7Ci0KLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewpAQCAtNDA1LDcgKzM5OSw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIGNhbWVyYXNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBtQ2xpZW50UGlkICYmIGNhbGxpbmdQaWQgIT0gbVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gcmVzOwpAQCAtNDYwLDggKzQ1NCw2IEBACiAKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAogICAgIHJldHVybiByZXM7CkBAIC00NzIsMTQgKzQ2NCwxNCBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKQEAgLTQ5MiwxNiArNDg0LDE2IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCiAgICAgaWYgKG1DbGllbnRQaWQgPT0gMCkgewotICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtQ2xpZW50UGlkICE9IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEVCVVNZOwogICAgIH0KIApAQCAtNTEzLDkgKzUwNSw5IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKLSAgICBpZiAobUNsaWVudFBpZCA9PSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCA9PSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlJFQ09SRCB8fAogICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKQEAgLTUyOSw3ICs1MjEsNyBAQAogICAgIH0KIAogICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgcmV0dXJuIEVCVVNZOwogfQogCkBAIC0xNDQ3LDEzICsxNDM5LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IC8qbXNnVHlwZSovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGludCB0YWtlUGljdHVyZUNvdW50ZXI7CisgICAgYm9vbCBzaG91bGRTeW5jV2l0aERldmljZSA9IHRydWU7CiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBzd2l0Y2ggKGwubVBhcmFtZXRlcnMuc3RhdGUpIHsKQEAgLTE1MzksMTQgKzE1MzIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBzeW5jIHdpdGggdGhlIGRldmljZSBpbiBjYXNlIGZsYXNoIGlzIHR1cm5lZCBvbiwKKyAgICAgICAgLy8gdGhlIGNhbWVyYSBkZXZpY2Ugc3VnZ2VzdHMgdGhhdCBmbGFzaCBpcyBuZWVkZWQgKEFFIHN0YXRlIEZMQVNIX1JFUVVJUkVEKQorICAgICAgICAvLyBvciB3ZSBhcmUgaW4gc29tZSBvdGhlciBBRSBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBDT05WRVJHRUQgdGhhdCBtYXkgbmVlZAorICAgICAgICAvLyBwcmVjYXB0dXJlIHRyaWdnZXIuCisgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLmZsYXNoTW9kZSAhPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09OICYmCisgICAgICAgICAgICAgICAgKGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfQ09OVkVSR0VEKSkgeworICAgICAgICAgICAgc2hvdWxkU3luY1dpdGhEZXZpY2UgID0gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oa1Rha2VwaWN0dXJlTGFiZWwsIHRha2VQaWN0dXJlQ291bnRlcik7CiAKLSAgICAvLyBOZWVkIEhBTCB0byBoYXZlIGNvcnJlY3Qgc2V0dGluZ3MgYmVmb3JlIChwb3NzaWJseSkgdHJpZ2dlcmluZyBwcmVjYXB0dXJlCi0gICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICAvLyBNYWtlIHN1cmUgSEFMIGhhcyBjb3JyZWN0IHNldHRpbmdzIGluIGNhc2UgcHJlY2FwdHVyZSB0cmlnZ2VyIGlzIG5lZWRlZC4KKyAgICBpZiAoc2hvdWxkU3luY1dpdGhEZXZpY2UpIHsKKyAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICB9CiAKLSAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKG1zZ1R5cGUpOworICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUoKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc3RhcnQgY2FwdHVyZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTE2NjYsMjcgKzE2NzAsNiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQotICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLAotICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTc4NCw2ICsxNzY3LDcgQEAKICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKICAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgcmVjb3ZlcmFibGUgZXJyb3IgJWQgZnJvbSBIQUwgLSBpZ25vcmluZywgcmVxdWVzdElkICUiIFBSSWQzMiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworICAgICAgICAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGVyciA9IENBTUVSQV9FUlJPUl9VTktOT1dOOwpAQCAtMTkzNCwxNCArMTkxOCwxNiBAQAogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgewogICAgIEFMT0dWKCIlczogQXV0b2V4cG9zdXJlIHN0YXRlIG5vdyAlZCwgbGFzdCB0cmlnZ2VyICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3U3RhdGUsIHRyaWdnZXJJZCk7CisgICAgeworICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbC5tUGFyYW1ldGVycy5hZVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlBdXRvRXhwb3N1cmUobmV3U3RhdGUsIHRyaWdnZXJJZCk7CiB9CiAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKLSAgICAodm9pZClyZXN1bHRFeHRyYXM7Ci0gICAgKHZvaWQpdGltZXN0YW1wOwotCiAgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDQ0OTI5YzMuLmE5ZWEyNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05Niw4ICs5Niw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGYxMjAzZjkuLmQ2NWFjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTI1LDI3ICsyNSwyNCBAQAogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCiAjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiAKICAgICBtSGFyZHdhcmUgPSBOVUxMOwpAQCAtNTcsMTQgKzU0LDEzIEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMTA1LDcgKzEwMSw3IEBACiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTQ4LDcgKzE0NCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWQoKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTU4LDcgKzE1NCw4IEBACiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAorICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwpAQCAtMTY3LDcgKzE2NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6bG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMTgyLDcgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dW5sb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yNDAsNyArMjM3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKQEAgLTM1MSw3ICszNDgsNyBAQAogLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCiB2b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTM3MiwxMyArMzY5LDEzIEBACiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwogfQogCiAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9SRUNPUkRJTkdfTU9ERSk7CiB9CiAKQEAgLTQ2MSw3ICs0NTgsNyBAQAogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTQ3Nyw3ICs0NzQsNyBAQAogCiAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKQEAgLTUwMyw3ICs1MDAsNyBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBpZiAobWVtID09IG51bGxwdHIpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYxNSw3ICs2MTIsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjIzLDcgKzYyMCw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpyZWNvcmRpbmdFbmFibGVkKCkgewotICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MzEsNyArNjI4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NDEsNyArNjM4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NTIsNyArNjQ5LDcgQEAKIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgZ2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY4MSw3ICs2NzgsNyBAQAogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02OTYsMTYgKzY5MywxOCBAQAogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKKyAgICB9CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIC8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKQEAgLTcxNSwzMiArNzE0LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjAiKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7Ci0gICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgaW50IG9yaWVudGF0aW9uOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCAxOTEwNTM2Li45NTMwYjZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggNzAzNDFjNS4uODg3OTlmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNTAsOCArNTAsNyBAQAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCiAgICAgICAgIG1UcmlnZ2VySWQoMCksCiAgICAgICAgIG1UaW1lb3V0Q291bnQoMCksCi0gICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCksCi0gICAgICAgIG1Nc2dUeXBlKDApIHsKKyAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIApAQCAtNjQsNyArNjMsNyBAQAogICAgIG1ac2xQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CiB9CiAKLXN0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtU3RhcnRDYXB0dXJlKSB7Ci0gICAgICAgIG1Nc2dUeXBlID0gbXNnVHlwZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgIG1TdGFydENhcHR1cmVTaWduYWwuc2lnbmFsKCk7CiAgICAgfQpAQCAtMTE5LDYgKzExNywzMSBAQAogICAgIH0KIH0KIAordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBib29sIGpwZWdCdWZmZXJMb3N0ID0gZmFsc2U7CisgICAgaWYgKGVycm9yQ29kZSA9PSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUikgeworICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGNhcHR1cmVTdHJlYW1JZCA9IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCk7CisgICAgICAgIGlmIChjYXB0dXJlU3RyZWFtSWQgPT0gcmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyb3JDb2RlID09CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QpIHsKKyAgICAgICAgaWYgKHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gbVNodXR0ZXJDYXB0dXJlSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChqcGVnQnVmZmVyTG9zdCkgeworICAgICAgICBzcDxNZW1vcnlCYXNlPiBlbXB0eUJ1ZmZlcjsKKyAgICAgICAgb25DYXB0dXJlQXZhaWxhYmxlKC8qdGltZXN0YW1wKi8wLCBlbXB0eUJ1ZmZlciwgLypjYXB0dXJlRXJyb3IqL3RydWUpOworICAgIH0KK30KKwogdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKQEAgLTM4Niw3ICs0MDksNyBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yQ2FwdHVyZUVuZDsKICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOwpAQCAtNjA2LDcgKzYyOSw3IEBACiAgICAgICAgIGlmICghbVNodXR0ZXJOb3RpZmllZCkgewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAgICAgICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICAgICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKQEAgLTcyMywxMiArNzQ2LDExIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKSB7CisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmIChwYXJhbXMuc3RhdGUgPT0gUGFyYW1ldGVyczo6U1RJTExfQ0FQVFVSRQotICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZAotICAgICAgICAmJiAobXNnVHlwZSAmIENBTUVSQV9NU0dfU0hVVFRFUikpIHsKKyAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQpIHsKICAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFTZXJ2aWNlKCktPnBsYXlTb3VuZChDYW1lcmFTZXJ2aWNlOjpTT1VORF9TSFVUVEVSKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IGYyZTM3NTAuLjcyN2RkNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIHZvaWQgc2V0WnNsUHJvY2Vzc29yKGNvbnN0IHdwPFpzbFByb2Nlc3Nvcj4mIHByb2Nlc3Nvcik7CiAKICAgICAvLyBCZWdpbiBzdGlsbCBpbWFnZSBjYXB0dXJlCi0gICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKGludCBtc2dUeXBlKTsKKyAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoKTsKIAogICAgIC8vIFdhaXQgdW50aWwgY3VycmVudCBpbWFnZSBjYXB0dXJlIGNvbXBsZXRlczsgcmV0dXJucyBpbW1lZGlhdGVseSBpZiBubwogICAgIC8vIGNhcHR1cmUgaXMgYWN0aXZlLiBSZXR1cm5zIFRJTUVEX09VVCBpZiBjYXB0dXJlIGRvZXMgbm90IGNvbXBsZXRlIGR1cmluZwpAQCAtNjUsNiArNjUsOSBAQAogICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKIAorICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgc2h1dHRlciAoY2FwdHVyZSBzdGFydCkKKyAgICB2b2lkIG5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCiAgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgogICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCkBAIC0xNDUsNyArMTQ4LDYgQEAKICAgICBib29sIG1BZUluUHJlY2FwdHVyZTsKIAogICAgIGludDMyX3QgbUNhcHR1cmVJZDsKLSAgICBpbnQgbU1zZ1R5cGU7CiAKICAgICAvLyBNYWluIGludGVybmFsIG1ldGhvZHMKIApAQCAtMTcyLDcgKzE3NCw3IEBACiAKICAgICAvLyBFbWl0IFNodXR0ZXIvUmF3IGNhbGxiYWNrIHRvIGphdmEsIGFuZCBtYXliZSBwbGF5IGEgc2h1dHRlciBzb3VuZAogICAgIHN0YXRpYyB2b2lkIHNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpOworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMGM3MzhlNy4uNjgzZTg0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC0zMyw3ICszMywxMCBAQAogICAgIEZyYW1lUHJvY2Vzc29yQmFzZShkZXZpY2UpLAogICAgIG1DbGllbnQoY2xpZW50KSwKICAgICBtTGFzdEZyYW1lTnVtYmVyT2ZGYWNlcygwKSwKLSAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpIHsKKyAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUVGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIoLTEpIHsKIAogICAgIHNwPENhbWVyYURldmljZUJhc2U+IGQgPSBkZXZpY2UucHJvbW90ZSgpOwogICAgIG1TeW50aGVzaXplM0FOb3RpZnkgPSAhKGQtPndpbGxOb3RpZnkzQSgpKTsKQEAgLTI2MiwyNCArMjY1LDczIEBACiAgICAgYm9vbCBnb3RBbGxTdGF0ZXMgPSB0cnVlOwogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGJvb2wgZ290QUZTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBib29sIGdvdEFXQlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3Yk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgYm9vbCBnb3RBRVN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFlU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QUZTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgZ290QVdCU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAogICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQ7CiAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkOwogCisgICAgaWYgKGdvdEFFU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWVTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QUZTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZlN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlID0gcGVuZGluZ1N0YXRlLmFmTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBV0JTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFXQkZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUgPSBwZW5kaW5nU3RhdGUuYXdiTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlID0gcGVuZGluZ1N0YXRlLmF3YlN0YXRlOworICAgICAgICAgICAgbUxhc3RBV0JGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgZ290QWxsU3RhdGVzICY9IGdvdEFFU3RhdGUgJiBnb3RBRlN0YXRlICYgZ290QVdCU3RhdGU7CiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHsKICAgICAgICAgLy8gSWYgbm90IGFsbCBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBwdXQgdGhlIHBlbmRpbmcgc3RhdGUgdG8gbVBlbmRpbmczQVN0YXRlcy4KICAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yOTAsNDAgKzM0MiwxMCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIC8vIE9uY2UgYWxsIDNBIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IDNBIGNoYW5nZXMuCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKLSAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgfQotICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCiAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIG1QZW5kaW5nM0FTdGF0ZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgfQogCi0gICAgbTNhU3RhdGUgPSBwZW5kaW5nU3RhdGU7CiAgICAgbUxhc3QzQUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCmluZGV4IDYyYTRlOTEuLjgxODNjMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCkBAIC0xMDQsOCArMTA0LDcgQEAKICAgICAvLyBUcmFjayBtb3N0IHJlY2VudCBmcmFtZSBudW1iZXIgZm9yIHdoaWNoIDNBIG5vdGlmaWNhdGlvbnMgd2VyZSBzZW50IGZvci4KICAgICAvLyBVc2VkIHRvIGZpbHRlciBhZ2FpbnN0IHNlbmRpbmcgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUKICAgICAvLyBzZXZlcmFsIHRpbWVzLgotICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyOwotCisgICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXIsIG1MYXN0QUVGcmFtZU51bWJlciwgbUxhc3RBRnJhbWVOdW1iZXIsIG1MYXN0QVdCRnJhbWVOdW1iZXI7CiAgICAgLy8gRW1pdCBGYWNlRGV0ZWN0aW9uIGV2ZW50IHRvIGphdmEgaWYgZmFjZXMgY2hhbmdlZAogICAgIHZvaWQgY2FsbGJhY2tGYWNlRGV0ZWN0aW9uKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX2ZyYW1lX21ldGFkYXRhICZtZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggYjcwMjBmZS4uZGRmZTVlMyAxMDA3NTUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtNjIsMjYgKzYyLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgSnBlZ1Byb2Nlc3Nvcjo6b25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiAvKmJ1ZmZlckluZm8qLykgewotICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBlbXB0eQotfQotCi12b2lkIEpwZWdQcm9jZXNzb3I6Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgewotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgaWYgKGJ1ZmZlckluZm8ubUVycm9yKSB7Ci0gICAgICAgIC8vIE9ubHkgbG9jayBpbiBjYXNlIG9mIGVycm9yLCBzaW5jZSB3ZSBnZXQgb25lIG9mIHRoZXNlIGZvciBlYWNoCi0gICAgICAgIC8vIG9uRnJhbWVBdmFpbGFibGUgYXMgd2VsbCwgYW5kIHNjaGVkdWxpbmcgbWF5IGRlbGF5IHRoaXMgY2FsbCBsYXRlCi0gICAgICAgIC8vIGVub3VnaCB0byBydW4gaW50byBsYXRlciBwcmV2aWV3IHJlc3RhcnQgb3BlcmF0aW9ucywgZm9yIG5vbi1lcnJvcgotICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgLy8gYi8yOTUyNDY1MQotICAgICAgICBBTE9HVigiJXM6IEpQRUcgYnVmZmVyIGxvc3QiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7Ci0gICAgICAgIG1DYXB0dXJlRG9uZSA9IHRydWU7Ci0gICAgICAgIG1DYXB0dXJlU3VjY2VzcyA9IGZhbHNlOwotICAgICAgICBtQ2FwdHVyZURvbmVTaWduYWwuc2lnbmFsKCk7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBKcGVnUHJvY2Vzc29yOjp1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTc2LDEzICsxNTYsNiBAQAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLQotICAgICAgICByZXMgPSBkZXZpY2UtPmFkZEJ1ZmZlckxpc3RlbmVyRm9yU3RyZWFtKG1DYXB0dXJlU3RyZWFtSWQsIHRoaXMpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBhZGQgYnVmZmVyIGxpc3RlbmVyaTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAppbmRleCA3MTg3YWQ5Li45NzdmMTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KIAogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsOCArNDIsNyBAQAogICogU3RpbGwgaW1hZ2UgY2FwdHVyZSBvdXRwdXQgaW1hZ2UgcHJvY2Vzc2luZwogICovCiBjbGFzcyBKcGVnUHJvY2Vzc29yOgotICAgICAgICAgICAgcHVibGljIFRocmVhZCwgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyLAotICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewogICBwdWJsaWM6CiAgICAgSnBlZ1Byb2Nlc3NvcihzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik7CiAgICAgfkpwZWdQcm9jZXNzb3IoKTsKQEAgLTUwLDE1ICs1MCwxNCBAQAogICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCiAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogCi0gICAgLy8gQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudGF0aW9uCi0gICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOwotICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKLQogICAgIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisKKyAgICBzdGF0aWMgc2l6ZV90IGZpbmRKcGVnU2l6ZSh1aW50OF90KiBqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSk7CisKICAgcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCiAgICAgd3A8Q2FtZXJhRGV2aWNlQmFzZT4gbURldmljZTsKQEAgLTgyLDcgKzgxLDYgQEAKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc05ld0NhcHR1cmUoYm9vbCBjYXB0dXJlU3VjY2Vzcyk7Ci0gICAgc2l6ZV90IGZpbmRKcGVnU2l6ZSh1aW50OF90KiBqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSk7CiAKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCAyOGQxODZhLi4xOGFkZGI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC02OSw3ICs2OSw3IEBACiAgICAgcmVzID0gYnVpbGRRdWlya3MoKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCi0gICAgY29uc3QgU2l6ZSBNQVhfUFJFVklFV19TSVpFID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CisgICAgU2l6ZSBtYXhQcmV2aWV3U2l6ZSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwogICAgIC8vIFRyZWF0IHRoZSBILjI2NCBtYXggc2l6ZSBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2aWRlbyBzaXplLgogICAgIE1lZGlhUHJvZmlsZXMgKnZpZGVvRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKICAgICBWZWN0b3I8dmlkZW9fZW5jb2Rlcj4gZW5jb2RlcnMgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVycygpOwpAQCAtOTAsMTEgKzkwLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gVGhpcyBpcyBqdXN0IGFuIHVwcGVyIGJvdW5kIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKLSAgICBjb25zdCBTaXplIFZJREVPX1NJWkVfVVBQRVJfQk9VTkQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OworICAgIFNpemUgdmlkZW9TaXplVXBwZXJCb3VuZCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CiAKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9QUkVWSUVXX1NJWkUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgbWF4UHJldmlld1NpemUgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICAgICAgdmlkZW9TaXplVXBwZXJCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpKTsKKyAgICB9CisKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoVklERU9fU0laRV9VUFBFUl9CT1VORCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXModmlkZW9TaXplVXBwZXJCb3VuZCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICAvLyBTZWxlY3QgaW5pdGlhbCBwcmV2aWV3IGFuZCB2aWRlbyBzaXplIHRoYXQncyB1bmRlciB0aGUgaW5pdGlhbCBib3VuZCBhbmQKQEAgLTI5Niw5ICszMDEsMTMgQEAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlSnBlZ1NpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CiAgICAgaWYgKCFhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpKSByZXR1cm4gTk9fSU5JVDsKIAotICAgIC8vIFRPRE86IFBpY2sgbWF4aW11bQogICAgIHBpY3R1cmVXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS53aWR0aDsKICAgICBwaWN0dXJlSGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLmhlaWdodDsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIFNpemUgc3VnZ2VzdGVkSnBlZ1NpemUgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZEpwZWdTaXplcygpKTsKKyAgICAgICAgcGljdHVyZVdpZHRoID0gc3VnZ2VzdGVkSnBlZ1NpemUud2lkdGg7CisgICAgICAgIHBpY3R1cmVIZWlnaHQgPSBzdWdnZXN0ZWRKcGVnU2l6ZS5oZWlnaHQ7CisgICAgfQogICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CiAgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OwogICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gZmFsc2U7CkBAIC03NTcsNiArNzY2LDcgQEAKICAgICBmb2N1c1N0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX0lOQUNUSVZFOwogICAgIHNoYWRvd0ZvY3VzTW9kZSA9IEZPQ1VTX01PREVfSU5WQUxJRDsKIAorICAgIGFlU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfSU5BQ1RJVkU7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0gc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCiAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKTsKICAgICBpZiAobWF4M2FSZWdpb25zLmNvdW50ICE9IFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pIHJldHVybiBOT19JTklUOwpAQCAtMTAxMCw2ICsxMDIwLDkgQEAKICAgICAgICAgYXJyYXlIZWlnaHQgPSBhY3RpdmVBcnJheVNpemUuZGF0YS5pMzJbM107CiAgICAgfSBlbHNlIHJldHVybiBOT19JTklUOwogCisgICAgZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzID0KKyAgICAgICAgaW5mby0+ZXhpc3RzKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworCiAgICAgLy8gV2UnbGwgc2V0IHRoZSB0YXJnZXQgRlBTIHJhbmdlIGZvciBzdGlsbCBjYXB0dXJlcyB0byBiZSBhcyB3aWRlCiAgICAgLy8gYXMgcG9zc2libGUgdG8gZ2l2ZSB0aGUgSEFMIG1heGltdW0gbGF0aXR1ZGUgZm9yIGV4cG9zdXJlIHNlbGVjdGlvbgogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZwc1JhbmdlcyA9CkBAIC0xMDIxLDggKzEwMzQsMTEgQEAKICAgICAvLyBHZXQgc3VwcG9ydGVkIHByZXZpZXcgZnBzIHJhbmdlcywgdXAgdG8gZGVmYXVsdCBtYXhpbXVtLgogICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXM7CiAgICAgVmVjdG9yPEZwc1JhbmdlPiBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2VzOwotICAgIGNvbnN0IFNpemUgUFJFVklFV19TSVpFX0JPVU5EID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07Ci0gICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhQUkVWSUVXX1NJWkVfQk9VTkQsICZzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworICAgIFNpemUgcHJldmlld1NpemVCb3VuZCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgcHJldmlld1NpemVCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkpOworICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHByZXZpZXdTaXplQm91bmQsICZzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRnBzUmFuZ2VzLmNvdW50OyBpICs9IDIpIHsKICAgICAgICAgaWYgKCFpc0Zwc1N1cHBvcnRlZChzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMsCkBAIC0zMTA2LDYgKzMxMjIsNjcgQEAKICAgICByZXR1cm4ganBlZ1NpemVzOwogfQogCitWZWN0b3I8UGFyYW1ldGVyczo6U3RyZWFtQ29uZmlndXJhdGlvbj4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICAgIGludDMyX3QgdXNlY2FzZUlkKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAxOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUID0gNDsKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzOworCisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0gc3RhdGljSW5mbygKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBzdXBwb3J0ZWRVc2VjYXNlcyA9CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVRdOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZFVzZWNhc2VzICYgKDEgPDwgdXNlY2FzZUlkKSkgeworICAgICAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgICAgICAgICAgICBzY3MuYWRkKHNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzY3M7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKGludDMyX3QgdXNlY2FzZUlkLAorICAgICAgICBpbnQzMl90IGZvcm1hdCkgY29uc3QgeworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBzaXplczsKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnModXNlY2FzZUlkKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogc2NzKSB7CisgICAgICAgIGlmIChpdC5mb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICBzaXplcy5hZGQoe2l0LndpZHRoLCBpdC5oZWlnaHR9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzaXplczsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZEpwZWdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfU05BUFNIT1QsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IpOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKIFBhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbihib29sIHByZXZpZXdPbmx5KSBjb25zdCB7CiAKICAgICBmbG9hdCB6b29tTGVmdCwgem9vbVRvcCwgem9vbVdpZHRoLCB6b29tSGVpZ2h0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggNDJlN2E0Ny4uM2E3MDljOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICAgaW50MzJfdCBoaWdoOwogICAgIH07CiAKKyAgICB1aW50OF90IGFlU3RhdGU7IC8vbGF0ZXN0IEFFIHN0YXRlIGZyb20gSGFsCiAgICAgaW50MzJfdCBleHBvc3VyZUNvbXBlbnNhdGlvbjsKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2s7CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrQXZhaWxhYmxlOwpAQCAtMjQ3LDYgKzI0OCw3IEBACiAgICAgICAgIGJvb2wgdXNlRmxleGlibGVZdXY7CiAgICAgICAgIFNpemUgbWF4SnBlZ1NpemU7CiAgICAgICAgIFNpemUgbWF4WnNsU2l6ZTsKKyAgICAgICAgYm9vbCBzdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3M7CiAgICAgfSBmYXN0SW5mbzsKIAogICAgIC8vIFF1aXJrcyBpbmZvcm1hdGlvbjsgdGhlc2UgYXJlIHNob3J0LWxpdmVkIGZsYWdzIHRvIGVuYWJsZSB3b3JrYXJvdW5kcyBmb3IKQEAgLTQxNyw2ICs0MTksOSBAQAogICAgIC8vIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIGlmIGRldmljZSBIQUwgdmVyc2lvbiBkb2VzIHN1cHBvcnQgaXQKICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBzdWdnZXN0ZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zCisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKGludDMyX3QgdXNlY2FzZUlkKSBjb25zdDsKKwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYSBqcGVnIHNpemUKICAgICAvLyByZXR1cm4gLTEgaWYgaW5wdXQganBlZyBzaXplIGNhbm5vdCBiZSBmb3VuZCBpbiBzdXBwb3J0ZWQgc2l6ZSBsaXN0CiAgICAgaW50NjRfdCBnZXRKcGVnU3RyZWFtTWluRnJhbWVEdXJhdGlvbk5zKFBhcmFtZXRlcnM6OlNpemUgc2l6ZSk7CkBAIC00MzgsNiArNDQzLDE1IEBACiAgICAgLy8gVGhlIG1heGltdW0gc2l6ZSBpcyBkZWZpbmVkIGJ5IGNvbXBhcmluZyB3aWR0aCBmaXJzdCwgd2hlbiB3aWR0aCB0aWVzIGNvbXBhcmluZyBoZWlnaHQuCiAgICAgU2l6ZSBnZXRNYXhTaXplKGNvbnN0IFZlY3RvcjxTaXplPiYgc2l6ZXMpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbHRlciBhbmQgc29ydCBzdWdnZXN0ZWQgc2l6ZXMKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwgaW50MzJfdCBmb3JtYXQpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCBqcGVnIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZEpwZWdTaXplcygpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCBwcmV2aWV3IHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCB2aWRlbyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3Q7CisKICAgICBpbnQgbURldmljZVZlcnNpb247CiAgICAgdWludDhfdCBtRGVmYXVsdFNjZW5lTW9kZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggNTY3YjE1Zi4uYjUxMmYyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMTksNiArMTksNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTI2LDEwICsyNywxNSBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCisjaW5jbHVkZSAiRGVwdGhDb21wb3NpdGVTdHJlYW0uaCIKKyNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCisKIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKICNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKQEAgLTEyMiw2ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBoeXNpY2FsS2V5c0VudHJ5LmRhdGEuaTMyICsgcGh5c2ljYWxLZXlzRW50cnkuY291bnQpOwogICAgIH0KIAorICAgIG1Qcm92aWRlck1hbmFnZXIgPSBwcm92aWRlclB0cjsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEzOSw2ICsxNDYsNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6Omluc2VydEdicExvY2tlZChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAogICAgICAgICBTdXJmYWNlTWFwKiBvdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIG91dHB1dFN0cmVhbUlkcywgaW50MzJfdCAqY3VycmVudFN0cmVhbUlkKSB7CisgICAgaW50IGNvbXBvc2l0ZUlkeDsKICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOwogCiAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCkBAIC0xNDgsNiArMTU2LDExIEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBTdXJmYWNlIHRoYXQgaXMgbm90IHBhcnQgb2YgY3VycmVudCBjYXB0dXJlIHNlc3Npb24iKTsKKyAgICB9IGVsc2UgaWYgKChjb21wb3NpdGVJZHggPSBtQ29tcG9zaXRlU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSkpCisgICAgICAgICAgICAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSWR4KS0+aW5zZXJ0R2JwKG91dFN1cmZhY2VNYXAsIG91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICBjdXJyZW50U3RyZWFtSWQpOworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogCiAgICAgY29uc3QgU3RyZWFtU3VyZmFjZUlkJiBzdHJlYW1TdXJmYWNlSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKQEAgLTQ2OSw2ICs0ODIsNzkgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAorICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgZXJyID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5jb25maWd1cmVTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgY29tcG9zaXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW1zOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgY29uc3QgeworICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPiBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSkgeworICAgICAgICBBTE9HRSgiJXM6IEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3VudCAlenUgZm9yIHN0cmVhbSBleGNlZWRzIGxpbWl0IG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG51bUJ1ZmZlclByb2R1Y2VycywgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7CisgICAgfSBlbHNlIGlmICgobnVtQnVmZmVyUHJvZHVjZXJzID09IDApICYmICghZGVmZXJyZWRDb25zdW1lcikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOdW1iZXIgb2YgY29uc3VtZXJzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIk5vIHZhbGlkIGNvbnN1bWVycy4iKTsKKyAgICB9CisKKyAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8CisgICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOworCisgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBoYXMgaW52YWxpZCBzdXJmYWNlVHlwZSA9ICVkLiIsIF9fRlVOQ1RJT05fXywgc3VyZmFjZVR5cGUpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJUYXJnZXQgU3VyZmFjZSBpcyBpbnZhbGlkIik7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KKyAgICAgICAgICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IENhbWVyYSBkb2Vzbid0IHN1cHBvcnQgcGh5c2ljYWxDYW1lcmFJZCAlcy4iLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja09wZXJhdGluZ01vZGVMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIGNvbnN0IHsKICAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCiAgICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CkBAIC00NzcsNyArNTYzLDYgQEAKICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOwogICAgIH0KIAotICAgIC8vIFNhbml0aXplIHRoZSBoaWdoIHNwZWVkIHNlc3Npb24gYWdhaW5zdCBuZWNlc3NhcnkgY2FwYWJpbGl0eSBiaXQuCiAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7CiAgICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKQEAgLTUwMCwxNyArNTg1LDIwNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJlYW0tPnYzXzIuc3RyZWFtVHlwZSA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6T1VUUFVUOworICAgIHN0cmVhbS0+djNfMi53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgc3RyZWFtLT52M18yLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgIHN0cmVhbS0+djNfMi5mb3JtYXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKKyAgICBhdXRvIHUgPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2U7CisgICAgY2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKHN0cmVhbUluZm8uZm9ybWF0LCAmdSk7CisgICAgc3RyZWFtLT52M18yLnVzYWdlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+djNfMi5kYXRhU3BhY2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0hpZGxEYXRhc3BhY2Uoc3RyZWFtSW5mby5kYXRhU3BhY2UpOworICAgIHN0cmVhbS0+djNfMi5yb3RhdGlvbiA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24ocm90YXRpb24pOworICAgIHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLCBib29sICpzdGF0dXMgLypvdXQqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXM7CisgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKKyAgICB9CisKKyAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CisgICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKG9wZXJhdGluZ01vZGUpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogSW52YWxpZCBzdGF0dXMhIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgIGF1dG8gcmV0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90PiAob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAvKm91dCovICZzdHJlYW1Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgbWFwcGluZyBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQ6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBvcGVyYXRpbmdNb2RlLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBib29sIGlzSW5wdXRWYWxpZCA9IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkgPiAwKTsKKyAgICBhdXRvIG91dHB1dENvbmZpZ3MgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IG91dHB1dENvbmZpZ3Muc2l6ZSgpOworICAgIHN0cmVhbUNvdW50ID0gaXNJbnB1dFZhbGlkID8gc3RyZWFtQ291bnQgKyAxIDogc3RyZWFtQ291bnQ7CisgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7CisgICAgaWYgKGlzSW5wdXRWYWxpZCkgeworICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0ge3svKnN0cmVhbUlkKi8wLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCisgICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKKyAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAorICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH07CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7CisgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKyAgICAgICAgc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycyA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7CisgICAgICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOworCisgICAgICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLCBpdC5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGFuZHJvaWRfZGF0YXNwYWNlX3Q6OkhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAgICAgICAgIGF1dG8gc3VyZmFjZVR5cGUgPSBpdC5nZXRTdXJmYWNlVHlwZSgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKKyAgICAgICAgICAgIGlmIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCk7CisKKyAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOworICAgICAgICAgICAgICAgIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGluIHRvIGFjY291bnQgdGhhdCBjb21wb3NpdGUgc3RyZWFtcyBjYW4gaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBjb21wb3NpdGVTdHJlYW1zOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBhZGRpbmcgY29tcG9zaXRlIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBpbnRlcm5hbCBzdHJlYW1zIG1lYW5zIGNvbXBvc2l0ZSBzdHJlYW0gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICByZXQgPSBtUHJvdmlkZXJNYW5hZ2VyLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBFcnJvcjogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC01MzIsNiArODA0LDcgQEAKICAgICBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gc3VyZmFjZXM7CiAgICAgc3NpemVfdCBkSW5kZXggPSBOQU1FX05PVF9GT1VORDsKKyAgICBzc2l6ZV90IGNvbXBvc2l0ZUluZGV4ICA9IE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkICYmIG1JbnB1dFN0cmVhbS5pZCA9PSBzdHJlYW1JZCkgewogICAgICAgICBpc0lucHV0ID0gdHJ1ZTsKQEAgLTU1MSw2ICs4MjQsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Z2V0U3RyZWFtSWQoKSkgeworICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdXJmYWNlcy5lbXB0eSgpICYmIGRJbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN1Y2giCiAgICAgICAgICAgICAgICAgICAgICIgc3RyZWFtIGNyZWF0ZWQgeWV0IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlYW1JZCk7CkBAIC01ODAsNiArODYwLDE5IEBACiAgICAgICAgICAgICBpZiAoZEluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5yZW1vdmVJdGVtc0F0KGRJbmRleCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb21wb3NpdGVJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IHJldDsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJbmRleCktPmRlbGV0ZVN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5leHBlY3RlZCBlcnJvciAlcyAoJWQpIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBjb21wb3NpdGUgc3RyZWFtICVkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoY29tcG9zaXRlSW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC02MDMsNDEgKzg5NiwyMyBAQAogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCgpOwogICAgIGJvb2wgaXNTaGFyZWQgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzU2hhcmVkKCk7CiAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7Ci0KLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzLnNpemUoKSwgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7Ci0gICAgfQogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lck9ubHkgPSBkZWZlcnJlZENvbnN1bWVyICYmIG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwOwotICAgIGludCBzdXJmYWNlVHlwZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKTsKLSAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8Ci0gICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOwogCi0gICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBpcyBpbnZhbGlkOiBidWZmZXJQcm9kdWNlciA9ICVwLCBzdXJmYWNlVHlwZSA9ICVkLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJQcm9kdWNlcnNbMF0uZ2V0KCksIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbElkKHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQotICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2UtPmluZm8oKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8Ci0gICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbElkKSA9PQotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+IHN1cmZhY2VzOwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBiaW5kZXJzOwogICAgIHN0YXR1c190IGVycjsKQEAgLTY3NywxMSArOTUyLDMyIEBACiAKICAgICBpbnQgc3RyZWFtSWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEOwogICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKLSAgICBlcnIgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCi0gICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCi0gICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oc3VyZmFjZXNbMF0pOworICAgIGJvb2wgaXNIZWljQ29tcGlzaXRlU3RyZWFtID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKKyAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21waXNpdGVTdHJlYW0pIHsKKyAgICAgICAgc3A8Q29tcG9zaXRlU3RyZWFtPiBjb21wb3NpdGVTdHJlYW07CisgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0gPSBuZXcgY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW0obURldmljZSwgZ2V0UmVtb3RlQ2FsbGJhY2soKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0gPSBuZXcgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbShtRGV2aWNlLCBnZXRSZW1vdGVDYWxsYmFjaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbXBvc2l0ZVN0cmVhbS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCisgICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmFkZChJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlc1swXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKKyAgICAgICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtMTE2Myw2ICsxNDU5LDggQEAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtQ29uZmlncyA9CiAgICAgICAgICAgICAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpID8KICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKKyAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRikpID8KKyAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CiAKICAgICBpbnQzMl90IGJlc3RXaWR0aCA9IC0xOwpAQCAtMTYxNSw3ICsxOTEzLDE0IEBACiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKLSAgICBpZiAocmVtb3RlQ2IgIT0gMCkgeworICAgIC8vIENvbXBvc2l0ZXMgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3RyZWFtcy4gRXJyb3Igbm90aWZpY2F0aW9ucyBjb21pbmcgZnJvbSBzdWNoIGludGVybmFsCisgICAgLy8gc3RyZWFtcyBtYXkgbmVlZCB0byByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgIGJvb2wgc2tpcENsaWVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBza2lwQ2xpZW50Tm90aWZpY2F0aW9uIHw9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25FcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgfQorCisgICAgaWYgKChyZW1vdGVDYiAhPSAwKSAmJiAoIXNraXBDbGllbnROb3RpZmljYXRpb24pKSB7CiAgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CkBAIC0xNjQ5LDYgKzE5NTQsMTAgQEAKICAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogICAgIH0KICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgewpAQCAtMTcwOCw2ICsyMDE3LDEwIEBACiAgICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tTWV0YWRhdGEsIHJlc3VsdC5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CisgICAgfQogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pIHsKQEAgLTE3MjQsNyArMjAzNyw3IEBACiAvLyBUT0RPOiBtb3ZlIHRvIENhbWVyYTJDbGllbnRCYXNlCiBib29sIENhbWVyYURldmljZUNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKIAotICAgIGNvbnN0IGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKIApAQCAtMTc2Myw3ICsyMDc2LDcgQEAKICAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvblN0cmluZyA9CiAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUX0xFRCIpOwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvblN0cmluZykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgogICAgICAgICAgICAgICAgICAgImNhbid0IGRpc2FibGUgdHJhbnNtaXQgTEVEIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYzMwNTYxZC4uMWM1YWJiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yMCwxMyArMjAsMTYgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q29tcG9zaXRlU3RyZWFtOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg5LDYgKzkyLDEyIEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMpIG92ZXJyaWRlOwogCisgICAgLy8gVmVyaWZ5IHNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sKiBzdHJlYW1TdGF0dXMpIG92ZXJyaWRlOworCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlIG9yIGluIGVycm9yIHN0YXRlCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIApAQCAtMjMwLDYgKzIzOSwxMyBAQAogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3Q7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCk7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLCBib29sIGRlZmVycmVkQ29uc3VtZXIsCisgICAgICAgICAgICBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CiAgICAgYm9vbCBlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKICAgICAvLyBGaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKQEAgLTMwMCw3ICszMTYsMTAgQEAKICAgICAvLyBzdHJlYW0gSUQgLT4gb3V0cHV0U3RyZWFtSW5mbyBtYXBwaW5nCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIE91dHB1dFN0cmVhbUluZm8+IG1TdHJlYW1JbmZvTWFwOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSAyOworICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBzcDxDb21wb3NpdGVTdHJlYW0+PiBtQ29tcG9zaXRlU3RyZWFtTWFwOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZWFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1Db21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYURldmljZUNsaWVudC5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0NvbXBvc2l0ZVN0cmVhbTo6Q29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrKGNiKSwKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAorICAgICAgICBtRXJyb3JTdGF0ZShmYWxzZSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqIGlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICogc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSB7CisgICAgaWYgKGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lcnMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtU2V0SWQgIT0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN1cmZhY2UgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCIlczogU2hhcmVkIHN1cmZhY2VzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdW1lcnMsIGhhc0RlZmVycmVkQ29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcm90YXRpb24sIGlkLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcywgc3RyZWFtU2V0SWQsIGlzU2hhcmVkKTsKK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVTdHJlYW0oKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmNsZWFyKCk7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5jbGVhcigpOworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgbUVycm9yRnJhbWVOdW1iZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZUludGVybmFsU3RyZWFtcygpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIC8qc2V0dGluZ3MqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKCFtRXJyb3JTdGF0ZSAmJiAoc3RyZWFtSWQgPT0gZ2V0U3RyZWFtSWQoKSkpIHsKKyAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmICghbUVycm9yU3RhdGUgJiYgIWJ1ZmZlckluZm8ubUVycm9yKSB7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lbXBsYWNlKGJ1ZmZlckluZm8ubUZyYW1lTnVtYmVyLCBidWZmZXJJbmZvLm1UaW1lc3RhbXApOworICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjplcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgIGlmIChpdCA9PSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CisgICAgYm9vbCByZXN1bHRFcnJvciA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdC5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgICAgICBib29sIHJlc3VsdFJlYWR5ID0gZmFsc2U7CisgICAgICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgICAgICBpZiAoaXQgIT0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbmQoKSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC5hcHBlbmQocmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID49IG1OdW1QYXJ0aWFsUmVzdWx0cykgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBpdC0+c2Vjb25kLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHRzID0gZW50cnkuZGF0YS5pNjRbMF07CisgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lbXBsYWNlKHRzLCBzdGQ6Om1ha2VfdHVwbGUoZnJhbWVOdW1iZXIsIGl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZXN0YW1wIG1ldGFkYXRhIGVudHJ5IG1pc3NpbmcgZm9yIGZyYW1lTnVtYmVyOiAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0UmVhZHkpIHsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdEVycm9yKSB7CisgICAgICAgIG9uUmVzdWx0RXJyb3IocmVzdWx0Lm1SZXN1bHRFeHRyYXMpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06OmZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgbUVycm9yRnJhbWVOdW1iZXJzLmVtcGxhY2UoZnJhbWVOdW1iZXIpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OnJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJldCA9IGRldmljZS0+YWRkQnVmZmVyTGlzdGVuZXJGb3JTdHJlYW0oc3RyZWFtSWQsIHRoaXMpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgY29tcG9zaXRlIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQ29tcG9zaXRlU3RyZWFtOjpvbkVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBhdXRvIHJldCA9IGZhbHNlOworICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgICAgICBvblJlc3VsdEVycm9yKHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldCA9IG9uU3RyZWFtQnVmZmVyRXJyb3IocmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIC8vIEludmFsaWQgcmVxdWVzdCwgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IGNvbXBvc2l0ZSBzdHJlYW1zLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb3ZlcmFibGUgZXJyb3I6ICVkIGRldGVjdGVkISIsIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgICAgICBtRXJyb3JTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6bm90aWZ5RXJyb3IoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay5wcm9tb3RlKCk7CisKKyAgICBpZiAoKGZyYW1lTnVtYmVyID49IDApICYmIChyZW1vdGVDYi5nZXQoKSAhPSBudWxscHRyKSkgeworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhczsKKyAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBnZXRTdHJlYW1JZCgpOworICAgICAgICBleHRyYXMuZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMWE4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYURldmljZUNsaWVudDsKK2NsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgU3VyZmFjZTsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIHsKKworcHVibGljOgorICAgIENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgdmlydHVhbCB+Q29tcG9zaXRlU3RyZWFtKCkge30KKworICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpOworCisgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHJlZ2lzdGVyIGFsbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpID0gMDsKKworICAgIC8vIFJlbGVhc2UgYWxsIGludGVybmFsIHN0cmVhbXMgYW5kIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgPSAwOworCisgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gY29tcGxldGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgPSAwOworCisgICAgLy8gSW5zZXJ0IHRoZSBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtIGlkIGluIHRoZSB1c2VyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbXBvc2l0ZSBzdHJlYW0gaWQuCisgICAgdmlydHVhbCBpbnQgZ2V0U3RyZWFtSWQoKSA9IDA7CisKKyAgICAvLyBOb3RpZnkgd2hlbiBzaHV0dGVyIG5vdGlmeSBpcyB0cmlnZ2VyZWQKKyAgICB2aXJ0dWFsIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIC8qcmVzdWx0RXh0cmFzKi8sIG5zZWNzX3QgLyp0aW1lc3RhbXAqLykge30KKworICAgIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKKyAgICBib29sIG9uRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICAvLyBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIG92ZXJyaWRlIHsgLypFbXB0eSBmb3Igbm93ICovIH0KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCBQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7CisgICAgICAgIC8vIFByb2R1Y2VyTGlzdGVuZXIgaW1wZW1lbnRhdGlvbgorICAgICAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZSB7IC8qTm8gaW1wbC4gZm9yIG5vdyovIH07CisgICAgfTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCk7CisgICAgdm9pZCBlcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKworICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIGZvciBidWZmZXIgZXJyb3JzIGZyb20gaW50ZXJuYWwgc3RyZWFtcyBhbmQgcmV0dXJuICd0cnVlJyBpbgorICAgIC8vIGNhc2UgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiBzaG91bGQgcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICB2aXJ0dWFsIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIFN1YmNsYXNzZXMgY2FuIGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlc3VsdCBlcnJvcnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZQorICAgIC8vIGludGVybmFsIHByb2Nlc3NpbmcgbmVlZHMgcmVzdWx0IGRhdGEuCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CisKKyAgICAvLyBEZXZpY2UgYW5kL29yIHNlcnZpY2UgaXMgaW4gdW5yZWNvdmVyYWJsZSBlcnJvciBzdGF0ZS4KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgYmVoYXZlIGFjY29yZGluZ2x5LgorICAgIHZvaWQgZW5hYmxlRXJyb3JTdGF0ZSgpOworCisgICAgd3A8Q2FtZXJhRGV2aWNlQmFzZT4gICBtRGV2aWNlOworICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgIG1NdXRleDsKKyAgICBDb25kaXRpb24gICAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbUVycm9yU3RhdGU7CisKKyAgICAvLyBGcmFtZSBudW1iZXIgdG8gY2FwdHVyZSByZXN1bHQgbWFwIG9mIHBhcnRpYWwgcGVuZGluZyByZXF1ZXN0IHJlc3VsdHMuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4gbVBlbmRpbmdDYXB0dXJlUmVzdWx0czsKKworICAgIC8vIFRpbWVzdGFtcCB0byBjYXB0dXJlIChmcmFtZSBudW1iZXIsIHJlc3VsdCkgbWFwIG9mIGNvbXBsZXRlZCBwZW5kaW5nIHJlcXVlc3QgcmVzdWx0cy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgc3RkOjp0dXBsZTxpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4+IG1DYXB0dXJlUmVzdWx0czsKKworICAgIC8vIEZyYW1lIG51bWJlciB0byB0aW1lc3RhbXAgbWFwCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIGludDY0X3Q+IG1GcmFtZU51bWJlck1hcDsKKworICAgIC8vIEtlZXBzIGEgc2V0IGJ1ZmZlci9yZXN1bHQgZnJhbWUgbnVtYmVycyBmb3IgYW55IGVycm9ycyBkZXRlY3RlZCBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRXJyb3JGcmFtZU51bWJlcnM7CisKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGxmY24uaCIKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJEZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjpEZXB0aENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCisgICAgICAgIG1CbG9iU3RyZWFtSWQoLTEpLAorICAgICAgICBtQmxvYlN1cmZhY2VJZCgtMSksCisgICAgICAgIG1EZXB0aFN0cmVhbUlkKC0xKSwKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbUJsb2JXaWR0aCgwKSwKKyAgICAgICAgbUJsb2JIZWlnaHQoMCksCisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAorICAgICAgICBtTWF4SnBlZ1NpemUoLTEpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1EZXB0aFBob3RvUHJvY2VzcyhudWxscHRyKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGNhbWVyYURldmljZS0+aW5mbygpOworICAgICAgICBhdXRvIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBNYXhpbXVtIGpwZWcgc2l6ZSBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gNSkgeworICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5yZXNlcnZlKDUpOworICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5pbnNlcnQobUluc3RyaW5zaWNDYWxpYnJhdGlvbi5lbmQoKSwgZW50cnkuZGF0YS5mLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmYgKyA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW50cmluc2ljIGNhbGlicmF0aW9uIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19ESVNUT1JUSU9OKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbi5yZXNlcnZlKDUpOworICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uLmluc2VydChtTGVuc0Rpc3RvcnRpb24uZW5kKCksIGVudHJ5LmRhdGEuZiwgZW50cnkuZGF0YS5mICsgNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IExlbnMgZGlzdG9ydGlvbiBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKHN0YXRpY0luZm8sICZtU3VwcG9ydGVkRGVwdGhTaXplcyk7CisKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBkbG9wZW4oY2FtZXJhMzo6a0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlcHRoUGhvdG9Qcm9jZXNzID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzOjpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lPiAoCisgICAgICAgICAgICAgICAgICAgIGRsc3ltKG1EZXB0aFBob3RvTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbikpOworICAgICAgICAgICAgaWYgKG1EZXB0aFBob3RvUHJvY2VzcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGluayB0byBkZXB0aCBwaG90byBwcm9jZXNzIGZ1bmN0aW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsaW5rIHRvIGRlcHRoIHBob3RvIGxpYnJhcnk6ICVzIiwgX19GVU5DVElPTl9fLCBkbGVycm9yKCkpOworICAgICAgICB9CisKKyAgICB9Cit9CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjp+RGVwdGhDb21wb3NpdGVTdHJlYW0oKSB7CisgICAgbUJsb2JDb25zdW1lci5jbGVhcigpLAorICAgIG1CbG9iU3VyZmFjZS5jbGVhcigpLAorICAgIG1CbG9iU3RyZWFtSWQgPSAtMTsKKyAgICBtQmxvYlN1cmZhY2VJZCA9IC0xOworICAgIG1EZXB0aENvbnN1bWVyLmNsZWFyKCk7CisgICAgbURlcHRoU3VyZmFjZS5jbGVhcigpOworICAgIG1EZXB0aENvbnN1bWVyID0gbnVsbHB0cjsKKyAgICBtRGVwdGhTdXJmYWNlID0gbnVsbHB0cjsKKyAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBkbGNsb3NlKG1EZXB0aFBob3RvTGliSGFuZGxlKTsKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVwdGhQaG90b1Byb2Nlc3MgPSBudWxscHRyOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworCisgICAgd2hpbGUgKCFtSW5wdXRKcGVnQnVmZmVycy5lbXB0eSgpICYmICFtQmxvYkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRKcGVnQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1CbG9iQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBibG9iIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIGpwZWcgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmpwZWdCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXREZXB0aEJ1ZmZlcnMuZW1wdHkoKSAmJiAhbURlcHRoQnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dERlcHRoQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1EZXB0aENvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbiBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJlY2VpdmluZyBkZXB0aCBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcgZGVwdGggYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbURlcHRoQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5kZXB0aEJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNhcHR1cmVSZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DYXB0dXJlUmVzdWx0cy5iZWdpbigpOworICAgICAgICAvLyBOZWdhdGl2ZSB0aW1lc3RhbXAgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBjYXB0dXJlIHJlc3VsdAorICAgICAgICAvLyBjb2xsZWN0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChpdC0+Zmlyc3QgPj0gMCkgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID0gc3RkOjpnZXQ8MD4oaXQtPnNlY29uZCk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ucmVzdWx0ID0gc3RkOjpnZXQ8MT4oaXQtPnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1GcmFtZU51bWJlck1hcC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtRnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+c2Vjb25kXS5mcmFtZU51bWJlciA9IGl0LT5maXJzdDsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBhdXRvIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1FcnJvckZyYW1lTnVtYmVycy5lbmQoKSkgeworICAgICAgICBib29sIGZyYW1lRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvICZpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09ICppdCkgeworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuc2Vjb25kLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcmFtZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZUZvdW5kKSB7CisgICAgICAgICAgICBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vdCBhYmxlIHRvIGZpbmQgZmFpbGluZyBpbnB1dCB3aXRoIGZyYW1lIG51bWJlcjogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICppdCk7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKSB7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKCghaXQuc2Vjb25kLmVycm9yKSAmJiAoaXQuc2Vjb25kLmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoaXQuc2Vjb25kLmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld0lucHV0QXZhaWxhYmxlOworfQorCitpbnQ2NF90IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pIHsKKyAgICBpbnQ2NF90IHJldCA9IC0xOworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZXJyb3IgJiYgIWl0LnNlY29uZC5lcnJvck5vdGlmaWVkICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICByZXQgPSBpdC5zZWNvbmQuZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0lucHV0RnJhbWUoY29uc3QgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHN0YXR1c190IHJlczsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICphbmI7CisgICAgaW50IGZlbmNlRmQ7CisgICAgdm9pZCAqZHN0QnVmZmVyOworCisgICAgYXV0byBqcGVnU2l6ZSA9IGFuZHJvaWQ6OmNhbWVyYTI6OkpwZWdQcm9jZXNzb3I6OmZpbmRKcGVnU2l6ZShpbnB1dEZyYW1lLmpwZWdCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aCk7CisgICAgaWYgKGpwZWdTaXplID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gZmluZCBpbnB1dCBqcGVnIHNpemUsIGRlZmF1bHQgdG8gdXNpbmcgZW50aXJlIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBqcGVnU2l6ZSA9IGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aDsKKyAgICB9CisKKyAgICBzaXplX3QgbWF4RGVwdGhKcGVnU2l6ZTsKKyAgICBpZiAobU1heEpwZWdTaXplID4gMCkgeworICAgICAgICBtYXhEZXB0aEpwZWdTaXplID0gbU1heEpwZWdTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIG1heERlcHRoSnBlZ1NpemUgPSBzdGQ6Om1heDxzaXplX3Q+IChqcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLndpZHRoICogaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5oZWlnaHQgKiAzIC8gMik7CisgICAgfQorICAgIHVpbnQ4X3QganBlZ1F1YWxpdHkgPSAxMDA7CisgICAgYXV0byBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAganBlZ1F1YWxpdHkgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKworICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byB3aWxsIGNvbnNpc3Qgb2YgdGhlIG1haW4ganBlZyBidWZmZXIsIHRoZSBkZXB0aCBtYXAgYnVmZmVyIChhbHNvIGluCisgICAgLy8ganBlZyBmb3JtYXQpIGFuZCBjb25maWRlbmNlIG1hcCAoanBlZyBhcyB3ZWxsKS4gQXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBhbGwgMyBqcGVnIG5lZWQKKyAgICAvLyBtYXgganBlZyBzaXplLgorICAgIHNpemVfdCBmaW5hbEpwZWdCdWZmZXJTaXplID0gbWF4RGVwdGhKcGVnU2l6ZSAqIDM7CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtT3V0cHV0U3VyZmFjZS5nZXQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMSkpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICIgJXp1eCV1IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDFVLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPmRlcXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksICZhbmIsICZmZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmV0cmlldmluZyBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpOworICAgIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChnYi0+Z2V0V2lkdGgoKSA8IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHx8IChnYi0+Z2V0SGVpZ2h0KCkgIT0gMSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCbG9iIGJ1ZmZlciBzaXplIG1pc21hdGNoLCBleHBlY3RlZCAlZHglZCByZWNlaXZlZCAlenV4JXUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ2ItPmdldFdpZHRoKCksIGdiLT5nZXRIZWlnaHQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMVUpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGRlcHRoUGhvdG87CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoaW5wdXRGcmFtZS5qcGVnQnVmZmVyLmRhdGEpOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnV2lkdGggPSBtQmxvYldpZHRoOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnSGVpZ2h0ID0gbUJsb2JIZWlnaHQ7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdTaXplID0ganBlZ1NpemU7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4gKGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuZGF0YSk7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIud2lkdGg7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBIZWlnaHQgPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmhlaWdodDsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFN0cmlkZSA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuc3RyaWRlOworICAgIGRlcHRoUGhvdG8ubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgZGVwdGhQaG90by5tSXNMb2dpY2FsID0gbUlzTG9naWNhbENhbWVyYTsKKyAgICBkZXB0aFBob3RvLm1NYXhKcGVnU2l6ZSA9IG1heERlcHRoSnBlZ1NpemU7CisgICAgLy8gVGhlIGNhbWVyYSBpbnRyaW5zaWMgY2FsaWJyYXRpb24gbGF5b3V0IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgaWYgKG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uc2l6ZSgpID09IDUpIHsKKyAgICAgICAgbWVtY3B5KGRlcHRoUGhvdG8ubUluc3RyaW5zaWNDYWxpYnJhdGlvbiwgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUluc3RyaW5zaWNDYWxpYnJhdGlvbikpOworICAgICAgICBkZXB0aFBob3RvLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXB0aFBob3RvLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgIC8vIFtrYXBwYV8xLCBrYXBwYV8yLCBrYXBwYV8zIGthcHBhXzQsIGthcHBhXzVdCisgICAgaWYgKG1MZW5zRGlzdG9ydGlvbi5zaXplKCkgPT0gNSkgeworICAgICAgICBtZW1jcHkoZGVwdGhQaG90by5tTGVuc0Rpc3RvcnRpb24sIG1MZW5zRGlzdG9ydGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUxlbnNEaXN0b3J0aW9uKSk7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNMZW5zRGlzdG9ydGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgZW50cnkgPSBpbnB1dEZyYW1lLnJlc3VsdC5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGpwZWcgb3JpZW50YXRpb24gdmFsdWVzIG11c3QgYmUgd2l0aGluIFswLCA5MCwgMTgwLCAyNzBdLgorICAgICAgICBzd2l0Y2ggKGVudHJ5LmRhdGEuaTMyWzBdKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvLm1PcmllbnRhdGlvbiA9IHN0YXRpY19jYXN0PERlcHRoUGhvdG9PcmllbnRhdGlvbj4gKGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGpwZWcgb3JpZW50YXRpb24gdmFsdWU6ICVkLCBkZWZhdWx0IHRvIDAgZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBhY3R1YWxKcGVnU2l6ZSA9IDA7CisgICAgcmVzID0gbURlcHRoUGhvdG9Qcm9jZXNzKGRlcHRoUGhvdG8sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIGRzdEJ1ZmZlciwgJmFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBwcm9jZXNzaW5nIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IGZpbmFsSnBlZ1NpemUgPSBhY3R1YWxKcGVnU2l6ZSArIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IpOworICAgIGlmIChmaW5hbEpwZWdTaXplID4gZmluYWxKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IEZpbmFsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZSBqcGVnIGJsb2IgaGVhZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEZpbmFsIGpwZWcgc2l6ZTogJXp1IiwgX19mdW5jX18sIGZpbmFsSnBlZ1NpemUpOworICAgIHVpbnQ4X3QqIGhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4gKGRzdEJ1ZmZlcikgKworICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKSk7CisgICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iICpibG9iID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IqPiAoaGVhZGVyKTsKKyAgICBibG9iLT5qcGVnX2Jsb2JfaWQgPSBDQU1FUkEzX0pQRUdfQkxPQl9JRDsKKyAgICBibG9iLT5qcGVnX3NpemUgPSBhY3R1YWxKcGVnU2l6ZTsKKyAgICBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pIHsKKyAgICBpZiAoaW5wdXRGcmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EZXB0aENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5kZXB0aEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5qcGVnQnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChpbnB1dEZyYW1lLT5lcnJvciB8fCBtRXJyb3JTdGF0ZSkgJiYgIWlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQpIHsKKyAgICAgICAgbm90aWZ5RXJyb3IoaW5wdXRGcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcykgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA8PSBjdXJyZW50VHMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjp0aHJlYWRMb29wKCkgeworICAgIGludDY0X3QgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSBnZXROZXh0UmVhZHlJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZhaWxpbmdGcmFtZU51bWJlciA9IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxpbmdGcmFtZU51bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBlcmFzZSAnbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdJyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHR3byBpbnRlcm5hbCBzdHJlYW0gYnVmZmVycyB0byBmYWlsLiBJbiBzdWNoIHNjZW5hcmlvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgc3RyZWFtIHNob3VsZCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCBhIHN0cmVhbSBidWZmZXIgZXJyb3Igb25seQorICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgd2l0aGluICdlcnJvck5vdGlmaWVkJy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHByZXNlbnQgZmFpbGVkIGlucHV0IGZyYW1lcyB3aWxsIGJlIHJlbW92ZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gJ3JlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpJy4KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJm1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHJldCA9IG1JbnB1dFJlYWR5Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtXYWl0RHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgd2FpdCBvbiBjb25kaXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBwcm9jZXNzSW5wdXRGcmFtZShtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RZTkFNSUNfREVQVEgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKyAgICBpZiAobVN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRoaXMgY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IGRlcHRoIG1hcCBzdHJlYW1zISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZSh3aWR0aCwgaGVpZ2h0LCBtU3VwcG9ydGVkRGVwdGhTaXplcywgJmRlcHRoV2lkdGgsICZkZXB0aEhlaWdodCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGRlcHRoIHN0cmVhbSBzaXplISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQmxvYkNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLzEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQmxvYkNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSnBlZ0NvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtQmxvYlN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQmxvYlN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwga0pwZWdEYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbUJsb2JTdHJlYW1JZCA9ICppZDsKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgICAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbURlcHRoQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIC8qbWF4TG9ja2VkQnVmZmVycyovIDEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtRGVwdGhTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gZGVwdGhTdXJmYWNlSWQ7CisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obURlcHRoU3VyZmFjZSwgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQsIGtEZXB0aE1hcFBpeGVsRm9ybWF0LAorICAgICAgICAgICAga0RlcHRoTWFwRGF0YVNwYWNlLCByb3RhdGlvbiwgJm1EZXB0aFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmZGVwdGhTdXJmYWNlSWQpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkID0gZGVwdGhTdXJmYWNlSWRbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgYmxvYiBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKG1EZXB0aFN0cmVhbUlkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlcHRoIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1CbG9iV2lkdGggPSB3aWR0aDsKKyAgICBtQmxvYkhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKChtRGVwdGhQaG90b0xpYkhhbmRsZSA9PSBudWxscHRyKSB8fCAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gbGlicmFyeSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnM7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gbUJsb2JTdXJmYWNlLmdldCgpOworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heFByb2R1Y2VyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkRlcHRoQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIC8vIFRoZSAnQ2FtZXJhRGV2aWNlQ2xpZW50JyBwYXJlbnQgd2lsbCBkZWxldGUgdGhlIGJsb2Igc3RyZWFtCisgICAgcmVxdWVzdEV4aXQoKTsKKworICAgIGF1dG8gcmV0ID0gam9pbigpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtRGVwdGhTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHJldCA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1EZXB0aFN0cmVhbUlkKTsKKyAgICAgICAgbURlcHRoU3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0pwZWdEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKcGVnIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0RlcHRoTWFwRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGVwdGggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4gKiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobURlcHRoU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtRGVwdGhTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdLnB1c2hfYmFjayhtRGVwdGhTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUJsb2JTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQmxvYlN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUJsb2JTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0ucHVzaF9iYWNrKG1CbG9iU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbUJsb2JTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gUHJvY2Vzc2luZyBjYW4gY29udGludWUgZXZlbiBpbiBjYXNlIG9mIHJlc3VsdCBlcnJvcnMuCisgICAgLy8gQXQgdGhlIG1vbWVudCBkZXB0aCBjb21wb3NpdGUgc3RyZWFtIHByb2Nlc3NpbmcgcmVsaWVzIG1haW5seSBvbiBzdGF0aWMgY2FtZXJhCisgICAgLy8gY2hhcmFjdGVyaXN0aWNzIGRhdGEuIFRoZSBhY3R1YWwgcmVzdWx0IGRhdGEgY2FuIGJlIHVzZWQgZm9yIHRoZSBqcGVnIHF1YWxpdHkgYnV0CisgICAgLy8gaW4gY2FzZSBpdCBpcyBhYnNlbnQgd2UgY2FuIGRlZmF1bHQgdG8gbWF4aW11bS4KKyAgICBlcmFzZVJlc3VsdChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbURlcHRoU3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUJsb2JTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGggLypvdXQqLywgc2l6ZV90ICpkZXB0aEhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChkZXB0aFdpZHRoID09IG51bGxwdHIpIHx8IChkZXB0aEhlaWdodCA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZsb2F0IGFyVG9sID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZTsKKyAgICAqZGVwdGhXaWR0aCA9ICpkZXB0aEhlaWdodCA9IDA7CisKKyAgICBmbG9hdCBhc3BlY3RSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAod2lkdGgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChoZWlnaHQpOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3JlZERlcHRoU2l6ZXMpIHsKKyAgICAgICAgYXV0byBjdXJyZW50V2lkdGggPSBzdGQ6OmdldDwwPihpdCk7CisgICAgICAgIGF1dG8gY3VycmVudEhlaWdodCA9IHN0ZDo6Z2V0PDE+KGl0KTsKKyAgICAgICAgaWYgKChjdXJyZW50V2lkdGggPT0gd2lkdGgpICYmIChjdXJyZW50SGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgICpkZXB0aFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAqZGVwdGhIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudFdpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudEhlaWdodCk7CisgICAgICAgICAgICBhdXRvIGN1cnJlbnRTaXplID0gY3VycmVudFdpZHRoICogY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIGF1dG8gb2xkU2l6ZSA9ICgqZGVwdGhXaWR0aCkgKiAoKmRlcHRoSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICgoZmFicyhhc3BlY3RSYXRpbyAtIGN1cnJlbnRSYXRpbykgPD0gYXJUb2wpICYmIChjdXJyZW50U2l6ZSA+IG9sZFNpemUpKSB7CisgICAgICAgICAgICAgICAgKmRlcHRoV2lkdGggPSBjdXJyZW50V2lkdGg7CisgICAgICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoKCpkZXB0aFdpZHRoID4gMCkgJiYgKCpkZXB0aEhlaWdodCA+IDApKSA/IE9LIDogQkFEX1ZBTFVFOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZGVwdGhTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVudHJ5ID0gY2guZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRGVwdGggc3RyZWFtIGRpbWVuc2lvbnMgaGF2ZSBmb3VyIGludDMyX3QgY29tcG9uZW50cworICAgICAgICAvLyAocGl4ZWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHR5cGUpCisgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gZW50cnkuY291bnQgLyA0OworICAgICAgICBkZXB0aFNpemVzLT5yZXNlcnZlKGVudHJ5Q291bnQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoZW50cnkuZGF0YS5pMzJbaV0gPT0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChlbnRyeS5kYXRhLmkzMltpKzNdID09CisgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICBkZXB0aFNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGVudHJ5LmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gZGVwdGhTaXplczsKKyAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNoLCAmZGVwdGhTaXplcyk7CisgICAgaWYgKGRlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBwcmVzZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgZGVwdGhTaXplcywgJmRlcHRoV2lkdGgsCisgICAgICAgICAgICAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSnBlZy9CbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtKcGVnRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gRGVwdGggc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBkZXB0aFdpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBkZXB0aEhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtEZXB0aE1hcERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMzFmNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvaW1hZ2luZ19tb2RlbC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGVwdGhfbWFwLmg+CisKKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWw7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIERlcHRoQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKKworcHVibGljOgorICAgIERlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8vIENvbXBvc2l0ZVN0cmVhbSBvdmVycmlkZXMKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1CbG9iU3RyZWFtSWQ7IH0KKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgZGVwdGhCdWZmZXI7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIganBlZ0J1ZmZlcjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICByZXN1bHQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBlcnJvcihmYWxzZSksIGVycm9yTm90aWZpZWQoZmFsc2UpLCBmcmFtZU51bWJlcigtMSkgeyB9CisgICAgfTsKKworICAgIC8vIEhlbHBlciBtZXRob2RzCisgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4qIGRlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLyk7CisKKyAgICAvLyBEeW5hbWljIGRlcHRoIHByb2Nlc3NpbmcKKyAgICBzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhPdXRTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LCBzaXplX3QgJmFjdHVhbFNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAmZGVwdGhNYXBCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgbWF4SnBlZ1NpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+KiBpdGVtcyAvKm91dCovKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2luZ01vZGVsPiBnZXRJbWFnaW5nTW9kZWwoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIC8vIEJ1ZmZlci9SZXN1bHRzIGhhbmRsaW5nCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKTsKKworICAgIC8vIEZpbmQgZmlyc3QgY29tcGxldGUgYW5kIHZhbGlkIGZyYW1lIHdpdGggc21hbGxlc3QgdGltZXN0YW1wCisgICAgYm9vbCBnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTY7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0RlcHRoTWFwRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9ERVBUSDsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKworICAgIGludCAgICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQsIG1CbG9iU3VyZmFjZUlkLCBtRGVwdGhTdHJlYW1JZCwgbURlcHRoU3VyZmFjZUlkOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CbG9iV2lkdGgsIG1CbG9iSGVpZ2h0OworICAgIHNwPENwdUNvbnN1bWVyPiAgICAgIG1CbG9iQ29uc3VtZXIsIG1EZXB0aENvbnN1bWVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkLCBtQmxvYkJ1ZmZlckFjcXVpcmVkOworICAgIHNwPFN1cmZhY2U+ICAgICAgICAgIG1EZXB0aFN1cmZhY2UsIG1CbG9iU3VyZmFjZSwgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IG1TdXBwb3J0ZWREZXB0aFNpemVzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24sIG1MZW5zRGlzdG9ydGlvbjsKKyAgICBib29sICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhOworICAgIHZvaWQqICAgICAgICAgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlOworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgbURlcHRoUGhvdG9Qcm9jZXNzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgRGVwdGggYnVmZmVyIHRpbWVzdGFtcHMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0RGVwdGhCdWZmZXJzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgSnBlZy9CbG9iIGJ1ZmZlciB0aW1lc3RhbXBzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dEpwZWdCdWZmZXJzOworCisgICAgLy8gTWFwIG9mIGFsbCBpbnB1dCBmcmFtZXMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIElucHV0RnJhbWU+IG1QZW5kaW5nSW5wdXRGcmFtZXM7Cit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMGU4YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwxNzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUhlaWNDb21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGxpbnV4L21lbWZkLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L3R5cGVzLmg+CisjaW5jbHVkZSA8bGlieXV2Lmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgInV0aWxzL0V4aWZVdGlscy5oIgorI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKKyNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYklkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0hlaWNDb21wb3NpdGVTdHJlYW06OkhlaWNDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgQ29tcG9zaXRlU3RyZWFtKGRldmljZSwgY2IpLAorICAgICAgICBtVXNlSGVpYyhmYWxzZSksCisgICAgICAgIG1OdW1PdXRwdXRUaWxlcygxKSwKKyAgICAgICAgbU91dHB1dFdpZHRoKDApLAorICAgICAgICBtT3V0cHV0SGVpZ2h0KDApLAorICAgICAgICBtTWF4SGVpY0J1ZmZlclNpemUoMCksCisgICAgICAgIG1HcmlkV2lkdGgoSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRXaWR0aCksCisgICAgICAgIG1HcmlkSGVpZ2h0KEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0KSwKKyAgICAgICAgbUdyaWRSb3dzKDEpLAorICAgICAgICBtR3JpZENvbHMoMSksCisgICAgICAgIG1Vc2VHcmlkKGZhbHNlKSwKKyAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCgtMSksCisgICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCgtMSksCisgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQoLTEpLAorICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgUHJvZHVjZXJMaXN0ZW5lcigpKSwKKyAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50ZXIoMCksCisgICAgICAgIG1HcmlkVGltZXN0YW1wVXMoMCkgeworfQorCitIZWljQ29tcG9zaXRlU3RyZWFtOjp+SGVpY0NvbXBvc2l0ZVN0cmVhbSgpIHsKKyAgICAvLyBDYWxsIGRlaW5pdENvZGVjIGluIGNhc2Ugc3RyZWFtIGhhc24ndCBiZWVuIGRlbGV0ZWQgeWV0IHRvIGF2b2lkIGFueQorICAgIC8vIG1lbW9yeS9yZXNvdXJjZSBsZWFrLgorICAgIGRlaW5pdENvZGVjKCk7CisKKyAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5jbGVhcigpOworICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIG1BcHBTZWdtZW50U3RyZWFtSWQgPSAtMTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCA9IC0xOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXIuY2xlYXIoKTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2UuY2xlYXIoKTsKKworICAgIG1NYWluSW1hZ2VTdHJlYW1JZCA9IC0xOworICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQgPSAtMTsKKyAgICBtTWFpbkltYWdlQ29uc3VtZXIuY2xlYXIoKTsKKyAgICBtTWFpbkltYWdlU3VyZmFjZS5jbGVhcigpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IHN1cmZhY2UuZ2V0KCk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludCBmb3JtYXQ7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBkYXRhc3BhY2U7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0RBVEFTUEFDRSwgJmRhdGFzcGFjZSkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBkYXRhc3BhY2U6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0hFSUYpKTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIC8qaGFzRGVmZXJyZWRDb25zdW1lciovLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgLypzdHJlYW1TZXRJZCovLCBib29sIC8qaXNTaGFyZWQqLykgeworCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzID0gaW5pdGlhbGl6ZUNvZGVjKHdpZHRoLCBoZWlnaHQsIGRldmljZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIEhFSUMvSEVWQyBjb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLUFwcFNlZ21lbnRTdHJlYW0iKSk7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgbVN0YXRpY0luZm8gPSBkZXZpY2UtPmluZm8oKTsKKworICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1BcHBTZWdtZW50U3VyZmFjZSwgbUFwcFNlZ21lbnRNYXhTaXplLCAxLCBmb3JtYXQsCisgICAgICAgICAgICBrQXBwU2VnbWVudERhdGFTcGFjZSwgcm90YXRpb24sICZtQXBwU2VnbWVudFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgSlBFRyBBcHAgc2VnbWVudCBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICByZXMgPSBtQ29kZWMtPmNyZWF0ZUlucHV0U3VyZmFjZSgmcHJvZHVjZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgc3VyZmFjZSBmb3IgSGVpYyBjb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLUhldmNJbnB1dFlVVlN0cmVhbSIpKTsKKyAgICB9CisgICAgbU1haW5JbWFnZVN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXMgPSBtQ29kZWMtPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBjb2RlYzogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHNvdXJjZVN1cmZhY2VJZDsKKyAgICAvL1VzZSBZVVZfODg4IGZvcm1hdCBpZiBmcmFtZXdvcmsgdGlsaW5nIGlzIG5lZWRlZC4KKyAgICBpbnQgc3JjU3RyZWFtRm10ID0gbVVzZUdyaWQgPyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODggOgorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1NYWluSW1hZ2VTdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBzcmNTdHJlYW1GbXQsIGtIZWlmRGF0YVNwYWNlLAorICAgICAgICAgICAgcm90YXRpb24sIGlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc291cmNlU3VyZmFjZUlkKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQgPSBzb3VyY2VTdXJmYWNlSWRbMF07CisgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCA9ICppZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgbWFpbiBpbWFnZSBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbU91dHB1dFN1cmZhY2UgPSBjb25zdW1lcnNbMF07CisgICAgcmVzID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihnZXRTdHJlYW1JZCgpKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIEhBTCBtYWluIGltYWdlIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaW5pdENvcHlSb3dGdW5jdGlvbih3aWR0aCk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgYXV0byByZXMgPSBqb2luKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBqb2luIHdpdGggdGhlIG1haW4gcHJvY2Vzc2luZyB0aHJlYWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgZGVpbml0Q29kZWMoKTsKKworICAgIGlmIChtQXBwU2VnbWVudFN0cmVhbUlkID49IDApIHsKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQXBwU2VnbWVudFN0cmVhbUlkKTsKKyAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCA9IC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGlmIChidWZmZXJJbmZvLm1FcnJvcikgcmV0dXJuOworCisgICAgbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5wdXNoKGJ1ZmZlckluZm8ubVRpbWVzdGFtcCk7Cit9CisKKy8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBlYXJseSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvZGVjIG91dHB1dAorLy8gYXJyaXZlcyBlYXJsaWVyIHRoYW4gcmVzdWx0IG1ldGFkYXRhLgordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oIkhFSUMgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKG1FcnJvclN0YXRlIHx8IChzdHJlYW1JZCAhPSBnZXRTdHJlYW1JZCgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeTsKKworICAgIGludDMyX3Qgb3JpZW50YXRpb24gPSAwOworICAgIGVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG9yaWVudGF0aW9uID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgaW50MzJfdCBxdWFsaXR5ID0ga0RlZmF1bHRKcGVnUXVhbGl0eTsKKyAgICBlbnRyeSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIHF1YWxpdHkgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyW2ZyYW1lTnVtYmVyXSA9IHN0ZDo6bWFrZV9wYWlyKG9yaWVudGF0aW9uLCBxdWFsaXR5KTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tRGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihrQXBwU2VnbWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKUEVHIEFQUCBzZWdtZW50cyBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtIZWlmRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogWVVWXzg4OCBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBZVVZfODg4IGludGVybmFsIHN0cmVhbSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSEVWQyB0aWxpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBkYXRhIHNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLCBpdGVtLm1EYXRhU3BhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmNsZWFyKCk7CisKKyAgICBib29sIHVzZUdyaWQsIHVzZUhlaWM7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKAorICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsICZ1c2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0cik7CisgICAgaWYgKCFpc1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gU2l6ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGVpdGhlciBlbmNvZGVyLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5pbnNlcnQoY29tcG9zaXRlT3V0cHV0LT5lbmQoKSwgMiwgc3RyZWFtSW5mbyk7CisKKyAgICAvLyBKUEVHIEFQUFMgc2VnbWVudHMgQmxvYiBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS53aWR0aCA9IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjaCk7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmhlaWdodCA9IDE7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQjsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZGF0YVNwYWNlID0ga0FwcFNlZ21lbnREYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICAvLyBZVVYvSU1QTEVNRU5UQVRJT05fREVGSU5FRCBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5mb3JtYXQgPSB1c2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZGF0YVNwYWNlID0ga0hlaWZEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSB1c2VIZWljID8gR1JBTExPQ19VU0FHRV9IV19JTUFHRV9FTkNPREVSIDoKKyAgICAgICAgICAgIHVzZUdyaWQgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpIHsKKyAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciYgaGVpY01hbmFnZXIgPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIHJldHVybiBoZWljTWFuYWdlci5pc1NpemVTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCwgdXNlSGVpYywgdXNlR3JpZCwgc3RhbGwpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpIHsKKyAgICBpbnQgbWVtZmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAiSEVJRi10cnktbWVtZmQiLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKG1lbWZkID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFTk9TWVMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSB0bXBmcyBmaWxlLiBlcnJubyAlZCIsIF9fRlVOQ1RJT05fXywgZXJybm8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2xvc2UobWVtZmQpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBDb2RlY091dHB1dEJ1ZmZlckluZm8mIG91dHB1dEJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgQUxPR1YoIiVzOiBpbmRleCAlZCwgb2Zmc2V0ICVkLCBzaXplICVkLCB0aW1lICUiIFBSSWQ2NCAiLCBmbGFncyAweCV4IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3V0cHV0QnVmZmVySW5mby5pbmRleCwgb3V0cHV0QnVmZmVySW5mby5vZmZzZXQsCisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLnNpemUsIG91dHB1dEJ1ZmZlckluZm8udGltZVVzLCBvdXRwdXRCdWZmZXJJbmZvLmZsYWdzKTsKKworICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgaWYgKChvdXRwdXRCdWZmZXJJbmZvLnNpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3V0cHV0QnVmZmVySW5mby5mbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSA9PSAwKSkgeworICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5wdXNoX2JhY2sob3V0cHV0QnVmZmVySW5mbyk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbnQzMl90IGluZGV4KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb2RlYyBZVVYgaW5wdXQgbW9kZSBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgSGV2YyB0aWxpbmcgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29kZWNJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZGV4KTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KSB7CisgICAgaWYgKG5ld0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbmV3Rm9ybWF0IG11c3Qgbm90IGJlIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQVN0cmluZyBtaW1lSGVpYyhNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIG5ld0Zvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1pbWUpOworICAgIGlmIChtaW1lICE9IG1pbWVIZWljKSB7CisgICAgICAgIC8vIEZvciBIRVZDIGNvZGVjLCBiZWxvdyBrZXlzIG5lZWQgdG8gYmUgZmlsbGVkIG91dCBvciBvdmVyd3JpdHRlbiBzbyB0aGF0IHRoZQorICAgICAgICAvLyBtdXhlciBjYW4gaGFuZGxlIHRoZW0gYXMgSEVJQyBvdXRwdXQgaW1hZ2UuCisgICAgICAgIG5ld0Zvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBtaW1lSGVpYyk7CisgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBtT3V0cHV0V2lkdGgpOworICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIG1PdXRwdXRIZWlnaHQpOworICAgICAgICBpZiAobVVzZUdyaWQpIHsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfV0lEVEgsIG1HcmlkV2lkdGgpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIG1HcmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgbUdyaWRSb3dzKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgbUdyaWRDb2xzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9JU19ERUZBVUxULCAxIC8qaXNQcmltYXJ5Ki8pOworCisgICAgaW50MzJfdCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX1JPV1MsICZncmlkUm93cykgJiYKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX0NPTFVNTlMsICZncmlkQ29scykpIHsKKyAgICAgICAgbU51bU91dHB1dFRpbGVzID0gZ3JpZFJvd3MgKiBncmlkQ29sczsKKyAgICB9IGVsc2UgeworICAgICAgICBtTnVtT3V0cHV0VGlsZXMgPSAxOworICAgIH0KKworICAgIEFMT0dWKCIlczogbU51bU91dHB1dFRpbGVzIGlzICV6dSIsIF9fRlVOQ1RJT05fXywgbU51bU91dHB1dFRpbGVzKTsKKyAgICBtRm9ybWF0ID0gbmV3Rm9ybWF0OworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY0NvZGVjRXJyb3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBtRXJyb3JTdGF0ZSA9IHRydWU7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNvbmZpZ3VyZVN0cmVhbSgpIHsKKyAgICBpZiAoaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgLy8gUHJvY2Vzc2luZyB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1PdXRwdXRTdXJmYWNlLmdldCgpLCBIQUxfUElYRUxfRk9STUFUX0JMT0IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBBTmF0aXZlV2luZG93ICphbndDb25zdW1lciA9IG1PdXRwdXRTdXJmYWNlLmdldCgpOworICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CisgICAgaWYgKChyZXMgPSBhbndDb25zdW1lci0+cXVlcnkoYW53Q29uc3VtZXIsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKKyAgICAgICAgICAgICAgICAgICAgJm1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDYW5ub3QgdXNlIFNvdXJjZVN1cmZhY2UgYnVmZmVyIGNvdW50IHNpbmNlIGl0IGNvdWxkIGJlIGNvZGVjJ3MgNTEyKjUxMiB0aWxlCisgICAgLy8gYnVmZmVyIGNvdW50LgorICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnMgPSAxOworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGFud0NvbnN1bWVyLCBtTWF4SGVpY0J1ZmZlclNpemUsIDEpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGRpbWVuc2lvbiAlenUgeCAxIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1heEhlaWNCdWZmZXJTaXplLCBtTWFpbkltYWdlU3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJ1bigiSGVpY0NvbXBvc2l0ZVN0cmVhbVByb2MiKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtQXBwU2VnbWVudFN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21BcHBTZWdtZW50U3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtQXBwU2VnbWVudFN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttQXBwU2VnbWVudFN0cmVhbUlkXS5wdXNoX2JhY2sobUFwcFNlZ21lbnRTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobU1haW5JbWFnZVN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21NYWluSW1hZ2VTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbU1haW5JbWFnZVN0cmVhbUlkXS5wdXNoX2JhY2sobU1haW5JbWFnZVN1cmZhY2VJZCk7CisKKyAgICBpZiAoY3VycmVudFN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmN1cnJlbnRTdHJlYW1JZCA9IG1NYWluSW1hZ2VTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChtRXJyb3JTdGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1TZXR0aW5nc0J5RnJhbWVOdW1iZXIuZmluZChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpICE9IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXIuZW5kKCkpIHsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVtcGxhY2UocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCB0aW1lc3RhbXApOworICAgICAgICBtU2V0dGluZ3NCeVRpbWVzdGFtcFt0aW1lc3RhbXBdID0gbVNldHRpbmdzQnlGcmFtZU51bWJlcltyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXJdOworICAgICAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmVyYXNlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIHdoaWxlICghbVNldHRpbmdzQnlUaW1lc3RhbXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbVNldHRpbmdzQnlUaW1lc3RhbXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLm9yaWVudGF0aW9uID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnF1YWxpdHkgPSBpdC0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgbVNldHRpbmdzQnlUaW1lc3RhbXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZW1wdHkoKSAmJiAhbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbUFwcFNlZ21lbnRDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW5vdCBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKHJlcyAhPSBPSykgfHwgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSkgeworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBKUEVHX0FQUF9TRUdNRU5UUyBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFeHBlY3RpbmcgSlBFR19BUFBfU0VHTUVOVFMgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtQXBwU2VnbWVudENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uYXBwU2VnbWVudEJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dFl1dkJ1ZmZlcnMuZW1wdHkoKSAmJiAhbVl1dkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0WXV2QnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1NYWluSW1hZ2VDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW5vdCBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgWVVWXzg4OCBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIFlVVl84ODggYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0WXV2QnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS55dXZCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIC8vIEJpdHN0cmVhbSBidWZmZXIgdGltZXN0YW1wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZGlyZWN0bHkgY29ycmVsYXRlIHdpdGggaW5wdXQKKyAgICAgICAgLy8gYnVmZmVyIHRpbWVzdGFtcC4gQXNzdW1lIGVuY29kZXIgaW5wdXQgdG8gb3V0cHV0IGlzIEZJRk8sIHVzZSBhIHF1ZXVlCisgICAgICAgIC8vIHRvIGxvb2sgdXAgdGltZXN0YW1wLgorICAgICAgICBpbnQ2NF90IGJ1ZmZlclRpbWUgPSAtMTsKKyAgICAgICAgaWYgKG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBidWZmZXIgdGltZXN0YW1wIGZvciBjb2RlYyBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEaXJlY3QgbWFwcGluZyBiZXR3ZWVuIGNhbWVyYSB0aW1lc3RhbXAgKGluIG5zKSBhbmQgY29kZWMgdGltZXN0YW1wIChpbiB1cykuCisgICAgICAgICAgICBidWZmZXJUaW1lID0gbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5mcm9udCgpOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50ZXIrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyQ291bnRlciA9PSBtTnVtT3V0cHV0VGlsZXMpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnBvcCgpOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tidWZmZXJUaW1lXS5jb2RlY091dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKCppdCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtRnJhbWVOdW1iZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPnNlY29uZF0uZnJhbWVOdW1iZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ2FwdHVyZVJlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNhcHR1cmVSZXN1bHRzLmJlZ2luKCk7CisgICAgICAgIC8vIE5lZ2F0aXZlIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNhcHR1cmUgcmVzdWx0CisgICAgICAgIC8vIGNvbGxlY3Rpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGl0LT5maXJzdCA+PSAwKSB7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID09IHN0ZDo6Z2V0PDA+KGl0LT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhbWVyYU1ldGFkYXRhPihzdGQ6OmdldDwxPihpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FwdHVyZSByZXN1bHQgZnJhbWVOdW1iZXIvdGltZXN0YW1wIG1hcHBpbmcgY2hhbmdlZCBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGVyIGFuZCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgfQorCisgICAgLy8gbUVycm9yRnJhbWVOdW1iZXJzIHN0b3JlcyBmcmFtZSBudW1iZXIgb2YgZHJvcHBlZCBidWZmZXJzLgorICAgIGF1dG8gaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUVycm9yRnJhbWVOdW1iZXJzLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZnJhbWVGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gJmlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gKml0KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5zZWNvbmQuZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYW1lRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lRm91bmQpIHsKKyAgICAgICAgICAgIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm90IGFibGUgdG8gZmluZCBmYWlsaW5nIGlucHV0IHdpdGggZnJhbWUgbnVtYmVyOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgKml0KTsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEaXN0cmlidXRlIGNvZGVjIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIG91dCBmcm9tIFlVViBvdXRwdXQKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpICYmIG1Db2RlY0lucHV0QnVmZmVycy5zaXplKCkgPiAwOyBpdCsrKSB7CisgICAgICAgIElucHV0RnJhbWUmIGlucHV0RnJhbWUoaXQtPnNlY29uZCk7CisgICAgICAgIGlmIChpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIDwgbUdyaWRSb3dzICogbUdyaWRDb2xzKSB7CisgICAgICAgICAgICAvLyBBdmFpbGFibGUgaW5wdXQgdGlsZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IGlucHV0CisgICAgICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgICAgIHNpemVfdCBuZXdJbnB1dFRpbGVzID0gc3RkOjptaW4obUNvZGVjSW5wdXRCdWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgbUdyaWRSb3dzICogbUdyaWRDb2xzIC0gaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0lucHV0VGlsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIENvZGVjSW5wdXRCdWZmZXJJbmZvIGlucHV0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB7IG1Db2RlY0lucHV0QnVmZmVyc1swXSwgbUdyaWRUaW1lc3RhbXBVcysrLCBpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIH07CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5wdXNoX2JhY2soaW5wdXRJbmZvKTsKKworICAgICAgICAgICAgICAgIG1Db2RlY0lucHV0QnVmZmVycy5lcmFzZShtQ29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pIHsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBib29sIGFwcFNlZ21lbnRSZWFkeSA9IChpdC5zZWNvbmQuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgIWl0LnNlY29uZC5hcHBTZWdtZW50V3JpdHRlbiAmJiBpdC5zZWNvbmQucmVzdWx0ICE9IG51bGxwdHI7CisgICAgICAgIGJvb2wgY29kZWNPdXRwdXRSZWFkeSA9ICFpdC5zZWNvbmQuY29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCk7CisgICAgICAgIGJvb2wgY29kZWNJbnB1dFJlYWR5ID0gKGl0LnNlY29uZC55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgICghaXQuc2Vjb25kLmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCkpOworICAgICAgICBpZiAoKCFpdC5zZWNvbmQuZXJyb3IpICYmCisgICAgICAgICAgICAgICAgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykgJiYKKyAgICAgICAgICAgICAgICAoYXBwU2VnbWVudFJlYWR5IHx8IGNvZGVjT3V0cHV0UmVhZHkgfHwgY29kZWNJbnB1dFJlYWR5KSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3SW5wdXRBdmFpbGFibGU7Cit9CisKK2ludDY0X3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLykgeworICAgIGludDY0X3QgcmVzID0gLTE7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5lcnJvciAmJiAhaXQuc2Vjb25kLmVycm9yTm90aWZpZWQgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIHJlcyA9IGl0LnNlY29uZC5mcmFtZU51bWJlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0lucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYm9vbCBhcHBTZWdtZW50UmVhZHkgPSBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAhaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiAmJiBpbnB1dEZyYW1lLnJlc3VsdCAhPSBudWxscHRyOworICAgIGJvb2wgY29kZWNPdXRwdXRSZWFkeSA9IGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLnNpemUoKSA+IDA7CisgICAgYm9vbCBjb2RlY0lucHV0UmVhZHkgPSBpbnB1dEZyYW1lLnl1dkJ1ZmZlci5kYXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIWlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKTsKKworICAgIGlmICghYXBwU2VnbWVudFJlYWR5ICYmICFjb2RlY091dHB1dFJlYWR5ICYmICFjb2RlY0lucHV0UmVhZHkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyB2YWxpZCBhcHBTZWdtZW50QnVmZmVyL2NvZGVjIGlucHV0L291dHB1dEJ1ZmZlciBhdmFpbGFibGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIEhhbmRsZSBpbnB1dHMgZm9yIEhldmMgdGlsaW5nCisgICAgaWYgKGNvZGVjSW5wdXRSZWFkeSkgeworICAgICAgICByZXMgPSBwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvZGVjIGlucHV0IGZyYW1lOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGFuZCBzdGFydCBtdXhlciBpZiBub3QgeWV0IGRvbmUgc28KKyAgICBpZiAoaW5wdXRGcmFtZS5tdXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJlcyA9IHN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBhbmQgc3RhcnQgbXV4ZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyaXRlIEpQRUcgQVBQIHNlZ21lbnRzIGRhdGEgdG8gdGhlIG11eGVyLgorICAgIGlmIChhcHBTZWdtZW50UmVhZHkgJiYgaW5wdXRGcmFtZS5tdXhlciAhPSBudWxscHRyKSB7CisgICAgICAgIHJlcyA9IHByb2Nlc3NBcHBTZWdtZW50KHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgSlBFRyBBUFAgc2VnbWVudHM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyaXRlIG1lZGlhIGNvZGVjIGJpdHN0cmVhbSBidWZmZXJzIHRvIG11eGVyLgorICAgIHdoaWxlICghaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXMgPSBwcm9jZXNzT25lQ29kZWNPdXRwdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvZGVjIG91dHB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkgeworICAgICAgICByZXMgPSBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvbXBsZXRlZCBpbnB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6c3RhcnRNdXhlckZvcklucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBpZiAoaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gTm8gc2luZ2xlIGNvZGVjIG91dHB1dCBidWZmZXIgaGFzIGJlZW4gZ2VuZXJhdGVkLiBDb250aW51ZSB0bworICAgICAgICAvLyB3YWl0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYXV0byByZXMgPSBvdXRwdXRBTlctPmRlcXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksICZpbnB1dEZyYW1lLmFuYiwgJmlucHV0RnJhbWUuZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJldHJpZXZpbmcgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDb21iaW5lIGN1cnJlbnQgdGhyZWFkIGlkLCBzdHJlYW0gaWQgYW5kIHRpbWVzdGFtcCB0byB1bmlxdWVseSBpZGVudGlmeSBpbWFnZS4KKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdGVtcE91dHB1dEZpbGU7CisgICAgdGVtcE91dHB1dEZpbGUgPDwgIkhFSUYtIiA8PCBwdGhyZWFkX3NlbGYoKSA8PCAiLSIKKyAgICAgICAgICAgIDw8IGdldFN0cmVhbUlkKCkgPDwgIi0iIDw8IHRpbWVzdGFtcDsKKyAgICBpbnB1dEZyYW1lLmZpbGVGZCA9IHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsIHRlbXBPdXRwdXRGaWxlLnN0cigpLmNfc3RyKCksIE1GRF9DTE9FWEVDKTsKKyAgICBpZiAoaW5wdXRGcmFtZS5maWxlRmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBmaWxlICVzLiBFcnJvciBubyBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0RmlsZS5zdHIoKS5jX3N0cigpLCBlcnJubyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnB1dEZyYW1lLm11eGVyID0gbmV3IE1lZGlhTXV4ZXIoaW5wdXRGcmFtZS5maWxlRmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgaWYgKGlucHV0RnJhbWUubXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgTWVkaWFNdXhlciBmb3IgZmlsZSBmZCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbnB1dEZyYW1lLmZpbGVGZCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPnNldE9yaWVudGF0aW9uSGludChpbnB1dEZyYW1lLm9yaWVudGF0aW9uKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldE9yaWVudGF0aW9uSGludDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgLy8gU2V0IGVuY29kZXIgcXVhbGl0eQorICAgIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHF1YWxpdHlQYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHF1YWxpdHlQYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgaW5wdXRGcmFtZS5xdWFsaXR5KTsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5zZXRQYXJhbWV0ZXJzKHF1YWxpdHlQYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgY29kZWMgcXVhbGl0eTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3NpemVfdCB0cmFja0lkID0gaW5wdXRGcmFtZS5tdXhlci0+YWRkVHJhY2sobUZvcm1hdCk7CisgICAgaWYgKHRyYWNrSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZFRyYWNrIHRvIHRoZSBtdXhlcjogJXpkIiwgX19GVU5DVElPTl9fLCB0cmFja0lkKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW5wdXRGcmFtZS50cmFja0luZGV4ID0gdHJhY2tJZDsKKyAgICBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9IG1OdW1PdXRwdXRUaWxlczsKKworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBNZWRpYU11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0FwcFNlZ21lbnQobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzaXplX3QgYXBwMVNpemUgPSAwOworICAgIGF1dG8gYXBwU2VnbWVudFNpemUgPSBmaW5kQXBwU2VnbWVudHNTaXplKGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLndpZHRoICogaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmhlaWdodCwKKyAgICAgICAgICAgICZhcHAxU2l6ZSk7CisgICAgQUxPR1YoIiVzOiBhcHBTZWdtZW50U2l6ZSBpcyAlenUsIHdpZHRoICVkLCBoZWlnaHQgJWQsIGFwcDFTaXplICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBhcHBTZWdtZW50U2l6ZSwgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLndpZHRoLAorICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5oZWlnaHQsIGFwcDFTaXplKTsKKyAgICBpZiAoYXBwU2VnbWVudFNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIEpQRUcgQVBQIHNlZ21lbnQgc2l6ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IGV4aWZVdGlscyhFeGlmVXRpbHM6OmNyZWF0ZSgpKTsKKyAgICBhdXRvIGV4aWZSZXMgPSBleGlmVXRpbHMtPmluaXRpYWxpemUoaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEsIGFwcDFTaXplKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBFeGlmVXRpbHMgb2JqZWN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPnNldEZyb21NZXRhZGF0YSgqaW5wdXRGcmFtZS5yZXN1bHQsIG1TdGF0aWNJbmZvLAorICAgICAgICAgICAgbU91dHB1dFdpZHRoLCBtT3V0cHV0SGVpZ2h0KTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IEV4aWYgdGFncyB1c2luZyBtZXRhZGF0YSBhbmQgbWFpbiBpbWFnZSBzaXplcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPnNldE9yaWVudGF0aW9uKGlucHV0RnJhbWUub3JpZW50YXRpb24pOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEV4aWZVdGlscyBmYWlsZWQgdG8gc2V0IG9yaWVudGF0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+Z2VuZXJhdGVBcHAxKCk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRXhpZlV0aWxzIGZhaWxlZCB0byBnZW5lcmF0ZSBBUFAxIHNlZ21lbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBuZXdBcHAxTGVuZ3RoID0gZXhpZlV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgY29uc3QgdWludDhfdCAqbmV3QXBwMVNlZ21lbnQgPSBleGlmVXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKworICAgIC8vQXNzZW1ibGUgdGhlIEFQUDEgbWFya2VyIGJ1ZmZlciByZXF1aXJlZCBieSBNZWRpYUNvZGVjCisgICAgdWludDhfdCBrRXhpZkFwcDFNYXJrZXJbXSA9IHsnRScsICd4JywgJ2knLCAnZicsIDB4RkYsIDB4RTEsIDB4MDAsIDB4MDB9OworICAgIGtFeGlmQXBwMU1hcmtlcls2XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG5ld0FwcDFMZW5ndGggPj4gOCk7CisgICAga0V4aWZBcHAxTWFya2VyWzddID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3QXBwMUxlbmd0aCAmIDB4RkYpOworICAgIHNpemVfdCBhcHBTZWdtZW50QnVmZmVyU2l6ZSA9IHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsKKyAgICAgICAgICAgIGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUgKyBuZXdBcHAxTGVuZ3RoOworICAgIHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIgPSBuZXcgdWludDhfdFthcHBTZWdtZW50QnVmZmVyU2l6ZV07CisgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIsIGtFeGlmQXBwMU1hcmtlciwgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikpOworICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlciksIG5ld0FwcDFTZWdtZW50LCBuZXdBcHAxTGVuZ3RoKTsKKyAgICBpZiAoYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSA+IDApIHsKKyAgICAgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIG5ld0FwcDFMZW5ndGgsCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEgKyBhcHAxU2l6ZSwgYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGFwcFNlZ21lbnRCdWZmZXIsIGFwcFNlZ21lbnRCdWZmZXJTaXplKTsKKyAgICBhdXRvIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPndyaXRlU2FtcGxlRGF0YShhQnVmZmVyLCBpbnB1dEZyYW1lLnRyYWNrSW5kZXgsCisgICAgICAgICAgICB0aW1lc3RhbXAsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX01VWEVSX0RBVEEpOworICAgIGRlbGV0ZVtdIGFwcFNlZ21lbnRCdWZmZXI7CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIEpQRUcgQVBQIHNlZ21lbnRzIHRvIG11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgZm9yIChhdXRvJiBpbnB1dEJ1ZmZlciA6IGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgICAgICBhdXRvIHJlcyA9IG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIuaW5kZXgsICZidWZmZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGdldHRpbmcgY29kZWMgaW5wdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IG9uZSB0aWxlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLgorICAgICAgICBzaXplX3QgdGlsZVggPSBpbnB1dEJ1ZmZlci50aWxlSW5kZXggJSBtR3JpZENvbHM7CisgICAgICAgIHNpemVfdCB0aWxlWSA9IGlucHV0QnVmZmVyLnRpbGVJbmRleCAvIG1HcmlkQ29sczsKKyAgICAgICAgc2l6ZV90IHRvcCA9IG1HcmlkSGVpZ2h0ICogdGlsZVk7CisgICAgICAgIHNpemVfdCBsZWZ0ID0gbUdyaWRXaWR0aCAqIHRpbGVYOworICAgICAgICBzaXplX3Qgd2lkdGggPSAodGlsZVggPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtR3JpZENvbHMpIC0gMSkgPworICAgICAgICAgICAgICAgIG1PdXRwdXRXaWR0aCAtIHRpbGVYICogbUdyaWRXaWR0aCA6IG1HcmlkV2lkdGg7CisgICAgICAgIHNpemVfdCBoZWlnaHQgPSAodGlsZVkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtR3JpZFJvd3MpIC0gMSkgPworICAgICAgICAgICAgICAgIG1PdXRwdXRIZWlnaHQgLSB0aWxlWSAqIG1HcmlkSGVpZ2h0IDogbUdyaWRIZWlnaHQ7CisgICAgICAgIEFMT0dWKCIlczogaW5wdXRCdWZmZXIgdGlsZUluZGV4IFslenUsICV6dV0sIHRvcCAlenUsIGxlZnQgJXp1LCB3aWR0aCAlenUsIGhlaWdodCAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGlsZVgsIHRpbGVZLCB0b3AsIGxlZnQsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIHJlcyA9IGNvcHlPbmVZdXZUaWxlKGJ1ZmZlciwgaW5wdXRGcmFtZS55dXZCdWZmZXIsIHRvcCwgbGVmdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNvcHkgWVVWIHRpbGUgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGlucHV0QnVmZmVyLmluZGV4LCAwLCBidWZmZXItPmNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIudGltZVVzLCAwLCBudWxscHRyIC8qZXJyb3JEZXRhaWxNc2cqLyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXVlSW5wdXRCdWZmZXIgdG8gQ29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgYXV0byBpdCA9IGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl0LT5pbmRleCwgJmJ1ZmZlcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGdldHRpbmcgSGVpYyBjb2RlYyBvdXRwdXQgYnVmZmVyIGF0IGluZGV4ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSGVpYyBjb2RlYyBvdXRwdXQgYnVmZmVyIGF0IGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+d3JpdGVTYW1wbGVEYXRhKAorICAgICAgICAgICAgYUJ1ZmZlciwgaW5wdXRGcmFtZS50cmFja0luZGV4LCB0aW1lc3RhbXAsIDAgLypmbGFncyovKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGJ1ZmZlciBpbmRleCAlZCB0byBtdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpdC0+aW5kZXgpOworICAgIGlmIChpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogQ29kZWMgZ2VuZXJhdGVkIG1vcmUgdGlsZXMgdGhhbiBleHBlY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzLS07CisgICAgfQorCisgICAgaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuZXJhc2UoaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgIGlucHV0RnJhbWUubXV4ZXItPnN0b3AoKTsKKworICAgIC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gbWVtb3J5LgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShpbnB1dEZyYW1lLmFuYik7CisgICAgdm9pZCogZHN0QnVmZmVyOworICAgIGF1dG8gcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG9mZl90IGZTaXplID0gbHNlZWsoaW5wdXRGcmFtZS5maWxlRmQsIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihmU2l6ZSkgPiBtTWF4SGVpY0J1ZmZlclNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogTWVkaWFNdXhlciBvdXRwdXQgc2l6ZSAlbGQgaXMgbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVyICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmU2l6ZSwgbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBsc2VlayhpbnB1dEZyYW1lLmZpbGVGZCwgMCwgU0VFS19TRVQpOworICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gcmVhZChpbnB1dEZyYW1lLmZpbGVGZCwgZHN0QnVmZmVyLCBmU2l6ZSk7CisgICAgaWYgKGJ5dGVzUmVhZCA8IGZTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogT25seSAlemQgb2YgJWxkIGJ5dGVzIHJlYWQiLCBfX0ZVTkNUSU9OX18sIGJ5dGVzUmVhZCwgZlNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNsb3NlKGlucHV0RnJhbWUuZmlsZUZkKTsKKyAgICBpbnB1dEZyYW1lLmZpbGVGZCA9IC0xOworCisgICAgLy8gRmlsbCBpbiBIRUlDIGhlYWRlcgorICAgIHVpbnQ4X3QgKmhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkc3RCdWZmZXIpICsgbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpOworICAgIHN0cnVjdCBDYW1lcmFCbG9iICpibG9iSGVhZGVyID0gKHN0cnVjdCBDYW1lcmFCbG9iICopaGVhZGVyOworICAgIC8vIE11c3QgYmUgaW4gc3luYyB3aXRoIENBTUVSQTNfSEVJQ19CTE9CX0lEIGluIGFuZHJvaWRfbWVkaWFfVXRpbHMuY3BwCisgICAgYmxvYkhlYWRlci0+YmxvYklkID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQmxvYklkPigweDAwRkUpOworICAgIGJsb2JIZWFkZXItPmJsb2JTaXplID0gZlNpemU7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgdGltZXN0YW1wKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldFN0cmVhbUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG91dHB1dEFOVy0+cXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUuYW5iLCAvKmZlbmNlKi8gLTEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWVCdWZmZXIgdG8gSGVpYyBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlucHV0RnJhbWUuYW5iID0gbnVsbHB0cjsKKworICAgIEFUUkFDRV9BU1lOQ19FTkQoIkhFSUMgY2FwdHVyZSIsIGlucHV0RnJhbWUuZnJhbWVOdW1iZXIpOworICAgIHJldHVybiBPSzsKK30KKworCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLykgeworICAgIGlmIChpbnB1dEZyYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtQXBwU2VnbWVudENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIWlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgQUxPR1YoIiVzOiByZWxlYXNlT3V0cHV0QnVmZmVyIGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaXQtPmluZGV4KTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+eXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT55dXZCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT55dXZCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlICghaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmZpbGVGZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGlucHV0RnJhbWUtPmZpbGVGZCk7CisgICAgICAgIGlucHV0RnJhbWUtPmZpbGVGZCA9IC0xOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5hbmIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUtPmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+YW5iID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKSB7CisgICAgYXV0byBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0IDw9IGN1cnJlbnRUcykgeworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJml0LT5zZWNvbmQpOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgY2FtZXJhRGV2aWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGJvb2wgdXNlR3JpZCA9IGZhbHNlOworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkID0gaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2Rlcih3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgJm1Vc2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0cik7CisgICAgaWYgKCFpc1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFbmNvZGVyIGRvZXNudCcgc3VwcG9ydCBzaXplICV1IHggJXUhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBMb29wZXIgZm9yIE1lZGlhQ29kZWMuCisgICAgYXV0byBkZXNpcmVkTWltZSA9IG1Vc2VIZWljID8gTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDIDogTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1NZWRpYUNvZGVjTG9vcGVyIik7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgZmFsc2UsICAgIC8vIGNhbkNhbGxKYXZhCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBjb2RlYyBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIENyZWF0ZSBIRUlDL0hFVkMgY29kZWMuCisgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1Db2RlY0xvb3BlciwgZGVzaXJlZE1pbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIGlmIChtQ29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBkZXNpcmVkTWltZSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIENyZWF0ZSBMb29wZXIgYW5kIGhhbmRsZXIgZm9yIENvZGVjIGNhbGxiYWNrLgorICAgIG1Db2RlY0NhbGxiYWNrSGFuZGxlciA9IG5ldyBDb2RlY0NhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBpZiAobUNvZGVjQ2FsbGJhY2tIYW5kbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIGNhbGxiYWNrIGhhbmRsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtQ2FsbGJhY2tMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2FsbGJhY2tMb29wZXItPnNldE5hbWUoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1NZWRpYUNvZGVjQ2FsbGJhY2tMb29wZXIiKTsKKyAgICByZXMgPSBtQ2FsbGJhY2tMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICBmYWxzZSwgICAgLy8gY2FuQ2FsbEphdmEKKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IG1lZGlhIGNhbGxiYWNrIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1DYWxsYmFja0xvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlY0NhbGxiYWNrSGFuZGxlcik7CisKKyAgICBtQXN5bmNOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYWxsYmFja05vdGlmeSwgbUNvZGVjQ2FsbGJhY2tIYW5kbGVyKTsKKyAgICByZXMgPSBtQ29kZWMtPnNldENhbGxiYWNrKG1Bc3luY05vdGlmeSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgTWVkaWFDb2RlYyBjYWxsYmFjazogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgb3V0cHV0IGZvcm1hdCBhbmQgY29uZmlndXJlIHRoZSBDb2RlYy4KKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRTdHJpbmcoS0VZX01JTUUsIGRlc2lyZWRNaW1lKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9CSVRSQVRFX01PREUsIEJJVFJBVEVfTU9ERV9DUSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfUVVBTElUWSwga0RlZmF1bHRKcGVnUXVhbGl0eSk7CisgICAgLy8gQXNrIGNvZGVjIHRvIHNraXAgdGltZXN0YW1wIGNoZWNrIGFuZCBlbmNvZGUgYWxsIGZyYW1lcy4KKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwga05vRnJhbWVEcm9wTWF4UHRzR2FwKTsKKworICAgIGludDMyX3QgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKHVzZUdyaWQgfHwgbVVzZUhlaWMpIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRXaWR0aDsKKyAgICAgICAgZ3JpZEhlaWdodCA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0OworICAgICAgICBncmlkUm93cyA9IChoZWlnaHQgKyBncmlkSGVpZ2h0IC0gMSkvZ3JpZEhlaWdodDsKKyAgICAgICAgZ3JpZENvbHMgPSAod2lkdGggKyBncmlkV2lkdGggLSAxKS9ncmlkV2lkdGg7CisKKyAgICAgICAgaWYgKG1Vc2VIZWljKSB7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX1dJRFRILCBncmlkV2lkdGgpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIGdyaWRIZWlnaHQpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCBncmlkQ29scyk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIGdyaWRSb3dzKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gd2lkdGg7CisgICAgICAgIGdyaWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGdyaWRSb3dzID0gMTsKKyAgICAgICAgZ3JpZENvbHMgPSAxOworICAgIH0KKworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCAhdXNlR3JpZCA/IHdpZHRoIDogZ3JpZFdpZHRoKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsICF1c2VHcmlkID8gaGVpZ2h0IDogZ3JpZEhlaWdodCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgMCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgdXNlR3JpZCA/IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIDogQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfRlJBTUVfUkFURSwgZ3JpZFJvd3MgKiBncmlkQ29scyk7CisgICAgLy8gVGhpcyBvbmx5IHNlcnZlcyBhcyBhIGhpbnQgdG8gZW5jb2RlciB3aGVuIGVuY29kaW5nIGlzIG5vdCByZWFsLXRpbWUuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfT1BFUkFUSU5HX1JBVEUsIHVzZUdyaWQgPyBrR3JpZE9wUmF0ZSA6IGtOb0dyaWRPcFJhdGUpOworCisgICAgcmVzID0gbUNvZGVjLT5jb25maWd1cmUob3V0cHV0Rm9ybWF0LCBudWxscHRyIC8qbmF0aXZlV2luZG93Ki8sCisgICAgICAgICAgICBudWxscHRyIC8qY3J5cHRvKi8sIENPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgY29kZWM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUdyaWRXaWR0aCA9IGdyaWRXaWR0aDsKKyAgICBtR3JpZEhlaWdodCA9IGdyaWRIZWlnaHQ7CisgICAgbUdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgbUdyaWRDb2xzID0gZ3JpZENvbHM7CisgICAgbVVzZUdyaWQgPSB1c2VHcmlkOworICAgIG1PdXRwdXRXaWR0aCA9IHdpZHRoOworICAgIG1PdXRwdXRIZWlnaHQgPSBoZWlnaHQ7CisgICAgbUFwcFNlZ21lbnRNYXhTaXplID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNhbWVyYURldmljZS0+aW5mbygpKTsKKyAgICBtTWF4SGVpY0J1ZmZlclNpemUgPSBtT3V0cHV0V2lkdGggKiBtT3V0cHV0SGVpZ2h0ICogMyAvIDIgKyBtQXBwU2VnbWVudE1heFNpemU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZGVpbml0Q29kZWMoKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAobUNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjLT5zdG9wKCk7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1Db2RlY0xvb3Blci5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2tMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2FsbGJhY2tMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUNhbGxiYWNrTG9vcGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgbUFzeW5jTm90aWZ5LmNsZWFyKCk7CisgICAgbUZvcm1hdC5jbGVhcigpOworfQorCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXBwIHNlZ21lbnQsIDAgaW5kaWNhdGVzIGZhaWx1cmUKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kQXBwU2VnbWVudHNTaXplKGNvbnN0IHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIsCisgICAgICAgIHNpemVfdCBtYXhTaXplLCBzaXplX3QgKmFwcDFTZWdtZW50U2l6ZSkgeworICAgIGlmIChhcHBTZWdtZW50QnVmZmVyID09IG51bGxwdHIgfHwgYXBwMVNlZ21lbnRTaXplID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0IGFwcFNlZ21lbnRCdWZmZXIgJXAsIGFwcDFTZWdtZW50U2l6ZSAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcHBTZWdtZW50QnVmZmVyLCBhcHAxU2VnbWVudFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gMDsKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgRVhJRiB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciA9IGFwcFNlZ21lbnRCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpOworICAgIGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iICpibG9iID0gKGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBpZiAoYmxvYi0+YmxvYklkICE9IENhbWVyYUJsb2JJZDo6SlBFR19BUFBfU0VHTUVOVFMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEVYSUYgYmxvYklkICVodSIsIF9fRlVOQ1RJT05fXywgYmxvYi0+YmxvYklkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXhwZWN0ZWRTaXplID0gYmxvYi0+YmxvYlNpemU7CisgICAgaWYgKGV4cGVjdGVkU2l6ZSA9PSAwIHx8IGV4cGVjdGVkU2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBibG9iU2l6ZSAlenUuIiwgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSAwOworCisgICAgLy8gVmVyaWZ5IEFQUDEgbWFya2VyIChtYW5kYXRvcnkpCisgICAgdWludDhfdCBhcHAxTWFya2VyW10gPSB7MHhGRiwgMHhFMX07CisgICAgaWYgKG1lbWNtcChhcHBTZWdtZW50QnVmZmVyLCBhcHAxTWFya2VyLCBzaXplb2YoYXBwMU1hcmtlcikpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBBUFAxIG1hcmtlcjogJXgsICV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbMF0sIGFwcFNlZ21lbnRCdWZmZXJbMV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdG90YWxTaXplICs9IHNpemVvZihhcHAxTWFya2VyKTsKKworICAgIHVpbnQxNl90IGFwcDFTaXplID0gKHN0YXRpY19jYXN0PHVpbnQxNl90PihhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0pIDw8IDgpICsKKyAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgIHRvdGFsU2l6ZSArPSBhcHAxU2l6ZTsKKworICAgIEFMT0dWKCIlczogRXhwZWN0ZWQgQVBQIHNlZ21lbnRzIHNpemUgJXp1LCBBUFAxIHNlZ21lbnQgc2l6ZSAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSwgYXBwMVNpemUpOworICAgIHdoaWxlICh0b3RhbFNpemUgPCBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgaWYgKGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSAhPSAweEZGIHx8CisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0gPD0gMHhFMSB8fAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdID4gMHhFRikgeworICAgICAgICAgICAgLy8gSW52YWxpZCBBUFBuIG1hcmtlcgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEFQUG4gbWFya2VyOiAleCwgJXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSwgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxTaXplICs9IDI7CisKKyAgICAgICAgdWludDE2X3QgYXBwblNpemUgPSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSkgPDwgOCkgKworICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgICAgICB0b3RhbFNpemUgKz0gYXBwblNpemU7CisgICAgfQorCisgICAgaWYgKHRvdGFsU2l6ZSAhPSBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEpQRUcgQVBQIHNlZ21lbnRzOiB0b3RhbFNpemUgJXUgdnMgZXhwZWN0ZWQgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdG90YWxTaXplLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqYXBwMVNlZ21lbnRTaXplID0gYXBwMVNpemUgKyBzaXplb2YoYXBwMU1hcmtlcik7CisgICAgcmV0dXJuIGV4cGVjdGVkU2l6ZTsKK30KKworaW50NjRfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kVGltZXN0YW1wSW5Oc0xvY2tlZChpbnQ2NF90IHRpbWVJblVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbiA6IG1GcmFtZU51bWJlck1hcCkgeworICAgICAgICBpZiAodGltZUluVXMgPT0gbnMydXMoZm4uc2Vjb25kKSkgeworICAgICAgICAgICAgcmV0dXJuIGZuLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmICh0aW1lSW5VcyA9PSBuczJ1cyhpbnB1dEZyYW1lLmZpcnN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb3B5T25lWXV2VGlsZShzcDxNZWRpYUNvZGVjQnVmZmVyPiYgY29kZWNCdWZmZXIsCisgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHRvcCwgc2l6ZV90IGxlZnQsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBHZXQgc3RyaWRlIGluZm9ybWF0aW9uIGZvciBjb2RlY0J1ZmZlcgorICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICBpZiAoIWNvZGVjQnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICBBTE9HRSgiJXM6IENvZGVjIGlucHV0IGJ1ZmZlciBpcyBub3QgZm9yIGltYWdlIGRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGltYWdlRGF0YS0+c2l6ZSgpICE9IHNpemVvZihNZWRpYUltYWdlMikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvZGVjIGlucHV0IGltYWdlIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW1hZ2VEYXRhLT5zaXplKCksIHNpemVvZihNZWRpYUltYWdlMikpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNZWRpYUltYWdlMiogaW1hZ2VJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUltYWdlMio+KGltYWdlRGF0YS0+ZGF0YSgpKTsKKyAgICBpZiAoaW1hZ2VJbmZvLT5tVHlwZSAhPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYgfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoQWxsb2NhdGVkICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bU51bVBsYW5lcyAhPSAzKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb2RlYyBpbnB1dCBpbWFnZSBpbmZvOiBtVHlwZSAlZCwgbUJpdERlcHRoICVkLCAiCisgICAgICAgICAgICAgICAgIm1CaXREZXB0aEFsbG9jYXRlZCAlZCwgbU51bVBsYW5lcyAlZCEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tVHlwZSwgaW1hZ2VJbmZvLT5tQml0RGVwdGgsCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGhBbGxvY2F0ZWQsIGltYWdlSW5mby0+bU51bVBsYW5lcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiB5dXZCdWZmZXIgY2hyb21hU3RlcCAlZCwgY2hyb21hU3RyaWRlICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgeXV2QnVmZmVyLmNocm9tYVN0ZXAsIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUpOworICAgIEFMT0dWKCIlczogVSBvZmZzZXQgJXUsIFYgb2Zmc2V0ICV1LCBVIHJvd0luYyAlZCwgViByb3dJbmMgJWQsIFUgY29sSW5jICVkLCBWIGNvbEluYyAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0LAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyk7CisKKyAgICAvLyBZCisgICAgZm9yIChhdXRvIHJvdyA9IHRvcDsgcm93IDwgdG9wK2hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6WV0ubVJvd0luYyAqIChyb3cgLSB0b3ApOworICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhK3Jvdyp5dXZCdWZmZXIuc3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgIH0KKworICAgIC8vIFUgaXMgQ2IsIFYgaXMgQ3IKKyAgICBib29sIGNvZGVjVVBsYW5lRmlyc3QgPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCA+CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldDsKKyAgICB1aW50MzJfdCBjb2RlY1V2T2Zmc2V0RGlmZiA9IGNvZGVjVVBsYW5lRmlyc3QgPworICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgLSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCA6CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCAtIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0OworICAgIGJvb2wgaXNDb2RlY1V2U2VtaXBsYW5uYXIgPSAoY29kZWNVdk9mZnNldERpZmYgPT0gMSkgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyA9PQorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgPT0gMikgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyA9PSAyKTsKKyAgICBib29sIGlzQ29kZWNVdlBsYW5uYXIgPQorICAgICAgICAgICAgKChjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpIHx8CisgICAgICAgICAgICAoKCFjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpKSkgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jID09IDEgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jID09IDE7CisgICAgYm9vbCBjYW1lcmFVUGxhbmVGaXJzdCA9IHl1dkJ1ZmZlci5kYXRhQ3IgPiB5dXZCdWZmZXIuZGF0YUNiOworCisgICAgaWYgKGlzQ29kZWNVdlNlbWlwbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDIgJiYKKyAgICAgICAgICAgIChjb2RlY1VQbGFuZUZpcnN0ID09IGNhbWVyYVVQbGFuZUZpcnN0KSkgeworICAgICAgICAvLyBVViBzZW1pcGxhbm5hcgorICAgICAgICAvLyBUaGUgY2hyb21lIHBsYW5lIGNvdWxkIGJlIGVpdGhlciBDYiBmaXJzdCwgb3IgQ3IgZmlyc3QuIFRha2UgdGhlCisgICAgICAgIC8vIHNtYWxsZXIgYWRkcmVzcy4KKyAgICAgICAgdWludDhfdCAqc3JjID0gc3RkOjptaW4oeXV2QnVmZmVyLmRhdGFDYiwgeXV2QnVmZmVyLmRhdGFDcik7CisgICAgICAgIE1lZGlhSW1hZ2UyOjpQbGFuZUluZGV4IGRzdFBsYW5lID0gY29kZWNVdk9mZnNldERpZmYgPiAwID8gTWVkaWFJbWFnZTI6OlUgOiBNZWRpYUltYWdlMjo6VjsKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtkc3RQbGFuZV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW2RzdFBsYW5lXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coc3JjK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0NvZGVjVXZQbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDEpIHsKKyAgICAgICAgLy8gVSBwbGFuZQorICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YUNiK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQvMiwgZHN0LCB3aWR0aC8yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFYgcGxhbmUKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGFDcityb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LzIsIGRzdCwgd2lkdGgvMik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDb252ZXJ0IGJldHdlZW4gc2VtaXBsYW5uYXIgYW5kIHBsYW5uYXIsIG9yIHdoZW4gVVYgb3JkZXJzIGFyZQorICAgICAgICAvLyBkaWZmZXJlbnQuCisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29sID0gbGVmdC8yOyBjb2wgPCAobGVmdCt3aWR0aCkvMjsgY29sKyspIHsKKyAgICAgICAgICAgICAgICAvLyBVL0NiCisgICAgICAgICAgICAgICAgaW50MzJfdCBkc3RJbmRleCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyAqIChjb2wgLSBsZWZ0LzIpOworICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ2Jbc3JjSW5kZXhdOworCisgICAgICAgICAgICAgICAgLy8gVi9DcgorICAgICAgICAgICAgICAgIGRzdEluZGV4ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jICogKGNvbCAtIGxlZnQvMik7CisgICAgICAgICAgICAgICAgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ3Jbc3JjSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbml0Q29weVJvd0Z1bmN0aW9uKGludDMyX3Qgd2lkdGgpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxpYnl1djsKKworICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X0M7CisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19TU0UyKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDMyKSA/IENvcHlSb3dfU1NFMiA6IENvcHlSb3dfQW55X1NTRTI7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19BVlgpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNBVlgpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCA2NCkgPyBDb3B5Um93X0FWWCA6IENvcHlSb3dfQW55X0FWWDsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX0VSTVMpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNFUk1TKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gQ29weVJvd19FUk1TOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTkVPTikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc05FT04pKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCAzMikgPyBDb3B5Um93X05FT04gOiBDb3B5Um93X0FueV9ORU9OOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTUlQUykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc01JUFMpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X01JUFM7CisgICAgfQorI2VuZGlmCit9CisKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjYWxjQXBwU2VnbWVudE1heFNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IGluZm8uZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIHNpemVfdCBtYXhBcHBzU2VnbWVudCA9IDE7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBtYXhBcHBzU2VnbWVudCA9IGVudHJ5LmRhdGEudThbMF0gPCAxID8gMSA6CisgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA+IDE2ID8gMTYgOiBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKyAgICByZXR1cm4gbWF4QXBwc1NlZ21lbnQgKiAoMiArIDB4RkZGRikgKyBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OnRocmVhZExvb3AoKSB7CisgICAgaW50NjRfdCBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKworICAgICAgICB3aGlsZSAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IGdldE5leHRSZWFkeUlucHV0TG9ja2VkKCZjdXJyZW50VHMpOworCisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUoY3VycmVudFRzLCBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIGlmIChtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgfHwKKyAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uYXBwU2VnbWVudFdyaXR0ZW4gJiYKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkpIHsKKyAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBib29sIHJlcyA9IGZhbHNlOworICAgIC8vIEJ1ZmZlciBlcnJvcnMgY29uY2VybmluZyBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHZpc2libGUgdG8KKyAgICAvLyBjYW1lcmEgY2xpZW50cy4gVGhleSBtdXN0IG9ubHkgcmVjZWl2ZSBhIHNpbmdsZSBidWZmZXIgZXJyb3Igd2l0aCB0aGUgcHVibGljIGNvbXBvc2l0ZQorICAgIC8vIHN0cmVhbSBpZC4KKyAgICBpZiAoKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1BcHBTZWdtZW50U3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbU1haW5JbWFnZVN0cmVhbUlkKSkgeworICAgICAgICBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIHJlcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIC8vIEZvciByZXN1bHQgZXJyb3IsIHNpbmNlIHRoZSBBUFBTX1NFR01FTlQgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgRVhJRiwKKyAgICAvLyBzaW1wbHkgc2tpcCB1c2luZyB0aGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgdG8gb3ZlcnJpZGUgRVhJRi4KKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAtMTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZuIDogbUZyYW1lTnVtYmVyTWFwKSB7CisgICAgICAgIGlmIChmbi5maXJzdCA9PSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGZuLnNlY29uZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aW1lc3RhbXAgPT0gLTEpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXN0YW1wID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgc2h1dHRlciB0aW1lc3RhbXAgZm9yIHJlc3VsdCBlcnJvciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhcHR1cmVSZXN1bHRzLmVtcGxhY2UodGltZXN0YW1wLCBzdGQ6Om1ha2VfdHVwbGUocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKSk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Q29kZWNDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8SGVpY0NvbXBvc2l0ZVN0cmVhbT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSByZXR1cm47CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDYWxsYmFja05vdGlmeTogeworICAgICAgICAgICAgIGludDMyX3QgY2JJRDsKKyAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKSB7CisgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYWxsYmFja0lEIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBBTE9HVigia1doYXRDYWxsYmFja05vdGlmeTogY2JJRCA9ICVkIiwgY2JJRCk7CisKKyAgICAgICAgICAgICBzd2l0Y2ggKGNiSUQpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9JTlBVVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfSU5QVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0FWQUlMQUJMRTogeworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGluZGV4IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBvZmZzZXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogc2l6ZSBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHRpbWVVcyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBmbGFncyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgQ29kZWNPdXRwdXRCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmbGFnc307CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6IGZvcm1hdCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNGb3JtYXRDaGFuZ2VkKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfRVJST1I6IHsKKyAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgZGV0YWlsOworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGVyciBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFjdGlvbiIsICZhY3Rpb25Db2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogYWN0aW9uIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIGRldGFpbC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNDb2RlY0Vycm9yKCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYWxsYmFja0lEKCVkKSBpcyB1bmV4cGVjdGVkLiIsIGNiSUQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNob3VsZG4ndCBiZSBoZXJlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWEzYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0NvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBDb21wb3NpdGVTdHJlYW0sIHB1YmxpYyBUaHJlYWQsCisgICAgICAgIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgSGVpY0NvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIH5IZWljQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0hlaWNDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgaW50IGdldFN0cmVhbUlkKCkgb3ZlcnJpZGUgeyByZXR1cm4gbU1haW5JbWFnZVN0cmVhbUlkOyB9CisKKyAgICAvLyBVc2Ugb25TaHV0dGVyIHRvIGtlZXAgdHJhY2sgb2YgZnJhbWUgbnVtYmVyIDwtPiB0aW1lc3RhbXAgbWFwcGluZy4KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCisgICAgc3RhdGljIGJvb2wgaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsKTsKKyAgICBzdGF0aWMgYm9vbCBpc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKTsKK3Byb3RlY3RlZDoKKworICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworICAgIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8vCisgICAgLy8gSEVJQy9IRVZDIENvZGVjIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMsIGFuZCBjYWxsYmFja3MKKyAgICAvLworICAgIHN0cnVjdCBDb2RlY091dHB1dEJ1ZmZlckluZm8geworICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgfTsKKworICAgIHN0cnVjdCBDb2RlY0lucHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBzaXplX3QgdGlsZUluZGV4OworICAgIH07CisKKyAgICBjbGFzcyBDb2RlY0NhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDb2RlY0NhbGxiYWNrSGFuZGxlcih3cDxIZWljQ29tcG9zaXRlU3RyZWFtPiBwYXJlbnQpIHsKKyAgICAgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxIZWljQ29tcG9zaXRlU3RyZWFtPiBtUGFyZW50OworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDYWxsYmFja05vdGlmeSwKKyAgICB9OworCisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUhlaWM7CisgICAgc3A8TWVkaWFDb2RlYz4gICAgbUNvZGVjOworICAgIHNwPEFMb29wZXI+ICAgICAgIG1Db2RlY0xvb3BlciwgbUNhbGxiYWNrTG9vcGVyOworICAgIHNwPENvZGVjQ2FsbGJhY2tIYW5kbGVyPiBtQ29kZWNDYWxsYmFja0hhbmRsZXI7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUFzeW5jTm90aWZ5OworICAgIHNwPEFNZXNzYWdlPiAgICAgIG1Gb3JtYXQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU51bU91dHB1dFRpbGVzOworCisgICAgaW50MzJfdCAgICAgICAgICAgbU91dHB1dFdpZHRoLCBtT3V0cHV0SGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1NYXhIZWljQnVmZmVyU2l6ZTsKKyAgICBpbnQzMl90ICAgICAgICAgICBtR3JpZFdpZHRoLCBtR3JpZEhlaWdodDsKKyAgICBzaXplX3QgICAgICAgICAgICBtR3JpZFJvd3MsIG1HcmlkQ29sczsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlR3JpZDsgLy8gV2hldGhlciB0byB1c2UgZnJhbWV3b3JrIFlVViBmcmFtZSB0aWxpbmcuCisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTm9GcmFtZURyb3BNYXhQdHNHYXAgPSAtMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTm9HcmlkT3BSYXRlID0gMzA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0dyaWRPcFJhdGUgPSAxMjA7CisKKyAgICB2b2lkIG9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKGNvbnN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyYgYnVmZmVySW5mbyk7CisgICAgdm9pZCBvbkhlaWNJbnB1dEZyYW1lQXZhaWxhYmxlKGludDMyX3QgaW5kZXgpOyAgLy8gT25seSBjYWxsZWQgZm9yIFlVViBpbnB1dCBtb2RlLgorICAgIHZvaWQgb25IZWljRm9ybWF0Q2hhbmdlZChzcDxBTWVzc2FnZT4mIG5ld0Zvcm1hdCk7CisgICAgdm9pZCBvbkhlaWNDb2RlY0Vycm9yKCk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplQ29kZWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBjYW1lcmFEZXZpY2UpOworICAgIHZvaWQgZGVpbml0Q29kZWMoKTsKKworICAgIC8vCisgICAgLy8gQ29tcG9zaXRlIHN0cmVhbSByZWxhdGVkIHN0cnVjdHVyZXMsIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjYWxsYmFja3MuCisgICAgLy8KKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb247CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgcXVhbGl0eTsKKworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gY29kZWNPdXRwdXRCdWZmZXJzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhTWV0YWRhdGE+ICAgIHJlc3VsdDsKKworICAgICAgICAvLyBGaWVsZHMgdGhhdCBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFVkMgdGlsaW5nLgorICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICAgICAgICAgIHl1dkJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNJbnB1dEJ1ZmZlckluZm8+ICBjb2RlY0lucHV0QnVmZmVyczsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm90aWZpZWQ7CisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXI7CisKKyAgICAgICAgc3A8TWVkaWFNdXhlcj4gICAgICAgICAgICBtdXhlcjsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUZkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZpbGVGZDsKKyAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICB0cmFja0luZGV4OworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICAgICAgICphbmI7CisKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBhcHBTZWdtZW50V3JpdHRlbjsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXM7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgY29kZWNJbnB1dENvdW50ZXI7CisKKyAgICAgICAgSW5wdXRGcmFtZSgpIDogb3JpZW50YXRpb24oMCksIHF1YWxpdHkoa0RlZmF1bHRKcGVnUXVhbGl0eSksIGVycm9yKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZChmYWxzZSksIGZyYW1lTnVtYmVyKC0xKSwgZmVuY2VGZCgtMSksIGZpbGVGZCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXgoLTEpLCBhbmIobnVsbHB0ciksIGFwcFNlZ21lbnRXcml0dGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ091dHB1dFRpbGVzKDApLCBjb2RlY0lucHV0Q291bnRlcigwKSB7IH0KKyAgICB9OworCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgLy8gRmluZCBmaXJzdCBjb21wbGV0ZSBhbmQgdmFsaWQgZnJhbWUgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAKKyAgICBib29sIGdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKyAgICAvLyBGaW5kIG5leHQgZmFpbGluZyBmcmFtZSBudW1iZXIgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAgYW5kIHJldHVybiByZXNwZWN0aXZlIGZyYW1lIG51bWJlcgorICAgIGludDY0X3QgZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLyk7CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBzdGFydE11eGVyRm9ySW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0FwcFNlZ21lbnQobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLyk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpOworCisgICAgc2l6ZV90IGZpbmRBcHBTZWdtZW50c1NpemUoY29uc3QgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciwgc2l6ZV90IG1heFNpemUsCisgICAgICAgICAgICBzaXplX3QqIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgaW50NjRfdCBmaW5kVGltZXN0YW1wSW5Oc0xvY2tlZChpbnQ2NF90IHRpbWVJblVzKTsKKyAgICBzdGF0dXNfdCBjb3B5T25lWXV2VGlsZShzcDxNZWRpYUNvZGVjQnVmZmVyPiYgY29kZWNCdWZmZXIsCisgICAgICAgICAgICBjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyJiB5dXZCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgdG9wLCBzaXplX3QgbGVmdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGluaXRDb3B5Um93RnVuY3Rpb24oaW50MzJfdCB3aWR0aCk7CisgICAgc3RhdGljIHNpemVfdCBjYWxjQXBwU2VnbWVudE1heFNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0SnBlZ1F1YWxpdHkgPSA5OTsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2Uga0FwcFNlZ21lbnREYXRhU3BhY2UgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrSGVpZkRhdGFTcGFjZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKTsKKworICAgIGludCAgICAgICAgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQsIG1BcHBTZWdtZW50U3VyZmFjZUlkOworICAgIHNwPENwdUNvbnN1bWVyPiAgIG1BcHBTZWdtZW50Q29uc3VtZXI7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlOworICAgIGJvb2wgICAgICAgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbUFwcFNlZ21lbnRNYXhTaXplOworICAgIENhbWVyYU1ldGFkYXRhICAgIG1TdGF0aWNJbmZvOworCisgICAgaW50ICAgICAgICAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkLCBtTWFpbkltYWdlU3VyZmFjZUlkOworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlOworICAgIHNwPENwdUNvbnN1bWVyPiAgIG1NYWluSW1hZ2VDb25zdW1lcjsgLy8gT25seSBhcHBsaWNhYmxlIGZvciBIRVZDIGNvZGVjLgorICAgIGJvb2wgICAgICAgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZDsgLy8gT25seSBhcHBsaWNhYmxlIHRvIEhFVkMgY29kZWMKKworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1PdXRwdXRTdXJmYWNlOworICAgIHNwPFByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisKKyAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXI7CisgICAgLy8gTWFwIGZyb20gdGltZXN0YW1wIHRvIEpQRUcgc2V0dGluZyBvZiBvcmllbnRhdGlvbitxdWFsaXR5CisgICAgc3RkOjptYXA8aW50NjRfdCwgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBtU2V0dGluZ3NCeVRpbWVzdGFtcDsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEFQUCBzZWdtZW50IEJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgSEVJQyBibG9iIGJ1ZmZlciBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxDb2RlY091dHB1dEJ1ZmZlckluZm8+IG1Db2RlY091dHB1dEJ1ZmZlcnM7CisgICAgc3RkOjpxdWV1ZTxpbnQ2NF90PiBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnRlcjsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIFl1diBidWZmZXIgcGVuZGluZyB0aWxpbmcgYW5kIGVuY29kaW5nIChmb3IgSEVWQyBZVVYgdGlsaW5nIG9ubHkpCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0WXV2QnVmZmVyczsKKyAgICAvLyBLZWVwIGFsbCBjb2RlYyBpbnB1dCBidWZmZXJzIHJlYWR5IHRvIGJlIGZpbGxlZCBvdXQgKGZvciBIRVZDIFlVViB0aWxpbmcgb25seSkKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtQ29kZWNJbnB1dEJ1ZmZlcnM7CisKKyAgICAvLyBBcnRpZmljaWFsIHN0cmljdGx5IGluY3JlbWVudGFsIFlVViBncmlkIHRpbWVzdGFtcCB0byBtYWtlIGVuY29kZXIgaGFwcHkuCisgICAgaW50NjRfdCBtR3JpZFRpbWVzdGFtcFVzOworCisgICAgLy8gSW4gbW9zdCBjb21tb24gdXNlIGNhc2UsIGVudHJpZXMgYXJlIGFjY2Vzc2VkIGluIG9yZGVyLgorICAgIHN0ZDo6bWFwPGludDY0X3QsIElucHV0RnJhbWU+IG1QZW5kaW5nSW5wdXRGcmFtZXM7CisKKyAgICAvLyBGdW5jdGlvbiBwb2ludGVyIG9mIGxpYnl1diByb3cgY29weS4KKyAgICB2b2lkICgqbUZuQ29weVJvdykoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCB3aWR0aCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDliZTZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSGVpY0VuY29kZXJJbmZvTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8cmVnZXg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2dfbWFpbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCisjaW5jbHVkZSAiSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6OkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKSA6CisgICAgICAgIG1Jc0luaXRlZChmYWxzZSksCisgICAgICAgIG1NaW5TaXplSGVpYygwLCAwKSwKKyAgICAgICAgbU1heFNpemVIZWljKElOVDMyX01BWCwgSU5UMzJfTUFYKSwKKyAgICAgICAgbUhhc0hFVkMoZmFsc2UpLAorICAgICAgICBtSGFzSEVJQyhmYWxzZSksCisgICAgICAgIG1EaXNhYmxlR3JpZChmYWxzZSkgeworICAgIGlmIChpbml0aWFsaXplKCkgPT0gT0spIHsKKyAgICAgICAgbUlzSW5pdGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6On5IZWljRW5jb2RlckluZm9NYW5hZ2VyKCkgeworfQorCitib29sIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmlzU2l6ZVN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgYm9vbCogdXNlSGVpYywKKyAgICAgICAgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpIGNvbnN0IHsKKyAgICBpZiAodXNlSGVpYyA9PSBudWxscHRyIHx8IHVzZUdyaWQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcGFyYW1ldGVyczogdXNlSGVpYyAlcCwgdXNlR3JpZCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1c2VIZWljLCB1c2VHcmlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1Jc0luaXRlZCkgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBjaG9vc2VIZWljID0gZmFsc2UsIGVuYWJsZUdyaWQgPSB0cnVlOworICAgIGlmIChtSGFzSEVJQyAmJiB3aWR0aCA+PSBtTWluU2l6ZUhlaWMuZmlyc3QgJiYKKyAgICAgICAgICAgIGhlaWdodCA+PSBtTWluU2l6ZUhlaWMuc2Vjb25kICYmIHdpZHRoIDw9IG1NYXhTaXplSGVpYy5maXJzdCAmJgorICAgICAgICAgICAgaGVpZ2h0IDw9IG1NYXhTaXplSGVpYy5zZWNvbmQpIHsKKyAgICAgICAgY2hvb3NlSGVpYyA9IHRydWU7CisgICAgICAgIGVuYWJsZUdyaWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKG1IYXNIRVZDKSB7CisgICAgICAgIGJvb2wgZnVsbFNpemVTdXBwb3J0ZWRCeUhldmMgPSAod2lkdGggPj0gbU1pblNpemVIZXZjLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0ID49IG1NaW5TaXplSGV2Yy5zZWNvbmQgJiYKKyAgICAgICAgICAgICAgICB3aWR0aCA8PSBtTWF4U2l6ZUhldmMuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPD0gbU1heFNpemVIZXZjLnNlY29uZCk7CisgICAgICAgIGlmIChmdWxsU2l6ZVN1cHBvcnRlZEJ5SGV2YyAmJiAobURpc2FibGVHcmlkIHx8CisgICAgICAgICAgICAgICAgKHdpZHRoIDw9IDE5MjAgJiYgaGVpZ2h0IDw9IDEwODApKSkgeworICAgICAgICAgICAgZW5hYmxlR3JpZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gZW5jb2RlciBhdmFpbGFibGUgZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGFsbCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIEZpbmQgcHJlZmVycmVkIGVuY29kZXIgd2hpY2ggYWR2ZXJ0aXNlCisgICAgICAgIC8vICJtZWFzdXJlZC1mcmFtZS1yYXRlLVdJRFRIeEhFSUdIVC1yYW5nZSIga2V5LgorICAgICAgICBjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzID0KKyAgICAgICAgICAgICAgICAoY2hvb3NlSGVpYyAmJiBtSGVpY0ZyYW1lUmF0ZU1hcHMuc2l6ZSgpID4gMCkgPworICAgICAgICAgICAgICAgIG1IZWljRnJhbWVSYXRlTWFwcyA6IG1IZXZjRnJhbWVSYXRlTWFwczsKKyAgICAgICAgY29uc3QgYXV0byYgY2xvc2VzdFNpemUgPSBmaW5kQ2xvc2VzdFNpemUobWFwcywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChjbG9zZXN0U2l6ZSA9PSBtYXBzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgIm1lYXN1cmVkLWZyYW1lLXJhdGUtV0lEVEh4SEVJR0hULXJhbmdlIiBrZXkgaXMgb3B0aW9uYWwuCisgICAgICAgICAgICAvLyBIYXJkY29kZSB0byBzb21lIGRlZmF1bHQgdmFsdWUgKDMuMzNtcyAqIHRpbGUgY291bnQpIGJhc2VkIG9uIHJlc29sdXRpb24uCisgICAgICAgICAgICAqc3RhbGwgPSAzMzMzMzMzTEwgKiB3aWR0aCAqIGhlaWdodCAvIChrR3JpZFdpZHRoICoga0dyaWRIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXJpdmUgc3RhbGwgZHVyYXRpb25zIGJhc2VkIG9uIGF2ZXJhZ2UgZnBzIG9mIHRoZSBjbG9zZXN0IHNpemUuCisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IE5TRUNfUEVSX1NFQyA9IDEwMDAwMDAwMDBMTDsKKyAgICAgICAgaW50MzJfdCBhdmdGcHMgPSAoY2xvc2VzdFNpemUtPnNlY29uZC5maXJzdCArIGNsb3Nlc3RTaXplLT5zZWNvbmQuc2Vjb25kKS8yOworICAgICAgICBmbG9hdCByYXRpbyA9IDEuMGYgKiB3aWR0aCAqIGhlaWdodCAvCisgICAgICAgICAgICAgICAgKGNsb3Nlc3RTaXplLT5maXJzdC5maXJzdCAqIGNsb3Nlc3RTaXplLT5maXJzdC5zZWNvbmQpOworICAgICAgICAqc3RhbGwgPSByYXRpbyAqIE5TRUNfUEVSX1NFQyAvIGF2Z0ZwczsKKyAgICB9CisKKyAgICAqdXNlSGVpYyA9IGNob29zZUhlaWM7CisgICAgKnVzZUdyaWQgPSBlbmFibGVHcmlkOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjppbml0aWFsaXplKCkgeworICAgIG1EaXNhYmxlR3JpZCA9IHByb3BlcnR5X2dldF9ib29sKCJjYW1lcmEuaGVpYy5kaXNhYmxlX2dyaWQiLCBmYWxzZSk7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKGNvZGVjc0xpc3QgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBObyBtZWRpYSBjb2RlYyBhdmFpbGFibGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gaGVpY0RldGFpbHMgPSBnZXRDb2RlY0RldGFpbHMoY29kZWNzTGlzdCwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBzcDxBTWVzc2FnZT4gaGV2Y0RldGFpbHMgPSBnZXRDb2RlY0RldGFpbHMoY29kZWNzTGlzdCwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisKKyAgICBpZiAoaGV2Y0RldGFpbHMgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaGVpY0RldGFpbHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgbXVzdCBzdXBwb3J0IEhFVkMgY29kZWMgaWYgSEVJQyBjb2RlYyBpcyBhdmFpbGFibGUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIENoZWNrIENRIG1vZGUgZm9yIEhFVkMgY29kZWMKKyAgICB7CisgICAgICAgIEFTdHJpbmcgYml0cmF0ZU1vZGVzOworICAgICAgICBhdXRvIGhhc0l0ZW0gPSBoZXZjRGV0YWlscy0+ZmluZFN0cmluZygiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgJmJpdHJhdGVNb2Rlcyk7CisgICAgICAgIGlmICghaGFzSXRlbSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVlcnkgYml0cmF0ZSBtb2RlcyBmb3IgSEVWQyBjb2RlYyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlczogSEVWQyBjb2RlYydzIGZlYXR1cmUtYml0cmF0ZS1tb2RlcyB2YWx1ZSBpcyAlZCwgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGFzSXRlbSwgYml0cmF0ZU1vZGVzLmNfc3RyKCkpOworICAgICAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIihefCwpQ1EoJHwsKSIsIHN0ZDo6cmVnZXhfY29uc3RhbnRzOjppY2FzZSk7CisgICAgICAgIGlmICghc3RkOjpyZWdleF9zZWFyY2goYml0cmF0ZU1vZGVzLmNfc3RyKCksIHBhdHRlcm4pKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIRUlDIHNpemUgcmFuZ2UKKyAgICBpZiAoaGVpY0RldGFpbHMgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvIHJlcyA9IGdldENvZGVjU2l6ZVJhbmdlKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKKyAgICAgICAgICAgICAgICBoZWljRGV0YWlscywgJm1NaW5TaXplSGVpYywgJm1NYXhTaXplSGVpYywgJm1IZWljRnJhbWVSYXRlTWFwcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBIRUlDIGNvZGVjIHNpemUgcmFuZ2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtSGFzSEVJQyA9IHRydWU7CisgICAgfQorCisgICAgLy8gSEVWQyBzaXplIHJhbmdlCisgICAgeworICAgICAgICBhdXRvIHJlcyA9IGdldENvZGVjU2l6ZVJhbmdlKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAgICAgaGV2Y0RldGFpbHMsICZtTWluU2l6ZUhldmMsICZtTWF4U2l6ZUhldmMsICZtSGV2Y0ZyYW1lUmF0ZU1hcHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSEVWQyBjb2RlYyBzaXplIHJhbmdlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBtSGFzSEVWQyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRGcmFtZVJhdGVNYXBzKHNwPEFNZXNzYWdlPiBkZXRhaWxzLCBGcmFtZVJhdGVNYXBzKiBtYXBzKSB7CisgICAgaWYgKGRldGFpbHMgPT0gbnVsbHB0ciB8fCBtYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBkZXRhaWxzOiAlcCwgbWFwczogJXAiLCBfX0ZVTkNUSU9OX18sIGRldGFpbHMuZ2V0KCksIG1hcHMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV0YWlscy0+Y291bnRFbnRyaWVzKCk7IGkrKykgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyKiBlbnRyeU5hbWUgPSBkZXRhaWxzLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIGlmICh0eXBlICE9IEFNZXNzYWdlOjprVHlwZVN0cmluZykgY29udGludWU7CisgICAgICAgIHN0ZDo6cmVnZXggZnJhbWVSYXRlTmFtZVBhdHRlcm4oIm1lYXN1cmVkLWZyYW1lLXJhdGUtKFswLTldKylbKnhdKFswLTldKyktcmFuZ2UiLAorICAgICAgICAgICAgICAgIHN0ZDo6cmVnZXhfY29uc3RhbnRzOjppY2FzZSk7CisgICAgICAgIHN0ZDo6Y21hdGNoIHNpemVNYXRjaDsKKyAgICAgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goZW50cnlOYW1lLCBzaXplTWF0Y2gsIGZyYW1lUmF0ZU5hbWVQYXR0ZXJuKSAmJgorICAgICAgICAgICAgICAgIHNpemVNYXRjaC5zaXplKCkgPT0gMykgeworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW0gPSBkZXRhaWxzLT5nZXRFbnRyeUF0KGkpOworICAgICAgICAgICAgQVN0cmluZyBmcHNSYW5nZVN0cjsKKyAgICAgICAgICAgIGlmIChpdGVtLmZpbmQoJmZwc1JhbmdlU3RyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMiLCBlbnRyeU5hbWUsIGZwc1JhbmdlU3RyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6cmVnZXggZnJhbWVSYXRlUGF0dGVybigiKFswLTldKyktKFswLTldKykiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmNtYXRjaCBmcHNNYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChmcHNSYW5nZVN0ci5jX3N0cigpLCBmcHNNYXRjaCwgZnJhbWVSYXRlUGF0dGVybikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwc01hdGNoLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcHMtPmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RvaShzaXplTWF0Y2hbMV0pLCBzdG9pKHNpemVNYXRjaFsyXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0b2koZnBzTWF0Y2hbMV0pLCBzdG9pKGZwc01hdGNoWzJdKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0Q29kZWNTaXplUmFuZ2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvZGVjTmFtZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGRldGFpbHMsCisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWluU2l6ZSwKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtYXhTaXplLAorICAgICAgICBGcmFtZVJhdGVNYXBzKiBmcmFtZVJhdGVNYXBzKSB7CisgICAgaWYgKGNvZGVjTmFtZSA9PSBudWxscHRyIHx8IG1pblNpemUgPT0gbnVsbHB0ciB8fCBtYXhTaXplID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIGRldGFpbHMgPT0gbnVsbHB0ciB8fCBmcmFtZVJhdGVNYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBU3RyaW5nIHNpemVSYW5nZTsKKyAgICBhdXRvIGhhc0l0ZW0gPSBkZXRhaWxzLT5maW5kU3RyaW5nKCJzaXplLXJhbmdlIiwgJnNpemVSYW5nZSk7CisgICAgaWYgKCFoYXNJdGVtKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXJ5IHNpemUgcmFuZ2UgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBjb2RlY05hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzIGNvZGVjJ3Mgc2l6ZSByYW5nZSBpcyAlcyIsIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lLCBzaXplUmFuZ2UuY19zdHIoKSk7CisgICAgc3RkOjpyZWdleCBwYXR0ZXJuKCIoWzAtOV0rKVsqeF0oWzAtOV0rKS0oWzAtOV0rKVsqeF0oWzAtOV0rKSIpOworICAgIHN0ZDo6Y21hdGNoIG1hdGNoOworICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKHNpemVSYW5nZS5jX3N0cigpLCBtYXRjaCwgcGF0dGVybikpIHsKKyAgICAgICAgaWYgKG1hdGNoLnNpemUoKSA9PSA1KSB7CisgICAgICAgICAgICBtaW5TaXplLT5maXJzdCA9IHN0b2kobWF0Y2hbMV0pOworICAgICAgICAgICAgbWluU2l6ZS0+c2Vjb25kID0gc3RvaShtYXRjaFsyXSk7CisgICAgICAgICAgICBtYXhTaXplLT5maXJzdCA9IHN0b2kobWF0Y2hbM10pOworICAgICAgICAgICAgbWF4U2l6ZS0+c2Vjb25kID0gc3RvaShtYXRjaFs0XSk7CisgICAgICAgICAgICBpZiAobWluU2l6ZS0+Zmlyc3QgPiBtYXhTaXplLT5maXJzdCB8fAorICAgICAgICAgICAgICAgICAgICBtaW5TaXplLT5zZWNvbmQgPiBtYXhTaXplLT5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMgY29kZSBzaXplIHJhbmdlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSwgc2l6ZVJhbmdlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBnZXRGcmFtZVJhdGVNYXBzKGRldGFpbHMsIGZyYW1lUmF0ZU1hcHMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6OkZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmZpbmRDbG9zZXN0U2l6ZSgKKyAgICAgICAgY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICBpbnQzMl90IG1pbkRpZmYgPSBJTlQzMl9NQVg7CisgICAgRnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgY2xvc2VzdEl0ZXIgPSBtYXBzLmJlZ2luKCk7CisgICAgZm9yIChhdXRvIGl0ZXIgPSBtYXBzLmJlZ2luKCk7IGl0ZXIgIT0gbWFwcy5lbmQoKTsgaXRlcisrKSB7CisgICAgICAgIC8vIFVzZSBhcmVhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2l6ZXMgdG8gYXBwcm94aW1hdGUgc2l6ZQorICAgICAgICAvLyBkaWZmZXJlbmNlLgorICAgICAgICBpbnQzMl90IGRpZmYgPSBhYnMoaXRlci0+Zmlyc3QuZmlyc3QgKiBpdGVyLT5maXJzdC5zZWNvbmQgLSB3aWR0aCAqIGhlaWdodCk7CisgICAgICAgIGlmIChkaWZmIDwgbWluRGlmZikgeworICAgICAgICAgICAgY2xvc2VzdEl0ZXIgPSBpdGVyOworICAgICAgICAgICAgbWluRGlmZiA9IGRpZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsb3Nlc3RJdGVyOworfQorCitzcDxBTWVzc2FnZT4gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0Q29kZWNEZXRhaWxzKAorICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGlkeCA9IGNvZGVjc0xpc3QtPmZpbmRDb2RlY0J5VHlwZShuYW1lLCB0cnVlIC8qZW5jb2RlciovKTsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGNvZGVjc0xpc3QtPmdldENvZGVjSW5mbyhpZHgpOworICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGNvZGVjIGluZm8gZm9yICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPQorICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG5hbWUpOworICAgIGlmIChjYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdGllcyBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBjYXBzLT5nZXREZXRhaWxzKCk7CisgICAgaWYgKGRldGFpbHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgZGV0YWlscyBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gZGV0YWlsczsKK30KK30gLy9uYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBiOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIEhlaWNFbmNvZGVySW5mb01hbmFnZXIgeworcHVibGljOgorICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyJiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXIgaW5zdGFuY2U7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsKSBjb25zdDsKKworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtHcmlkV2lkdGggPSA1MTI7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRIZWlnaHQgPSA1MTI7Citwcml2YXRlOgorICAgIHN0cnVjdCBTaXplUGFpckhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvciAoKSAoY29uc3Qgc3RkOjpwYWlyPGludDMyX3QsaW50MzJfdD4gJnApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwLmZpcnN0ICogMzEgKyBwLnNlY29uZDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4sCisgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4sIFNpemVQYWlySGFzaD4gRnJhbWVSYXRlTWFwczsKKworICAgIEhlaWNFbmNvZGVySW5mb01hbmFnZXIoKTsKKyAgICB2aXJ0dWFsIH5IZWljRW5jb2RlckluZm9NYW5hZ2VyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisgICAgc3RhdHVzX3QgZ2V0RnJhbWVSYXRlTWFwcyhzcDxBTWVzc2FnZT4gZGV0YWlscywgRnJhbWVSYXRlTWFwcyogbWFwcyk7CisgICAgc3RhdHVzX3QgZ2V0Q29kZWNTaXplUmFuZ2UoY29uc3QgY2hhciogY29kZWNOYW1lLCBzcDxBTWVzc2FnZT4gZGV0YWlscywKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWluU2l6ZSwgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtYXhTaXplLAorICAgICAgICAgICAgRnJhbWVSYXRlTWFwcyogZnJhbWVSYXRlTWFwcyk7CisgICAgRnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgZmluZENsb3Nlc3RTaXplKGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMsCisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldENvZGVjRGV0YWlscyhzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgYm9vbCBtSXNJbml0ZWQ7CisgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1NaW5TaXplSGVpYywgbU1heFNpemVIZWljOworICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBtTWluU2l6ZUhldmMsIG1NYXhTaXplSGV2YzsKKyAgICBib29sIG1IYXNIRVZDLCBtSGFzSEVJQzsKKyAgICBGcmFtZVJhdGVNYXBzIG1IZWljRnJhbWVSYXRlTWFwcywgbUhldmNGcmFtZVJhdGVNYXBzOworICAgIGJvb2wgbURpc2FibGVHcmlkOworCit9OworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCBjZTAwNmE3Li43OGZlYjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTMyLDE0ICszMiwxMSBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtNTcsMTMgKzU0LDEzIEBACiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKKyAgICAgICAgbURldmljZShuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCkpLAogICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKSwgbUFwaTFDYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgQUxPR0koIkNhbWVyYSAlczogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZC5zdHJpbmcoKSwKICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAKICAgICBtSW5pdGlhbENsaWVudFBpZCA9IGNsaWVudFBpZDsKLSAgICBtRGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CiB9CiAKQEAgLTcxLDcgKzY4LDcgQEAKIHN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Y2hlY2tQaWQoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbikKICAgICAgICAgY29uc3QgewogCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HRSgiJXM6IGF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCkBAIC0xODYsNyArMTgzLDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgbWVkaWEgc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICYmCiAgICAgICAgIGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCkBAIC0yMDYsOCArMjAzLDYgQEAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47CiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwogCi0gICAgbURldmljZS5jbGVhcigpOwotCiAgICAgQUxPR1YoIkNhbWVyYSAlczogRGV0YWNoIGNvbXBsZXRlIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiB9CiAKQEAgLTIxOSwxOCArMjE0LDE4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCiAgICAgaWYgKFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICE9IDAgJiYKLSAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CisgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKIAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogQ29ubmVjdGlvbiBhdHRlbXB0IGZyb20gcGlkICVkOyAiCiAgICAgICAgICAgICAgICAgImN1cnJlbnQgbG9ja2VkIHRvIHBpZCAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIFRDbGllbnRCYXNlOjptUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggZTc0ZmJkZi4uNjY5Mzg0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTEzMCw3ICsxMzAsMTAgQEAKICAgICAvKiogQ2FtZXJhRGV2aWNlQmFzZSBpbnN0YW5jZSB3cmFwcGluZyBIQUwzKyBlbnRyeSAqLwogCiAgICAgY29uc3QgaW50IG1EZXZpY2VWZXJzaW9uOwotICAgIHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOworCisgICAgLy8gU2V0IHRvIGNvbnN0IHRvIGF2b2lkIG1EZXZpY2UgYmVpbmcgdXBkYXRlZCAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nCisgICAgLy8gZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UpCisgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggMGNlNDMxOC4uZDY3ODlhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwLDI3ICsyMCw0MiBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYV9jb21tb24uaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA7Cit1c2luZyBzdGQ6OmxpdGVyYWxzOjpjaHJvbm9fbGl0ZXJhbHM6Om9wZXJhdG9yIiJzOwogCiBuYW1lc3BhY2UgewogLy8gSGFyZGNvZGVkIG5hbWUgZm9yIHRoZSBwYXNzdGhyb3VnaCBIQUwgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IGNhbid0IGJlIGRpc2NvdmVyZWQgdmlhIHRoZQogLy8gc2VydmljZSBtYW5hZ2VyCiBjb25zdCBzdGQ6OnN0cmluZyBrTGVnYWN5UHJvdmlkZXJOYW1lKCJsZWdhY3kvMCIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lKCJleHRlcm5hbC8wIik7Ci0KK2NvbnN0IGJvb2wga0VuYWJsZUxhenlIYWwocHJvcGVydHlfZ2V0X2Jvb2woInJvLmNhbWVyYS5lbmFibGVMYXp5SGFsIiwgZmFsc2UpKTsKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCitjb25zdCBmbG9hdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmtEZXB0aEFSVG9sZXJhbmNlID0gLjFmOworCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHl7fTsKIApAQCAtNTYsNiArNzEsOCBAQAogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICBtU2VydmljZVByb3h5ID0gcHJveHk7CisgICAgbURldmljZVN0YXRlID0gc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPj4oCisgICAgICAgIHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTo6Tk9STUFMKTsKIAogICAgIC8vIFJlZ2lzdGVyaW5nIHdpbGwgdHJpZ2dlciBub3RpZmljYXRpb25zIGZvciBhbGwgYWxyZWFkeS1rbm93biBwcm92aWRlcnMKICAgICBib29sIHN1Y2Nlc3MgPSBtU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCkBAIC03MSw2ICs4OCw4IEBACiAgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0xlZ2FjeVByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKICAgICBhZGRQcm92aWRlckxvY2tlZChrRXh0ZXJuYWxQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CiAKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE3NCw2ICsxOTMsMTkgQEAKICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhSW5mbyhpbmZvKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZUluZm8tPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwgc3RhdHVzKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKQEAgLTIwMywyNiArMjM1LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0gICAgYm9vbCBzdXBwb3J0ID0gZmFsc2U7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBhdXRvIHJldCA9IHByb3ZpZGVyLT5tSW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBbJnN1cHBvcnRdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gc3VwcG9ydDsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgYm9vbCBlbmFibGVkKSB7CkBAIC0yMzEsNiArMjUyLDE1IEBACiAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAorICAgIC8vIFBhc3MgdGhlIGNhbWVyYSBJRCB0byBzdGFydCBpbnRlcmZhY2Ugc28gdGhhdCBpdCB3aWxsIHNhdmUgaXQgdG8gdGhlIG1hcCBvZiBJQ2FtZXJhUHJvdmlkZXJzCisgICAgLy8gdGhhdCBhcmUgY3VycmVudGx5IGluIHVzZS4KKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgZGV2aWNlSW5mby0+bUlkLCBpbnRlcmZhY2UpOworCiAgICAgcmV0dXJuIGRldmljZUluZm8tPnNldFRvcmNoTW9kZShlbmFibGVkKTsKIH0KIApAQCAtMjM4LDM3ICsyNjgsNyBAQAogICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CiAKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOwotICAgICAgICBTdGF0dXMgc3RhdHVzOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICAgICAgcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCi0gICAgICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCi0gICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL2Rlc2MpKQotICAgICAgICAgICAgICAgICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKLSAgICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKLSAgICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIGRlc2MpOworICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIHByb3ZpZGVyLT5tVmVuZG9yVGFnRGVzY3JpcHRvcik7CiAgICAgfQogCiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0NhY2hlKHRhZ0NhY2hlKTsKQEAgLTI3NiwxMCArMjc2LDMwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld1N0YXRlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBBTE9HVigiJXM6IE5vdGlmeWluZyAlcyBmb3IgbmV3IHN0YXRlIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgbmV3U3RhdGUpOworICAgICAgICBzdGF0dXNfdCBzaW5nbGVSZXMgPSBwcm92aWRlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgaWYgKHNpbmdsZVJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbm90aWZ5IHByb3ZpZGVyICVzIGFib3V0IGRldmljZSBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmVzID0gc2luZ2xlUmVzOworICAgICAgICAgICAgLy8gY29udGludWUgdG8gZG8gdGhlIHJlc3Qgb2YgdGhlIHByb3ZpZGVycyBpbnN0ZWFkIG9mIHJldHVybmluZyBub3cKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMjg4LDEwICszMDgsMjIgQEAKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKICAgICBhdXRvICpkZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOwogCiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBkZXZpY2VJbmZvMy0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjaywgWyZzdGF0dXMsICZzZXNzaW9uXQorICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCiAgICAgICAgICAgICAoU3RhdHVzIHMsIGNvbnN0IHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+JiBjYW1lcmFTZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKQEAgLTI5OSw2ICszMzEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CkBAIC0zMDcsOSArMzQwLDkgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIGNvbnN0IHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zMTgsMjQgKzM1MSw5MSBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8xID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMSo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOworICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzEtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAqc2Vzc2lvbiA9IGRldmljZUluZm8xLT5tSW50ZXJmYWNlOworICAgICAgICAqc2Vzc2lvbiA9IGludGVyZmFjZTsKICAgICB9CiAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogfQogCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcikgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiU2F2aW5nIGNhbWVyYSBwcm92aWRlciAlcyBmb3IgY2FtZXJhIGRldmljZSAlcyIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmltYXJ5TWFwID0gJm1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfQorICAgIGF1dG8gaWQgPSBjYW1lcmFJZC5jX3N0cigpOworICAgICgqcHJpbWFyeU1hcClbaWRdID0gcHJvdmlkZXI7CisgICAgYXV0byBzZWFyY2ggPSBhbHRlcm5hdGVNYXAtPmZpbmQoaWQpOworICAgIGlmIChzZWFyY2ggIT0gYWx0ZXJuYXRlTWFwLT5lbmQoKSkgeworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBkZXZpY2UgJXMgaXMgdXNpbmcgYm90aCB0b3JjaCBtb2RlIGFuZCBjYW1lcmEgbW9kZSBzaW11bHRhbmVvdXNseS4gIgorICAgICAgICAgICAgICAgICJUaGF0IHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgZGV2aWNlICVzIGNvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXywgaWQpOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6cmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpIHsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIlJlbW92aW5nIGNhbWVyYSBkZXZpY2UgJXMiLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJvdmlkZXJNYXA7CisgICAgaWYgKHVzYWdlVHlwZSA9PSBEZXZpY2VNb2RlOjpUT1JDSCkgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdmlkZXJNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7CisgICAgYXV0byBzZWFyY2ggPSBwcm92aWRlck1hcC0+ZmluZChjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBpZiAoc2VhcmNoICE9IHByb3ZpZGVyTWFwLT5lbmQoKSkgeworICAgICAgICAvLyBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBJQ2FtZXJhUHJvdmlkZXIuIFRoaXMgaXMgc2FmZSB0byBkbyBpbW1lZGlhdGVseSAod2l0aG91dCBhbgorICAgICAgICAvLyBhZGRlZCBkZWxheSkgYmVjYXVzZSBod3NlcnZpY2VtYW5hZ2VyIGd1YXJhbnRlZXMgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIGZvciBhdCBsZWFzdCBmaXZlCisgICAgICAgIC8vIG1vcmUgc2Vjb25kcy4gIFdlIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW9yIHNvIHRoYXQgaWYgdGhlIHByb3ZpZGVyIGlzIHVucmVmZXJlbmNlZCBhbmQKKyAgICAgICAgLy8gdGhlbiByZWZlcmVuY2VkIGFnYWluIHF1aWNrbHksIHdlIGRvIG5vdCBsZXQgdGhlIEhBTCBleGl0IGFuZCB0aGVuIG5lZWQgdG8gaW1tZWRpYXRlbHkKKyAgICAgICAgLy8gcmVzdGFydCBpdC4gQW4gZXhhbXBsZSB3aGVuIHRoaXMgY291bGQgaGFwcGVuIGlzIHN3aXRjaGluZyBmcm9tIGEgZnJvbnQtZmFjaW5nIHRvIGEKKyAgICAgICAgLy8gcmVhci1mYWNpbmcgY2FtZXJhLiBJZiB0aGUgSEFMIHdlcmUgdG8gZXhpdCBkdXJpbmcgdGhlIGNhbWVyYSBzd2l0Y2gsIHRoZSBjYW1lcmEgY291bGQKKyAgICAgICAgLy8gYXBwZWFyIGphbmt5IHRvIHRoZSB1c2VyLgorICAgICAgICBwcm92aWRlck1hcC0+ZXJhc2UoY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEFza2VkIHRvIHJlbW92ZSByZWZlcmVuY2UgZm9yIGNhbWVyYSAlcywgYnV0IG5vIHJlZmVyZW5jZSB0byBpdCB3YXMgZm91bmQuIFRoaXMgIgorICAgICAgICAgICAgICAgICJjb3VsZCBtZWFuIHJlbW92ZVJlZiB3YXMgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBjYW1lcmEgSUQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIH0KK30KIAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9uUmVnaXN0cmF0aW9uKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIC8qZnFOYW1lKi8sCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgYm9vbCAvKnByZWV4aXN0aW5nKi8pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMzQ3LDYgKzQ0Nyw4IEBACiAgICAgICAgIGxpc3RlbmVyLT5vbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpOwogICAgIH0KIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+KCk7CiB9CiAKQEAgLTM5MiwzNSArNDk0LDU5NyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKLSAgICBib29sIGlzTG9naWNhbENhbSA9IGZhbHNlOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CiAKLSAgICBlbnRyeUNhcCA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDYXAuY291bnQ7ICsraSkgewogICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeUNhcC5kYXRhLnU4W2ldOwogICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgewotICAgICAgICAgICAgaXNMb2dpY2FsQ2FtID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFpc0xvZ2ljYWxDYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghbUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlJZHMgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5SWRzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKAorICAgICAgICAgICAgQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOwogICAgIGNvbnN0IHVpbnQ4X3QqIGlkcyA9IGVudHJ5SWRzLmRhdGEudTg7CiAgICAgc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5SWRzLmNvdW50OyArK2kpIHsKICAgICAgICAgaWYgKGlkc1tpXSA9PSAnXDAnKSB7CiAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gaSkgewotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLT5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CisgICAgICAgICAgICAgICAgbVBoeXNpY2FsSWRzLnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXJ0ID0gaSsxOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCkgeworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5Q2FwOworICAgIGVudHJ5Q2FwID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBpZiAoZW50cnlDYXAuY291bnQgIT0gMSkgeworICAgICAgICAvLyBEbyBOT1QgaGlkZSB0aGlzIGNhbWVyYSBkZXZpY2UgaWYgdGhlIGNhcGFiaWxpdGllcyBzcGVjaWZ5IGFueXRoaW5nIG1vcmUKKyAgICAgICAgLy8gdGhhbiBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZW50cnlDYXAuZGF0YS51OFswXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQTsKK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZFNpemVzKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqc2l6ZXMvKm91dCovKSB7CisgICAgaWYgKHNpemVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2NhbGVyRGltcyA9IGNoLmZpbmQodGFnKTsKKyAgICBpZiAoc2NhbGVyRGltcy5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gU2NhbGVyIGVudHJ5IGNvbnRhaW5zIDQgZWxlbWVudHMgKGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgdHlwZSkKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY2FsZXJEaW1zLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoc2NhbGVyRGltcy5kYXRhLmkzMltpXSA9PSBmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChzY2FsZXJEaW1zLmRhdGEuaTMyW2krM10gPT0KKyAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSkgeworICAgICAgICAgICAgICAgIHNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHNjYWxlckRpbXMuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJEaW1zLmRhdGEuaTMyW2krMl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER1cmF0aW9ucygKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHNpemVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHVyYXRpb25zLypvdXQqLykgeworICAgIGlmIChkdXJhdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBhdmFpbGFibGVEdXJhdGlvbnMgPSBjaC5maW5kKHRhZyk7CisgICAgaWYgKGF2YWlsYWJsZUR1cmF0aW9ucy5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRHVyYXRpb24gZW50cnkgY29udGFpbnMgNCBlbGVtZW50cyAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbikKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVEdXJhdGlvbnMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzaXplIDogc2l6ZXMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHdpZHRoID0gc3RkOjpnZXQ8MD4oc2l6ZSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBzdGQ6OmdldDwxPihzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpXSA9PSBmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2krMV0gPT0gd2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2krMl0gPT0gaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMtPnB1c2hfYmFjayhhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSszXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKSB7CisgICAgaWYgKChkeW5hbWljRGVwdGhEdXJhdGlvbnMgPT0gbnVsbHB0cikgfHwgKGRlcHRoRHVyYXRpb25zLnNpemUoKSAhPSBibG9iRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZGlyZWN0IHdheSB0byBjYWxjdWxhdGUgdGhlIGR5bmFtaWMgZGVwdGggc3RyZWFtIGR1cmF0aW9uLgorICAgIC8vIFByb2Nlc3NpbmcgdGltZSBvbiBjYW1lcmEgc2VydmljZSBzaWRlIGNhbiB2YXJ5IGdyZWF0bHkgZGVwZW5kaW5nIG9uIG11bHRpcGxlCisgICAgLy8gdmFyaWFibGVzIHdoaWNoIGFyZSBub3QgdW5kZXIgb3VyIGNvbnRyb2wuIE1ha2UgYSBndWVzc3RpbWF0ZSBieSB0YWtpbmcgdGhlIG1heGltdW0KKyAgICAvLyBjb3JyZXNwb25kaW5nIGR1cmF0aW9uIHZhbHVlIGZyb20gZGVwdGggYW5kIGJsb2IuCisgICAgYXV0byBkZXB0aER1cmF0aW9uID0gZGVwdGhEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBhdXRvIGJsb2JEdXJhdGlvbiA9IGJsb2JEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBkeW5hbWljRGVwdGhEdXJhdGlvbnMtPnJlc2VydmUoZGVwdGhEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICB3aGlsZSAoKGRlcHRoRHVyYXRpb24gIT0gZGVwdGhEdXJhdGlvbnMuZW5kKCkpICYmIChibG9iRHVyYXRpb24gIT0gYmxvYkR1cmF0aW9ucy5lbmQoKSkpIHsKKyAgICAgICAgZHluYW1pY0RlcHRoRHVyYXRpb25zLT5wdXNoX2JhY2soc3RkOjptYXgoKmRlcHRoRHVyYXRpb24sICpibG9iRHVyYXRpb24pKTsKKyAgICAgICAgZGVwdGhEdXJhdGlvbisrOyBibG9iRHVyYXRpb24rKzsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBibG9iU2l6ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgZGVwdGhTaXplcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpkeW5hbWljRGVwdGhTaXplcyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmludGVybmFsRGVwdGhTaXplcyAvKm91dCovKSB7CisgICAgaWYgKGR5bmFtaWNEZXB0aFNpemVzID09IG51bGxwdHIgfHwgaW50ZXJuYWxEZXB0aFNpemVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZSBkeW5hbWljIGRlcHRoIHNwZWMuIGRvZXMgbm90IG1lbnRpb24gaG93IGNsb3NlIHRoZSBBUiByYXRpbyBzaG91bGQgYmUuCisgICAgLy8gVHJ5IHVzaW5nIHNvbWV0aGluZyBhcHByb3ByaWF0ZS4KKyAgICBmbG9hdCBBUlRvbGVyYW5jZSA9IGtEZXB0aEFSVG9sZXJhbmNlOworCisgICAgZm9yIChjb25zdCBhdXRvJiBibG9iU2l6ZSA6IGJsb2JTaXplcykgeworICAgICAgICBmbG9hdCBqcGVnQVIgPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHN0ZDo6Z2V0PDA+KGJsb2JTaXplKSkgLworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OmdldDwxPihibG9iU2l6ZSkpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGVwdGhTaXplIDogZGVwdGhTaXplcykgeworICAgICAgICAgICAgaWYgKGRlcHRoU2l6ZSA9PSBibG9iU2l6ZSkgeworICAgICAgICAgICAgICAgIGludGVybmFsRGVwdGhTaXplcy0+cHVzaF9iYWNrKGRlcHRoU2l6ZSk7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEFSID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChzdGQ6OmdldDwwPihkZXB0aFNpemUpKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OmdldDwxPihkZXB0aFNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmYWJzKGpwZWdBUiAtIGRlcHRoQVIpIDw9IEFSVG9sZXJhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsRGVwdGhTaXplcy0+cHVzaF9iYWNrKGRlcHRoU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBkeW5hbWljRGVwdGhTaXplcy0+cHVzaF9iYWNrKGJsb2JTaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCkgeworICAgIHN0YXRpYyBib29sIGxpYnJhcnlQcmVzZW50ID0gZmFsc2U7CisgICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuIGxpYnJhcnlQcmVzZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkKiBkZXB0aExpYkhhbmRsZSA9IGRsb3BlbihjYW1lcmEzOjprRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgaWYgKGRlcHRoTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gcHJvY2Vzc0Z1bmMgPSBkbHN5bShkZXB0aExpYkhhbmRsZSwgY2FtZXJhMzo6a0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pOworICAgIGlmIChwcm9jZXNzRnVuYyAhPSBudWxscHRyKSB7CisgICAgICAgIGxpYnJhcnlQcmVzZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaWJyYXJ5UHJlc2VudCA9IGZhbHNlOworICAgIH0KKyAgICBkbGNsb3NlKGRlcHRoTGliSGFuZGxlKTsKKworICAgIHJldHVybiBsaWJyYXJ5UHJlc2VudDsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjphZGREeW5hbWljRGVwdGhUYWdzKCkgeworICAgIHVpbnQzMl90IGRlcHRoRXhjbFRhZyA9IEFORFJPSURfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFOworICAgIHVpbnQzMl90IGRlcHRoU2l6ZXNUYWcgPSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKKyAgICAgICAgICAgIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCBpbnRlcm5hbERlcHRoU2l6ZXM7CisgICAgYXV0byBjaFRhZ3MgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgaWYgKGNoVGFncy5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogU3VwcG9ydGVkIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaXMgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBib29sIGlzRGVwdGhFeGNsdXNpdmVQcmVzZW50ID0gc3RkOjpmaW5kKGNoVGFncy5kYXRhLmkzMiwgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50LAorICAgICAgICAgICAgZGVwdGhFeGNsVGFnKSAhPSAoY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50KTsKKyAgICBib29sIGlzRGVwdGhTaXplUHJlc2VudCA9IHN0ZDo6ZmluZChjaFRhZ3MuZGF0YS5pMzIsIGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCwKKyAgICAgICAgICAgIGRlcHRoU2l6ZXNUYWcpICE9IChjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIGlmICghKGlzRGVwdGhFeGNsdXNpdmVQcmVzZW50ICYmIGlzRGVwdGhTaXplUHJlc2VudCkpIHsKKyAgICAgICAgLy8gTm8gZGVwdGggc3VwcG9ydCwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYXV0byBkZXB0aEV4Y2x1c2l2ZUVudHJ5ID0gYy5maW5kKGRlcHRoRXhjbFRhZyk7CisgICAgaWYgKGRlcHRoRXhjbHVzaXZlRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGlmIChkZXB0aEV4Y2x1c2l2ZUVudHJ5LmRhdGEudThbMF0gIT0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkVfRkFMU0UpIHsKKyAgICAgICAgICAgIC8vIERlcHRoIHN1cHBvcnQgaXMgZXhjbHVzaXZlLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEFkdmVydGlzZWQgZGVwdGggZXhjbHVzaXZlIHRhZyBidXQgdmFsdWUgaXMgbm90IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWRTaXplcyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBIQUxfUElYRUxfRk9STUFUX0JMT0IsCisgICAgICAgICAgICAmc3VwcG9ydGVkQmxvYlNpemVzKTsKKyAgICBnZXRTdXBwb3J0ZWRTaXplcyhjLCBkZXB0aFNpemVzVGFnLCBIQUxfUElYRUxfRk9STUFUX1kxNiwgJnN1cHBvcnRlZERlcHRoU2l6ZXMpOworICAgIGlmIChzdXBwb3J0ZWRCbG9iU2l6ZXMuZW1wdHkoKSB8fCBzdXBwb3J0ZWREZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpbiB0aGlzIGNhc2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcyhzdXBwb3J0ZWRCbG9iU2l6ZXMsIHN1cHBvcnRlZERlcHRoU2l6ZXMsCisgICAgICAgICAgICAmc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZpbnRlcm5hbERlcHRoU2l6ZXMpOworICAgIGlmIChzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmKCFpc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpKSB7CisgICAgICAgIC8vIERlcHRoIHBob3RvIHByb2Nlc3NpbmcgbGlicmFyeSBpcyBub3QgcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZHluYW1pY0RlcHRoRW50cmllczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMpIHsKKyAgICAgICAgaW50MzJfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPihpdCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwxPihpdCkpLAorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUIH07CisgICAgICAgIGR5bmFtaWNEZXB0aEVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aEVudHJpZXMuZW5kKCksIGVudHJ5LCBlbnRyeSArIDQpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGRlcHRoTWluRHVyYXRpb25zLCBkZXB0aFN0YWxsRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGJsb2JNaW5EdXJhdGlvbnMsIGJsb2JTdGFsbER1cmF0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMsIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zOworCisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwgaW50ZXJuYWxEZXB0aFNpemVzLCAmZGVwdGhNaW5EdXJhdGlvbnMpOworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZibG9iTWluRHVyYXRpb25zKTsKKyAgICBpZiAoYmxvYk1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8IGRlcHRoTWluRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkZXB0aE1pbkR1cmF0aW9ucy5zaXplKCkgIT0gYmxvYk1pbkR1cmF0aW9ucy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBudW1iZXIgb2YgYXZhaWxhYmxlIGRlcHRoIG1pbiBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlcHRoTWluRHVyYXRpb25zLnNpemUoKSwgYmxvYk1pbkR1cmF0aW9ucy5zaXplKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwgaW50ZXJuYWxEZXB0aFNpemVzLCAmZGVwdGhTdGFsbER1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYlN0YWxsRHVyYXRpb25zKTsKKyAgICBpZiAoYmxvYlN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhTdGFsbER1cmF0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAoZGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCkgIT0gYmxvYlN0YWxsRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggc3RhbGwgZHVyYXRpb25zISAlenUgdnMuICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSwgYmxvYlN0YWxsRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGRlcHRoTWluRHVyYXRpb25zLCBibG9iTWluRHVyYXRpb25zLAorICAgICAgICAgICAgJmR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGRlcHRoU3RhbGxEdXJhdGlvbnMsIGJsb2JTdGFsbER1cmF0aW9ucywKKyAgICAgICAgICAgICZkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucyk7CisgICAgaWYgKGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpICE9IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBkeW5hbWljIGRlcHRoIHN0YWxsL21pbiBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5zaXplKCksIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzOworICAgIGF1dG8gaXREdXJhdGlvbiA9IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5iZWdpbigpOworICAgIGF1dG8gaXRTaXplID0gc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXREdXJhdGlvbiAhPSBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaW50NjRfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPigqaXRTaXplKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KCppdFNpemUpKSwgKml0RHVyYXRpb259OworICAgICAgICBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5lbmQoKSwgZW50cnksCisgICAgICAgICAgICAgICAgZW50cnkgKyA0KTsKKyAgICAgICAgaXREdXJhdGlvbisrOyBpdFNpemUrKzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllczsKKyAgICBpdER1cmF0aW9uID0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBpdFNpemUgPSBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5iZWdpbigpOworICAgIHdoaWxlIChpdER1cmF0aW9uICE9IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLmVuZCgpKSB7CisgICAgICAgIGludDY0X3QgZW50cnlbNF0gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MD4oKml0U2l6ZSkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwxPigqaXRTaXplKSksICppdER1cmF0aW9ufTsKKyAgICAgICAgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLmVuZCgpLCBlbnRyeSwKKyAgICAgICAgICAgICAgICBlbnRyeSArIDQpOworICAgICAgICBpdER1cmF0aW9uKys7IGl0U2l6ZSsrOworICAgIH0KKworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aEVudHJpZXMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuc2l6ZSgpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN1cHBvcnRlZENoVGFnczsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucmVzZXJ2ZShjaFRhZ3MuY291bnQgKyAzKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MuaW5zZXJ0KHN1cHBvcnRlZENoVGFncy5lbmQoKSwgY2hUYWdzLmRhdGEuaTMyLAorICAgICAgICAgICAgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50KTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgc3VwcG9ydGVkQ2hUYWdzLmRhdGEoKSwKKyAgICAgICAgICAgIHN1cHBvcnRlZENoVGFncy5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICAvLyBPdmVycmlkZSBzdGF0aWMgbWV0YWRhdGEgZm9yIE1PTk9DSFJPTUUgY2FtZXJhIHdpdGggb2xkZXIgZGV2aWNlIHZlcnNpb24KKyAgICBpZiAobVZlcnNpb24uZ2V0X21ham9yKCkgPT0gMyAmJiBtVmVyc2lvbi5nZXRfbWlub3IoKSA8IDUpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNhcCA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjYXAuZGF0YS51OFtpXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKKyAgICAgICAgICAgICAgICB1aW50OF90IGNmYSA9IEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk87CisgICAgICAgICAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQsICZjZmEsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIENPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHNLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVxS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVxS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHJlc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9HUkVFTl9TUExJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHJlc0tleXMsIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IGMuZmluZChBTkRST0lEX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMTsgaiA8IGJsRW50cnkuY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBibEVudHJ5LmRhdGEuaTMyW2pdID0gYmxFbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpyZW1vdmVBdmFpbGFibGVLZXlzKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgYywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBrZXlzLCB1aW50MzJfdCBrZXlUYWcpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBrZXlzRW50cnkgPSBjLmZpbmQoa2V5VGFnKTsKKyAgICBpZiAoa2V5c0VudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCB0YWcgJXU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIGtleVRhZywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHZLZXlzOworICAgIHZLZXlzLnJlc2VydmUoa2V5c0VudHJ5LmNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXNFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoa2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpLCBrZXlzRW50cnkuZGF0YS5pMzJbaV0pID09IGtleXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHZLZXlzLnB1c2hfYmFjayhrZXlzRW50cnkuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IGMudXBkYXRlKGtleVRhZywgdktleXMuZGF0YSgpLCB2S2V5cy5zaXplKCkpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZmlsbEhlaWNTdHJlYW1Db21iaW5hdGlvbnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRwdXRzLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogZHVyYXRpb25zLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogc3RhbGxEdXJhdGlvbnMsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpIHsKKyAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyIHx8IGR1cmF0aW9ucyA9PSBudWxscHRyIHx8IHN0YWxsRHVyYXRpb25zID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBzdXBwb3J0SW5NZW1vcnlUZW1wRmlsZSA9CisgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKTsKKyAgICBpZiAoIXN1cHBvcnRJbk1lbW9yeVRlbXBGaWxlKSB7CisgICAgICAgIEFMT0dJKCIlczogTm8gSEVJQyBzdXBwb3J0IGR1ZSB0byBhYnNlbmNlIG9mIGluIG1lbW9yeSB0ZW1wIGZpbGUgc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsU3RyZWFtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpXTsKKyAgICAgICAgLy8gT25seSBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGFuZCBZVVZfODg4IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIEhFSUMKKyAgICAgICAgLy8gaW1hZ2UuCisgICAgICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAgICAgZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNpemVBdmFpbCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG91dHB1dHMtPnNpemUoKTsgais9IDQpIHsKKyAgICAgICAgICAgIGlmICgoKm91dHB1dHMpW2orMV0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdICYmCisgICAgICAgICAgICAgICAgICAgICgqb3V0cHV0cylbaisyXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0pIHsKKyAgICAgICAgICAgICAgICBzaXplQXZhaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaXplQXZhaWwpIGNvbnRpbnVlOworCisgICAgICAgIGludDY0X3Qgc3RhbGwgPSAwOworICAgICAgICBib29sIHVzZUhlaWMsIHVzZUdyaWQ7CisgICAgICAgIGlmIChjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKAorICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLAorICAgICAgICAgICAgICAgICZ1c2VIZWljLCAmdXNlR3JpZCwgJnN0YWxsKSkgeworICAgICAgICAgICAgaWYgKHVzZUdyaWQgIT0gKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhFSUMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaW50MzJfdCBjb25maWdbXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCAwIC8qaXNJbnB1dCovfTsKKyAgICAgICAgICAgIG91dHB1dHMtPmluc2VydChvdXRwdXRzLT5lbmQoKSwgY29uZmlnLCBjb25maWcgKyA0KTsKKworICAgICAgICAgICAgLy8gSEVJQyBtaW5GcmFtZUR1cmF0aW9uCisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhhbFN0cmVhbUR1cmF0aW9ucy5jb3VudDsgaiArPSA0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqXSA9PSBmb3JtYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqKzFdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orMl0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25bXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqKzNdfTsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25zLT5pbnNlcnQoZHVyYXRpb25zLT5lbmQoKSwgZHVyYXRpb24sIGR1cmF0aW9uKzQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhFSUMgc3RhbGxEdXJhdGlvbgorICAgICAgICAgICAgaW50NjRfdCBzdGFsbER1cmF0aW9uW10gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgc3RhbGx9OworICAgICAgICAgICAgc3RhbGxEdXJhdGlvbnMtPmluc2VydChzdGFsbER1cmF0aW9ucy0+ZW5kKCksIHN0YWxsRHVyYXRpb24sIHN0YWxsRHVyYXRpb24rNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmRlcml2ZUhlaWNUYWdzKCkgeworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGhhbEhlaWNTdXBwb3J0ID0gYy5maW5kKEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCk7CisgICAgaWYgKGhhbEhlaWNTdXBwb3J0LmNvdW50ID4gMSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgZW50cnkgY291bnQgJXp1IGZvciBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURUQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGFsSGVpY1N1cHBvcnQuY291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoaGFsSGVpY1N1cHBvcnQuY291bnQgPT0gMCB8fAorICAgICAgICAgICAgaGFsSGVpY1N1cHBvcnQuZGF0YS51OFswXSA9PSBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURURfRkFMU0UpIHsKKyAgICAgICAgLy8gQ2FtZXJhIEhBTCBkb2Vzbid0IHN1cHBvcnQgbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgZm9yIEhFSUMuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWF4SnBlZ0FwcHNTZWdtZW50cyA9CisgICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UKTsKKyAgICBpZiAobWF4SnBlZ0FwcHNTZWdtZW50cy5jb3VudCAhPSAxIHx8IG1heEpwZWdBcHBzU2VnbWVudHMuZGF0YS51OFswXSA9PSAwIHx8CisgICAgICAgICAgICBtYXhKcGVnQXBwc1NlZ21lbnRzLmRhdGEudThbMF0gPiAxNikgeworICAgICAgICBBTE9HRSgiJXM6IEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCBtdXN0IGJlIHdpdGhpbiBbMSwgMTZdIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFBvcHVsYXRlIEhFSUMgb3V0cHV0IGNvbmZpZ3VyYXRpb25zIGFuZCBpdHMgcmVsYXRlZCBtaW4gZnJhbWUgZHVyYXRpb24KKyAgICAvLyBhbmQgc3RhbGwgZHVyYXRpb24uCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaGVpY091dHB1dHM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaGVpY0R1cmF0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBoZWljU3RhbGxEdXJhdGlvbnM7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1pbkZyYW1lRHVyYXRpb25zID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucygmaGVpY091dHB1dHMsICZoZWljRHVyYXRpb25zLCAmaGVpY1N0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncywgbWluRnJhbWVEdXJhdGlvbnMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmlsbCBIRUlDIHN0cmVhbSBjb21iaW5hdGlvbnM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgaGVpY091dHB1dHMuZGF0YSgpLCBoZWljT3V0cHV0cy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgaGVpY0R1cmF0aW9ucy5kYXRhKCksIGhlaWNEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgaGVpY1N0YWxsRHVyYXRpb25zLmRhdGEoKSwgaGVpY1N0YWxsRHVyYXRpb25zLnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSAmJiBwaHlzaWNhbENhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICpwaHlzaWNhbENhbWVyYUlkcyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmE7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmE7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgeworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBjYW1lcmFJZCkgeworICAgICAgICAgICAgICAgIC8vIGNhbWVyYUlkIGlzIGZvdW5kIGluIHB1YmxpYyBjYW1lcmEgSURzIGFkdmVydGlzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZpbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIGlkICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsSWRzOworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5iZWdpbigpLCBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCkgIT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogV3JvbmcgZGV2aWNlVmVyc2lvbiAleCBmb3IgaGlkZGVuUGh5c2ljYWxDYW1lcmFJZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbiwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsIGJvb2wgZXhwZWN0ZWQpIHsKQEAgLTQ0NSw5ICsxMTA5LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0KLSAgICAgICAgICAgIG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIGludGVyZmFjZSwgdGhpcyk7Ci0gICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKCk7CisgICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCB0aGlzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBwcm92aWRlckluZm8tPmluaXRpYWxpemUoaW50ZXJmYWNlLCBtRGV2aWNlU3RhdGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC00NTgsNiArMTEyMSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6cmVtb3ZlUHJvdmlkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiByZW1vdmVkRGV2aWNlSWRzOwogICAgIHN0YXR1c190IHJlcyA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtNDk4LDI3ICsxMTYyLDM2IEBACiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpQcm92aWRlckluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCiAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcikgOgogICAgICAgICBtUHJvdmlkZXJOYW1lKHByb3ZpZGVyTmFtZSksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKICAgICAgICAgbVByb3ZpZGVyVGFnaWQoZ2VuZXJhdGVWZW5kb3JUYWdJZChwcm92aWRlck5hbWUpKSwKICAgICAgICAgbVVuaXF1ZURldmljZUNvdW50KDApLAogICAgICAgICBtTWFuYWdlcihtYW5hZ2VyKSB7CiAgICAgKHZvaWQpIG1NYW5hZ2VyOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgpIHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IGN1cnJlbnREZXZpY2VTdGF0ZSkgewogICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisKKyAgICAvLyBEZXRlcm1pbmUgbWlub3IgdmVyc2lvbgorICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIG1NaW5vclZlcnNpb24gPSA1OworICAgIH0gZWxzZSB7CisgICAgICAgIG1NaW5vclZlcnNpb24gPSA0OworICAgIH0KKwogICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCiAgICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbUludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTUzMCw3ICsxMjAzLDcgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAotICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gbUludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOworICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CiAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTU0MCwxNSArMTIxMyw0MiBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKICAgICB9CiAKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoY3VycmVudERldmljZVN0YXRlKTsKKworICAgIHJlcyA9IHNldFVwVmVuZG9yVGFncygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIC8vIEdldCBpbml0aWFsIGxpc3Qgb2YgY2FtZXJhIGRldmljZXMsIGlmIGFueQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCAmZGV2aWNlc10oCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAogICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7CiAgICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOwogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FtZXJhRGV2aWNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhjYW1lcmFEZXZpY2VOYW1lc1tpXSk7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG5hbWUgOiBjYW1lcmFEZXZpY2VOYW1lcykgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBwYXJzaW5nIGRldmljZU5hbWU6ICVzOiAlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CkBAIC01NjIsMTEgKzEyNjIsMjQgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAorICAgIHJldCA9IGludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCisgICAgICAgIFt0aGlzXShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOworCiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CiAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGlkOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLCBjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZW51bWVyYXRlIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNTgxLDYgKzEyOTQsNTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnRQcm92aWRlckludGVyZmFjZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCJSZXF1ZXN0IHRvIHN0YXJ0IGNhbWVyYSBwcm92aWRlcjogJXMiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbVNhdmVkSW50ZXJmYWNlOworICAgIH0KKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIEFMT0dFKCJCYWQgcHJvdmlkZXIgc3RhdGUhIFNob3VsZCBub3QgYmUgaGVyZSBvbiBhIG5vbi1sYXp5IEhBTCEiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBpbnRlcmZhY2UgPSBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSBIQUwgcHJvdmlkZXIgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tU2VydmljZVByb3h5LT5nZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUpOworICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOworICAgICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmICghbGlua2VkKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogSW5pdGlhbCBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCAlIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyICglcykgYWxyZWFkeSBpbiB1c2UuIFJlLXVzaW5nIGluc3RhbmNlLiIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKIGNvbnN0IHN0ZDo6c3RyaW5nJiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0VHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbVR5cGU7CiB9CkBAIC02NjEsOCArMTQyMSwxMCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBjb25zdCB7Ci0gICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLjQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAorICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi4lZCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtTWlub3JWZXJzaW9uLAorICAgICAgICAgICAgbUlzUmVtb3RlID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAogICAgICAgICAgICAgbURldmljZXMuc2l6ZSgpKTsKIAogICAgIGZvciAoYXV0byYgZGV2aWNlIDogbURldmljZXMpIHsKQEAgLTcwMyw2ICsxNDY1LDI0IEBACiAgICAgICAgICAgICBpbmZvMi5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIER1bXAgY2hhcmFjdGVyaXN0aWNzIG9mIG5vbi1zdGFuZGFsb25lIHBoeXNpY2FsIGNhbWVyYQorICAgICAgICBpZiAoZGV2aWNlLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlLT5tUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHBoeXNpY2FsIGlkIGlzIGFuIGluZGVwZW5kZW50IGNhbWVyYQorICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxJbmZvOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsICZwaHlzaWNhbEluZm8pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgUGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczpcbiIsIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbEluZm8uZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBIQUwgZGV2aWNlICVzICh2JWQuJWQpIGR1bXBTdGF0ZTogPT1cbiIsIGRldmljZS0+bU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBkZXZpY2UtPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2UtPm1WZXJzaW9uLmdldF9taW5vcigpKTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5kdW1wU3RhdGUoZmQpOwpAQCAtNzcyLDYgKzE1NTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKICAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OICE9IG5ld1N0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKERldmljZU1vZGU6OlRPUkNILCBpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MDAsMTUgKzE1ODMsNzUgQEAKICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAorICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7CisgICAgICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCh2dHMsIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRlKSB7CisgICAgbURldmljZVN0YXRlID0gbmV3RGV2aWNlU3RhdGU7CisgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICAgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CiAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemVEZXZpY2VJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKIAogICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0KLSAgICAgICAgICAgIGdldERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CiAgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKIAogICAgIENhbWVyYVJlc291cmNlQ29zdCByZXNvdXJjZUNvc3Q7CkBAIC04MzUsMTMgKzE2NzgsMTMgQEAKICAgICB9CiAKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+KAotICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UpKTsKKyAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsIHRoaXMsCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLCBjYW1lcmFJbnRlcmZhY2UpKTsKIH0KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHNwPEludGVyZmFjZVQ+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5rbm93biBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIEludGVyZmFjZVQ6OnZlcnNpb24uZ2V0X21ham9yKCkpOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtODQ5LDEyICsxNjkyLDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTg3NCwxMiArMTcyMSwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC05MDAsNiArMTc1MSwxOCBAQAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86On5EZXZpY2VJbmZvKCkge30KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KK3NwPEludGVyZmFjZVQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKKyAgICBzcDxJbnRlcmZhY2VUPiBkZXZpY2U7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV2aWNlID0gbVBhcmVudFByb3ZpZGVyLT5zdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPihtTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlID0gKEludGVyZmFjZVQgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsCiAgICAgICAgIGJvb2wgZW5hYmxlZCkgewogICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7CkBAIC05MTAsMzAgKzE3NzMsMzEgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIC8vIFJlcXVpcmVzIHBvd2VyaW5nIG9uIHRoZSBjYW1lcmEgZGV2aWNlCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihudWxscHRyKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9wZW4gY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKICAgICAgICAgICAgICAgICBtRGVmYXVsdFBhcmFtZXRlcnMudW5mbGF0dGVuKFN0cmluZzgocGFybXMuY19zdHIoKSkpOwogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgcmVhZGluZyBjYW1lcmEgZGV2aWNlICVzIHBhcmFtcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQpAQCAtOTQyLDI3ICsxODA2LDQzIEBACiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOwogICAgIH0KIAotICAgIHJldCA9IG1JbnRlcmZhY2UtPmNsb3NlKCk7CisgICAgc3RhdHVzX3QgcmVzID0gY2FjaGVDYW1lcmFJbmZvKGludGVyZmFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBjYWNoZSBDYW1lcmFJbmZvIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldCA9IGludGVyZmFjZS0+Y2xvc2UoKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjbG9zaW5nIGNhbWVyYSBkZXZpY2UgJXMgYWZ0ZXIgY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKICAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6fkRldmljZUluZm8xKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmdldENhbWVyYUluZm8oCiAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCB7CiAgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAqaW5mbyA9IG1JbmZvOworICAgIHJldHVybiBPSzsKK30KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpjYWNoZUNhbWVyYUluZm8oCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY0luZm87CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjSW5mbyA9IGNhbUluZm87CiAgICAgICAgICAgICB9KTsKQEAgLTk3NywyNyArMTg1NywzMSBAQAogCiAgICAgc3dpdGNoKGNJbmZvLmZhY2luZykgewogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpCQUNLOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RVhURVJOQUw6CiAgICAgICAgICAgICAvLyBNYXAgZXh0ZXJuYWwgdG8gZnJvbnQgZm9yIGxlZ2FjeSBBUEkKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RlJPTlQ6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiJXM6IERldmljZSAlczogVW5rbm93biBjYW1lcmEgZmFjaW5nOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIGNJbmZvLmZhY2luZyk7Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICB9Ci0gICAgaW5mby0+b3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKKyAgICBtSW5mby5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFzLmlzT2soKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMDA5LDE0ICsxODkzLDE1IEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewpAQCAtMTAzNSwxNSArMTkyMCwzNSBAQAogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCi0gICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgbUlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSA9IGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBzdGF0ID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSBzdGF0KSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0KSwKKyAgICAgICAgICAgICAgICBzdGF0KTsKKyAgICB9CisgICAgcmVzID0gZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KICAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKICAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgpAQCAtMTA1MiwxMiArMTk1Nyw3MSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKICAgICB9CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBVbmFibGUgdG8gY29udmVydCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIHZlcnNpb24gMy41IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb252ZXJ0ZWQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGZvciAoYXV0byYgaWQgOiBtUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgaGlkbElkKGlkKTsKKyAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGhpZGxJZCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpZCwgdGhpc10oU3RhdHVzIHMsIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6fkRldmljZUluZm8zKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldENhbWVyYUluZm8oCkBAIC0xMTA4LDEwICsyMDcyLDE0IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBhdXRvIHJldCA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTExMjcsNiArMjA5NSw2MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKHBoeXNpY2FsQ2FtZXJhSWQpID09CisgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuYXQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKworICAgIGNvbnN0IHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0KKyAgICAgICAgICAgIHRoaXMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgU3RhdHVzIGNhbGxTdGF0dXM7CisgICAgYXV0byByZXQgPSAgaW50ZXJmYWNlXzNfNS0+aXNTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgWyZjYWxsU3RhdHVzLCAmc3RhdHVzXSAoU3RhdHVzIHMsIGJvb2wgY29tYlN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpzdGF0dXMgPSBjb21iU3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY2FzZSwgZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICp0eXBlLCB1aW50MzJfdCAqaWQpIHsKICAgICAvLyBGb3JtYXQgbXVzdCBiZSAiPHR5cGU+LzxpZD4iCkBAIC0xMzY5LDcgKzIzOTIsNyBAQAogCiAKIHN0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKIApAQCAtMTM5Nyw3ICsyNDIwLDcgQEAKIAogICAgIGludCBpZHggPSAwOwogICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7Ci0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOwogICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKICAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKQEAgLTE0NTgsMTAgKzI0ODEsMjAgQEAKIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7Ci0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NCwwfSk7Ci0gICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOworICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIH0KIAotICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAvLyBGaW5kIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQpIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKApAQCAtMTQ3MCwyMCArMjUwMywxNCBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gcmVtb3ZlZElkczsKIAogICAgIGZvciAoYXV0byYgZGV2aWNlSWQgOiBkZXZpY2VJZHMpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGRldmljZUlkLCAmaW5mbyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGRldmljZUlkKTsKKyAgICAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgY29udGludWU7CiAKLSAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShpbmZvLCAmaWRDb21ibyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSkgeworICAgICAgICBpZiAoIWRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIC8vIGlkQ29tYm8gY29udGFpbnMgdGhlIGlkcyBvZiBhIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRDb21ibyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKICAgICAgICAgaWRDb21iby5wdXNoX2JhY2soZGV2aWNlSWQpOwogCiAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2VJZHMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAppbmRleCBiOGI4YjhjLi5hNDJmYjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSAogCiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0yNyw4ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi40L0lDYW1lcmFQcm92aWRlci5oPgotLy8jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi40L0lDYW1lcmFQcm92aWRlckNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNS9JQ2FtZXJhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTm90aWZpY2F0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIApAQCAtMTEwLDYgKzExMSwxNCBAQAogICAgIH07CiAKICAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBtb2RlIGEgY2FtZXJhIGRldmljZSBpcyBjdXJyZW50bHkgaW4KKyAgICAgKi8KKyAgICBlbnVtIGNsYXNzIERldmljZU1vZGUgeworICAgICAgICBUT1JDSCwKKyAgICAgICAgQ0FNRVJBCisgICAgfTsKKworICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgdGhlIG1hbmFnZXIgYW5kIGdpdmUgaXQgYSBzdGF0dXMgbGlzdGVuZXI7IG9wdGlvbmFsbHkgYWNjZXB0cyBhIHNlcnZpY2UKICAgICAgKiBpbnRlcmFjdGlvbiBwcm94eS4KICAgICAgKgpAQCAtMTY2LDYgKzE3NSwxMyBAQAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgorICAgICAqLworICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBkZXZpY2UgaW50ZXJmYWNlIHZlcnNpb24gZm9yIHRoaXMgSUQKICAgICAgKi8KICAgICBzdGF0dXNfdCBnZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCkBAIC0xNzQsNyArMTkwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydCBzZXRUb3JjaE1vZGUgQVBJLgogICAgICAqLwotICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpOworICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNobGlnaHQgb24gYSBnaXZlbiBjYW1lcmEgZGV2aWNlLgpAQCAtMTg5LDYgKzIwNSwxMiBAQAogICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOwogCiAgICAgLyoqCisgICAgICogSW5mb3JtIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIGFib3V0IGEgZGV2aWNlIHN0YXRlIGNoYW5nZSwgc3VjaCBhcyBmb2xkaW5nIG9yIHVuZm9sZGluZworICAgICAqLworICAgIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld1N0YXRlKTsKKworICAgIC8qKgogICAgICAqIE9wZW4gYW4gYWN0aXZlIHNlc3Npb24gdG8gYSBjYW1lcmEgZGV2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBmdWxseSBwb3dlcnMgb24gdGhlIGNhbWVyYSBkZXZpY2UgaGFyZHdhcmUsIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEKQEAgLTIwNSw2ICsyMjcsMTcgQEAKICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pOwogCiAgICAgLyoqCisgICAgICogU2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgb3IgdG9yY2ggY2xpZW50CisgICAgICovCisgICAgdm9pZCBzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcik7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhhdCB0aGUgY2FtZXJhIG9yIHRvcmNoIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIGNsaWVudAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCisgICAgLyoqCiAgICAgICogSVNlcnZpY2VOb3RpZmljYXRpb246Om9uUmVnaXN0cmF0aW9uCiAgICAgICogSW52b2tlZCBieSB0aGUgaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIHdoZW4gYSBuZXcgY2FtZXJhIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKICAgICAgKi8KQEAgLTIzMSwxMiArMjY0LDE1IEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEwMDAsMH0pIGNvbnN0OwogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSB3aXRoIHN0YXRpY0luZm8gaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCisgICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCiAgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMuCiAgICAgICovCi0gICAgc3RhdGljIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIGJvb2wgaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7CisgICAgYm9vbCBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQga0RlcHRoQVJUb2xlcmFuY2U7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwpAQCAtMjQ2LDIyICsyODIsNTcgQEAKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OwogCisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgLy8gbVByb3ZpZGVyTGlmZWN5Y2xlTG9jayBpcyBsb2NrZWQgZHVyaW5nIG9uUmVnaXN0cmF0aW9uIGFuZCByZW1vdmVQcm92aWRlcgorICAgIG11dGFibGUgc3RkOjptdXRleCBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrOworCiAgICAgc3RhdGljIEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk7CiAKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIGNhbWVyYQorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciB0b3JjaAorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCisgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOworCiAgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6CiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKICAgICB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1JbnRlcmZhY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOworICAgICAgICBpbnQgbU1pbm9yVmVyc2lvbjsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gbVZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGJvb2wgbVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgYm9vbCBtSXNSZW1vdGU7CisKKyAgICAgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG1EZXZpY2VTdGF0ZTsKKworICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtU2F2ZWRJbnRlcmZhY2U7CiAKICAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOwogICAgICAgICB+UHJvdmlkZXJJbmZvKCk7CiAKLSAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKIAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZSgpIGNvbnN0OwogCkBAIC0yODMsODQgKzM1NCwxNzMgQEAKICAgICAgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgb3ZlcnJpZGU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciB0aGlzIHByb3ZpZGVyCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5IHByb3ZpZGVyIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VTdGF0ZSk7CisKICAgICAgICAgLy8gQmFzaWMgZGV2aWNlIGluZm9ybWF0aW9uLCBjb21tb24gdG8gYWxsIGNhbWVyYSBkZXZpY2VzCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgLy8gRnVsbCBpbnN0YW5jZSBuYW1lCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uOwogICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgICAgICBib29sIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOworICAgICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gbUluZm87CisgICAgICAgICAgICBzcDxJQmFzZT4gbVNhdmVkSW50ZXJmYWNlOworICAgICAgICAgICAgYm9vbCBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhID0gZmFsc2U7CiAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7CiAKKyAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gbVBhcmVudFByb3ZpZGVyOworCiAgICAgICAgICAgICBib29sIGhhc0ZsYXNoVW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGbGFzaFVuaXQ7IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqIC8qc3RhdHVzKi8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0KSA6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyKSA6CiAgICAgICAgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtSWQoaWQpLCBtVmVyc2lvbih2ZXJzaW9uKSwgbVByb3ZpZGVyVGFnaWQodGFnSWQpLAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCisgICAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLCBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAotICAgICAgICAgICAgICAgICAgICBtSGFzRmxhc2hVbml0KGZhbHNlKSB7fQorICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtSGFzRmxhc2hVbml0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCk7CiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGJvb2wgbUhhc0ZsYXNoVW5pdDsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbVB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KICAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLCBib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlRm9yRGV2aWNlKGJvb2wgZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHNhdmUgdGhlIElDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2FzCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoKSwgd2hpY2ggZG9lcyBzYXZlIGl0LgorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShpbnRlcmZhY2UsIGVuYWJsZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4+IG1EZXZpY2VzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIC8vIFRoZSBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzIHB1Ymxpc2hlZCBieSB0aGUgY2FtZXJhIHByb3ZpZGVyLgorICAgICAgICAvLyBDdXJyZW50bHkgbG9naWNhbCBtdWx0aS1jYW1lcmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWcgY2FtZXJhLgorICAgICAgICAvLyBBbmQgd2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMKKyAgICAgICAgLy8gYWR2ZXJ0aXNlZCBieSB0aGUgcHJvdmlkZXIsIGFuZCB0byBkaXN0aW5ndWlzaCBhZ2FpbnN0ICJoaWRkZW4iCisgICAgICAgIC8vIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgLy8gSEFMdjEtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzEgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzMiBtRGVmYXVsdFBhcmFtZXRlcnM7CisgICAgICAgICAgICBzdGF0dXNfdCBjYWNoZUNhbWVyYUluZm8oc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMygpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHZvaWQgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBkZXB0aER1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGJsb2JEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkeW5hbWljRGVwdGhEdXJhdGlvbnMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0aWMgYm9vbCBpc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgYmxvYlNpemVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGRlcHRoU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqZHluYW1pY0RlcHRoU2l6ZXMgLypvdXQqLywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICppbnRlcm5hbERlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdmFpbGFibGVLZXlzKENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleVRhZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucyhzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIGR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIHN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtRHVyYXRpb25zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlcml2ZUhlaWNUYWdzKCk7CiAgICAgICAgIH07CiAKICAgICBwcml2YXRlOgpAQCAtMzc4LDExICs1MzgsMTEgQEAKICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPiBpbml0aWFsaXplRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKTsKIAogICAgICAgICAvLyBIZWxwZXIgZm9yIGluaXRpYWxpemVEZXZpY2VJbmZvIHRvIHVzZSB0aGUgcmlnaHQgQ2FtZXJhUHJvdmlkZXIgZ2V0IG1ldGhvZC4KICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgc3A8SW50ZXJmYWNlVD4gZ2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKyAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOwogCiAgICAgICAgIC8vIFBhcnNlIHByb3ZpZGVyIGluc3RhbmNlIG5hbWUgZm9yIHR5cGUgYW5kIGlkCiAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKQEAgLTQxNiw2ICs1NzYsMTQgQEAKIAogICAgIHN0ZDo6dmVjdG9yPHNwPFByb3ZpZGVySW5mbz4+IG1Qcm92aWRlcnM7CiAKKyAgICB2b2lkIGFkZFByb3ZpZGVyVG9NYXAoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciwKKyAgICAgICAgICAgIGJvb2wgaXNUb3JjaFVzYWdlKTsKKyAgICB2b2lkIHJlbW92ZUNhbWVyYUlkRnJvbU1hcCgKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gJm1hcCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXZpY2VTdGF0dXNUb1N0cmluZygKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMmKTsKICAgICBzdGF0aWMgY29uc3QgY2hhciogdG9yY2hTdGF0dXNUb1N0cmluZygKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2MTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLURlcHRoUGhvdG9Qcm9jZXNzb3IiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vCisKKyNpbmNsdWRlICJEZXB0aFBob3RvUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2NhbWVyYS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhcy5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RpbWVuc2lvbi5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZHluYW1pY19kZXB0aC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9pbnQuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Bvc2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGVzLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLXN5c3RlbS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0V4aWZVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX2RhdGEuaD4KKyNpbmNsdWRlIDx4bXBtZXRhL3htcF93cml0ZXIuaD4KKwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNvbnRhaW5lcjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoRm9ybWF0OwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXA7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoVW5pdHM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2VQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEaW1lbnNpb247Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQb3NlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlByb2ZpbGVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0V4aWZPcmllbnRhdGlvbiBnZXRFeGlmT3JpZW50YXRpb24oY29uc3QgdW5zaWduZWQgY2hhciAqanBlZ0J1ZmZlciwgc2l6ZV90IGpwZWdCdWZmZXJTaXplKSB7CisgICAgaWYgKChqcGVnQnVmZmVyID09IG51bGxwdHIpIHx8IChqcGVnQnVmZmVyU2l6ZSA9PSAwKSkgeworICAgICAgICByZXR1cm4gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgfQorCisgICAgYXV0byBleGlmRGF0YSA9IGV4aWZfZGF0YV9uZXcoKTsKKyAgICBleGlmX2RhdGFfbG9hZF9kYXRhKGV4aWZEYXRhLCBqcGVnQnVmZmVyLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgRXhpZkVudHJ5ICpvcmllbnRhdGlvbiA9IGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZkRhdGEtPmlmZFtFWElGX0lGRF8wXSwKKyAgICAgICAgICAgIEVYSUZfVEFHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoKG9yaWVudGF0aW9uID09IG51bGxwdHIpIHx8IChvcmllbnRhdGlvbi0+c2l6ZSAhPSBzaXplb2YoRXhpZlNob3J0KSkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBPcmllbnRhdGlvbiBFWElGIGVudHJ5IGludmFsaWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZEYXRhKTsKKyAgICAgICAgcmV0dXJuIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIH0KKworICAgIGF1dG8gb3JpZW50YXRpb25WYWx1ZSA9IGV4aWZfZ2V0X3Nob3J0KG9yaWVudGF0aW9uLT5kYXRhLCBleGlmX2RhdGFfZ2V0X2J5dGVfb3JkZXIoZXhpZkRhdGEpKTsKKyAgICBFeGlmT3JpZW50YXRpb24gcmV0OworICAgIHN3aXRjaCAob3JpZW50YXRpb25WYWx1ZSkgeworICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICByZXQgPSBzdGF0aWNfY2FzdDxFeGlmT3JpZW50YXRpb24+IChvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIEVYSUYgb3JpZW50YXRpb24gdmFsdWU6ICVkLCBkZWZhdWx0aW5nIHRvIDAgZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICByZXQgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICB9CisKKyAgICBleGlmX2RhdGFfdW5yZWYoZXhpZkRhdGEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgZW5jb2RlR3JheXNjYWxlSnBlZyhzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHVpbnQ4X3QgKmluLCB2b2lkICpvdXQsCisgICAgICAgIGNvbnN0IHNpemVfdCBtYXhPdXRTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uLAorICAgICAgICBzaXplX3QgJmFjdHVhbFNpemUpIHsKKyAgICBzdGF0dXNfdCByZXQ7CisgICAgLy8gbGlianBlZyBpcyBhIEMgbGlicmFyeSBzbyB3ZSB1c2UgQy1zdHlsZSAiaW5oZXJpdGFuY2UiIGJ5CisgICAgLy8gcHV0dGluZyBsaWJqcGVnJ3MganBlZ19kZXN0aW5hdGlvbl9tZ3IgZmlyc3QgaW4gb3VyIGN1c3RvbQorICAgIC8vIHN0cnVjdC4gVGhpcyBhbGxvd3MgdXMgdG8gY2FzdCBqcGVnX2Rlc3RpbmF0aW9uX21nciogdG8KKyAgICAvLyBDdXN0b21KcGVnRGVzdE1nciogd2hlbiB3ZSBnZXQgaXQgcGFzc2VkIHRvIHVzIGluIGEgY2FsbGJhY2suCisgICAgc3RydWN0IEN1c3RvbUpwZWdEZXN0TWdyIDogcHVibGljIGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgICAgICAgSk9DVEVUICptQnVmZmVyOworICAgICAgICBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgICAgIHNpemVfdCBtRW5jb2RlZFNpemU7CisgICAgICAgIGJvb2wgbVN1Y2Nlc3M7CisgICAgfSBkbWdyOworCisgICAganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm8gPSB7fTsKKyAgICBqcGVnX2Vycm9yX21nciBqZXJyOworCisgICAgLy8gSW5pdGlhbGl6ZSBlcnJvciBoYW5kbGluZyB3aXRoIHN0YW5kYXJkIGNhbGxiYWNrcywgYnV0CisgICAgLy8gdGhlbiBvdmVycmlkZSBvdXRwdXRfbWVzc2FnZSAodG8gcHJpbnQgdG8gQUxPRykgYW5kCisgICAgLy8gZXJyb3JfZXhpdCB0byBzZXQgYSBmbGFnIGFuZCBwcmludCBhIG1lc3NhZ2UgaW5zdGVhZAorICAgIC8vIG9mIGtpbGxpbmcgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworCisgICAgY2luZm8uZXJyLT5vdXRwdXRfbWVzc2FnZSA9IFtdKGpfY29tbW9uX3B0ciBjaW5mbykgeworICAgICAgICBjaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgbWVzc2FnZSAqLworICAgICAgICAoKmNpbmZvLT5lcnItPmZvcm1hdF9tZXNzYWdlKShjaW5mbywgYnVmZmVyKTsKKyAgICAgICAgQUxPR0UoImxpYmpwZWcgZXJyb3I6ICVzIiwgYnVmZmVyKTsKKyAgICB9OworCisgICAgY2luZm8uZXJyLT5lcnJvcl9leGl0ID0gW10oal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgICAgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpKGNpbmZvKTsKKyAgICAgICAgaWYoY2luZm8tPmNsaWVudF9kYXRhKSB7CisgICAgICAgICAgICBhdXRvICYgZG1nciA9ICpzdGF0aWNfY2FzdDxDdXN0b21KcGVnRGVzdE1ncio+KGNpbmZvLT5jbGllbnRfZGF0YSk7CisgICAgICAgICAgICBkbWdyLm1TdWNjZXNzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTm93IHRoYXQgd2UgaW5pdGlhbGl6ZWQgc29tZSBjYWxsYmFja3MsIGxldCdzIGNyZWF0ZSBvdXIgY29tcHJlc3NvcgorICAgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisgICAgZG1nci5tQnVmZmVyID0gc3RhdGljX2Nhc3Q8Sk9DVEVUKj4ob3V0KTsKKyAgICBkbWdyLm1CdWZmZXJTaXplID0gbWF4T3V0U2l6ZTsKKyAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IDA7CisgICAgZG1nci5tU3VjY2VzcyA9IHRydWU7CisgICAgY2luZm8uY2xpZW50X2RhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJmRtZ3IpOworCisgICAgLy8gVGhlc2UgbGFtYmRhcyBiZWNvbWUgQy1zdHlsZSBmdW5jdGlvbiBwb2ludGVycyBhbmQgYXMgcGVyIEMrKzExIHNwZWMKKyAgICAvLyBtYXkgbm90IGNhcHR1cmUgYW55dGhpbmcuCisgICAgZG1nci5pbml0X2Rlc3RpbmF0aW9uID0gW10oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICAgICAgYXV0byAmIGRtZ3IgPSBzdGF0aWNfY2FzdDxDdXN0b21KcGVnRGVzdE1nciY+KCpjaW5mby0+ZGVzdCk7CisgICAgICAgIGRtZ3IubmV4dF9vdXRwdXRfYnl0ZSA9IGRtZ3IubUJ1ZmZlcjsKKyAgICAgICAgZG1nci5mcmVlX2luX2J1ZmZlciA9IGRtZ3IubUJ1ZmZlclNpemU7CisgICAgICAgIEFMT0dWKCIlczolZCBqcGVnIHN0YXJ0OiAlcCBbJXp1XSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUJ1ZmZlciwgZG1nci5tQnVmZmVyU2l6ZSk7CisgICAgfTsKKworICAgIGRtZ3IuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvIF9fdW51c2VkKSB7CisgICAgICAgIEFMT0dWKCIlczolZCBPdXQgb2YgYnVmZmVyIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisKKyAgICBkbWdyLnRlcm1fZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5tRW5jb2RlZFNpemUgPSBkbWdyLm1CdWZmZXJTaXplIC0gZG1nci5mcmVlX2luX2J1ZmZlcjsKKyAgICAgICAgQUxPR1YoIiVzOiVkIERvbmUgd2l0aCBqcGVnOiAlenUiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBkbWdyLm1FbmNvZGVkU2l6ZSk7CisgICAgfTsKKyAgICBjaW5mby5kZXN0ID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IqPigmZG1ncik7CisgICAgY2luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aDsKKyAgICBjaW5mby5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDE7CisgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworCisgICAgLy8gSW5pdGlhbGl6ZSBkZWZhdWx0cyBhbmQgdGhlbiBvdmVycmlkZSB3aGF0IHdlIHdhbnQKKyAgICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworCisgICAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIGpwZWdRdWFsaXR5LCAxKTsKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKCZjaW5mbywgSkNTX0dSQVlTQ0FMRSk7CisgICAgY2luZm8ucmF3X2RhdGFfaW4gPSAwOworICAgIGNpbmZvLmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOworCisgICAgY2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDE7CisKKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKKyAgICBpZiAoZXhpZk9yaWVudGF0aW9uICE9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgICAgICB1dGlscy0+aW5pdGlhbGl6ZUVtcHR5KCk7CisgICAgICAgIHV0aWxzLT5zZXRJbWFnZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlSGVpZ2h0KGhlaWdodCk7CisgICAgICAgIHV0aWxzLT5zZXRPcmllbnRhdGlvblZhbHVlKGV4aWZPcmllbnRhdGlvbik7CisKKyAgICAgICAgaWYgKHV0aWxzLT5nZW5lcmF0ZUFwcDEoKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogZXhpZkJ1ZmZlciA9IHV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplX3QgZXhpZkJ1ZmZlclNpemUgPSB1dGlscy0+Z2V0QXBwMUxlbmd0aCgpOworICAgICAgICAgICAganBlZ193cml0ZV9tYXJrZXIoJmNpbmZvLCBKUEVHX0FQUDAgKyAxLCBzdGF0aWNfY2FzdDxjb25zdCBKT0NURVQqPihleGlmQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZXhpZkJ1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2VuZXJhdGUgQXBwMSBidWZmZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaW5mby5pbWFnZV9oZWlnaHQ7IGkrKykgeworICAgICAgICBhdXRvIGN1cnJlbnRSb3cgID0gc3RhdGljX2Nhc3Q8SlNBTVBST1c+KGluICsgaSp3aWR0aCk7CisgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgJmN1cnJlbnRSb3csIC8qbnVtX2xpbmVzKi8xKTsKKyAgICB9CisKKyAgICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworCisgICAgYWN0dWFsU2l6ZSA9IGRtZ3IubUVuY29kZWRTaXplOworICAgIGlmIChkbWdyLm1TdWNjZXNzKSB7CisgICAgICAgIHJldCA9IE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW5saW5lIHZvaWQgdW5wYWNrRGVwdGgxNih1aW50MTZfdCB2YWx1ZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIC8vIEFuZHJvaWQgZGVuc2VseSBwYWNrZWQgZGVwdGggbWFwLiBUaGUgdW5pdHMgZm9yIHRoZSByYW5nZSBhcmUgaW4KKyAgICAvLyBtaWxsaW1ldGVycyBhbmQgbmVlZCB0byBiZSBzY2FsZWQgdG8gbWV0ZXJzLgorICAgIC8vIFRoZSBjb25maWRlbmNlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIDMgbW9zdCBzaWduaWZpY2FudCBiaXRzLgorICAgIC8vIFRoZSBjb25maWRlbmNlIGRhdGEgbmVlZHMgdG8gYmUgYWRkaXRpb25hbGx5IG5vcm1hbGl6ZWQgd2l0aAorICAgIC8vIHZhbHVlcyAxLjBmLCAwLjBmIHJlcHJlc2VudGluZyBtYXhpbXVtIGFuZCBtaW5pbXVtIGNvbmZpZGVuY2UKKyAgICAvLyByZXNwZWN0aXZlbHkuCisgICAgYXV0byBwb2ludCA9IHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSAmIDB4MUZGRikgLyAxMDAwLmY7CisgICAgcG9pbnRzLT5wdXNoX2JhY2socG9pbnQpOworCisgICAgYXV0byBjb25mID0gKHZhbHVlID4+IDEzKSAmIDB4NzsKKyAgICBmbG9hdCBub3JtQ29uZmlkZW5jZSA9IChjb25mID09IDApID8gMS5mIDogKHN0YXRpY19jYXN0PGZsb2F0Pihjb25mKSAtIDEpIC8gNy5mOworICAgIGNvbmZpZGVuY2UtPnB1c2hfYmFjayhub3JtQ29uZmlkZW5jZSk7CisKKyAgICBpZiAoKm5lYXIgPiBwb2ludCkgeworICAgICAgICAqbmVhciA9IHBvaW50OworICAgIH0KKyAgICBpZiAoKmZhciA8IHBvaW50KSB7CisgICAgICAgICpmYXIgPSBwb2ludDsKKyAgICB9Cit9CisKKy8vIFRyaXZpYWwgY2FzZSwgcmVhZCBmb3J3YXJkIGZyb20gdG9wLGxlZnQgY29ybmVyLgordm9pZCByb3RhdGUwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaSppbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGpdLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDkwIGRlZ3JlZXMgQ1cgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBmcm9tIGJvdHRvbSwgbGVmdCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTkwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7IGkrKykgeworICAgICAgICBmb3IgKHNzaXplX3QgaiA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0LTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2oqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBpXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAxODAgQ1cgZGVncmVlcyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGJhY2t3YXJkcyBmcm9tIGJvdHRvbSwgcmlnaHQgY29ybmVyLgordm9pZCByb3RhdGUxODBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc3NpemVfdCBpID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGogPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2kqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBqXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAyNzAgZGVncmVlcyBDVyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGZyb20gdG9wLCByaWdodCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTI3MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7IGorKykgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltqKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgaV0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCByb3RhdGVBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIHN3aXRjaCAoaW5wdXRGcmFtZS5tT3JpZW50YXRpb24pIHsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTkwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUxODBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUyNzBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuc3VwcG9ydGVkIGRlcHRoIHBob3RvIHJvdGF0aW9uOiAlZCwgZGVmYXVsdCB0byAwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1PcmllbnRhdGlvbik7CisgICAgICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxkeW5hbWljX2RlcHRoOjpEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwKKyAgICAgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiAqaXRlbXMgLypvdXQqLywKKyAgICAgICAgYm9vbCAqc3dpdGNoRGltZW5zaW9ucyAvKm91dCovKSB7CisgICAgaWYgKChpdGVtcyA9PSBudWxscHRyKSB8fCAoc3dpdGNoRGltZW5zaW9ucyA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcG9pbnRzLCBjb25maWRlbmNlOworCisgICAgc2l6ZV90IHBvaW50Q291bnQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoICogaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgcG9pbnRzLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgY29uZmlkZW5jZS5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGZsb2F0IG5lYXIgPSBVSU5UMTZfTUFYOworICAgIGZsb2F0IGZhciA9IC4wZjsKKyAgICAqc3dpdGNoRGltZW5zaW9ucyA9IGZhbHNlOworICAgIC8vIFBoeXNpY2FsIHJvdGF0aW9uIG9mIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgbWF5IGJlIG5lZWRlZCBpbiBjYXNlCisgICAgLy8gdGhlIEVYSUYgb3JpZW50YXRpb24gaXMgc2V0IHRvIDAgZGVncmVlcyBhbmQgdGhlIGRlcHRoIHBob3RvIG9yaWVudGF0aW9uCisgICAgLy8gKHNvdXJjZSBjb2xvciBpbWFnZSkgaGFzIHNvbWUgZGlmZmVyZW50IHZhbHVlLgorICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpIHsKKyAgICAgICAgKnN3aXRjaERpbWVuc2lvbnMgPSByb3RhdGVBbmRVbnBhY2soaW5wdXRGcmFtZSwgJnBvaW50cywgJmNvbmZpZGVuY2UsICZuZWFyLCAmZmFyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsICZwb2ludHMsICZjb25maWRlbmNlLCAmbmVhciwgJmZhcik7CisgICAgfQorCisgICAgc2l6ZV90IHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsKKyAgICBzaXplX3QgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgaWYgKCpzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgICAgIGhlaWdodCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7CisgICAgfQorCisgICAgaWYgKG5lYXIgPT0gZmFyKSB7CisgICAgICAgIEFMT0dFKCIlczogTmVhciBhbmQgZmFyIHJhbmdlIHZhbHVlcyBtdXN0IG5vdCBtYXRjaCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwb2ludHNRdWFudGl6ZWQsIGNvbmZpZGVuY2VRdWFudGl6ZWQ7CisgICAgcG9pbnRzUXVhbnRpemVkLnJlc2VydmUocG9pbnRDb3VudCk7IGNvbmZpZGVuY2VRdWFudGl6ZWQucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBhdXRvIHBvaW50SXQgPSBwb2ludHMuYmVnaW4oKTsKKyAgICBhdXRvIGNvbmZpZGVuY2VJdCA9IGNvbmZpZGVuY2UuYmVnaW4oKTsKKyAgICB3aGlsZSAoKHBvaW50SXQgIT0gcG9pbnRzLmVuZCgpKSAmJiAoY29uZmlkZW5jZUl0ICE9IGNvbmZpZGVuY2UuZW5kKCkpKSB7CisgICAgICAgIHBvaW50c1F1YW50aXplZC5wdXNoX2JhY2soZmxvb3JmKCgoZmFyICogKCpwb2ludEl0IC0gbmVhcikpIC8KKyAgICAgICAgICAgICAgICAoKnBvaW50SXQgKiAoZmFyIC0gbmVhcikpKSAqIDI1NS4wZikpOworICAgICAgICBjb25maWRlbmNlUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKmNvbmZpZGVuY2VJdCAqIDI1NS4wZikpOworICAgICAgICBjb25maWRlbmNlSXQrKzsgcG9pbnRJdCsrOworICAgIH0KKworICAgIERlcHRoTWFwUGFyYW1zIGRlcHRoUGFyYW1zKERlcHRoRm9ybWF0OjprUmFuZ2VJbnZlcnNlLCBuZWFyLCBmYXIsIERlcHRoVW5pdHM6OmtNZXRlcnMsCisgICAgICAgICAgICAiYW5kcm9pZC9kZXB0aG1hcCIpOworICAgIGRlcHRoUGFyYW1zLmNvbmZpZGVuY2VfdXJpID0gImFuZHJvaWQvY29uZmlkZW5jZW1hcCI7CisgICAgZGVwdGhQYXJhbXMubWltZSA9ICJpbWFnZS9qcGVnIjsKKyAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLnJlc2l6ZShpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLnJlc2l6ZShpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbEpwZWdTaXplOworICAgIGF1dG8gcmV0ID0gZW5jb2RlR3JheXNjYWxlSnBlZyh3aWR0aCwgaGVpZ2h0LCBwb2ludHNRdWFudGl6ZWQuZGF0YSgpLAorICAgICAgICAgICAgZGVwdGhQYXJhbXMuZGVwdGhfaW1hZ2VfZGF0YS5kYXRhKCksIGlucHV0RnJhbWUubU1heEpwZWdTaXplLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgYWN0dWFsSnBlZ1NpemUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLnJlc2l6ZShhY3R1YWxKcGVnU2l6ZSk7CisKKyAgICByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIGNvbmZpZGVuY2VRdWFudGl6ZWQuZGF0YSgpLAorICAgICAgICAgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IENvbmZpZGVuY2UgbWFwIGNvbXByZXNzaW9uIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLnJlc2l6ZShhY3R1YWxKcGVnU2l6ZSk7CisKKyAgICByZXR1cm4gRGVwdGhNYXA6OkZyb21EYXRhKGRlcHRoUGFyYW1zLCBpdGVtcyk7Cit9CisKK2V4dGVybiAiQyIgaW50IHByb2Nlc3NEZXB0aFBob3RvRnJhbWUoRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc2l6ZV90IGRlcHRoUGhvdG9CdWZmZXJTaXplLAorICAgICAgICB2b2lkKiBkZXB0aFBob3RvQnVmZmVyIC8qb3V0Ki8sIHNpemVfdCogZGVwdGhQaG90b0FjdHVhbFNpemUgLypvdXQqLykgeworICAgIGlmICgoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlciA9PSBudWxscHRyKSB8fCAoZGVwdGhQaG90b0FjdHVhbFNpemUgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+IGl0ZW1zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmE+PiBjYW1lcmFMaXN0OworICAgIGF1dG8gaW1hZ2UgPSBJbWFnZTo6RnJvbURhdGFGb3JQcmltYXJ5SW1hZ2UoImFuZHJvaWQvbWFpbmltYWdlIiwgJml0ZW1zKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUGFyYW1zPiBjYW1lcmFQYXJhbXMobmV3IENhbWVyYVBhcmFtcyhzdGQ6Om1vdmUoaW1hZ2UpKSk7CisgICAgaWYgKGNhbWVyYVBhcmFtcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgY2FtZXJhIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24gPSBnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIpLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplKTsKKyAgICBib29sIHN3aXRjaERpbWVuc2lvbnM7CisgICAgY2FtZXJhUGFyYW1zLT5kZXB0aF9tYXAgPSBwcm9jZXNzRGVwdGhNYXBGcmFtZShpbnB1dEZyYW1lLCBleGlmT3JpZW50YXRpb24sICZpdGVtcywKKyAgICAgICAgICAgICZzd2l0Y2hEaW1lbnNpb25zKTsKKyAgICBpZiAoY2FtZXJhUGFyYW1zLT5kZXB0aF9tYXAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBwcm9jZXNzaW5nIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhbiBpbWFnaW5nIG1vZGVsIHdpdGhvdXQgaW5zdHJpbnNpYyBjYWxpYnJhdGlvbi4KKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGludHJpbnNpYyBjYWxpYnJhdGlvbiBsYXlvdXQgaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgICAgIGNvbnN0IGR5bmFtaWNfZGVwdGg6OlBvaW50PGRvdWJsZT4gZm9jYWxMZW5ndGgoaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzBdLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvblsxXSk7CisgICAgICAgIHNpemVfdCB3aWR0aCA9IGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGg7CisgICAgICAgIHNpemVfdCBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodDsKKyAgICAgICAgaWYgKHN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQ7CisgICAgICAgICAgICBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERpbWVuc2lvbiBpbWFnZVNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIEltYWdpbmdNb2RlbFBhcmFtcyBpbWFnaW5nUGFyYW1zKGZvY2FsTGVuZ3RoLCBpbWFnZVNpemUpOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC54ID0gaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzJdOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC55ID0gaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzNdOworICAgICAgICBpbWFnaW5nUGFyYW1zLnNrZXcgPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bNF07CisKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgICAgICAvLyBba2FwcGFfMSwga2FwcGFfMiwga2FwcGFfMyBrYXBwYV80LCBrYXBwYV81XQorICAgICAgICBpZiAoaW5wdXRGcmFtZS5tSXNMZW5zRGlzdG9ydGlvblZhbGlkKSB7CisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiB0aGUgbGVucyBkaXN0b3J0aW9uIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgb3JkZXJlZAorICAgICAgICAgICAgLy8gYXMgWzEsIGthcHBhXzQsIGthcHBhXzEsIGthcHBhXzUsIGthcHBhXzIsIDAsIGthcHBhXzMsIDBdCisgICAgICAgICAgICBmbG9hdCBkaXN0b3J0aW9uRGF0YVtdID0gezEuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bM10sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzBdLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvbls0XSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMV0sIDAuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMl0sIDAuZn07CisgICAgICAgICAgICBhdXRvIGRpc3RvcnRpb25EYXRhTGVuZ3RoID0gc2l6ZW9mKGRpc3RvcnRpb25EYXRhKSAvIHNpemVvZihkaXN0b3J0aW9uRGF0YVswXSk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24ucmVzZXJ2ZShkaXN0b3J0aW9uRGF0YUxlbmd0aCk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24uaW5zZXJ0KGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5lbmQoKSwgZGlzdG9ydGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb25EYXRhICsgZGlzdG9ydGlvbkRhdGFMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhUGFyYW1zLT5pbWFnaW5nX21vZGVsID0gSW1hZ2luZ01vZGVsOjpGcm9tRGF0YShpbWFnaW5nUGFyYW1zKTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNMb2dpY2FsKSB7CisgICAgICAgIGNhbWVyYVBhcmFtcy0+dHJhaXQgPSBkeW5hbWljX2RlcHRoOjpDYW1lcmFUcmFpdDo6TE9HSUNBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFQYXJhbXMtPnRyYWl0ID0gZHluYW1pY19kZXB0aDo6Q2FtZXJhVHJhaXQ6OlBIWVNJQ0FMOworICAgIH0KKworICAgIGNhbWVyYUxpc3QuZW1wbGFjZV9iYWNrKENhbWVyYTo6RnJvbURhdGEoc3RkOjptb3ZlKGNhbWVyYVBhcmFtcykpKTsKKworICAgIGF1dG8gZGV2aWNlUGFyYW1zID0gc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VQYXJhbXM+IChDYW1lcmFzOjpGcm9tQ2FtZXJhQXJyYXkoJmNhbWVyYUxpc3QpKTsKKyAgICBkZXZpY2VQYXJhbXMtPmNvbnRhaW5lciA9IENvbnRhaW5lcjo6RnJvbUl0ZW1zKCZpdGVtcyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFByb2ZpbGU+PiBwcm9maWxlTGlzdDsKKyAgICBwcm9maWxlTGlzdC5lbXBsYWNlX2JhY2soUHJvZmlsZTo6RnJvbURhdGEoIkRlcHRoUGhvdG8iLCB7MH0pKTsKKyAgICBkZXZpY2VQYXJhbXMtPnByb2ZpbGVzID0gUHJvZmlsZXM6OkZyb21Qcm9maWxlQXJyYXkoJnByb2ZpbGVMaXN0KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlPiBkZXZpY2UgPSBEZXZpY2U6OkZyb21EYXRhKHN0ZDo6bW92ZShkZXZpY2VQYXJhbXMpKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5wdXRKcGVnU3RyZWFtKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIsIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSkpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRwdXRKcGVnU3RyZWFtOworICAgIGlmICghV3JpdGVJbWFnZUFuZE1ldGFkYXRhQW5kQ29udGFpbmVyKCZpbnB1dEpwZWdTdHJlYW0sIGRldmljZS5nZXQoKSwgJm91dHB1dEpwZWdTdHJlYW0pKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHdyaXRpbmcgZGVwdGggb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+IChvdXRwdXRKcGVnU3RyZWFtLnRlbGxwKCkpOworICAgIGlmICgqZGVwdGhQaG90b0FjdHVhbFNpemUgPiBkZXB0aFBob3RvQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIG91dHB1dCBidWZmZXIgbm90IHN1ZmZpY2llbnQsIG5lZWRlZCAlenUgYWN0dWFsICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUsIGRlcHRoUGhvdG9CdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGVwdGhQaG90b0J1ZmZlciwgb3V0cHV0SnBlZ1N0cmVhbS5zdHIoKS5jX3N0cigpLCAqZGVwdGhQaG90b0FjdHVhbFNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX1BST0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworZW51bSBEZXB0aFBob3RvT3JpZW50YXRpb24geworICAgIERFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUyAgID0gMCwKKyAgICBERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTICA9IDkwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTID0gMTgwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTID0gMjcwLAorfTsKKworc3RydWN0IERlcHRoUGhvdG9JbnB1dEZyYW1lIHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgbU1haW5KcGVnQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdTaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdXaWR0aCwgbU1haW5KcGVnSGVpZ2h0OworICAgIHVpbnQxNl90KiAgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1EZXB0aE1hcFdpZHRoLCBtRGVwdGhNYXBIZWlnaHQsIG1EZXB0aE1hcFN0cmlkZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1heEpwZWdTaXplOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSnBlZ1F1YWxpdHk7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWw7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb25bNV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb25bNV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQ7CisgICAgRGVwdGhQaG90b09yaWVudGF0aW9uIG1PcmllbnRhdGlvbjsKKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lKCkgOgorICAgICAgICAgICAgbU1haW5KcGVnQnVmZmVyKG51bGxwdHIpLAorICAgICAgICAgICAgbU1haW5KcGVnU2l6ZSgwKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ1dpZHRoKDApLAorICAgICAgICAgICAgbU1haW5KcGVnSGVpZ2h0KDApLAorICAgICAgICAgICAgbURlcHRoTWFwQnVmZmVyKG51bGxwdHIpLAorICAgICAgICAgICAgbURlcHRoTWFwV2lkdGgoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBIZWlnaHQoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBTdHJpZGUoMCksCisgICAgICAgICAgICBtTWF4SnBlZ1NpemUoMCksCisgICAgICAgICAgICBtSnBlZ1F1YWxpdHkoMTAwKSwKKyAgICAgICAgICAgIG1Jc0xvZ2ljYWwoMCksCisgICAgICAgICAgICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbnswLmZ9LAorICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1PcmllbnRhdGlvbihEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUykge30KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b0xpYnJhcnkgPSAibGliZGVwdGhwaG90by5zbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24gPSAicHJvY2Vzc0RlcHRoUGhvdG9GcmFtZSI7Cit0eXBlZGVmIGludCAoKnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUpIChEZXB0aFBob3RvSW5wdXRGcmFtZSAvKmlucHV0RnJhbWUqLywKKyAgICAgICAgc2l6ZV90IC8qZGVwdGhQaG90b0J1ZmZlclNpemUqLywgdm9pZCogLypkZXB0aFBob3RvQnVmZmVyIG91dCovLAorICAgICAgICBzaXplX3QqIC8qZGVwdGhQaG90b0FjdHVhbFNpemUgb3V0Ki8pOworCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCBiMjAxMTE5Li45MjNkMTdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwpAQCAtNzgsMTEgKzc5LDEwIEBACiAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICAgIG1WZW5kb3JUYWdJZChDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQpLAotICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpCisgICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSksCisgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyhmYWxzZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpub3RpZnkgPSAmc05vdGlmeTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCA9ICZzUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CiAgICAgQUxPR1YoIiVzOiBDcmVhdGVkIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogfQogCkBAIC05MCw3ICs5MCw3IEBACiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IFRlYXJpbmcgZG93biBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICBkaXNjb25uZWN0SW1wbCgpOwogfQogCiBjb25zdCBTdHJpbmc4JiBDYW1lcmEzRGV2aWNlOjpnZXRJZCgpIGNvbnN0IHsKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICBib29sIGlzTG9naWNhbCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2VJbmZvLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKICAgICBpZiAoaXNMb2dpY2FsKSB7CiAgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CiAgICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MocGh5c2ljYWxJZCwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwpAQCAtMTgxLDcgKzE4MSwxNCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CiAgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwogICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKQEAgLTE4OSw2ICsxOTYsMjggQEAKICAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKICAgICB9CiAKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgcmVzID0gbWFuYWdlci0+Z2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24obUlkLnN0cmluZygpLCAmbWF4VmVyc2lvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluIGdldHRpbmcgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGlkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgIG1heFZlcnNpb24uZ2V0X21ham9yKCksIG1heFZlcnNpb24uZ2V0X21pbm9yKCkpOworCisgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICBpc01vbm9jaHJvbWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IChpc01vbm9jaHJvbWUgJiYgZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KTsKKwogICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7CiB9CiAKQEAgLTIwOCw2ICsyMzcsMTcgQEAKICAgICAvKiogUmVnaXN0ZXIgaW4tZmxpZ2h0IG1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIgKi8KICAgICBtSW5GbGlnaHRTdGF0dXNJZCA9IG1TdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIAorICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBtUmVxdWVzdEJ1ZmZlclNNLmluaXRpYWxpemUobVN0YXR1c1RyYWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IGJ1ZmZlciBzdGF0ZSBtYWNoaW5lOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogQ3JlYXRlIGJ1ZmZlciBtYW5hZ2VyICovCiAgICAgbUJ1ZmZlck1hbmFnZXIgPSBuZXcgQ2FtZXJhM0J1ZmZlck1hbmFnZXIoKTsKIApAQCAtMjE3LDggKzI1NywxMCBAQAogICAgIGlmIChzZXNzaW9uS2V5c0VudHJ5LmNvdW50ID4gMCkgewogICAgICAgICBzZXNzaW9uUGFyYW1LZXlzLmluc2VydEFycmF5QXQoc2Vzc2lvbktleXNFbnRyeS5kYXRhLmkzMiwgMCwgc2Vzc2lvbktleXNFbnRyeS5jb3VudCk7CiAgICAgfQorCiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCgKKyAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC0yNzAsMTEgKzMxMiwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gZGlzY29ubmVjdEltcGwoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdEltcGwoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogCkBAIC0zNDEsNiArMzg2LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbVJlcXVlc3RUaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIHN0TG9jayhtVHJhY2tlckxvY2spOwogICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOwogICAgICAgICBpbnRlcmZhY2UgPSBtSW50ZXJmYWNlLmdldCgpOwogICAgIH0KQEAgLTgzOSwxNCArODg1LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gcmVxdWVzdHNMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwczsKICAgICBjb252ZXJ0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCByZXF1ZXN0KTsKIAotICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Y29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4mIHJlcXVlc3RzTGlzdCwKQEAgLTkxMyw2ICs5NTksMjMyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0OworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrKTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGJ1ZlJldHM7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOworICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIG1PdXRwdXRTdHJlYW1zLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgfQorCisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlclNNLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gZW1wdHlCdWZSZXRzOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBlbXB0eUJ1ZlJldHMpOworICAgICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7CisgICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOworICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIHNpemVfdCBudW1BbGxvY2F0ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgc2l6ZV90IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQnVmZmVyc1JlcXVlc3RlZDsgYisrKSB7CisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCisgICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJnNiLCB3YWl0RHVyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBUSU1FRF9PVVQgfHwgcmVzID09IE5PX01FTU9SWSkgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bUFsbG9jYXRlZEJ1ZmZlcnMrKzsKKworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBzYi5idWZmZXI7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBtSW50ZXJmYWNlLT5nZXRCdWZmZXJJZCgqYnVmZmVyLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworCisgICAgICAgICAgICBoQnVmLnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyAqYnVmZmVyIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGhCdWYuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHNiLmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNiLmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZS5zZXRUbyhhY3F1aXJlRmVuY2UsIC8qc2hvdWxkT3duKi90cnVlKTsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCByZWdpc3RlciByZXF1ZXN0IGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFJlcVN1Y2NlZWRzKSB7CisgICAgICAgICAgICBidWZSZXQudmFsLmJ1ZmZlcnMoc3RkOjptb3ZlKHRtcFJldEJ1ZmZlcnMpKTsKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGhCdWYuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiJXM6IHBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlciBmYWlsZWQgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1BbGxvY2F0ZWRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9oaWRsX2NiKGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKKyAgICAgICAgICAgIGJ1ZlJldHMpOworICAgIG1SZXF1ZXN0QnVmZmVyU00uZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VybWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1Zi5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIGJ1ZmZlciB3aXRob3V0IGJ1ZmZlcklkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWYuYnVmZmVySWQsICZidWZmZXIpOworCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYuYnVmZmVySWQsIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKworICAgICAgICBpZiAoYnVmLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChidWYucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCByZWxlYXNlIGZlbmNlLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChidWYuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKQEAgLTEwNjEsMjcgKzEzMzMsNTEgQEAKICAgICAgICAgYXV0byYgYkRzdCA9IG91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgIGNvbnN0IFN0cmVhbUJ1ZmZlciAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOwogCi0gICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYlNyYy5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogSW52YWxpZCBvdXRwdXQgc3RyZWFtIGlkICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGJEc3Quc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICBiRHN0LnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKIAotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKLSAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAorICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoYlNyYy5zdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBidWZmZXJJZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIHByb2NlZWRzIHNvIG90aGVyIGJ1ZmZlcnMgY2FuIGJlIHJldHVybmVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vQnVmZmVyUmV0dXJuZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJTcmMuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCiAgICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOwogICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMoYlNyYy5zdGF0dXMpOwogICAgICAgICBiRHN0LmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgaWYgKGJTcmMucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IC0xOwogICAgICAgICB9IGVsc2UgaWYgKGJTcmMucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoYlNyYy5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLApAQCAtMTE1NywxMyArMTQ1MywxMyBAQAogICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBM19NU0dfRVJST1I7CiAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5lcnJvci5mcmFtZU51bWJlcjsKICAgICAgICAgICAgIGlmIChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQgPj0gMCkgewotICAgICAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOwogICAgICAgICAgICAgfQpAQCAtMTM0NCw2ICsxNjQwLDU2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmFkZCgKKyAgICAgICAgaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWRkIG51bGwgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5hZGQoc3RyZWFtSWQsIHN0cmVhbSk7Cit9CisKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpyZW1vdmUoaW50IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5yZW1vdmVJdGVtKHN0cmVhbUlkKTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Z2V0KGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGlkeCA9IG1EYXRhLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpZHgpOworfQorCitzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPgorQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmVkaXRWYWx1ZUF0KGluZGV4KTsKK30KKworc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6c2l6ZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLnNpemUoKTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmNsZWFyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuY2xlYXIoKTsKK30KKworc3RkOjp2ZWN0b3I8aW50PiBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldFN0cmVhbUlkcygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHMobURhdGEuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0cmVhbUlkc1tpXSA9IG1EYXRhLmtleUF0KGkpOworICAgIH0KKyAgICByZXR1cm4gc3RyZWFtSWRzOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLApAQCAtMTQyMiwxOCArMTc2OCwyMCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgc3NpemVfdCBibG9iQnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7Ci0gICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7CiAgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCk7CiAgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBwb2ludCBjbG91ZCBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNDUwLDcgKzE3OTgsOCBAQAogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNTI3LDIwICsxODc2LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgaWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbUluZm8tPndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7Ci0gICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPndpZHRoICA9IHN0cmVhbS0+Z2V0V2lkdGgoKTsKKyAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBzdHJlYW0tPmdldEhlaWdodCgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IHN0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gc3RyZWFtLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE1NjcsMTQgKzE5MTYsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsCi0gICAgICAgICAgICAgICAgaWQpOworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCktPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHJldHVybiBzdHJlYW0tPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkZWxldGVTdHJlYW0oaW50IGlkKSB7CkBAIC0xNTk5LDIxICsxOTQ2LDIxIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCi0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBzdHJlYW07CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CiAgICAgfQogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KQEAgLTE2OTYsNyArMjA0Myw3IEBACiAKICAgICBpZiAodGVtcGxhdGVJZCA8PSAwIHx8IHRlbXBsYXRlSWQgPj0gQ0FNRVJBM19URU1QTEFURV9DT1VOVCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjg2NjExMCIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE4NTQsNiArMjIwMSwxNCBAQAogCiAgICAgbVN0YXR1c1dhaXRlcnMrKzsKIAorICAgIGlmICghYWN0aXZlICYmIG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGF1dG8gc3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIH0KKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbldhaXRVbnRpbElkbGUoKTsKKyAgICB9CisKICAgICBib29sIHN0YXRlU2VlbiA9IGZhbHNlOwogICAgIGRvIHsKICAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgewpAQCAtMjAxMyw2ICsyMzY4LDEzIEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgICAgICAvLyBiLzExNjUxNDEwNiAiZGlzY29ubmVjdCgpIiBjYW4gZ2V0IGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgZGV2aWNlLiBUaGUKKyAgICAgICAgLy8gY2FtZXJhIGRldmljZSB3aWxsIG5vdCBiZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIHNlY29uZCBydW4uCisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKwogICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoLypvdXQqL2ZyYW1lTnVtYmVyKTsKICAgICB9CiAKQEAgLTIwMjksMTUgKzIzOTEsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5pc1VucHJlcGFyYWJsZSgpIHx8IHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaGFzIGFscmVhZHkgYmVlbiBhIHJlcXVlc3QgdGFyZ2V0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjA1NywxNSArMjQxNiwxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLQogICAgIGlmIChzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpIHx8IG1SZXF1ZXN0VGhyZWFkLT5pc1N0cmVhbVBlbmRpbmcoc3RyZWFtKSkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIGEgdGFyZ2V0IG9mIGEgaW4tcHJvZ3Jlc3MgcmVxdWVzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwODEsMTQgKzI0MzcsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CiAgICAgc3RyZWFtLT5hZGRCdWZmZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTQ3LDEyICsyNTAwLDExIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOwogICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+c2V0Q29uc3VtZXJzKGNvbnN1bWVycyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIHNldCBjb25zdW1lciBmYWlsZWQgKGVycm9yICVkICVzKSAiLCBzdHJlYW1JZCwgcmVzLCBzdHJlcnJvcigtcmVzKSk7CkBAIC0yMTk3LDEwICsyNTQ5LDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRTdXJmYWNlSWRzKSB7CkBAIC0yMjEwLDcgKzI1NjIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnVwZGF0ZVN0cmVhbShuZXdTdXJmYWNlcywgb3V0cHV0SW5mbywgcmVtb3ZlZFN1cmZhY2VJZHMsIG91dHB1dE1hcCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGZhaWxlZCB0byB1cGRhdGUgc3RyZWFtIChlcnJvciAlZCAlcykgIiwKQEAgLTIyMjksMTMgKzI1ODAsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIGludCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgaXMgbm90IGZvdW5kLiIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7CiAgICAgcmV0dXJuIHN0cmVhbS0+ZHJvcEJ1ZmZlcnMoZHJvcHBpbmcpOwogfQogCkBAIC0yMjg5LDE1ICsyNjM4LDEyIEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1zLmNvdW50OyBpKyspIHsKLSAgICAgICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtcy5kYXRhLmkzMltpXSk7Ci0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbXMuZGF0YS5pMzJbaV0pOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0IHJlZmVyZW5jZXMgdW5rbm93biBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1zLmRhdGEudThbaV0pOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1zLmRhdGEuaTMyW2ldKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKLQogICAgICAgICAvLyBJdCBpcyBpbGxlZ2FsIHRvIGluY2x1ZGUgYSBkZWZlcnJlZCBjb25zdW1lciBvdXRwdXQgc3RyZWFtIGludG8gYSByZXF1ZXN0CiAgICAgICAgIGF1dG8gaXRlciA9IHN1cmZhY2VNYXAuZmluZChzdHJlYW1zLmRhdGEuaTMyW2ldKTsKICAgICAgICAgaWYgKGl0ZXIgIT0gc3VyZmFjZU1hcC5lbmQoKSkgewpAQCAtMjMwOSw3ICsyNjU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW2ldID0gc3VyZmFjZXM7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtcy5kYXRhLmkzMltpXV0gPSBzdXJmYWNlczsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExhenkgY29tcGxldGlvbiBvZiBzdHJlYW0gY29uZmlndXJhdGlvbiAoYWxsb2NhdGlvbi9yZWdpc3RyYXRpb24pCkBAIC0yMzU4LDcgKzI3MDQsNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Y2FuY2VsQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjQ5Myw3ICsyODM5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKm91dHB1dFN0cmVhbTsKLSAgICAgICAgb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSktPnN0YXJ0Q29uZmlndXJhdGlvbigpOworICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IHN0YXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICAgY2FuY2VsU3RyZWFtc0NvbmZpZ3VyYXRpb25Mb2NrZWQoKTsKQEAgLTI1NTEsOCArMjg5Nyw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkgJiYgIW91dHB1dFN0cmVhbS0+aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZCgpKSB7CiAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI2MTUsNiArMjk2MCwxMCBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI2NTksMTUgKzMwMDgsMTIgQEAKICAgICAvLyBPaywgaGF2ZSBhIGR1bW15IHN0cmVhbSBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgb3RoZXIgb3V0cHV0IHN0cmVhbSwKICAgICAvLyBzbyByZW1vdmUgdGhlIGR1bW15CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtRHVtbXlTdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChkZWxldGVkU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCi0gICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRHVtbXlTdHJlYW1JZCk7CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQogICAgIHJlcyA9IGRlbGV0ZWRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKQEAgLTI3NDEsMTggKzMwODcsMjEgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKLSAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1JbkZsaWdodFN0YXR1c0lkKTsKICAgICAgICAgfQpAQCAtMjc2NCwxNyArMzExMyw2OCBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzKSB7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykKICAgICB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXApOworICAgICAgICBpZiAob3V0cHV0QnVmZmVyc1tpXS5idWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIFdpdGggSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSwgSEFMIHNvbWV0aW1lcyB3aWxsIGhhdmUgdG8gcmV0dXJuIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKKyAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbUludGVyZmFjZSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IHN0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgY29uc3QgYXV0byYgaXQgPSBvdXRwdXRTdXJmYWNlcy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgaXQtPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIExvbmcgcHJvY2Vzc2luZyBjb25zdW1lcnMgY2FuIGNhdXNlIHJldHVybkJ1ZmZlciB0aW1lb3V0IGZvciBzaGFyZWQgc3RyZWFtCisgICAgICAgIC8vIElmIHRoYXQgaGFwcGVucywgY2FuY2VsIHRoZSBidWZmZXIgYW5kIHNlbmQgYSBidWZmZXIgZXJyb3IgdG8gY2xpZW50CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSAmJiByZXMgPT0gVElNRURfT1VUICYmCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXS5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOworICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgYnVmZmVyIGVycm9yCisgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcyA9IGluUmVzdWx0RXh0cmFzOworICAgICAgICAgICAgICAgIGV4dHJhcy5lcnJvclN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC0yNzg1LDggKzMxODUsMTAgQEAKIAogICAgIC8vIEluZGljYXRlIGlkbGUgaW5GbGlnaHRNYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uSW5mbGlnaHRNYXBFbXB0eSgpOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtSW5GbGlnaHRTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQpAQCAtMjgxMSw2ICszMjEzLDEwIEBACiAgICAgaWYgKHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCAmJgogICAgICAgICAgICAgKHJlcXVlc3Quc2tpcFJlc3VsdE1ldGFkYXRhIHx8CiAgICAgICAgICAgICAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgc2h1dHRlclRpbWVzdGFtcCAhPSAwKSkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdGlsbCBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgiZnJhbWUgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiBzZW5zb3IgdGltZXN0YW1wIG1hdGNoZXMgc2h1dHRlciB0aW1lc3RhbXAgaW4gdGhlCkBAIC0yODI3LDcgKzMyMzMsOCBAQAogICAgICAgICBhc3NlcnQocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LIHx8CiAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSA9PSAwKTsKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoaWR4KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVtb3ZlZCBmcmFtZSAlZCBmcm9tIEluRmxpZ2h0TWFwIiwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CkBAIC0yODUxLDcgKzMyNTgsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpZHgrKykgewogICAgICAgICAgICAgY29uc3QgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAgICAgICAgIG1JbkZsaWdodE1hcC5jbGVhcigpOwogICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKQEAgLTI4ODksNyArMzI5OCw4IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IGhhbFN0cmVhbTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhbFN0cmVhbS0+c3RyZWFtX3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gJWQ6ICVzICglZCkiLCAgX19GVU5DVElPTl9fLApAQCAtMjkyNiwxMiArMzMzNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOwogICAgICAgICB9CiAgICAgfQpAQCAtMjk3OSw2ICszMzg5LDEzIEBACiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwogICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gcGFydGlhbFJlc3VsdDsKIAorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQogCkBAIC0zMDUwLDYgKzM0NjcsMjEgQEAKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZXJyb3IocmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobVBoeXNpY2FsRGV2aWNlSW5mb01hcC5hdChjYW1lcmFJZDguY19zdHIoKSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1UYWdNb25pdG9yLm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVNVTFQsCiAgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLmRhdGEuaTY0WzBdLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CkBAIC0zMjA3LDggKzM2MzksMTAgQEAKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXBwZW5kQXJyYXkocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKICAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHJlcXVlc3QuenNsQ2FwdHVyZSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKLSAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewpAQCAtMzIyMSw3ICszNjU1LDcgQEAKICAgICAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wID09IDApIHsKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdNZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdCA9IGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCkBAIC0zMzQxLDYgKzM3NzUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtaXNzaW5nIHJlc3VsdCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZC4gSWYgdGhleSByZXR1cm5lZCwgdGhlbiByZW1vdmUgaW5mbGlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FsbCB0aGlzIGZvciBFUlJPUl9DQU1FUkFfUkVRVUVTVCBhcyB3ZWxsPworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgb3RoZXJ3aXNlIHdlIGFyZSBkZXBlbmRpbmcgb24gSEFMIHRvIHNlbmQgdGhlIGJ1ZmZlcnMgYmFjayBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgY2FsbGluZyBub3RpZnlFcnJvci4gTm90IHN1cmUgaWYgdGhhdCdzIGluIHRoZSBzcGVjLgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM0MTQsOCArMzg1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByLmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIHIuaGFzSW5wdXRCdWZmZXIsIHIucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyLnpzbENhcHR1cmUgfHwgci5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgci5vdXRwdXRTdXJmYWNlcywgci5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5jbGVhcigpOwogCiAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CkBAIC0zNDUxLDExICszODkwLDE4IEBACiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSkgewogICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCiAgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM181LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM181ID0gY2FzdFJlc3VsdF8zXzU7CisgICAgfQogICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwogICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKICAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwpAQCAtMzQ2NiwxNyArMzkxMiwxOSBAQAogICAgIH0KIH0KIAotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6IG1Vc2VIYWxCdWZNYW5hZ2VyKGZhbHNlKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihvdGhlci5tSGlkbFNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob3RoZXIubVVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKICAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzUuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM180LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfMy5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbi5jbGVhcigpOwpAQCAtMzU1Myw2ICs0MDAxLDUyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7CisgICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7CisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIGlmICgobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSAmJiBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gb2xkUGFyYW1zLCBuZXdQYXJhbXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBvbGRQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvTWV0YSkpOworICAgICAgICBuZXdQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvTWV0YSkpOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBib29sIHJlcXVpcmVkOworICAgICAgICBhdXRvIGhpZGxDYiA9IFsmY2FsbFN0YXR1cywgJnJlcXVpcmVkXSAoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkRmxhZykgeworICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVkRmxhZzsKKyAgICAgICAgfTsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCBoaWRsQ2IpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9NZXRhKTsKKyAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvTWV0YSk7CisgICAgICAgIGlmIChlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgewogICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKQEAgLTM2MzIsMjYgKzQxMjYsNDkgQEAKIAogICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwogICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9OworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAorICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbApAQCAtMzc2MywxNCArNDI4MCwxNCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKQEAgLTM4MTEsMjYgKzQzMjgsMzcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpzcmMgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyArIGk7CiAgICAgICAgICAgICBTdHJlYW1CdWZmZXIgJmRzdCA9IGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjLT5zdHJlYW0pLT5nZXRJZCgpOwotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOwotICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOwotICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgaWYgKHNyYy0+YnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgcGF0aAorICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CiAgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKIAogICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgICAgIHNyYy0+YnVmZmVyLCBzcmMtPmFjcXVpcmVfZmVuY2UpOwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCkBAIC0zODU0LDEyICs0MzgyLDE3IEBACiAgICAgfQogICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXNDcmVhdGVkOwogCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewogICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTQxLDE4ICs0NDc0LDE3IEBACiAgICAgfQogCiAgICAgaGFyZHdhcmU6OmRldGFpbHM6OnJldHVybl9zdGF0dXMgZXJyOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKKyAgICAgICAgfTsKICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKICAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9IGVsc2UgewogICAgICAgICBlcnIgPSBtSGlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0KICAgICBpZiAoIWVyci5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNDAyMyw2ICs0NTU1LDIwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c2lnbmFsUGlwZWxpbmVEcmFpbiIpOworICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodEJ1ZmZlcktleXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbmZsaWdodExvY2spOwpAQCAtNDA2Myw2ICs0NjA5LDMzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBwYWlyID0gbVJlcXVlc3RlZEJ1ZmZlcnMuaW5zZXJ0KHtidWZmZXJJZCwgYnVmfSk7CisgICAgaWYgKCFwYWlyLnNlY29uZCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIGFscmVhZHkgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBGaW5kIGFuZCBwb3AgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gaXQgPSBtUmVxdWVzdGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBpZiAoaXQgPT0gbVJlcXVlc3RlZEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBub3QgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmJ1ZmZlciA9IGl0LT5zZWNvbmQ7CisgICAgbVJlcXVlc3RlZEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEJ1ZmZlcklkKAogICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7CkBAIC00MTExLDcgKzQ2ODQsOCBAQAogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cykgOgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTQxMjEsNiArNDY5NSw3IEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQoZmFsc2UpLAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluKGZhbHNlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKQEAgLTQxMzEsNyArNDcwNiw4IEBACiAgICAgICAgIG1Db25zdHJhaW5lZE1vZGUoZmFsc2UpLAogICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSksCiAgICAgICAgIG1TZXNzaW9uUGFyYW1LZXlzKHNlc3Npb25QYXJhbUtleXMpLAotICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSkgeworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtNDU4Miw5ICs1MTU4LDEwIEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBib29sIHVwZGF0ZXNEZXRlY3RlZCA9IGZhbHNlOwogCisgICAgQ2FtZXJhTWV0YWRhdGEgdXBkYXRlZFBhcmFtcyhtTGF0ZXN0U2Vzc2lvblBhcmFtcyk7CiAgICAgZm9yIChhdXRvIHRhZyA6IG1TZXNzaW9uUGFyYW1LZXlzKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHNldHRpbmdzLmZpbmQodGFnKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IG1MYXRlc3RTZXNzaW9uUGFyYW1zLmZpbmQodGFnKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IHVwZGF0ZWRQYXJhbXMuZmluZCh0YWcpOwogCiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKQEAgLTQ2MTMsMTcgKzUxOTAsMjYgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNraXBIRlJUYXJnZXRGUFNVcGRhdGUodGFnLCBlbnRyeSwgbGFzdEVudHJ5KSkgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMudXBkYXRlKGVudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgICBBTE9HVigiJXM6IFNlc3Npb24gcGFyYW1ldGVyIHRhZyBpZCAlZCByZW1vdmVkIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMuZXJhc2UodGFnKTsKKyAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMuZXJhc2UodGFnKTsKICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdXBkYXRlc0RldGVjdGVkOworICAgIGJvb2wgcmVjb25maWd1cmVSZXF1aXJlZDsKKyAgICBpZiAodXBkYXRlc0RldGVjdGVkKSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBtSW50ZXJmYWNlLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG1MYXRlc3RTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMpOworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjb25maWd1cmVSZXF1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZWNvbmZpZ3VyZVJlcXVpcmVkOwogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnRocmVhZExvb3AoKSB7CkBAIC00NzM2LDYgKzUzMjIsMTEgQEAKICAgICBBTE9HVlYoIiVzOiAlZDogc3VibWl0dGluZyAlenUgcmVxdWVzdHMgaW4gYSBiYXRjaC4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAogICAgICAgICAgICAgbU5leHRSZXF1ZXN0cy5zaXplKCkpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgfQorCiAgICAgYm9vbCBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IGZhbHNlOwogICAgIG5zZWNzX3QgdFJlcXVlc3RTdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKICAgICBpZiAobUludGVyZmFjZS0+c3VwcG9ydEJhdGNoUmVxdWVzdCgpKSB7CkBAIC00NzYyLDYgKzUzNTMsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cHJlcGFyZUhhbFJlcXVlc3RzKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKKyAgICBib29sIGJhdGNoZWRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV4dFJlcXVlc3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGF1dG8mIG5leHRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpOwogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3QgPSBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdDsKQEAgLTQ3ODUsNyArNTM3NywxMCBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBsYXN0IHRpbWUKLSAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gbVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbjsKKyAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gKG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW4pICYmCisgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBzZXR0aW5ncyBhcmUgYWxsIHRoZSBzYW1lIHdpdGhpbiBvbmUgYmF0Y2gsIHNvIG9ubHkgdHJlYXQgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBpbiBhIGJhdGNoIGFzIG5ldworICAgICAgICAgICAgICAgICEoYmF0Y2hlZFJlcXVlc3QgJiYgaSA+IDApOwogICAgICAgICBpZiAobmV3UmVxdWVzdCkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBIQUwgd29ya2Fyb3VuZDoKQEAgLTQ4ODYsOCArNTQ4MSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgcGFyZW50LT5nZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKIAorICAgICAgICBTdXJmYWNlTWFwIHVuaXF1ZVN1cmZhY2VJZE1hcDsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBvdXRwdXRTdHJlYW0tPmdldElkKCk7CiAKICAgICAgICAgICAgIC8vIFByZXBhcmUgdmlkZW8gYnVmZmVycyBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcgb24gdGhlIGZpcnN0IHZpZGVvIHJlcXVlc3QuCiAgICAgICAgICAgICBpZiAobVByZXBhcmVWaWRlb1N0cmVhbSAmJiBvdXRwdXRTdHJlYW0tPmlzVmlkZW9TdHJlYW0oKSkgewpAQCAtNDkwNiwxNyArNTUwNCw2MSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCi0gICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tqXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHVuaXF1ZVN1cmZhY2VJZHM7CisgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdLAorICAgICAgICAgICAgICAgICAgICAmdW5pcXVlU3VyZmFjZUlkcyk7CisgICAgICAgICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpcyBub3JtYWwgb3V0cHV0IGZvciBzdHJlYW1zIG5vdCBzdXBwb3J0aW5nIHN1cmZhY2VJZHMKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0sgJiYgcmVzICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcXVlcnkgc3RyZWFtICVkIHVuaXF1ZSBzdXJmYWNlIElEcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIHVuaXF1ZVN1cmZhY2VJZE1hcC5pbnNlcnQoe3N0cmVhbUlkLCBzdGQ6Om1vdmUodW5pcXVlU3VyZmFjZUlkcyl9KTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIGlzIGFiYW5kb25lZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSEFMIHdpbGwgcmVxdWVzdCBidWZmZXIgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBidWZmZXIgPSBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJlYW0gPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN0cmVhbUNhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2V0dGluZ3MgOiBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1DYW1lcmFJZC5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5nZXRJZCgpID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNhbWVyYUlkID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CkBAIC00OTM4LDE1ICs1NTgwLDMyIEBACiAgICAgICAgIC8vIHByZXZpZXcpLCBhbmQgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBub3QgdGhlIGxhc3Qgb25lIGluIHRoZSBiYXRjaCwKICAgICAgICAgLy8gZG8gbm90IHNlbmQgY2FsbGJhY2sgdG8gdGhlIGFwcC4KICAgICAgICAgYm9vbCBoYXNDYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIGlmIChtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMSAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKKyAgICAgICAgaWYgKGJhdGNoZWRSZXF1ZXN0ICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgewogICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGlmICghbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICBpc1N0aWxsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdGlsbCBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1tpXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgeworICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIChtVXNlSGFsQnVmTWFuYWdlcikgPyB1bmlxdWVTdXJmYWNlSWRNYXAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30pOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTUwMjIsNyArNTY4MSw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTAzMyw3ICs1NjkyLDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQyLDYgKzU3MDEsMjIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgZm9yIGNhbWVyYSBkZXZpY2Ugbm90IHN1cHBvcnRpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBwbChtUGF1c2VMb2NrKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgcmVxdWVzdCB0aHJlYWQgaXMgc3RpbGwgYnVzeSwgd2FpdCB1bnRpbCBwYXVzZWQgdGhlbiBub3RpZnkgSEFMCisgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSB0cnVlOworICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKK30KKwogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CkBAIC01MDk5LDE2ICs1Nzc0LDIxIEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKLSAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKLSAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KLSAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UgPSAoKm91dHB1dEJ1ZmZlcnMpW2ldLmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKLSAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOwotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAvLyBObyBvdXRwdXQgYnVmZmVyIGNhbiBiZSByZXR1cm5lZCB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy9CdWZmZXJzIHRoYXQgZmFpbGVkIHByb2Nlc3NpbmcgY291bGQgc3RpbGwgaGF2ZQorICAgICAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KKyAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGFjcXVpcmVGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDApOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0RXJyb3IpIHsKQEAgLTUyMTQsMTEgKzU4OTQsMjAgQEAKICAgICAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBHb2luZyBpZGxlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0b3Agd2FpdGluZyBmb3Igbm93IGFuZCBsZXQgdGhyZWFkIG1hbmFnZW1lbnQgaGFwcGVuCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUyOTgsMTEgKzU5ODcsMjAgQEAKICAgICAgICAgaWYgKG1QYXVzZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBQYXVzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBMZXQgdGhlIHRyYWNrZXIga25vdwogICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IG1Eb1BhdXNlU2lnbmFsLndhaXRSZWxhdGl2ZShtUGF1c2VMb2NrLCBrUmVxdWVzdFRpbWVvdXQpOwpAQCAtNTc1OCwyMyArNjQ1NiwxNzQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLyoqCi0gKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gKi8KK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmluaXRpYWxpemUoCisgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhdHVzVHJhY2tlciBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c1Byb2Nlc3NDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLQotICAgIGQtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXNUcmFja2VyID0gc3RhdHVzVHJhY2tlcjsKKyAgICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNOb3RpZnkoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZykgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0gICAgZC0+bm90aWZ5KG1zZyk7Citib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OnN0YXJ0UmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1JFQURZIHx8IG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSB0cnVlOworICAgICAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi90cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjplbmRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIHdpdGhvdXQgYSBzdWNjZXNzZnVsIHN0YXJ0UmVxdWVzdEJ1ZmZlciBjYWxsIGZpcnN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi9mYWxzZSk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdHJlYW1zQ29uZmlndXJlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdWJtaXR0aW5nUmVxdWVzdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSBmYWxzZTsKKyAgICAvLyBpbmZsaWdodCBtYXAgcmVnaXN0ZXIgYWN0dWFsbHkgaGFwcGVucyBpbiBwcmVwYXJlSGFsUmVxdWVzdCBub3csIGJ1dCBpdCBpcyBjbG9zZSBlbm91Z2gKKyAgICAvLyBhcHByb3hpbWF0aW9uLgorICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1NUT1BQRUQpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uUmVxdWVzdFRocmVhZFBhdXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uSW5mbGlnaHRNYXBFbXB0eSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uV2FpdFVudGlsSWRsZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUEVORElOR19TVE9QOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6bm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSkgeworICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpIHsKKyAgICBpZiAobUluZmxpZ2h0TWFwRW1wdHkgJiYgbVJlcXVlc3RUaHJlYWRQYXVzZWQgJiYgIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgaW50MzJfdCB0YWdzVG9SZW1vdmVbXSA9IHsKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgfTsKKyAgICBmb3IgKGF1dG8gdGFnIDogdGFnc1RvUmVtb3ZlKSB7CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLmVyYXNlKHRhZyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlbW92ZSB0YWcgJWQgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBibEVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgYmxFbnRyeS5kYXRhLmZbaV0gPSBibEVudHJ5LmRhdGEuZlswXTsKKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG5wRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUpOworICAgIGlmIChucEVudHJ5LmNvdW50ID4gMCAmJiBucEVudHJ5LmNvdW50ICUgMiA9PSAwKSB7CisgICAgICAgIGRvdWJsZSBucFtdID0ge25wRW50cnkuZGF0YS5kWzBdLCBucEVudHJ5LmRhdGEuZFsxXX07CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFLCBucCwgMik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgU0VOU09SX05PSVNFX1BST0ZJTEU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGxzU2l6ZUVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsc0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCk7CisgICAgaWYgKGxzU2l6ZUVudHJ5LmNvdW50ID09IDIgJiYgbHNFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIChpbnQzMl90KWxzRW50cnkuY291bnQgPT0gNCAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV0pIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXTsgaSsrKSB7CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMV0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzJdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSszXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRQorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTgorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNiRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNnRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTik7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjckVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKTsKKyAgICBpZiAodGNiRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y2dFbnRyeS5jb3VudAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNyRW50cnkuY291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0Y2JFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICB0Y2JFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgICAgICB0Y2dFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCAxMzFkNjJmLi5iMjVkODlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMzMsMTAgKzMzLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCkBAIC01MCwyMCArNTEsNiBAQAogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogCi0vKioKLSAqIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgd2l0aCBDIGNhbGxpbmcgY29udmVudGlvbiB0bwotICogdXNlIGZvciBIQUwgY2FsbGJhY2sgZnVuY3Rpb25zLgotICovCi1leHRlcm4gIkMiIHsKLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90ICopOwotCi0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3Nfbm90aWZ5X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnX3QgKik7Ci19Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtODAsOCArNjcsNyBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBwcml2YXRlIGNhbWVyYTNfY2FsbGJhY2tfb3BzIHsKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrIHsKICAgcHVibGljOgogCiAgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCk7CkBAIC0yMDgsOCArMTk0LDMyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisgICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisgICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKwogICBwcml2YXRlOgogCisgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKwogICAgIC8vIGludGVybmFsIHR5cGVkZWZzCiAgICAgdXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKICAgICB1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlICA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwpAQCAtMjY4LDcgKzI3OCw4IEBACiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyIHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIApAQCAtMjk3LDE0ICszMDgsMjkgQEAKICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOwogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworICAgICAgICBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpOworCisgICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAorICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKIAorICAgICAgICAvLyBSZWdpc3RlciBhIGJ1ZklkL2J1ZmZlcl9oYW5kbGVfdCB0byBpbmZsaWdodCByZXF1ZXN0IGJ1ZmZlcgorICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1Zik7CisKKyAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKKwogICAgICAgICAvLyBHZXQgYSB2ZWN0b3Igb2YgKGZyYW1lTnVtYmVyLCBzdHJlYW1JZCkgcGFpciBvZiBjdXJyZW50bHkgaW5mbGlnaHQKICAgICAgICAgLy8gYnVmZmVycwogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTIsNiArMzM4LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMxOSw3ICszNDcsNyBAQAogCiAgICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdAogICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHZvaWQgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAogICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBvdXQsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCk7CiAKQEAgLTM2MywxOSArMzkxLDE5IEBACiAgICAgICAgIC8vIHN0cmVhbSBJRCAtPiBwZXIgc3RyZWFtIGJ1ZmZlciBJRCBtYXAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgQnVmZmVySWRNYXA+IG1CdWZmZXJJZE1hcHM7CiAgICAgICAgIHVpbnQ2NF90IG1OZXh0QnVmZmVySWQgPSAxOyAvLyAwIG1lYW5zIG5vIGJ1ZmZlcgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECi0gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBzd2l0Y2ggdG8gdXNlIGdyYWxsb2MgbWFwcGVyJ3MgZ2V0QmFja2luZ1N0b3JlIEFQSQotICAgICAgICAvLyAgICAgICBvbmNlIHdlIHJhbiBpbiBiaW5kZXJpemVkIGdyYWxsb2MgbW9kZSwgYnV0IGJlZm9yZSB0aGF0IGlzIHJlYWR5LAotICAgICAgICAvLyAgICAgICB3ZSBuZWVkIHRvIHJlbHkgb24gdGhlIGNvbnZlbnRpb25hbCBidWZmZXIgcXVldWUgYmVoYXZpb3Igd2hlcmUKLSAgICAgICAgLy8gICAgICAgYnVmZmVyX2hhbmRsZV90J3MgRkQgd29uJ3QgY2hhbmdlLgotICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCi0gICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRnJlZWQoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgdWludDY0X3Q+PiBtRnJlZWRCdWZmZXJzOworCisgICAgICAgIC8vIEJ1ZmZlcnMgZ2l2ZW4gdG8gSEFMIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgc3RkOjptdXRleCBtUmVxdWVzdGVkQnVmZmVyc0xvY2s7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgYnVmZmVyX2hhbmRsZV90Kj4gbVJlcXVlc3RlZEJ1ZmZlcnM7CisKKyAgICAgICAgdWludDMyX3QgbU5leHRTdHJlYW1Db25maWdDb3VudGVyID0gMTsKKworICAgICAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworICAgICAgICBib29sIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkOwogICAgIH07CiAKICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CkBAIC00MTAsOSArNDM4LDIyIEBACiAgICAgLy8gVHJhY2tpbmcgY2F1c2Ugb2YgZmF0YWwgZXJyb3JzIHdoZW4gaW4gU1RBVFVTX0VSUk9SCiAgICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgICAgbUVycm9yQ2F1c2U7CiAKLSAgICAvLyBNYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcwotICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+Ci0gICAgICAgICAgICBTdHJlYW1TZXQ7CisgICAgLy8gU3luY2hyb25pemVkIG1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCisgICAgY2xhc3MgU3RyZWFtU2V0IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgYWRkKGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4pOworICAgICAgICBzc2l6ZV90IHJlbW92ZShpbnQgc3RyZWFtSWQpOworICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBnZXQoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgLy8gZ2V0IGJ5ICh1bmRlcmx5aW5nKSB2ZWN0b3IgaW5kZXgKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBnZXRTdHJlYW1JZHMoKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgICBwcml2YXRlOgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4+IG1EYXRhOworICAgIH07CiAKICAgICBTdHJlYW1TZXQgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CkBAIC00ODEsOCArNTIyLDkgQEAKIAogCiAgICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawogICAgICAqLworCiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwpAQCAtNDkzLDYgKzUzNSwxNSBAQAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwogCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKwogICAgIC8vIEhhbmRsZSBvbmUgY2FwdHVyZSByZXN1bHQuIEFzc3VtZSB0aGF0IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sgaXMgaGVsZC4KICAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCkBAIC02NTMsMjcgKzcwNCw2IEBACiAgICAgICovCiAgICAgc3RhdGljIG5zZWNzX3QgZ2V0TW9ub1RvQm9vdHRpbWVPZmZzZXQoKTsKIAotICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcwotICAgICAqLwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7Ci0gICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCi0gICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7Ci0gICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKLSAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7Ci0gICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0KICAgICBzdHJ1Y3QgUmVxdWVzdFRyaWdnZXIgewogICAgICAgICAvLyBNZXRhZGF0YSB0YWcgbnVtYmVyLCBlLmcuIGFuZHJvaWQuY29udHJvbC5hZVByZWNhcHR1cmVUcmlnZ2VyCiAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhVGFnOwpAQCAtNzAwLDcgKzczMCw5IEBACiAKICAgICAgICAgUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzKTsKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgflJlcXVlc3RUaHJlYWQoKTsKIAogICAgICAgICB2b2lkICAgICBzZXROb3RpZmljYXRpb25MaXN0ZW5lcih3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpOwpAQCAtNzg4LDYgKzgyMCw4IEBACiAgICAgICAgICAgICBtUmVxdWVzdExhdGVuY3kuZHVtcChmZCwgbmFtZSk7CiAgICAgICAgIH0KIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKwogICAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CkBAIC04OTcsMTIgKzkzMSwxMyBAQAogCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkOwogCi0gICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIGFuZCB3YWl0VW50aWxQYXVzZWQKKyAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgd2FpdFVudGlsUGF1c2VkLCBhbmQgc2lnbmFsUGlwZWxpbmVEcmFpbgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVBhdXNlTG9jazsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Eb1BhdXNlOwogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbURvUGF1c2VTaWduYWw7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUGF1c2VkOwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVBhdXNlZFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkOwogCiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBtUHJldlJlcXVlc3Q7CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtUHJldlRyaWdnZXJzOwpAQCAtOTM1LDYgKzk3MCw4IEBACiAKICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICAgIG1TZXNzaW9uUGFyYW1LZXlzOwogICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXM7CisKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTk5NSw2ICsxMDMyLDE1IEBACiAgICAgICAgIC8vIE1hcCBvZiBwaHlzaWNhbENhbWVyYUlkIDwtPiBNZXRhZGF0YQogICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbE1ldGFkYXRhczsKIAorICAgICAgICAvLyBJbmRpY2F0ZXMgYSBzdGlsbCBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGJvb2wgc3RpbGxDYXB0dXJlOworCisgICAgICAgIC8vIEluZGljYXRlcyBhIFpTTCBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgYm9vbCB6c2xDYXB0dXJlOworCisgICAgICAgIC8vIFdoYXQgc2hhcmVkIHN1cmZhY2VzIGFuIG91dHB1dCBzaG91bGQgZ28gdG8KKyAgICAgICAgU3VyZmFjZU1hcCBvdXRwdXRTdXJmYWNlczsKKwogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKQEAgLTEwMDUsMTIgKzEwNTEsMTYgQEAKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2sodHJ1ZSksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgeworICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGZhbHNlKSB7CiAgICAgICAgIH0KIAogICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQpIDoKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCwgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLApAQCAtMTAyMSw3ICsxMDcxLDEwIEBACiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pLAogICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCkgeworICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpLAorICAgICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShpc1N0aWxsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgenNsQ2FwdHVyZShpc1pzbENhcHR1cmUpLAorICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKG91dFN1cmZhY2VzKSB7CiAgICAgICAgIH0KICAgICB9OwogCkBAIC0xMDM1LDEwICsxMDg4LDExIEBACiAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG1JbkZsaWdodFN0YXR1c0lkOwogCi0KICAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGV4cGVjdGVkIHRpbWUgaXQnbGwgdGFrZSBmb3IgYWxsIGN1cnJlbnRseSBpbi1mbGlnaHQKQEAgLTExNDgsNyArMTIwMiwxMSBAQAogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIHN0cmVhbXMuCiAgICAgdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAorICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKIAogICAgIC8vIFNlbmQgYSBwYXJ0aWFsIGNhcHR1cmUgcmVzdWx0LgogICAgIHZvaWQgc2VuZFBhcnRpYWxDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogcGFydGlhbFJlc3VsdCwKQEAgLTEyMDQsMTMgKzEyNjIsODggQEAKICAgICAvLyBDYWNoZWQgbGFzdCByZXF1ZXN0ZWQgdGVtcGxhdGUgaWQKICAgICBpbnQgbUxhc3RUZW1wbGF0ZUlkOwogCi0gICAgLyoqCi0gICAgICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICAgICAqLwotICAgIHN0YXRpYyBjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90IHNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKKyAgICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHN0YXR1cyB0cmFja2VyIGJldHdlZW4gaW5mbGlnaHQgdXBkYXRlcyBhbmQgZGlzY29ubmVjdC4KKyAgICAvLyBiLzc5OTcyODY1CisgICAgTXV0ZXggbVRyYWNrZXJMb2NrOwogCi0gICAgc3RhdGljIGNhbGxiYWNrc19ub3RpZnlfdCBzTm90aWZ5OworICAgIC8vIFdoZXRoZXIgSEFMIHJlcXVlc3QgYnVmZmVycyB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXJzIEFQSQorICAgIGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZTsKIAorICAgIC8vIExvY2sgdG8gZW5zdXJlIHJlcXVlc3RTdHJlYW1CdWZmZXJzKCkgY2FsbGJhY2tzIGFyZSBzZXJpYWxpemVkCisgICAgc3RkOjptdXRleCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2s7CisKKyAgICAvLyBUaGUgc3RhdGUgbWFjaGluZSB0byBjb250cm9sIHdoZW4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgc2hvdWxkIGFsbG93CisgICAgLy8gSEFMIHRvIHJlcXVlc3QgYnVmZmVycy4KKyAgICBlbnVtIFJlcXVlc3RCdWZmZXJTdGF0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcmV0dXJuIEZBSUxFRF9DT05GSUdVUklORyBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaWxsIHN3aXRjaCB0byBSQl9TVEFUVVNfUkVBRFkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbmZpZ3VyZVN0cmVhbXMgb3IKKyAgICAgICAgICogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IGNhbGwuCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfU1RPUFBFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2hlbiBkZXZpY2UgaXMgYXNrZWQgdG8gc3RheSBpZGxlIHZpYSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKSBjYWxsOgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgaWYgdGhlcmUgaXMgbm8gaW5mbGlnaHQgcmVxdWVzdHMgYW5kCisgICAgICAgICAqICAgICAgIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19QRU5ESU5HX1NUT1Agb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCB3aGVuIGFsbCBpbmZsaWdodCByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkCisgICAgICAgICAqIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19QRU5ESU5HX1NUT1AsCisgICAgfTsKKworICAgIGNsYXNzIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpOworCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc3RhdGUgbWFjaGluZSBjdXJyZW50bHkgYWxsb3dzIGZvciByZXF1ZXN0QnVmZmVycworICAgICAgICAvLyBJZiB0aGUgc3RhdGUgYWxsb3dzIGZvciBpdCwgbVJlcXVlc3RCdWZmZXJPbmdvaW5nIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgLy8gYW5kIGNhbGxlciBtdXN0IGNhbGwgZW5kUmVxdWVzdEJ1ZmZlcigpIGxhdGVyIHRvIHVuc2V0IHRoZSBmbGFnCisgICAgICAgIGJvb2wgc3RhcnRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgIHZvaWQgZW5kUmVxdWVzdEJ1ZmZlcigpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgYXBwbGljYXRpb24gQVBJIGNhbGwKKyAgICAgICAgdm9pZCBvblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgICAgIHZvaWQgb25XYWl0VW50aWxJZGxlKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IGh3QmluZGVyIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBCdXQgY2FuIGFsc28gYmUgdHJpZ2dlcmVkIG9uIHJlcXVlc3QgdGhyZWFkIGZvciBmYWlsZWQgcmVxdWVzdCwgb3Igb24KKyAgICAgICAgLy8gaHdiaW5kZXIgbm90aWZ5IGNhbGxiYWNrIHRocmVhZCBmb3Igc2h1dHRlci9lcnJvciBjYWxsYmFja3MKKyAgICAgICAgdm9pZCBvbkluZmxpZ2h0TWFwRW1wdHkoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IFJlcXVlc3RUaHJlYWQKKyAgICAgICAgdm9pZCBvblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgICAgIHZvaWQgb25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSk7CisKKyAgICAgICAgLy8gU3dpdGNoIHRvIFNUT1BQRUQgc3RhdGUgYW5kIHJldHVybiB0cnVlIGlmIGFsbCBjb25kaXRpb25zIGFsbG93cyBmb3IgaXQuCisgICAgICAgIC8vIE90aGVyd2lzZSBkbyBub3RoaW5nIGFuZCByZXR1cm4gZmFsc2UuCisgICAgICAgIGJvb2wgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBSZXF1ZXN0QnVmZmVyU3RhdGUgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworCisgICAgICAgIGJvb2wgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgICAgICBib29sIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSBmYWxzZTsKKworICAgICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKKyAgICAgICAgaW50ICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkOworICAgIH0gbVJlcXVlc3RCdWZmZXJTTTsKKworICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGJvb2wgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzOworICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSk7CiB9OyAvLyBjbGFzcyBDYW1lcmEzRGV2aWNlCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKaW5kZXggZmIxZmY3Ny4uYjYzNzE2MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC01OCw2ICs1OCw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKICAgICAgICAgICAgIG5zZWNzX3QsCiAgICAgICAgICAgICBib29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4qKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDQ2Mjc1NDguLjRiNjdlYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtODcsNiArODcsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTA0LDYgKzEwNyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMTI4LDcgKzEzMiw3IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IDNjMWU0M2QuLjJlOTA5YTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCi1zaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKIH0KIApAQCAtMjE5LDcgKzIxOSw4IEBACiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpyZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgLy8gcmV0dXJuQnVmZmVyIG1heSBiZSBjYWxsZWQgZnJvbSBhIHJhdyBwb2ludGVyLCBub3QgYSBzcDw+LCBhbmQgd2UnbGwgYmUKQEAgLTIzNSw3ICsyMzYsNyBAQAogICAgIH0KIAogICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2U7Ci0gICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LAorICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIG91dHB1dCwgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZUZlbmNlKTsKICAgICAvLyBSZXMgbWF5IGJlIGFuIGVycm9yLCBidXQgd2Ugc3RpbGwgd2FudCB0byBkZWNyZW1lbnQgb3VyIG93bmVkIGNvdW50CiAgICAgLy8gdG8gZW5hYmxlIGNsZWFuIHNodXRkb3duLiBTbyB3ZSdsbCBqdXN0IHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCAwYTMxZDQ0Li43NTBmNjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtNjYsMTIgKzY2LDE0IEBACiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSA9IDA7CiAKQEAgLTgyLDcgKzg0LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDAxN2Q3YmUuLmZjODM2ODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggMDczMjQ2NC4uOTdhNjI3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC02Miw2ICs2Miw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMmMwMjBhMi4uOGNkNTc1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0xODcsMTYgKzE4NywxNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIHJldHVybiBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgLypvdXRwdXQqL3RydWUpOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgLypvdXRwdXQqL3RydWUsIHN1cmZhY2VfaWRzKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTIxMiw2ICsyMTMsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCkBAIC0yMzcsMTIgKzIzOSwxNCBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBidWZmZXIgYmFjayB0byBBTmF0aXZlV2luZG93CiAgICAgICovCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycykgeworICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiB8fCBtRHJvcEJ1ZmZlcnMgfHwgdGltZXN0YW1wID09IDApIHsKICAgICAgICAgLy8gQ2FuY2VsIGJ1ZmZlcgogICAgICAgICBpZiAobURyb3BCdWZmZXJzKSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IERyb3BwaW5nIGEgZnJhbWUgZm9yIHN0cmVhbSAlZC4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogQSBmcmFtZSBpcyBkcm9wcGVkIGZvciBzdHJlYW0gJWQgZHVlIHRvIGJ1ZmZlciBlcnJvci4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wIHNob3VsZG4ndCBiZSAwIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICB9CiAKICAgICAgICAgcmVzID0gY3VycmVudENvbnN1bWVyLT5jYW5jZWxCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLApAQCAtMjc5LDcgKzI4Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSwgc3VyZmFjZV9pZHMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWVpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6ICIKICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNjU5LDEyICs2NjMsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHVpbnQ2NF90IHUgPSAwOwordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKSB7CisgICAgaWYgKGNvbnN1bWVyVXNhZ2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CiAgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCiAgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCiAgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCkBAIC02NzMsMTIgKzY3NiwyMCBAQAogICAgIC8vICAgICAyLiBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUgogICAgIC8vICAgICAzLiBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCiAgICAgLy8gICAgIDQuIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUgotICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgKHUgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAorICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAoKmNvbnN1bWVyVXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikpID09IDApIHsKLSAgICAgICAgdSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CisgICAgICAgICpjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKICAgICB9Cit9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgdWludDY0X3QgdSA9IDA7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKKyAgICBhcHBseVpTTFVzYWdlUXVpcmsoY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgJnUpOwogICAgICp1c2FnZSA9IHU7CiAgICAgcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggNmYzNmY5Mi4uMjEyOGRhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTE5MCw2ICsxOTAsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTk4LDYgKzIwMSwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CiAKKyAgICAvKioKKyAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKQEAgLTIxMyw2ICsyMjEsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTI4NSwxMCArMjk0LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggYTcxMWE2ZC4uMmJkZTk0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKQEAgLTY3LDYgKzY3LDE4IEBACiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhbmQgb25seSBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiBzdXJmYWNlIHNoYXJpbmcuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IGZiM2NlNGMuLmUzYjc0ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1TaGFyZWRPdVN0cm0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgIkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjgsMTYgKzMyLDE3IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGludCBzZXRJZCkgOgorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gc3RkOjptaW4oc3VyZmFjZXMuc2l6ZSgpLCBrTWF4T3V0cHV0cyk7CiAgICAgaWYgKHN1cmZhY2VzLnNpemUoKSA+IGNvbnN1bWVyQ291bnQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gYWRkIG1vcmUgY29uc3VtZXJzIHRoYW4gdGhlIG1heGltdW0gIiwgX19mdW5jX18pOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN1bWVyQ291bnQ7IGkrKykgewotICAgICAgICBtU3VyZmFjZXNbaV0gPSBzdXJmYWNlc1tpXTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaV0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlc1tpXSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogfQogCkBAIC00OCwxNSArNTMsMTUgQEAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKTsKKyAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKG1Vc2VIYWxCdWZNYW5hZ2VyKTsKIAogICAgIHVpbnQ2NF90IHVzYWdlOwogICAgIGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKIAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiBpbml0aWFsU3VyZmFjZXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VzW2ldKTsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGluaXRpYWxTdXJmYWNlcy5lbXBsYWNlKGksIG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzEsNiArNzYsMzEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjphdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKAorICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgorICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKKyAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCisgICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKKyAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06Om5vdGlmeUJ1ZmZlclJlbGVhc2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFud0J1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKQEAgLTg5LDcgKzExOSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiAobVN1cmZhY2VzW3N1cmZhY2VfaWRdID09IG51bGxwdHIpOworICAgIHJldHVybiAobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZV9pZF0uZmlyc3QgPT0gbnVsbHB0cik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzKSB7CkBAIC0xMTIsNyArMTQyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KIAotICAgICAgICBtU3VyZmFjZXNbaWRdID0gc3VyZmFjZTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaWRdID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAKICAgICAgICAgLy8gT25seSBjYWxsIGFkZE91dHB1dCBpZiB0aGUgc3BsaXR0ZXIgaGFzIGJlZW4gY29ubmVjdGVkLgogICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKQEAgLTEyOCw3ICsxNTgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMpIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CiAgICAgaW50IGZlbmNlRmQgPSAtMTsKIApAQCAtMTM4LDIzICsxNjgsMTEgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgotICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKLSAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCi0gICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOwotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYW5iLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgsOCArMTg2LDM4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgaWYgKHVuaXF1ZVN1cmZhY2VJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5pcXVlU3VyZmFjZUlkcyBtdXN0IG5vdCBiZSBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3VyZmFjZUlkczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB1bmlxdWVJZCA6IHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICAgICAgICAgIGJvb2wgdW5pcXVlSWRGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLnNlY29uZCA9PSB1bmlxdWVJZCkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlSWRzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdW5pcXVlSWRGb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogdW5rbm93biB1bmlxdWUgc3VyZmFjZSBJRCAlenUgZm9yIHN0cmVhbSAlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1bmlxdWVJZCwgbUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGJ1ZmZlciwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKIAogICAgIC8vIEFmdGVyIHF1ZXVpbmcgYnVmZmVyIHRvIHRoZSBpbnRlcm5hbCBjb25zdW1lciBxdWV1ZSwgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIGlzCiAgICAgLy8gc3VjY2Vzc2Z1bGx5IHF1ZXVlZCB0byB0aGUgb3V0cHV0IHF1ZXVlcy4KQEAgLTIyOCw4ICsyNzYsOCBAQAogICAgICAgICAqdXNhZ2UgPSBnZXRQcmVzZXRDb25zdW1lclVzYWdlKCk7CiAKICAgICAgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGtNYXhPdXRwdXRzOyBpZCsrKSB7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VzW2lkXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlc1tpZF0pOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCk7CiAgICAgICAgICAgICAgICAgKnVzYWdlIHw9IHU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI0NSw3ICsyOTMsNyBAQAogc3NpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCkgewogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjU4LDcgKzMwNiw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBzdXJmYWNlKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBzdXJmYWNlKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjY3LDYgKzMxNSwyNiBAQAogICAgIHJldHVybiBpZDsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0VW5pcXVlU3VyZmFjZUlkcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAob3V0VW5pcXVlSWRzID09IG51bGxwdHIgfHwgc3VyZmFjZUlkcy5zaXplKCkgPiBrTWF4T3V0cHV0cykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG91dFVuaXF1ZUlkcy0+Y2xlYXIoKTsKKyAgICBvdXRVbmlxdWVJZHMtPnJlc2VydmUoc3VyZmFjZUlkcy5zaXplKCkpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBzdXJmYWNlSWQgOiBzdXJmYWNlSWRzKSB7CisgICAgICAgIGlmIChzdXJmYWNlSWQgPj0ga01heE91dHB1dHMpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgb3V0VW5pcXVlSWRzLT5wdXNoX2JhY2sobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXS5zZWNvbmQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQoCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZXMsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZhdHRhY2hlZFN1cmZhY2VzKSB7CkBAIC0yODAsNyArMzQ4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gbnVsbHB0cjsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkU3VyZmFjZXMuc2l6ZSgpOyBpKyspIHsKQEAgLTI5MSw3ICszNTksOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKQEAgLTM0Myw4ICs0MTIsOCBAQAogCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2l0XSA9IG51bGxwdHI7Ci0gICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VzW2l0XSwgaXQpOworICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlVW5pcXVlSWRzW2l0XS5maXJzdCwgaXQpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpdF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICAvL05leHQgYWRkIHRoZSBuZXcgb3V0cHV0cwpAQCAtMzY5LDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbc3VyZmFjZUlkXSA9IGl0OworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdID0gc3RkOjptYWtlX3BhaXIoaXQsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgICAgICBvdXRwdXRNYXAtPmFkZChpdCwgc3VyZmFjZUlkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKaW5kZXggMDJiMWMwOS4uYjVlMzdjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCIKICNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAKQEAgLTM3LDcgKzM4LDggQEAKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpOwogCkBAIC00OSw2ICs1MSwxNSBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKQEAgLTU4LDggKzY5LDE3IEBACiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRzID0gNDsKIAotICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gb3V0cHV0IHN1cmZhY2VzCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2VzW2tNYXhPdXRwdXRzXTsKKyAgICAvLyBXaGV0aGVyIEhBTCBpcyBpbiBjb250cm9sIGZvciBidWZmZXIgbWFuYWdlbWVudC4gU3VyZmFjZSBzaGFyaW5nIGJlaGF2aW9yCisgICAgLy8gZGVwZW5kcyBvbiB0aGlzIGZsYWcuCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKworICAgIC8vIFBhaXIgb2YgYW4gb3V0cHV0IFN1cmZhY2UgYW5kIGl0cyB1bmlxdWUgSUQKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiBTdXJmYWNlVW5pcXVlSWQ7CisKKyAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IChvdXRwdXQgc3VyZmFjZSwgdW5pcXVlIHN1cmZhY2UgSUQpCisgICAgc3RkOjphcnJheTxTdXJmYWNlVW5pcXVlSWQsIGtNYXhPdXRwdXRzPiBtU3VyZmFjZVVuaXF1ZUlkczsKKworICAgIHNpemVfdCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCA9IDA7CiAKICAgICBzc2l6ZV90IGdldE5leHRTdXJmYWNlSWRMb2NrZWQoKTsKIApAQCAtNzgsMTMgKzk4LDI0IEBACiAgICAgc3RhdHVzX3QgY29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCk7CiAKICAgICAvKioKKyAgICAgKiBBdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gc3RyZWFtIHNwbGl0dGVyLgorICAgICAqIFdoZW4gY2FtZXJhIHNlcnZpY2UgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgICAgICogYmVmb3JlIHRoZSBidWZmZXIgaXMgaGFuZGVkIG91dCB0byBIQUwgaW4gcmVxdWVzdCB0aHJlYWQuCisgICAgICogV2hlbiBIQUwgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4KKyAgICAgKiB0aGUgYnVmZmVyIGlzIHJldHVybmVkIGZyb20gSEFMIGluIGh3YmluZGVyIGNhbGxiYWNrIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKKworICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDdlYmMyOTkuLjA1NzE3NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNjcsNyArNjcsOCBAQAogICAgIG1CdWZmZXJMaW1pdExhdGVuY3koa0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUpLAogICAgIG1Gb3JtYXRPdmVycmlkZGVuKGZhbHNlKSwKICAgICBtT3JpZ2luYWxGb3JtYXQoLTEpLAotICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSwKKyAgICBtTGFzdFRpbWVzdGFtcCgwKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtNTg3LDcgKzU4OCwxMSBAQAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FCQU5ET05FRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgpAQCAtNjU0LDcgKzY1OSw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC02NjYsNiArNjcyLDE1IEBACiAKICAgICByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihidWZmZXIpOwogCisgICAgLy8gQnVmZmVyIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCwgc28gbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmVhbV9idWZmZXIgc3RydWN0LgorICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciBiID0gYnVmZmVyOworICAgIGlmICh0aW1lc3RhbXBJbmNyZWFzaW5nICYmIHRpbWVzdGFtcCAhPSAwICYmIHRpbWVzdGFtcCA8PSBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIGlzIG5vdCBpbmNyZWFzaW5nLiBQcmV2IHRpbWVzdGFtcCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVzdGFtcCwgbUxhc3RUaW1lc3RhbXApOworICAgICAgICBiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKICAgICAvKioKICAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KICAgICAgKgpAQCAtNjc0LDkgKzY4OSw5IEBACiAgICAgICoKICAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHN1cmZhY2VfaWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOworICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CiAgICAgfQogCiAgICAgLy8gRXZlbiBpZiByZXR1cm5pbmcgdGhlIGJ1ZmZlciBmYWlsZWQsIHdlIHN0aWxsIHdhbnQgdG8gc2lnbmFsIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgdGhlCkBAIC03NTIsOCArNzY3LDIyIEBACiAgICAgcmV0dXJuIGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQocHJvZHVjZXIpOwogfQogCit2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgZm9yIChhdXRvICZpdCA6IG1CdWZmZXJMaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lciA9IGl0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcihmcmFtZU51bWJlciwgZ2V0SWQoKSwgc2V0dGluZ3MpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCkgeworICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+OjppdGVyYXRvciBpdCwgZW5kOwogCiAgICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGluZwpAQCAtNzYyLDYgKzc5MSw4IEBACiAgICAgICAgIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcjo6QnVmZmVySW5mbygpOwogICAgIGluZm8ubU91dHB1dCA9IG91dHB1dDsKICAgICBpbmZvLm1FcnJvciA9IChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUik7CisgICAgaW5mby5tRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICBpbmZvLm1UaW1lc3RhbXAgPSB0aW1lc3RhbXA7CiAgICAgLy8gVE9ETzogcmVzdCBvZiBmaWVsZHMKIAogICAgIGZvciAoaXQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmJlZ2luKCksIGVuZCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuZW5kKCk7CkBAIC03ODUsNiArODE2LDEyIEBACiAgICAgcmV0dXJuIGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpOwogfQogCitzaXplX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzZXRTdGF0dXNUcmFja2VyKHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gb2xkVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKQEAgLTgyNyw3ICs4NjQsNyBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggMDM1NTk3OC4uNWViNmEyMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTMyMiwxMSArMzIyLDE4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTM2MCw2ICszNjcsMTEgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpAQCAtNDE5LDYgKzQzMSwxMiBAQAogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmVzdG9yZUNvbmZpZ3VyZWRTdGF0ZSgpOwogCisgICAgLyoqCisgICAgICogTm90aWZ5IGJ1ZmZlciBzdHJlYW0gbGlzdGVuZXJzIGFib3V0IGluY29taW5nIHJlcXVlc3Qgd2l0aCBwYXJ0aWN1bGFyIGZyYW1lIG51bWJlci4KKyAgICAgKi8KKyAgICB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCiAgIHByb3RlY3RlZDoKICAgICBjb25zdCBpbnQgbUlkOwogICAgIC8qKgpAQCAtNDczLDcgKzQ5MSw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOwpAQCAtNDk1LDcgKzUxNCw3IEBACiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IG91dHB1dCBidWZmZXIgY291bnQuCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdCA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBpbnB1dCBidWZmZXIgY291bnQuCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKQEAgLTUyNiw3ICs1NDUsNyBAQAogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIHZvaWQgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCwgbnNlY3NfdCB0aW1lc3RhbXAgPSAwLCB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApOwogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+IG1CdWZmZXJMaXN0ZW5lckxpc3Q7CiAKICAgICBzdGF0dXNfdCAgICAgICAgY2FuY2VsUHJlcGFyZUxvY2tlZCgpOwpAQCAtNTY2LDYgKzU4NSw3IEBACiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgbU9yaWdpbmFsRGF0YVNwYWNlOwogCiAgICAgU3RyaW5nOCBtUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBuc2Vjc190IG1MYXN0VGltZXN0YW1wOwogfTsgLy8gY2xhc3MgQ2FtZXJhM1N0cmVhbQogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKaW5kZXggMmRiMzMzZC4uZDBhZWUyNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTUJVRkZFUkxJU1RFTkVSX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKQEAgLTQxLDYgKzQyLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CiAgICAgLy8gQnVmZmVyIHdhcyByZWxlYXNlZCBieSB0aGUgSEFMCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgPSAwOworICAgIC8vIE5vdGlmeSBhYm91dCBpbmNvbWluZyBidWZmZXIgcmVxdWVzdCBmcmFtZSBudW1iZXIKKyAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgPSAwOwogfTsKIAogfTsgLy9uYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAppbmRleCAzZDQ1Yzg5Li41Y2QxMWI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaApAQCAtMTgsNiArMTgsOCBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1fSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyLmgiCiAKQEAgLTI0OCwxMSArMjUwLDE5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLiBGb3IgdGhlIGNhc2Ugb2Ygc2luZ2xlIHN1cmZhY2UgZm9yIGEgSEFMCisgICAgICogc3RyZWFtLCBzdXJmYWNlX2lkcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBmb3IgYnVmZmVycyBwcm92aWRlZCBieSBnZXRCdWZmZXIoKS4KICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBvdXRwdXQtc2lkZSBidWZmZXJzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgPSAwOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCkBAIC0yODksNiArMjk5LDExIEBACiAgICAgICovCiAgICAgdmlydHVhbCBib29sICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0ID0gMDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpAQCAtMzI5LDYgKzM0NCwxMiBAQAogICAgICAqIENhbWVyYTNTdHJlYW0uCiAgICAgICovCiAgICAgdmlydHVhbCB2b2lkIHNldEJ1ZmZlckZyZWVkTGlzdGVuZXIod3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXI+IGxpc3RlbmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYnVmZmVyIHN0cmVhbSBsaXN0ZW5lcnMgYWJvdXQgaW5jb21pbmcgcmVxdWVzdCB3aXRoIHBhcnRpY3VsYXIgZnJhbWUgbnVtYmVyLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmaXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKaW5kZXggZWNiOTgwYS4uODRjMmVjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcApAQCAtMTUyLDYgKzE1Miw4IEBACiAgICAgU1BfTE9HVigiJXM6IERpc2Nvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKK0NhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Q2FtZXJhM1N0cmVhbVNwbGl0dGVyKGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7fQogCiBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6On5DYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKSB7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMjQxLDcgKzI0Myw5IEBACiAgICAgdWludDY0X3QgdXNhZ2UgPSAwOwogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihvdXRwdXRRdWV1ZS5nZXQoKSksICZ1c2FnZSk7CiAgICAgaWYgKCEodXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSkpKSB7Ci0gICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICBuc2Vjc190IHRpbWVvdXQgPSBtVXNlSGFsQnVmTWFuYWdlciA/CisgICAgICAgICAgICAgICAga0hhbEJ1Zk1nckRlcXVldWVCdWZmZXJUaW1lb3V0IDoga05vcm1hbERlcXVldWVCdWZmZXJUaW1lb3V0OworICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dCk7CiAgICAgfQogCiAgICAgcmVzID0gZ2JwLT5hbGxvd0FsbG9jYXRpb24oZmFsc2UpOwpAQCAtNDM2LDggKzQ0MCw5IEBACiAgICAgICAgIHJlcyA9IGdicC0+YXR0YWNoQnVmZmVyKCZzbG90LCBnYik7CiAgICAgICAgIG1NdXRleC5sb2NrKCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBDYW5ub3QgYWNxdWlyZUJ1ZmZlciBmcm9tIEdyYXBoaWNCdWZmZXJQcm9kdWNlciAlcDogJXMgKCVkKSIsCisgICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGF0dGFjaEJ1ZmZlciBmcm9tIEdyYXBoaWNCdWZmZXJQcm9kdWNlciAlcDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ2JwLmdldCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgdG8gZGV0YWNoL2NsZWFudXAgdGhlIGFscmVhZHkgYXR0YWNoZWQgYnVmZmVycyBiZWZvcmUgcmV0dXJuPwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICBpZiAoKHNsb3QgPCAwKSB8fCAoc2xvdCA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggMWVhZjJiZC4uOTYwZjdhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC00OSw3ICs0OSw3IEBACiBwdWJsaWM6CiAKICAgICAvLyBDb25zdHJ1Y3RvcgotICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcigpID0gZGVmYXVsdDsKKyAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgLy8gQ29ubmVjdCB0byB0aGUgc3RyZWFtIHNwbGl0dGVyIGJ5IGNyZWF0aW5nIGJ1ZmZlciBxdWV1ZSBhbmQgY29ubmVjdGluZyBpdAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgpAQCAtMjI2LDcgKzIyNiwxMCBAQAogICAgIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IG1Gb3JtYXQgPSBhbmRyb2lkOjpQSVhFTF9GT1JNQVRfTk9ORTsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJVc2FnZSA9IDA7CiAKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICA9IHMybnMoMSk7IC8vIDEgc2VjCisgICAgLy8gVGhlIGF0dGFjaEJ1ZmZlciBjYWxsIHdpbGwgaGFwcGVuIG9uIGRpZmZlcmVudCB0aHJlYWQgYWNjb3JkaW5nIHRvIG1Vc2VIYWxCdWZNYW5hZ2VyIGFuZCBoYXZlCisgICAgLy8gZGlmZmVyZW50IHRpbWluZyBjb25zdHJhaW50LgorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dCAgICA9IHMybnMoMSk7ICAvLyAxIHNlYworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA9IG1zMm5zKDEpOyAvLyAxIG1zZWMKIAogICAgIE11dGV4IG1NdXRleDsKIApAQCAtMjczLDYgKzI3Niw4IEBACiAgICAgc2l6ZV90IG1BY3F1aXJlZElucHV0QnVmZmVyczsKIAogICAgIFN0cmluZzggbUNvbnN1bWVyTmFtZTsKKworICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAppbmRleCA0ZGFmZWZkLi5hZTdhZjhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKQEAgLTMxMiw4ICszMTIsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBSYXdUb0NvcnJlY3RlZChjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtMzIxLDggKzMyMSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC00MDAsOCArNDAwLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTQwOSw4ICs0MDksOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MzUwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7CisKK2NvbnN0IGNoYXIgKkgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6a1Jlc3VsdEtleSA9ICJDYXB0dXJlUmVzdWx0IjsKKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworYm9vbCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmluaXRpYWxpemVMb29wZXIoKSB7CisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJjcy1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KC8qcnVuT25DYWxsaW5nVGhyZWFkKi8gZmFsc2UsIC8qY2FuQ2FsbEphdmEqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT1PSykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjp+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkgeworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VFcnJvcigKKyAgICBpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlRXJyb3IoY29udmVydFRvSGlkbChlcnJvckNvZGUpLCBoQ2FwdHVyZVJlc3VsdEV4dHJhcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUVycm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUlkbGUoKSB7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VJZGxlKCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlSWRsZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkNhcHR1cmVTdGFydGVkKAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25DYXB0dXJlU3RhcnRlZChoQ2FwdHVyZVJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uQ2FwdHVyZUNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpoUmVzdWx0TWV0YWRhdGEpIHsKKyAgICAvLyBGaXJzdCB0cnkgd3JpdGluZyB0byBmbXEuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmCisgICAgICAgIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPndyaXRlKCh1aW50OF90ICopcmF3TWV0YWRhdGEsIG1ldGFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPmZtcU1ldGFkYXRhU2l6ZShtZXRhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBDb3VsZG4ndCB1c2UgZm1xLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxSZWZCYXNlPiBvYmogPSBudWxscHRyOworICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBudWxscHRyOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZXN1bHRSZWNlaXZlZDoKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCByZXN1bHQgb2JqZWN0IGluIGNhbGxiYWNrIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRXcmFwcGVyID0gc3RhdGljX2Nhc3Q8UmVzdWx0V3JhcHBlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2UocmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbGxiYWNrIHNlbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6OnByb2Nlc3NSZXN1bHRNZXNzYWdlKAorICAgIHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKSB7CisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjb252ZXJ0ZXIgPSBtQ29udmVydGVyLnByb21vdGUoKTsKKyAgICBpZiAoY29udmVydGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbGxiYWNrIHdyYXBwZXIgaGFzIGRpZWQsIHJlc3VsdCBjYWxsYmFjayBjYW5ub3QgYmUgbWFkZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0OworICAgIGF1dG8gcmVzdWx0RXh0cmFzID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdEV4dHJhczsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoUmVzdWx0RXh0cmFzID0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworCisgICAgLy8gQ29udmVydCBNZXRhZGF0YSBpbnRvIEhDYW1lcmFNZXRhZGF0YTsKKyAgICBGbXFTaXplT3JNZXRhZGF0YSBoUmVzdWx0OworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IHJlc3VsdC5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydGVyLT5jb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwocmF3TWV0YWRhdGEsICZoUmVzdWx0KTsKKyAgICByZXN1bHQudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICBhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9IHJlc3VsdFdyYXBwZXItPm1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zID0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbCgKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsIGNvbnZlcnRlci0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICBhdXRvIHJldCA9IGNvbnZlcnRlci0+bUJhc2UtPm9uUmVzdWx0UmVjZWl2ZWQoaFJlc3VsdCwgaFJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAvLyBXcmFwIENhbWVyYU1ldGFkYXRhLCByZXN1bHRFeHRyYXMgYW5kIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zIGluIG9uCisgICAgLy8gc3A8UmVmQmFzZT4tYWJsZSBzdHJ1Y3R1cmUgYW5kIHBvc3QgaXQuCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG5ldyBSZXN1bHRXcmFwcGVyKGNvbnN0X2Nhc3Q8Q2FtZXJhTWV0YWRhdGFOYXRpdmUgJj4ocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VsdFJlY2VpdmVkLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRPYmplY3Qoa1Jlc3VsdEtleSwgcmVzdWx0V3JhcHBlcik7CisgICAgbXNnLT5wb3N0KCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIC8vIFRvIHNpbGVuY2UgV3VudXNlZC1wYXJhbWV0ZXIuCisgICAgKHZvaWQpIHN0cmVhbUlkOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgeworICAgIGF1dG8gcmV0ID0KKyAgICAgICAgbUJhc2UtPm9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGxhc3RGcmFtZU51bWJlciwgcmVwZWF0aW5nUmVxdWVzdElkKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uUmVwZWF0aW5nUmVxdWVzdEVyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVxdWVzdFF1ZXVlRW1wdHkoKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjUyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6Qm5DYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIGhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKworc3RydWN0IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssIElDYW1lcmFEZXZpY2VDYWxsYmFja3MsIEJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB7CisgICAgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpOworCisgICAgfkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpOworCisgICAgYm9vbCBpbml0aWFsaXplTG9vcGVyKCk7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcXVlc3RRdWV1ZUVtcHR5KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbWV0YWRhdGFRdWV1ZSkgeworICAgICAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBtZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgLy8gV3JhcHBlciBzdHJ1Y3Qgc28gdGhhdCBwYXJhbWV0ZXJzIHRvIG9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgbWF5IGJlCisgICAgLy8gc2VudCB0aHJvdWdoIGFuIEFNZXNzYWdlLgorICAgIHN0cnVjdCBSZXN1bHRXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBtUmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIG1SZXN1bHRFeHRyYXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICAgICAgUmVzdWx0V3JhcHBlcihDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgOgorICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIHN0ZDo6bW92YWJsZQorICAgICAgbVJlc3VsdChyZXN1bHQpLCBtUmVzdWx0RXh0cmFzKHJlc3VsdEV4dHJhcyksIG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyhwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeyB9CisgICAgfTsKKworICAgIHN0cnVjdCBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcihIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgKmNvbnZlcnRlcikgOiBtQ29udmVydGVyKGNvbnZlcnRlcikgeyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIHdwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gbUNvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBNdXRleCBtTWV0YWRhdGFRdWV1ZUxvY2s7CisgICAgfTsKKworICAgIHZvaWQgY29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKnJlc3VsdE1ldGFkYXRhKTsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXN1bHRSZWNlaXZlZCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtSZXN1bHRLZXk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlciA9IG51bGxwdHI7CisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyID0gbnVsbHB0cjsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzOworCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIHsKKyAgSENhbWVyYURldmljZVN0YXR1cyBoQ2FtZXJhRGV2aWNlU3RhdHVzID0gY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhzdGF0dXMpOworICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gaENhbWVyYURldmljZVN0YXR1czsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKTsKKyAgYXV0byByZXQgPSBtQmFzZS0+b25TdGF0dXNDaGFuZ2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICBBTE9HRSgiJXMgT25TdGF0dXNDaGFuZ2VkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICB9CisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3QsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmKSB7CisgIC8vIFdlIGRvbid0IGltcGxlbWVudCBvblRvcmNoU3RhdHVzQ2hhbmdlZAorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBjb21tb24KK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MTQzZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OkJuQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgaGFyZHdhcmU6OkJwQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordHlwZWRlZiBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKK3N0cnVjdCBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYVNlcnZpY2VMaXN0ZW5lciwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciwgQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHsKKyAgICBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworICAgIH5IMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoKSB7IH0KKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0YXR1c0NoYW5nZWQoaW50MzJfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMDExMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhaHlicmlkIHsKK3R5cGVkZWYgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBISW50ZXJmYWNlOworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0UgPgorY2xhc3MgSDJCQ29udmVydGVyIDogcHVibGljIEJOSU5URVJGQUNFIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPiBDQmFzZTsgLy8gQ29udmVydGVyIEJhc2UKKyAgICB0eXBlZGVmIElOVEVSRkFDRSBCYXNlSW50ZXJmYWNlOworICAgIHR5cGVkZWYgSElOVEVSRkFDRSBIYWxJbnRlcmZhY2U7CisKKyAgICBIMkJDb252ZXJ0ZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBtQmFzZShiYXNlKSB7fQorICAgIHZpcnR1YWwgc3A8SGFsSW50ZXJmYWNlPiBnZXRIYWxJbnRlcmZhY2UoKSB7IHJldHVybiBtQmFzZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwKKyAgICAgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gbnVsbHB0cik7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxIYWxJbnRlcmZhY2U+IG1CYXNlOworICAgIHN0cnVjdCBPYml0dWFyeSA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50OworICAgICAgICB2b2lkKiBjb29raWU7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICB3cDxJQmluZGVyPiB3aG87CisgICAgICAgIE9iaXR1YXJ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgciwKKyAgICAgICAgICAgICAgICB2b2lkKiBjLCB1aW50MzJfdCBmLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiB3KSA6CisgICAgICAgICAgICByZWNpcGllbnQociksIGNvb2tpZShjKSwgZmxhZ3MoZiksIHdobyh3KSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkoY29uc3QgT2JpdHVhcnkmIG8pIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChvLnJlY2lwaWVudCksCisgICAgICAgICAgICBjb29raWUoby5jb29raWUpLAorICAgICAgICAgICAgZmxhZ3Moby5mbGFncyksCisgICAgICAgICAgICB3aG8oby53aG8pIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeSYgb3BlcmF0b3I9KGNvbnN0IE9iaXR1YXJ5JiBvKSB7CisgICAgICAgICAgICByZWNpcGllbnQgPSBvLnJlY2lwaWVudDsKKyAgICAgICAgICAgIGNvb2tpZSA9IG8uY29va2llOworICAgICAgICAgICAgZmxhZ3MgPSBvLmZsYWdzOworICAgICAgICAgICAgd2hvID0gby53aG87CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCwgY29uc3Qgd3A8SEludGVyZmFjZT4mKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gZHIgPSByZWNpcGllbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBkci0+YmluZGVyRGllZCh3aG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBzdGQ6Om11dGV4IG1PYml0dWFyaWVzTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxzcDxPYml0dWFyeT4gPiBtT2JpdHVhcmllczsKK307CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIGxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncykgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVjaXBpZW50ID09IG51bGxwdHIsCisgICAgICAgICAgICAibGlua1RvRGVhdGgoKTogcmVjaXBpZW50IG11c3QgYmUgbm9uLW51bGxwdHIiKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgICAgIG1PYml0dWFyaWVzLnB1c2hfYmFjayhuZXcgT2JpdHVhcnkocmVjaXBpZW50LCBjb29raWUsIGZsYWdzLCB0aGlzKSk7CisgICAgICAgIGlmICghbUJhc2UtPmxpbmtUb0RlYXRoKG1PYml0dWFyaWVzLmJhY2soKSwgMCkpIHsKKyAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICBmb3IgKGF1dG8gaSA9IG1PYml0dWFyaWVzLmJlZ2luKCk7IGkgIT0gbU9iaXR1YXJpZXMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoKGZsYWdzID0gKCppKS0+ZmxhZ3MpICYmICgKKyAgICAgICAgICAgICAgICAocmVjaXBpZW50ID09ICgqaSktPnJlY2lwaWVudCkgfHwKKyAgICAgICAgICAgICAgICAoKHJlY2lwaWVudCA9PSBudWxscHRyKSAmJiAoY29va2llID09ICgqaSktPmNvb2tpZSkpKSkgeworICAgICAgICAgICAgaWYgKG91dFJlY2lwaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKm91dFJlY2lwaWVudCA9ICgqaSktPnJlY2lwaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1CYXNlLT51bmxpbmtUb0RlYXRoKCppKTsKKyAgICAgICAgICAgIG1PYml0dWFyaWVzLmVyYXNlKGkpOworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBOT19FUlJPUiA6IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhaHlicmlkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc4MTJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHV0aWxzIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczphdHRlbXB0IHRvIGNvbnZlcnQgZW1wdHkgbWV0YWRhdGEgdG8gSGlkbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplKTsKKyAgICByZXR1cm47Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgIHN3aXRjaCAoc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PUk1BTF9NT0RFOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoaXMKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VkVORE9SX01PREVfU1RBUlQ7CisgICAgfQorfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UFJFVklFVzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUFJFVklFVzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfU1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9SRUNPUkQ7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9WSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6TUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9NQU5VQUw7CisgICAgfQorfQorCitpbnQgY29udmVydEZyb21IaWRsKEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbiByb3RhdGlvbikgeworICAgIHN3aXRjaChyb3RhdGlvbikgeworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjA6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlI5MDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjE4MDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjI3MDoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgIH0KK30KKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGlHQlBzOworICAgIGF1dG8gJndpbmRvd0hhbmRsZXMgPSBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgIGlHQlBzLnJlc2VydmUod2luZG93SGFuZGxlcy5zaXplKCkpOworICAgIGZvciAoYXV0byAmaGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICBpR0JQcy5wdXNoX2JhY2sobmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoaGFuZGxlKSkpOworICAgIH0KKyAgICBTdHJpbmcxNiBwaHlzaWNhbENhbWVyYUlkMTYoaE91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGlHQlBzLCBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24pLCBwaHlzaWNhbENhbWVyYUlkMTYsCisgICAgICAgIGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0dyb3VwSWQsIE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9VTktOT1dOLCAwLCAwLAorICAgICAgICAod2luZG93SGFuZGxlcy5zaXplKCkgPiAxKSk7CisgICAgcmV0dXJuIG91dHB1dENvbmZpZ3VyYXRpb247Cit9CisKKy8vIFRoZSBjYW1lcmEgbWV0YWRhdGEgaGVyZSBpcyBjbG9uZWQuIFNpbmNlIHdlJ3JlIHJlYWRpbmcgbWV0YWRhdGEgb3ZlcgorLy8gaHdiaW5kZXIgd2Ugd291bGQgbmVlZCB0byBjbG9uZSBpdCBpbiBvcmRlciB0byBhdm9pZCBhbGlnbWVudCBpc3N1ZXMuCitib29sIGNvbnZlcnRGcm9tSGlkbChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJnNyYywgQ2FtZXJhTWV0YWRhdGEgKmRzdCkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4oc3JjLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHNyYy5zaXplKCk7CisgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICpkc3QgPSBidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitIQ2FtZXJhRGV2aWNlU3RhdHVzIGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoaW50MzJfdCBzdGF0dXMpIHsKKyAgICBIQ2FtZXJhRGV2aWNlU3RhdHVzIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19VTktOT1dOOworICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlU3RhdHVzOworfQorCitIQ2FwdHVyZVJlc3VsdEV4dHJhcyBjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmNhcHR1cmVSZXN1bHRFeHRyYXMpIHsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhczsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5idXJzdElkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOworICAgIHJldHVybiBoQ2FwdHVyZVJlc3VsdEV4dHJhczsKK30KKworSEVycm9yQ29kZSBjb252ZXJ0VG9IaWRsKGludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgc3dpdGNoKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFIDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9SRVFVRVNUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVI7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ESVNBQkxFRDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfSU5WQUxJRF9FUlJPUjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAmc3JjLAorICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4qIGRzdCkgeworICAgIGRzdC0+cmVzaXplKHNyYy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gJnN0YXR1c0FuZElkIDogc3JjKSB7CisgICAgICAgIGF1dG8gJmEgPSAoKmRzdClbaSsrXTsKKyAgICAgICAgYS5jYW1lcmFJZCA9IHN0YXR1c0FuZElkLmNhbWVyYUlkLmNfc3RyKCk7CisgICAgICAgIGEuZGV2aWNlU3RhdHVzID0gY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhzdGF0dXNBbmRJZC5zdGF0dXMpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gJnN1Ym1pdEluZm8sCisgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvICpoU3VibWl0SW5mbykgeworICAgIGhTdWJtaXRJbmZvLT5yZXF1ZXN0SWQgPSBzdWJtaXRJbmZvLm1SZXF1ZXN0SWQ7CisgICAgaFN1Ym1pdEluZm8tPmxhc3RGcmFtZU51bWJlciA9IHN1Ym1pdEluZm8ubUxhc3RGcmFtZU51bWJlcjsKK30KKworSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpIHsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmIChiU3RhdHVzLmlzT2soKSkgeworICAgICAgICAvLyBOTyBFcnJvciBoZXJlCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN3aXRjaChiU3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpESVNDT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0NBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpDQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9NQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ERVBSRUNBVEVEX0hBTDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSBzaW5jZSB3ZSBmaWx0ZXJlZCBsZWdhY3kgSEFMcyBlYXJsaWVyCisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpERVBSRUNBVEVEX0hBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQUJMRUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpESVNBQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKSB7CisgICAgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFJZCA9CisgICAgICAgIFN0cmluZzgocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0KKyAgICAgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgLy8gVHJ5IHVzaW5nIGZtcSBhdCBmaXJzdC4KKyAgICBzaXplX3QgbWV0YWRhdGFfc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSk7CisgICAgaWYgKChtZXRhZGF0YV9zaXplID4gMCkgJiYgKGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPiAwKSkgeworICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPndyaXRlKCh1aW50OF90ICopcmF3TWV0YWRhdGEsIG1ldGFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYU1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZShtZXRhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBDb3VsZG4ndCB1c2UgZm1xLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICAgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEubWV0YWRhdGEoc3RkOjptb3ZlKG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK30KKworaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKSB7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MucmVzaXplKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA6IHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7CisgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvc1tpKytdID0gY29udmVydFRvSGlkbChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgIH0KKyAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworfQorCit9IC8vY29udmVyc2lvbgorfSAvLyB1dGlscworfSAvL2NhbWVyYXNlcnZpY2UKK30gLy8gaGFyZHdhcmUKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkzN2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBU0VSVkVSX0NPTlZFUlRfSElETAorI2RlZmluZSBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworCit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIEhDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIEhQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBIVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCk7CisKK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KTsKKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKTsKKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICAgICAgICAgICAgICAgICBIU3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pOworCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpOworCitIQ2FwdHVyZVJlc3VsdEV4dHJhcyBjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmNhcHR1cmVSZXN1bHRFeHRyYXMpOworCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cyk7CisKK30gLy8gY29udmVyc2lvbgorfSAvLyB1dGlscworfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vYW5kcm9pZAorCisjZW5kaWYgLy9DQU1FUkFTRVJWRVJfQ09OVkVSVF9UT19ISURMCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydEZyb21IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBIU3VibWl0SW5mbyA9IGRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDQU1FUkFfUkVRVUVTVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRSA9IDEgPDwgMjAgLyogMSBNQiAqLzsKKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkaXNjb25uZWN0KCkgeworICAgIG1EZXZpY2VSZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6SGlkbENhbWVyYURldmljZVVzZXIoCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiAmZGV2aWNlUmVtb3RlKQorICA6IG1EZXZpY2VSZW1vdGUoZGV2aWNlUmVtb3RlKSB7CisgICAgbUluaXRTdWNjZXNzID0gaW5pdERldmljZSgpOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjppbml0RGV2aWNlKCkgeworICAgIC8vIFRPRE86IEdldCByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgcXVldWUgc2l6ZSBmcm9tIGEgc3lzdGVtIHByb3BlcnR5LgorICAgIGludDMyX3QgcmVxRk1RU2l6ZSA9IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisKKyAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+KHN0YXRpY19jYXN0PHNpemVfdD4ocmVxRk1RU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXF1ZXN0IGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc0ZNUVNpemUgPSBDQU1FUkFfUkVTVUxUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXNGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm9uIGJsb2NraW5nICovKTsKKyAgICBpZiAoIW1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXN1bHQgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW5pdFN1Y2Nlc3MpIHsKKyAgICAgICAgX2hpZGxfY2IoKm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLyoqCisgKiBUbyBiZSB1c2VkIG9ubHkgYnkgc3VibWl0UmVxdWVzdExpc3QgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IHJlcXVpcmVzCisgKiBjbGllbnRzIHRvIGNhbGwgdGhpcyBtZXRob2Qgc2VyaWFsbHksIGluY2FzZSBmbXEgaXMgdXNlZCB0byBzZW5kIG1ldGFkYXRhLgorICovCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgIHN0ZDo6dmVjdG9yPENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgICAgZm9yIChhdXRvICZlIDogaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+ZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzICZwaHlzaWNhbENhbWVyYVNldHRpbmcgPQorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+YmFjaygpOworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmcuaWQgPSBlLmlkLmNfc3RyKCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgc2V0dGluZ3MgZWl0aGVyIGZyb20gdGhlIGZtcSBvciBzdHJhaWdodGF3YXkgZnJvbSB0aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gV2UgZG9uJ3QgbmVlZCBhbnkgc3luY2hyb25pemF0aW9uLCBzaW5jZSBzdWJtaXRSZXF1ZXN0TGlzdAorICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzZXJpYWxseSBieSB0aGUgY2xpZW50IGlmIGl0IGRlY2lkZXMgdG8KKyAgICAgICAgLy8gdXNlIGZtcS4KKyAgICAgICAgaWYgKGUuc2V0dGluZ3MuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogR2V0IHNldHRpbmdzIGZyb20gdGhlIGZtcS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIHNldHRpbmdzRm1xOworICAgICAgICAgICAgc2V0dGluZ3NGbXEucmVzaXplKGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgYm9vbCByZWFkID0gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+cmVhZChzZXR0aW5nc0ZtcS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gY29udmVydEZyb21IaWRsKHNldHRpbmdzRm1xLCAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nLnNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHNldHRpbmdzIG1ldGFkYXRhIGlzIGNvbnRhaW5lZCBpbiByZXF1ZXN0IHNldHRpbmdzIGZpZWxkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb252ZXJ0ZWQgPQorICAgICAgICAgICAgICAgIGNvbnZlcnRGcm9tSGlkbChlLnNldHRpbmdzLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29udmVydCBwaHlzaWNhbENhbWVyYVNldHRpbmdzIGZyb20gSElETCB0byBBSURMLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGNvbnN0IEhDYXB0dXJlUmVxdWVzdCAmaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0ICpyZXF1ZXN0KSB7CisgICAgLy8gTm8gcmVwcm9jZXNzaW5nIHN1cHBvcnQuCisgICAgcmVxdWVzdC0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW1BbmRXaW5kb3dJZCA6IGhSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICByZXF1ZXN0LT5tU3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQuc3RyZWFtSWQpOworICAgICAgICByZXF1ZXN0LT5tU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKGhSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocmVxdWVzdC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiBoUmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdF9jYiBfaGlkbF9jYikgeworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBzdWJtaXRJbmZvOworICAgIEhTdWJtaXRJbmZvIGhTdWJtaXRJbmZvOworICAgIC8qKgorICAgICAqIENyZWF0ZSBBSURMIENhcHR1cmVSZXF1ZXN0IGZyb20gcmVxdWVzdExpc3QgYW5kIGdyYXBoaWNCdWZmZXJQcm9kdWNlcnMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0czsKKyAgICBmb3IgKGF1dG8gJmhSZXF1ZXN0IDogaFJlcXVlc3RMaXN0KSB7CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBhdXRvICZyZXF1ZXN0ID0gcmVxdWVzdHMuYmFjaygpOworICAgICAgICBpZiAoIWNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoaFJlcXVlc3QsICZyZXF1ZXN0KSkgeworICAgICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwgaFN1Ym1pdEluZm8pOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRGV2aWNlUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0cywgc3RyZWFtaW5nLCAmc3VibWl0SW5mbyk7CisgICAgbVJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBjb252ZXJ0VG9IaWRsKHN1Ym1pdEluZm8sICZoU3VibWl0SW5mbyk7CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhTdWJtaXRJbmZvKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jYW5jZWxSZXF1ZXN0KG1SZXF1ZXN0SWQsICZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcykgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIGlmICghY29udmVydEZyb21IaWRsKHNlc3Npb25QYXJhbXMsICZjYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZW5kQ29uZmlndXJlKGNvbnZlcnRGcm9tSGlkbChvcGVyYXRpbmdNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWV0YWRhdGEpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgaGlkbF9jYl8pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPQorICAgICAgICBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGludDMyX3QgbmV3U3RyZWFtSWQgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRDb25maWd1cmF0aW9uLCAmbmV3U3RyZWFtSWQpOworICAgIEhTdGF0dXMgc3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgaGlkbF9jYl8oc3RhdHVzLCBuZXdTdHJlYW1JZCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoY29udmVydEZyb21IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFNZXRhZGF0YSk7CisgICAgSFN0YXR1cyBoU3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2IoaFN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICBjYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6d2FpdFVudGlsSWRsZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT53YWl0VW50aWxJZGxlKCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmZsdXNoKCZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKAorICAgIGludDMyX3Qgc3RyZWFtSWQsCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIGhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uID0gY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZThmMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIGhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyBoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhcHR1cmVSZXF1ZXN0ID0gZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKworc3RydWN0IEhpZGxDYW1lcmFEZXZpY2VVc2VyIGZpbmFsIDogcHVibGljIEhDYW1lcmFEZXZpY2VVc2VyIHsKKyAgICBIaWRsQ2FtZXJhRGV2aWNlVXNlcihjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpOworCisgICAgfkhpZGxDYW1lcmFEZXZpY2VVc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgIGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gc3VibWl0UmVxdWVzdExpc3QoY29uc3QgaGlkbF92ZWM8SENhcHR1cmVSZXF1ZXN0PiYgcmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBiZWdpbkNvbmZpZ3VyZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RyZWFtX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHdhaXRVbnRpbElkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQsIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uKSBvdmVycmlkZTsKKworICAgIGJvb2wgaW5pdFN0YXR1cygpIHsgcmV0dXJuIG1Jbml0U3VjY2VzczsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICB9CisKKyBwcml2YXRlOgorICAgIGJvb2wgaW5pdERldmljZSgpOworCisgICAgYm9vbCBjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGNvbnN0IEhDYXB0dXJlUmVxdWVzdCAmaFJlcXVlc3QsIENhcHR1cmVSZXF1ZXN0ICpyZXF1ZXN0KTsKKworICAgIGJvb2wgY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyk7CisKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IG1EZXZpY2VSZW1vdGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIGJvb2wgbUluaXRTdWNjZXNzID0gZmFsc2U7CisgICAgaW50MzJfdCBtUmVxdWVzdElkID0gUkVRVUVTVF9JRF9OT05FOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfRlJBTUVPV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGNmZTQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6QjJIU3RhdHVzOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIGRldmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkgyQkNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGRldmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgc2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YVR5cGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OkNhbWVyYU1ldGFkYXRhVHlwZTsKK3VzaW5nIEhWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIEhWZW5kb3JUYWdTZWN0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgSFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyA9CisgICAgICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOworCitzcDxIaWRsQ2FtZXJhU2VydmljZT4gZ0hpZGxDYW1lcmFTZXJ2aWNlOworCitzcDxIaWRsQ2FtZXJhU2VydmljZT4gSGlkbENhbWVyYVNlcnZpY2U6OmdldEluc3RhbmNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKSB7CisgICAgZ0hpZGxDYW1lcmFTZXJ2aWNlID0gbmV3IEhpZGxDYW1lcmFTZXJ2aWNlKGNzKTsKKyAgICByZXR1cm4gZ0hpZGxDYW1lcmFTZXJ2aWNlOworfQorCitSZXR1cm48dm9pZD4KK0hpZGxDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQorICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksICZjYW1lcmFNZXRhZGF0YSk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIHN3aXRjaChzZXJ2aWNlUmV0LnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKSB7CisgICAgICAgICAgICAvLyBObyBFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEIHNpbmNlIHdlJ3JlIGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBJRCAlcyBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICBjYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZShjb25zdCBzcDxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBoQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3REZXZpY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAvLyBIZXJlLCB3ZSBmaXJzdCBnZXQgSUNhbWVyYURldmljZVVzZXIgZnJvbSBtQWlkbElDYW1lcmFTZXJ2aWNlLCB0aGVuIHNhdmUKKyAgICAvLyB0aGF0IGludGVyZmFjZSBpbiB0aGUgbmV3bHkgY3JlYXRlZCBIaWRsQ2FtZXJhRGV2aWNlVXNlciBpbXBsIGNsYXNzLgorICAgIGlmIChtQWlkbElDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlID0gbnVsbHB0cjsKKyAgICAvLyBDcmVhdGUgYSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrIG9iamVjdCB3aGljaCBpbnRlcm5hbGx5CisgICAgLy8gY2FsbHMgY2FsbGJhY2sgZnVuY3Rpb25zIHBhc3NlZCB0aHJvdWdoIGhDYWxsYmFjay4KKyAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGh5YnJpZENhbGxiYWNrcyA9IG5ldyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoaENhbGxiYWNrKTsKKyAgICBpZiAoIWh5YnJpZENhbGxiYWNrcy0+aW5pdGlhbGl6ZUxvb3BlcigpKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaGFuZGxlIGNhbGxiYWNrcyBvbiBkZXZpY2UsIGNhbm5vdCBjb25uZWN0Iik7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2FsbGJhY2tzID0gaHlicmlkQ2FsbGJhY2tzOworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBtQWlkbElDYW1lcmFTZXJ2aWNlLT5jb25uZWN0RGV2aWNlKAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgU3RyaW5nMTYoIiIpLAorICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki8mZGV2aWNlUmVtb3RlKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBOb3cgd2UgY3JlYXRlIGEgSGlkbENhbWVyYURldmljZVVzZXIgY2xhc3MsIHN0b3JlIHRoZSBkZXZpY2VSZW1vdGUgaW4gaXQsCisgICAgLy8gYW5kIHJldHVybiB0aGF0IGJhY2suIEFsbCBjYWxscyBvbiB0aGF0IGludGVyZmFjZSB3aWxsIGJlIGZvcndhcmRlZCB0bworICAgIC8vIHRoZSBBSURMIGludGVyZmFjZS4KKyAgICBzcDxIaWRsQ2FtZXJhRGV2aWNlVXNlcj4gaERldmljZVJlbW90ZSA9IG5ldyBIaWRsQ2FtZXJhRGV2aWNlVXNlcihkZXZpY2VSZW1vdGUpOworICAgIGlmICghaERldmljZVJlbW90ZS0+aW5pdFN0YXR1cygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGRldmljZSBISURMIHdyYXBwZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaHlicmlkQ2FsbGJhY2tzLT5zZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZShoRGV2aWNlUmVtb3RlLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgpKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhEZXZpY2VSZW1vdGUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgSGlkbENhbWVyYVNlcnZpY2U6OmFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoaExpc3RlbmVyLCBjc0xpc3RlbmVyKSk7Cit9CisKK3NwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPgorSGlkbENhbWVyYVNlcnZpY2U6OnNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRSZW1vdmUpIHsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBtTGlzdGVuZXJzIGxpc3QgYW5kIGNvbXBhcmUgdGhlIGxpc3RlbmVyIHdpdGggdGhlIEhJREwKKyAgICAvLyBsaXN0ZW5lciByZWdpc3RlcmVkLgorICAgIGF1dG8gaXQgPSBtTGlzdGVuZXJzLmJlZ2luKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgZm9yICg7aXQgIT0gbUxpc3RlbmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoaGFyZHdhcmU6OmludGVyZmFjZXNFcXVhbChpdC0+Zmlyc3QsIGhMaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpdCAhPSBtTGlzdGVuZXJzLmVuZCgpKSB7CisgICAgICAgIGNzTGlzdGVuZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlKSB7CisgICAgICAgICAgbUxpc3RlbmVycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNzTGlzdGVuZXI7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGhDc0xpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtQWlkbElDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBpZiAoaENzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbGlzdGVuZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIC8vIENoZWNrIHRoZSBjYWNoZSBmb3IgcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrcworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxpc3RlbmVyTGlzdExvY2spOworICAgICAgICBjc0xpc3RlbmVyID0gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lcik7CisgICAgICAgIGlmIChjc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFdyYXAgYW4gaENzTGlzdGVuZXIgd2l0aCBBaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyIGFuZCBwYXNzIGl0IHRvCisgICAgICAgICAgICAvLyBDYW1lcmFTZXJ2aWNlLgorICAgICAgICAgICAgY3NMaXN0ZW5lciA9IG5ldyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoaENzTGlzdGVuZXIpOworICAgICAgICAgICAgLy8gQWRkIHRvIGNhY2hlCisgICAgICAgICAgICBhZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIsIGNzTGlzdGVuZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gYWRkIGEgbGlzdGVuZXIgJXAgYWxyZWFkeSByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaENzTGlzdGVuZXIuZ2V0KCkpOworICAgICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiBjYW1lcmFTdGF0dXNBbmRJZHN7fTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0KKyAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+YWRkTGlzdGVuZXJIZWxwZXIoY3NMaXN0ZW5lciwgJmNhbWVyYVN0YXR1c0FuZElkcywgdHJ1ZSk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgY2FtZXJhIGRldmljZSBzdGF0dXMgbGlzdGVuZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgX2hpZGxfY2Ioc3RhdHVzLCB7fSk7CisgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+IGhDYW1lcmFTdGF0dXNBbmRJZHM7CisgICAgLy9Db252ZXJ0IGNhbWVyYVN0YXR1c0FuZElkcyB0byBISURMIGFuZCBjYWxsIGNhbGxiYWNrCisgICAgY29udmVydFRvSGlkbChjYW1lcmFTdGF0dXNBbmRJZHMsICZoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGhDc0xpc3RlbmVyKSB7CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqL3RydWUpOworICAgIH0KKyAgICBpZiAoY3NMaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIoY3NMaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzIFJlbW92aW5nIHVucmVnaXN0ZXJlZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgaENzTGlzdGVuZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6Ok5PX0VSUk9SOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBnQ2FjaGUgPSBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgaWYgKGdDYWNoZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4KKyAgICAgICAgICAgICZ2ZW5kb3JJZHNBbmRUYWdEZXNjcyA9IGdDYWNoZS0+Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAodmVuZG9ySWRzQW5kVGFnRGVzY3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIGhpZGxfdmVjPEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM+IGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9uczsKKyAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSk7CisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoYXV0byAmdmVuZG9ySWRBbmRUYWdEZXNjcyA6IHZlbmRvcklkc0FuZFRhZ0Rlc2NzKSB7CisgICAgICAgIGhpZGxfdmVjPEhWZW5kb3JUYWdTZWN0aW9uPiBoVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLnNlY29uZDsKKyAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPFN0cmluZzg+KiBzZWN0aW9uTmFtZXMgPSBkZXNjLT5nZXRBbGxTZWN0aW9uTmFtZXMoKTsKKyAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zID0gc2VjdGlvbk5hbWVzLT5zaXplKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKKyAgICAgICAgaW50IHRhZ0NvdW50ID0gZGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3ModGFnQ291bnQpOworICAgICAgICBkZXNjLT5nZXRUYWdBcnJheSh0YWdzLmRhdGEoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykgeworICAgICAgICAgICAgSFZlbmRvclRhZyB2dDsKKyAgICAgICAgICAgIHZ0LnRhZ0lkID0gdGFnc1tpXTsKKyAgICAgICAgICAgIHZ0LnRhZ05hbWUgPSBkZXNjLT5nZXRUYWdOYW1lKHRhZ3NbaV0pOworICAgICAgICAgICAgdnQudGFnVHlwZSA9IChIQ2FtZXJhTWV0YWRhdGFUeXBlKSBkZXNjLT5nZXRUYWdUeXBlKHRhZ3NbaV0pOworICAgICAgICAgICAgc3NpemVfdCBzZWN0aW9uSWR4ID0gZGVzYy0+Z2V0U2VjdGlvbkluZGV4KHRhZ3NbaV0pOworICAgICAgICAgICAgdGFnc0J5U2VjdGlvbltzZWN0aW9uSWR4XS5wdXNoX2JhY2sodnQpOworICAgICAgICB9CisgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUobnVtU2VjdGlvbnMpOworICAgICAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IG51bVNlY3Rpb25zOyBzKyspIHsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS5zZWN0aW9uTmFtZSA9ICgqc2VjdGlvbk5hbWVzKVtzXS5zdHJpbmcoKTsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS50YWdzID0gdGFnc0J5U2VjdGlvbltzXTsKKyAgICAgICAgfQorICAgICAgICBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zICZoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgICAgICAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnNbal07CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMucHJvdmlkZXJJZCA9IHZlbmRvcklkQW5kVGFnRGVzY3MuZmlyc3Q7CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMudmVuZG9yVGFnU2VjdGlvbnMgPSBzdGQ6Om1vdmUoaFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICAgICAgaisrOworICAgIH0KKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDBiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworc3RydWN0IEhpZGxDYW1lcmFTZXJ2aWNlIGZpbmFsIDogcHVibGljIEhDYW1lcmFTZXJ2aWNlIHsKKworICAgIH5IaWRsQ2FtZXJhU2VydmljZSgpIHsgfTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyLjA6OklDYW1lcmFTZXJ2aWNlIGZvbGxvdy4KKworICAgIFJldHVybjx2b2lkPiBjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gYWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48SFN0YXR1cz4gcmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGNhbWVyYXNlcnZlcnMgbWFpbiB0aHJlYWQgdG8KKyAgICAvLyBpbnN0YW50aWF0ZSB0aGUgaGlkbCBjYW1lcmFzZXJ2ZXIuCisgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CisKK3ByaXZhdGU6CisgICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworCisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoCisgICAgICAgIHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqLyBib29sIHNob3VsZFJlbW92ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcik7CisKKyAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjb25zdCBtQWlkbElDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKKworICAgIE11dGV4IG1MaXN0ZW5lckxpc3RMb2NrOworCisgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQorICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKKyAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2Ugc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBmcmFtZXdvcmtzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawppbmRleCBmNzcwNjljLi5iNGU3YzMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTI3LDE3ICsyNywyNCBAQAogICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCiAgICAgbGlidXRpbHMgXAorICAgIGxpYmpwZWcgXAorICAgIGxpYmV4aWYgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyBcCisgICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCBcCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBlZjkzZDlhLi5mNDdlNWE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMzMsNiArMzMsNyBAQAogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7CiAKIC8qKgogICogQmFzaWMgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhbWVyYSB2ZXIuIDMuMiBkZXZpY2UgaW50ZXJmYWNlCkBAIC04Nyw3ICs4OCw3IEBACiAvKioKICAqIEJhc2ljIHRlc3QgaW1wbGVtZW50YXRpb24gb2YgYSBjYW1lcmEgcHJvdmlkZXIKICAqLwotc3RydWN0IFRlc3RJQ2FtZXJhUHJvdmlkZXIgOiB2aXJ0dWFsIHB1YmxpYyBwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyIHsKK3N0cnVjdCBUZXN0SUNhbWVyYVByb3ZpZGVyIDogdmlydHVhbCBwdWJsaWMgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlciB7CiAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrPiBtQ2FsbGJhY2tzOwogICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4gbURldmljZU5hbWVzOwogICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gbURldmljZUludGVyZmFjZTsKQEAgLTEwMSw2ICsxMDIsNyBAQAogCiAgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc2V0Q2FsbGJhY2soCiAgICAgICAgICAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2s+JiBjYWxsYmFja3MpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbU0VUX0NBTExCQUNLXSsrOwogICAgICAgICBtQ2FsbGJhY2tzID0gY2FsbGJhY2tzOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+KFN0YXR1czo6T0spOwogICAgIH0KQEAgLTEwOCw2ICsxMTAsNyBAQAogICAgIHVzaW5nIGdldFZlbmRvclRhZ3NfY2IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiBzZWN0aW9ucyk+OwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZ2V0VmVuZG9yVGFncyhnZXRWZW5kb3JUYWdzX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0dFVF9WRU5ET1JfVEFHU10rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgbVZlbmRvclRhZ1NlY3Rpb25zKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTE3LDYgKzEyMCw3IEBACiAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0KT47CiAgICAgdmlydHVhbCA6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCiAgICAgICAgICAgICBpc1NldFRvcmNoTW9kZVN1cHBvcnRlZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURURdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGZhbHNlKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTI0LDYgKzEyOCw3IEBACiAgICAgdXNpbmcgZ2V0Q2FtZXJhSWRMaXN0X2NiID0gc3RkOjpmdW5jdGlvbjx2b2lkKFN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpPjsKICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhSWRMaXN0KGdldENhbWVyYUlkTGlzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltHRVRfQ0FNRVJBX0lEX0xJU1RdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIG1EZXZpY2VOYW1lcyk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTE0OCw2ICsxNTMsMjUgQEAKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld1N0YXRlKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW05PVElGWV9ERVZJQ0VfU1RBVEVdKys7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgZW51bSBNZXRob2ROYW1lcyB7CisgICAgICAgIFNFVF9DQUxMQkFDSywKKyAgICAgICAgR0VUX1ZFTkRPUl9UQUdTLAorICAgICAgICBJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURUQsCisgICAgICAgIE5PVElGWV9ERVZJQ0VfU1RBVEUsCisgICAgICAgIEdFVF9DQU1FUkFfSURfTElTVCwKKworICAgICAgICBNRVRIT0RfTkFNRV9DT1VOVAorICAgIH07CisgICAgaW50IG1DYWxsZWRDb3VudGVyW01FVEhPRF9OQU1FX0NPVU5UXSB7MH07CisKKyAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbUN1cnJlbnRTdGF0ZSA9IDB4RkZGRkZGRkY7IC8vIFVubGlrZWx5IHRvIGJlIGEgcmVhbCBzdGF0ZQogfTsKIAogLyoqCkBAIC0xNjMsNyArMTg3LDcgQEAKICAgICAgICAgbVRlc3RDYW1lcmFQcm92aWRlciA9IHByb3ZpZGVyOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzOwogCiAgICAgdmlydHVhbCB+VGVzdEludGVyYWN0aW9uUHJveHkoKSB7fQogCkBAIC0xNzcsNyArMjAxLDcgQEAKIAogICAgIHZpcnR1YWwgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gZ2V0U2VydmljZSgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzZXJ2aWNlTmFtZSkgb3ZlcnJpZGUgewotICAgICAgICBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLnB1c2hfYmFjayhzZXJ2aWNlTmFtZSk7CiAgICAgICAgIHJldHVybiBtVGVzdENhbWVyYVByb3ZpZGVyOwogICAgIH0KIApAQCAtMjA5LDEwICsyMzMsMzQgQEAKIAogICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZShzdGF0dXNMaXN0ZW5lciwgJnNlcnZpY2VQcm94eSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBtYW5hZ2VyIjsKKyAgICAvLyBDaGVjayB0aGF0IGJvdGggImxlZ2FjeSIgYW5kICJleHRlcm5hbCIgcHJvdmlkZXJzIChyZWFsbHkgdGhlIHNhbWUgb2JqZWN0KSBhcmUgY2FsbGVkCisgICAgLy8gb25jZSBmb3IgYWxsIHRoZSBpbml0IG1ldGhvZHMKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OlNFVF9DQUxMQkFDS10sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBzZXRDYWxsYmFjayBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6R0VUX1ZFTkRPUl9UQUdTXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIGdldFZlbmRvclRhZ3MgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OklTX1NFVF9UT1JDSF9NT0RFX1NVUFBPUlRFRF0sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBpc1NldFRvcmNoTW9kZVN1cHBvcnRlZCBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6R0VUX0NBTUVSQV9JRF9MSVNUXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIGdldENhbWVyYUlkTGlzdCBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6Tk9USUZZX0RFVklDRV9TVEFURV0sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBub3RpZnlEZXZpY2VTdGF0ZSBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOwogCi0gICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGxlZ2FjeUluc3RhbmNlTmFtZSA9ICJsZWdhY3kvMCI7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCBsZWdhY3lJbnN0YW5jZU5hbWUpIDw8CisgICAgc3RkOjpzdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKKyAgICBzdGQ6OnN0cmluZyBleHRlcm5hbEluc3RhbmNlTmFtZSA9ICJleHRlcm5hbC8wIjsKKyAgICBib29sIGdvdExlZ2FjeSA9IGZhbHNlOworICAgIGJvb2wgZ290RXh0ZXJuYWwgPSBmYWxzZTsKKyAgICBFWFBFQ1RfRVEoMnUsIHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5zaXplKCkpIDw8CisgICAgICAgICAgICAiT25seSB0d28gc2VydmljZSBxdWVyaWVzIGV4cGVjdGVkIHRvIGJlIHNlZW4gYnkgaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIjsKKworICAgIGZvciAoYXV0byYgc2VydmljZU5hbWUgOiBzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGxlZ2FjeUluc3RhbmNlTmFtZSkgZ290TGVnYWN5ID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGV4dGVybmFsSW5zdGFuY2VOYW1lKSBnb3RFeHRlcm5hbCA9IHRydWU7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKGdvdExlZ2FjeSkgPDwKICAgICAgICAgICAgICJMZWdhY3kgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CisgICAgQVNTRVJUX1RSVUUoZ290RXh0ZXJuYWwpIDw8CisgICAgICAgICAgICAiRXh0ZXJuYWwgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CkBAIC0yMjEsNyArMjY5LDcgQEAKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwKICAgICAgICAgICAgIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwogCi0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIH0KIApAQCAtMjU1LDcgKzMwMyw3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgc2VjdGlvbk5hbWVTZWNvbmQgPSAiU2Vjb25kVmVuZG9yVGVzdFNlY3Rpb24iOwpAQCAtMjczLDcgKzMyMSw3IEBACiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSA9ICJ0ZXN0Mi8wIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsCisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksCiAgICAgICAgICAgICAgIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIApAQCAtMzY2LDMgKzQxNCwzNSBAQAogICAgIG1ldGFkYXRhQ29weS5kdW1wKDEsIDIpOwogICAgIHNlY29uZE1ldGFkYXRhLmR1bXAoMSwgMik7CiB9CisKK1RFU1QoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdCwgTm90aWZ5U3RhdGVDaGFuZ2VUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBkZXZpY2VOYW1lcyB7CisgICAgICAgICJkZXZpY2VAMy4yL3Rlc3QvMCIsCisgICAgICAgICJkZXZpY2VAMS4wL3Rlc3QvMCIsCisgICAgICAgICJkZXZpY2VAMy4yL3Rlc3QvMSJ9OworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4gdmVuZG9yU2VjdGlvbjsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBwcm92aWRlck1hbmFnZXIgPSBuZXcgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyKCk7CisgICAgc3A8VGVzdFN0YXR1c0xpc3RlbmVyPiBzdGF0dXNMaXN0ZW5lciA9IG5ldyBUZXN0U3RhdHVzTGlzdGVuZXIoKTsKKyAgICBUZXN0SW50ZXJhY3Rpb25Qcm94eSBzZXJ2aWNlUHJveHk7CisgICAgc3A8VGVzdElDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPSAgbmV3IFRlc3RJQ2FtZXJhUHJvdmlkZXIoZGV2aWNlTmFtZXMsCisgICAgICAgICAgICB2ZW5kb3JTZWN0aW9uKTsKKyAgICBzZXJ2aWNlUHJveHkuc2V0UHJvdmlkZXIocHJvdmlkZXIpOworCisgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOworCisgICAgQVNTRVJUX0VRKHByb3ZpZGVyLT5tQ3VycmVudFN0YXRlLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Tk9STUFMKSkKKyAgICAgICAgICAgIDw8ICJJbml0aWFsIGRldmljZSBzdGF0ZSBub3Qgc2V0IjsKKworICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6OkZPTERFRCkpOworCisgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gY2FsbCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSI7CisgICAgQVNTRVJUX0VRKHByb3ZpZGVyLT5tQ3VycmVudFN0YXRlLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Rk9MREVEKSkKKyAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gY2hhbmdlIGRldmljZSBzdGF0ZSI7CisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGVwdGhQcm9jZXNzb3JUZXN0IgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlICIuLi91dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlICJOVjEyQ29tcHJlc3Nvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVySGVpZ2h0ID0gNDgwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlck5WMTJTaXplICgoKChrVGVzdEJ1ZmZlcldpZHRoKSAqIChrVGVzdEJ1ZmZlckhlaWdodCkpICogMykgLyAyKTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJEZXB0aFNpemUgKGtUZXN0QnVmZmVyV2lkdGggKiBrVGVzdEJ1ZmZlckhlaWdodCk7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTZWVkID0gMTIzNDsKKwordm9pZCBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSh2b2lkICoqbGliSGFuZGxlIC8qb3V0Ki8sCisgICAgICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgKnByb2Nlc3NGcmFtZUZ1bmMgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShsaWJIYW5kbGUsIG51bGxwdHIpOworICAgIEFTU0VSVF9ORShwcm9jZXNzRnJhbWVGdW5jLCBudWxscHRyKTsKKworICAgICpsaWJIYW5kbGUgPSBkbG9wZW4oa0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgIGlmICgqbGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnByb2Nlc3NGcmFtZUZ1bmMgPSByZWludGVycHJldF9jYXN0PGNhbWVyYTM6OnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWU+ICgKKyAgICAgICAgICAgICAgICBkbHN5bSgqbGliSGFuZGxlLCBrRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbikpOworICAgICAgICBBU1NFUlRfTkUoKnByb2Nlc3NGcmFtZUZ1bmMsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihpbnQganBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlLCBib29sIGluY2x1ZGVFeGlmLAorICAgICAgICBib29sIHN3aXRjaERpbWVuc2lvbnMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpjb2xvckpwZWdCdWZmZXIgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShjb2xvckpwZWdCdWZmZXIsIG51bGxwdHIpOworCisgICAgc3RkOjphcnJheTx1aW50OF90LCBrVGVzdEJ1ZmZlck5WMTJTaXplPiBjb2xvclNvdXJjZUJ1ZmZlcjsKKyAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oa1NlZWQpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdW5pRGlzdCgwLCBVSU5UOF9NQVggLSAxKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbG9yU291cmNlQnVmZmVyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbG9yU291cmNlQnVmZmVyW2ldID0gdW5pRGlzdChnZW4pOworICAgIH0KKworICAgIHNpemVfdCB3aWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgc2l6ZV90IGhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlmIChzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgIHdpZHRoID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGhlaWdodCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgfQorCisgICAgTlYxMkNvbXByZXNzb3IganBlZ0NvbXByZXNzb3I7CisgICAgaWYgKGluY2x1ZGVFeGlmKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGpwZWdDb21wcmVzc29yLmNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoY29sb3JTb3VyY2VCdWZmZXIuZGF0YSgpKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBqcGVnUXVhbGl0eSwgb3JpZW50YXRpb25WYWx1ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGpwZWdDb21wcmVzc29yLmNvbXByZXNzKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChjb2xvclNvdXJjZUJ1ZmZlci5kYXRhKCkpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5KSk7CisgICAgfQorCisgICAgKmNvbG9ySnBlZ0J1ZmZlciA9IHN0ZDo6bW92ZShqcGVnQ29tcHJlc3Nvci5nZXRDb21wcmVzc2VkRGF0YSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoY29sb3JKcGVnQnVmZmVyLT5lbXB0eSgpKTsKK30KKwordm9pZCBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+ICpkZXB0aDE2QnVmZmVyIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUoZGVwdGgxNkJ1ZmZlciwgbnVsbHB0cik7CisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKGtTZWVkKzEpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdW5pRGlzdCgwLCBVSU5UMTZfTUFYIC0gMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXB0aDE2QnVmZmVyLT5zaXplKCk7IGkrKykgeworICAgICAgICAoKmRlcHRoMTZCdWZmZXIpW2ldID0gdW5pRGlzdChnZW4pOworICAgIH0KK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIExpbmtUb0xpYnJheSkgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICB9Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBCYWRJbnB1dCkgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICAvKmluY2x1ZGVFeGlmKi8gZmFsc2UsIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworCisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBudWxscHRyKSwKKyAgICAgICAgICAgIDApOworCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgQmFzaWNEZXB0aFBob3RvVmFsaWRhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICAvKmluY2x1ZGVFeGlmKi8gZmFsc2UsIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAvLyBUaGUgZmluYWwgZGVwdGggcGhvdG8gbXVzdCBjb25zaXN0IG9mIHRocmVlIGpwZWcgaW1hZ2VzOgorICAgIC8vICAtIHRoZSBtYWluIGNvbG9yIGltYWdlCisgICAgLy8gIC0gdGhlIGRlcHRoIG1hcCBpbWFnZQorICAgIC8vICAtIHRoZSBjb25maWRlbmNlIG1hcCBpbWFnZQorICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIFRlc3REZXB0aFBob3RvRXhpZk9yaWVudGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbnNbXSA9IHsgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUywgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTLAorICAgICAgICAgICAgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUywgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUyB9OworICAgIGZvciAoYXV0byBleGlmT3JpZW50YXRpb24gOiBleGlmT3JpZW50YXRpb25zKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgLyppbmNsdWRlRXhpZiovIHRydWUsCisgICAgICAgICAgICAgICAgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uICE9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhdXRvIGpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGNvbG9ySnBlZ0J1ZmZlci5zaXplKCksICZqcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICAgICAgQVNTRVJUX0VRKGV4aWZPcmllbnRhdGlvbiwganBlZ0V4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgICAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgICAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgICAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgICAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgICAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFNpemUgPSBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIChtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUpOworCisgICAgICAgIC8vRGVwdGggYW5kIGNvbmZpZGVuY2UgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBFWElGIG9yaWVudGF0aW9uIGFzIHRoZSBzb3VyY2UKKyAgICAgICAgYXV0byBkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmRlZmluZWQgb3IgbWlzc2luZyBFWElGIG9yaWVudGF0aW9uLCBhbHdheXMgZXhwZWN0IDAgZGVncmVlcyBpbiB0aGUKKyAgICAgICAgICAgIC8vIGRlcHRoIG1hcC4KKyAgICAgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2VNYXBTaXplLCAmY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHVuZGVmaW5lZCBvciBtaXNzaW5nIEVYSUYgb3JpZW50YXRpb24sIGFsd2F5cyBleHBlY3QgMCBkZWdyZWVzIGluIHRoZQorICAgICAgICAgICAgLy8gY29uZmlkZW5jZSBtYXAuCisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIFRlc3REZXBodFBob3RvUGh5c2ljYWxSb3RhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIGNhc2Ugb2YgcGh5c2ljYWwgcm90YXRpb24sIHRoZSBFWElGIG9yaWVudGF0aW9uIG11c3QgYWx3YXlzIGJlIDAuCisgICAgYXV0byBleGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICBEZXB0aFBob3RvT3JpZW50YXRpb24gZGVwdGhPcmllbnRhdGlvbnNbXSA9IHsKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgfTsKKyAgICBmb3IgKGF1dG8gZGVwdGhPcmllbnRhdGlvbiA6IGRlcHRoT3JpZW50YXRpb25zKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICAgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBleHBlY3RlZFdpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlmICgoZGVwdGhPcmllbnRhdGlvbiA9PSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMpIHx8CisgICAgICAgICAgICAgICAgKGRlcHRoT3JpZW50YXRpb24gPT0gRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUykpIHsKKyAgICAgICAgICAgIHN3aXRjaERpbWVuc2lvbnMgPSB0cnVlOworICAgICAgICAgICAgZXhwZWN0ZWRXaWR0aCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICAgICAgZXhwZWN0ZWRIZWlnaHQgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIC8qaW5jbHVkZUV4aWYqLyB0cnVlLAorICAgICAgICAgICAgICAgIHN3aXRjaERpbWVuc2lvbnMsICZjb2xvckpwZWdCdWZmZXIpOworICAgICAgICBhdXRvIGpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oY29sb3JKcGVnQnVmZmVyLmRhdGEoKSwgY29sb3JKcGVnQnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgICAgICAmanBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGV4aWZPcmllbnRhdGlvbiwganBlZ0V4aWZPcmllbnRhdGlvbik7CisKKyAgICAgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICAgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICAgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tT3JpZW50YXRpb24gPSBkZXB0aE9yaWVudGF0aW9uOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgICAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgICAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgICAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFNpemUgPSBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIChtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUpOworCisgICAgICAgIC8vRGVwdGggYW5kIGNvbmZpZGVuY2UgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBFWElGIG9yaWVudGF0aW9uIGFzIHRoZSBzb3VyY2UKKyAgICAgICAgYXV0byBkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICBzaXplX3QgZGVwdGhNYXBXaWR0aCwgZGVwdGhNYXBIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucyhkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aE1hcFdpZHRoLCAmZGVwdGhNYXBIZWlnaHQpLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aE1hcFdpZHRoLCBleHBlY3RlZFdpZHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoTWFwSGVpZ2h0LCBleHBlY3RlZEhlaWdodCk7CisKKyAgICAgICAgYXV0byBjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwgY29uZmlkZW5jZU1hcFNpemUsCisgICAgICAgICAgICAgICAgJmNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwV2lkdGgsIGNvbmZpZGVuY2VNYXBIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucygKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwgY29uZmlkZW5jZU1hcFNpemUsCisgICAgICAgICAgICAgICAgJmNvbmZpZGVuY2VNYXBXaWR0aCwgJmNvbmZpZGVuY2VNYXBIZWlnaHQpLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlTWFwV2lkdGgsIGV4cGVjdGVkV2lkdGgpOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZU1hcEhlaWdodCwgZXhwZWN0ZWRIZWlnaHQpOworICAgIH0KKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAppbmRleCAyYTY4OWM2Li41NDkzNWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCkBAIC0xNjcsNiArMTY3LDMwIEBACiAgICAgfQogfQogCitURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBDbGFtcENvbnNpc3RlbmN5KSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgc3RkOjphcnJheTxpbnQzMl90LCA0PiBhY3RpdmVBcnJheSA9IHswLCAwLCA0MDMyLCAzMDI0fTsKKyAgICBEaXN0b3J0aW9uTWFwcGVyIG07CisgICAgc2V0dXBUZXN0TWFwcGVyKCZtLCBpZGVudGl0eURpc3RvcnRpb24sIHRlc3RJQ2FsLCAvKmFjdGl2ZUFycmF5Ki8gYWN0aXZlQXJyYXkuZGF0YSgpLAorICAgICAgICAgICAgLypwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCkpOworCisgICAgYXV0byByZWN0c09yaWcgPSBhY3RpdmVBcnJheTsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFJlY3RUb1JhdyhhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorCisgICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGFjdGl2ZUFycmF5W2ldLCByZWN0c09yaWdbaV0pOworICAgIH0KK30KKwogVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgU2ltcGxlVHJhbnNmb3JtKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MWExZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcApAQCAtMCwwICsxLDM3OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVGVzdF9OVjEyQ29tcHJlc3NvciIKKworI2luY2x1ZGUgIk5WMTJDb21wcmVzc29yLmgiCisKKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtZGF0YS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRlZmF1bHRfZGVsZXRlPEV4aWZFbnRyeT4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRXhpZkVudHJ5KiBlbnRyeSkgY29uc3QgeyBleGlmX2VudHJ5X3VucmVmKGVudHJ5KTsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRGF0YT4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRXhpZkRhdGEqIGRhdGEpIGNvbnN0IHsgZXhpZl9kYXRhX3VucmVmKGRhdGEpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpIHsKKyAgICBpZiAoIWNvbmZpZ3VyZUNvbXByZXNzb3Iod2lkdGgsIGhlaWdodCwgcXVhbGl0eSkpIHsKKyAgICAgICAgLy8gdGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGEgbW9yZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlIHRoYW4gd2UgY2FuCisgICAgICAgIC8vIHByb3ZpZGUgaGVyZSBzbyBqdXN0IHJldHVybi4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBjb21wcmVzc0RhdGEoZGF0YSwgLypleGlmRGF0YSovIG51bGxwdHIpOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgcXVhbGl0eSwgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uIGV4aWZWYWx1ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRGF0YT4gZXhpZkRhdGEoZXhpZl9kYXRhX25ldygpKTsKKyAgICBpZiAoZXhpZkRhdGEuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZXhpZl9kYXRhX3NldF9vcHRpb24oZXhpZkRhdGEuZ2V0KCksIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZEYXRhLmdldCgpLCBFWElGX0RBVEFfVFlQRV9DT01QUkVTU0VEKTsKKyAgICBleGlmX2RhdGFfc2V0X2J5dGVfb3JkZXIoZXhpZkRhdGEuZ2V0KCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZXhpZkVudHJ5KGV4aWZfZW50cnlfbmV3KCkpOworICAgIGlmIChleGlmRW50cnkuZ2V0KCkgPT0gIG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGV4aWZFbnRyeS0+dGFnID0gRVhJRl9UQUdfT1JJRU5UQVRJT047CisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLCBleGlmRW50cnkuZ2V0KCkpOworICAgIGV4aWZfZW50cnlfaW5pdGlhbGl6ZShleGlmRW50cnkuZ2V0KCksIGV4aWZFbnRyeS0+dGFnKTsKKyAgICBleGlmX3NldF9zaG9ydChleGlmRW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgZXhpZlZhbHVlKTsKKworICAgIGlmICghY29uZmlndXJlQ29tcHJlc3Nvcih3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXByZXNzRGF0YShkYXRhLCBleGlmRGF0YS5nZXQoKSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBOVjEyQ29tcHJlc3Nvcjo6Z2V0Q29tcHJlc3NlZERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EZXN0TWFuYWdlci5tQnVmZmVyOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb25maWd1cmVDb21wcmVzc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpIHsKKyAgICBtQ29tcHJlc3NJbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZtRXJyb3JNYW5hZ2VyKTsKKyAgICAvLyBOT1RFISBEQU5HRVIhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgYmVsb3cgc2V0am1wIQorICAgIC8vIFRoZSBjb21waWxlciB3aWxsIG5vdCBnZW5lcmF0ZSBjb2RlIHRvIGRlc3Ryb3kgdGhlbSBkdXJpbmcgdGhlIHJldHVybgorICAgIC8vIGJlbG93IHNvIHRoZXkgd2lsbCBsZWFrLiBBZGRpdGlvbmFsbHksIGRvIG5vdCBwbGFjZSBhbnkgY2FsbHMgdG8gbGlianBlZworICAgIC8vIHRoYXQgY2FuIGZhaWwgYWJvdmUgdGhpcyBsaW5lIG9yIGFueSBlcnJvciB3aWxsIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoc2V0am1wKG1FcnJvck1hbmFnZXIubUp1bXBCdWZmZXIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIGVycm9yIGhhbmRsZXIgd2lsbCBqdW1wIGluIGNhc2Ugc2V0dXAgZmFpbHMKKyAgICAgICAgLy8gVGhlIGVycm9yIG1hbmFnZXIgd2lsbCBBTE9HIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIG1Db21wcmVzc0luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aDsKKyAgICBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKyAgICBtQ29tcHJlc3NJbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOworICAgIG1Db21wcmVzc0luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgICAganBlZ19zZXRfZGVmYXVsdHMoJm1Db21wcmVzc0luZm8pOworCisgICAganBlZ19zZXRfcXVhbGl0eSgmbUNvbXByZXNzSW5mbywgcXVhbGl0eSwgVFJVRSk7CisgICAgLy8gSXQgbWF5IHNlZW0gd2VpcmQgdG8gc2V0IGNvbG9yIHNwYWNlIGhlcmUgYWdhaW4gYnV0IHRoaXMgd2lsbCBhbHNvIHNldAorICAgIC8vIG90aGVyIGZpZWxkcy4gVGhlc2UgZmllbGRzIG1pZ2h0IGJlIG92ZXJ3cml0dGVuIGJ5IGpwZWdfc2V0X2RlZmF1bHRzCisgICAganBlZ19zZXRfY29sb3JzcGFjZSgmbUNvbXByZXNzSW5mbywgSkNTX1lDYkNyKTsKKyAgICBtQ29tcHJlc3NJbmZvLnJhd19kYXRhX2luID0gVFJVRTsKKyAgICBtQ29tcHJlc3NJbmZvLmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOworICAgIC8vIFNldCBzYW1wbGluZyBmYWN0b3JzCisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDI7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDI7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDE7CisKKyAgICBtQ29tcHJlc3NJbmZvLmRlc3QgPSAmbURlc3RNYW5hZ2VyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGRlaW50ZXJsZWF2ZShjb25zdCB1aW50OF90KiB2dVBsYW5hciwgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHVSb3dzLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdlJvd3MsIGludCByb3dJbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7CisgICAgaW50IG51bVJvd3MgPSAoaGVpZ2h0IC0gcm93SW5kZXgpIC8gMjsKKyAgICBpZiAobnVtUm93cyA+IDgpIG51bVJvd3MgPSA4OworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG51bVJvd3M7ICsrcm93KSB7CisgICAgICAgIGludCBvZmZzZXQgPSAoKHJvd0luZGV4ID4+IDEpICsgcm93KSAqIHN0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogdnUgPSB2dVBsYW5hciArIG9mZnNldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7ICsraSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gcm93ICogKHdpZHRoID4+IDEpICsgaTsKKyAgICAgICAgICAgIHVSb3dzW2luZGV4XSA9IHZ1WzFdOworICAgICAgICAgICAgdlJvd3NbaW5kZXhdID0gdnVbMF07CisgICAgICAgICAgICB2dSArPSAyOworICAgICAgICB9CisgICAgfQorfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzc0RhdGEoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgRXhpZkRhdGEqIGV4aWZEYXRhKSB7CisgICAgY29uc3QgdWludDhfdCogeVsxNl07CisgICAgY29uc3QgdWludDhfdCogY2JbOF07CisgICAgY29uc3QgdWludDhfdCogY3JbOF07CisgICAgY29uc3QgdWludDhfdCoqIHBsYW5lc1szXSA9IHsgeSwgY2IsIGNyIH07CisKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgIGludCB3aWR0aCA9IG1Db21wcmVzc0luZm8uaW1hZ2Vfd2lkdGg7CisgICAgaW50IGhlaWdodCA9IG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QqIHlQbGFuYXIgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QqIHZ1UGxhbmFyID0gZGF0YSArICh3aWR0aCAqIGhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdVJvd3MoOCAqICh3aWR0aCA+PiAxKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdlJvd3MoOCAqICh3aWR0aCA+PiAxKSk7CisKKyAgICAvLyBOT1RFISBEQU5HRVIhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgYmVsb3cgc2V0am1wIQorICAgIC8vIFRoZSBjb21waWxlciB3aWxsIG5vdCBnZW5lcmF0ZSBjb2RlIHRvIGRlc3Ryb3kgdGhlbSBkdXJpbmcgdGhlIHJldHVybgorICAgIC8vIGJlbG93IHNvIHRoZXkgd2lsbCBsZWFrLiBBZGRpdGlvbmFsbHksIGRvIG5vdCBwbGFjZSBhbnkgY2FsbHMgdG8gbGlianBlZworICAgIC8vIHRoYXQgY2FuIGZhaWwgYWJvdmUgdGhpcyBsaW5lIG9yIGFueSBlcnJvciB3aWxsIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoc2V0am1wKG1FcnJvck1hbmFnZXIubUp1bXBCdWZmZXIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIGVycm9yIGhhbmRsZXIgd2lsbCBqdW1wIGluIGNhc2UgY29tcHJlc3Npb24gZmFpbHMKKyAgICAgICAgLy8gVGhlIGVycm9yIG1hbmFnZXIgd2lsbCBBTE9HIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJm1Db21wcmVzc0luZm8sIFRSVUUpOworCisgICAgYXR0YWNoRXhpZkRhdGEoZXhpZkRhdGEpOworCisgICAgLy8gcHJvY2VzcyAxNiBsaW5lcyBvZiBZIGFuZCA4IGxpbmVzIG9mIFUvViBlYWNoIHRpbWUuCisgICAgd2hpbGUgKG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSA8IG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0KSB7CisgICAgICAgIC8vZGVpbnRlcmxlYXZlIHUgYW5kIHYKKyAgICAgICAgZGVpbnRlcmxlYXZlKHZ1UGxhbmFyLCB1Um93cywgdlJvd3MsIG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKKworICAgICAgICAvLyBKcGVnIGxpYnJhcnkgaWdub3JlcyB0aGUgcm93cyB3aG9zZSBpbmRpY2VzIGFyZSBncmVhdGVyIHRoYW4gaGVpZ2h0LgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgLy8geSByb3cKKyAgICAgICAgICAgIHlbaV0gPSB5UGxhbmFyICsgKG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSArIGkpICogd2lkdGg7CisKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB1IHJvdyBhbmQgdiByb3cKKyAgICAgICAgICAgIGlmICgoaSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSBib3RoIGhhbHZlZCBiZWNhdXNlIG9mIGRvd25zYW1wbGluZworICAgICAgICAgICAgICAgIG9mZnNldCA9IChpID4+IDEpICogKHdpZHRoID4+IDEpOworICAgICAgICAgICAgICAgIGNiW2kvMl0gPSAmdVJvd3Nbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBjcltpLzJdID0gJnZSb3dzW29mZnNldF07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBqcGVnX3dyaXRlX3Jhd19kYXRhKCZtQ29tcHJlc3NJbmZvLCBjb25zdF9jYXN0PEpTQU1QSU1BR0U+KHBsYW5lcyksIDE2KTsKKyAgICB9CisKKyAgICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisgICAganBlZ19kZXN0cm95X2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjphdHRhY2hFeGlmRGF0YShFeGlmRGF0YSogZXhpZkRhdGEpIHsKKyAgICBpZiAoZXhpZkRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2UgZG9uJ3QgcmVxdWlyZSBFWElGIGRhdGEKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gU2F2ZSB0aGUgRVhJRiBkYXRhIHRvIG1lbW9yeQorICAgIHVuc2lnbmVkIGNoYXIqIHJhd0RhdGEgPSBudWxscHRyOworICAgIHVuc2lnbmVkIGludCBzaXplID0gMDsKKyAgICBleGlmX2RhdGFfc2F2ZV9kYXRhKGV4aWZEYXRhLCAmcmF3RGF0YSwgJnNpemUpOworICAgIGlmIChyYXdEYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgRVhJRiBkYXRhIGJsb2NrIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX3dyaXRlX21hcmtlcigmbUNvbXByZXNzSW5mbywgSlBFR19BUFAwICsgMSwgcmF3RGF0YSwgc2l6ZSk7CisgICAgZnJlZShyYXdEYXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTlYxMkNvbXByZXNzb3I6OkVycm9yTWFuYWdlcjo6RXJyb3JNYW5hZ2VyKCkgeworICAgIGVycm9yX2V4aXQgPSAmb25KcGVnRXJyb3I7Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkVycm9yTWFuYWdlcjo6b25KcGVnRXJyb3Ioal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgLy8gTk9URSEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBpbiB0aGlzIG1ldGhvZCBhdCB0aGUgdG9wCisgICAgLy8gc2NvcGUuIFRoZWlyIGRlc3RydWN0b3JzIHdpbGwgbm90IGJlIGNhbGxlZC4gSWYgeW91IGRvIG5lZWQgc3VjaCBhbgorICAgIC8vIG9iamVjdCBjcmVhdGUgYSBsb2NhbCBzY29wZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGxvbmdqbXAgY2FsbCwKKyAgICAvLyB0aGF0IGVuc3VyZXMgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgYmVmb3JlIGxvbmdqbXAgaXMgY2FsbGVkLgorICAgIEVycm9yTWFuYWdlciogZXJyb3JNYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxFcnJvck1hbmFnZXIqPihjaW5mby0+ZXJyKTsKKworICAgIC8vIEZvcm1hdCBhbmQgbG9nIGVycm9yIG1lc3NhZ2UKKyAgICBjaGFyIGVycm9yTWVzc2FnZVtKTVNHX0xFTkdUSF9NQVhdOworICAgICgqZXJyb3JNYW5hZ2VyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sIGVycm9yTWVzc2FnZSk7CisgICAgZXJyb3JNZXNzYWdlW3NpemVvZihlcnJvck1lc3NhZ2UpIC0gMV0gPSAnXDAnOworICAgIEFMT0dFKCJKUEVHIGNvbXByZXNzaW9uIGVycm9yOiAlcyIsIGVycm9yTWVzc2FnZSk7CisgICAganBlZ19kZXN0cm95KGNpbmZvKTsKKworICAgIC8vIEFuZCB0aHJvdWdoIHRoZSBsb29raW5nIGdsYXNzIHdlIGdvCisgICAgbG9uZ2ptcChlcnJvck1hbmFnZXItPm1KdW1wQnVmZmVyLCAxKTsKK30KKworTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6RGVzdGluYXRpb25NYW5hZ2VyKCkgeworICAgIGluaXRfZGVzdGluYXRpb24gPSAmaW5pdERlc3RpbmF0aW9uOworICAgIGVtcHR5X291dHB1dF9idWZmZXIgPSAmZW1wdHlPdXRwdXRCdWZmZXI7CisgICAgdGVybV9kZXN0aW5hdGlvbiA9ICZ0ZXJtRGVzdGluYXRpb247Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6aW5pdERlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBTdGFydCBvdXQgd2l0aCBzb21lIGFyYml0cmFyeSBidXQgbm90IHRvbyBsYXJnZSBidWZmZXIgc2l6ZQorICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKDE2ICogMTAyNCk7CisgICAgbWFuYWdlci0+bmV4dF9vdXRwdXRfYnl0ZSA9ICZtYW5hZ2VyLT5tQnVmZmVyWzBdOworICAgIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCk7Cit9CisKK2Jvb2xlYW4gTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6ZW1wdHlPdXRwdXRCdWZmZXIoCisgICAgICAgIGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBLZWVwIGRvdWJsaW5nIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIGEgdmVyeSBsb3csIGFtb3J0aXplZAorICAgIC8vIHBlcmZvcm1hbmNlIGNvc3Qgb2YgdGhlIGFsbG9jYXRpb25zCisgICAgc2l6ZV90IG9sZFNpemUgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKTsKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZShvbGRTaXplICogMik7CisgICAgbWFuYWdlci0+bmV4dF9vdXRwdXRfYnl0ZSA9ICZtYW5hZ2VyLT5tQnVmZmVyW29sZFNpemVdOworICAgIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCkgLSBvbGRTaXplOworICAgIHJldHVybiBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciAhPSAwOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OnRlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gUmVzaXplIGRvd24gdG8gdGhlIGV4YWN0IHNpemUgb2YgdGhlIG91dHB1dCwgdGhhdCBpcyByZW1vdmUgYXMgbWFueQorICAgIC8vIGJ5dGVzIGFzIHRoZXJlIGFyZSBsZWZ0IGluIHRoZSBidWZmZXIKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZShtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKSAtIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyKTsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZSh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwgc2l6ZV90ICpzaXplIC8qb3V0Ki8pIHsKKyAgICBpZiAoKHNpemUgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tKcGVnU3RhcnQoanBlZ0J1ZmZlcikgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFJlYWQgSkZJRiBzZWdtZW50IG1hcmtlcnMsIHNraXAgb3ZlciBzZWdtZW50IGRhdGEKKyAgICAqc2l6ZSA9IGtNYXJrZXJMZW5ndGg7IC8vanVtcCB0byBTdGFydCBPZiBJbWFnZQorICAgIHdoaWxlICgqc2l6ZSA8PSBtYXhTaXplIC0ga01hcmtlckxlbmd0aCkgeworICAgICAgICBzZWdtZW50X3QgKnNlZ21lbnQgPSAoc2VnbWVudF90KikoanBlZ0J1ZmZlciArICpzaXplKTsKKyAgICAgICAgdWludDhfdCB0eXBlID0gY2hlY2tKcGVnTWFya2VyKHNlZ21lbnQtPm1hcmtlcik7CisgICAgICAgIGlmICh0eXBlID09IDApIHsgLy8gaW52YWxpZCBtYXJrZXIsIG5vIG1vcmUgc2VnbWVudHMsIGJlZ2luIEpQRUcgZGF0YQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0ga0VuZE9mSW1hZ2UgfHwgKnNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHNlZ21lbnRfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGVuZ3RoID0gbnRvaHMoc2VnbWVudC0+bGVuZ3RoKTsKKyAgICAgICAgKnNpemUgKz0gbGVuZ3RoICsga01hcmtlckxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBGaW5kIEVuZCBvZiBJbWFnZQorICAgIC8vIFNjYW4gSlBFRyBidWZmZXIgdW50aWwgRW5kIG9mIEltYWdlCisgICAgYm9vbCBmb3VuZEVuZCA9IGZhbHNlOworICAgIGZvciAoIDsgKnNpemUgPD0gbWF4U2l6ZSAtIGtNYXJrZXJMZW5ndGg7ICgqc2l6ZSkrKykgeworICAgICAgICBpZiAoY2hlY2tKcGVnRW5kKGpwZWdCdWZmZXIgKyAqc2l6ZSkpIHsKKyAgICAgICAgICAgIGZvdW5kRW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICpzaXplICs9IGtNYXJrZXJMZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmRFbmQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoKnNpemUgPiBtYXhTaXplKSB7CisgICAgICAgICpzaXplID0gbWF4U2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKHVpbnQ4X3QgKmpwZWdCdWZmZXIsCisgICAgICAgIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwgc2l6ZV90ICp3aWR0aCAvKm91dCovLCBzaXplX3QgKmhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChqcGVnQnVmZmVyID09IG51bGxwdHIpIHx8ICh3aWR0aCA9PSBudWxscHRyKSB8fCAoaGVpZ2h0ID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoanBlZ0J1ZmZlclNpemUgPT0gMHUpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2NhbiBKUEVHIGJ1ZmZlciB1bnRpbCBTdGFydCBvZiBGcmFtZQorICAgIGJvb2wgZm91bmRTT0YgPSBmYWxzZTsKKyAgICBzaXplX3QgY3VycmVudFBvczsKKyAgICBmb3IgKGN1cnJlbnRQb3MgPSAwOyBjdXJyZW50UG9zIDw9IGpwZWdCdWZmZXJTaXplIC0ga01hcmtlckxlbmd0aDsgY3VycmVudFBvcysrKSB7CisgICAgICAgIGlmIChjaGVja1N0YXJ0T2ZGcmFtZShqcGVnQnVmZmVyICsgY3VycmVudFBvcykpIHsKKyAgICAgICAgICAgIGZvdW5kU09GID0gdHJ1ZTsKKyAgICAgICAgICAgIGN1cnJlbnRQb3MgKz0ga01hcmtlckxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZFNPRikgeworICAgICAgICBBTE9HRSgiJXM6IFN0YXJ0IG9mIEZyYW1lIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzb2ZfdCAqc3RhcnRPZkZyYW1lID0gcmVpbnRlcnByZXRfY2FzdDxzb2ZfdCAqPiAoanBlZ0J1ZmZlciArIGN1cnJlbnRQb3MpOworICAgICp3aWR0aCA9IG50b2hzKHN0YXJ0T2ZGcmFtZS0+d2lkdGgpOworICAgICpoZWlnaHQgPSBudG9ocyhzdGFydE9mRnJhbWUtPmhlaWdodCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24odWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IGpwZWdCdWZmZXJTaXplLAorICAgICAgICBFeGlmT3JpZW50YXRpb24gKmV4aWZWYWx1ZSAvKm91dCovKSB7CisgICAgaWYgKChqcGVnQnVmZmVyID09IG51bGxwdHIpIHx8IChleGlmVmFsdWUgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXJTaXplID09IDB1KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRGF0YT4gZXhpZkRhdGEoZXhpZl9kYXRhX25ldygpKTsKKyAgICBleGlmX2RhdGFfbG9hZF9kYXRhKGV4aWZEYXRhLmdldCgpLCBqcGVnQnVmZmVyLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgRXhpZkVudHJ5ICpvcmllbnRhdGlvbiA9IGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZkRhdGEtPmlmZFtFWElGX0lGRF8wXSwKKyAgICAgICAgICAgIEVYSUZfVEFHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoKG9yaWVudGF0aW9uID09IG51bGxwdHIpIHx8IChvcmllbnRhdGlvbi0+c2l6ZSAhPSBzaXplb2YoRXhpZlNob3J0KSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhdXRvIG9yaWVudGF0aW9uVmFsdWUgPSBleGlmX2dldF9zaG9ydChvcmllbnRhdGlvbi0+ZGF0YSwKKyAgICAgICAgICAgIGV4aWZfZGF0YV9nZXRfYnl0ZV9vcmRlcihleGlmRGF0YS5nZXQoKSkpOworICAgIHN0YXR1c190IHJldDsKKyAgICBzd2l0Y2ggKG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgKmV4aWZWYWx1ZSA9IHN0YXRpY19jYXN0PEV4aWZPcmllbnRhdGlvbj4gKG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBFWElGIG9yaWVudGF0aW9uIHZhbHVlOiAldSIsIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjJkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKyNkZWZpbmUgVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGpwZWdsaWIuaD4KKyNpbmNsdWRlIDxqZXJyb3IuaD4KK30KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIi4uL3V0aWxzL0V4aWZVdGlscy5oIgorCitzdHJ1Y3QgX0V4aWZEYXRhOwordHlwZWRlZiBfRXhpZkRhdGEgRXhpZkRhdGE7CisKK2NsYXNzIE5WMTJDb21wcmVzc29yIHsKK3B1YmxpYzoKKyAgICBOVjEyQ29tcHJlc3NvcigpIHt9CisKKyAgICAvKiBDb21wcmVzcyB8ZGF0YXwgd2hpY2ggcmVwcmVzZW50cyByYXcgTlYyMSBlbmNvZGVkIGRhdGEgb2YgZGltZW5zaW9ucworICAgICAqIHx3aWR0aHwgKiB8aGVpZ2h0fC4KKyAgICAgKi8KKyAgICBib29sIGNvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpOworICAgIGJvb2wgY29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gZXhpZlZhbHVlKTsKKworICAgIC8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgY29tcHJlc3NlZCBkYXRhLCB0aGlzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHZlY3RvcgorICAgICAqIGlmIGNvbXByZXNzIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0CisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGdldENvbXByZXNzZWREYXRhKCkgY29uc3Q7CisKKyAgICAvLyBVdGlsaXR5IG1ldGhvZHMKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplIC8qb3V0Ki8pOworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGdldEV4aWZPcmllbnRhdGlvbih1aW50OF90ICpqcGVnQnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGpwZWdCdWZmZXJTaXplLCBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gKmV4aWZWYWx1ZSAvKm91dCovKTsKKworICAgIC8qIEdldCBKcGVnIGltYWdlIGRpbWVuc2lvbnMgZnJvbSB0aGUgZmlyc3QgU3RhcnQgT2YgRnJhbWUuIFBsZWFzZSBub3RlIHRoYXQgZHVlIHRvIHRoZQorICAgICAqIHdheSB0aGUganBlZyBidWZmZXIgaXMgc2Nhbm5lZCBpZiB0aGUgaW1hZ2UgY29udGFpbnMgYSB0aHVtYm5haWwsIHRoZW4gdGhlIHNpemUgcmV0dXJuZWQKKyAgICAgKiB3aWxsIGJlIG9mIHRoZSB0aHVtYm5haWwgYW5kIG5vdCB0aGUgbWFpbiBpbWFnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0SnBlZ0ltYWdlRGltZW5zaW9ucyh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUsCisgICAgICAgICAgICBzaXplX3QgKndpZHRoIC8qb3V0Ki8sIHNpemVfdCAqaGVpZ2h0IC8qb3V0Ki8pOworCitwcml2YXRlOgorCisgICAgc3RydWN0IERlc3RpbmF0aW9uTWFuYWdlciA6IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgICAgICAgRGVzdGluYXRpb25NYW5hZ2VyKCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgaW5pdERlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKyAgICAgICAgc3RhdGljIGJvb2xlYW4gZW1wdHlPdXRwdXRCdWZmZXIoal9jb21wcmVzc19wdHIgY2luZm8pOworICAgICAgICBzdGF0aWMgdm9pZCB0ZXJtRGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIHN0cnVjdCBFcnJvck1hbmFnZXIgOiBqcGVnX2Vycm9yX21nciB7CisgICAgICAgIEVycm9yTWFuYWdlcigpOworCisgICAgICAgIHN0YXRpYyB2b2lkIG9uSnBlZ0Vycm9yKGpfY29tbW9uX3B0ciBjaW5mbyk7CisKKyAgICAgICAgam1wX2J1ZiBtSnVtcEJ1ZmZlcjsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWFya2VyTGVuZ3RoID0gMjsgLy8gbGVuZ3RoIG9mIGEgbWFya2VyCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hcmtlciA9IDB4RkY7IC8vIEZpcnN0IGJ5dGUgb2YgbWFya2VyCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXJ0T2ZJbWFnZSA9IDB4RDg7IC8vIFN0YXJ0IG9mIEltYWdlCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0VuZE9mSW1hZ2UgPSAweEQ5OyAvLyBFbmQgb2YgSW1hZ2UKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhcnRPZkZyYW1lID0gMHhDMDsgLy8gU3RhcnQgb2YgRnJhbWUKKworICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzZWdtZW50X3QgeworICAgICAgICB1aW50OF90IG1hcmtlcltrTWFya2VyTGVuZ3RoXTsKKyAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgIH07CisKKyAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc29mX3QgeworICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgIHVpbnQ4X3QgcHJlY2lzaW9uOworICAgICAgICB1aW50MTZfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IHdpZHRoOworICAgIH07CisKKyAgICAvLyBjaGVjayBmb3Igc3RhcnQgb2YgaW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tTdGFydE9mRnJhbWUodWludDhfdCogYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga1N0YXJ0T2ZGcmFtZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3Igc3RhcnQgb2YgaW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tKcGVnU3RhcnQodWludDhfdCogYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga1N0YXJ0T2ZJbWFnZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgRW5kIG9mIEltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrSnBlZ0VuZCh1aW50OF90ICpidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrRW5kT2ZJbWFnZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgYXJiaXRyYXJ5IG1hcmtlciwgcmV0dXJucyBtYXJrZXIgdHlwZSAoc2Vjb25kIGJ5dGUpCisgICAgLy8gcmV0dXJucyAwIGlmIG5vIG1hcmtlciBmb3VuZC4gTm90ZTogMHgwMCBpcyBub3QgYSB2YWxpZCBtYXJrZXIgdHlwZQorICAgIHN0YXRpYyB1aW50OF90IGNoZWNrSnBlZ01hcmtlcih1aW50OF90ICpidWYpIHsKKyAgICAgICAgcmV0dXJuIChidWZbMF0gPT0ga01hcmtlcikgPyBidWZbMV0gOiAwOworICAgIH0KKworICAgIGpwZWdfY29tcHJlc3Nfc3RydWN0IG1Db21wcmVzc0luZm87CisgICAgRGVzdGluYXRpb25NYW5hZ2VyIG1EZXN0TWFuYWdlcjsKKyAgICBFcnJvck1hbmFnZXIgbUVycm9yTWFuYWdlcjsKKworICAgIGJvb2wgY29uZmlndXJlQ29tcHJlc3NvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KTsKKyAgICBib29sIGNvbXByZXNzRGF0YShjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBFeGlmRGF0YSogZXhpZkRhdGEpOworICAgIGJvb2wgYXR0YWNoRXhpZkRhdGEoRXhpZkRhdGEqIGV4aWZEYXRhKTsKK307CisKKyNlbmRpZiAgLy8gVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWUzNDRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKK30KKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQ2NF90IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworfQorCit2b2lkIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE3MGRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBDYW1lcmFUaHJlYWRTdGF0ZSB7CitwdWJsaWM6CisgIHN0YXRpYyBpbnQ2NF90IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgc3RhdGljIHZvaWQgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKK307CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhZmRjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKQEAgLTAsMCArMSwxMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2ZXJFeGlmVXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJFeGlmVXRpbHMuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KK30KKworbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkVudHJ5PiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRW50cnkqIGVudHJ5KSBjb25zdCB7IGV4aWZfZW50cnlfdW5yZWYoZW50cnkpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisKK2NsYXNzIEV4aWZVdGlsc0ltcGwgOiBwdWJsaWMgRXhpZlV0aWxzIHsKK3B1YmxpYzoKKyAgICBFeGlmVXRpbHNJbXBsKCk7CisKKyAgICB2aXJ0dWFsIH5FeGlmVXRpbHNJbXBsKCk7CisKKyAgICAvLyBJbml0aWFsaXplKCkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHNldHRpbmcgb2YgRXhpZiB0YWdzIHdpbGwgYmUKKyAgICAvLyBjbGVhcmVkLgorICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKTsKKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZUVtcHR5KCk7CisKKyAgICAvLyBzZXQgYWxsIGtub3duIGZpZWxkcyBmcm9tIGEgbWV0YWRhdGEgc3RydWN0dXJlCisgICAgdmlydHVhbCBib29sIHNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KTsKKworICAgIC8vIHNldHMgdGhlIGxlbiBhcGVydHVyZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSk7CisKKyAgICAvLyBzZXRzIHRoZSBjb2xvciBzcGFjZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKTsKKworICAgIC8vIHNldHMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgaW1hZ2UgbGFzdCBtb2RpZmllZC4gSXQgdGFrZXMgbG9jYWwgdGltZS4gVGhlCisgICAgLy8gbmFtZSBvZiB0aGUgdGFnIGlzIERhdGVUaW1lIGluIElGRDAuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KTsKKworICAgIC8vIHNldHMgdGhlIGRpZ2l0YWwgem9vbSByYXRpby4gSWYgdGhlIG51bWVyYXRvciBpcyAwLCBpdCBtZWFucyBkaWdpdGFsIHpvb20KKyAgICAvLyB3YXMgbm90IHVzZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGlnaXRhbFpvb21SYXRpbygKKyAgICAgICAgICAgIHVpbnQzMl90IGNyb3Bfd2lkdGgsIHVpbnQzMl90IGNyb3BfaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KTsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIGJpYXMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcik7CisKKyAgICAvLyBzZXRzIHRoZSBleHBvc3VyZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKTsKKworICAgIC8vIHNldHMgdGhlIGV4cG9zdXJlIHRpbWUsIGdpdmVuIGluIHNlY29uZHMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpOworCisgICAgLy8gc2V0cyB0aGUgc3RhdHVzIG9mIGZsYXNoLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZsYXNoKHVpbnQ4X3QgZmxhc2hfYXZhaWxhYmxlLCB1aW50OF90IGZsYXNoX3N0YXRlLCB1aW50OF90IGFlX21vZGUpOworCisgICAgLy8gc2V0cyB0aGUgRiBudW1iZXIuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rk51bWJlcihmbG9hdCBmX251bWJlcik7CisKKyAgICAvLyBzZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCk7CisKKyAgICAvLyBzZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyBmb3IgMzVtbSBmaWxtIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKGZsb2F0IGZvY2FsX2xlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpOworCisgICAgLy8gc2V0cyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSk7CisKKyAgICAvLyBzZXRzIHRoZSBsYXRpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpOworCisgICAgLy8gc2V0cyB0aGUgbG9uZ2l0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xvbmdpdHVkZShkb3VibGUgbG9uZ2l0dWRlKTsKKworICAgIC8vIHNldHMgR1BTIHByb2Nlc3NpbmcgbWV0aG9kLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCk7CisKKyAgICAvLyBzZXRzIEdQUyBkYXRlIHN0YW1wIGFuZCB0aW1lIHN0YW1wIChhdG9taWMgY2xvY2spLiBJdCB0YWtlcyBVVEMgdGltZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNUaW1lc3RhbXAoY29uc3Qgc3RydWN0IHRtJiB0KTsKKworICAgIC8vIHNldHMgdGhlIGxlbmd0aCAobnVtYmVyIG9mIHJvd3MpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKTsKKworICAgIC8vIHNldHMgdGhlIHdpZHRoIChudW1iZXIgb2YgY29sdW1lcykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKTsKKworICAgIC8vIHNldHMgdGhlIElTTyBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncyk7CisKKyAgICAvLyBzZXRzIHRoZSBzbWFsbGVzdCBGIG51bWJlciBvZiB0aGUgbGVucy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSk7CisKKyAgICAvLyBzZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpOworCisgICAgLy8gc2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKTsKKworICAgIC8vIHNldHMgdGhlIHNodXR0ZXIgc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpOworCisgICAgLy8gc2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIHN1YmplY3QsIGdpdmVuIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpOworCisgICAgLy8gc2V0cyB0aGUgZnJhY3Rpb25zIG9mIHNlY29uZHMgZm9yIHRoZSA8RGF0ZVRpbWU+IHRhZy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JhbGFuY2UpOworCisgICAgLy8gR2VuZXJhdGVzIEFQUDEgc2VnbWVudC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGdlbmVyYXRpbmcgQVBQMSBzZWdtZW50IGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUFwcDEoKTsKKworICAgIC8vIEdldHMgYnVmZmVyIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcHAxQnVmZmVyKCk7CisKKyAgICAvLyBHZXRzIGxlbmd0aCBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldEFwcDFMZW5ndGgoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gc2V0cyB0aGUgdmVyc2lvbiBvZiB0aGlzIHN0YW5kYXJkIHN1cHBvcnRlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeGlmVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhpZl92ZXJzaW9uKTsKKworICAgIC8vIFJlc2V0cyB0aGUgcG9pbnRlcnMgYW5kIG1lbW9yaWVzLgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gQWRkcyBhIHZhcmlhYmxlIGxlbmd0aCB0YWcgdG8gfGV4aWZfZGF0YV98LiBJdCB3aWxsIHJlbW92ZSB0aGUgb3JpZ2luYWwgb25lCisgICAgLy8gaWYgdGhlIHRhZyBleGlzdHMuCisgICAgLy8gUmV0dXJucyB0aGUgZW50cnkgb2YgdGhlIHRhZy4gVGhlIHJlZmVyZW5jZSBjb3VudCBvZiByZXR1cm5lZCBFeGlmRW50cnkgaXMKKyAgICAvLyB0d28uCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEV4aWZJZmQgaWZkLAorICAgICAgICAgICAgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LCB1aW50NjRfdCBjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyAgICAvLyBBZGRzIGEgZW50cnkgb2YgfHRhZ3wgaW4gfGV4aWZfZGF0YV98LiBJdCB3b24ndCByZW1vdmUgdGhlIG9yaWdpbmFsIG9uZSBpZgorICAgIC8vIHRoZSB0YWcgZXhpc3RzLgorICAgIC8vIFJldHVybnMgdGhlIGVudHJ5IG9mIHRoZSB0YWcuIEl0IGFkZHMgb25lIHJlZmVyZW5jZSBjb3VudCB0byByZXR1cm5lZAorICAgIC8vIEV4aWZFbnRyeS4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGFkZEVudHJ5KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZyk7CisKKyAgICAvLyBIZWxwZSBmdW5jdGlvbnMgdG8gYWRkIGV4aWYgZGF0YSB3aXRoIGRpZmZlcmVudCB0eXBlcy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2hvcnQoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MTZfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TG9uZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgICAgIHVpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRTUmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgICAgIGludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFN0cmluZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICBmbG9hdCBjb252ZXJ0VG9BcGV4KGZsb2F0IHZhbCkgeworICAgICAgICByZXR1cm4gMi4wZiAqIGxvZzJmKHZhbCk7CisgICAgfQorCisgICAgLy8gRGVzdHJveXMgdGhlIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQgaWYgZXhpc3RzLgorICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95QXBwMSgpOworCisgICAgLy8gVGhlIEV4aWYgZGF0YSAoQVBQMSkuIE93bmVkIGJ5IHRoaXMgY2xhc3MuCisgICAgRXhpZkRhdGEqIGV4aWZfZGF0YV87CisgICAgLy8gVGhlIHJhdyBkYXRhIG9mIEFQUDEgc2VnbWVudC4gSXQncyBhbGxvY2F0ZWQgYnkgRXhpZk1lbSBpbiB8ZXhpZl9kYXRhX3wgYnV0CisgICAgLy8gb3duZWQgYnkgdGhpcyBjbGFzcy4KKyAgICB1aW50OF90KiBhcHAxX2J1ZmZlcl87CisgICAgLy8gVGhlIGxlbmd0aCBvZiB8YXBwMV9idWZmZXJffC4KKyAgICB1bnNpZ25lZCBpbnQgYXBwMV9sZW5ndGhfOworCisgICAgLy8gSG93IHByZWNpc2UgdGhlIGZsb2F0LXRvLXJhdGlvbmFsIGNvbnZlcnNpb24gZm9yIEVYSUYgdGFncyB3b3VsZCBiZS4KKyAgICBjb25zdCBzdGF0aWMgaW50IGtSYXRpb25hbFByZWNpc2lvbiA9IDEwMDAwOworfTsKKworI2RlZmluZSBTRVRfU0hPUlQoaWZkLCB0YWcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFNob3J0KGlmZCwgdGFnLCB2YWx1ZSwgI3RhZykgPT0gZmFsc2UpICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX0xPTkcoaWZkLCB0YWcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRMb25nKGlmZCwgdGFnLCB2YWx1ZSwgI3RhZykgPT0gZmFsc2UpICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9SQVRJT05BTChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvcikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFJhdGlvbmFsKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yLCAjdGFnKSA9PSBmYWxzZSkgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9TUkFUSU9OQUwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRTUmF0aW9uYWwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IsICN0YWcpID09IGZhbHNlKSAgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1NUUklORyhpZmQsIHRhZywgZm9ybWF0LCBidWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFN0cmluZyhpZmQsIHRhZywgZm9ybWF0LCBidWZmZXIsICN0YWcpID09IGZhbHNlKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworLy8gVGhpcyBjb21lcyBmcm9tIHRoZSBFeGlmIFZlcnNpb24gMi4yIHN0YW5kYXJkIHRhYmxlIDYuCitjb25zdCBjaGFyIGdFeGlmQXNjaWlQcmVmaXhbXSA9IHsweDQxLCAweDUzLCAweDQzLCAweDQ5LCAweDQ5LCAweDAsIDB4MCwgMHgwfTsKKworc3RhdGljIHZvaWQgc2V0TGF0aXR1ZGVPckxvbmdpdHVkZURhdGEodW5zaWduZWQgY2hhciogZGF0YSwgZG91YmxlIG51bSkgeworICAgIC8vIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB8bnVtfC4KKyAgICBFeGlmTG9uZyBkZWdyZWVzID0gc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KG51bSk7CisgICAgRXhpZkxvbmcgbWludXRlcyA9IHN0YXRpY19jYXN0PEV4aWZMb25nPig2MCAqIChudW0gLSBkZWdyZWVzKSk7CisgICAgRXhpZkxvbmcgbWljcm9zZWNvbmRzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEV4aWZMb25nPigzNjAwMDAwMDAwdSAqIChudW0gLSBkZWdyZWVzIC0gbWludXRlcyAvIDYwLjApKTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtkZWdyZWVzLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZGF0YSArIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHttaW51dGVzLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZGF0YSArIDIgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge21pY3Jvc2Vjb25kcywgMTAwMDAwMH0pOworfQorCitFeGlmVXRpbHMgKkV4aWZVdGlsczo6Y3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgRXhpZlV0aWxzSW1wbCgpOworfQorCitFeGlmVXRpbHM6On5FeGlmVXRpbHMoKSB7Cit9CisKK0V4aWZVdGlsc0ltcGw6OkV4aWZVdGlsc0ltcGwoKQorICAgICAgICA6IGV4aWZfZGF0YV8obnVsbHB0ciksIGFwcDFfYnVmZmVyXyhudWxscHRyKSwgYXBwMV9sZW5ndGhfKDApIHt9CisKK0V4aWZVdGlsc0ltcGw6On5FeGlmVXRpbHNJbXBsKCkgeworICAgIHJlc2V0KCk7Cit9CisKKworYm9vbCBFeGlmVXRpbHNJbXBsOjppbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKSB7CisgICAgcmVzZXQoKTsKKyAgICBleGlmX2RhdGFfID0gZXhpZl9kYXRhX25ld19mcm9tX2RhdGEoYXBwMVNlZ21lbnQsIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgaWYgKGV4aWZfZGF0YV8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZl9kYXRhXyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNldCB0aGUgaW1hZ2Ugb3B0aW9ucy4KKyAgICBleGlmX2RhdGFfc2V0X29wdGlvbihleGlmX2RhdGFfLCBFWElGX0RBVEFfT1BUSU9OX0ZPTExPV19TUEVDSUZJQ0FUSU9OKTsKKyAgICBleGlmX2RhdGFfc2V0X2RhdGFfdHlwZShleGlmX2RhdGFfLCBFWElGX0RBVEFfVFlQRV9DT01QUkVTU0VEKTsKKyAgICBleGlmX2RhdGFfc2V0X2J5dGVfb3JkZXIoZXhpZl9kYXRhXywgRVhJRl9CWVRFX09SREVSX0lOVEVMKTsKKworICAgIC8vIHNldCBleGlmIHZlcnNpb24gdG8gMi4yLgorICAgIGlmICghc2V0RXhpZlZlcnNpb24oIjAyMjAiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6aW5pdGlhbGl6ZUVtcHR5KCkgeworICAgIHJlc2V0KCk7CisgICAgZXhpZl9kYXRhXyA9IGV4aWZfZGF0YV9uZXcoKTsKKyAgICBpZiAoZXhpZl9kYXRhXyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogYWxsb2NhdGUgbWVtb3J5IGZvciBleGlmX2RhdGFfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2V0IHRoZSBpbWFnZSBvcHRpb25zLgorICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmX2RhdGFfLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworCisgICAgLy8gc2V0IGV4aWYgdmVyc2lvbiB0byAyLjIuCisgICAgaWYgKCFzZXRFeGlmVmVyc2lvbigiMDIyMCIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgeworICAgIGZsb2F0IGFwZXhWYWx1ZSA9IGNvbnZlcnRUb0FwZXgoYXBlcnR1cmUpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19BUEVSVFVSRV9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGFwZXhWYWx1ZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0NPTE9SX1NQQUNFLCBjb2xvcl9zcGFjZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KSB7CisgICAgLy8gVGhlIGxlbmd0aCBpcyAyMCBieXRlcyBpbmNsdWRpbmcgTlVMTCBmb3IgdGVybWluYXRpb24gaW4gRXhpZiBzdGFuZGFyZC4KKyAgICBjaGFyIHN0clsyMF07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlMDRpOiUwMmk6JTAyaSAlMDJpOiUwMmk6JTAyaSIsCisgICAgICAgICAgICB0LnRtX3llYXIgKyAxOTAwLCB0LnRtX21vbiArIDEsIHQudG1fbWRheSwgdC50bV9ob3VyLCB0LnRtX21pbiwgdC50bV9zZWMpOworICAgIGlmIChyZXN1bHQgIT0gc2l6ZW9mKHN0cikgLSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogSW5wdXQgdGltZSBpcyBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoc3RyKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0RBVEVfVElNRSwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19EQVRFX1RJTUVfT1JJR0lOQUwsIEVYSUZfRk9STUFUX0FTQ0lJLCBidWZmZXIpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfREFURV9USU1FX0RJR0lUSVpFRCwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RGlnaXRhbFpvb21SYXRpbygKKyAgICAgICAgdWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCkgeworICAgIGZsb2F0IHpvb21SYXRpb1ggPSAoY3JvcF93aWR0aCA9PSAwKSA/IDEuMCA6IDEuMCAqIHNlbnNvcl93aWR0aCAvIGNyb3Bfd2lkdGg7CisgICAgZmxvYXQgem9vbVJhdGlvWSA9IChjcm9wX2hlaWdodCA9PSAwKSA/IDEuMCA6IDEuMCAqIHNlbnNvcl9oZWlnaHQgLyBjcm9wX2hlaWdodDsKKyAgICBmbG9hdCB6b29tUmF0aW8gPSBzdGQ6Om1heCh6b29tUmF0aW9YLCB6b29tUmF0aW9ZKTsKKyAgICBjb25zdCBzdGF0aWMgZmxvYXQgbm9ab29tVGhyZXNob2xkID0gMS4wMmY7CisKKyAgICBpZiAoem9vbVJhdGlvIDw9IG5vWm9vbVRocmVzaG9sZCkgeworICAgICAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRElHSVRBTF9aT09NX1JBVElPLCAwLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRElHSVRBTF9aT09NX1JBVElPLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKHpvb21SYXRpbyAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpIHsKKyAgICB1aW50MTZfdCBleHBvc3VyZU1vZGUgPSAoZXhwb3N1cmVfbW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkYpID8gMSA6IDA7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYUE9TVVJFX01PREUsIGV4cG9zdXJlTW9kZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfVElNRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGV4cG9zdXJlX3RpbWUgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSkgeworICAgIC8vIEVYSUZfVEFHX0ZMQVNIIGJpdHMgbGF5b3V0IHBlciBFWElGIHN0YW5kYXJkOgorICAgIC8vIEJpdCAwOiAgICAwIC0gZGlkIG5vdCBmaXJlCisgICAgLy8gICAgICAgICAgIDEgLSBmaXJlZAorICAgIC8vIEJpdCAxLTI6ICBzdGF0dXMgb2YgcmV0dXJuIGxpZ2h0CisgICAgLy8gQml0IDMtNDogIDAgLSB1bmtub3duCisgICAgLy8gICAgICAgICAgIDEgLSBjb21wdWxzb3J5IGZsYXNoIGZpcmluZworICAgIC8vICAgICAgICAgICAyIC0gY29tcHVsc29yeSBmbGFzaCBzdXBwcmVzc2lvbgorICAgIC8vICAgICAgICAgICAzIC0gYXV0byBtb2RlCisgICAgLy8gQml0IDU6ICAgIDAgLSBmbGFzaCBmdW5jdGlvbiBwcmVzZW50CisgICAgLy8gICAgICAgICAgIDEgLSBubyBmbGFzaCBmdW5jdGlvbgorICAgIC8vIEJpdCA2OiAgICAwIC0gbm8gcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSBvciB1bmtub3duCisgICAgLy8gICAgICAgICAgIDEgLSByZWQtZXllIHJlZHVjdGlvbiBzdXBwb3J0ZWQKKyAgICB1aW50MTZfdCBmbGFzaCA9IDB4MjA7CisKKyAgICBpZiAoZmxhc2hfYXZhaWxhYmxlID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRSkgeworICAgICAgICBmbGFzaCA9IDB4MDA7CisKKyAgICAgICAgaWYgKGZsYXNoX3N0YXRlID09IEFORFJPSURfRkxBU0hfU1RBVEVfRklSRUQpIHsKKyAgICAgICAgICAgIGZsYXNoIHw9IDB4MTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWVfbW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRSkgeworICAgICAgICAgICAgZmxhc2ggfD0gMHg0MDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQxNl90IGZsYXNoTW9kZSA9IDA7CisgICAgICAgIHN3aXRjaCAoYWVfbW9kZSkgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRToKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDM7IC8vIEFVVE8KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BTFdBWVNfRkxBU0g6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0VYVEVSTkFMX0ZMQVNIOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMTsgLy8gT04KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkY6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMjsgLy8gT0ZGCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAwOyAvLyBVTktOT1dOCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFzaCB8PSAoZmxhc2hNb2RlIDw8IDMpOworICAgIH0KKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRkxBU0gsIGZsYXNoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKSB7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZOVU1CRVIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmX251bWJlciAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpIHsKKyAgICB1aW50MzJfdCBudW1lcmF0b3IgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmb2NhbF9sZW5ndGggKiBrUmF0aW9uYWxQcmVjaXNpb24pKTsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk9DQUxfTEVOR1RILCBudW1lcmF0b3IsIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKAorICAgICAgICBmbG9hdCBmb2NhbF9sZW5ndGgsIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZmlsbURpYWdvbmFsID0gNDMuMjc7IC8vIGRpYWdvbmFsIG9mIDM1bW0gZmlsbQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaW5TZW5zb3JEaWFnb25hbCA9IDAuMDE7CisgICAgZmxvYXQgc2Vuc29yRGlhZ29uYWwgPSBzdGQ6OnNxcnQoCisgICAgICAgICAgICBzZW5zb3Jfc2l6ZV94ICogc2Vuc29yX3NpemVfeCArIHNlbnNvcl9zaXplX3kgKiBzZW5zb3Jfc2l6ZV95KTsKKyAgICBzZW5zb3JEaWFnb25hbCA9IHN0ZDo6bWF4KHNlbnNvckRpYWdvbmFsLCBtaW5TZW5zb3JEaWFnb25hbCk7CisgICAgZmxvYXQgZm9jYWxMZW5ndGgzNW1tRmlsbSA9IHN0ZDo6cm91bmQoZm9jYWxfbGVuZ3RoICogZmlsbURpYWdvbmFsIC8gc2Vuc29yRGlhZ29uYWwpOworICAgIGZvY2FsTGVuZ3RoMzVtbUZpbG0gPSBzdGQ6Om1pbigxLjBmICogNjU1MzUsIGZvY2FsTGVuZ3RoMzVtbUZpbG0pOworCisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZPQ0FMX0xFTkdUSF9JTl8zNU1NX0ZJTE0sCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZm9jYWxMZW5ndGgzNW1tRmlsbSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSkgeworICAgIEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0FMVElUVURFX1JFRik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gcmVmRW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHJlZlRhZywgRVhJRl9GT1JNQVRfQllURSwgMSwgMSk7CisgICAgaWYgKCFyZWZFbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNBbHRpdHVkZVJlZiBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGFsdGl0dWRlID49IDApIHsKKyAgICAgICAgKnJlZkVudHJ5LT5kYXRhID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVmRW50cnktPmRhdGEgPSAxOworICAgICAgICBhbHRpdHVkZSAqPSAtMTsKKyAgICB9CisKKyAgICBFeGlmVGFnIHRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19BTFRJVFVERSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KAorICAgICAgICAgICAgRVhJRl9JRkRfR1BTLCB0YWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAxLCBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtFWElGX0lGRF9HUFNdLCByZWZFbnRyeS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0FsdGl0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPihhbHRpdHVkZSAqIDEwMDApLCAxMDAwfSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpIHsKKyAgICBjb25zdCBFeGlmVGFnIHJlZlRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MQVRJVFVERV9SRUYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IHJlZkVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCByZWZUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCAyLCAyKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xhdGl0dWRlUmVmIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobGF0aXR1ZGUgPj0gMCkgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJOIiwgc2l6ZW9mKCJOIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIlMiLCBzaXplb2YoIlMiKSk7CisgICAgICAgIGxhdGl0dWRlICo9IC0xOworICAgIH0KKworICAgIGNvbnN0IEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xBVElUVURFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoCisgICAgICAgICAgICBFWElGX0lGRF9HUFMsIHRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDMsIDMgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtFWElGX0lGRF9HUFNdLCByZWZFbnRyeS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xhdGl0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YShlbnRyeS0+ZGF0YSwgbGF0aXR1ZGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpIHsKKyAgICBFeGlmVGFnIHJlZlRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MT05HSVRVREVfUkVGKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiByZWZFbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgcmVmVGFnLCBFWElGX0ZPUk1BVF9BU0NJSSwgMiwgMik7CisgICAgaWYgKCFyZWZFbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMb25naXR1ZGVSZWYgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsb25naXR1ZGUgPj0gMCkgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJFIiwgc2l6ZW9mKCJFIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIlciLCBzaXplb2YoIlciKSk7CisgICAgICAgIGxvbmdpdHVkZSAqPSAtMTsKKyAgICB9CisKKyAgICBFeGlmVGFnIHRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MT05HSVRVREUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeSgKKyAgICAgICAgICAgIEVYSUZfSUZEX0dQUywgdGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywgMyAqIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTG9uZ2l0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YShlbnRyeS0+ZGF0YSwgbG9uZ2l0dWRlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgeworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyhnRXhpZkFzY2lpUHJlZml4LCBzaXplb2YoZ0V4aWZBc2NpaVByZWZpeCkpICsgbWV0aG9kOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfR1BTLCBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpLAorICAgICAgICAgICAgRVhJRl9GT1JNQVRfVU5ERUZJTkVELCBidWZmZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpIHsKKyAgICBjb25zdCBFeGlmVGFnIGRhdGVUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfREFURV9TVEFNUCk7CisgICAgY29uc3Qgc2l6ZV90IGtHcHNEYXRlU3RhbXBTaXplID0gMTE7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywKKyAgICAgICAgICAgIGRhdGVUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCBrR3BzRGF0ZVN0YW1wU2l6ZSwga0dwc0RhdGVTdGFtcFNpemUpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTRGF0ZVN0YW1wIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW50cnktPmRhdGEpLCBrR3BzRGF0ZVN0YW1wU2l6ZSwKKyAgICAgICAgICAgICIlMDRpOiUwMmk6JTAyaSIsIHQudG1feWVhciArIDE5MDAsIHQudG1fbW9uICsgMSwgdC50bV9tZGF5KTsKKyAgICBpZiAocmVzdWx0ICE9IGtHcHNEYXRlU3RhbXBTaXplIC0gMSkgeworICAgICAgICBBTE9HVygiJXM6IElucHV0IHRpbWUgaXMgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBFeGlmVGFnIHRpbWVUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfVElNRV9TVEFNUCk7CisgICAgZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgdGltZVRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDMsCisgICAgICAgICAgICAzICogc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTVGltZVN0YW1wIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX2hvdXIpLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEgKyBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX21pbiksIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSArIDIgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX3NlYyksIDF9KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEltYWdlSGVpZ2h0KHVpbnQzMl90IGxlbmd0aCkgeworICAgIFNFVF9MT05HKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0lNQUdFX0xFTkdUSCwgbGVuZ3RoKTsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19QSVhFTF9ZX0RJTUVOU0lPTiwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSB7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfSU1BR0VfV0lEVEgsIHdpZHRoKTsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19QSVhFTF9YX0RJTUVOU0lPTiwgd2lkdGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0lTT19TUEVFRF9SQVRJTkdTLCBpc29fc3BlZWRfcmF0aW5ncyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0TWF4QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpIHsKKyAgICBmbG9hdCBtYXhBcGVydHVyZSA9IGNvbnZlcnRUb0FwZXgoYXBlcnR1cmUpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19NQVhfQVBFUlRVUkVfVkFMVUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChtYXhBcGVydHVyZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgdWludDMyX3QgZXZfc3RlcF9udW1lcmF0b3IsIHVpbnQzMl90IGV2X3N0ZXBfZGVub21pbmF0b3IpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfQklBU19WQUxVRSwKKyAgICAgICAgICAgIGV2ICogZXZfc3RlcF9udW1lcmF0b3IsIGV2X3N0ZXBfZGVub21pbmF0b3IpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpIHsKKyAgICBFeGlmT3JpZW50YXRpb24gdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICBzd2l0Y2ggKGRlZ3JlZXMpIHsKKyAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHNldE9yaWVudGF0aW9uVmFsdWUodmFsdWUpOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfMCwgRVhJRl9UQUdfT1JJRU5UQVRJT04sIG9yaWVudGF0aW9uVmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNodXR0ZXJTcGVlZChmbG9hdCBleHBvc3VyZV90aW1lKSB7CisgICAgZmxvYXQgc2h1dHRlclNwZWVkID0gLWxvZzJmKGV4cG9zdXJlX3RpbWUpOworICAgIFNFVF9TUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU0hVVFRFUl9TUEVFRF9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaHV0dGVyU3BlZWQgKiBrUmF0aW9uYWxQcmVjaXNpb24pLCBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycykgeworICAgIGNvbnN0IHN0YXRpYyBmbG9hdCBrSW5maW5pdHlEaW9wdGVycyA9IDEuMGUtNjsKKyAgICB1aW50MzJfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOworICAgIHVpbnQxNl90IGRpc3RhbmNlUmFuZ2U7CisgICAgaWYgKGRpb3B0ZXJzID4ga0luZmluaXR5RGlvcHRlcnMpIHsKKyAgICAgICAgZmxvYXQgZm9jdXNEaXN0YW5jZSA9IDEuMGYgLyBkaW9wdGVyczsKKyAgICAgICAgbnVtZXJhdG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZm9jdXNEaXN0YW5jZSAqIGtSYXRpb25hbFByZWNpc2lvbikpOworICAgICAgICBkZW5vbWluYXRvciA9IGtSYXRpb25hbFByZWNpc2lvbjsKKworICAgICAgICBpZiAoZm9jdXNEaXN0YW5jZSA8IDEuMGYpIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAxOyAvLyBNYWNybworICAgICAgICB9IGVsc2UgaWYgKGZvY3VzRGlzdGFuY2UgPCAzLjBmKSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMjsgLy8gQ2xvc2UKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAzOyAvLyBEaXN0YW50CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBudW1lcmF0b3IgPSAweEZGRkZGRkZGOworICAgICAgICBkZW5vbWluYXRvciA9IDE7CisgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAzOyAvLyBEaXN0YW50CisgICAgfQorICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJKRUNUX0RJU1RBTkNFLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCSkVDVF9ESVNUQU5DRV9SQU5HRSwgZGlzdGFuY2VSYW5nZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpIHsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRSwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRV9PUklHSU5BTCwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRV9ESUdJVElaRUQsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmFsYW5jZSkgeworICAgIHVpbnQxNl90IHdoaXRlQmFsYW5jZSA9ICh3aGl0ZV9iYWxhbmNlID09IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9BVVRPKSA/IDAgOiAxOworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19XSElURV9CQUxBTkNFLCB3aGl0ZUJhbGFuY2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OmdlbmVyYXRlQXBwMSgpIHsKKyAgICBkZXN0cm95QXBwMSgpOworICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBpbnRvIHxhcHAxX2J1ZmZlcl98LgorICAgIGV4aWZfZGF0YV9zYXZlX2RhdGEoZXhpZl9kYXRhXywgJmFwcDFfYnVmZmVyXywgJmFwcDFfbGVuZ3RoXyk7CisgICAgaWYgKCFhcHAxX2xlbmd0aF8pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFwcDFfYnVmZmVyXyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qCisgICAgICogVGhlIEpQRUcgc2VnbWVudCBzaXplIGlzIDE2IGJpdHMgaW4gc3BlYy4gVGhlIHNpemUgb2YgQVBQMSBzZWdtZW50IHNob3VsZAorICAgICAqIGJlIHNtYWxsZXIgdGhhbiA2NTUzMyBiZWNhdXNlIHRoZXJlIGFyZSB0d28gYnl0ZXMgZm9yIHNlZ21lbnQgc2l6ZSBmaWVsZC4KKyAgICAgKi8KKyAgICBpZiAoYXBwMV9sZW5ndGhfID4gNjU1MzMpIHsKKyAgICAgICAgZGVzdHJveUFwcDEoKTsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGUgc2l6ZSBvZiBBUFAxIHNlZ21lbnQgaXMgdG9vIGxhcmdlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgdWludDhfdCogRXhpZlV0aWxzSW1wbDo6Z2V0QXBwMUJ1ZmZlcigpIHsKKyAgICByZXR1cm4gYXBwMV9idWZmZXJfOworfQorCit1bnNpZ25lZCBpbnQgRXhpZlV0aWxzSW1wbDo6Z2V0QXBwMUxlbmd0aCgpIHsKKyAgICByZXR1cm4gYXBwMV9sZW5ndGhfOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4aWZWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGlmX3ZlcnNpb24pIHsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYSUZfVkVSU0lPTiwgRVhJRl9GT1JNQVRfVU5ERUZJTkVELCBleGlmX3ZlcnNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4aWZVdGlsc0ltcGw6OnJlc2V0KCkgeworICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgaWYgKGV4aWZfZGF0YV8pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2Ugd2UgZGVjaWRlZCB0byBpZ25vcmUgdGhlIG9yaWdpbmFsIEFQUDEsIHdlIGFyZSBzdXJlIHRoYXQgdGhlcmUgaXMKKyAgICAgICAgICogbm8gdGh1bWJuYWlsIGFsbG9jYXRlZCBieSBsaWJleGlmLiB8ZXhpZl9kYXRhXy0+ZGF0YXwgaXMgYWN0dWFsbHkKKyAgICAgICAgICogYWxsb2NhdGVkIGJ5IEpwZWdDb21wcmVzc29yLiBzZXRzIHxleGlmX2RhdGFfLT5kYXRhfCB0byBudWxscHRyIHRvCisgICAgICAgICAqIHByZXZlbnQgZXhpZl9kYXRhX3VucmVmKCkgZGVzdHJveSBpdCBpbmNvcnJlY3RseS4KKyAgICAgICAgICovCisgICAgICAgIGV4aWZfZGF0YV8tPmRhdGEgPSBudWxscHRyOworICAgICAgICBleGlmX2RhdGFfLT5zaXplID0gMDsKKyAgICAgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZfZGF0YV8pOworICAgICAgICBleGlmX2RhdGFfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IEV4aWZVdGlsc0ltcGw6OmFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRXhpZklmZCBpZmQsCisgICAgICAgIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwgdWludDY0X3QgY29tcG9uZW50cywgdW5zaWduZWQgaW50IHNpemUpIHsKKyAgICAvLyBSZW1vdmUgb2xkIGVudHJ5IGlmIGV4aXN0cy4KKyAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLAorICAgICAgICAgICAgZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgdGFnKSk7CisgICAgRXhpZk1lbSogbWVtID0gZXhpZl9tZW1fbmV3X2RlZmF1bHQoKTsKKyAgICBpZiAoIW1lbSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkoZXhpZl9lbnRyeV9uZXdfbWVtKG1lbSkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHZvaWQqIHRtcEJ1ZmZlciA9IGV4aWZfbWVtX2FsbG9jKG1lbSwgc2l6ZSk7CisgICAgaWYgKCF0bXBCdWZmZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZW50cnktPmRhdGEgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4odG1wQnVmZmVyKTsKKyAgICBlbnRyeS0+dGFnID0gdGFnOworICAgIGVudHJ5LT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgZW50cnktPmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICAgIGVudHJ5LT5zaXplID0gc2l6ZTsKKworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIGVudHJ5LmdldCgpKTsKKyAgICBleGlmX21lbV91bnJlZihtZW0pOworCisgICAgcmV0dXJuIGVudHJ5OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBFeGlmVXRpbHNJbXBsOjphZGRFbnRyeShFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeShleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCB0YWcpKTsKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgLy8gZXhpZl9jb250ZW50X2dldF9lbnRyeSgpIHdvbid0IHJlZiB0aGUgZW50cnksIHNvIHdlIHJlZiBoZXJlLgorICAgICAgICBleGlmX2VudHJ5X3JlZihlbnRyeS5nZXQoKSk7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisgICAgZW50cnkucmVzZXQoZXhpZl9lbnRyeV9uZXcoKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgZW50cnktPnRhZyA9IHRhZzsKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCBlbnRyeS5nZXQoKSk7CisgICAgZXhpZl9lbnRyeV9pbml0aWFsaXplKGVudHJ5LmdldCgpLCB0YWcpOworICAgIHJldHVybiBlbnRyeTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTaG9ydChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQxNl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3Nob3J0KGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRMb25nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfbG9uZyhlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0UmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgIHVpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtudW1lcmF0b3IsIGRlbm9taW5hdG9yfSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U1JhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgaW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgIGludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfc3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtudW1lcmF0b3IsIGRlbm9taW5hdG9yfSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3RyaW5nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBidWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzaXplX3QgZW50cnlfc2l6ZSA9IGJ1ZmZlci5sZW5ndGgoKTsKKyAgICAvLyBTaW5jZSB0aGUgZXhpZiBmb3JtYXQgaXMgdW5kZWZpbmVkLCBOVUxMIHRlcm1pbmF0aW9uIGlzIG5vdCBuZWNlc3NhcnkuCisgICAgaWYgKGZvcm1hdCA9PSBFWElGX0ZPUk1BVF9BU0NJSSkgeworICAgICAgICBlbnRyeV9zaXplKys7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoaWZkLCB0YWcsIGZvcm1hdCwgZW50cnlfc2l6ZSwgZW50cnlfc2l6ZSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweShlbnRyeS0+ZGF0YSwgYnVmZmVyLmNfc3RyKCksIGVudHJ5X3NpemUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4aWZVdGlsc0ltcGw6OmRlc3Ryb3lBcHAxKCkgeworICAgIC8qCisgICAgICogU2luY2UgdGhlcmUgaXMgbm8gQVBJIHRvIGFjY2VzcyBFeGlmTWVtIGluIEV4aWZEYXRhLT5wcml2LCB3ZSB1c2UgZnJlZQorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24gaW4gbGliZXhpZi4gU2VlCisgICAgICogZXhpZl9kYXRhX3NhdmVfZGF0YSgpIGZvciBkZXRhaWwuCisgICAgICovCisgICAgZnJlZShhcHAxX2J1ZmZlcl8pOworICAgIGFwcDFfYnVmZmVyXyA9IG51bGxwdHI7CisgICAgYXBwMV9sZW5ndGhfID0gMDsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGcm9tTWV0YWRhdGEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsIGNvbnN0IHNpemVfdCBpbWFnZUhlaWdodCkgeworICAgIGlmICghc2V0SW1hZ2VXaWR0aChpbWFnZVdpZHRoKSB8fAorICAgICAgICAgICAgIXNldEltYWdlSGVpZ2h0KGltYWdlSGVpZ2h0KSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgaW1hZ2UgcmVzb2x1dGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBzdHJ1Y3QgdG0gdGltZV9pbmZvOworICAgIGJvb2wgdGltZV9hdmFpbGFibGUgPSBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHApICE9IC0xOworICAgIGxvY2FsdGltZV9yKCZ0cC50dl9zZWMsICZ0aW1lX2luZm8pOworICAgIGlmICghc2V0RGF0ZVRpbWUodGltZV9pbmZvKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZGF0YSB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmxvYXQgZm9jYWxfbGVuZ3RoOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0ZPQ0FMX0xFTkdUSCk7CisgICAgaWYgKGVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvY2FsX2xlbmd0aCA9IGVudHJ5LmRhdGEuZlswXTsKKworICAgICAgICBpZiAoIXNldEZvY2FsTGVuZ3RoKGZvY2FsX2xlbmd0aCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmb2NhbCBsZW5ndGggZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc29yU2l6ZUVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFKTsKKyAgICAgICAgaWYgKHNlbnNvclNpemVFbnRyeS5jb3VudCA9PSAyKSB7CisgICAgICAgICAgICBpZiAoIXNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbSgKKyAgICAgICAgICAgICAgICAgICAgZm9jYWxfbGVuZ3RoLCBzZW5zb3JTaXplRW50cnkuZGF0YS5mWzBdLCBzZW5zb3JTaXplRW50cnkuZGF0YS5mWzFdKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmb2NhbCBsZW5ndGggaW4gMzVtbSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6IENhbm5vdCBmaW5kIGZvY2FsIGxlbmd0aCBpbiBtZXRhZGF0YS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pICYmCisgICAgICAgICAgICBzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYWN0aXZlQXJyYXlFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpOworCisgICAgICAgIGlmICghc2V0RGlnaXRhbFpvb21SYXRpbyhlbnRyeS5kYXRhLmkzMlsyXSwgZW50cnkuZGF0YS5pMzJbM10sCisgICAgICAgICAgICAgICAgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlsyXSwgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlszXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBkaWdpdGFsIHpvb20gcmF0aW8gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50IDwgMykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBHcHMgY29vcmRpbmF0ZXMgaW4gbWV0YWRhdGEgaXMgbm90IGNvbXBsZXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNMYXRpdHVkZShlbnRyeS5kYXRhLmRbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGxhdGl0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzTG9uZ2l0dWRlKGVudHJ5LmRhdGEuZFsxXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgbG9uZ2l0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzQWx0aXR1ZGUoZW50cnkuZGF0YS5kWzJdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBhbHRpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpOworICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2Rfc3RyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGVudHJ5LmRhdGEudTgpKTsKKyAgICAgICAgaWYgKCFzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKG1ldGhvZF9zdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIHByb2Nlc3NpbmcgbWV0aG9kIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRpbWVfYXZhaWxhYmxlICYmIG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfVElNRVNUQU1QKTsKKyAgICAgICAgdGltZV90IHRpbWVzdGFtcCA9IHN0YXRpY19jYXN0PHRpbWVfdD4oZW50cnkuZGF0YS5pNjRbMF0pOworICAgICAgICBpZiAoZ210aW1lX3IoJnRpbWVzdGFtcCwgJnRpbWVfaW5mbykpIHsKKyAgICAgICAgICAgIGlmICghc2V0R3BzVGltZXN0YW1wKHRpbWVfaW5mbykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIHRpbWVzdGFtcCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWUgdHJhbmZvcm1hdGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfQ09NUEVOU0FUSU9OX1NURVApICYmCisgICAgICAgICAgICBtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTikpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04pOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RlcEVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9TVEVQKTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZUJpYXMoZW50cnkuZGF0YS5pMzJbMF0sIHN0ZXBFbnRyeS5kYXRhLnJbMF0ubnVtZXJhdG9yLAorICAgICAgICAgICAgICAgIHN0ZXBFbnRyeS5kYXRhLnJbMF0uZGVub21pbmF0b3IpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgYmlhcyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICAgICAgaWYgKCFzZXRPcmllbnRhdGlvbihlbnRyeS5kYXRhLmkzMlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBvcmllbnRhdGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpOworICAgICAgICBmbG9hdCBleHBvc3VyZV90aW1lID0gMS4wZiAqIGVudHJ5LmRhdGEuaTY0WzBdIC8gMWU5OworICAgICAgICBpZiAoIXNldEV4cG9zdXJlVGltZShleHBvc3VyZV90aW1lKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldFNodXR0ZXJTcGVlZChleHBvc3VyZV90aW1lKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHNodXR0ZXIgc3BlZWQgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSk7CisgICAgICAgIGlmICghc2V0U3ViamVjdERpc3RhbmNlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzdWJqZWN0IGRpc3RhbmNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZKTsKKyAgICAgICAgaW50MzJfdCBpc28gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHBvc3RSYXdTZW5zRW50cnkgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKTsKKyAgICAgICAgaWYgKHBvc3RSYXdTZW5zRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBpc28gPSBpc28gKiBwb3N0UmF3U2Vuc0VudHJ5LmRhdGEuaTMyWzBdIC8gMTAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXRJc29TcGVlZFJhdGluZyhzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNvKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBpc28gcmF0aW5nIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0xFTlNfQVBFUlRVUkUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfQVBFUlRVUkUpOworICAgICAgICBpZiAoIXNldEZOdW1iZXIoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIEYgbnVtYmVyIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0QXBlcnR1cmUoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGFwZXJ0dXJlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtTUkdCQ29sb3JTcGFjZSA9IDE7CisgICAgaWYgKCFzZXRDb2xvclNwYWNlKGtTUkdCQ29sb3JTcGFjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGNvbG9yIHNwYWNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMpKSB7CisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMpOworICAgICAgICBpZiAoIXNldE1heEFwZXJ0dXJlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBtYXggYXBlcnR1cmUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBmbGFzaFN0YXRlRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfRkxBU0hfU1RBVEUpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYWVNb2RlRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKTsKKyAgICAgICAgdWludDhfdCBmbGFzaFN0YXRlID0gZmxhc2hTdGF0ZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgZmxhc2hTdGF0ZUVudHJ5LmRhdGEudThbMF0gOiBBTkRST0lEX0ZMQVNIX1NUQVRFX1VOQVZBSUxBQkxFOworICAgICAgICB1aW50OF90IGFlTW9kZSA9IGFlTW9kZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgYWVNb2RlRW50cnkuZGF0YS51OFswXSA6IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjsKKworICAgICAgICBpZiAoIXNldEZsYXNoKGVudHJ5LmRhdGEudThbMF0sIGZsYXNoU3RhdGUsIGFlTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmbGFzaCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFKTsKKyAgICAgICAgaWYgKCFzZXRXaGl0ZUJhbGFuY2UoZW50cnkuZGF0YS51OFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyB3aGl0ZSBiYWxhbmNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfTU9ERSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZU1vZGUoZW50cnkuZGF0YS51OFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSBtb2RlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aW1lX2F2YWlsYWJsZSkgeworICAgICAgICBjaGFyIHN0cls0XTsKKyAgICAgICAgaWYgKHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlMDNsZCIsIHRwLnR2X25zZWMgLyAxMDAwMDAwKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3Vic2VjIGlzIGludmFsaWQ6ICVsZCIsIF9fRlVOQ1RJT05fXywgdHAudHZfbnNlYyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRTdWJzZWNUaW1lKHN0ZDo6c3RyaW5nKHN0cikpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc3Vic2VjIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQwMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICisKKyNpbmNsdWRlICJDYW1lcmFNZXRhZGF0YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKKy8qCisgKiBPcmllbnRhdGlvbiB2YWx1ZToKKyAqICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgICAgICA2ICAgICAgICAgIDcgICAgICAgICAgOAorICoKKyAqICA4ODg4ODggODg4ODg4ICAgICA4OCA4OCAgICAgODg4ODg4ODg4OCA4OCAgICAgICAgICAgICAgICAgODggODg4ODg4ODg4OAorICogIDg4ICAgICAgICAgODggICAgIDg4IDg4ICAgICA4OCAgODggICAgIDg4ICA4OCAgICAgICAgIDg4ICA4OCAgICAgODggIDg4CisgKiAgODg4OCAgICAgODg4OCAgIDg4ODggODg4OCAgIDg4ICAgICAgICAgODg4ODg4ODg4OCA4ODg4ODg4ODg4ICAgICAgICAgODgKKyAqICA4OCAgICAgICAgIDg4ICAgICA4OCA4OAorICogIDg4ICAgICAgICAgODggODg4ODg4IDg4ODg4OAorICovCitlbnVtIEV4aWZPcmllbnRhdGlvbiA6IHVpbnQxNl90IHsKKyAgICBPUklFTlRBVElPTl9VTkRFRklORUQgICA9IDB4MCwKKyAgICBPUklFTlRBVElPTl8wX0RFR1JFRVMgICA9IDB4MSwKKyAgICBPUklFTlRBVElPTl85MF9ERUdSRUVTICA9IDB4NiwKKyAgICBPUklFTlRBVElPTl8xODBfREVHUkVFUyA9IDB4MywKKyAgICBPUklFTlRBVElPTl8yNzBfREVHUkVFUyA9IDB4OCwKK307CisKKy8vIFRoaXMgaXMgYmFzZWQgb24gdGhlIGNhbWVyYSBISURMIHNoaW0gaW1wbGVtZW50YXRpb24sIHdoaWNoIHdhcyBpbiB0dXJuZWQKKy8vIGJhc2VkIG9uIG9yaWdpbmFsIENocm9tZU9TIEFSQyBpbXBsZW1lbnRhdGlvbiBvZiBhIFY0TDIgSEFMCisKKy8vIEV4aWZVdGlscyBjYW4gb3ZlcnJpZGUgQVBQMSBzZWdtZW50IHdpdGggdGFncyB3aGljaCBjYWxsZXIgc2V0LiBFeGlmVXRpbHMgY2FuCisvLyBhbHNvIGFkZCBhIHRodW1ibmFpbCBpbiB0aGUgQVBQMSBzZWdtZW50IGlmIHRodW1ibmFpbCBzaXplIGlzIHNwZWNpZmllZC4KKy8vIEV4aWZVdGlscyBjYW4gYmUgcmV1c2VkIHdpdGggZGlmZmVyZW50IGltYWdlcyBieSBjYWxsaW5nIGluaXRpYWxpemUoKS4KKy8vCisvLyBFeGFtcGxlIG9mIHVzaW5nIHRoaXMgY2xhc3MgOgorLy8gIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Q3JlYXRlKCkpOworLy8gIHV0aWxzLT5pbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKTsKKy8vICAuLi4KKy8vICAvLyBDYWxsIEV4aWZVdGlscyBmdW5jdGlvbnMgdG8gc2V0IEV4aWYgdGFncy4KKy8vICAuLi4KKy8vICB1dGlscy0+R2VuZXJhdGVBcHAxKCk7CisvLyAgdW5zaWduZWQgaW50IGFwcDFMZW5ndGggPSB1dGlscy0+R2V0QXBwMUxlbmd0aCgpOworLy8gIHVpbnQ4X3QqIGFwcDFCdWZmZXIgPSBuZXcgdWludDhfdFthcHAxTGVuZ3RoXTsKKy8vICBtZW1jcHkoYXBwMUJ1ZmZlciwgdXRpbHMtPkdldEFwcDFCdWZmZXIoKSwgYXBwMUxlbmd0aCk7CitjbGFzcyBFeGlmVXRpbHMgeworCitwdWJsaWM6CisgICAgdmlydHVhbCB+RXhpZlV0aWxzKCk7CisKKyAgICBzdGF0aWMgRXhpZlV0aWxzKiBjcmVhdGUoKTsKKworICAgIC8vIEluaXRpYWxpemUoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUgc2V0dGluZyBvZiBFeGlmIHRhZ3Mgd2lsbCBiZQorICAgIC8vIGNsZWFyZWQuCisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZUVtcHR5KCkgPSAwOworCisgICAgLy8gU2V0IGFsbCBrbm93biBmaWVsZHMgZnJvbSBhIG1ldGFkYXRhIHN0cnVjdHVyZQorICAgIHZpcnR1YWwgYm9vbCBzZXRGcm9tTWV0YWRhdGEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VXaWR0aCwgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsZW4gYXBlcnR1cmUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpID0gMDsKKworICAgIC8vIHNldHMgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgaW1hZ2UgbGFzdCBtb2RpZmllZC4gSXQgdGFrZXMgbG9jYWwgdGltZS4gVGhlCisgICAgLy8gbmFtZSBvZiB0aGUgdGFnIGlzIERhdGVUaW1lIGluIElGRDAuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkaWdpdGFsIHpvb20gcmF0aW8uIElmIHRoZSBudW1lcmF0b3IgaXMgMCwgaXQgbWVhbnMgZGlnaXRhbCB6b29tCisgICAgLy8gd2FzIG5vdCB1c2VkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERpZ2l0YWxab29tUmF0aW8odWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBzZW5zb3Jfd2lkdGgsIHVpbnQzMl90IHNlbnNvcl9oZWlnaHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIGJpYXMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcikgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVNb2RlKHVpbnQ4X3QgZXhwb3N1cmVfbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgdGltZSwgZ2l2ZW4gaW4gc2Vjb25kcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc3RhdHVzIG9mIGZsYXNoLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZsYXNoKHVpbnQ4X3QgZmxhc2hfYXZhaWxhYmxlLCB1aW50OF90IGZsYXNoX3N0YXRlLCB1aW50OF90IGFlX21vZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIEYgbnVtYmVyLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZOdW1iZXIoZmxvYXQgZl9udW1iZXIpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGgoZmxvYXQgZm9jYWxfbGVuZ3RoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyBmb3IgMzVtbSBmaWxtIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKGZsb2F0IGZvY2FsX2xlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGFsdGl0dWRlIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNBbHRpdHVkZShkb3VibGUgYWx0aXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxhdGl0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbG9uZ2l0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xvbmdpdHVkZShkb3VibGUgbG9uZ2l0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIEdQUyBwcm9jZXNzaW5nIG1ldGhvZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QpID0gMDsKKworICAgIC8vIFNldHMgR1BTIGRhdGUgc3RhbXAgYW5kIHRpbWUgc3RhbXAgKGF0b21pYyBjbG9jaykuIEl0IHRha2VzIFVUQyB0aW1lLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGhlaWdodCAobnVtYmVyIG9mIHJvd3MpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSB3aWR0aCAobnVtYmVyIG9mIGNvbHVtbnMpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VXaWR0aCh1aW50MzJfdCB3aWR0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgSVNPIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzbWFsbGVzdCBGIG51bWJlciBvZiB0aGUgbGVucy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgPSAwOworCisgICAgLy8gU2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvbih1aW50MTZfdCBkZWdyZWVzKSA9IDA7CisKKyAgICAvLyBTZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHNodXR0ZXIgc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBzdWJqZWN0LCBnaXZlbiBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3ViamVjdERpc3RhbmNlKGZsb2F0IGRpb3B0ZXJzKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBmb3IgdGhlIDxEYXRlVGltZT4gdGFnLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JsYW5hY2UpID0gMDsKKworICAgIC8vIEdlbmVyYXRlcyBBUFAxIHNlZ21lbnQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBnZW5lcmF0aW5nIEFQUDEgc2VnbWVudCBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgZ2VuZXJhdGVBcHAxKCkgPSAwOworCisgICAgLy8gR2V0cyBidWZmZXIgb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGdldEFwcDFCdWZmZXIoKSA9IDA7CisKKyAgICAvLyBHZXRzIGxlbmd0aCBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldEFwcDFMZW5ndGgoKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKaW5kZXggYzBhMzUzZi4uZjRjNDllYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKIAogICAgIC8vIEV4cGFuZCBzaG9ydGhhbmRzCi0gICAgaWYgKHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKSAhPSAtMSkgeworICAgIHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKTsKKyAgICBpZiAoaWR4ICE9IC0xKSB7CiAgICAgICAgIHNzaXplX3QgZW5kID0gdGFnTmFtZXMuZmluZCgiLCIsIGlkeCk7CiAgICAgICAgIGNoYXIqIHN0YXJ0ID0gdGFnTmFtZXMubG9ja0J1ZmZlcih0YWdOYW1lcy5zaXplKCkpOwogICAgICAgICBzdGFydFtpZHhdID0gJ1wwJzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDRiMDUzOTUuLjRmM2FjMWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTUwLDcgKzUxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC04MCwxMSArODAsMTggQEAKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07CiAKIC8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50Ci0vLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGFnZTogPD0gMjggaG91cnMgKDEgMS82IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKIC8vICgwIGZvciBlaXRoZXIgb2YgdGhlc2UgZGlzYWJsZXMgdGhhdCB0aHJlc2hvbGQpCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMzYgKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisvLworc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAyOCAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CitzdGF0aWMgY29uc3RleHByIGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisKKy8vIG1heCB3ZSBleHBpcmUgaW4gYSBzaW5nbGUgY2FsbCwgdG8gY29uc3RyYWluIGhvdyBsb25nIHdlIGhvbGQgdGhlCisvLyBtdXRleCwgd2hpY2ggYWxzbyBjb25zdHJhaW5zIGhvdyBsb25nIGEgY2xpZW50IG1pZ2h0IHdhaXQuCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4RXhwaXJlZEF0T25jZSA9IDUwOworCisvLyBUT0RPOiBuZWVkIHRvIGxvb2sgYXQgdHVuaW5nIGtNYXhSZWNvcmRzIGFuZCBmcmllbmRzIGZvciBsb3ctbWVtb3J5IGRldmljZXMKIAogc3RhdGljIGNvbnN0IGNoYXIgKmtTZXJ2aWNlTmFtZSA9ICJtZWRpYS5tZXRyaWNzIjsKIApAQCAtOTYsNiArMTAzLDcgQEAKIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkKICAgICAgICAgOiBtTWF4UmVjb3JkcyhrTWF4UmVjb3JkcyksCiAgICAgICAgICAgbU1heFJlY29yZEFnZU5zKGtNYXhSZWNvcmRBZ2VOcyksCisgICAgICAgICAgbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKGtNYXhFeHBpcmVkQXRPbmNlKSwKICAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpLAogICAgICAgICAgIG1EdW1wUHJvdG9EZWZhdWx0KE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpIHsKIApAQCAtNDMyLDIzICs0NDAsMjkgQEAKIC8vCiAvLyBPdXIgQ2hlYXAgaW4tY29yZSwgbm9uLXBlcnNpc3RlbnQgcmVjb3JkcyBtYW5hZ2VtZW50LgogCi0vLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKKworLy8gd2UgaG9sZCBtTG9jayB3aGVuIHdlIGdldCBoZXJlCisvLyBpZiBpdGVtICE9IE5VTEwsIGl0J3MgdGhlIGl0ZW0gd2UganVzdCBpbnNlcnRlZAorLy8gdHJ1ZSA9PSBtb3JlIGl0ZW1zIGVsaWdpYmxlIHRvIGJlIHJlY292ZXJlZAorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmV4cGlyYXRpb25zX2woTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQogewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKLQotICAgIC8vIHdlIHdhbnQgdG8gZHVtcCAnaW4gRklGTyBvcmRlcicsIHNvIGluc2VydCBhdCB0aGUgZW5kCi0gICAgbUl0ZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICBib29sIG1vcmUgPSBmYWxzZTsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CiAKICAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQorICAgIC8vIHNpbmNlIHdlIGludm9rZSB0aGlzIHdpdGggZWFjaCBpbnNlcnRpb24sIGl0IHNob3VsZCBiZSAwLzEgaXRlcmF0aW9ucy4KICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZHMpIHsKICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBpZiAob2l0ZW0gPT0gaXRlbSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZWQgPj0gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5saWtlbHkgaW4gdGhpcyBsb29wCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CkBAIC00NTYsOCArNDcwLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCi0gICAgLy8gTkI6IGV4cGlyZWQgZW50cmllcyBhcmVuJ3QgcmVtb3ZlZCB1bnRpbCB0aGUgbmV4dCBpbnNlcnRpb24sIHdoaWNoIGNvdWxkIGJlIGEgd2hpbGUKKyAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGFnZSkKKyAgICAvLyBsaW1pdGVkIHRvIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSBpdGVtcyBwZXIgaW52b2NhdGlvbi4KICAgICBpZiAobU1heFJlY29yZEFnZU5zID4gMCkgewogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOwogICAgICAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IDApIHsKQEAgLTQ3MSwxOCArNDg1LDcyIEBACiAgICAgICAgICAgICAgICAgLy8gdGhpcyAoYW5kIHRoZSByZXN0KSBhcmUgcmVjZW50IGVub3VnaCB0byBrZWVwCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcHJlc2VudHMgIm9uZSB0b28gbWFueSI7IHRlbGwgY2FsbGVyIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgIC8vIG1vcmUgdG8gYmUgcmVjbGFpbWVkLgorICAgICAgICAgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCsrOwogICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKys7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyB3ZSBvbmx5IGluZGljYXRlIHdoZXRoZXIgdGhlcmUncyBtb3JlIHRvIGNsZWFuOworICAgIC8vIGNhbGxlciBjaG9vc2VzIHdoZXRoZXIgdG8gc2NoZWR1bGUgZnVydGhlciBjbGVhbnVwLgorICAgIHJldHVybiBtb3JlOworfQorCisvLyBwcm9jZXNzIGV4cGlyYXRpb25zIGluIGJpdGUgc2l6ZWQgY2h1bmtzLCBhbGxvd2luZyBuZXcgaW5zZXJ0aW9ucyB0aHJvdWdoCisvLyBydW5zIGluIGEgcHRocmVhZCBzcGVjaWZpY2FsbHkgc3RhcnRlZCBmb3IgdGhpcyAod2hpY2ggdGhlbiBleGl0cykKK2Jvb2wgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpwcm9jZXNzRXhwaXJhdGlvbnMoKQoreworICAgIGJvb2wgbW9yZTsKKyAgICBkbyB7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgbW9yZSA9IGV4cGlyYXRpb25zX2woTlVMTCk7CisgICAgICAgICAgICBpZiAoIW1vcmUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG1vcmUpOworICAgIHJldHVybiB0cnVlOyAgICAgICAgLy8gdmFsdWUgaXMgZm9yIHN0ZDo6ZnV0dXJlIHRocmVhZCBzeW5jaHJvbml6YXRpb24KK30KKworLy8gaW5zZXJ0IGFwcHJvcHJpYXRlbHkgaW50byBxdWV1ZQordm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCit7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cworCisgICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKKyAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworCisgICAgLy8gY2xlYW4gb2xkIHN0dWZmIGZyb20gdGhlIHF1ZXVlCisgICAgYm9vbCBtb3JlID0gZXhwaXJhdGlvbnNfbChpdGVtKTsKKworICAgIC8vIGNvbnNpZGVyIHNjaGVkdWxpbmcgc29tZSBhc3luY2hyb25vdXMgY2xlYW5pbmcsIGlmIG5vdCBydW5uaW5nCisgICAgaWYgKG1vcmUpIHsKKyAgICAgICAgaWYgKCFtRXhwaXJlRnV0dXJlLnZhbGlkKCkKKyAgICAgICAgICAgIHx8IG1FeHBpcmVGdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKKworICAgICAgICAgICAgbUV4cGlyZUZ1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbdGhpc10oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiB0aGlzLT5wcm9jZXNzRXhwaXJhdGlvbnMoKTt9KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGFsbG93ZWRLZXlzW10gPQogewogICAgICJhdWRpb3BvbGljeSIsCiAgICAgImF1ZGlvcmVjb3JkIiwKKyAgICAiYXVkaW90aHJlYWQiLAogICAgICJhdWRpb3RyYWNrIiwKICAgICAiY29kZWMiLAogICAgICJleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaAppbmRleCBiM2M5MDJhLi42MzJjNjkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxmdXR1cmU+CisKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ0LDYgKzQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCk7CiAKKyAgICBib29sIHByb2Nlc3NFeHBpcmF0aW9ucygpOworCiAgcHJpdmF0ZToKICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IGdlbmVyYXRlVW5pcXVlU2Vzc2lvbklEKCk7CiAKQEAgLTY1LDYgKzY5LDggQEAKICAgICBpbnQzMl90IG1NYXhSZWNvcmRzOwogICAgIC8vIGJ5IHRpbWUgKG5vbmUgb2xkZXIgdGhhbiB0aGlzIGxvbmcgYWdhbgogICAgIG5zZWNzX3QgbU1heFJlY29yZEFnZU5zOworICAgIC8vIG1heCB0byBleHBpcmUgcGVyIGV4cGlyYXRpb25zX2woKSBpbnZvY2F0aW9uCisgICAgaW50MzJfdCBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2U7CiAgICAgLy8KICAgICAvLyAjIG9mIHNldHMgb2Ygc3VtbWFyaWVzCiAgICAgaW50MzJfdCBtTWF4UmVjb3JkU2V0czsKQEAgLTc5LDYgKzg1LDkgQEAKICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiBtSXRlbXM7CiAgICAgdm9pZCBzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKik7CiAKKyAgICBib29sIGV4cGlyYXRpb25zX2woTWVkaWFBbmFseXRpY3NJdGVtICopOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IG1FeHBpcmVGdXR1cmU7CisKICAgICAvLyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIG91dHB1dAogICAgIGludCBtRHVtcFByb3RvOwogICAgIGludCBtRHVtcFByb3RvRGVmYXVsdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawppbmRleCBkYjVmMGZmLi5mNzhjNjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCkBAIC02Myw2ICs2Myw3MCBAQAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBzZXJ2aWNlIGV4ZWN1dGFibGUKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorIyBzZWNjb21wIGlzIG5vdCByZXF1aXJlZCBmb3IgY292ZXJhZ2UgYnVpbGQuCitpZm5lcSAoJChOQVRJVkVfQ09WRVJBR0UpLHRydWUpCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYXN3Y29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybTY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhc3djb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhc3djb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2XzY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhc3djb2RlYy5wb2xpY3kKK2VuZGlmCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgbWFpbl9zd2NvZGVjc2VydmljZS5jcHAgXAorICAgIE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcCBcCisKK3Nhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKEFERFJFU1NfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFVCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFRTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoMk5EX0FERFJFU1NfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKDJORF9VQlNBTl9SVU5USU1FX0xJQlJBUlkpIFwKKyAgJCgyTkRfVFNBTl9SVU5USU1FX0xJQlJBUlkpKSkKKworIyAkKGluZm8gU2FuaXRpemVyOiAgJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpKQorCitsbG5ka19saWJyYXJpZXMgOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChhZGRzdWZmaXggLnNvLFwKKyAgJChMTE5ES19MSUJSQVJJRVMpKSkKKworIyAkKGluZm8gTExOREs6ICAkKGxsbmRrX2xpYnJhcmllcykpCisKK0xPQ0FMX0NGTEFHUyA6PSAtRExJTktFRF9MSUJSQVJJRVM9JyIkKHNhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyk6JChsbG5ka19saWJyYXJpZXMpIicKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXZzZXJ2aWNlc19taW5pamFpbCBcCisgICAgbGliYmFzZSBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmhpZGx0cmFuc3BvcnQgXAorICAgIGxpYmh3YmluZGVyIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliemlwYXJjaGl2ZSBcCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYm5hdGl2ZWxvYWRlci1kdW1teS1oZWFkZXJzIFwKKworTE9DQUxfTU9EVUxFIDo9IG1lZGlhc3djb2RlYworTE9DQUxfSU5JVF9SQyA6PSBtZWRpYXN3Y29kZWMucmMKK0xPQ0FMX1NBTklUSVpFIDo9IHNjdWRvCitpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4Nl82NCBhcm02NCkpCisgIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKKyAgTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKKyAgTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpCitlbmRpZgorCitzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMgOj0KK2xsbmRrX2xpYnJhcmllcyA6PQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwogIyBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CiBpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtODMsNCArMTQ3LDE2IEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiBlbmRpZgogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHN3IHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbWVkaWFzd2NvZGVjLnBvbGljeQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtJChUQVJHRVRfQVJDSCkucG9saWN5CitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZgorCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNjYmNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjVXBkYXRlU2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvZGxleHQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKyNpbmNsdWRlIDxuYXRpdmVsb2FkZXIvZGxleHRfbmFtZXNwYWNlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBsb2FkRnJvbUFwZXgoY29uc3QgY2hhciAqbGliRGlyUGF0aCkgeworICAgIEFMT0dWKCJsb2FkRnJvbUFwZXg6IHBhdGg9JXMiLCBsaWJEaXJQYXRoKTsKKworICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiL2xpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iOworCisgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCAqY29kZWNOcyA9IGFuZHJvaWRfY3JlYXRlX25hbWVzcGFjZSgiY29kZWNzIiwKKyAgICAgICAgICAgIG51bGxwdHIsICAvLyBsZF9saWJyYXJ5X3BhdGgKKyAgICAgICAgICAgIGxpYkRpclBhdGgsCisgICAgICAgICAgICBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVELAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBlcm1pdHRlZF93aGVuX2lzb2xhdGVkX3BhdGgKKyAgICAgICAgICAgIG51bGxwdHIpOyAvLyBwYXJlbnQKKworICAgIGlmIChjb2RlY05zID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgY29kZWMgbmFtZXNwYWNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmc4IGxpbmtlZF9saWJyYXJpZXMoTElOS0VEX0xJQlJBUklFUyk7CisgICAgaWYgKCFhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcyhjb2RlY05zLCBudWxscHRyLCBsaW5rZWRfbGlicmFyaWVzLmNfc3RyKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbGluayBuYW1lc3BhY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvIGRsZXh0aW5mbyA9IHsKKyAgICAgICAgICAgIC5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRSwKKyAgICAgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IGNvZGVjTnMsCisgICAgfTsKKworICAgIHZvaWQgKnJlZ2lzdHJhbnRMaWIgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICBsaWJQYXRoLnN0cmluZygpLAorICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCAmZGxleHRpbmZvKTsKKworICAgIGlmIChyZWdpc3RyYW50TGliID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb2FkIGxpYiBmcm9tIGFyY2hpdmU6ICVzIiwgZGxlcnJvcigpKTsKKyAgICB9CisKKyAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmM+KAorICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKKworICAgIGlmIChyZWdpc3RlckNvZGVjU2VydmljZXMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIGNvZGVjIHNlcnZpY2VzIC0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDZkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX0NPREVDX1VQREFURV9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9DT0RFQ19VUERBVEVfU0VSVklDRV9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBsb2FkRnJvbUFwZXgoY29uc3QgY2hhciAqbGliRGlyUGF0aCk7CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfQ09ERUNfVVBEQVRFX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCA1MTYxOWY2Li42ZDQ3YmU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtNDgsMzcgKzQ4LDIxIEBACiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDY0LCBmYWxzZSk7CiAKLSAgICAvLyBSZWdpc3RyYXRpb24gb2YgY3VzdG9taXplZCBjb2RlYyBzZXJ2aWNlcwotICAgIHZvaWQgKnJlZ2lzdHJhbnRMaWIgPSBkbG9wZW4oCi0gICAgICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyIsCi0gICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgIGlmIChyZWdpc3RyYW50TGliKSB7Ci0gICAgICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmM+KAotICAgICAgICAgICAgICAgIGRsc3ltKHJlZ2lzdHJhbnRMaWIsICJSZWdpc3RlckNvZGVjU2VydmljZXMiKSk7Ci0gICAgICAgIGlmIChyZWdpc3RlckNvZGVjU2VydmljZXMpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgYWRkaXRpb25hbCBzZXJ2aWNlcyAiCi0gICAgICAgICAgICAgICAgICAgICItLSBjb3JydXB0ZWQgbGlicmFyeS4iOwotICAgICAgICB9CisgICAgLy8gRGVmYXVsdCBjb2RlYyBzZXJ2aWNlcworICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9CisgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKKyAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCi0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOwotICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9Ci0gICAgICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7Ci0gICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKLSAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwogICAgIH0KIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCisjaW5jbHVkZSAibWluaWphaWwuaCIKKworI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgY29uc3QgY2hhciBrU3lzdGVtU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMucG9saWN5IjsKK3N0YXRpYyBjb25zdCBjaGFyIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy5wb2xpY3kiOworCisvLyBEaXNhYmxlIFNjdWRvJ3MgbWlzbWF0Y2ggYWxsb2NhdGlvbiBjaGVjaywgYXMgaXQgaXMgYmVpbmcgdHJpZ2dlcmVkCisvLyBieSBzb21lIHRoaXJkIHBhcnR5IGNvZGUuCitleHRlcm4gIkMiIGNvbnN0IGNoYXIgKl9fc2N1ZG9fZGVmYXVsdF9vcHRpb25zKCkgeworICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogLyphcmd2Ki8pCit7CisgICAgTE9HKElORk8pIDw8ICJtZWRpYSBzd2NvZGVjIHNlcnZpY2Ugc3RhcnRpbmciOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKKworI2lmZGVmIF9fTFA2NF9fCisgICAgbG9hZEZyb21BcGV4KCIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2xpYjY0Iik7CisjZWxzZQorICAgIGxvYWRGcm9tQXBleCgiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9saWIiKTsKKyNlbmRpZgorCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0OTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBtZWRpYS5zd2NvZGVjIC9zeXN0ZW0vYmluL21lZGlhc3djb2RlYworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCisgICAgdXBkYXRhYmxlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzBkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIC8vIENvZGVjcworICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdjFkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF94YWFjZGVjIiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLi4uIjsKKyAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgICAgbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKElORk8pIDw8CisgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBDb2RlYzIgc2VydmljZSBjcmVhdGVkLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKaW5kZXggYjRmNWVlOS4uODQ1Zjg0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKQEAgLTE4LDE0ICsxOCwyMCBAQAogb3BlbmF0OiAxCiBvcGVuOiAxCiBnZXR1aWQzMjogMQorZ2V0dWlkOiAxCitnZXRybGltaXQ6IDEKIHdyaXRldjogMQogaW9jdGw6IDEKIGNsb3NlOiAxCiBtbWFwMjogMQorbW1hcDogMQogZnN0YXQ2NDogMQorZnN0YXQ6IDEKIHN0YXQ2NDogMQorc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKIGZzdGF0YXQ2NDogMQorbmV3ZnN0YXRhdDogMQogZnV0ZXg6IDEKIG11bm1hcDogMQogZmFjY2Vzc2F0OiAxCkBAIC00Miw2ICs0OCw3IEBACiByZWFkbGlua2F0OiAxCiBfbGxzZWVrOiAxCiBmc3RhdGZzNjQ6IDEKK2ZzdGF0ZnM6IDEKIHByZWFkNjQ6IDEKIG1yZW1hcDogMQogZHVwOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNlZGJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQpAQCAtMCwwICsxLDYzIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDI6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCittZW1mZF9jcmVhdGU6IDEKK2Z0cnVuY2F0ZTogMQorZnRydW5jYXRlNjQ6IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorcHJjdGw6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorZXhpdDogMQorbHNlZWs6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitvcGVuYXQ6IDEKK2ZzdGF0NjQ6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NldHByaW9yaXR5OiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3JlYWQ6IDEKK3ByZWFkNjQ6IDEKK2ZzdGF0ZnM2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWNhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnV0ZXg6IDEKKyMgaW9jdGwgY2FsbHMgYXJlIGZpbHRlcmVkIHZpYSB0aGUgc2VsaW51eCBwb2xpY3kuCitpb2N0bDogMQorc2NoZWRfeWllbGQ6IDEKK2Nsb3NlOiAxCitkdXA6IDEKK3Bwb2xsOiAxCittcHJvdGVjdDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21tYXA6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQorZnN0YXQ6IDEKK25ld2ZzdGF0YXQ6IDEKK2ZzdGF0ZnM6IDEKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCitwcmN0bDogMQord3JpdGV2OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK2V4aXQ6IDEKK2xzZWVrOiAxCitydF9zaWdwcm9jbWFzazogMQorb3BlbmF0OiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCitzZXRwcmlvcml0eTogMQorc2V0X3RpZF9hZGRyZXNzOiAxCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCityZWFkOiAxCitwcmVhZDY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQorbWFkdmlzZTogMQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCBlODcwOTY1Li4yMjdhMjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKICAgICBsaWJoaWRsbWVtb3J5IFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMQorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKaW5kZXggNTM0Mjg5OC4uNzY1NDk4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCkBAIC00LDExICs0LDI4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgXAotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAgXAorICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJzdGFnZWZyaWdodCBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkc3VmZml4IC5zbyxcCisgICQoQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVUJTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVFNBTl9SVU5USU1FX0xJQlJBUlkpKSkKKworIyAkKGluZm8gU2FuaXRpemVyOiAgJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpKQorCituZGtfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkcHJlZml4IGxpYiwkKGFkZHN1ZmZpeCAuc28sXAorICAkKE5ES19QUkVCVUlMVF9TSEFSRURfTElCUkFSSUVTKSkpKQorCisjICQoaW5mbyBOREs6ICAkKG5ka19saWJyYXJpZXMpKQorCitMT0NBTF9DRkxBR1MgKz0gLURMSU5LRURfTElCUkFSSUVTPSciJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpOiQobmRrX2xpYnJhcmllcykiJworCitzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMgOj0KK25ka19saWJyYXJpZXMgOj0KKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKQEAgLTE4LDE5ICszNSw3IEBACiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2XzY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKQEAgLTQwLDYgKzQ1LDcgQEAKIExPQ0FMX0lOSVRfUkMgOj0gbWVkaWFleHRyYWN0b3IucmMKIExPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYQogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NBTklUSVpFIDo9IHNjdWRvCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogIyBzZXJ2aWNlIHNlY2NvbXAgZmlsdGVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBmMGY0NGY1Li4wNjY1OTMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KQEAgLTMwLDYgKzI5LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQorICAgICAgICA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeworICAgIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6U2V0TGlua2VkTGlicmFyaWVzKHN0ZDo6c3RyaW5nKExJTktFRF9MSUJSQVJJRVMpKTsKK30KKwogc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmcmVtb3RlU291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSk7CkBAIC01NSw2ICs1OSwxMCBAQAogICAgIHJldHVybiBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiB9CiAKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChmZCwgYXJncykgfHwgZHVtcEV4dHJhY3RvcnMoZmQsIGFyZ3MpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA5ZGYzZWNkLi5jOWNlYmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMjcsNyArMjcsNyBAQAogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yU2VydmljZT47ICAgIC8vIGZvciBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQogcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKyAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQogCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYTY5OC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UiCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotYmluZGVyOjpTdGF0dXMgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjpsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgQUxPR1YoImxvYWRQbHVnaW5zICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRQbHVnaW5zKGFwa1BhdGgpOwotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE1ZjZkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLSAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZQotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT47Ci1wdWJsaWM6Ci0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5leHRyYWN0b3IudXBkYXRlIjsgfQotICAgIGJpbmRlcjo6U3RhdHVzIGxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggOGQzMzU5YS4uM2MxNWJmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0zMSw3ICszMSw2IEBACiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKICNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCkBAIC00Miw2ICs0MSwxMiBAQAogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIAorLy8gRGlzYWJsZSBTY3VkbydzIG1pc21hdGNoIGFsbG9jYXRpb24gY2hlY2ssIGFzIGl0IGlzIGJlaW5nIHRyaWdnZXJlZAorLy8gYnkgc29tZSB0aGlyZCBwYXJ0eSBjb2RlLgorZXh0ZXJuICJDIiBjb25zdCBjaGFyICpfX3NjdWRvX2RlZmF1bHRfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKIHsKICAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCkBAIC02NiwxMSArNzEsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAKLSAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKLSAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKLSAgICAgICAgbWVkaWE6Ok1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICB9Ci0KICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzIyOTlmMy4uNjA3YTAzZQotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTIyLDYgKzIyLDggQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdDogMQorZnN0YXRmczogMQogbmV3ZnN0YXRhdDogMQogcmVzdGFydF9zeXNjYWxsOiAxCiBleGl0OiAxCkBAIC0zMSwyOCArMzMsMjEgQEAKIHNjaGVkX3NldHNjaGVkdWxlcjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQorCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotdGdraWxsOiAxCi1zb2NrZXQ6IGFyZzAgPT0gMQotY29ubmVjdDogMQotZmNudGw6IDEKLXJ0X3NpZ3Byb2NtYXNrOiAxCi1ydF9zaWdhY3Rpb246IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkOiAxCi1nZXRnaWQ6IDEKLWdldGVnaWQ6IDEKLWdldGdyb3VwczogMQotZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi0KICMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgogZ2V0dGlkOiAxCiBzY2hlZF95aWVsZDogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAppbmRleCAyOWU2ZGZjLi5iZWU1ZDI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTEwLDcgKzEwLDcgQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMWJlNTU0NC4uOTAyYWY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsMjcgKzU0LDI4IEBACiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCB8fAorICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCB8fAogICAgICAgICAgICAgc2l6ZSA8IGtNaW5TaXplIHx8IHNpemUgPiBrTWF4U2l6ZSB8fCBuYW1lID09IE5VTEwgfHwKICAgICAgICAgICAgIHNoYXJlZC0+c2l6ZSgpIDwgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSkpOwotICAgIE5CTG9nOjpOYW1lZFJlYWRlciBuYW1lZFJlYWRlcihyZWFkZXIsIG5hbWUpOworICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gUmVhZGVyIGhhbmRsZWQgYnkgbWVyZ2VyCisgICAgc3A8TkJMb2c6OkR1bXBSZWFkZXI+IGR1bXBSZWFkZXIobmV3IE5CTG9nOjpEdW1wUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBmb3IgZHVtcHN5cwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbU5hbWVkUmVhZGVycy5hZGQobmFtZWRSZWFkZXIpOwotICAgIG1NZXJnZXIuYWRkUmVhZGVyKG5hbWVkUmVhZGVyKTsKKyAgICBtRHVtcFJlYWRlcnMuYWRkKGR1bXBSZWFkZXIpOworICAgIG1NZXJnZXIuYWRkUmVhZGVyKHJlYWRlcik7CiB9CiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDApIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5hbWVkUmVhZGVycy5zaXplKCk7ICkgewotICAgICAgICBpZiAobU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKLSAgICAgICAgICAgIG1OYW1lZFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRHVtcFJlYWRlcnMuc2l6ZSgpOyApIHsKKyAgICAgICAgaWYgKG1EdW1wUmVhZGVyc1tpXS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKKyAgICAgICAgICAgIG1EdW1wUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIFRPRE8gbU1lcmdlci5yZW1vdmVSZWFkZXJzKHNoYXJlZCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQpAQCAtOTUsMTAgKzk3LDggQEAKIAogc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9BVURJT1NFUlZFUiB8fAotICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKKyAgICBpZiAoIShpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpCisgICAgICAgICAgICB8fCBkdW1wQWxsb3dlZCgpKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggYXJnMChhcmdzWzBdKTsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJnMC5zdHJpbmcoKSwgIi1yIikpIHsKLSAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1OYW1lZFJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIE1lZGlhTG9nU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCkBAIC0xMTksMjEgKzExOSwyMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczoiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBpbnN0ZWFkIHByb2NlZWQgdG8gbU1lcmdlUmVhZGVyLmR1bXA/IGRvZXMgaXQgbmVlZCBsb2NrPwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lZFJlYWRlciA6IG1OYW1lZFJlYWRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZHVtcFJlYWRlciA6IG1EdW1wUmVhZGVycykgewogICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBSZWFkZXItPmR1bXAoZmQsIDAgLyppbmRlbnQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCwgYXJncyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAppbmRleCBjOTQ1ZDFmLi4yMWRmODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTUsNyArNTYsNyBAQAogCiAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKIAotICAgIFZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgVmVjdG9yPHNwPE5CTG9nOjpEdW1wUmVhZGVyPj4gbUR1bXBSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgLy8gRklYTUUgTmVlZCBjb21tZW50cyBvbiBhbGwgb2YgdGhlc2UsIGVzcGVjaWFsbHkgYWJvdXQgbG9ja2luZwogICAgIE5CTG9nOjpTaGFyZWQgKm1NZXJnZXJTaGFyZWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCBlMGRiMjYxLi5hMWZjMGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTE0MCw5ICsxNDAsOCBAQAogfQogCiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7Ci0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewogICAgICAgICByZXR1cm4gb3BlbkV4Y2x1c2l2ZUVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIG9wZW5TaGFyZWRFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwpAQCAtMTczLDcgKzE3Miw3IEBACiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwogICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLnB1c2hfYmFjayhlbmRwb2ludE1NYXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAxOTNiZGVlLi5iYTE3ODUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtNTYsOCArNTYsNyBAQAogICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbAogICAgICAqLwogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCiAgICAgdm9pZCBjbG9zZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCmluZGV4IGIwMzE4ODguLjFjMDNiN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBwYXJ0SW5kZXgrKzsKICAgICB9Ci0gICAgZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CisgICAgZmlmby0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKIAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIEFUUkFDRV9FTkQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggMDE4MmEyNy4uMmZiYWViNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTMzLDcgKzM0LDYgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC0xMTgsMTcgKzExOCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCi0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgLy8gVHJ5IFNIQVJFRCBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQuCisgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwogICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOworICAgIH0gZWxzZSBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpIHsKKyAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0IG1vZGlmaWVkUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgRVhDTFVTSVZFIG1vZGUgd2l0aCBTSEFSRUQuCisgICAgICAgIG1vZGlmaWVkUmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3Blbihtb2RpZmllZFJlcXVlc3QpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCi0gICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIEFMT0dXKCJvcGVuU3RyZWFtKCk6IGZhaWxlZCwgcmV0dXJuICVkID0gJXMiLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtU3RyZWFtVHJhY2tlci5hZGRTdHJlYW1Gb3JIYW5kbGUoc2VydmljZVN0cmVhbS5nZXQoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCA2OTA2OGY1Li40ZGZiNjJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTM4LDEwICszOCw2IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIHsKLSAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKLX0KLQogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKIApAQCAtNTksNiArNTUsNyBAQAogICAgIHJlc3VsdCA8PCAiICAgIERldmljZSBJZDogICAgICAgICAgICAiIDw8IGdldERldmljZUlkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDaGFubmVsIENvdW50OiAgICAgICAgIiA8PCBnZXRTYW1wbGVzUGVyRnJhbWUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIEZvcm1hdDogICAgICAgICAgICAgICAiIDw8IGdldEZvcm1hdCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggYTEzNGExMy4uMzYxNmZhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgLCBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgIG1Mb2NrU3RyZWFtczsKICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtczsKIAotICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXA7CiAKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICAgbU1tYXBDbGllbnQ7ICAgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gb3BlbiBhbmQgc3RhcnRTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBjYzk0MmY0Li4zN2QxMDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtODIsOCArODIsOSBAQAogCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSAmJiAhY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzV3JpdHRlbiA9IDA7CisKICAgICAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IDVhNDI5YzkuLjZjMjgwODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC0xMDEsOCArMTAxLDYgQEAKICAgICAgICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1ksCiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKLSAgICBBTE9HRCgiJXMoJXApIE1NQVAgYXR0cmlidXRlcy51c2FnZSA9ICVkLCBjb250ZW50X3R5cGUgPSAlZCwgc291cmNlID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy5zb3VyY2UpOwogCiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwpAQCAtMTExLDExICsxMDksMTEgQEAKICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAKICAgICAvLyBGaWxsIGluIGNvbmZpZwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKLSAgICBpZiAoYWF1ZGlvRm9ybWF0ID09IEFBVURJT19VTlNQRUNJRklFRCB8fCBhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUIHx8IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0gICAgY29uZmlnLmZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIGNvbmZpZy5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKIAogICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKICAgICBpZiAoYWF1ZGlvU2FtcGxlUmF0ZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKQEAgLTE2MywxMiArMTYxLDEyIEBACiAgICAgQUxPR0QoIiVzKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBtTW1hcENsaWVudC5jbGllbnRVaWQsICBtTW1hcENsaWVudC5jbGllbnRQaWQsIG1Qb3J0SGFuZGxlKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAogICAgIGlmIChkZXZpY2VJZCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCkBAIC0yMTAsOSArMjA4LDYgQEAKICAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7CiAgICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CiAgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjMzLDcgKzIyOCw3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKLSAgICBzZXRGb3JtYXQoQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpKTsKKyAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCiAgICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KQEAgLTI1Myw2ICsyNDgsOSBAQAogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAorICAgIEFMT0dEKCIlcygpIGZvcm1hdCA9ID14JTA4eCwgZnJhbWUgc2l6ZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCksIGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKaW5kZXggZWJiYTMyZC4uMWUxYzU1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKQEAgLTQ3LDEwICs0Nyw2IEBACiAgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CkBAIC04OCw2ICs4NCwxMCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzUmVhZCA9IDA7CiAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1VuZGVyZmxvdyA9IHRydWU7CiAKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkZWFkIHN0cmVhbQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYTBhMzgzYy4uOTgxZTQzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMzksNyArMzksNiBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCBmYzlmMTU1Li4wYTQxNWZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKICAgICBzZXRTZXNzaW9uSWQobVN0cmVhbUludGVybmFsLT5nZXRTZXNzaW9uSWQoKSk7CisgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOyAvLyBmb3JjZSBmb3IgbWl4ZXIKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTgwLDggKzE4MSw4IEBACiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIHJlYWwtdGltZSBzZXJ2aWNlIHRocmVhZCwgZWcuIG1peGVyLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGQ2NzE3MTAuLmJmYzE3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC01Miw4ICs1Miw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKLQorICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLmIxNmI1ZGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCiAgICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgiQUFUaW1lIikKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljU3RyZWFtVGltZXN0YW1wKCkKICAgICAgICAgLCBtQXVkaW9TZXJ2aWNlKGF1ZGlvU2VydmljZSkgewogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IC0xOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IC0xOwpAQCAtNTEsNyArNTEsNiBAQAogfQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6fkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgewotICAgIEFMT0dEKCJ+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTgxLDggKzgwLDcgQEAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0xMDksMTAgKzEwNyw4IEBACiAgICAgICAgIC8vIHJlZmVyZW5jZWQgdW50aWwgdGhlIHNlcnZpY2UgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY2xpZW50LgogICAgICAgICAvLyBTbyBvbmx5IG9uZSB0aHJlYWQgY2FuIG9wZW4gYSBzdHJlYW0uCiAgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMoKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0xODMsOSArMTc5LDEwIEBACiAgICAgfQogCiAgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisgICAgc2V0U3VzcGVuZGVkKGZhbHNlKTsKIAogICAgIC8vIFN0YXJ0IHdpdGggZnJlc2ggcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMuCi0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuY2xlYXIoKTsKIAogICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHJlc3VsdCA9IHN0YXJ0RGV2aWNlKCk7CkBAIC0yOTQsMTYgKzI5MSwyMCBAQAogfQogCiAvLyBpbXBsZW1lbnQgUnVubmFibGUsIHBlcmlvZGljYWxseSBzZW5kIHRpbWVzdGFtcHMgdG8gY2xpZW50CitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKICAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOwogICAgIHdoaWxlKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgeworICAgICAgICBsb29wQ291bnQrKzsKICAgICAgICAgaWYgKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gbmV4dFRpbWUpIHsKICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSB0aW1lc3RhbXAgdGhyZWFkIGdvdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwpAQCAtMzEzLDcgKzMxNCw4IEBACiAgICAgICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcFVudGlsTmFub1RpbWUobmV4dFRpbWUpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpLCBsb29wQ291bnQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewpAQCAtMzQ5LDcgKzM1MSw5IEBACiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgZGllPyAlcyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgQUxPR1coIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgc3RvcD8gU3VzcGVuZGluZyBzdHJlYW0uIHdoYXQgPSAldSwgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY29tbWFuZC0+d2hhdCwgZ2V0VHlwZVRleHQoKSk7CisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggYTE4MTVkMC4uZmZjNzY4YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0yMDQsNiArMjA0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IGZhbHNlIHdoZW4gdGhlIHN0cmVhbSBzaG91bGQgbm90IGxvbmdlciBiZSBwcm9jZXNzZWQuCisgICAgICogVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgbWVzc2FnZSBxdWV1ZSBvdmVyZmxvdy4KKyAgICAgKiBTZXQgdHJ1ZSB3aGVuIHN0cmVhbSBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkgeworICAgICAgICBtU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIH0KKworICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3VzcGVuZGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMgdG8gdGhlIHN0cmVhbSBieSBBQXVkaW9TZXJ2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgpAQCAtMjg3LDcgKzMwMSw3IEBACiAgICAgLy8gVE9ETyByZW5hbWUgbUNsaWVudEhhbmRsZSB0byBtUG9ydEhhbmRsZSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcDsKIAogICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJm1BdWRpb1NlcnZpY2U7CiAKQEAgLTMwNCw3ICszMTgsMTIgQEAKICAgICAvLyBUaGlzIGlzIG1vZGlmaWVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FsbGluZ0NvdW50ID0gMDsKIAorICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBzdHJlYW0gdGhhdCBpcyBiZWluZyByZWZlcmVuY2VkIGJ5IGEgYmluZGVyIGNhbGwgbmVlZHMgdG8gY2xvc2VkLgogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1DbG9zZU5lZWRlZHtmYWxzZX07CisKKyAgICAvLyBUaGlzIGluZGljYXRlIHRoYXQgYSBydW5uaW5nIHN0cmVhbSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZCBiZWNhdXNlIG9mIGFuIGVycm9yLAorICAgIC8vIGZvciBleGFtcGxlIGEgZnVsbCBtZXNzYWdlIHF1ZXVlLiBOb3RlIHRoYXQgdGhpcyBhdG9taWMgaXMgdW5yZWxhdGVkIHRvIG1DbG9zZU5lZWRlZC4KKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtU3VzcGVuZGVke2ZhbHNlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IGM4NDUzMDkuLjgzN2IwODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTY0LDggKzY0LDEzIEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE1Nyw3ICsxNjIsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRGcmVlUnVubmluZ1Bvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoKnBvc2l0aW9uRnJhbWVzLCAqdGltZU5hbm9zKTsKLSAgICAgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgICAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CkBAIC0xNzksOCArMTg0LDggQEAKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCkgKyBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwNWM1NzM1Li4xNDc0MmRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTIwLDkgKzEyMCwxNCBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM2LDEwICsxNDEsMTAgQEAKIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwogICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7Ci0gICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRCgiJXMoKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgYXVkaW9fZm9ybWF0X3QgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTQ4LDcgKzE1Myw3IEBACiAgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlUmF0ZShlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZVJhdGUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAorICAgICAgICBBTE9HRSgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNTgsNyArMTYzLDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE4NSw4ICsxOTAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKLSAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKIAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMjMzLDE1ICsyMzgsMTUgQEAKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjptYXJrVHJhbnNmZXJUaW1lKFRpbWVzdGFtcCAmdGltZXN0YW1wKSB7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IG1peGVyIG9yIGRpc3RyaWJ1dG9yLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDU4NGIyZWYuLjNkNWYxNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtNTMsNyArNTMsNiBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjI4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJzb3VuZHRyaWdnZXIiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzY2NmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotaWZlcSAoJChTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRSksIDEpCi0gICAgaWZuZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLCB0cnVlKQotICAgICAgICAkKGVycm9yIFJlcXVpcmVzIGJ1aWxkaW5nIHdpdGggVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUw9dHJ1ZSkKLSAgICBlbmRpZgotICAgIExPQ0FMX0NGTEFHUyArPSAtRFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi1lbmRpZgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJzb3VuZHRyaWdnZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eQotCi0KLWlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLHRydWUpCi0jIGxpYmhhcmR3YXJlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsbWVtb3J5IFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgbGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAKLWVuZGlmCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2Vyc2VydmljZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggYWRmMjUyZS4uNjhkNTRjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMTY4LDE4ICsxNjgsMjMgQEAKICAgICBpbnQgcmV0OwogICAgIFNvdW5kTW9kZWxIYW5kbGUgaGFsSGFuZGxlOwogICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKICAgICBpZiAoc291bmRfbW9kZWwtPnR5cGUgPT0gU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0UpIHsKLSAgICAgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKLSAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKLSAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRQaHJhc2VTb3VuZE1vZGVsKAotICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgeworICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+bG9hZFBocmFzZVNvdW5kTW9kZWxfMl8xKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMTkzLDE4ICsxOTgsMzIgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7Ci0gICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKKyAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOwogICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5sb2FkU291bmRNb2RlbF8yXzEoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMjE3LDYgKzIzNiwxNSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yODIsMTYgKzMxMCwyMCBAQAogICAgIG1vZGVsLT5tUmVjb2duaXRpb25Db29raWUgPSBjb29raWU7CiAKICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CiAgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CiAKLSAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7Ci0gICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgIHsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24obW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5zdGFydFJlY29nbml0aW9uXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOwogICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTMwMSw2ICszMzMsMTMgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgewpAQCAtMzU2LDYgKzM5NSwzOCBAQAogICAgIHJldHVybiBoaWRsUmV0dXJuOwogfQogCitpbnQgU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXIgPSBnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNvdW5kdHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBtb2RlbCBub3QgZm91bmQgZm9yIGhhbmRsZSAldSIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmdldE1vZGVsU3RhdGUobW9kZWwtPm1IYWxIYW5kbGUpOworICAgIH0KKyAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kVHJpZ2dlckhhbEhpZGwoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKICAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtTmV4dFVuaXF1ZUlkKDEpCiB7CkBAIC0zODgsNiArNDU5LDEyIEBACiAgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKIH0KIAorc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzIgPSBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8yLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzIpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBiNDRhZTAuLmZiOWUzOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjIvSVNvdW5kVHJpZ2dlckh3Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAKQEAgLTQ2LDYgKzQ3LDggQEAKIHVzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sgPQogICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzE6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyBWMl8yX0lTb3VuZFRyaWdnZXJIdyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMjo6SVNvdW5kVHJpZ2dlckh3OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrCkBAIC05Miw2ICs5NSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAvLyBJU291bmRUcmlnZ2VySHdDYWxsYmFjawogICAgICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZWNvZ25pdGlvbkNhbGxiYWNrKAogICAgICAgICAgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpOwpAQCAtMTgyLDYgKzE5Myw3IEBACiAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogICAgICAgICBzcDxJU291bmRUcmlnZ2VySHc+IGdldFNlcnZpY2UoKTsKICAgICAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKKyAgICAgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gcmVtb3ZlTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCmluZGV4IGMwODMxOTUuLjAxODNlY2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCkgPSAwOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICAgICAgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjc4ODE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsTGVnYWN5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotewotICAgIHJldHVybiBuZXcgU291bmRUcmlnZ2VySGFsTGVnYWN5KG1vZHVsZU5hbWUpOwotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6OlNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1Id0RldmljZShOVUxMKQotewotfQotCi12b2lkIFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6b25GaXJzdFJlZigpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAobU1vZHVsZU5hbWUgPT0gTlVMTCkgewotICAgICAgICBtTW9kdWxlTmFtZSA9ICJwcmltYXJ5IjsKLSAgICB9Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCAmbW9kKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCBzb3VuZCB0cmlnZ2VyIG1vZHVsZSAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByYyA9IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX29wZW4obW9kLCAmbUh3RGV2aWNlKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA8IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCB8fAotICAgICAgICAgICAgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKLSAgICAgICAgQUxPR0UoIndyb25nIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6On5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKQotewotICAgIGlmIChtSHdEZXZpY2UgIT0gTlVMTCkgewotICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6Z2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6bG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgc291bmRfbW9kZWwsIGNhbGxiYWNrLCBjb29raWUsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdGFydF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSwgY29uZmlnLCBjYWxsYmFjaywgY29va2llKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wQWxsUmVjb2duaXRpb25zKCkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSAmJgotICAgICBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucykgewotICAgICAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMobUh3RGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ODhkZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlCi0KLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+U291bmRUcmlnZ2VySGFsTGVnYWN5KCk7Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBMb2FkIGEgc291bmQgbW9kZWwuIE9uY2UgbG9hZGVkLCByZWNvZ25pdGlvbiBvZiB0aGlzIG1vZGVsIGNhbiBiZSBzdGFydGVkIGFuZCBzdG9wcGVkLgotICAgICAgICAgKiBPbmx5IG9uZSBhY3RpdmUgcmVjb2duaXRpb24gcGVyIG1vZGVsIGF0IGEgdGltZS4gVGhlIFNvdW5kVHJpZ2dlciBzZXJ2aWNlIHdpbGwgaGFuZGxlCi0gICAgICAgICAqIGNvbmN1cnJlbnQgcmVjb2duaXRpb24gcmVxdWVzdHMgYnkgZGlmZmVyZW50IHVzZXJzL2FwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSB1bmlxdWUgaGFuZGxlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zICh1bmxvYWRfc291bmRfbW9kZWwoKSwKLSAgICAgICAgICogc3RhcnRfcmVjb2duaXRpb24oKSwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVW5sb2FkIGEgc291bmQgbW9kZWwuIEEgc291bmQgbW9kZWwgY2FuIGJlIHVubG9hZGVkIHRvIG1ha2Ugcm9vbSBmb3IgYSBuZXcgb25lIHRvIG92ZXJjb21lCi0gICAgICAgICAqIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0YXJ0IHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuIE9ubHkgb25lIHJlY29nbml0aW9uIGFjdGl2ZSBhdCBhIHRpbWUgcGVyIG1vZGVsLgotICAgICAgICAgKiBPbmNlIHJlY29nbml0aW9uIHN1Y2NlZWRzIG9mIGZhaWxzLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLgotICAgICAgICAgKiBUT0RPOiBncm91cCByZWNvZ25pdGlvbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW50byBvbmUgc3RydWN0IGFuZCBhZGQga2V5IHBocmFzZSBvcHRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBzdG9wcGVkIHZpYSB0aGlzIG1ldGhvZC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYWxsIG1vZGVscy4KLSAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xIG9yIGFib3ZlLgotICAgICAgICAgKiBJZiBubyBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCwgc3RvcF9yZWNvZ25pdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBydW5uaW5nIG1vZGVsLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKLQotICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLQotcHJpdmF0ZToKLQotICAgICAgICBmcmllbmQgY2xhc3MgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOwotCi0gICAgICAgIGV4cGxpY2l0IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lID0gTlVMTCk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbU1vZHVsZU5hbWU7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogICAgICAgIG1Id0RldmljZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCBhN2Q2ZTgzLi5mZTJjY2YyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMjcsMjAgKzI3LDE2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KLSNpbmNsdWRlIDxTZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKLSNpZmRlZiBTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJzdHViIgotI2Vsc2UKICNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAicHJpbWFyeSIKLSNlbmRpZgogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OlNvdW5kVHJpZ2dlckh3U2VydmljZSgpCkBAIC01NjIsMTAgKzU1OCw3IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CiAKQEAgLTY1OSwxMSArNjUyLDYgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAoZGF0YU1lbW9yeSA9PSAwIHx8IGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgfQogCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKQEAgLTcyNSw2ICs3MTMsMjUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhbEludGVyZmFjZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQogewogICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC05NjYsNiArOTczLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShtb2RlbE1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtOTk3LDYgKzEwMDcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KGRhdGFNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTEwMjAsNiArMTAzMywyMSBAQAogICAgIHJldHVybiBtb2R1bGUtPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKIHsKICAgICBBTE9HVigiTW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggNzA4ZmM5OC4uNDI1OGVjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICBzcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IGhhbEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxJbnRlcmZhY2U7IH0KICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KQEAgLTE2OSw2ICsxNzAsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAppbmRleCAyNTMzMmE0Li5mNWI0YjU5IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAgICAgVU5MT0FEX1NPVU5EX01PREVMLAogICAgIFNUQVJUX1JFQ09HTklUSU9OLAogICAgIFNUT1BfUkVDT0dOSVRJT04sCisgICAgR0VUX01PREVMX1NUQVRFLAogfTsKIAogY2xhc3MgQnBTb3VuZFRyaWdnZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPgpAQCAtMTEzLDYgKzExNCwxOCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01PREVMX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXIiKTsKQEAgLTE2OSw2ICsxODIsMTcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTU9ERUxfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldE1vZGVsU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjg5YjdiMS4uZDFlYjM2NyAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTE4OCw2ICsxODgsMTUgQEAKICAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogdm9pZCBTb3VuZFRyaWdnZXI6Om9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCiB7Cg==